Jelajahi Sumber

cpa查看ccpm已办信息及历史

lizhenhao 2 tahun lalu
induk
melakukan
324b976162

+ 29 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/centerservice/service/ccpm/flow/FlowRequest.java

@@ -89,4 +89,33 @@ public class FlowRequest {
         Object response = restTemplateService.getCCPM("/a/workprojectnotify/workProjectNotify/getList", token, paramMap);
         return response;
     }
+
+    /**
+     * 查询已办信息
+     * @param flow
+     * @return
+     */
+    public Object getHisTaskList(Flow flow, String belongProject) {
+        String token = "";
+        Map<String, Object> paramMap = new HashMap<>();
+        // 设置查询条件
+        if (flow.getBeginDate () != null) { // 创建时间
+            SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            paramMap.put("startOverDate", formatter.format(flow.getBeginDate ()));
+        }
+        if (flow.getEndDate () != null) { // 创建时间
+            SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            paramMap.put("endOverDate", formatter.format(flow.getEndDate ()));
+        }
+        if (StrUtil.isNotBlank (flow.getTitle ())) { // 标题
+            paramMap.put("title", flow.getTitle ());
+        }
+        if (com.jeeplus.sys.utils.StringUtils.isNotEmpty(flow.getAssigneeName())) { // 流程发起人
+            paramMap.put("userName", flow.getAssigneeName());
+        }
+        paramMap.put("belongProject", belongProject);
+        Object response = restTemplateService.getCCPM("/a/workprojectnotify/workProjectNotify/backlogListReadAll", token, paramMap);
+        return response;
+    }
+
 }

+ 129 - 1
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/centerservice/utils/ConvertServiceUtil.java

@@ -12,6 +12,7 @@ import com.jeeplus.centerservice.dto.reimbursement.ReimbursementAmountInfo;
 import com.jeeplus.centerservice.dto.reimbursement.ReimbursementDetailInfo;
 import com.jeeplus.centerservice.dto.reimbursement.SaveInfoDto;
 import com.jeeplus.centerservice.dto.reimbursement.WorkAttachmentDto;
+import com.jeeplus.flowable.vo.HisTaskVo;
 import com.jeeplus.flowable.vo.ProcessVo;
 import com.jeeplus.flowable.vo.TaskVo;
 import com.jeeplus.sys.service.dto.UserDTO;
