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

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;
}
}