|
|
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;
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|