@@ -55,6 +56,33 @@ public class ConvertServiceUtil {
         return processVoList;
     }
     /**
+     * 批量将ccpm系统待办返回的字段转换为当前系统已办
+     * @param res
+     * @return
+     */
+    public static List<HisTaskVo> convertHisTaskVoList(List<HisTaskVo> res) throws Exception {
+        List<HisTaskVo> hisTaskVoList = new ArrayList<>();
+        if (CollectionUtil.isNotEmpty(res)) {
+            List<HisTaskVo> hisTaskVos = res;
+            String ccpm_task = Global.getConfig("CCPM_TASK"); // 获取ccpm可查看的待办数据
+            for (HisTaskVo item : hisTaskVos) {
+                if ("cpa".equals(item.getBelongProject())) {
+                    hisTaskVoList.add(item);
+                } else if ("ccpm".equals(item.getBelongProject())) {
+                    if(StringUtils.isNotBlank(ccpm_task)) {
+                        String[] split = ccpm_task.split(",");
+                        List<String> taskAliasList = Arrays.asList(split);
+                        if (taskAliasList.contains(item.getProcessDefKey())) {
+                            hisTaskVoList.add(item);
+                        }
+                    }
+                }
+            }
+        }
+        return hisTaskVoList;
+    }
+
+    /**
      * ccpm系统待办返回的字段转换为当前系统待办需要的字段
      * @param map
      * @return
@@ -105,7 +133,41 @@ public class ConvertServiceUtil {
     }
 
     /**
-     * 将结果排序后分页
+     * 将结果排序后分页(已办)
+     * 由于是根据数据中的creaTime字段来进行排序,所以此字段不可以为空,否则会报空指针
+     * @param page
+     * @param list
+     * @return
+     */
+    public static Page getSortAndPagingHisTask(Page page,List<HisTaskVo> list) {
+        // 将数据按照creaTime倒序排序
+        CollectionUtil.sort(list, new Comparator<HisTaskVo>() {
+            @Override
+            public int compare(HisTaskVo o1, HisTaskVo o2) {
+                return o2.getCreateTime().compareTo(o1.getCreateTime());
+            }
+        });
+        // 将数据分页
+        page.setTotal(list.size());
+        List<HisTaskVo> records = new ArrayList<>();
+        int startIndex = (int) ((page.getCurrent() - 1) * page.getSize());
+        if (startIndex > list.size()) {
+            startIndex = 0;
+            page.setCurrent(1);
+        }
+        for (int i = 0; i < page.getSize() ; i ++) {
+            if (startIndex == list.size() || ObjectUtil.isEmpty(list.get(startIndex))) {
+                break;
+            }
+            records.add(list.get(startIndex));
+            startIndex++;
+        }
+        page.setRecords(records);
+        return page;
+    }
+
+    /**
+     * 将结果排序后分页(待办)
      * 由于是根据数据中的creaTime字段来进行排序,所以此字段不可以为空,否则会报空指针
      * @param page
      * @param list
@@ -402,4 +464,70 @@ public class ConvertServiceUtil {
         }
         return res;
     }
+
+    /**
+     * 当前系统待办数据转换为ccpm已办 批量转换
+     * @param hisTaskVoList
+     * @return
+     */
+    public static List<Map<String,Object>> copyHisTaskListToCcpm(List<HisTaskVo> hisTaskVoList) throws Exception {
+        List<Map<String,Object>> res = new ArrayList<>();
+        for (HisTaskVo hisTaskVo : hisTaskVoList) {
+            Map<String, Object> respMap = copyHisTaskToCcpm(hisTaskVo);
+            if (MapUtil.isNotEmpty(respMap)) {
+                res.add(respMap);
+            }
+        }
+        return res;
+    }
+
+    /**
+     * 当前系统待办数据转换为ccpm已办
+     * @param hisTaskVo
+     * @return
+     * @throws Exception
+     */
+    public static Map<String,Object> copyHisTaskToCcpm(HisTaskVo hisTaskVo) throws Exception {
+        Map<String,Object> res = new HashMap<>();
+        Map<String, Object> vars = hisTaskVo.getVars();
+        res.put("belongProject",hisTaskVo.getBelongProject());
+        // 流程名称
+        if (StringUtils.isNotBlank(hisTaskVo.getProcessDefinitionName())){
+            res.put("typeLabel", hisTaskVo.getProcessDefinitionName());
+        }
+        // 标题
+        if (Objects.nonNull(vars.get("title"))){
+            res.put("title", "cpa " + vars.get("title").toString()); // 标题
+            res.put("content", vars.get("title").toString()); // 内容
+        }
+        // 流程发起人
+        if (Objects.nonNull(vars.get("userName"))){
+            res.put("createUserName",vars.get("userName").toString());
+        }
+        // 数据id
+        if (Objects.nonNull(hisTaskVo.getBusinessId())){
+            res.put("notifyId",hisTaskVo.getBusinessId());
+        }
+        // 审批状态
+        if (Objects.nonNull(hisTaskVo.getStatus())){
+            res.put("remarks",hisTaskVo.getStatus());
+        }
+        // 流程类型
+        if (StringUtils.isNotBlank(hisTaskVo.getProcessDefKey())){
+            res.put("type", hisTaskVo.getProcessDefKey());
+        }
+        // 当前环节
+        if (Objects.nonNull(hisTaskVo.getName())){
+            res.put("notifyRole", hisTaskVo.getName());
+        }
+        // 创建时间
+        if (Objects.nonNull(hisTaskVo.getCreateTime())){
+            res.put("createDate", hisTaskVo.getCreateTime());
+        }
+        // 流程id
+        if (Objects.nonNull(hisTaskVo.getExecutionId())){
+            res.put("id",hisTaskVo.getExecutionId());
+        }
+        return res;
+    }
 }

+ 124 - 7
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableTaskController.java

@@ -43,6 +43,7 @@ import org.flowable.engine.HistoryService;
 import org.flowable.engine.RepositoryService;
 import org.flowable.engine.RuntimeService;
 import org.flowable.engine.TaskService;
+import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.task.api.Task;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -146,7 +147,7 @@ public class FlowableTaskController {
         Future<?> cpa = executorService.submit(new Runnable() {
             @Override
             public void run() {
-                System.out.println("cpa任务开始"+sdf.format(new Date()));
+                System.out.println("查询cpa待办开始"+sdf.format(new Date()));
                 try {
                     // cpa系统待办数据查询
                     if (inquireStatus.contains("cpa") || ("cpa").equals(belongProject)) {
@@ -170,14 +171,14 @@ public class FlowableTaskController {
                 }
                 // 当前线程执行完毕,计数器 -1
                 countDownLatch.countDown();
-                System.out.println("cpa任务结束"+sdf.format(new Date()));
+                System.out.println("查询cpa待办结束"+sdf.format(new Date()));
             }
         });
         // ccpm线程任务
         Future<?> ccpm = executorService.submit(new Runnable() {
             @Override
             public void run() {
-                System.out.println("ccpm任务开始"+sdf.format(new Date()));
+                System.out.println("查询ccpm待办开始"+sdf.format(new Date()));
                 try{
                     // ccpm系统待办数据查询
                     if (inquireStatus.contains("ccpm") || ("ccpm").equals(belongProject)) {
@@ -201,7 +202,7 @@ public class FlowableTaskController {
                 }
                 // 当前线程执行完毕,计数器 -1
                 countDownLatch.countDown();
-                System.out.println("ccpm任务结束"+sdf.format(new Date()));
+                System.out.println("查询ccpm待办结束"+sdf.format(new Date()));
             }
         });
         // 阻塞 等待线程池任务执行完后再执行后面代码
@@ -239,9 +240,125 @@ public class FlowableTaskController {
      * @return
      */
     @GetMapping("historic")
-    public ResponseEntity historicListData(Page<HisTaskVo> page, Flow flow) {
-        page = flowTaskService.historicList(page, flow);
-        return ResponseEntity.ok ( page );
+    public ResponseEntity historicListData(Page<HisTaskVo> page, Flow flow) throws Exception {
+        //获取当前登陆人的信息
+        UserDTO currentUserDTO = UserUtils.getCurrentUserDTO();
+        //判定如果当前登陆人是否可以查看其他服务的待办信息
+        if("1".equals(currentUserDTO.getOtherServiceFlag())){
+            // 中台数据查询
+            List<Map<String, Object>> cpa = queryHistoricListCenter(flow, "cpa", Global.getConfig("INQUIRE_STATUS"));
+            if (cpa.size() > 0) {
+                List<HisTaskVo> list = JSON.parseArray(JSON.toJSONString(cpa), HisTaskVo.class);
+                List<HisTaskVo> hisTaskVos = ConvertServiceUtil.convertHisTaskVoList(list);
+                // 将整合后的结果排序后分页
+                Page sortAndPaging = ConvertServiceUtil.getSortAndPagingHisTask(page, hisTaskVos);
+                return ResponseEntity.ok (sortAndPaging);
+            } else {
+                // 如果中台没有返回任何数据,就去查询本系统分页待办数据
+                Page <HisTaskVo> pageList = flowTaskService.historicList(page, flow, currentUserDTO);
+                return ResponseEntity.ok (pageList);
+            }
+        }else{
+            // 查询本系统分页待办数据
+            Page <HisTaskVo> pageList = flowTaskService.historicList(page, flow, currentUserDTO);
+            return ResponseEntity.ok (pageList);
+        }
+    }
+
+    @GetMapping("queryHistoricListCenter")
+    public List<Map<String,Object>> queryHistoricListCenter(Flow flow,String belongProject,String inquireStatus) throws Exception {
+        List<Map<String, Object>> result = new ArrayList<>();
+        List<HisTaskVo> hisTaskVoList = new ArrayList<>();
+        // 任务数量(线程池的线程数量、计数器的值)
+        int taskVolume = 2;
+        // 创建线程池
+        ExecutorService executorService = Executors.newFixedThreadPool(taskVolume);
+        // 创建单次计数器(事实上就是创建多个锁,每次.countDown()会释放一把锁,使用.await()就是等待全部锁被释放,所以这个计数器是线程安全的)
+        CountDownLatch countDownLatch = new CountDownLatch(taskVolume);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        // 获取当前登录人信息
+        UserDTO currentUserDTO = UserUtils.getCurrentUserDTO();
+        // cpa线程任务
+        Future<?> cpa = executorService.submit(new Runnable() {
+            @Override
+            public void run() {
+                System.out.println("查询cpa已办开始"+sdf.format(new Date()));
+                try {
+                    // cpa系统待办数据查询
+                    if (inquireStatus.contains("cpa") || ("cpa").equals(belongProject)) {
+                        Page<HisTaskVo> pageList = flowTaskService.historicList(new Page<>(1, -1), flow, currentUserDTO);
+                        pageList.getRecords().stream().forEach(item -> {
+                            item.setBelongProject("cpa");
+                            // 设置 processDefKey
+                            if (StringUtils.isNotBlank(item.getProcessDefinitionId())) {
+                                String[] split = item.getProcessDefinitionId().split(":");
+                                if(split.length>0) {
+                                    item.setProcessDefKey(split[0]);
+                                }
+                            }
+                            // 设置 businessId
+                            HistoricProcessInstance finishedProcIns = flowTaskService.getFinishedProcIns(item.getProcessInstanceId());
+                            if (finishedProcIns != null && finishedProcIns.getBusinessKey() != null && finishedProcIns.getBusinessKey().contains(":")) {
+                                String[] ss = finishedProcIns.getBusinessKey().split(":");
+                                item.setBusinessId(ss[1]);
+                            } else if (finishedProcIns != null && finishedProcIns.getBusinessKey() != null) {
+                                item.setBusinessId(finishedProcIns.getBusinessKey());
+                            }
+                        });
+                        hisTaskVoList.addAll(pageList.getRecords());
+                    }
+                } catch (Exception e) {
+                    System.out.println("cpa系统待办查询失败");
+                    e.printStackTrace();
+                }
+                // 当前线程执行完毕,计数器 -1
+                countDownLatch.countDown();
+                System.out.println("查询cpa已办结束"+sdf.format(new Date()));
+            }
+        });
+        // ccpm线程任务
+        Future<?> ccpm = executorService.submit(new Runnable() {
+            @Override
+            public void run() {
+                System.out.println("查询ccpm已办开始"+sdf.format(new Date()));
+                try{
+                    // ccpm系统待办数据查询
+                    if (inquireStatus.contains("ccpm") || ("ccpm").equals(belongProject)) {
+                        // 访问ccpm
+                        Object response = flowRequest.getHisTaskList(flow, belongProject);
+                        if (Objects.nonNull(response)) {
+                            List<Map<String, Object>> res = JSONObject.parseArray(JSON.toJSONString(response));
+                            if (("ccpm").equals(belongProject)) { // 如果是ccpm系统查询,则直接返回
+                                result.addAll(res);
+                            } else { // 如果是其他系统查询,则将结果格式化后返回
+                                if (CollectionUtil.isNotEmpty(res)) {
+                                    List<HisTaskVo> hisTaskVos = JSON.parseArray(JSON.toJSONString(res), HisTaskVo.class);
+                                    hisTaskVoList.addAll(hisTaskVos);
+                                }
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+                    System.out.println("ccpm系统待办查询失败");
+                    e.printStackTrace();
+                }
+                // 当前线程执行完毕,计数器 -1
+                countDownLatch.countDown();
+                System.out.println("查询ccpm已办结束"+sdf.format(new Date()));
+            }
+        });
+        // 阻塞 等待线程池任务执行完后再执行后面代码
+        // 设置最大等待时间 5秒
+        countDownLatch.await(5,TimeUnit.SECONDS);
+        // 关闭线程池
+        executorService.shutdown();
+        // 根据不同系统返回不同字段值
+        if ("cpa".equals(belongProject)) {
+            result.addAll(JSON.parseArray(JSON.toJSONString(hisTaskVoList)));
+        } else if ("ccpm".equals(belongProject)) {
+            result.addAll(ConvertServiceUtil.copyHisTaskListToCcpm(hisTaskVoList));
+        }
+        return result;
     }
 
     /**

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

@@ -177,9 +177,9 @@ public class FlowTaskService {
      * @param page
      * @return
      */
-    public Page<HisTaskVo> historicList(Page<HisTaskVo> page, Flow act) {
+    public Page<HisTaskVo> historicList(Page<HisTaskVo> page, Flow act, UserDTO currentUser) {
         QueryWrapper<HisTaskVo> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("aht.ASSIGNEE_", UserUtils.getCurrentUserDTO ().getId ());
+        queryWrapper.eq("aht.ASSIGNEE_", currentUser.getId ());
         queryWrapper.eq("aht.REV_", "2");
         if (ObjectUtil.isNotEmpty(act)) {
             if (StrUtil.isNotBlank (act.getProcDefKey ())) {

+ 4 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/vo/HisTaskVo.java

@@ -40,6 +40,10 @@ public class HisTaskVo {
 
     private TaskVo currentTask; // 当前流程节点
 
+    private String belongProject; // 所属系统
+    private String processDefKey; // 流程key
+    private String businessId; // 数据详情id
+
     public HisTaskVo(HistoricTaskInstance task){
         this.id = task.getId ();
         this.name = task.getName ();