|
|
|
|
package weaver.interfaces.sskj.action;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
|
|
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.MainTableInfo;
|
|
|
|
|
import weaver.soa.workflow.request.Property;
|
|
|
|
|
import weaver.soa.workflow.request.RequestInfo;
|
|
|
|
|
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.UUID;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 连班加班流程
|
|
|
|
|
*/
|
|
|
|
|
public class OverTimeAction implements Action {
|
|
|
|
|
BaseBean bb = new BaseBean();
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String execute(RequestInfo requestInfo) {
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
bb.writeLog("OverTimeAction start");
|
|
|
|
|
RecordSet rs = new RecordSet();
|
|
|
|
|
Integer resourceId = -1;
|
|
|
|
|
String fromDate = "";
|
|
|
|
|
String fromTime = "";
|
|
|
|
|
String toDate = "";
|
|
|
|
|
String toTime = "";
|
|
|
|
|
String dataId = "";
|
|
|
|
|
String requestId = Util.null2String(requestInfo.getRequestid());
|
|
|
|
|
MainTableInfo mainTableInfo = requestInfo.getMainTableInfo();
|
|
|
|
|
Property[] properties = mainTableInfo.getProperty();
|
|
|
|
|
for (Property property : properties) {
|
|
|
|
|
if (property.getName().equals("id")) {
|
|
|
|
|
dataId = Util.null2String(property.getValue());
|
|
|
|
|
}
|
|
|
|
|
if (property.getName().equals("resourceId")) {
|
|
|
|
|
resourceId = Util.getIntValue(Util.null2String(property.getValue()));
|
|
|
|
|
}
|
|
|
|
|
if (property.getName().equals("fromDate")) {
|
|
|
|
|
fromDate = Util.null2String(property.getValue());
|
|
|
|
|
}
|
|
|
|
|
if (property.getName().equals("fromTime")) {
|
|
|
|
|
fromTime = Util.null2String(property.getValue());
|
|
|
|
|
}
|
|
|
|
|
if (property.getName().equals("toDate")) {
|
|
|
|
|
toDate = Util.null2String(property.getValue());
|
|
|
|
|
}
|
|
|
|
|
if (property.getName().equals("toTime")) {
|
|
|
|
|
toTime = Util.null2String(property.getValue());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//计算时长
|
|
|
|
|
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) {
|
|
|
|
|
|
|
|
|
|
//将加班数据记录到连班加班建模表中
|
|
|
|
|
String syncConOverTimeSql = "insert into uf_conOvertime (resourceId, fromDate, fromTime, toDate, toTime, formmodeid, modedatacreater, modedatacreatertype, modedatacreatedate, modedatacreatetime, MODEUUID)" +
|
|
|
|
|
" values (?,?,?,?,?,?,?,?,?,?,?)";
|
|
|
|
|
String conOvertimeModeId = bb.getPropValue("project_sskj", "conOvertimeModeId");
|
|
|
|
|
Integer modedatacreater = 1;
|
|
|
|
|
Integer modedatacreatertype = 0;
|
|
|
|
|
String modedatacreatedate = DateUtil.format(new Date(), "yyyy-MM-dd");
|
|
|
|
|
String modedatacreatetime = DateUtil.format(new Date(), "HH:mm:ss");
|
|
|
|
|
String uuid = UUID.randomUUID().toString();
|
|
|
|
|
bb.writeLog("syncConOverTimeSql:" + syncConOverTimeSql);
|
|
|
|
|
|
|
|
|
|
boolean addFlag = rs.executeUpdate(syncConOverTimeSql, resourceId, fromDate, fromTime, toDate, toTime, conOvertimeModeId, modedatacreater, modedatacreatertype, modedatacreatedate,
|
|
|
|
|
modedatacreatetime, uuid);
|
|
|
|
|
bb.writeLog("addFlag:" + addFlag);
|
|
|
|
|
if (addFlag) {
|
|
|
|
|
String billid = "-1";
|
|
|
|
|
String acqModeIdSql = "select id from uf_conOvertime where MODEUUID = ?";
|
|
|
|
|
rs.executeQuery(acqModeIdSql, uuid);
|
|
|
|
|
while (rs.next()) {
|
|
|
|
|
billid = Util.null2String(rs.getString("id"));
|
|
|
|
|
}
|
|
|
|
|
bb.writeLog("billid:" + billid);
|
|
|
|
|
sskjUtil.modePerRecon(modedatacreater, conOvertimeModeId, billid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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) {
|
|
|
|
|
//将加班数据记录到连班加班建模表中
|
|
|
|
|
String syncConOverTimeSql = "insert into uf_conOvertime (resourceId, fromDate, fromTime, toDate, toTime, formmodeid, modedatacreater, modedatacreatertype, modedatacreatedate, modedatacreatetime, MODEUUID)" +
|
|
|
|
|
" values (?,?,?,?,?,?,?,?,?,?,?)";
|
|
|
|
|
String conOvertimeModeId = bb.getPropValue("project_sskj", "conOvertimeModeId");
|
|
|
|
|
Integer modedatacreater = 1;
|
|
|
|
|
Integer modedatacreatertype = 0;
|
|
|
|
|
String modedatacreatedate = DateUtil.format(new Date(), "yyyy-MM-dd");
|
|
|
|
|
String modedatacreatetime = DateUtil.format(new Date(), "HH:mm:ss");
|
|
|
|
|
String uuid = UUID.randomUUID().toString();
|
|
|
|
|
bb.writeLog("syncConOverTimeSql:" + syncConOverTimeSql);
|
|
|
|
|
|
|
|
|
|
boolean addFlag = rs.executeUpdate(syncConOverTimeSql, resourceId, fromDate, fromTime, toDate, toTime, conOvertimeModeId, modedatacreater, modedatacreatertype, modedatacreatedate,
|
|
|
|
|
modedatacreatetime, uuid);
|
|
|
|
|
bb.writeLog("addFlag:" + addFlag);
|
|
|
|
|
if (addFlag) {
|
|
|
|
|
String billid = "-1";
|
|
|
|
|
String acqModeIdSql = "select id from uf_conOvertime where MODEUUID = ?";
|
|
|
|
|
rs.executeQuery(acqModeIdSql, uuid);
|
|
|
|
|
while (rs.next()) {
|
|
|
|
|
billid = Util.null2String(rs.getString("id"));
|
|
|
|
|
}
|
|
|
|
|
bb.writeLog("billid:" + billid);
|
|
|
|
|
sskjUtil.modePerRecon(modedatacreater, conOvertimeModeId, billid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}catch(Exception e) {
|
|
|
|
|
bb.writeLog("OverTimeAction Exception: " + e);
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|