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(); //测试使用 //String kqMonth = "2024-11"; List resourceList = new ArrayList<>(); //1.获取指定分部下 类型为排班制的 考勤组 List 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 groupMembers = new ArrayList<>(); groupIds.forEach(e -> groupMembers.addAll(groupBiz.getGroupMembers(e))); //3.人员存在多个考勤组中去重 List 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 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 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 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(); } }