diff --git a/src/main/java/com/lz/modules/app/entity/StaffSimpleInfo.java b/src/main/java/com/lz/modules/app/entity/StaffSimpleInfo.java index 3fc76ecd..6d3045af 100644 --- a/src/main/java/com/lz/modules/app/entity/StaffSimpleInfo.java +++ b/src/main/java/com/lz/modules/app/entity/StaffSimpleInfo.java @@ -52,6 +52,8 @@ public class StaffSimpleInfo implements Serializable { private ResultRecord resultRecord; //本次发起的任务信息 private FlowStart flowStart; + //当前操作的流程id + private Long flowRecordId; diff --git a/src/main/java/com/lz/modules/flow/dao/FlowChangeMapper.java b/src/main/java/com/lz/modules/flow/dao/FlowChangeMapper.java index 74299ae7..72d1aae8 100644 --- a/src/main/java/com/lz/modules/flow/dao/FlowChangeMapper.java +++ b/src/main/java/com/lz/modules/flow/dao/FlowChangeMapper.java @@ -31,4 +31,6 @@ public interface FlowChangeMapper extends BaseMapper { FlowChange selectFlowChangeByRecordIdAndToIdAndType(@Param("recordId") Long recordId, @Param("toStaffId") Long toStaffId, @Param("type") int type); + + FlowChange selectFlowChangeByFlowRecordIdAndType(@Param("flowRecordId") Long flowRecordId, @Param("type") int type); } \ No newline at end of file diff --git a/src/main/java/com/lz/modules/flow/service/FlowChangeService.java b/src/main/java/com/lz/modules/flow/service/FlowChangeService.java index 162d21e4..de7e7430 100644 --- a/src/main/java/com/lz/modules/flow/service/FlowChangeService.java +++ b/src/main/java/com/lz/modules/flow/service/FlowChangeService.java @@ -35,4 +35,6 @@ public interface FlowChangeService extends IService { void saveChange(ApprovalDto approvalDto, FlowRecord flowRecord, int i); FlowChange selectFlowChangeByRecordIdAndToIdAndType(Long recordId, Long toStaffId, int type); + + FlowChange selectFlowChangeByFlowRecordIdAndType(Long flowRecordId, int i); } \ No newline at end of file diff --git a/src/main/java/com/lz/modules/flow/service/impl/FlowChangeServiceImpl.java b/src/main/java/com/lz/modules/flow/service/impl/FlowChangeServiceImpl.java index 7d043fa8..803ef963 100644 --- a/src/main/java/com/lz/modules/flow/service/impl/FlowChangeServiceImpl.java +++ b/src/main/java/com/lz/modules/flow/service/impl/FlowChangeServiceImpl.java @@ -84,5 +84,10 @@ public class FlowChangeServiceImpl extends ServiceImpl toStaffids = new ArrayList<>(); - toStaffids.add(fromStaff); - sendWorkMSGWithAsyn(null, toStaffids, WorkMsgTypeEnum.PROCESS.getType()); + fromStaff.setFlowRecordId(flowRecordId); if(type == WorkMsgTypeEnum.REJECT.getType()){//被拒 - - sendWorkMSGWithAsyn(null, toStaffids, WorkMsgTypeEnum.REJECT.getType()); + sendWorkMSGWithAsyn(fromStaff, null, WorkMsgTypeEnum.REJECT.getType()); }else if(type == WorkMsgTypeEnum.URGING.getType()){//被拒 - sendWorkMSGWithAsyn(null, toStaffids, WorkMsgTypeEnum.URGING.getType()); + sendWorkMSGWithAsyn(fromStaff, null, WorkMsgTypeEnum.URGING.getType()); }else if(type == WorkMsgTypeEnum.SKIP.getType()){//被拒 - sendWorkMSGWithAsyn(null, toStaffids, WorkMsgTypeEnum.SKIP.getType()); + sendWorkMSGWithAsyn(fromStaff, null, WorkMsgTypeEnum.SKIP.getType()); }else if(type == WorkMsgTypeEnum.TRANSFER.getType()){//被拒 - sendWorkMSGWithAsyn(null, toStaffids, WorkMsgTypeEnum.TRANSFER.getType()); + sendWorkMSGWithAsyn(fromStaff, null, WorkMsgTypeEnum.TRANSFER.getType()); }else{ - sendWorkMSGWithAsyn(null, toStaffids, WorkMsgTypeEnum.PROCESS.getType()); + sendWorkMSGWithAsyn(fromStaff, null, WorkMsgTypeEnum.PROCESS.getType()); } @@ -270,10 +263,15 @@ public class DingtalkBusiness { } return "error"; } + //流程流转发送消息 + public String sendWorkMSGWithAsyn(Long resultRecordId , int type) { + return sendWorkMSGWithAsyn(resultRecordId, 0L, type); + + } public String sendWorkMSGWithAsyn(StaffSimpleInfo fromStaff, List toStaffids, int type) { - if(toStaffids.size() > 0){ + if(toStaffids != null && toStaffids.size() > 0){ if (toStaffids.get(0).getEmployeeId() == null || toStaffids.get(0).getEmployeeId().length() == 0) { //查询第三方id List ids = toStaffids.stream().map(new Function() { @@ -292,7 +290,7 @@ public class DingtalkBusiness { } WorkMsgTypeEnum workMsgTypeEnum = WorkMsgTypeEnum.findRoleTypeByCode(type); - ThreadSendMessage threadSendMessage = new ThreadSendMessage(toStaffids, workMsgTypeEnum, appid); + ThreadSendMessage threadSendMessage = new ThreadSendMessage(fromStaff, toStaffids, workMsgTypeEnum, appid); Thread thread = new Thread(threadSendMessage); thread.start(); @@ -374,12 +372,13 @@ public class DingtalkBusiness { public class ThreadSendMessage implements Runnable{ List toStaffids; - //StaffSimpleInfo fromStaff = null; + StaffSimpleInfo fromStaff = null; List recordIds; WorkMsgTypeEnum workMsgTypeEnum; String appid; String hostUrl = "https://lzmanagement.ldxinyong.com/digitization"; - public ThreadSendMessage(List toStaffids, WorkMsgTypeEnum typeEnum, String appid){ + public ThreadSendMessage(StaffSimpleInfo fromStaff, List toStaffids, WorkMsgTypeEnum typeEnum, String appid){ + this.fromStaff = fromStaff; this.toStaffids = toStaffids; workMsgTypeEnum = typeEnum; this.appid = appid; @@ -421,53 +420,37 @@ public class DingtalkBusiness { ThirdAppConfig thirdAppConfig = thirdAppConfigService.getByAppId(appid); String token = dingTalkUtil.getAccessTokenWitchEntity(thirdAppConfig); - if(workMsgTypeEnum.getType() == WorkMsgTypeEnum.CLEARN.getType()){ - //绩效催办 - logger.info("绩效清空"); + if(token != null && token.length() > 0){ + if(workMsgTypeEnum.getType() == WorkMsgTypeEnum.CLEARN.getType()){ + //绩效催办 + logger.info("绩效清空"); - List threadSendMessages - = thirdMsgSendRecordService.selectThirdMsgSendRecordsByRecordIds(recordIds, 1, 1); - logger.info("需要删除的条数为{}", threadSendMessages.size()); - for (ThirdMsgSendRecord thirdMsgSendRecord:threadSendMessages - ) { - dingTalkUtil.updateWorkMSG(thirdMsgSendRecord, token); - } - }else{ - logger.info("开始批量推送消息,数量{}, appid{}", toStaffids.size(), appid); - for (StaffSimpleInfo info:toStaffids - ) { - if(token != null && token.length() > 0){ - //下面防止第二次发送消息时钉钉不推送 + List threadSendMessages + = thirdMsgSendRecordService.selectThirdMsgSendRecordsByRecordIds(recordIds, 1, 1); + logger.info("需要删除的条数为{}", threadSendMessages.size()); + for (ThirdMsgSendRecord thirdMsgSendRecord:threadSendMessages + ) { + dingTalkUtil.updateWorkMSG(thirdMsgSendRecord, token); + } + }else{ + logger.info("开始批量推送消息,数量{}, appid{}", toStaffids.size(), appid); + + if(toStaffids == null){//流程流转走的代码 String url = hostUrl; if(url.contains("?")){ url += "&halokit=" + System.currentTimeMillis(); }else{ url += "?halokit=" + System.currentTimeMillis(); } - url += ("&detail=1&id=" + info.getResultRecord().getId()); + url += ("&detail=1&id=" + fromStaff.getResultRecord().getId()); url = URLEncoder.encode(url); url = "dingtalk://dingtalkclient/action/openapp?corpid=" + thirdAppConfig.getCorpId() + "&container_type=work_platform&app_id=0_" + appid + "&redirect_type=jump&redirect_url=" + url; - - if(workMsgTypeEnum.getType() == WorkMsgTypeEnum.START_WORK.getType()){ - //发送制定目标通知 - logger.info("目标制定"); - sendNotic(info.getId(), info.getEmployeeId(), - "目标制定", info.getFlowStart().getName(), - info.getResultRecord().getStaffName(), token, url, info.getResultRecord().getId()); - - }else if(workMsgTypeEnum.getType() == WorkMsgTypeEnum.START_SCORE.getType()){ - //发送开始评分通知 - logger.info("结果录入"); - sendNotic(info.getId(), info.getEmployeeId(), - "结果录入", info.getFlowStart().getName(), - info.getResultRecord().getStaffName(), token, url, info.getResultRecord().getId()); - - }else if(workMsgTypeEnum.getType() == WorkMsgTypeEnum.URGING.getType()){ + if(workMsgTypeEnum.getType() == WorkMsgTypeEnum.URGING.getType()){ //绩效催办 logger.info("绩效催办"); }else { @@ -477,56 +460,59 @@ public class DingtalkBusiness { //转交 //并发转交会有问题 logger.info("转交待办任务处理"); - FlowChange flowChange = flowChangeService.selectFlowChangeByRecordIdAndToIdAndType(info.getResultRecord().getId(), - info.getId(), 0); - ThirdMsgSendRecord thirdMsgSendRecord = - thirdMsgSendRecordService.selectThirdMsgSendRecordByWorkIdAndStaffIdAndTypeAndStatus( - info.getResultRecord().getId(), flowChange.getApprovalId(), 1, 1); - if(thirdMsgSendRecord != null){//把原来的任务更新掉 - dingTalkUtil.updateWorkMSG(thirdMsgSendRecord, token); + FlowChange flowChange = flowChangeService.selectFlowChangeByFlowRecordIdAndType( + fromStaff.getFlowRecordId(), + 0); + if(flowChange != null){ + ThirdMsgSendRecord thirdMsgSendRecord = + thirdMsgSendRecordService.selectThirdMsgSendRecordByWorkIdAndStaffIdAndTypeAndStatus( + fromStaff.getResultRecord().getId(), flowChange.getApprovalId(), 1, 1); + if(thirdMsgSendRecord != null){//把原来的任务更新掉 + dingTalkUtil.updateWorkMSG(thirdMsgSendRecord, token); + } + FlowRecord flowRecord = flowRecordService.selectFlowRecordById(flowChange.getFlowRecordId()); + if(flowRecord != null && flowRecord.getStatus().intValue() == 2){ + logger.info("转交存在且为当前要处理的节点"); + StaffSimpleInfo staffSimpleInfo = staffService.selectStaffSimpleInfo(flowRecord.getApprovalStaffId()); + //List flowRecords = flowRecordService.selectFlowRecordByRecordIdStatus(info.getResultRecord().getId(), 2); + //发送待办任务到新指定人员,转交过来一定会有数据 + sendNotic(staffSimpleInfo.getId(), staffSimpleInfo.getEmployeeId(), + flowRecord.getFlowName(), fromStaff.getFlowStart().getName(), + fromStaff.getResultRecord().getStaffName(), token, url, fromStaff.getResultRecord().getId()); + }else{ + logger.info("转交不存在,或者当前非处理节点无需发送"); + } + }else{ + logger.info("流转变更记录不存在"); } - FlowRecord flowRecord = flowRecordService.selectFlowRecordById(flowChange.getFlowRecordId()); - StaffSimpleInfo staffSimpleInfo = staffService.selectStaffSimpleInfo(flowRecord.getApprovalStaffId()); - //List flowRecords = flowRecordService.selectFlowRecordByRecordIdStatus(info.getResultRecord().getId(), 2); - //发送待办任务到新指定人员,转交过来一定会有数据 - sendNotic(info.getId(), staffSimpleInfo.getEmployeeId(), - flowRecord.getFlowName(), info.getFlowStart().getName(), - info.getResultRecord().getStaffName(), token, url, info.getResultRecord().getId()); - }else if(workMsgTypeEnum.getType() == WorkMsgTypeEnum.SKIP.getType()){//跳过 //跳过 logger.info("跳过待办任务处理"); - - List flowRecords = - flowRecordService.selectSkipFlowRecordsById(info.getResultRecord().getId());//取消所有跳过的人 + flowRecordService.selectSkipFlowRecordsById(fromStaff.getResultRecord().getId());//取消所有跳过的人 logger.info("查询到可能需要更新待办任务数量{}", flowRecords.size()); if(flowRecords.size() > 0){ - //if(flowRecords.get(0).getType().intValue() == 1){ - //或签 - logger.info("或签,需要更新该节点下所有人员的待办任务"); - for (FlowRecord flowRecord:flowRecords - ) { - //if(flowRecord.getApprovalStaffId().longValue() != info.getId()){ - logger.info("更新非直接跳关人员的待办任务,人员id:{}, 姓名:{}", flowRecord.getApprovalStaffId(), - flowRecord.getApprovalStaffName()); - ThirdMsgSendRecord thirdMsgSendRecord = - thirdMsgSendRecordService.selectThirdMsgSendRecordByWorkIdAndStaffIdAndTypeAndStatus( - info.getResultRecord().getId(), - flowRecord.getApprovalStaffId(), 1, 1); - if(thirdMsgSendRecord != null){//把原来的任务更新掉 - dingTalkUtil.updateWorkMSG(thirdMsgSendRecord, token); - }else{ - logger.info("无需更新"); - } - //} + //或签 + logger.info("或签,需要更新该节点下所有人员的待办任务"); + for (FlowRecord flowRecord:flowRecords + ) { + logger.info("更新非直接跳关人员的待办任务,人员id:{}, 姓名:{}", flowRecord.getApprovalStaffId(), + flowRecord.getApprovalStaffName()); + ThirdMsgSendRecord thirdMsgSendRecord = + thirdMsgSendRecordService.selectThirdMsgSendRecordByWorkIdAndStaffIdAndTypeAndStatus( + fromStaff.getResultRecord().getId(), + flowRecord.getApprovalStaffId(), 1, 1); + if(thirdMsgSendRecord != null){//把原来的任务更新掉 + dingTalkUtil.updateWorkMSG(thirdMsgSendRecord, token); + }else{ + logger.info("无需更新"); } - //} + } } }else{ - List flowRecords = flowRecordService.selectFlowRecordByRecordIdStatus(info.getResultRecord().getId(), 2); + List flowRecords = flowRecordService.selectFlowRecordByRecordIdStatus(fromStaff.getResultRecord().getId(), 2); if(flowRecords.size() > 0){//给下一步骤需要处理的人发送待办任务 if(flowRecords.get(0).getFlowProcess().intValue() != 2){//执行中的不发送待办 logger.info("非执行中的节点发送待办任务{}", flowRecords.get(0).getFlowName()); @@ -540,21 +526,21 @@ public class DingtalkBusiness { for (StaffSimpleInfo staffSimpleInfo:staffSimpleInfos ) { sendNotic(staffSimpleInfo.getId(), staffSimpleInfo.getEmployeeId(), - flowRecords.get(0).getFlowName(), info.getFlowStart().getName(), - info.getResultRecord().getStaffName(), token, url, info.getResultRecord().getId()); + flowRecords.get(0).getFlowName(), fromStaff.getFlowStart().getName(), + fromStaff.getResultRecord().getStaffName(), token, url, fromStaff.getResultRecord().getId()); } } } //取消上一步骤发送的待办任务 if(flowRecords.size() == 0){//任务结束了 - flowRecords = flowRecordService.selectLastFlowRecordsById(info.getResultRecord().getId()); + flowRecords = flowRecordService.selectLastFlowRecordsById(fromStaff.getResultRecord().getId()); }else{ if(workMsgTypeEnum.getType() == WorkMsgTypeEnum.REJECT.getType()){//被拒 - flowRecords = flowRecordService.selectLastFlowRecordsByIdAndFlowIndex(info.getResultRecord().getId() + flowRecords = flowRecordService.selectLastFlowRecordsByIdAndFlowIndex(fromStaff.getResultRecord().getId() , flowRecords.get(0).getFlowIndex().intValue() + 1);//获取下一步的数据 }else{ - flowRecords = flowRecordService.selectLastFlowRecordsByIdAndFlowIndex(info.getResultRecord().getId() + flowRecords = flowRecordService.selectLastFlowRecordsByIdAndFlowIndex(fromStaff.getResultRecord().getId() , flowRecords.get(0).getFlowIndex().intValue() - 1);//获取上一步的数据 } @@ -571,7 +557,7 @@ public class DingtalkBusiness { flowRecord.getApprovalStaffName()); ThirdMsgSendRecord thirdMsgSendRecord = thirdMsgSendRecordService.selectThirdMsgSendRecordByWorkIdAndStaffIdAndTypeAndStatus( - info.getResultRecord().getId(), + fromStaff.getResultRecord().getId(), flowRecord.getApprovalStaffId(), 1, 1); if(thirdMsgSendRecord != null){//把原来的任务更新掉 dingTalkUtil.updateWorkMSG(thirdMsgSendRecord, token); @@ -583,10 +569,48 @@ public class DingtalkBusiness { } } } - }else{ - logger.info("ThreadSendMessage token无效"); ; + + + }else{//批量推送给指定人员 + for (StaffSimpleInfo info:toStaffids + ) { + + //下面防止第二次发送消息时钉钉不推送 + String url = hostUrl; + if (url.contains("?")) { + url += "&halokit=" + System.currentTimeMillis(); + } else { + url += "?halokit=" + System.currentTimeMillis(); + } + url += ("&detail=1&id=" + info.getResultRecord().getId()); + url = URLEncoder.encode(url); + url = "dingtalk://dingtalkclient/action/openapp?corpid=" + thirdAppConfig.getCorpId() + + "&container_type=work_platform&app_id=0_" + + appid + "&redirect_type=jump&redirect_url=" + url; + + if (workMsgTypeEnum.getType() == WorkMsgTypeEnum.START_WORK.getType()) { + //发送制定目标通知 + logger.info("目标制定"); + sendNotic(info.getId(), info.getEmployeeId(), + "目标制定", info.getFlowStart().getName(), + info.getResultRecord().getStaffName(), token, url, info.getResultRecord().getId()); + + } else if (workMsgTypeEnum.getType() == WorkMsgTypeEnum.START_SCORE.getType()) { + //发送开始评分通知 + logger.info("结果录入"); + sendNotic(info.getId(), info.getEmployeeId(), + "结果录入", info.getFlowStart().getName(), + info.getResultRecord().getStaffName(), token, url, info.getResultRecord().getId()); + + }else{ + logger.info("未定义消息类型"); + } + + } } } + }else{ + logger.info("ThreadSendMessage token无效"); ; } } diff --git a/src/main/resources/mapper/flow/FlowChangeMapper.xml b/src/main/resources/mapper/flow/FlowChangeMapper.xml index 992c9e3d..e9ec2504 100644 --- a/src/main/resources/mapper/flow/FlowChangeMapper.xml +++ b/src/main/resources/mapper/flow/FlowChangeMapper.xml @@ -103,5 +103,9 @@ select * from lz_flow_change where record_id=#{recordId} and to_approval_id = #{toStaffId} and type = #{type} and is_delete = 0 limit 1 + +