diff --git a/src/main/java/com/wflow/controller/CustomController.java b/src/main/java/com/wflow/controller/CustomController.java new file mode 100644 index 0000000..d08663a --- /dev/null +++ b/src/main/java/com/wflow/controller/CustomController.java @@ -0,0 +1,146 @@ +package com.wflow.controller; + +import cn.hutool.core.map.MapUtil; +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wflow.bean.entity.WflowModelHistorys; +import com.wflow.bean.entity.WflowModels; +import com.wflow.mapper.WflowModelHistorysMapper; +import com.wflow.mapper.WflowModelsMapper; +import com.wflow.service.CustomListenService; +import com.wflow.utils.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 自定义接口 + */ +@RestController +@RequestMapping("wflow/custom") +@Slf4j +public class CustomController { + + //捕获node分组 + Pattern nodePattern = Pattern.compile("(node_\\d{12})"); + //捕获field分组 + Pattern fieldPattern = Pattern.compile("(field\\d{13})"); + @Autowired + private CustomListenService customListenService; + @Lazy + @Autowired + private WflowModelsMapper wflowModelsMapper; + @Lazy + @Autowired + private WflowModelHistorysMapper wflowModelHistorysMapper; + + /** + * 随机生成数字 + * + * @param num 位数 + * @return + */ + private static String getRandomNum(int num) { + Random random = new Random(); + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < num; i++) { + int digit = random.nextInt(10); + sb.append(digit); + } + + return sb.toString(); + } + + /** + * 保存抄送人单位和时间(在抄送流程后面配置触发器使用),这是工程质量控制点检查、检测通知单 + * + * @param instanceId + * @return + */ + @GetMapping("saveCcmeAndDate") + public Object saveCcmeAndDate(@RequestParam String instanceId, @RequestParam String ccMeField, @RequestParam String dateField) { + customListenService.saveCcmeAndDate(instanceId, ccMeField, dateField); + return R.ok("修改成功"); + } + + /** + * 复制一个流程 + */ + @PostMapping("copyProcess") + public Object copyProcess(@RequestBody HashMap param) { + String fromCode = MapUtil.getStr(param, "fromCode"); + String toCode = MapUtil.getStr(param, "toCode"); + WflowModels fromMode = wflowModelsMapper.selectOne(new LambdaQueryWrapper() + .eq(WflowModels::getFormId, fromCode)); + log.info("fromMode:{}", JSON.toJSONString(fromMode)); + List historys = wflowModelHistorysMapper.selectList(new LambdaQueryWrapper() + .eq(WflowModelHistorys::getFormId, toCode)); + Optional first = historys.stream().sorted((o1, o2) -> o2.getVersion().compareTo(o1.getVersion())).findFirst(); + String formItems = fromMode.getFormItems(); + String formConfig = fromMode.getFormConfig(); + String process = fromMode.getProcess(); + String processConfig = fromMode.getProcessConfig(); + WflowModelHistorys toModel = first.get(); + log.info("oldToModel:{}", JSON.toJSONString(toModel)); + Set fields = getMatcherSet(formItems, fieldPattern); + fields.addAll(getMatcherSet(formConfig, fieldPattern)); + fields.addAll(getMatcherSet(process, fieldPattern)); + fields.addAll(getMatcherSet(processConfig, fieldPattern)); + Set nodes = getMatcherSet(formItems, nodePattern); + nodes.addAll(getMatcherSet(formConfig, nodePattern)); + nodes.addAll(getMatcherSet(process, nodePattern)); + nodes.addAll(getMatcherSet(processConfig, nodePattern)); + StringBuilder fieldSb = new StringBuilder(); + StringBuilder nodeSb = new StringBuilder(); + for (String field : fields) { + String randomNum = getRandomNum(13); + String replacement = "field" + randomNum; + formItems = formItems.replace(field, replacement); + formConfig = formConfig.replace(field, replacement); + process = process.replace(field, replacement); + processConfig = processConfig.replace(field, replacement); + fieldSb.append(field).append("=>").append(replacement).append("#"); + } + for (String node : nodes) { + String randomNum = getRandomNum(12); + String replacement = "node" + "_" + randomNum; + formItems = formItems.replace(node, replacement); + formConfig = formConfig.replace(node, replacement); + process = process.replace(node, replacement); + processConfig = processConfig.replace(node, replacement); + nodeSb.append(node).append("=>").append(replacement).append("#"); + } + toModel.setFormItems(formItems); + toModel.setFormConfig(formConfig); + toModel.setProcess(process); + toModel.setProcessConfig(processConfig); + log.info("newToModel:{}", JSON.toJSONString(toModel)); + log.info("变化FIELD:{}", fieldSb.toString()); + log.info("变化NODE:{}", nodeSb.toString()); + wflowModelHistorysMapper.updateById(toModel); + return R.ok("成功"); + } + + /** + * 获取匹配的字符串列表 + * + * @param str + * @param pattern + * @return + */ + private Set getMatcherSet(String str, Pattern pattern) { + Set fields = new HashSet<>(); + Matcher matcher = pattern.matcher(str); + while (matcher.find()) { + String idValue = matcher.group(1); + fields.add(idValue); + } + return fields; + } +} diff --git a/src/main/java/com/wflow/controller/CustomListenController.java b/src/main/java/com/wflow/controller/CustomListenController.java deleted file mode 100644 index f608900..0000000 --- a/src/main/java/com/wflow/controller/CustomListenController.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.wflow.controller; - -import com.wflow.service.CustomListenService; -import com.wflow.utils.R; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author : willian fu - * @date : 2023/11/26 - */ -@RestController -@RequestMapping("wflow/custom") -public class CustomListenController { - - @Autowired - private CustomListenService customListenService; - - /** - * 保存抄送人单位和时间(在抄送流程后面配置触发器使用),这是工程质量控制点检查、检测通知单 - * - * @param instanceId - * @return - */ - @GetMapping("saveCcmeAndDate") - public Object saveCcmeAndDate(@RequestParam String instanceId, @RequestParam String ccMeField, @RequestParam String dateField) { - customListenService.saveCcmeAndDate(instanceId, ccMeField, dateField); - return R.ok("修改成功"); - } -} diff --git a/src/main/java/com/wflow/workflow/controller/ProcessInstanceController.java b/src/main/java/com/wflow/workflow/controller/ProcessInstanceController.java index 5d54257..c30893b 100644 --- a/src/main/java/com/wflow/workflow/controller/ProcessInstanceController.java +++ b/src/main/java/com/wflow/workflow/controller/ProcessInstanceController.java @@ -64,7 +64,7 @@ public class ProcessInstanceController { * @param pageNo 页码 * @param code 表单流程ID(流程定义KEY) * @param finished 流程是否已经结束 - * @param customStatus 1待催办2已办结3审批进行中4审批被撤销5审批被驳回 + * @param customStatus 1待催办2已办结3审批进行中4审批被撤销5审批被驳回6审批通过 * @return 列表数据 */ @OperLog(operModul = "审批管理",operType = "获取系统待我处理的流程",operDesc = "获取系统待我处理的流程") diff --git a/src/main/java/com/wflow/workflow/service/impl/ProcessInstanceServiceImpl.java b/src/main/java/com/wflow/workflow/service/impl/ProcessInstanceServiceImpl.java index 7e48ea9..181bb92 100644 --- a/src/main/java/com/wflow/workflow/service/impl/ProcessInstanceServiceImpl.java +++ b/src/main/java/com/wflow/workflow/service/impl/ProcessInstanceServiceImpl.java @@ -437,10 +437,11 @@ public class ProcessInstanceServiceImpl implements ProcessInstanceService { instanceQuery.or().processInstanceBusinessStatusLike("PRE%").endOr(); } Executor.builder() - //customStatus 1待催办2已办结3审批进行中4审批被撤销5审批被驳回 + //customStatus 1待催办2已办结3审批进行中4审批被撤销5审批被驳回6审批通过 .ifTrueNext(Objects.equals(customStatus, 1), instanceQuery::unfinished) .ifTrueNext(Objects.equals(customStatus, 3), instanceQuery::unfinished) .ifNotBlankNext(Objects.equals(customStatus, 5) ? ProcessStatus.REFUSE.toString() : null, instanceQuery::processInstanceBusinessStatus) + .ifNotBlankNext(Objects.equals(customStatus, 6) ? ProcessStatus.PRE_PASS.toString() : null, instanceQuery::processInstanceBusinessStatus) .ifNotBlankNext(startUser, instanceQuery::startedBy) .ifNotBlankNext(code, instanceQuery::processDefinitionKey) .ifTrueNext(null != startTimes && startTimes.length > 1, () -> {