Commit bc8d536a authored by suhuiguang's avatar suhuiguang

feat(检验检测):计划排期

1.报检受理后增加排期流程
parent 3eda888c
...@@ -70,7 +70,8 @@ public enum BusinessTypeEnum { ...@@ -70,7 +70,8 @@ public enum BusinessTypeEnum {
JG_NEW_PROJECT("123", "新增装置"), JG_NEW_PROJECT("123", "新增装置"),
JG_EQUIP_CLAIM("124", "设备认领"); JG_EQUIP_CLAIM("124", "设备认领"),
INSPECTION_PLAN("125", "计划排期");
private final String code; private final String code;
......
...@@ -88,8 +88,14 @@ public enum WorkFlowStatusEnum { ...@@ -88,8 +88,14 @@ public enum WorkFlowStatusEnum {
OPENING_APPLICATION_SUBMIT("开通申请提交", "openingApplicationSubmit", "开通申请待提交", "资料校对受理已退回", "申请单位已撤回"), OPENING_APPLICATION_SUBMIT("开通申请提交", "openingApplicationSubmit", "开通申请待提交", "资料校对受理已退回", "申请单位已撤回"),
OPENING_APPLICATION_RECEIVE("资料校对", "openingApplicationReceive", "资料校对待受理", "系统对接受理已退回", "资料校对受理已撤回"), OPENING_APPLICATION_RECEIVE("资料校对", "openingApplicationReceive", "资料校对待受理", "系统对接受理已退回", "资料校对受理已撤回"),
OPENING_APPLICATION_PRELIMINARY("系统对接", "openingApplicationPreliminary", "系统对接中", "业务开通确认已退回", "系统对接受理已撤回"), OPENING_APPLICATION_PRELIMINARY("系统对接", "openingApplicationPreliminary", "系统对接中", "业务开通确认已退回", "系统对接受理已撤回"),
OPENING_APPLICATION_REEXAMINE("业务开通确认", "openingApplicationReexamine", "业务开通确认待受理", "", ""); OPENING_APPLICATION_REEXAMINE("业务开通确认", "openingApplicationReexamine", "业务开通确认待受理", "", ""),
/**
* 维保备案
*/
INSPECTION_PLAN_SUBMIT("受理单位提交", "mainSubmit", "", "", ""),
INSPECTION_PLAN_ASSIGN_USER("分配业务负责人", "assignUser", "分配业务负责人", "排期人员已驳回", "分配业务负责人已撤回"),
INSPECTION_PLAN_INSPECT_CONFIRM("检验确认", "inspectConfirm", "检验确认", "", "");
private final String name; private final String name;
......
package com.yeejoin.amos.boot.module.jyjc.api.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.yeejoin.amos.boot.biz.common.dto.BaseDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 业务工作流关系表
*
* @author system_generator
* @date 2026-04-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "JyjcCmTaskDto", description = "业务工作流关系表")
public class JyjcCmTaskDto extends BaseDto {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "工作流实例ID")
private String instanceId;
@ApiModelProperty(value = "备注(无用预留)")
private String remark;
@ApiModelProperty(value = "检验结果方式")
private String resultType;
@ApiModelProperty(value = "发起人id用于撤回操作")
private String promoter;
@ApiModelProperty(value = "创建人")
private String createUserId;
@ApiModelProperty(value = "工作流下一节点任务id")
private String nextTaskId;
@ApiModelProperty(value = "下一节点执行人userIds")
private String nextExecuteUserIds;
@ApiModelProperty(value = "业务表示")
private String sSeq;
@ApiModelProperty(value = "业务类型")
private String sType;
@ApiModelProperty(value = "状态")
private String status;
@ApiModelProperty(value = "流程key")
private String processKey;
@ApiModelProperty(value = "任务code")
private String nextTaskCode;
@ApiModelProperty(value = "业务数据")
private String formData;
}
package com.yeejoin.amos.boot.module.jyjc.api.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
/**
* 业务工作流关系表
*
* @author system_generator
* @date 2026-04-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("tz_jyjc_cm_task")
public class JyjcCmTask extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 工作流实例ID
*/
@TableField("instance_id")
private String instanceId;
/**
* 备注(无用预留)
*/
@TableField("remark")
private String remark;
/**
* 检验结果方式
*/
@TableField("result_type")
private String resultType;
/**
* 发起人id用于撤回操作
*/
@TableField("promoter")
private String promoter;
/**
* 创建人
*/
@TableField("create_user_id")
private String createUserId;
/**
* 工作流下一节点任务id
*/
@TableField("next_task_id")
private String nextTaskId;
/**
* 下一节点执行人userIds
*/
@TableField("next_execute_user_ids")
private String nextExecuteUserIds;
/**
* 业务表示
*/
@TableField("s_seq")
private String sSeq;
/**
* 业务类型
*/
@TableField("s_type")
private String sType;
/**
* 状态
*/
@TableField("status")
private String status;
/**
* 流程key
*/
@TableField("process_key")
private String processKey;
/**
* 任务code
*/
@TableField("next_task_code")
private String nextTaskCode;
/**
* 业务数据
*/
@TableField("form_data")
private String formData;
}
package com.yeejoin.amos.boot.module.jyjc.api.mapper;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcCmTask;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 业务工作流关系表 Mapper 接口
*
* @author system_generator
* @date 2026-04-03
*/
public interface JyjcCmTaskMapper extends BaseMapper<JyjcCmTask> {
}
...@@ -2,6 +2,7 @@ package com.yeejoin.amos.boot.module.jyjc.api.model; ...@@ -2,6 +2,7 @@ package com.yeejoin.amos.boot.module.jyjc.api.model;
import com.alibaba.excel.annotation.format.DateTimeFormat; import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
...@@ -14,10 +15,22 @@ import java.util.Map; ...@@ -14,10 +15,22 @@ import java.util.Map;
*/ */
@Data @Data
public class InspectionPlanModel implements Serializable { public class InspectionPlanModel implements Serializable {
/**
* 业务负责人
*/
private String inspectionChargePerson;
/**
* 备注
*/
private String remark2;
/** /**
* 计划检验检测日期 * 计划检验检测日期
*/ */
LocalDate planInspectionDate; List<String> planInspectionDate;
/** /**
* 检验检测地点 * 检验检测地点
...@@ -38,4 +51,19 @@ public class InspectionPlanModel implements Serializable { ...@@ -38,4 +51,19 @@ public class InspectionPlanModel implements Serializable {
* 人员类型 * 人员类型
*/ */
private String personType; private String personType;
/**
* 工作流id
*/
private String processInstanceId;
/**
* 任务id
*/
private String taskId;
/**
* 最近执行人
*/
private String promoter;
} }
package com.yeejoin.amos.boot.module.jyjc.api.service;
/**
* 业务工作流关系表接口类
*
* @author system_generator
* @date 2026-04-03
*/
public interface IJyjcCmWorkflowService {}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeejoin.amos.boot.module.jyjc.api.mapper.JyjcCmTaskMapper">
</mapper>
package com.yeejoin.amos.boot.module.jyjc.biz.controller; package com.yeejoin.amos.boot.module.jyjc.biz.controller;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.yeejoin.amos.boot.biz.common.controller.BaseController;
import com.yeejoin.amos.boot.module.jyjc.api.model.InspectionPlanModel; import com.yeejoin.amos.boot.module.jyjc.api.model.InspectionPlanModel;
import com.yeejoin.amos.boot.module.jyjc.biz.service.impl.InspectionPlanServiceImpl; import com.yeejoin.amos.boot.module.jyjc.biz.service.impl.InspectionPlanServiceImpl;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.component.event.RestEventTrigger;
import org.typroject.tyboot.core.foundation.enumeration.UserType; import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.restful.doc.TycloudOperation; import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.utils.ResponseHelper; import org.typroject.tyboot.core.restful.utils.ResponseHelper;
...@@ -22,13 +23,45 @@ import org.typroject.tyboot.core.restful.utils.ResponseModel; ...@@ -22,13 +23,45 @@ import org.typroject.tyboot.core.restful.utils.ResponseModel;
@RequestMapping(value = "/inspection/plan") @RequestMapping(value = "/inspection/plan")
@Api(tags = "计划排期") @Api(tags = "计划排期")
@RequiredArgsConstructor @RequiredArgsConstructor
public class InspectionPlanController { public class InspectionPlanController extends BaseController {
private final InspectionPlanServiceImpl inspectionPlanService; private final InspectionPlanServiceImpl inspectionPlanService;
@TycloudOperation(ApiLevel = UserType.AGENCY) @TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/{applicationSeq}/workBenchDetail")
@ApiOperation(httpMethod = "GET", value = "计划排期详情及单据信息-工作台", notes = "计划排期详情及单据信息-工作台")
public ResponseModel<JSONObject> getWorkBenchDetail(@PathVariable String applicationSeq) {
return ResponseHelper.buildResponse(inspectionPlanService.getWorkBenchDetail(applicationSeq));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/flowExecute")
@ApiOperation(httpMethod = "POST", value = "计划排期执行流程", notes = "计划排期执行流程")
@RestEventTrigger(value = "operateLogRestEventHandler")
public ResponseModel<Object> flowExecute(@RequestBody JSONObject map) {
inspectionPlanService.flowExecute(Long.valueOf(String.valueOf(map.get("applicationSeq"))),
String.valueOf(map.get("instanceId")),
String.valueOf(map.get("operate")),
String.valueOf(map.get("comment")),
String.valueOf(map.get("nextTaskId")), map, getSelectedOrgInfo());
return ResponseHelper.buildResponse("ok");
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/withdraw")
@ApiOperation(httpMethod = "POST", value = "计划排期撤回", notes = "撤回")
@RestEventTrigger(value = "operateLogRestEventHandler")
public ResponseModel<Boolean> withdraw(@RequestParam("sequenceNbr") String sequenceNbr,
@RequestParam("instanceId") String instanceId,
@RequestParam("nextTaskId") String nextTaskId) {
return ResponseHelper.buildResponse(inspectionPlanService.withdraw(instanceId, nextTaskId, sequenceNbr));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/{applicationSeq}/save") @PostMapping(value = "/{applicationSeq}/save")
@ApiOperation(httpMethod = "GET", value = "计划排期保存", notes = "计划排期保存") @ApiOperation(httpMethod = "GET", value = "计划排期编辑-列表二次维护使用", notes = "计划排期编辑")
public ResponseModel<InspectionPlanModel> savePlanData(@PathVariable String applicationSeq, public ResponseModel<InspectionPlanModel> savePlanData(@PathVariable String applicationSeq,
@RequestBody InspectionPlanModel model) { @RequestBody InspectionPlanModel model) {
return ResponseHelper.buildResponse(inspectionPlanService.savePlanData(applicationSeq, model)); return ResponseHelper.buildResponse(inspectionPlanService.savePlanData(applicationSeq, model));
...@@ -36,8 +69,8 @@ public class InspectionPlanController { ...@@ -36,8 +69,8 @@ public class InspectionPlanController {
@TycloudOperation(ApiLevel = UserType.AGENCY) @TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/{applicationSeq}/detail") @GetMapping(value = "/{applicationSeq}/detail")
@ApiOperation(httpMethod = "GET", value = "计划排期详情", notes = "计划排期详情") @ApiOperation(httpMethod = "GET", value = "计划排期详情-列表二次维护使用", notes = "计划排期详情")
public ResponseModel<JSONObject> savePlanData(@PathVariable String applicationSeq) { public ResponseModel<JSONObject> planDataDetail(@PathVariable String applicationSeq) {
return ResponseHelper.buildResponse(inspectionPlanService.getDetail(applicationSeq)); return ResponseHelper.buildResponse(inspectionPlanService.getDetail(applicationSeq));
} }
......
...@@ -195,7 +195,7 @@ public class JyjcInspectionApplicationController extends BaseController { ...@@ -195,7 +195,7 @@ public class JyjcInspectionApplicationController extends BaseController {
@RestEventTrigger(value = "operateLogRestEventHandler") @RestEventTrigger(value = "operateLogRestEventHandler")
public ResponseModel<?> executeFlow(@PathVariable(value = "type") String type, @RequestBody Map<String, Object> params) { public ResponseModel<?> executeFlow(@PathVariable(value = "type") String type, @RequestBody Map<String, Object> params) {
params.put("type", type); params.put("type", type);
jyjcInspectionApplicationServiceImpl.doReceive(params); jyjcInspectionApplicationServiceImpl.doReceive(params, getSelectedOrgInfo());
HashMap<String, String> result = new HashMap<>(); HashMap<String, String> result = new HashMap<>();
result.put("result", "success"); result.put("result", "success");
return ResponseHelper.buildResponse(result); return ResponseHelper.buildResponse(result);
......
...@@ -23,4 +23,6 @@ public interface ICmWorkflowService { ...@@ -23,4 +23,6 @@ public interface ICmWorkflowService {
ProcessTaskDTO rejectSpecifiedNode(String taskId, TaskResultDTO data); ProcessTaskDTO rejectSpecifiedNode(String taskId, TaskResultDTO data);
ProcessTaskDTO completeOrReject(String taskId, TaskResultDTO data, String operate);
} }
...@@ -300,7 +300,7 @@ public class TaskModelServiceImpl { ...@@ -300,7 +300,7 @@ public class TaskModelServiceImpl {
obj.remove("detectionRegion"); obj.remove("detectionRegion");
obj.remove("expiryDate"); obj.remove("expiryDate");
obj.remove("applyTime"); obj.remove("applyTime");
obj.remove("expiryDate"); obj.remove("formData");
} }
private static String toQueryParams2(JSONObject jsonObject) { private static String toQueryParams2(JSONObject jsonObject) {
......
...@@ -2,6 +2,7 @@ package com.yeejoin.amos.boot.module.jyjc.biz.service.impl; ...@@ -2,6 +2,7 @@ package com.yeejoin.amos.boot.module.jyjc.biz.service.impl;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yeejoin.amos.boot.module.jyjc.biz.config.LocalBadRequest; import com.yeejoin.amos.boot.module.jyjc.biz.config.LocalBadRequest;
import com.yeejoin.amos.boot.module.jyjc.biz.feign.WorkflowFeignClient; import com.yeejoin.amos.boot.module.jyjc.biz.feign.WorkflowFeignClient;
import com.yeejoin.amos.boot.module.jyjc.biz.service.ICmWorkflowService; import com.yeejoin.amos.boot.module.jyjc.biz.service.ICmWorkflowService;
...@@ -14,8 +15,11 @@ import com.yeejoin.amos.feign.workflow.model.TaskResultDTO; ...@@ -14,8 +15,11 @@ import com.yeejoin.amos.feign.workflow.model.TaskResultDTO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @author Administrator * @author Administrator
...@@ -24,6 +28,16 @@ import java.util.List; ...@@ -24,6 +28,16 @@ import java.util.List;
@Slf4j @Slf4j
public class CmWorkflowServiceImpl implements ICmWorkflowService { public class CmWorkflowServiceImpl implements ICmWorkflowService {
/**
* 通过
*/
public static String PASS_OPERATE = "0";
/**
* 驳回
*/
public static String REJECT_OPERATE = "1";
@Autowired @Autowired
private WorkflowFeignClient workflowFeignClient; private WorkflowFeignClient workflowFeignClient;
...@@ -47,6 +61,86 @@ public class CmWorkflowServiceImpl implements ICmWorkflowService { ...@@ -47,6 +61,86 @@ public class CmWorkflowServiceImpl implements ICmWorkflowService {
} }
@Override @Override
public ProcessTaskDTO completeOrReject(String taskId, TaskResultDTO data, String operate) {
ProcessTaskDTO processTaskDTO;
try {
if(PASS_OPERATE.equals(operate)){
// 通过操作
log.info("开始请求工作流-完成任务-接口:/complete/standard/{taskId},请求参数:{},{},{}", taskId, operate, JSONObject.toJSONString(data));
processTaskDTO = workflowFeignClient.completeByTaskFroStandard(taskId, data).getResult();
} else if(REJECT_OPERATE.equals(operate)) {
// 驳回操作
log.info("开始请求工作流-驳回任务-接口:/reject/{taskId},请求参数:{},{},{}", taskId, operate, JSONObject.toJSONString(data));
processTaskDTO = workflowFeignClient.reject(taskId, data).getResult();
} else {
// 执行普通节点(提交)
log.info("开始请求工作流完成任务接口:/complete/standard/{taskId},请求参数:{},{},{}", taskId, operate, JSONObject.toJSONString(data));
processTaskDTO = workflowFeignClient.completeByTaskFroStandard(taskId, data).getResult();
}
log.info("请求工作流接口completeOrReject结束,返回结果:{}", JSONObject.toJSONString(processTaskDTO));
} catch (InnerInvokException e) {
//拦截无审核人异常信息
String devMessage = getErrorMessage(e);
log.error(devMessage);
throw new LocalBadRequest(devMessage);
} catch (Exception e) {
log.error("调用工作流完成任务接口失败", e);
String responseBody = extractFeignResponseBody(e);
String devMessage = extractDevMessageFromJson(responseBody);
throw new RuntimeException( devMessage != null ? devMessage : "流程处理失败", e);
}
return processTaskDTO;
}
private String extractDevMessageFromJson(String jsonStr) {
if (jsonStr == null || jsonStr.trim().isEmpty()) return null;
try {
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> json = mapper.readValue(jsonStr, Map.class);
Object devMessage = json.get("devMessage");
Object message = json.get("message");
if (devMessage != null && !String.valueOf(devMessage).trim().isEmpty()) {
return String.valueOf(devMessage);
} else if (message != null) {
return String.valueOf(message);
}
} catch (Exception ex) {
log.warn("解析响应JSON出错: {}", jsonStr, ex);
}
return null;
}
private String getErrorMessage(BaseException e){
String devMessage = e.getDevMessage();
if(devMessage.contains(";")){
String tempMsg = devMessage.split(";")[0];
if(tempMsg.contains(":")){
devMessage = tempMsg.split(":")[1];
} else {
devMessage = tempMsg;
}
}
return devMessage;
}
private String extractFeignResponseBody(Exception e) {
if (e instanceof feign.FeignException) {
feign.FeignException fe = (feign.FeignException) e;
try {
return new String(fe.content(), StandardCharsets.UTF_8);
} catch (Exception ex) {
log.warn("读取Feign响应体失败", ex);
}
}
return e.getMessage();
}
@Override
public ProcessTaskDTO complete(String taskId, TaskResultDTO data) { public ProcessTaskDTO complete(String taskId, TaskResultDTO data) {
ProcessTaskDTO processTaskDTO; ProcessTaskDTO processTaskDTO;
try { try {
......
...@@ -23,6 +23,7 @@ import com.yeejoin.amos.boot.module.jyjc.api.enums.PersonTypeEnum; ...@@ -23,6 +23,7 @@ import com.yeejoin.amos.boot.module.jyjc.api.enums.PersonTypeEnum;
import com.yeejoin.amos.boot.module.jyjc.api.mapper.JyjcBaseMapper; import com.yeejoin.amos.boot.module.jyjc.api.mapper.JyjcBaseMapper;
import com.yeejoin.amos.boot.module.jyjc.api.model.InstanceRuntimeData; import com.yeejoin.amos.boot.module.jyjc.api.model.InstanceRuntimeData;
import com.yeejoin.amos.boot.module.jyjc.api.model.JyjcInspectionResultModel; import com.yeejoin.amos.boot.module.jyjc.api.model.JyjcInspectionResultModel;
import com.yeejoin.amos.boot.module.jyjc.api.model.WorkflowResultDto;
import com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseEnterpriseInfoDto; import com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseEnterpriseInfoDto;
import com.yeejoin.amos.boot.module.ymt.api.entity.IdxBizJgInspectionDetectionInfo; import com.yeejoin.amos.boot.module.ymt.api.entity.IdxBizJgInspectionDetectionInfo;
import com.yeejoin.amos.boot.module.ymt.api.entity.TzBaseEnterpriseInfo; import com.yeejoin.amos.boot.module.ymt.api.entity.TzBaseEnterpriseInfo;
...@@ -33,6 +34,8 @@ import com.yeejoin.amos.component.feign.model.FeignClientResult; ...@@ -33,6 +34,8 @@ import com.yeejoin.amos.component.feign.model.FeignClientResult;
import com.yeejoin.amos.feign.privilege.Privilege; import com.yeejoin.amos.feign.privilege.Privilege;
import com.yeejoin.amos.feign.privilege.model.AgencyUserModel; import com.yeejoin.amos.feign.privilege.model.AgencyUserModel;
import com.yeejoin.amos.feign.privilege.model.CompanyModel; import com.yeejoin.amos.feign.privilege.model.CompanyModel;
import com.yeejoin.amos.feign.workflow.model.ActTaskDTO;
import com.yeejoin.amos.feign.workflow.model.ProcessTaskDTO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RBucket; import org.redisson.api.RBucket;
...@@ -40,6 +43,8 @@ import org.redisson.api.RedissonClient; ...@@ -40,6 +43,8 @@ import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.typroject.tyboot.core.foundation.context.RequestContext; import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest; import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
...@@ -140,6 +145,51 @@ public class CommonServiceImpl { ...@@ -140,6 +145,51 @@ public class CommonServiceImpl {
} }
/**
* 根据工作流返回信息,组装业务需要的数据
*
* @param processTaskDTOS 工作流返回信息
* @return 组装后的信息
*/
public List<WorkflowResultDto> buildWorkFlowInfo(List<ProcessTaskDTO> processTaskDTOS) {
List<WorkflowResultDto> workflowResultDtoList = new ArrayList<>();
processTaskDTOS.forEach(item -> {
WorkflowResultDto workflowResultDto = new WorkflowResultDto();
if (!ObjectUtils.isEmpty(item.getProcessInstance())) {
workflowResultDto.setInstanceId(item.getProcessInstance().getId());
}
if (!ObjectUtils.isEmpty(item.getTask())) {
workflowResultDto.setTaskName(item.getTask().getName());
}
if (!ObjectUtils.isEmpty(item.getCandidateGroups())) {
workflowResultDto.setExecutorRoleIds(String.join(",", item.getCandidateGroups()));
}
if (!ObjectUtils.isEmpty(item.getStartUser())) {
workflowResultDto.setStartUserId(item.getStartUser().getUserId());
workflowResultDto.setStartUserName(item.getStartUser().getRealName());
}
if (!ObjectUtils.isEmpty(item.getExecutor())) {
workflowResultDto.setExecutorId(item.getExecutor().getUserId());
workflowResultDto.setExecutorName(item.getExecutor().getRealName());
}
if (!CollectionUtils.isEmpty(item.getNextTask())) {
ActTaskDTO actTaskDTO = item.getNextTask().get(item.getNextTask().size() - 1);
workflowResultDto.setNextTaskId(actTaskDTO.getId());
workflowResultDto.setNextTaskCode(actTaskDTO.getKey());
workflowResultDto.setNextTaskName(actTaskDTO.getName());
List<String> nextGroups = item.getNextCandidateGroups().get(actTaskDTO.getId());
String join = String.join(",", nextGroups);
workflowResultDto.setNextExecutorRoleIds(join);
List<String> nextUserIds = item.getNextTaskExecutor().get(actTaskDTO.getId()).stream().map(AgencyUserModel::getUserId).collect(Collectors.toList());
String nextUserIdsString = String.join(",", nextUserIds);
workflowResultDto.setNextExecutorUserIds(nextUserIdsString);
}
workflowResultDtoList.add(workflowResultDto);
});
return workflowResultDtoList;
}
public void castPersonType2Post(LambdaQueryWrapper<TzsUserInfo> userInfoQueryWrapper, String personType) { public void castPersonType2Post(LambdaQueryWrapper<TzsUserInfo> userInfoQueryWrapper, String personType) {
if (personType.contains(PersonTypeEnum.jc.name()) && personType.contains(PersonTypeEnum.jy.name()) && personType.contains(PersonTypeEnum.charge.name())) { if (personType.contains(PersonTypeEnum.jc.name()) && personType.contains(PersonTypeEnum.jy.name()) && personType.contains(PersonTypeEnum.charge.name())) {
......
package com.yeejoin.amos.boot.module.jyjc.biz.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.boot.biz.common.entity.DataDictionary;
import com.yeejoin.amos.boot.biz.common.service.impl.DataDictionaryServiceImpl;
import com.yeejoin.amos.boot.module.common.api.dao.ESEquipmentCategory;
import com.yeejoin.amos.boot.module.common.api.dto.ESEquipmentCategoryDto;
import com.yeejoin.amos.boot.module.common.api.enums.EquipmentClassifityEnum;
import com.yeejoin.amos.boot.module.jg.api.enums.BusinessTypeEnum;
import com.yeejoin.amos.boot.module.jg.api.enums.WorkFlowStatusEnum;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcCmTask;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcInspectionApplication;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcInspectionApplicationEquip;
import com.yeejoin.amos.boot.module.jyjc.api.model.*;
import com.yeejoin.amos.boot.module.jyjc.biz.service.TaskModelServiceImpl;
import com.yeejoin.amos.boot.module.ymt.api.entity.IdxBizJgProjectContraption;
import com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum;
import com.yeejoin.amos.boot.module.ymt.api.mapper.IdxBizJgProjectContraptionMapper;
import com.yeejoin.amos.feign.workflow.model.ProcessTaskDTO;
import com.yeejoin.amos.feign.workflow.model.TaskResultDTO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author Administrator
*/
@Service
@Slf4j
public class InspectionPlanCommonServiceImpl {
@Autowired
private TaskModelServiceImpl taskModelService;
@Autowired
private DataDictionaryServiceImpl dataDictionaryService;
private final static String msgTpl = "%s申请单号:%s,进行%s";
void createdTaskModel(JyjcCmTask model, ReginParams reginParams, JyjcInspectionApplication application) {
TaskModelDto dto = new TaskModelDto();
TaskMessageDto ta = new TaskMessageDto();
ta.setInstanceId(model.getInstanceId());
ta.setStatus(model.getStatus());
ta.setPromoter(model.getPromoter());
ta.setSequenceNbr(model.getSequenceNbr());
ta.setProcessInstanceId(model.getInstanceId());
ta.setProcessKey(model.getProcessKey());
ta.setNextTaskId(model.getNextTaskId());
ta.setBizType(model.getSType());
dto.setModel(ta);
dto.setFlowCreateDate(new Date());
dto.setTaskName(model.getStatus());
dto.setFlowCode(model.getNextTaskId());
dto.setTaskContent(this.buildTaskContent(model.getNextTaskCode(), application));
dto.setTaskCode(model.getNextTaskCode());
dto.setTaskType(BusinessTypeEnum.INSPECTION_PLAN.getCode());
dto.setTaskTypeLabel(BusinessTypeEnum.INSPECTION_PLAN.getName());
dto.setRelationId(model.getInstanceId());
dto.setExecuteUserIds(model.getNextExecuteUserIds());
dto.setTaskStatusLabel("未处理");
dto.setFlowStatus(Integer.valueOf(model.getStatus()));
dto.setFlowStatusLabel(FlowStatusEnum.TO_BE_PROCESSED.getName());
dto.setStartUserId(RequestContext.getExeUserId());
dto.setStartUser(reginParams.getUserModel().getRealName());
dto.setStartUserCompanyName(reginParams.getCompany().getCompanyName());
dto.setStartDate(new Date());
dto.setNextExecuteUser(model.getNextExecuteUserIds());
dto.setPageType("edit");
taskModelService.buildTaskModel(Collections.singletonList(dto));
}
private String buildTaskContent(String taskCode, JyjcInspectionApplication application) {
if (taskCode.equals(WorkFlowStatusEnum.INSPECTION_PLAN_ASSIGN_USER.getCode())) {
return String.format(msgTpl, getDictNameByCode(application.getInspectionType(), "JYJC"), application.getApplicationNo(), WorkFlowStatusEnum.INSPECTION_PLAN_ASSIGN_USER.getPass());
} else if (taskCode.equals(WorkFlowStatusEnum.INSPECTION_PLAN_INSPECT_CONFIRM.getCode())) {
return String.format(msgTpl, getDictNameByCode(application.getInspectionType(), "JYJC"), application.getApplicationNo(), WorkFlowStatusEnum.INSPECTION_PLAN_INSPECT_CONFIRM.getPass());
}
log.error("非法的任务类型:{}", taskCode);
return "";
}
private String getDictNameByCode(String code, String dictType) {
DataDictionary dataDictionary = dataDictionaryService.getByCode(code, dictType);
return dataDictionary != null ? dataDictionary.getName() : "";
}
}
package com.yeejoin.amos.boot.module.jyjc.biz.service.impl; package com.yeejoin.amos.boot.module.jyjc.biz.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.boot.biz.common.entity.DataDictionary;
import com.yeejoin.amos.boot.biz.common.service.impl.DataDictionaryServiceImpl;
import com.yeejoin.amos.boot.module.common.api.dao.ESEquipmentCategory; import com.yeejoin.amos.boot.module.common.api.dao.ESEquipmentCategory;
import com.yeejoin.amos.boot.module.common.api.dto.ESEquipmentCategoryDto; import com.yeejoin.amos.boot.module.common.api.dto.ESEquipmentCategoryDto;
import com.yeejoin.amos.boot.module.common.api.enums.EquipmentClassifityEnum; import com.yeejoin.amos.boot.module.common.api.enums.EquipmentClassifityEnum;
import com.yeejoin.amos.boot.module.jg.api.enums.BusinessTypeEnum;
import com.yeejoin.amos.boot.module.jg.api.enums.WorkFlowStatusEnum;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcCmTask;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcInspectionApplication; import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcInspectionApplication;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcInspectionApplicationEquip; import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcInspectionApplicationEquip;
import com.yeejoin.amos.boot.module.jyjc.api.model.InspectionPlanModel; import com.yeejoin.amos.boot.module.jyjc.api.model.*;
import com.yeejoin.amos.boot.module.jyjc.biz.service.TaskModelServiceImpl;
import com.yeejoin.amos.boot.module.ymt.api.entity.IdxBizJgProjectContraption; import com.yeejoin.amos.boot.module.ymt.api.entity.IdxBizJgProjectContraption;
import com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum;
import com.yeejoin.amos.boot.module.ymt.api.mapper.IdxBizJgProjectContraptionMapper; import com.yeejoin.amos.boot.module.ymt.api.mapper.IdxBizJgProjectContraptionMapper;
import com.yeejoin.amos.feign.workflow.model.ProcessTaskDTO;
import com.yeejoin.amos.feign.workflow.model.TaskResultDTO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity; import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import java.util.Date; import java.util.*;
import java.util.List; import java.util.concurrent.TimeUnit;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -24,8 +40,12 @@ import java.util.stream.Stream; ...@@ -24,8 +40,12 @@ import java.util.stream.Stream;
* @author Administrator * @author Administrator
*/ */
@Service @Service
public class InspectionPlanServiceImpl { @RequiredArgsConstructor
@Slf4j
public class InspectionPlanServiceImpl extends InspectionPlanCommonServiceImpl {
private final RedissonClient redissonClient;
private final IdxBizJgProjectContraptionMapper idxBizJgProjectContraptionMapper; private final IdxBizJgProjectContraptionMapper idxBizJgProjectContraptionMapper;
private final JyjcInspectionApplicationServiceImpl inspectionApplicationService; private final JyjcInspectionApplicationServiceImpl inspectionApplicationService;
...@@ -36,15 +56,33 @@ public class InspectionPlanServiceImpl { ...@@ -36,15 +56,33 @@ public class InspectionPlanServiceImpl {
private final ESEquipmentCategory esEquipmentCategory; private final ESEquipmentCategory esEquipmentCategory;
public InspectionPlanServiceImpl(JyjcInspectionApplicationServiceImpl inspectionApplicationService, private final CommonServiceImpl commonService;
JyjcInspectionApplicationEquipServiceImpl applicationEquipService,
JyjcInspectionResultServiceImpl inspectionResultService, ESEquipmentCategory esEquipmentCategory, IdxBizJgProjectContraptionMapper idxBizJgProjectContraptionMapper) { private final CmWorkflowServiceImpl cmWorkflowService;
this.inspectionApplicationService = inspectionApplicationService;
this.applicationEquipService = applicationEquipService; private final TaskModelServiceImpl taskModelService;
this.inspectionResultService = inspectionResultService;
this.esEquipmentCategory = esEquipmentCategory; private final DataDictionaryServiceImpl dataDictionaryService;
this.idxBizJgProjectContraptionMapper = idxBizJgProjectContraptionMapper;
} private final JyjcCmTaskServiceImpl cmTaskService;
private final static String msgTpl = "%s申请单号:%s,进行%s";
/**
* 通过
*/
private final static String OPERATE_PASS = "0";
/**
* 驳回
*/
private final static String OPERATE_REJECT = "1";
/**
* 撤回
*/
private final static String OPERATE_WITHDRAW = "2";
public InspectionPlanModel savePlanData(String applicationSeq, InspectionPlanModel model) { public InspectionPlanModel savePlanData(String applicationSeq, InspectionPlanModel model) {
...@@ -56,6 +94,7 @@ public class InspectionPlanServiceImpl { ...@@ -56,6 +94,7 @@ public class InspectionPlanServiceImpl {
inspectionApplicationService.update(updateWrapper); inspectionApplicationService.update(updateWrapper);
// 异步写入计划排期日期,统计办理时效使用 // 异步写入计划排期日期,统计办理时效使用
this.updatePlanCreateDate(applicationSeq); this.updatePlanCreateDate(applicationSeq);
// todo 注意此处编辑后的数据不再回写道公共台的原始数据中,为反应原始审批信息,原始数据在审批完成后就已经进行固化,不再随这修改
return model; return model;
} }
...@@ -100,4 +139,177 @@ public class InspectionPlanServiceImpl { ...@@ -100,4 +139,177 @@ public class InspectionPlanServiceImpl {
private String concatDetailAddress(ESEquipmentCategoryDto esEquipmentCategoryDto) { private String concatDetailAddress(ESEquipmentCategoryDto esEquipmentCategoryDto) {
return Stream.of(esEquipmentCategoryDto.getUSE_PLACE(), esEquipmentCategoryDto.getADDRESS()).map(a -> a == null ? "" : a.replace("/", "").trim()).collect(Collectors.joining()); return Stream.of(esEquipmentCategoryDto.getUSE_PLACE(), esEquipmentCategoryDto.getADDRESS()).map(a -> a == null ? "" : a.replace("/", "").trim()).collect(Collectors.joining());
} }
public JSONObject getWorkBenchDetail(String applicationSeq) {
JSONObject res = new JSONObject();
JyjcCmTask jyjcCmTask = cmTaskService.getOneBySSeq(String.valueOf(applicationSeq));
BeanUtil.copyProperties(jyjcCmTask, res);
res.putAll(JSONObject.parseObject(jyjcCmTask.getFormData()));;
Map<String, Object> applyInfo = inspectionApplicationService.selectBySeq(Long.parseLong(applicationSeq), null);
applyInfo.remove("planData");
res.put("applyInfo", applyInfo);
return res;
}
public void flowExecute(Long applicationSeq, String instanceId, String operate, String comment, String nextTaskId, JSONObject params, ReginParams reginParams) {
String lockKey = CommonServiceImpl.buildJcExecuteLockKey(instanceId);
RLock lock = redissonClient.getLock(lockKey);
try {
boolean isLocked = lock.tryLock(0, 180, TimeUnit.SECONDS);
// 解决并发问题:多个人同时操作一个流程(并发执行通过、驳回、撤回)
if (!isLocked) {
throw new BadRequest("当前流程已经被执行!请重新打开页面查看并执行!");
}
// 流程执行时,状态及权限校验
commonService.checkForExecuteFlow(nextTaskId, instanceId);
InspectionPlanModel planModel = JSONObject.parseObject(params.toJSONString(), InspectionPlanModel.class);
// 组装信息
TaskResultDTO dto = new TaskResultDTO();
dto.setTaskId(nextTaskId);
dto.setComment(comment);
HashMap<String, Object> map = new HashMap<>();
JyjcInspectionApplication application = inspectionApplicationService.getById(applicationSeq);
// 需要再确认
dto.setNextExecuteUserCompanyCode(application.getInspectionUnitCode());
map.put("approvalStatus", operate);
// 任务接收人
map.put("assignee", this.getAssigneeUserId(planModel));
dto.setResultCode("approvalStatus");
dto.setVariable(map);// 1-驳回 0-通过
ProcessTaskDTO complete = cmWorkflowService.completeOrReject(nextTaskId, dto, operate);
ArrayList<ProcessTaskDTO> processTaskDTOS = new ArrayList<>();
processTaskDTOS.add(complete);
List<WorkflowResultDto> resultDto = commonService.buildWorkFlowInfo(processTaskDTOS);
WorkflowResultDto workflowResultDto = resultDto.get(0);
JyjcCmTask jyjcCmTask = cmTaskService.getOneBySSeq(String.valueOf(applicationSeq));
if (workflowResultDto != null && workflowResultDto.getNextTaskId() != null) {
// 完成待办
jyjcCmTask.setStatus(this.buildStatus(workflowResultDto.getNextTaskCode(), operate));
jyjcCmTask.setNextTaskCode(workflowResultDto.getNextTaskCode());
jyjcCmTask.setNextTaskId(workflowResultDto.getNextTaskId());
jyjcCmTask.setNextExecuteUserIds(workflowResultDto.getNextExecutorUserIds());
// 驳回后不能撤回
jyjcCmTask.setPromoter(OPERATE_PASS.equals(operate) ? RequestContext.getExeUserId() : "");
jyjcCmTask.setFormData(params.toJSONString());
cmTaskService.save(jyjcCmTask);
updateTaskModel(jyjcCmTask);
// 创建新的待办
createdTaskModel(jyjcCmTask, reginParams, application);
// 更新新的缓存校验数据到redis
} else {
// 更新业务信息
jyjcCmTask.setStatus(FlowStatusEnum.TO_BE_FINISHED.getName());
jyjcCmTask.setNextTaskCode("");
jyjcCmTask.setNextTaskId("");
jyjcCmTask.setNextExecuteUserIds("");
jyjcCmTask.setFormData(params.toJSONString());
cmTaskService.updateById(jyjcCmTask);
LambdaUpdateWrapper<JyjcInspectionApplication> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(BaseEntity::getSequenceNbr, applicationSeq);
updateWrapper.set(JyjcInspectionApplication::getPlanInspectionDate, planModel.getRemark2());
// 通过后将数据回写到业务的字段中,兼容之前的数据格式
updateWrapper.set(JyjcInspectionApplication::getInspectionChargePerson, planModel.getInspectionChargePerson());
updateWrapper.set(JyjcInspectionApplication::getRemark2, planModel.getRemark2());
updateWrapper.set(JyjcInspectionApplication::getPlanData, params.toJSONString());
inspectionApplicationService.update(updateWrapper);
this.updatePlanCreateDate(String.valueOf(applicationSeq));
// 完成待办
updateTaskModel(jyjcCmTask);
}
commonService.saveExecuteFlowData2Redis(instanceId, this.buildInstanceRuntimeData(jyjcCmTask));
} catch (InterruptedException e) {
log.error(e.getMessage(), e);
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
private InstanceRuntimeData buildInstanceRuntimeData(JyjcCmTask jyjcCmTask) {
return InstanceRuntimeData.builder()
.nextExecuteUserIds(jyjcCmTask.getNextExecuteUserIds())
.promoter(jyjcCmTask.getPromoter())
.nextTaskId(jyjcCmTask.getNextTaskId())
.build();
}
private String buildStatus(String nextTaskCode, String operate) {
if (nextTaskCode.equals(WorkFlowStatusEnum.INSPECTION_PLAN_ASSIGN_USER.getCode())) {
return OPERATE_PASS.equals(operate) ? WorkFlowStatusEnum.INSPECTION_PLAN_ASSIGN_USER.getPass() : OPERATE_WITHDRAW.equals(operate) ? WorkFlowStatusEnum.INSPECTION_PLAN_ASSIGN_USER.getRollBack(): WorkFlowStatusEnum.INSPECTION_PLAN_ASSIGN_USER.getReject();
} else if (nextTaskCode.equals(WorkFlowStatusEnum.INSPECTION_PLAN_INSPECT_CONFIRM.getCode())) {
return OPERATE_PASS.equals(operate) ? WorkFlowStatusEnum.INSPECTION_PLAN_INSPECT_CONFIRM.getPass() : OPERATE_WITHDRAW.equals(operate) ? WorkFlowStatusEnum.INSPECTION_PLAN_INSPECT_CONFIRM.getRollBack(): WorkFlowStatusEnum.INSPECTION_PLAN_INSPECT_CONFIRM.getReject();
}
return "";
}
private String getAssigneeUserId(InspectionPlanModel planModel) {
return planModel.getInspectionChargePerson();
}
public boolean withdraw(String instanceId, String nextTaskId, String applicationSeq) {
String lockKey = CommonServiceImpl.buildJcExecuteLockKey(instanceId);
RLock lock = redissonClient.getLock(lockKey);
try {
boolean isLocked = lock.tryLock(0, 180, TimeUnit.SECONDS);
// 解决并发问题:多个人同时操作一个流程(并发执行通过、驳回、撤回)
if (!isLocked) {
throw new BadRequest("当前流程已经被执行!请重新打开页面查看并执行!");
}
// 流程执行时,状态及权限校验
commonService.checkForRevocationFlow(nextTaskId, instanceId);
JyjcInspectionApplicationModel inspectionApplicationModel = inspectionApplicationService.queryBySeq(Long.valueOf(applicationSeq));
if (inspectionApplicationModel == null) {
log.warn("JyjcInspectionApplicationModel Not Found!sequenceNbr => {}", applicationSeq);
return false;
};
ProcessTaskDTO processTaskDTO = cmWorkflowService.rollBack(inspectionApplicationModel.getProcessInstanceId());
List<WorkflowResultDto> workflowResultDtos = taskModelService.buildWorkFlowInfo(Collections.singletonList(processTaskDTO));
WorkflowResultDto workflowResultDto = workflowResultDtos.get(0);
JyjcCmTask jyjcCmTask = cmTaskService.getOneBySSeq(applicationSeq);
jyjcCmTask.setStatus(this.buildStatus(workflowResultDto.getNextTaskCode(), OPERATE_WITHDRAW));
jyjcCmTask.setNextTaskCode(workflowResultDto.getNextTaskCode());
jyjcCmTask.setNextTaskId(workflowResultDto.getNextTaskId());
jyjcCmTask.setNextExecuteUserIds(workflowResultDto.getNextExecutorUserIds());
jyjcCmTask.setPromoter("");
cmTaskService.updateById(jyjcCmTask);
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(jyjcCmTask));
jsonObject.put("nextTaskId", workflowResultDto.getNextTaskId());
jsonObject.put("taskType", BusinessTypeEnum.INSPECTION_PLAN.getCode());
jsonObject.put("flowStatus", this.getDictNameByCode(jyjcCmTask.getStatus()));
jsonObject.put("flowStatusLabel", jyjcCmTask.getStatus());
jsonObject.remove("formData");
taskModelService.rollbackTask(inspectionApplicationModel.getProcessInstanceId(), jsonObject);
commonService.saveExecuteFlowData2Redis(instanceId, this.buildInstanceRuntimeData(jyjcCmTask));
return true;
} catch (InterruptedException e) {
log.error("撤回流程办理单失败:{}", e.getMessage(), e);
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
return Boolean.FALSE;
}
private void updateTaskModel(JyjcCmTask model) {
Map<String, Object> params = new HashMap<>();
params.put("relationId", model.getSequenceNbr());
params.put("taskStatus", model.getStatus());
params.put("taskStatusLabel", model.getStatus());
params.put("flowStatus", model.getStatus());
params.put("flowStatusLabel", model.getStatus());
JSONObject jsonModel = (JSONObject) JSONObject.toJSON(model);
taskModelService.removeNoUsedKey(jsonModel);
Map<String, Object> modelMap = new HashMap<>(jsonModel);
params.put("model", BeanUtil.toBeanIgnoreError(modelMap, JyjcInspectionApplicationModel.class));
taskModelService.updateTaskModel(params);
}
private String getDictNameByCode(String code) {
DataDictionary dataDictionary = dataDictionaryService.getByCode(code, "JGGZZZ");
return dataDictionary != null ? dataDictionary.getName() : "";
}
} }
package com.yeejoin.amos.boot.module.jyjc.biz.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yeejoin.amos.boot.module.jyjc.api.dto.JyjcCmTaskDto;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcCmTask;
import com.yeejoin.amos.boot.module.jyjc.api.mapper.JyjcCmTaskMapper;
import com.yeejoin.amos.boot.module.jyjc.api.service.IJyjcCmWorkflowService;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.springframework.stereotype.Service;
/**
* 业务工作流关系表服务实现类
*
* @author system_generator
* @date 2026-04-03
*/
@Service
public class JyjcCmTaskServiceImpl extends BaseService<JyjcCmTaskDto, JyjcCmTask, JyjcCmTaskMapper> implements IJyjcCmWorkflowService {
public JyjcCmTask getOneBySSeq(String seq){
LambdaQueryWrapper<JyjcCmTask> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(JyjcCmTask::getSSeq, seq);
return this.getOne(queryWrapper);
}
}
\ No newline at end of file
...@@ -144,6 +144,9 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec ...@@ -144,6 +144,9 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
@Autowired @Autowired
private EquipTechParamBoilerMapper equipTechParamBoilerMapper; private EquipTechParamBoilerMapper equipTechParamBoilerMapper;
@Autowired
private WorkBenchTaskCreateServiceImpl workBenchTaskCreateService;
/** /**
* 分页查询 * 分页查询
*/ */
...@@ -767,7 +770,8 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec ...@@ -767,7 +770,8 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
/** /**
* 接收 * 接收
* *
* @param params params * @param params params
* @param selectedOrgInfo
* @return {@link } * @return {@link }
* @throws * @throws
* @author yangyang * @author yangyang
...@@ -775,7 +779,7 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec ...@@ -775,7 +779,7 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@GlobalTransactional(rollbackFor = Exception.class) @GlobalTransactional(rollbackFor = Exception.class)
public void doReceive(Map<String, Object> params) { public void doReceive(Map<String, Object> params, ReginParams reginParams) {
String instanceId = params.get("instanceId").toString(); String instanceId = params.get("instanceId").toString();
String nextTaskId = params.get("nextTaskId").toString(); String nextTaskId = params.get("nextTaskId").toString();
String lockKey = CommonServiceImpl.buildJcExecuteLockKey(instanceId); String lockKey = CommonServiceImpl.buildJcExecuteLockKey(instanceId);
...@@ -956,6 +960,12 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec ...@@ -956,6 +960,12 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
@Override @Override
public void afterCommit() { public void afterCommit() {
docUpdateService.genDocAndUpdate(model.getSequenceNbr() + ""); docUpdateService.genDocAndUpdate(model.getSequenceNbr() + "");
try {
workBenchTaskCreateService.createOneTask(jyjcInspectionApplication, reginParams);
} catch (Exception e) {
log.error("报检受理后,创建计划排期失败,单据信息:{},错误信息:{}",jyjcInspectionApplication.getApplicationNo(), e.getMessage());
}
} }
}); });
} catch (InterruptedException e) { } catch (InterruptedException e) {
......
package com.yeejoin.amos.boot.module.jyjc.biz.service.impl;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.boot.module.jg.api.enums.BusinessTypeEnum;
import com.yeejoin.amos.boot.module.jg.api.enums.WorkFlowStatusEnum;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcCmTask;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcInspectionApplication;
import com.yeejoin.amos.boot.module.jyjc.api.model.InstanceRuntimeData;
import com.yeejoin.amos.boot.module.jyjc.api.model.TaskMessageDto;
import com.yeejoin.amos.boot.module.jyjc.api.model.TaskModelDto;
import com.yeejoin.amos.boot.module.jyjc.api.model.WorkflowResultDto;
import com.yeejoin.amos.boot.module.jyjc.biz.service.TaskModelServiceImpl;
import com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum;
import com.yeejoin.amos.feign.workflow.model.ActWorkflowBatchDTO;
import com.yeejoin.amos.feign.workflow.model.ActWorkflowStartDTO;
import com.yeejoin.amos.feign.workflow.model.ProcessTaskDTO;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import java.util.*;
@Service
@RequiredArgsConstructor
public class WorkBenchTaskCreateServiceImpl extends InspectionPlanCommonServiceImpl {
private final CmWorkflowServiceImpl cmWorkflowService;
private final TaskModelServiceImpl taskModelService;
private final JyjcCmTaskServiceImpl cmTaskService;
private final CommonServiceImpl commonService;
@Value("${inspect.plan.process.key:dddd}")
private String processKey;
public void createOneTask(JyjcInspectionApplication application, ReginParams reginParams) {
// 启动流程
List<WorkflowResultDto> workflowResultDtos = startProcess(application);
// 保存数据
JyjcCmTask cmTask = saveJyjcCmTask(application, workflowResultDtos);
// 创建待办
createdTaskModel(cmTask, reginParams, application);
// 缓存执行节点信息
commonService.saveExecuteFlowData2Redis(cmTask.getInstanceId(), this.buildInstanceRuntimeData(cmTask));
}
private List<WorkflowResultDto> startProcess(JyjcInspectionApplication application) {
ActWorkflowBatchDTO actWorkflowBatchDTO = new ActWorkflowBatchDTO();
List<ActWorkflowStartDTO> list = new ArrayList<>();
ActWorkflowStartDTO dto = new ActWorkflowStartDTO();
dto.setProcessDefinitionKey(processKey);
dto.setBusinessKey(String.valueOf(new Date().getTime()));
dto.setCompleteFirstTask(true);
HashMap<String, Object> variables = new HashMap<>();
// 指定下一节点执行人,谁受理谁执行
variables.put("nextAssignee", RequestContext.getExeUserId());
dto.setVariables(variables);
list.add(dto);
actWorkflowBatchDTO.setProcess(list);
dto.setNextExecuteUserCompanyCode(application.getInspectionUnitCode());
List<ProcessTaskDTO> processTasks = cmWorkflowService.startBatch(actWorkflowBatchDTO);
return taskModelService.buildWorkFlowInfo(processTasks);
}
@NotNull
private JyjcCmTask saveJyjcCmTask(JyjcInspectionApplication application, List<WorkflowResultDto> workflowResultDtos) {
JyjcCmTask cmTask = new JyjcCmTask();
cmTask.setPromoter("");
cmTask.setNextTaskId(workflowResultDtos.get(0).getNextTaskId());
cmTask.setNextTaskCode(workflowResultDtos.get(0).getNextTaskCode());
cmTask.setNextExecuteUserIds(workflowResultDtos.get(0).getNextExecutorUserIds());
cmTask.setInstanceId(workflowResultDtos.get(0).getInstanceId());
cmTask.setProcessKey(processKey);
cmTask.setSSeq(application.getSequenceNbr().toString());
cmTask.setSType(application.getBizType());
cmTask.setStatus(WorkFlowStatusEnum.INSPECTION_PLAN_ASSIGN_USER.getPass());
cmTaskService.save(cmTask);
return cmTask;
}
private InstanceRuntimeData buildInstanceRuntimeData(JyjcCmTask cmTask) {
return InstanceRuntimeData.builder()
.nextExecuteUserIds(cmTask.getNextExecuteUserIds())
.promoter(cmTask.getPromoter())
.nextTaskId(cmTask.getNextTaskId()).build();
}
}
...@@ -73,5 +73,11 @@ ...@@ -73,5 +73,11 @@
"type": "114", "type": "114",
"pageType": "edit", "pageType": "edit",
"url": "/mixuap?appId=1742358052905971713&id=1735201757841092609&roleIds={roleIds}&userId={userId}&pageType=edit" "url": "/mixuap?appId=1742358052905971713&id=1735201757841092609&roleIds={roleIds}&userId={userId}&pageType=edit"
},
{
"type": "125",
"pageType": "edit",
"typeName": "计划排期",
"url": "/mixuap?appId=1742358052905971713&id=2039590365681446914&userId={userId}&pageType=edit"
} }
] ]
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment