|
|
|
|
package weaver.interfaces.aisin.cron;
|
|
|
|
|
|
|
|
|
|
import com.engine.integration.util.StringUtils;
|
|
|
|
|
import com.engine.kq.biz.*;
|
|
|
|
|
import com.engine.kq.entity.WorkTimeEntity;
|
|
|
|
|
import com.weaver.general.Util;
|
|
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
import weaver.common.DateUtil;
|
|
|
|
|
import weaver.conn.RecordSet;
|
|
|
|
|
import weaver.general.BaseBean;
|
|
|
|
|
import weaver.interfaces.aisin.cron.entity.*;
|
|
|
|
|
import weaver.interfaces.schedule.BaseCronJob;
|
|
|
|
|
import weaver.workflow.webservices.*;
|
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.math.RoundingMode;
|
|
|
|
|
import java.time.LocalDate;
|
|
|
|
|
import java.time.YearMonth;
|
|
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Author liang.cheng
|
|
|
|
|
* @Date 2024/11/22 9:15 AM
|
|
|
|
|
* @Description: 考勤确认流程自动触发
|
|
|
|
|
* @Version 1.0
|
|
|
|
|
*/
|
|
|
|
|
public class KqConfirmWfCrob extends BaseCronJob {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void execute() {
|
|
|
|
|
|
|
|
|
|
BaseBean bb = new BaseBean();
|
|
|
|
|
RecordSet rs = new RecordSet();
|
|
|
|
|
WorkflowBaseInfo workflowBaseInfo = new WorkflowBaseInfo();
|
|
|
|
|
String subcompanyid = bb.getPropValue("aisinsecond", "subcompanyid");
|
|
|
|
|
String workflowId = bb.getPropValue("aisinsecond", "workflowId");
|
|
|
|
|
String tableName = bb.getPropValue("aisinsecond", "tableName");
|
|
|
|
|
String currentDate = DateUtil.getCurrentDate();
|
|
|
|
|
String kqMonth = getKqMonth();
|
|
|
|
|
|
|
|
|
|
List<MainTableInfo> resourceList = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
//1.获取指定分部下 类型为排班制的 考勤组
|
|
|
|
|
List<String> groupIds = new ArrayList<>();
|
|
|
|
|
rs.executeQuery("select id from kq_group where subcompanyid = ? and kqtype = 2",subcompanyid);
|
|
|
|
|
while (rs.next()) {
|
|
|
|
|
groupIds.add(Util.null2String(rs.getString("id")));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(CollectionUtils.isEmpty(groupIds)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
KQGroupBiz groupBiz = new KQGroupBiz();
|
|
|
|
|
|
|
|
|
|
//2.获取考勤组下所有成员
|
|
|
|
|
List<String> groupMembers = new ArrayList<>();
|
|
|
|
|
groupIds.forEach(e -> groupMembers.addAll(groupBiz.getGroupMembers(e)));
|
|
|
|
|
|
|
|
|
|
//3.人员存在多个考勤组中去重
|
|
|
|
|
List<String> distinctMembers = groupMembers.stream()
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
bb.writeLog("需要触发流程的人员 =>" +distinctMembers.toString()+"=>size:"+distinctMembers.size());
|
|
|
|
|
|
|
|
|
|
// 尽量保持 IN 列表的大小在 1000 个值以内
|
|
|
|
|
String join = StringUtils.join(distinctMembers, ",");
|
|
|
|
|
String sql = "select id,workcode,departmentid from hrmresource where id in ("+join+")";
|
|
|
|
|
bb.writeLog("sqlmain:"+sql);
|
|
|
|
|
rs.executeQuery(sql);
|
|
|
|
|
while (rs.next()) {
|
|
|
|
|
resourceList.add(MainTableInfo.builder()
|
|
|
|
|
.workcode(Util.null2String(rs.getString("workcode")))
|
|
|
|
|
.resourceId(Util.null2String(rs.getString("id")))
|
|
|
|
|
.departmentId(Util.null2String(rs.getString("departmentid")))
|
|
|
|
|
.build());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String firstDayOfMonth = firstDayOfMonth(kqMonth);
|
|
|
|
|
String lastDayOfMonth = lastDayOfMonth(kqMonth);
|
|
|
|
|
KQWorkTime kqWorkTime = new KQWorkTime();
|
|
|
|
|
// KQShiftManagementComInfo kqShiftManagementComInfo = new KQShiftManagementComInfo();
|
|
|
|
|
// String serial = kqShiftManagementComInfo.getSerial("1");
|
|
|
|
|
|
|
|
|
|
//todo 数据量大时集合拆分 考虑线程处理
|
|
|
|
|
for (int i = 0; i < resourceList.size(); i++) {
|
|
|
|
|
MainTableInfo e = resourceList.get(i);
|
|
|
|
|
//1.创建主流程
|
|
|
|
|
workflowBaseInfo.setWorkflowId(workflowId);
|
|
|
|
|
WorkflowMainTableInfo workflowMainTableInfo = new WorkflowMainTableInfo();
|
|
|
|
|
WorkflowRequestTableField workcode = createWorkflowRequestTableField("rybh", e.getWorkcode(), true);
|
|
|
|
|
WorkflowRequestTableField lastname = createWorkflowRequestTableField("ryxm", e.getResourceId(), true);
|
|
|
|
|
WorkflowRequestTableField deparyment = createWorkflowRequestTableField("bmmc", e.getDepartmentId(), true);
|
|
|
|
|
WorkflowRequestTableField startDate = createWorkflowRequestTableField("sqrq", currentDate, true);
|
|
|
|
|
WorkflowRequestTableField month = createWorkflowRequestTableField("kqyf", kqMonth, true);
|
|
|
|
|
|
|
|
|
|
WorkflowRequestTableField[] workflowRequestTableField = {workcode,lastname,deparyment,startDate,month};
|
|
|
|
|
|
|
|
|
|
WorkflowRequestTableRecord[] workflowRequestTableRecord = new WorkflowRequestTableRecord[1];
|
|
|
|
|
workflowMainTableInfo.setRequestRecords(workflowRequestTableRecord);
|
|
|
|
|
workflowRequestTableRecord[0] = new WorkflowRequestTableRecord();
|
|
|
|
|
workflowRequestTableRecord[0].setWorkflowRequestTableFields(workflowRequestTableField);
|
|
|
|
|
|
|
|
|
|
CusWorkflowRequestInfo cusWorkflowRequestInfo = CusWorkflowRequestInfo.builder()
|
|
|
|
|
.workflowName("ATBP 考勤确认流程")
|
|
|
|
|
.nextFlow("0")
|
|
|
|
|
.requestLevel("1")
|
|
|
|
|
.canView(true)
|
|
|
|
|
.creatorId(e.getResourceId())
|
|
|
|
|
.workflowBaseInfo(workflowBaseInfo)
|
|
|
|
|
.workflowMainTableInfo(workflowMainTableInfo)
|
|
|
|
|
.build();
|
|
|
|
|
|
|
|
|
|
String requestId = doCreateWorkflow(cusWorkflowRequestInfo);
|
|
|
|
|
bb.writeLog("流程创建成功requestId=>"+requestId);
|
|
|
|
|
|
|
|
|
|
if (Integer.parseInt(requestId) < 0) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取主表id
|
|
|
|
|
rs.executeQuery("select id from "+tableName+" where requestid = ?",requestId);
|
|
|
|
|
rs.next();
|
|
|
|
|
Integer mainId = Util.getIntValue(rs.getString("id"));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//2.更新明细表
|
|
|
|
|
//2.1 明细表1(班次)
|
|
|
|
|
List<ScheDetailTableInfo> scheDetails = new ArrayList<>();
|
|
|
|
|
rs.executeQuery("select kqdate,serialid from kq_shiftschedule where kqdate >= '"+firstDayOfMonth+"' and kqdate <= '"+lastDayOfMonth+"' \n" +
|
|
|
|
|
" and resourceid = ? and isdelete = 0",e.getResourceId());
|
|
|
|
|
while (rs.next()) {
|
|
|
|
|
scheDetails.add(ScheDetailTableInfo.builder().date(Util.null2String(rs.getString("kqdate")))
|
|
|
|
|
.serialId(Util.null2String(rs.getString("serialid"))).build());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
scheDetails.forEach(sche -> rs.executeUpdate("insert into "+tableName+"_dt1 (mainid,pbrq,bc) values(?,?,?)",mainId,sche.getDate(),sche.getSerialId()));
|
|
|
|
|
|
|
|
|
|
//2.2 明细表2(加班)
|
|
|
|
|
List<FlowDetailTableInfo> flowDetails = new ArrayList<>();
|
|
|
|
|
rs.executeQuery("select belongdate,duration_min from KQ_FLOW_OVERTIME where belongdate >= '"+firstDayOfMonth+"' and belongdate <= '"+lastDayOfMonth+"' \n" +
|
|
|
|
|
" and resourceid = ?",e.getResourceId());
|
|
|
|
|
while (rs.next()){
|
|
|
|
|
String belongdate = Util.null2String(rs.getString("belongdate"));
|
|
|
|
|
String duration_min = Util.null2String(rs.getString("duration_min"));
|
|
|
|
|
WorkTimeEntity workTime = kqWorkTime.getWorkTime(e.getResourceId(), belongdate);
|
|
|
|
|
String serialId = workTime.getSerialId();
|
|
|
|
|
flowDetails.add(FlowDetailTableInfo.builder()
|
|
|
|
|
.date(belongdate)
|
|
|
|
|
.serialId(serialId)
|
|
|
|
|
.hours(minutesToHours(duration_min))
|
|
|
|
|
.build());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
flowDetails.forEach(flow -> rs.executeUpdate("insert into "+tableName+"_dt2 (mainid,jbrq,jbbc,jbxs) values(?,?,?,?)",mainId,flow.getDate(),
|
|
|
|
|
flow.getSerialId(),flow.getHours()));
|
|
|
|
|
|
|
|
|
|
//2.3 明细表3(请假)
|
|
|
|
|
List<LeaveDetailTableInfo> leaveDetails = new ArrayList<>();
|
|
|
|
|
rs.executeQuery("select fromdate,newleavetype,d_mins,serialid from kq_flow_split_leave where fromdate >= '"+firstDayOfMonth+"' and fromdate <= '"+lastDayOfMonth+"' \n" +
|
|
|
|
|
" and resourceid = ?",e.getResourceId());
|
|
|
|
|
while (rs.next()) {
|
|
|
|
|
String fromdate = Util.null2String(rs.getString("fromdate"));
|
|
|
|
|
String serialId = Util.null2String(rs.getString("serialid"));
|
|
|
|
|
Integer leaveType = Util.getIntValue(rs.getString("newleavetype"));
|
|
|
|
|
String d_mins = Util.null2String(rs.getString("d_mins"));
|
|
|
|
|
leaveDetails.add(LeaveDetailTableInfo.builder()
|
|
|
|
|
.date(fromdate)
|
|
|
|
|
.serialId(serialId)
|
|
|
|
|
.leaveType(leaveType)
|
|
|
|
|
.hours(minutesToHours(d_mins))
|
|
|
|
|
.build());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
leaveDetails.forEach(leave -> rs.executeUpdate("insert into "+tableName+"_dt3 (mainid,qjrq,qjbc,qjlx,qjxs) values(?,?,?,?,?)",mainId,
|
|
|
|
|
leave.getDate(),leave.getSerialId(),leave.getLeaveType(),leave.getHours()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String doCreateWorkflow(CusWorkflowRequestInfo cusWq){
|
|
|
|
|
|
|
|
|
|
//工作流程请求信息
|
|
|
|
|
WorkflowRequestInfo workflowRequestInfo = new WorkflowRequestInfo();
|
|
|
|
|
//请求标题
|
|
|
|
|
workflowRequestInfo.setRequestName(cusWq.getWorkflowName());
|
|
|
|
|
//请求重要级别
|
|
|
|
|
workflowRequestInfo.setRequestLevel(cusWq.getRequestLevel());
|
|
|
|
|
//显示
|
|
|
|
|
workflowRequestInfo.setCanView(cusWq.isCanView());
|
|
|
|
|
//创建者id
|
|
|
|
|
workflowRequestInfo.setCreatorId(cusWq.getCreatorId());
|
|
|
|
|
//工作流信息
|
|
|
|
|
workflowRequestInfo.setWorkflowBaseInfo(cusWq.getWorkflowBaseInfo());
|
|
|
|
|
//主表
|
|
|
|
|
workflowRequestInfo.setWorkflowMainTableInfo(cusWq.getWorkflowMainTableInfo());
|
|
|
|
|
//是否提交下一节点
|
|
|
|
|
workflowRequestInfo.setIsnextflow(cusWq.getNextFlow());
|
|
|
|
|
|
|
|
|
|
WorkflowService workflow = new WorkflowServiceImpl();
|
|
|
|
|
return workflow.doCreateWorkflowRequest(workflowRequestInfo, Integer.parseInt(cusWq.getCreatorId()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private WorkflowRequestTableField createWorkflowRequestTableField(String fieldName, String fieldValue,boolean view) {
|
|
|
|
|
WorkflowRequestTableField tableField = new WorkflowRequestTableField();
|
|
|
|
|
tableField.setFieldName(fieldName);
|
|
|
|
|
tableField.setFieldValue(fieldValue);
|
|
|
|
|
tableField.setView(view);
|
|
|
|
|
tableField.setEdit(true);
|
|
|
|
|
return tableField;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String getKqMonth() {
|
|
|
|
|
LocalDate currentDate = LocalDate.now();
|
|
|
|
|
LocalDate previousMonthDate = currentDate.minusMonths(1);
|
|
|
|
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
|
|
|
|
|
return previousMonthDate.format(formatter);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String firstDayOfMonth(String yearMonthStr) {
|
|
|
|
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
|
|
|
|
|
YearMonth yearMonth = YearMonth.parse(yearMonthStr, formatter);
|
|
|
|
|
LocalDate firstDayOfMonth = yearMonth.atDay(1);
|
|
|
|
|
return firstDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private String lastDayOfMonth(String yearMonthStr) {
|
|
|
|
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
|
|
|
|
|
YearMonth yearMonth = YearMonth.parse(yearMonthStr, formatter);
|
|
|
|
|
LocalDate lastDayOfMonth = yearMonth.atEndOfMonth();
|
|
|
|
|
return lastDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String minutesToHours(String minutesStr) {
|
|
|
|
|
int minutes = Integer.parseInt(minutesStr);
|
|
|
|
|
BigDecimal hours = new BigDecimal(minutes).divide(new BigDecimal(60), 2, RoundingMode.HALF_UP);
|
|
|
|
|
return hours.toString();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|