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" , 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 = ?" , 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 = ?" , 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 ) ;
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 ( ) ;
//leavebackrequestid 格式 ,123456,123467
List < String > strings = Arrays . asList ( leavebackrequestid . split ( "," ) ) ;
String join = CollectionUtil . join ( strings , "," ) ;
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 ;
}
}