Bläddra i källkod

报销审批列表添加审批功能

lizhenhao 2 år sedan
förälder
incheckning
8df906960f

+ 10 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/zs/zsReimbursement/approvalInfo/controller/ZsReimbursementInfoController.java

@@ -7,7 +7,9 @@ import com.jeeplus.common.utils.ResponseUtil;
 import com.jeeplus.core.excel.ExcelOptions;
 import com.jeeplus.core.excel.ExportMode;
 import com.jeeplus.core.excel.utils.EasyPoiUtil;
+import com.jeeplus.flowable.service.FlowTaskService;
 import com.jeeplus.sys.constant.enums.LogTypeEnum;
+import com.jeeplus.sys.utils.StringUtils;
 import com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceDTO;
 import com.jeeplus.test.cw.reimbursementApproval.approvalInfo.service.dto.*;
 import com.jeeplus.test.program.configuration.projectList.domain.ProgramProjectListInfo;
@@ -40,6 +42,9 @@ public class ZsReimbursementInfoController {
     @Resource
     private ZsReimbursementInfoService service;
 
+    @Resource
+    private FlowTaskService flowTaskService;
+
     /**
      * 报告号查询
      * @param dto
@@ -61,6 +66,11 @@ public class ZsReimbursementInfoController {
     @GetMapping("/list")
     public ResponseEntity<IPage<ZsRetureListDto>> list(Page<ZsRetureListDto> page, QueryListDto dto) throws Exception{
         IPage<ZsRetureListDto> iPage = service.list(page, dto);
+        iPage.getRecords().stream().forEach(i -> {
+            if (StringUtils.isNotBlank(i.getProcInsId()) && StringUtils.isNotBlank(i.getTaskId())) {
+                i.setAuditUserIds(flowTaskService.getTaskAuditUsers(i.getProcInsId(), i.getTaskId()));  // 获取数据审核人
+            }
+        });
         return ResponseEntity.ok(iPage);
     }
 

+ 7 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/zs/zsReimbursement/approvalInfo/service/dto/ZsRetureListDto.java

@@ -2,10 +2,12 @@ package com.jeeplus.test.zs.zsReimbursement.approvalInfo.service.dto;
 
 import cn.afterturn.easypoi.excel.annotation.Excel;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import liquibase.pro.packaged.S;
 import lombok.Data;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 @Data
 public class ZsRetureListDto {
@@ -115,4 +117,9 @@ public class ZsRetureListDto {
     private String purchaseNo;
 
     private String purchaseId;
+
+    /**
+     * 数据审核人
+     */
+    private List<String> auditUserIds;
 }

+ 5 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/mapper/FlowMapper.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.jeeplus.flowable.model.ActHiIdentitylink;
 import com.jeeplus.flowable.model.ActRuTaskInfo;
 import com.jeeplus.flowable.model.Flow;
+import com.jeeplus.flowable.vo.AssigneeDto;
 
 import java.util.List;
 
@@ -35,4 +36,8 @@ public interface FlowMapper extends BaseMapper <Flow> {
     ActRuTaskInfo getTaskInfoByTaskId(String taskId);
 
     String getTaskIdByprocInstId(String procInsId);
+
+    List<AssigneeDto> getAssigneeDtoByTaskId(String taskId);
+
+    String getStarterByProcInsId(String procInsId);
 }

+ 16 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/mapper/xml/FlowMapper.xml

@@ -71,4 +71,20 @@
 		select ID_ from act_hi_procinst where PROC_INST_ID_ = #{procInstId}
 	</select>
 
+	<select id="getAssigneeDtoByTaskId" resultType="com.jeeplus.flowable.vo.AssigneeDto">
+		select
+			aea.type,
+			aea.assign_value
+		from act_ru_task art
+		left join act_extension_taskdef aet on art.TASK_DEF_KEY_ = aet.task_def_id and aet.del_flag = 0
+		left join act_extension_assignee aea on aet.id = aea.task_def_id and aet.del_flag = 0
+		where art.ID_ = #{taskId}
+	</select>
+
+	<select id="getStarterByProcInsId" resultType="string">
+		select
+			ari.USER_ID_
+		from act_ru_identitylink ari
+		where ari.PROC_INST_ID_ = #{procInsId} and ari.TYPE_ = 'starter'
+	</select>
 </mapper>

