From 8a5385b0a3784648e81a8878d34205daa551a895 Mon Sep 17 00:00:00 2001 From: Chengliang <1546584672@qq.com> Date: Fri, 22 Nov 2024 17:45:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=98=E5=B7=A5=E8=80=83=E5=8B=A4=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WEB-INF/prop/aisinsecond.properties | 10 + .../engine/kq/biz/KQOverTimeRuleCalBiz.java | 2 +- src/test/MainTest.java | 27 ++ .../aisin/cron/KqConfirmWfCrob.java | 253 ++++++++++++++++++ .../cron/entity/CusWorkflowRequestInfo.java | 40 +++ .../cron/entity/FlowDetailTableInfo.java | 26 ++ .../cron/entity/LeaveDetailTableInfo.java | 27 ++ .../aisin/cron/entity/MainTableInfo.java | 28 ++ .../cron/entity/ScheDetailTableInfo.java | 23 ++ 9 files changed, 435 insertions(+), 1 deletion(-) create mode 100644 WEB-INF/prop/aisinsecond.properties create mode 100644 src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java create mode 100644 src/weaver/interfaces/aisin/cron/entity/CusWorkflowRequestInfo.java create mode 100644 src/weaver/interfaces/aisin/cron/entity/FlowDetailTableInfo.java create mode 100644 src/weaver/interfaces/aisin/cron/entity/LeaveDetailTableInfo.java create mode 100644 src/weaver/interfaces/aisin/cron/entity/MainTableInfo.java create mode 100644 src/weaver/interfaces/aisin/cron/entity/ScheDetailTableInfo.java diff --git a/WEB-INF/prop/aisinsecond.properties b/WEB-INF/prop/aisinsecond.properties new file mode 100644 index 0000000..6075957 --- /dev/null +++ b/WEB-INF/prop/aisinsecond.properties @@ -0,0 +1,10 @@ +## \u5206\u90E8\u6307\u5B9A +subcompanyid=33 + +##\u8003\u52E4\u786E\u8BA4\u6D41\u7A0B +workflowId=133 + +##\u8003\u52E4\u786E\u8BA4\u6D41\u7A0B\u8868\u540D +tableName=formtable_main_567 + + diff --git a/src/com/engine/kq/biz/KQOverTimeRuleCalBiz.java b/src/com/engine/kq/biz/KQOverTimeRuleCalBiz.java index 1ec28a3..b42a169 100644 --- a/src/com/engine/kq/biz/KQOverTimeRuleCalBiz.java +++ b/src/com/engine/kq/biz/KQOverTimeRuleCalBiz.java @@ -523,7 +523,7 @@ public class KQOverTimeRuleCalBiz { String overtime_uuid = UUID.randomUUID().toString(); String tiaoxiuId = ""; String flow_dataid = dataid+"_"+detailid; - int computingMode = 4; + int computingMode = 5; int unit = KQOvertimeRulesBiz.getMinimumUnit(); String workingHours = ""; diff --git a/src/test/MainTest.java b/src/test/MainTest.java index 2bfc0b3..20e8dca 100644 --- a/src/test/MainTest.java +++ b/src/test/MainTest.java @@ -1,5 +1,11 @@ package test; +import weaver.interfaces.aisin.cron.KqConfirmWfCrob; + +import java.time.LocalDate; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; + /** * @Author weaver_cl * @Description: @@ -9,6 +15,27 @@ package test; public class MainTest { public static void main(String[] args) { + String s = firstDayOfMonth("2024-10"); + String s1 = lastDayOfMonth("2024-10"); + System.out.println(s1); + System.out.println(s); + } + + public static 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")); + + + } + + + public static 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")); } } diff --git a/src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java b/src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java new file mode 100644 index 0000000..ad3ef23 --- /dev/null +++ b/src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java @@ -0,0 +1,253 @@ +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 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(); + + } + + + + +} diff --git a/src/weaver/interfaces/aisin/cron/entity/CusWorkflowRequestInfo.java b/src/weaver/interfaces/aisin/cron/entity/CusWorkflowRequestInfo.java new file mode 100644 index 0000000..d5e0605 --- /dev/null +++ b/src/weaver/interfaces/aisin/cron/entity/CusWorkflowRequestInfo.java @@ -0,0 +1,40 @@ +package weaver.interfaces.aisin.cron.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import weaver.workflow.webservices.WorkflowBaseInfo; +import weaver.workflow.webservices.WorkflowMainTableInfo; + +/** + * @Author liang.cheng + * @Date 2024/4/11 6:10 PM + * @Description: + * @Version 1.0 + */ + +@Data +@NoArgsConstructor +@Builder +@AllArgsConstructor +public class CusWorkflowRequestInfo { + + + private String workflowName; + + private String nextFlow; + + private String requestLevel; + + private boolean canView; + + private String creatorId; + + private WorkflowBaseInfo workflowBaseInfo; + + private WorkflowMainTableInfo workflowMainTableInfo; + + + +} diff --git a/src/weaver/interfaces/aisin/cron/entity/FlowDetailTableInfo.java b/src/weaver/interfaces/aisin/cron/entity/FlowDetailTableInfo.java new file mode 100644 index 0000000..2fbe7e0 --- /dev/null +++ b/src/weaver/interfaces/aisin/cron/entity/FlowDetailTableInfo.java @@ -0,0 +1,26 @@ +package weaver.interfaces.aisin.cron.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author liang.cheng + * @Date 2024/11/22 10:02 AM + * @Description: 加班 + * @Version 1.0 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FlowDetailTableInfo { + + private String date; + + private String serialId; + + private String hours; +} diff --git a/src/weaver/interfaces/aisin/cron/entity/LeaveDetailTableInfo.java b/src/weaver/interfaces/aisin/cron/entity/LeaveDetailTableInfo.java new file mode 100644 index 0000000..8e429c4 --- /dev/null +++ b/src/weaver/interfaces/aisin/cron/entity/LeaveDetailTableInfo.java @@ -0,0 +1,27 @@ +package weaver.interfaces.aisin.cron.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author liang.cheng + * @Date 2024/11/22 10:02 AM + * @Description: 请假 + * @Version 1.0 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LeaveDetailTableInfo { + + private String date; + + private String serialId; + + private Integer leaveType; + + private String hours; +} diff --git a/src/weaver/interfaces/aisin/cron/entity/MainTableInfo.java b/src/weaver/interfaces/aisin/cron/entity/MainTableInfo.java new file mode 100644 index 0000000..95a65f7 --- /dev/null +++ b/src/weaver/interfaces/aisin/cron/entity/MainTableInfo.java @@ -0,0 +1,28 @@ +package weaver.interfaces.aisin.cron.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author liang.cheng + * @Date 2024/11/22 10:00 AM + * @Description: 主表信息 + * @Version 1.0 + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MainTableInfo { + + private String workcode; + + private String resourceId; + + private String departmentId; + + +} diff --git a/src/weaver/interfaces/aisin/cron/entity/ScheDetailTableInfo.java b/src/weaver/interfaces/aisin/cron/entity/ScheDetailTableInfo.java new file mode 100644 index 0000000..dc069e3 --- /dev/null +++ b/src/weaver/interfaces/aisin/cron/entity/ScheDetailTableInfo.java @@ -0,0 +1,23 @@ +package weaver.interfaces.aisin.cron.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author liang.cheng + * @Date 2024/11/22 10:02 AM + * @Description: 排班 + * @Version 1.0 + */ +@Data +@NoArgsConstructor +@Builder +@AllArgsConstructor +public class ScheDetailTableInfo { + + private String date; + + private String serialId; +}