From 1adf355c3df4b43d909a1c2950a0026e8267b818 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Sat, 21 Dec 2024 17:15:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E4=BA=BA=E9=BB=98=E8=AE=A4=E6=97=B6=E9=97=B4=E5=92=8C=E5=90=8C?= =?UTF-8?q?=E6=84=8F=E6=88=96=E6=8B=92=E7=BB=9D=E7=9A=84=E5=A4=87=E6=B3=A8?= =?UTF-8?q?=E5=8A=A0=E5=88=B0=E8=A1=A8=E5=8D=95=E9=87=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wflow/service/CustomListenService.java | 32 ++++- .../service/impl/CustomListenServiceImpl.java | 133 +++++++++++++++--- 2 files changed, 146 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/wflow/service/CustomListenService.java b/src/main/java/com/wflow/service/CustomListenService.java index 10b0b16..c2caab6 100644 --- a/src/main/java/com/wflow/service/CustomListenService.java +++ b/src/main/java/com/wflow/service/CustomListenService.java @@ -4,8 +4,38 @@ package com.wflow.service; * 流程里面的监听器Service */ public interface CustomListenService { - + /** + * 更新表单 + * + * @param instanceId + * @param fieldId + * @param val + */ void updateFormData(String instanceId, String fieldId, String val); + /** + * 更新表单时间 + * + * @param instanceId + * @param fieldId + */ + void updateFormDataNow(String instanceId, String fieldId); + + /** + * 更新表单时间(指定时间) + * + * @param instanceId + * @param fieldId + * @param type + */ + @Deprecated void updateFormDataNow(String instanceId, String fieldId, Integer type); + + /** + * 同意或拒绝的备注加到表单里面 + * + * @param instanceId + * @param fieldId + */ + void addFormDataFromApprove(String instanceId, String fieldId); } diff --git a/src/main/java/com/wflow/service/impl/CustomListenServiceImpl.java b/src/main/java/com/wflow/service/impl/CustomListenServiceImpl.java index 6238360..2c0df25 100644 --- a/src/main/java/com/wflow/service/impl/CustomListenServiceImpl.java +++ b/src/main/java/com/wflow/service/impl/CustomListenServiceImpl.java @@ -1,19 +1,27 @@ package com.wflow.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.wflow.bean.entity.WflowFormData; +import com.wflow.bean.entity.WflowModelHistorys; import com.wflow.mapper.WflowFormDataMapper; +import com.wflow.mapper.WflowModelHistorysMapper; import com.wflow.service.CustomListenService; -import lombok.val; +import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.task.Comment; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +import java.util.*; @Service("customListenService") public class CustomListenServiceImpl implements CustomListenService { @@ -23,6 +31,13 @@ public class CustomListenServiceImpl implements CustomListenService { @Lazy @Autowired private WflowFormDataMapper formDataMapper; + @Autowired + private HistoryService historyService; + @Lazy + @Autowired + private WflowModelHistorysMapper modelHistorysMapper; + @Autowired + private TaskService taskService; @Override public void updateFormData(String instanceId, String fieldId, String val) { @@ -38,27 +53,109 @@ public class CustomListenServiceImpl implements CustomListenService { runtimeService.setVariables(instanceId, dataMap); } + @Override + public void updateFormDataNow(String instanceId, String fieldId) { + List split = StrUtil.split(fieldId, ","); + String format = "yyyy-MM-dd HH:mm:ss"; + //先查实例,然后判断是子流程还是主流程 + HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(instanceId).singleResult(); + //是否是子流程 + boolean isSub = StrUtil.isNotBlank(instance.getSuperProcessInstanceId()); + HistoricProcessInstance mainInst = isSub ? null : instance; + if (isSub) { + //查出主流程表单数据 + mainInst = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(instance.getSuperProcessInstanceId()).singleResult(); + } + //搜索当前版本流程的配置 + WflowModelHistorys modelHistory = modelHistorysMapper.selectOne(new LambdaQueryWrapper<>(WflowModelHistorys.builder() + .processDefId(mainInst.getProcessDefinitionId()).version(mainInst.getProcessDefinitionVersion()).build())); + String formItems = modelHistory.getFormItems(); + JSONArray root = JSON.parseArray(formItems); + for (String fid : split) { + boolean find = false; + for (int i = 0; i < root.size(); i++) { + JSONObject jo = root.getJSONObject(i); + String valueType = jo.getString("valueType"); + if (Objects.equals(valueType, "Array")) { + JSONArray items = jo.getJSONObject("props").getJSONArray("items"); + for (int j = 0; j < items.size(); j++) { + JSONObject jo1 = items.getJSONObject(j); + String valueType1 = jo.getString("valueType"); + if (Objects.equals(valueType1, "Date")) { + if (jo1.getString("id").equals(fid)) { + find = true; + format = jo1.getJSONObject("props").getString("format"); + break; + } + } + } + } else { + String valueType1 = jo.getString("valueType"); + if (Objects.equals(valueType1, "Date")) { + if (jo.getString("id").equals(fid)) { + find = true; + format = jo.getJSONObject("props").getString("format"); + break; + } + } + } + if (find) { + break; + } + } + String value = DateUtil.format(new Date(), format); + WflowFormData data = new WflowFormData(); + data.setInstanceId(instanceId); + data.setFieldId(fid); + data.setFieldValue(value); + formDataMapper.update(data, new LambdaQueryWrapper() + .eq(WflowFormData::getInstanceId, instanceId) + .eq(WflowFormData::getFieldId, fid)); + Map dataMap = new HashMap<>(); + dataMap.put(fid, value); + runtimeService.setVariables(instanceId, dataMap); + } + } + @Override public void updateFormDataNow(String instanceId, String fieldId, Integer type) { + List split = StrUtil.split(fieldId, ","); String val; Date date = new Date(); if (type == 1) { - val = DateUtil.format(date,"yyyy-MM-dd"); - } else if (type == 2){ - val = DateUtil.format(date,"yyyy-MM-dd HH:mm"); + val = DateUtil.format(date, "yyyy-MM-dd"); + } else if (type == 2) { + val = DateUtil.format(date, "yyyy-MM-dd HH:mm"); } else { - val = DateUtil.format(date,"yyyy-MM-dd HH:mm:ss"); + val = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss"); + } + //先查实例,然后判断是子流程还是主流程 + for (String fid : split) { + WflowFormData data = new WflowFormData(); + data.setInstanceId(instanceId); + data.setFieldId(fid); + data.setFieldValue(val); + formDataMapper.update(data, new LambdaQueryWrapper() + .eq(WflowFormData::getInstanceId, instanceId) + .eq(WflowFormData::getFieldId, fid)); + Map dataMap = new HashMap<>(); + dataMap.put(fid, val); + runtimeService.setVariables(instanceId, dataMap); + } + } + + @Override + public void addFormDataFromApprove(String instanceId, String fieldId) { + List processInstanceComments = taskService.getProcessInstanceComments(instanceId); + if (CollUtil.isNotEmpty(processInstanceComments)) { + Comment comment = processInstanceComments.get(0); + String text = JSON.parseObject(comment.getFullMessage()).getString("text"); + if (StrUtil.isNotBlank(text)) { + this.updateFormData(instanceId, fieldId, text); + } } - WflowFormData data = new WflowFormData(); - data.setInstanceId(instanceId); - data.setFieldId(fieldId); - data.setFieldValue(val); - formDataMapper.update(data, new LambdaQueryWrapper() - .eq(WflowFormData::getInstanceId, instanceId) - .eq(WflowFormData::getFieldId, fieldId)); - Map dataMap = new HashMap<>(); - dataMap.put(fieldId, val); - runtimeService.setVariables(instanceId, dataMap); } }