1.共享审批人员分配问题处理

This commit is contained in:
zhangzhiguo 2025-04-24 16:57:28 +08:00
parent cb2390bcad
commit 979b2d274a
3 changed files with 36 additions and 92 deletions

View File

@ -1,41 +1,32 @@
package zcgj.zcdev.zcdev.fs.plugin.operate;
import kd.bos.algo.DataSet;
import kd.bos.algo.Row;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.AddValidatorsEventArgs;
import kd.bos.entity.plugin.PreparePropertysEventArgs;
import kd.bos.entity.validate.AbstractValidator;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.bos.servicehelper.org.OrgUnitServiceHelper;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.servicehelper.user.UserServiceHelper;
import kd.bos.servicehelper.workflow.WorkflowServiceHelper;
import kd.bos.workflow.api.AgentExecution;
import kd.bos.workflow.component.approvalrecord.IApprovalRecordGroup;
import kd.bos.workflow.engine.extitf.IWorkflowPlugin;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
import java.util.List;
/**
* 判断当前审批人是否为提交人
* 综合岗和项目经理发起的报销本人点提交提示必须执行转交
*/
public class ApprovalCheckFlowOp extends AbstractOperationServicePlugIn {
private static final Log log = LogFactory.getLog(ApprovalCheckFlowOp.class);
@Override
public void onPreparePropertys(PreparePropertysEventArgs e) {
super.onPreparePropertys(e);
e.getFieldKeys().add("formid");
e.getFieldKeys().add("id");
e.getFieldKeys().add("applier");
//e.getFieldKeys().add("creator");
}
@Override
@ -49,13 +40,14 @@ public class ApprovalCheckFlowOp extends AbstractOperationServicePlugIn {
public void validate() {
ExtendedDataEntity[] extendedDataEntities = this.getDataEntities();
Long currentUserId = UserServiceHelper.getCurrentUserId();
for (ExtendedDataEntity extendedDataEntity : extendedDataEntities) {
DynamicObject dataEntity = extendedDataEntity.getDataEntity();
String billId = dataEntity.getString("id");
String formid = dataEntity.getString("formid");
//String formid = "zcgj_test_01";
//获取报销人
DynamicObject applier = dataEntity.getDynamicObject("applier");
//DynamicObject applier = dataEntity.getDynamicObject("creator");
Long applierId = applier.getLong("id");
boolean isOk = true;
//所有审批记录,从审批记录中获取已经审批过的人
@ -64,15 +56,19 @@ public class ApprovalCheckFlowOp extends AbstractOperationServicePlugIn {
for (IApprovalRecordGroup allApprovalRecord : allApprovalRecords) {
String groupDecisionType = allApprovalRecord.getGroupDecisionType();
//过滤提交的和待分配的任务
if("submit".equals(groupDecisionType)){ //获取每个节点的审批类型 提交submit
Long userId = allApprovalRecord.getChildren().get(0).getUserId();//获取每个节点的审批人
if(applierId.equals(userId) ){//如果审批不是申请人则可以进行审批操作
log.info("ApprovalCheckFlowOp: 操作节点编码:"+groupDecisionType);
if("submit".equals(groupDecisionType)
||"approve".equals(groupDecisionType)){ //获取每个节点的审批类型 提交submit
log.info("ApprovalCheckFlowOp: approve 申请人:"+applierId);
//Long userId = allApprovalRecord.getChildren().get(0).getUserId();//获取每个节点的审批人
log.info("ApprovalCheckFlowOp: approve 审批人:"+currentUserId);
if(applierId.equals(currentUserId) ){//如果审批不是申请人则可以进行审批操作
isOk = false;
}
}
}
if(!isOk){
this.addFatalErrorMessage(extendedDataEntity, "当前操作人为单据申请人,无法进行审批操作,请转给他人进行审批!");
this.addFatalErrorMessage(extendedDataEntity, "当前审批人为单据申请人,无法进行审批操作,请转给他人进行审批!");
return;
}
}

View File

@ -25,7 +25,6 @@ public class WorkTask extends AbstractTask {
private static final Log log = LogFactory.getLog(WorkTask.class);
//发送物料库存至消息平台
@Override
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
long currUserId = requestContext.getCurrUserId();

View File

@ -1,15 +1,10 @@
package zcgj.zcdev.zcdev.fs.plugin.workflow;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.servicehelper.workflow.WorkflowServiceHelper;
import kd.bos.workflow.component.approvalrecord.IApprovalRecordGroup;
import kd.bos.workflow.engine.dynprocess.freeflow.WFAuditTask;
import kd.bos.workflow.engine.dynprocess.freeflow.WFCustomParam;
import kd.bos.workflow.engine.dynprocess.freeflow.WFFlowElement;
import kd.ssc.task.dis.WorkLoad;
import kd.ssc.task.dis.WorkerStatusPojo;
@ -20,16 +15,12 @@ import java.util.stream.Collectors;
* 共享任务人员重分配
*/
public class WorkLoadExt extends WorkLoad {
private static final Log log = LogFactory.getLog(WorkLoadExt.class);
@Override
public Set<Long> deletePerson4Return(Long groupId, DynamicObject task) {
log.info("WorkLoadExt: deletePerson4Return -- start");
Set<Long> longs = super.deletePerson4Return(groupId, task);
//开发商标识
String prefix ="zcgj";
//是否自动审批通过
boolean isAutoPass = false;
boolean isVoucher = false;
// ->人映射<组ID组中人员工作状态信息>
//获取所有的共享审批组
Map<Long, List<WorkerStatusPojo>> groupPersonMap = getGroupPersonMap();
@ -71,93 +62,51 @@ public class WorkLoadExt extends WorkLoad {
}
}
//通过billid获取流程实例id
Long processInstanceIdByBusinessKey = WorkflowServiceHelper.getProcessInstanceIdByBusinessKey(billid);
//通过流程实例id获取wf_task数据用于获取和过滤共享节点的配置参数
QFilter taskFilter1 = new QFilter("processinstanceid", QCP.equals, processInstanceIdByBusinessKey);
DynamicObject[] taskDynamicObjects = BusinessDataServiceHelper.load("wf_task", "taskdefinitionkey", new QFilter[]{taskFilter1});
//构建单据对象用于查询单据的工作流流程元素数据
DynamicObject billDynamicObject = BusinessDataServiceHelper.newDynamicObject(entityName);
billDynamicObject.set("id",billid);
List<WFFlowElement> processElements = WorkflowServiceHelper.getProcessElements(billDynamicObject, null);
//查询流程元素数据
List<WFFlowElement> sscApprove = processElements.stream().filter(e -> e.getId().equals(taskDynamicObjects[0].get("taskdefinitionkey"))).collect(Collectors.toList());
WFFlowElement wfFlowElement = sscApprove.get(0);
//获取流程配置参数
List<WFCustomParam> customParams = ((WFAuditTask) wfFlowElement).getCustomParams();
//遍历流程配置的参数获取isVoucher用来判断当前节点是否要生成凭证
for (WFCustomParam customParam : customParams) {
String number = customParam.getNumber();
String value = customParam.getValue();
//如果当前节点需要生成凭证
if(number.equals("isVoucher") && value.equals("true")){
isVoucher= true;
}
}
//当前共享组所有审批人员ID集合
List<Long> sharedApprovers = workLoadList.stream().map(WorkerStatusPojo::getUserId).collect(Collectors.toList());
//如果当前共享审批组里只有他一个人则只分配给他不移除审批人
if(sharedApprovers.size() ==1){
return longs;
}
//当前流程已经审批过的所有人员ID集合
List<Long> localApprovers = approvalUserIds.stream().sorted().collect(Collectors.toList());
Set<Long> localApprovers = approvalUserIds.stream().sorted().collect(Collectors.toSet());
//localApprovers.add(crtUserId);//测试
//获取需要移除的审批人和是否自动审批
Map<String, Object> stringObjectMap = handleApproval(localApprovers, sharedApprovers);
//Map<String, Object> stringObjectMap = handleApproval(localApprovers, sharedApprovers);
//是否自动审批
isAutoPass = (boolean)stringObjectMap.get("isAutoPass");
//需要移除的人员id集合
Set<Long> userIdSet = (Set<Long>)stringObjectMap.get("removedApprovers");
//记录审批日期如果需要自动审批则isapprovals设置为A
String approvalsLogsEntityName = "zcgj_auto_approvals_logs";
DynamicObject dynamicObject = BusinessDataServiceHelper.newDynamicObject(approvalsLogsEntityName);
//日志编码
dynamicObject.set("number",System.currentTimeMillis());
//审批节点名称
dynamicObject.set("name", string);
//业务单据名称
//dynamicObject.set(prefix+"_bill_name", billname);
//业务单据id
dynamicObject.set(prefix+"_billid", billid);
//业务单据编码
dynamicObject.set(prefix+"_bill_number", billnumber);
//业务单据标识
dynamicObject.set(prefix+"_bill_entityname", entityName);
//业务单据共享中心id
dynamicObject.set(prefix+"_bill_sscid",sscid);
//自动审批且不需要生成凭证则可以执行自动审批
if(isAutoPass && !isVoucher){
dynamicObject.set(prefix+"_isapprovals","A");//自动审批
dynamicObject.set(prefix+"_remark","机器人自动审批且不需要生成凭证");
}else{
dynamicObject.set(prefix+"_isapprovals","B");//不自动审批
dynamicObject.set(prefix+"_remark","需要审核人手动审批或需要生成凭证");
}
Object[] save = SaveServiceHelper.save(new DynamicObject[]{dynamicObject});
//Set<Long> userIdSet = (Set<Long>)stringObjectMap.get("removedApprovers");
//循环判断当前单据的共享审批节点是否有本地已经审批过的人如果有则进行移除
//如果本地没有审批人则不移除审批人
if(userIdSet == null || userIdSet.isEmpty()||localApprovers.isEmpty()){
if(localApprovers == null || localApprovers.isEmpty()){
return longs;
}
//迭代审批人集合
while (it.hasNext()) {
WorkerStatusPojo person = it.next();
Long userId = person.getUserId();
if (userIdSet.contains(userId)) {
if (localApprovers.contains(userId)) {
// 记录删除的处理人
longs.add(userId);
log.info("WorkLoadExt: removeUserId :"+userId);
//记录需要删除的审批人返回后系统会自动移除该共享组的审批人
delPersonsList.add(person);
//迭代移除操作
it.remove();
}
//移除全部-测试用
//it.remove();
}
log.info("WorkLoadExt: 返回出来的用户Id");
for (Long aLong : longs) {
log.info("WorkLoadExt: returnUserId移除分配的审批人Id :"+aLong);
}
log.info("WorkLoadExt: deletePerson4Return -- end");
return longs;
}