From 712aefd8d361b13ea986d11dcb8b351cfca37b5f Mon Sep 17 00:00:00 2001 From: ls <1793460677@qq.com> Date: Wed, 5 Nov 2025 16:13:46 +0800 Subject: [PATCH] =?UTF-8?q?add=20:=20=E6=B5=81=E7=A8=8B=E5=9B=BE=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlwInstanceController.java | 51 +- .../flow/service/FlwInstanceService.java | 8 + .../service/impl/FlwInstanceServiceImpl.java | 108 +++- .../sys/controller/FileController.java | 1 - .../tickets/controller/TicketsController.java | 6 +- .../boge/modules/tickets/dto/TicketsDTO.java | 9 +- .../modules/tickets/entity/TicketsEntity.java | 3 + .../tickets/service/TicketsService.java | 2 + .../service/impl/TicketsServiceImpl.java | 53 +- .../resources/mapper/tickets/TicketsDao.xml | 5 +- base-vue/src/views/modules/tickets/detail.vue | 603 +++++++++++++++--- .../src/views/modules/tickets/tickets.vue | 50 +- 12 files changed, 738 insertions(+), 161 deletions(-) diff --git a/base-fast/src/main/java/com/boge/modules/flow/controller/FlwInstanceController.java b/base-fast/src/main/java/com/boge/modules/flow/controller/FlwInstanceController.java index 1ee72eb..50c2557 100644 --- a/base-fast/src/main/java/com/boge/modules/flow/controller/FlwInstanceController.java +++ b/base-fast/src/main/java/com/boge/modules/flow/controller/FlwInstanceController.java @@ -33,6 +33,18 @@ public class FlwInstanceController { return R.ok(); } + + /** + * 发起流程 + */ + @RequestMapping("/startFlowInstance1") + public R startFlowInstance1(@RequestParam Map params){ + + instanceService.startFlowInstance1(params); + return R.ok(); + } + + /** * 我的待办 */ @@ -69,12 +81,49 @@ public class FlwInstanceController { */ @PostMapping("/completeFlow") public R completeFlow(@RequestBody Map params){ - R r = instanceService.completeTaskById(params); + return r; + } + + + /** + * 任务节点1审批通过工单完结 + */ + @PostMapping("/completeFlow1") + public R completeFlow1(@RequestBody Map params){ + + R r = instanceService.completeTaskById1(params); return r; } + + + /** + * 任务节点1无法解决进入下一个节点 + */ + @PostMapping("/deleteFlow1") + public R deleteFlow1(@RequestBody Map params){ + + R r = instanceService.deleteFlow1(params); + + return r; + } + + + /** + * 终结流程 + */ + @PostMapping("/deleteFlow") + public R deleteFlow(@RequestBody Map params){ + + R r = instanceService.deleteFlow(params); + + return r; + } + + + @RequestMapping("/claimTask/{id}") public R claimTask(@PathVariable("id") String id){ if(StringUtils.isBlank(id)){ diff --git a/base-fast/src/main/java/com/boge/modules/flow/service/FlwInstanceService.java b/base-fast/src/main/java/com/boge/modules/flow/service/FlwInstanceService.java index 06e8f09..df7d875 100644 --- a/base-fast/src/main/java/com/boge/modules/flow/service/FlwInstanceService.java +++ b/base-fast/src/main/java/com/boge/modules/flow/service/FlwInstanceService.java @@ -9,10 +9,14 @@ import java.util.Map; public interface FlwInstanceService { void startFlowInstance(Map params); + void startFlowInstance1(Map params); + R getTodoTaskList(Map params); R completeTaskById(Map id); + R completeTaskById1(Map id); + void unclaimTask(String id); void claimTask(String id); @@ -26,4 +30,8 @@ public interface FlwInstanceService { R getMyCompleteTaskList(Map params); List getCompleteHiTaskInstance(String id); + + R deleteFlow(Map params); + + R deleteFlow1(Map params); } diff --git a/base-fast/src/main/java/com/boge/modules/flow/service/impl/FlwInstanceServiceImpl.java b/base-fast/src/main/java/com/boge/modules/flow/service/impl/FlwInstanceServiceImpl.java index fe46c6e..ecf83c8 100644 --- a/base-fast/src/main/java/com/boge/modules/flow/service/impl/FlwInstanceServiceImpl.java +++ b/base-fast/src/main/java/com/boge/modules/flow/service/impl/FlwInstanceServiceImpl.java @@ -25,6 +25,7 @@ import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.UserTask; +import org.flowable.common.engine.api.FlowableException; import org.flowable.engine.ProcessEngineConfiguration; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; @@ -88,7 +89,7 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI public void startFlowInstance(Map params) { SysUserEntity loginUser = ShiroUtils.getUserEntity(); // 获取需要发起的流程信息 - String ticketsId = (String) params.get("ticketsId"); +// String ticketsId = (String) params.get("ticketsId"); Long userId = Long.valueOf((String) params.get("user1")); Map variable = new HashMap<>(); // 结合传递过来的数据动态的绑定流程变量 @@ -98,27 +99,43 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI // 记录流程的发起人 identityService.setAuthenticatedUserId(ShiroUtils.getUserId().toString()); // 启动流程 - ProcessInstance processInstance = runtimeService.startProcessInstanceById(defId, variable); + try { + ProcessInstance processInstance = runtimeService.startProcessInstanceById(defId, variable); + }catch (FlowableException e){ + e.printStackTrace(); + } SysUserEntity user = sysUserService.getById(userId); //更新工单审批id - TicketsEntity ticketsEntity = new TicketsEntity(); - ticketsEntity.setTicketsId(Long.valueOf(ticketsId)); - ticketsEntity.setStatus(TicketsStatusEnums.CHECKED.getCode()); - ticketsEntity.setProcessInstance(processInstance.getProcessInstanceId()); - ticketsEntity.setDeptPeople(user.getNickname()); - ticketsEntity.setAssignUserId(userId); - ticketsService.updateById(ticketsEntity); +// TicketsEntity ticketsEntity = new TicketsEntity(); +// ticketsEntity.setTicketsId(Long.valueOf(ticketsId)); +// ticketsEntity.setStatus(TicketsStatusEnums.CHECKED.getCode()); +// ticketsEntity.setProcessInstance(processInstance.getProcessInstanceId()); +// ticketsEntity.setDeptPeople(user.getNickname()); +// ticketsEntity.setAssignUserId(userId); +// ticketsService.updateById(ticketsEntity); if (StrUtil.isEmpty(user.getWexinId())){ throw new RRException("企业id为空,企业微信消息无法推送"); } String accessToken = getAccessToken(); - sendWeChatMessage(user.getWexinId(),"工单已推送,请登入售后管理系统处理",accessToken,ticketsId); +// sendWeChatMessage(user.getWexinId(),"工单已推送,请登入售后管理系统处理",accessToken,ticketsId); } + @Override + public void startFlowInstance1(Map params) { + // 启动流程 + try { + Map startVars = new HashMap<>(); + runtimeService.startProcessInstanceById(defId, startVars); } + catch (FlowableException e){ + e.printStackTrace(); + } + + } + /** * 获取access_token */ @@ -331,7 +348,7 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI @Override public R completeTaskById(Map params) { String processInstance = (String) params.get("processInstance"); - Integer ticketsId = (Integer) params.get("ticketsId"); +// Integer ticketsId = (Integer) params.get("ticketsId"); if(StringUtils.isBlank(processInstance)){ return R.error("流程Id不能为空"); } @@ -341,15 +358,74 @@ public class FlwInstanceServiceImpl extends FlowServiceNoFactory implements FlwI taskService.complete(tasks.get(0).getId()); } //更新工单审批id - TicketsEntity ticketsEntity = new TicketsEntity(); - ticketsEntity.setTicketsId(Long.valueOf(ticketsId)); - ticketsEntity.setStatus(TicketsStatusEnums.CANCEL.getCode()); - ticketsEntity.setUpdateTime(new Date()); - ticketsService.updateById(ticketsEntity); +// TicketsEntity ticketsEntity = new TicketsEntity(); +// ticketsEntity.setTicketsId(Long.valueOf(ticketsId)); +// ticketsEntity.setStatus(TicketsStatusEnums.CANCEL.getCode()); +// ticketsEntity.setUpdateTime(new Date()); +// ticketsService.updateById(ticketsEntity); return R.ok("操作成功"); } + + @Override + public R completeTaskById1(Map params) { + String processInstance = (String) params.get("processInstance"); + if(StringUtils.isBlank(processInstance)){ + return R.error("流程Id不能为空"); + } + Task secondTask = taskService.createTaskQuery() + .processInstanceId(processInstance) + .singleResult(); + Map secondApprovalVars = new HashMap<>(); + secondApprovalVars.put("approvalResult", true); + taskService.complete(secondTask.getId(), secondApprovalVars); + return R.ok("操作成功"); + } + + + @Override + public R deleteFlow1(Map params) { + String processInstance = (String) params.get("processInstance"); + if(StringUtils.isBlank(processInstance)){ + return R.error("流程Id不能为空"); + } + Task secondTask = taskService.createTaskQuery() + .processInstanceId(processInstance) + .singleResult(); + Map secondApprovalVars = new HashMap<>(); + secondApprovalVars.put("approvalResult", false); + secondApprovalVars.put("user1", 2); + taskService.complete(secondTask.getId(), secondApprovalVars); + return R.ok("操作成功"); + } + + + @Override + public R deleteFlow(Map params) { + String processInstance = (String) params.get("processInstance"); +// Integer ticketsId = (Integer) params.get("ticketsId"); + if(StringUtils.isBlank(processInstance)){ + return R.error("流程Id不能为空"); + } + //查询活跃任务 + TaskQuery taskQuery = taskService.createTaskQuery().active().processInstanceId(processInstance); + List tasks = taskQuery.list(); + if (tasks.isEmpty()){ + return R.error("没有可终结的任务"); + } + runtimeService.deleteProcessInstance(processInstance, "测试终结流程"); + //更新工单审批id +// TicketsEntity ticketsEntity = new TicketsEntity(); +// ticketsEntity.setTicketsId(Long.valueOf(ticketsId)); +// ticketsEntity.setStatus(TicketsStatusEnums.CANCEL.getCode()); +// ticketsEntity.setUpdateTime(new Date()); +// ticketsService.updateById(ticketsEntity); + + return R.ok("操作成功"); + } + + @Override public void unclaimTask(String id) { taskService.unclaim(id); diff --git a/base-fast/src/main/java/com/boge/modules/sys/controller/FileController.java b/base-fast/src/main/java/com/boge/modules/sys/controller/FileController.java index 6d2afc7..ed2a3a9 100644 --- a/base-fast/src/main/java/com/boge/modules/sys/controller/FileController.java +++ b/base-fast/src/main/java/com/boge/modules/sys/controller/FileController.java @@ -88,7 +88,6 @@ public class FileController { if(StringUtils.isBlank(procId)|| "null".equals(procId) || "undefined".equals(procId)){ return ; } - byte[] bytes = instanceService.diagram(procId); response.setContentType("image/png"); ServletOutputStream outputStream = response.getOutputStream(); diff --git a/base-fast/src/main/java/com/boge/modules/tickets/controller/TicketsController.java b/base-fast/src/main/java/com/boge/modules/tickets/controller/TicketsController.java index 3c702db..16ba182 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/controller/TicketsController.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/controller/TicketsController.java @@ -75,11 +75,7 @@ public class TicketsController { @RequestMapping("/save") //@RequiresPermissions("tickets:tickets:save") public R save(@RequestBody TicketsEntity tickets){ - SysUserEntity loginUser = ShiroUtils.getUserEntity(); - tickets.setCreateTime(new Date()); - tickets.setCreateUser(loginUser.getNickname()); - ticketsService.save(tickets); - + ticketsService.saveTicket(tickets); return R.ok(); } diff --git a/base-fast/src/main/java/com/boge/modules/tickets/dto/TicketsDTO.java b/base-fast/src/main/java/com/boge/modules/tickets/dto/TicketsDTO.java index 57b6b5a..51d97c0 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/dto/TicketsDTO.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/dto/TicketsDTO.java @@ -1,5 +1,6 @@ package com.boge.modules.tickets.dto; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.util.Date; @@ -28,7 +29,7 @@ public class TicketsDTO { /** * 合同编号 */ - private String contractNumber; + private String contractCode; /** * 客户id */ @@ -51,9 +52,9 @@ public class TicketsDTO { */ private String deptPhone; /** - * 创建者ID + * 创建者 */ - private Long createUserId; + private String createUser; /** * 创建时间 */ @@ -65,12 +66,14 @@ public class TicketsDTO { /** * 工单状态 */ + private Integer status; /** * 工单关闭时间 */ private Date updateTime; + /** * 审批流id */ diff --git a/base-fast/src/main/java/com/boge/modules/tickets/entity/TicketsEntity.java b/base-fast/src/main/java/com/boge/modules/tickets/entity/TicketsEntity.java index 1b7e2a9..36f8a6a 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/entity/TicketsEntity.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/entity/TicketsEntity.java @@ -1,5 +1,6 @@ package com.boge.modules.tickets.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -79,6 +80,8 @@ public class TicketsEntity implements Serializable { */ private Date updateTime; + + /** * 审批流id */ diff --git a/base-fast/src/main/java/com/boge/modules/tickets/service/TicketsService.java b/base-fast/src/main/java/com/boge/modules/tickets/service/TicketsService.java index 88f4f56..3845e5d 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/service/TicketsService.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/service/TicketsService.java @@ -21,5 +21,7 @@ public interface TicketsService extends IService { TicketsDTO getTicketsById(String ticketsId); PageUtils queryPageByType(Map params); + + void saveTicket(TicketsEntity tickets); } diff --git a/base-fast/src/main/java/com/boge/modules/tickets/service/impl/TicketsServiceImpl.java b/base-fast/src/main/java/com/boge/modules/tickets/service/impl/TicketsServiceImpl.java index d819487..06594e3 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/service/impl/TicketsServiceImpl.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/service/impl/TicketsServiceImpl.java @@ -12,11 +12,17 @@ import com.boge.modules.sys.entity.SysUserEntity; import com.boge.modules.sys.service.SysUserRoleService; import com.boge.modules.sys.service.impl.SysUserServiceImpl; import com.boge.modules.tickets.dto.TicketsDTO; +import org.flowable.common.engine.api.FlowableException; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.runtime.ProcessInstance; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.boge.modules.tickets.enums.TicketsTypeEnums; import com.boge.modules.tickets.enums.TicketsStatusEnums; +import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -45,18 +51,25 @@ public class TicketsServiceImpl extends ServiceImpl i @Autowired private SysUserRoleService sysUserRoleService; + @Autowired + protected RuntimeService runtimeService; + + @Value("${ProcessInstance.defId}") + private String defId; + @Override public PageUtils queryPage(Map params) { SysUserEntity loginUser = ShiroUtils.getUserEntity(); QueryWrapper ticketsEntityQueryWrapper = new QueryWrapper<>(); - if (ObjectUtil.isNotEmpty(loginUser)){ + if (ObjectUtil.isNotEmpty(loginUser)) { List longs = sysUserRoleService.queryRoleIdList(loginUser.getUserId()); //判断是否是超级管理员 - if (longs.contains(2L)){ - ticketsEntityQueryWrapper.orderBy(true, false,"create_time"); - }else { + if (longs.contains(2L)) { + ticketsEntityQueryWrapper.orderBy(true, false, "create_time"); + } else { ticketsEntityQueryWrapper.eq("assign_user_id", loginUser.getUserId()) - .orderBy(true, false,"create_time");; + .orderBy(true, false, "create_time"); + ; } } @@ -71,18 +84,18 @@ public class TicketsServiceImpl extends ServiceImpl i public PageUtils queryPageByType(Map params) { SysUserEntity loginUser = ShiroUtils.getUserEntity(); QueryWrapper ticketsEntityQueryWrapper = new QueryWrapper<>(); - if (ObjectUtil.isNotEmpty(loginUser)){ + if (ObjectUtil.isNotEmpty(loginUser)) { //判断是否是超级管理员 - ticketsEntityQueryWrapper.orderBy(true, false,"create_time"); - if (TicketsTypeEnums.ASSIGN.getCode().equals(params.get("type"))){ + ticketsEntityQueryWrapper.orderBy(true, false, "create_time"); + if (TicketsTypeEnums.ASSIGN.getCode().equals(params.get("type"))) { ticketsEntityQueryWrapper.eq("create_user", loginUser.getUsername()); } - if (TicketsTypeEnums.TO_BE_DONE.getCode().equals(params.get("type"))){ - ticketsEntityQueryWrapper.eq("assign_user_id", loginUser.getUserId()).eq("status",TicketsStatusEnums.CHECKED.getCode()); + if (TicketsTypeEnums.TO_BE_DONE.getCode().equals(params.get("type"))) { + ticketsEntityQueryWrapper.eq("assign_user_id", loginUser.getUserId()).eq("status", TicketsStatusEnums.CHECKED.getCode()); } - if (TicketsTypeEnums.FINISH.getCode().equals(params.get("type"))){ - ticketsEntityQueryWrapper.eq("assign_user_id", loginUser.getUserId()).eq("status",TicketsStatusEnums.CANCEL.getCode()); + if (TicketsTypeEnums.FINISH.getCode().equals(params.get("type"))) { + ticketsEntityQueryWrapper.eq("assign_user_id", loginUser.getUserId()).eq("status", TicketsStatusEnums.CANCEL.getCode()); } @@ -95,6 +108,22 @@ public class TicketsServiceImpl extends ServiceImpl i return new PageUtils(page); } + @Override + public void saveTicket(TicketsEntity tickets) { + // 启动流程 + try { + Map startVars = new HashMap<>(); + ProcessInstance processInstance = runtimeService.startProcessInstanceById(defId, startVars); + SysUserEntity loginUser = ShiroUtils.getUserEntity(); + tickets.setCreateTime(new Date()); + tickets.setCreateUser(loginUser.getNickname()); + tickets.setProcessInstance(processInstance.getProcessInstanceId()); + ticketsDao.insert(tickets); + } catch (Exception e) { + e.printStackTrace(); + } + } + @Override public TicketsDTO getTicketsById(String ticketsId) { TicketsDTO tickets = ticketsDao.getTicketsDTOById(ticketsId); diff --git a/base-fast/src/main/resources/mapper/tickets/TicketsDao.xml b/base-fast/src/main/resources/mapper/tickets/TicketsDao.xml index 83c1745..03efab7 100644 --- a/base-fast/src/main/resources/mapper/tickets/TicketsDao.xml +++ b/base-fast/src/main/resources/mapper/tickets/TicketsDao.xml @@ -8,12 +8,11 @@ - - + @@ -23,8 +22,6 @@ select * from sys_tickets as a left join sys_client as b on a.client_id = b.client_id left join sys_car as c on a.car_type = c.car_id - left join sys_contract as d on a.contract_id = d.contract_id - where a.tickets_id = #{ticketsId} diff --git a/base-vue/src/views/modules/tickets/detail.vue b/base-vue/src/views/modules/tickets/detail.vue index 019d548..166898b 100644 --- a/base-vue/src/views/modules/tickets/detail.vue +++ b/base-vue/src/views/modules/tickets/detail.vue @@ -1,123 +1,516 @@ diff --git a/base-vue/src/views/modules/tickets/tickets.vue b/base-vue/src/views/modules/tickets/tickets.vue index 79c50e2..ca39ba9 100644 --- a/base-vue/src/views/modules/tickets/tickets.vue +++ b/base-vue/src/views/modules/tickets/tickets.vue @@ -148,7 +148,7 @@ @@ -162,6 +162,16 @@ :total="totalPage" layout="total, sizes, prev, pager, next, jumper"> + + + + 流程进度图 + {}) }, - startFlowHandle(id){ - this.flowForm = {} - this.flowForm.ticketsId = id + startFlowHandle(processInstance) { + // 传递流程实例ID作为参数(假设后端需要的参数名为procid) this.$http({ - url: this.$http.adornUrl('/flow/deploy/flowDef'), + url: this.$http.adornUrl('/file/fileController/downloadFlowActiveImg'), method: 'get', - params: this.$http.adornParams() - }).then(({data}) => { - if (data && data.code === 0) { - this.dynamiForm = [...data.data] - this.users = [...data.users] - this.roles = [...data.roles] - this.dialogFormVisible = true + params: this.$http.adornParams({ + procId: processInstance // 关键:传递流程实例ID + }), + responseType: 'blob' // 关键:声明响应类型为二进制blob + }).then((response) => { + // 成功获取二进制图片数据 + this.flowImgUrl = URL.createObjectURL(response.data); // 转换为可展示的URL + this.dialogVisible = true; // 显示弹框 + }).catch((error) => { + // 错误处理(可能返回JSON格式的错误信息) + console.error('获取流程图失败', error); + // 尝试解析错误信息(若后端返回JSON错误) + if (error.response && error.response.data) { + const errorData = error.response.data; + this.$message.error(errorData.msg || '获取流程图失败,请稍后重试'); + } else { + this.$message.error('获取流程图失败,请稍后重试'); } - }) + }); }, submitStartFlow(){ // 提交表单数据