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-develop/src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java

306 lines
14 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package weaver.interfaces.aisin.cron;
import cn.hutool.core.collection.CollectionUtil;
import com.engine.integration.util.StringUtils;
import com.engine.kq.biz.*;
import com.engine.kq.entity.WorkTimeEntity;
import com.weaver.general.Util;
import org.apache.commons.collections.CollectionUtils;
import weaver.common.DateUtil;
import weaver.common.util.string.StringUtil;
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.Arrays;
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<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 + ")";
sql = "select id,workcode,departmentid from hrmresource where lastname in ('ATBP人事管理员','韩园园', '测试加班仙女21-男', '测试加班仙女21-女', '测试考勤', '测试-刘1', '测试小朱-男', '测试小朱-女', '陈曦', '陈莹', '范文露', '蒋珊', '开发', '开发测试', '李鹭', '刘辉', '刘长', '田建萍', '王珺', '王可爱', '吴建国', '闫雅杰', '杨勇', '张航', '张宁', '张子识')";
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 order by kqdate asc", 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 = ? order by belongdate asc", 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 belongDate,newleavetype,d_mins,serialid,leavebackrequestid from kq_flow_split_leave where belongDate >= '" + firstDayOfMonth + "' and belongDate <= '" + lastDayOfMonth + "' \n" +
" and resourceid = ? order by belongdate asc", e.getResourceId());
while (rs.next()) {
String belongDate = Util.null2String(rs.getString("belongDate"));
String serialId = Util.null2String(rs.getString("serialid"));
Integer leaveType = Util.getIntValue(rs.getString("newleavetype"));
String d_mins = Util.null2String(rs.getString("d_mins"));
String leavebackrequestid = Util.null2String(rs.getString("leavebackrequestid"));
String leaveBackMins = "0";
//是否存在销假
if (StringUtil.isNotNullAndEmpty(leavebackrequestid)) {
leaveBackMins = leaveBack(leavebackrequestid, e.getResourceId(), belongDate);
}
String reduce = getReduce(d_mins, leaveBackMins);
if (!d_mins.equals(leaveBackMins)) {
leaveDetails.add(LeaveDetailTableInfo.builder()
.date(belongDate)
.serialId(serialId)
.leaveType(leaveType)
.hours(minutesToHours(reduce))
.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;
}
/**
* 销假数据
*
* @param leavebackrequestid
* @param resourceId
* @param belongDate
* @return
*/
private String leaveBack(String leavebackrequestid, String resourceId, String belongDate) {
RecordSet rs = new RecordSet();
BaseBean bb = new BaseBean();
//leavebackrequestid 格式 ,123456,123467
List<String> strings = Arrays.asList(leavebackrequestid.split(","));
//去除空字符串
List<String> filteredStrings = strings.stream()
.filter(str -> !str.isEmpty())
.collect(Collectors.toList());
String join = CollectionUtil.join(filteredStrings, ",");
bb.writeLog("销假requestid =>" + leavebackrequestid + "=>" + join);
List<Integer> list = new ArrayList<>();
rs.executeQuery("select D_Mins from kq_flow_split_leaveback where resourceid = ? and requestid in (" + join + ") " +
" and belongDate = '" + belongDate + "'", resourceId);
while (rs.next()) {
list.add(Util.getIntValue(rs.getString("D_Mins")));
}
return String.valueOf(list.stream()
.mapToInt(Integer::intValue)
.sum());
}
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();
}
private String getReduce(String leaveMins, String leavebackMins) {
String reduceMins;
int leaveMin = Integer.parseInt(leaveMins);
int leavebackMin = Integer.parseInt(leavebackMins);
reduceMins = String.valueOf(leaveMin - leavebackMin);
return reduceMins;
}
}