+ 164 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowTaskService.java

@@ -3,6 +3,7 @@
  */
 package com.jeeplus.flowable.service;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
@@ -10,6 +11,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.jeeplus.common.utils.Collections3;
+import com.jeeplus.extension.service.dto.FlowAssigneeDTO;
 import com.jeeplus.flowable.constant.FlowableConstant;
 import com.jeeplus.flowable.model.ActHiIdentitylink;
 import com.jeeplus.flowable.model.ActRuTaskInfo;
@@ -21,6 +23,8 @@ import com.jeeplus.flowable.mapper.FlowMapper;
 import com.jeeplus.flowable.service.converter.json.FlowModelService;
 import com.jeeplus.flowable.utils.FlowableUtils;
 import com.jeeplus.flowable.utils.ProcessDefCache;
+import com.jeeplus.sys.domain.User;
+import com.jeeplus.sys.service.UserService;
 import com.jeeplus.sys.service.dto.UserDTO;
 import com.jeeplus.sys.utils.StringUtils;
 import com.jeeplus.sys.utils.UserUtils;
@@ -994,4 +998,164 @@ public class FlowTaskService {
         return flowMapper.getTaskIdByprocInstId(procInsId);
     }
 
+    /**
+     * 获取数据的全部审核人
+     */
+    public List<String> getTaskAuditUsers(String procInsId, String taskId) {
+        // 获取当前节点的所有审核人配置
+        List<AssigneeDto> assigneeDtoList = flowMapper.getAssigneeDtoByTaskId(taskId);
+        // 获取当前流程的发起人id
+        String startUserId = flowMapper.getStarterByProcInsId(procInsId);
+
+        HashSet<String> candidateUserIds = new LinkedHashSet<> ();
+        for (AssigneeDto flowAssignee : assigneeDtoList) {
+            switch (flowAssignee.getType ()) {
+                case "user":
+                    candidateUserIds.addAll (Arrays.asList (flowAssignee.getAssignValue ().split (",")));
+                    break;
+                case "post":
+                    if( StrUtil.isNotBlank (flowAssignee.getAssignValue ())){
+                        String postId = flowAssignee.getAssignValue ();
+                        List<UserDTO> userList = SpringUtil.getBean ( UserService.class).findListByPostId (postId  );
+                        candidateUserIds.addAll ( com.jeeplus.flowable.common.handler.CollectionUtils.extractToList (userList, "id"));
+                    }
+
+                    break;
+                case "company":
+                    if(StrUtil.isNotBlank (flowAssignee.getAssignValue ())){
+                        String companyId = flowAssignee.getAssignValue ();
+                        List<User> userList = SpringUtil.getBean (UserService.class).lambdaQuery ().eq ( User::getCompanyId, companyId ).list ();
+                        candidateUserIds.addAll (com.jeeplus.flowable.common.handler.CollectionUtils.extractToList (userList, "id"));
+                    }
+
+                    break;
+                case "depart":
+                    if(StrUtil.isNotBlank (flowAssignee.getAssignValue ())){
+                        String officeId = flowAssignee.getAssignValue ();
+                        List<User> userList = SpringUtil.getBean (UserService.class).lambdaQuery ().eq ( User::getOfficeId, officeId ).list ();
+                        candidateUserIds.addAll (com.jeeplus.flowable.common.handler.CollectionUtils.extractToList (userList, "id"));
+                    }
+
+                    break;
+                case "role":
+                    if(StrUtil.isNotBlank (flowAssignee.getAssignValue ())){
+                        String[] roleIds = flowAssignee.getAssignValue ().split (",");
+                        for(String roleId: roleIds){
+                            List<UserDTO> userList = SpringUtil.getBean (UserService.class).findListByRoleId ( roleId );
+                            candidateUserIds.addAll (com.jeeplus.flowable.common.handler.CollectionUtils.extractToList (userList, "id"));
+                        }
+                    }
+                    break;
+                case "applyUserId":
+                    candidateUserIds.add (flowAssignee.getAssignValue ());
+                    break;
+                case "previousExecutor":
+                    HistoricTaskInstance lastHisTask = SpringUtil.getBean (HistoryService.class).createHistoricTaskInstanceQuery ().processInstanceId (procInsId).finished ()
+                            .includeProcessVariables ().orderByHistoricTaskInstanceEndTime ().desc ().list ().get (0);
+
+                    candidateUserIds.add(lastHisTask.getAssignee ());
+                    break;
+                case "currentUserId":
+                    candidateUserIds.add( UserUtils.getCurrentUserDTO ().getId ());
+                    break;
+                case "sql":
+                    Map userMap = SpringUtil.getBean (JdbcTemplate.class).queryForMap (flowAssignee.getAssignValue ());
+                    candidateUserIds.add(userMap.get ("id").toString ());
+                    break;
+                case "custom":
+                    //根据你的自定义标记,请自行实现
+
+                    //如果字符串中包含 "currentUserSql:" 则进行如下代码替换和处理
+                    if(flowAssignee.getAssignValue ().contains("currentUserSql:")){
+                        //对应sql为:select su.* from sys_user_role a left join sys_role sr on sr.id = a.role_id left join sys_user su on su.id = a.user_id left join sys_office so on so.id = su.office_id where sr.en_name= 'bmzr' and so.id = (select office_id from sys_user where id = @currentUser.id)
+                        //用于查询当前登录人的部门主任人员信息
+                        UserDTO currentUserDTO = UserUtils.getCurrentUserDTO();
+                        String sql = flowAssignee.getAssignValue ();
+                        if(sql.contains("@currentUser.id")){
+                            //将标志进行去除
+                            sql = sql.replaceAll("currentUserSql:","");
+                            //将判断条件进行替换
+                            sql = sql.replaceAll("@currentUser.id","'" + currentUserDTO.getId() + "'");
+                        }
+                        List<Map<String, Object>> maps = SpringUtil.getBean(JdbcTemplate.class).queryForList(sql);
+                        for (Map<String, Object> map : maps) {
+                            candidateUserIds.add(map.get ("id").toString ());
+                        }
+                    }
+                    //如果字符串中包含 "cwCurrentUserSql:" 则进行如下代码替换和处理
+                    if(flowAssignee.getAssignValue ().contains("cwCurrentUserSql:")){
+                        //对应sql为:select su.* from sys_user_role a left join sys_role sr on sr.id = a.role_id left join sys_user su on su.id = a.user_id left join sys_office so on so.id = su.office_id where sr.en_name= 'bmzr' and so.id = (select office_id from sys_user where id = @currentUser.id)
+                        //用于查询当前登录人的部门主任人员信息
+                        UserDTO currentUserDTO = UserUtils.getCurrentUserDTO();
+                        String sql = flowAssignee.getAssignValue ();
+                        if(sql.contains("@currentUser.id")){
+                            //将标志进行去除
+                            sql = sql.replaceAll("cwCurrentUserSql:","");
+                            //将判断条件进行替换
+                            sql = sql.replaceAll("@currentUser.id","'" + currentUserDTO.getId() + "'");
+                        }
+                        if(sql.contains("@currentUser.officeDTO.name")){
+                            //将标志进行去除
+                            sql = sql.replaceAll("cwCurrentUserSql:","");
+                            //将判断条件进行替换
+                            sql = sql.replaceAll("@currentUser.officeDTO.name","'" + currentUserDTO.getOfficeDTO().getName() + "'");
+                        }
+                        List<Map<String, Object>> maps = SpringUtil.getBean(JdbcTemplate.class).queryForList(sql);
+                        for (Map<String, Object> map : maps) {
+                            candidateUserIds.add(map.get ("id").toString ());
+                        }
+                    }
+                    if(flowAssignee.getAssignValue ().contains("zsbxCurrentUserSql:")){
+                        //对应sql为:select su.* from sys_user_role a left join sys_role sr on sr.id = a.role_id left join sys_user su on su.id = a.user_id left join sys_office so on so.id = su.office_id where sr.en_name= 'bmzr' and so.id = (select office_id from sys_user where id = @currentUser.id)
+                        //用于查询当前登录人的部门主任人员信息
+                        UserDTO currentUserDTO = UserUtils.getCurrentUserDTO();
+                        String sql = flowAssignee.getAssignValue ();
+                        if(sql.contains("@currentUser.id")){
+                            //将标志进行去除
+                            sql = sql.replaceAll("zsbxCurrentUserSql:","");
+                            //将判断条件进行替换
+                            sql = sql.replaceAll("@currentUser.id","'" + currentUserDTO.getId() + "'");
+                        }
+                        if(sql.contains("@currentUser.officeDTO.name")){
+                            //将标志进行去除
+                            sql = sql.replaceAll("zsbxCurrentUserSql:","");
+                            //将判断条件进行替换
+                            sql = sql.replaceAll("@currentUser.officeDTO.name","'" + currentUserDTO.getOfficeDTO().getName() + "'");
+                        }
+                        List<Map<String, Object>> maps = SpringUtil.getBean(JdbcTemplate.class).queryForList(sql);
+                        for (Map<String, Object> map : maps) {
+                            candidateUserIds.add(map.get ("id").toString ());
+                        }
+                    }
+                    //如果字符串中包含 "gsldbxCurrentUserSql:" 则进行如下代码替换和处理
+                    if(flowAssignee.getAssignValue ().contains("gsldbxCurrentUserSql:")){
+                        String sql = flowAssignee.getAssignValue ();
+                        if(StringUtils.isNotBlank(startUserId)){
+                            //通过查询流程发起人确认发起人所在部门以及部门分管领导信息
+                            if(sql.contains("@currentUser.id")){
+                                //将标志进行去除
+                                sql = sql.replaceAll("gsldbxCurrentUserSql:","");
+                                //将判断条件进行替换
+                                sql = sql.replaceAll("@currentUser.id","'" + startUserId + "'");
+                            }
+                        } else {
+                            //如果找不到发起人信息 则审核人默认为 角色 总经办人员信息
+                            sql = "SELECT su.* FROM sys_user_role a LEFT JOIN sys_role sr ON sr.id = a.role_id LEFT JOIN sys_user su ON su.id = a.user_id LEFT JOIN sys_office so ON so.id = su.office_id WHERE sr.en_name = 'zjb'";
+                        }
+                        //设定部门分管领导为审核人
+                        List<Map<String, Object>> maps = SpringUtil.getBean(JdbcTemplate.class).queryForList(sql);
+                        if(null == maps || maps.size()==0){
+                            sql = "SELECT su.* FROM sys_user_role a LEFT JOIN sys_role sr ON sr.id = a.role_id LEFT JOIN sys_user su ON su.id = a.user_id LEFT JOIN sys_office so ON so.id = su.office_id WHERE sr.en_name = 'zjb'";
+                            maps = SpringUtil.getBean(JdbcTemplate.class).queryForList(sql);
+                        }
+                        for (Map<String, Object> map : maps) {
+                            candidateUserIds.add(map.get ("id").toString ());
+                        }
+                    }
+                    break;
+            }
+        }
+        List<String> candidateIds = new ArrayList<> (candidateUserIds);
+        return candidateIds;
+    }
 }

+ 15 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/vo/AssigneeDto.java

@@ -0,0 +1,15 @@
+package com.jeeplus.flowable.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class AssigneeDto {
+
+    private String type;
+
+    private String assignValue;
+}