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

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+")";
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;
}
}