You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
weaver-sskj/src/weaver/interfaces/sskj/action/OverTimeBatchAction.java

305 lines
15 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package weaver.interfaces.sskj.action;
import com.engine.kq.biz.*;
import com.engine.kq.entity.KQOvertimeRulesDetailEntity;
import com.engine.sskj.util.SskjUtil;
import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.general.Util;
import weaver.interfaces.workflow.action.Action;
import weaver.soa.workflow.request.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 批量连班加班流程
* @author chenwnj
*/
public class OverTimeBatchAction implements Action {
BaseBean bb = new BaseBean();
@Override
public String execute(RequestInfo requestInfo) {
try {
bb.writeLog("OverTimeBatchAction start");
RecordSet rs = new RecordSet();
String requestId = Util.null2String(requestInfo.getRequestid());
List< Map<String, Object> > detailInfos = new ArrayList<>();
Map<String, Object> detailInfo = new HashMap<>();
//从明细表获取所有加班明细数据
DetailTableInfo detailTableInfo = requestInfo.getDetailTableInfo();
DetailTable[] detailTable = detailTableInfo.getDetailTable();
if ( detailTable.length > 0) {
//指定明细表
for ( DetailTable dt : detailTable) {
Row[] rows = dt.getRow();
for (Row row: rows) {//row 明细行
detailInfo = new HashMap<>();
Cell[] cells = row.getCell();
for ( Cell cell: cells) {//cell 该明细行的列
String name = cell.getName();
if ( "jbry".equals(name)) {
detailInfo.put("resourceId", cell.getValue());
}
if ( "ksrq".equals(name)) {
detailInfo.put("fromDate", cell.getValue());
}
if ( "kssj".equals(name)) {
detailInfo.put("fromTime", cell.getValue());
}
if ( "jsrq".equals(name)) {
detailInfo.put("toDate", cell.getValue());
}
if ( "jssj".equals(name)) {
detailInfo.put("toTime", cell.getValue());
}
}
if ( detailInfo.size() == 5 ) {
detailInfos.add(detailInfo);
} else {
bb.writeLog("OverTimeBatchAction 获取加班明细数据存在异常:" + detailInfo);
}
}
}
}
bb.writeLog("detailInfos: " + detailInfos);
for ( Map<String, Object> di: detailInfos) {
Integer res = Util.getIntValue( Util.null2String( di.get("resourceId")));
String fromDate = Util.null2String( di.get("fromDate"));
String fromTime = Util.null2String( di.get("fromTime"));
String toDate = Util.null2String( di.get("toDate"));
String toTime = Util.null2String( di.get("toTime"));
String doFlag = doOverTime(requestId, res, fromDate, fromTime, toDate, toTime, rs, requestInfo);
bb.writeLog("doOverTime result: res=" + res + " result=" + doFlag);
}
}catch(Exception e) {
bb.writeLog("OverTimeBatchAction Exception: " + e);
String error = "加班生成失败!";
requestInfo.getRequestManager().setMessageid("666" + requestInfo.getRequestid() + "999");
requestInfo.getRequestManager().setMessagecontent(error);
return Action.FAILURE_AND_CONTINUE;
}
return Action.SUCCESS;
}
/**
* 加班的处理
*/
private String doOverTime(String requestId, Integer resourceId, String fromDate, String fromTime, String toDate, String toTime, RecordSet rs, RequestInfo requestInfo){
//计算时长
SskjUtil sskjUtil = new SskjUtil();
String startTime = "";
String endTime = "";
if ( StringUtils.isNotBlank(fromDate) && StringUtils.isNotBlank(fromTime)) {
startTime = fromDate + " " +fromTime;
}
if ( StringUtils.isNotBlank(toDate) && StringUtils.isNotBlank(toTime)) {
endTime = toDate + " " +toTime;
}
if ( StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) {
startTime = startTime + ":00";
endTime = endTime + ":00";
}
long durationOfOvertime = sskjUtil.getTime(startTime, endTime);
bb.writeLog("durationOfOvertime:" + durationOfOvertime);
bb.writeLog("startTime:" + startTime);
bb.writeLog("endTime:" + endTime);
bb.writeLog("fromDate:" + fromDate);
bb.writeLog("toDate:" + toDate);
bb.writeLog("fromTime:" + fromTime);
bb.writeLog("toTime:" + toTime);
//处理加班时长归属日
String belongTo = fromDate;
/*获取加班调休设置*/
//首先获取人员的考勤组
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo();
String groupId = kqGroupMemberComInfo.getKQGroupId(Util.null2String(resourceId), belongTo);
bb.writeLog("groupId:" + groupId);
//根据考勤组获取对应的加班规则
KQOvertimeRulesDetailEntity overtimeRulesDetail = getOvertimeRulesDetail(Util.null2String(resourceId), belongTo);
//判断当天是否允许加班
int overtimeEnable = overtimeRulesDetail.getOvertimeEnable();
bb.writeLog("overtimeEnable:" + overtimeEnable);
if (overtimeEnable == 0) {//不允许加班
return Action.SUCCESS;
}
//判断时长是否大于最小加班时长
int minimumLen = overtimeRulesDetail.getMinimumLen();
bb.writeLog("minimumLen:" + minimumLen);
if (minimumLen > durationOfOvertime) {//低于最小加班时长,不生成加班数据
return Action.SUCCESS;
}
//判断当天加班是否需要转调休
int paidLeaveEnable = overtimeRulesDetail.getPaidLeaveEnable();
bb.writeLog("paidLeaveEnable:" + paidLeaveEnable);
if (paidLeaveEnable == 0 ) {//不转调休
//直接生成加班数据
int computingMode = overtimeRulesDetail.getComputingMode();
bb.writeLog("computingMode:" + computingMode);
int changeType = KQHolidaySetBiz.getChangeType(groupId, belongTo);
bb.writeLog("changeType:" + changeType);
if (changeType != 1 && changeType != 2 && changeType != 3) {
KQWorkTime kqWorkTime = new KQWorkTime();
changeType = kqWorkTime.isWorkDay(Util.null2String(resourceId), belongTo) ? 2 : 3;
}
bb.writeLog("changeType:" + changeType);
boolean b = genOvertimeData(requestId, Util.null2String(resourceId), fromDate, toDate, belongTo, fromTime, toTime, String.valueOf(durationOfOvertime),
String.valueOf(changeType), "1", String.valueOf(paidLeaveEnable), String.valueOf(computingMode), null);
if (b) {
return Action.SUCCESS;
} else {
String error = "加班生成失败!";
requestInfo.getRequestManager().setMessageid("666" + requestInfo.getRequestid() + "999");
requestInfo.getRequestManager().setMessagecontent(error);
return Action.FAILURE_AND_CONTINUE;
}
} else {
/*先生成调休数据*/
//先获取工作时长
String worktime = "0";
String acqWorkTimeSql = "select worktime from kq_shiftmanagement where id = (select serialids from kq_group where id = ? )";
rs.executeQuery(acqWorkTimeSql, groupId);
while ( rs.next()) {
worktime = Util.null2String(rs.getString("worktime"));
}
bb.writeLog("worktime:" + worktime);
Map<String,Object> otherParam = Maps.newHashMap();
otherParam.put("timepoint_key", "连班加班生成调休");
String tiaoxiuId = KQBalanceOfLeaveBiz.addExtraAmountByDis5(Util.null2String(resourceId), belongTo, String.valueOf(durationOfOvertime), "0", worktime, requestId, "2", fromDate, otherParam);
bb.writeLog("tiaoxiuId:" + tiaoxiuId);
boolean flag = Util.getIntValue(tiaoxiuId, -1) > 0;
//生成加班数据
if (flag) {
int computingMode = overtimeRulesDetail.getComputingMode();
bb.writeLog("computingMode:" + computingMode);
int changeType = KQHolidaySetBiz.getChangeType(groupId, belongTo);
bb.writeLog("changeType:" + changeType);
if (changeType != 1 && changeType != 2 && changeType != 3) {
KQWorkTime kqWorkTime = new KQWorkTime();
changeType = kqWorkTime.isWorkDay(Util.null2String(resourceId), belongTo) ? 2 : 3;
}
bb.writeLog("changeType:" + changeType);
boolean b = genOvertimeData(requestId, Util.null2String(resourceId), fromDate, toDate, belongTo, fromTime, toTime, String.valueOf(durationOfOvertime),
String.valueOf(changeType), "1", String.valueOf(paidLeaveEnable), String.valueOf(computingMode), tiaoxiuId);
if (b) {
return Action.SUCCESS;
} else {
String error = "加班生成失败!";
requestInfo.getRequestManager().setMessageid("666" + requestInfo.getRequestid() + "999");
requestInfo.getRequestManager().setMessagecontent(error);
return Action.FAILURE_AND_CONTINUE;
}
} else {
String error = "调休生成失败!";
requestInfo.getRequestManager().setMessageid("666" + requestInfo.getRequestid() + "999");
requestInfo.getRequestManager().setMessagecontent(error);
return Action.FAILURE_AND_CONTINUE;
}
}
}
/**
* 生成加班数据
*/
private boolean genOvertimeData(String requestId, String resourceId, String fromDate, String toDate, String belongDate,
String fromTime, String toTime, String durationMin, String changType, String durationrule, String paidLeaveEnable, String computingMode,
String tiaoxiuId) {
RecordSet rs = new RecordSet();
String addOverTimeSql = "insert into kq_flow_overtime (requestid, resourceid, fromdate, fromtime, todate, totime, fromdatedb, fromtimedb, todatedb, " +
"totimedb, duration_min, belongdate, durationrule, changetype, paidLeaveEnable, computingMode, tiaoxiuid, flow_mins, card_mins) values " +
"(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
boolean flag = rs.executeUpdate(addOverTimeSql, requestId, resourceId, fromDate, fromTime+":00", toDate, toTime+":00", fromDate, fromTime, toDate, toTime, durationMin,
belongDate, durationrule, changType, paidLeaveEnable, computingMode, tiaoxiuId, 0, 0);
bb.writeLog("flag:" + flag);
return flag;
}
/**
* 获取加班规则的明细
*/
private static KQOvertimeRulesDetailEntity getOvertimeRulesDetail(String resourceId, String date) {
BaseBean bb = new BaseBean();
KQOvertimeRulesDetailEntity kqOvertimeRulesDetail = new KQOvertimeRulesDetailEntity();
try {
/*获取考勤组的ID因为考勤组有有效期所以需要传入日期*/
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo();
String groupIds = kqGroupMemberComInfo.getKQGroupId(resourceId, date);
if (groupIds.equals("")) {
/*该人员不存在于任意一个考勤组中,请为其设置考勤组*/
bb.writeLog("该人员不存在于任意一个考勤组中请为其设置考勤组。resourceId=" + resourceId + ",date=" + date);
}
int changeType = KQOvertimeRulesBiz.getChangeType(resourceId, date);
/*获取当前日期的日期类型错误*/
if (changeType != 1 && changeType != 2 && changeType != 3) {
bb.writeLog("获取当前日期的日期类型错误。resourceId=" + resourceId + ",date=" + date + ",changeType=" + changeType);
}
int overtimeRuleId = 0;//加班规则的ID
RecordSet recordSet = new RecordSet();
String sql = "select id from kq_OvertimeRules where (isDelete is null or isDelete !=1) ";
if (recordSet.getDBType().equalsIgnoreCase("sqlserver")) {
sql += " and ','+groupIds+',' like '%," + groupIds + ",%'";
} else if (recordSet.getDBType().equalsIgnoreCase("mysql")) {
sql += " and concat(',',groupIds,',') like '%," + groupIds + ",%'";
} else {
sql += " and ','||groupIds||',' like '%," + groupIds + ",%'";
}
recordSet.executeQuery(sql);
if (recordSet.next()) {
overtimeRuleId = recordSet.getInt("id");
sql = "select * from kq_OvertimeRulesDetail where ruleId=" + overtimeRuleId + " and dayType=" + changeType;
recordSet.executeQuery(sql);
if (recordSet.next()) {
int ruleId = recordSet.getInt("ruleId");
int dayType = recordSet.getInt("dayType");
int overtimeEnable = recordSet.getInt("overtimeEnable");
int computingMode = recordSet.getInt("computingMode");
int startTime = recordSet.getInt("startTime");
int minimumLen = recordSet.getInt("minimumLen");
int paidLeaveEnable = recordSet.getInt("paidLeaveEnable");
double lenOfOvertime = Util.getDoubleValue(recordSet.getString("lenOfOvertime"), 1.00);
double lenOfLeave = Util.getDoubleValue(recordSet.getString("lenOfLeave"), 1.00);
int hasRestTime = Util.getIntValue(recordSet.getString("hasRestTime"));
kqOvertimeRulesDetail.setRuleId(ruleId);
kqOvertimeRulesDetail.setDayType(dayType);
kqOvertimeRulesDetail.setOvertimeEnable(overtimeEnable);
kqOvertimeRulesDetail.setComputingMode(computingMode);
kqOvertimeRulesDetail.setStartTime(startTime);
kqOvertimeRulesDetail.setMinimumLen(minimumLen);
kqOvertimeRulesDetail.setPaidLeaveEnable(paidLeaveEnable);
kqOvertimeRulesDetail.setLenOfOvertime(lenOfOvertime);
kqOvertimeRulesDetail.setLenOfLeave(lenOfLeave);
kqOvertimeRulesDetail.setHasRestTime(hasRestTime);
}
} else {
bb.writeLog("该人员所属的考勤组没有设置过任何加班规则请为其设置加班规则。resourceId=" + resourceId + ",date="+date+",changeType=" + changeType);
}
} catch (Exception e) {
bb.writeLog("根据人员ID获取加班规则的规则内容出错。resourceId=" + resourceId + ",date=" + date);
e.printStackTrace();
}
return kqOvertimeRulesDetail;
}
}