Merge remote-tracking branch 'origin/SecondStage' into SecondStage

This commit is contained in:
梁琦涛
2024-09-25 18:14:40 +08:00
12 changed files with 786 additions and 69 deletions
@@ -17,7 +17,8 @@ public enum ProcessTypeEnum {
MARKET_STANDARD_PUBLISH("市场清单发布流程", 4, "com.jero.modules.activiti.process.ms.service.impl.ProcessMarketStandardReleaseServiceImpl", "/workCenter/MarketListReleaseProcess", "/workCenter/MarketListReleaseProcess"),
ENTERPRISE_STANDARD_ABOLISH_PUBLISH("企标废止发布流程", 5, "com.jero.modules.activiti.process.abolish.service.impl.ProcessAbolishReleaseServiceImpl", "/workCenter/AbolishReleaseProcess", "/workCenter/AbolishReleaseProcess"),
ES_REVISION_ADVICE("企业标准制修订及征求意见流程", 6, "com.jero.modules.activiti.process.esRevisionAdvice.service.impl.EsRevisionServiceImpl","/workCenter/enterpriseStandardRevision/enterpriseStandardRevisionFlow","/workCenter/enterpriseStandardRevision"),
ANNUAL_INIT("年度制修订计划流程", 7, "com.jero.modules.activiti.process.annualinit.service.impl.ProcessAnnualInitService","/workCenter/enterpriseStandardRevision/enterpriseStandardRevisionFlow","/workCenter/enterpriseStandardRevision")
ANNUAL_INIT("年度制修订计划流程", 7, "com.jero.modules.activiti.process.annualinit.service.impl.ProcessAnnualInitService","/workCenter/enterpriseStandardRevision/enterpriseStandardRevisionFlow","/workCenter/enterpriseStandardRevision"),
DOMESTIC_VEHICLE_CONTROL_PUBLISH("国内整车型号和VIN前八位管控流程", 8, "com.jero.modules.activiti.process.vehicledomestic.service.impl.ProcessVehicleDomesticReleaseServiceImpl","/workCenter/VehicleDomesticReleaseProcess","/workCenter/VehicleDomesticReleaseProcess")
;
private final String name;
@@ -17,7 +17,8 @@ public enum ProcessType {
MARKET_STANDARD_PUBLISH("市场清单发布流程", "4", "market_standard_publish", "ProcessNewStandardImportServiceImpl"),
ENTERPRISE_STANDARD_ABOLISH_PUBLISH("企标废止发布流程", "5", "enterprise_standard_abolish_publish", "ProcessAbolishReleaseServiceImpl"),
ES_REVISION_ADVICE("企标制修订及征求意见流程", "6", "es_revision_advice", "ProcessEsRevisionServiceImpl"),
ANNUAL_INIT("年度制修订计划流程", "7", "process-annual-init", "ProcessAnnualInitService")
ANNUAL_INIT("年度制修订计划流程", "7", "process-annual-init", "ProcessAnnualInitService"),
DOMESTIC_VEHICLE_CONTROL_PUBLISH("国内整车型号和VIN前八位管控流程", "8", "domestic_vehicle_control_publish", "ProcessVehicleDomesticReleaseServiceImpl")
;
private final String name;
@@ -1,15 +0,0 @@
package com.jero.modules.activiti.process.vehicledomestic.common;
public interface Constant {
String TAKE_EFFECT = "1";
String ABOLISH = "2";
String FUEL_OIL = "1";
String HYBRID_POWER = "2";
String PURE_ELECTRIC = "3";
}
@@ -2,12 +2,17 @@ package com.jero.modules.activiti.process.vehicledomestic.controller;
import com.jero.common.api.vo.Result;
import com.jero.common.aspect.annotation.AutoLog;
import com.jero.common.aspect.annotation.Translation;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.common.entity.ProcessDraft;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.process.vehicledomestic.service.IProcessVehicleDomesticReleaseService;
import com.jero.modules.activiti.process.vehicledomestic.vo.ProcessVehicleDomesticReleaseVo;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@@ -26,32 +31,65 @@ public class ProcessVehicleDomesticReleaseController {
@Resource
private IProcessVehicleDomesticReleaseService processVehicleDomesticReleaseService;
@Resource
private ActFlowCommonService actFlowCommonService;
/**
* 根据能源类型导出模板
*/
@AutoLog(value = "国内整车型号和VIN前八位管控流程-根据能源类型导出模板")
@ApiOperation(value="国内整车型号和VIN前八位管控流程-根据能源类型导出模板", notes="国内整车型号和VIN前八位管控流程-根据能源类型导出模板")
@GetMapping(value = "/exportTemplateByType")
// @RequiresPermissions("clubManagement:clubManagement:import")
public ModelAndView exportTemplateByType(HttpServletRequest request) {
return processVehicleDomesticReleaseService.exportTemplateByType(request);
}
/**
* 导入
* @param request
* @return
*/
@AutoLog(value = "国内整车型号和VIN前八位管控流程-导入")
@ApiOperation(value="国内整车型号和VIN前八位管控流程-导入", notes="国内整车型号和VIN前八位管控流程-导入")
@PostMapping(value = "/importExcel")
// @RequiresPermissions("clubManagement:clubManagement:import")
public Result<?> excelimport(HttpServletRequest request) {
return processVehicleDomesticReleaseService.importExcel(request);
}
@AutoLog(value = "国内整车型号和VIN前八位管控流程-发起流程")
@ApiOperation(value = "国内整车型号和VIN前八位管控流程-发起流程", notes = "国内整车型号和VIN前八位管控流程-发起流程")
@PostMapping(value = "/start")
public Result<T> startProcess(@Validated @RequestBody ProcessInfoVO<ProcessVehicleDomesticReleaseVo> processInfoVO) {
processVehicleDomesticReleaseService.startProcess(processInfoVO);
return Result.OK();
}
@AutoLog(value = "国内整车型号和VIN前八位管控流程-同意")
@ApiOperation(value = "国内整车型号和VIN前八位管控流程-同意", notes = "国内整车型号和VIN前八位管控流程-同意")
@PostMapping("/agree")
public Result<T> agree(@Validated @RequestBody ProcessInfoVO<ProcessVehicleDomesticReleaseVo> processInfoVO) {
processVehicleDomesticReleaseService.approveTask(processInfoVO, true);
return Result.OK();
}
@AutoLog(value = "国内整车型号和VIN前八位管控流程-驳回")
@ApiOperation(value = "国内整车型号和VIN前八位管控流程-驳回", notes = "国内整车型号和VIN前八位管控流程-驳回")
@PostMapping("/reject")
public Result<T> reject(@Validated @RequestBody ProcessInfoVO<ProcessVehicleDomesticReleaseVo> processInfoVO) {
processVehicleDomesticReleaseService.approveTask(processInfoVO, false);
return Result.OK();
}
@AutoLog(value = "国内整车型号和VIN前八位管控流程-提交")
@ApiOperation(value = "国内整车型号和VIN前八位管控流程-提交", notes = "国内整车型号和VIN前八位管控流程-提交")
@PostMapping("/submit")
public Result<T> submit(@Validated @RequestBody ProcessInfoVO<ProcessVehicleDomesticReleaseVo> processInfoVO) {
processVehicleDomesticReleaseService.submit(processInfoVO);
return Result.OK();
}
@AutoLog(value = "国内整车型号和VIN前八位管控流程-办理")
@ApiOperation(value="国内整车型号和VIN前八位管控流程-办理", notes="国内整车型号和VIN前八位管控流程-办理")
@GetMapping("/handle/{taskId}")
@Translation
public Result<?> handle(@PathVariable("taskId") String taskId) {
ProcessDraft draft = actFlowCommonService.getExistDraftByTaskId(taskId, ProcessTypeEnum.DOMESTIC_VEHICLE_CONTROL_PUBLISH);
if (draft != null) {
return Result.OK(draft);
}
return Result.OK(processVehicleDomesticReleaseService.getHandleData(taskId));
}
}
@@ -2,14 +2,16 @@ package com.jero.modules.activiti.process.vehicledomestic.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
/**
* <p>
@@ -41,9 +43,6 @@ public class ProcessVehicleDomesticRelease implements Serializable {
@ApiModelProperty(value = "抄送人员")
private String copyUser;
@ApiModelProperty(value = "0表示流程未完成,1表示流程已完成")
private Integer isFinish;
@ApiModelProperty(value = "0表示未删除,1表示删除")
private Integer delFlag;
@@ -51,13 +50,17 @@ public class ProcessVehicleDomesticRelease implements Serializable {
private String createBy;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "更新人")
private String updateBy;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
@@ -0,0 +1,78 @@
package com.jero.modules.activiti.process.vehicledomestic.listener;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jero.common.api.SendMessageAPI;
import com.jero.common.api.dto.message.SendMessageDTO;
import com.jero.modules.activiti.process.common.enums.ProcessType;
import com.jero.modules.activiti.process.vehicledomestic.entity.ProcessVehicleDomesticRelease;
import com.jero.modules.activiti.process.vehicledomestic.service.IProcessVehicleDomesticReleaseService;
import com.jero.modules.laws.businessSupport.common.Constant;
import com.jero.modules.laws.businessSupport.entity.LawsVehicleDomesticLibrary;
import com.jero.modules.laws.businessSupport.service.ILawsVehicleDomesticLibraryService;
import com.jero.modules.system.entity.SysUser;
import com.jero.modules.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* @author: Mzaxd
* @Date: 2023/10/10 14:14
*/
@Slf4j
@Component("ProcessDomesticVehicleEndListener")
public class ProcessDomesticVehicleEndListener implements ExecutionListener, Serializable {
@Resource
private IProcessVehicleDomesticReleaseService processVehicleDomesticReleaseService;
@Resource
private ILawsVehicleDomesticLibraryService lawsVehicleDomesticLibraryService;
@Resource
private ISysUserService sysUserService;
@Resource
private SendMessageAPI sendMessageAPI;
/**
* 国内整车型号和VIN前八位管控流程结束之后给抄送人发消息
* @param delegateExecution
*/
@Override
public void notify(DelegateExecution delegateExecution) {
log.info("国内整车型号和VIN前八位管控流程:监听执行器开始执行");
// 找到流程实例Id
String processInstanceId = delegateExecution.getProcessInstanceId();
// 更新业务主表的字段
ProcessVehicleDomesticRelease processVehicleDomesticRelease = processVehicleDomesticReleaseService.getOne(new LambdaQueryWrapper<ProcessVehicleDomesticRelease>().eq(ProcessVehicleDomesticRelease::getProcessInstanceId, processInstanceId), false);
LawsVehicleDomesticLibrary lawsVehicleDomesticLibrary = lawsVehicleDomesticLibraryService.getById(processVehicleDomesticRelease.getVehicleId());
lawsVehicleDomesticLibrary.setFinishDate(new Date()); // 完成日期
lawsVehicleDomesticLibrary.setIsFinish(Constant.IS_FINISH); // 是否完成流程
lawsVehicleDomesticLibrary.setState(Constant.TAKE_EFFECT); // 状态
lawsVehicleDomesticLibraryService.updateById(lawsVehicleDomesticLibrary);
// 给抄送人发送消息
String processDefinitionKey = ProcessType.NEW_STANDARD_IMPORT.getProcessKey();
// 发送消息
SendMessageDTO sendMessageDTO = new SendMessageDTO();
sendMessageDTO.setTemplateCode(processDefinitionKey);
sendMessageDTO.setToUserId(processVehicleDomesticRelease.getCopyUser());
LambdaQueryWrapper<SysUser> querySysUser = new LambdaQueryWrapper<>();
querySysUser.eq(SysUser::getUsername,processVehicleDomesticRelease.getCreateBy());
SysUser sysUser = sysUserService.getOne(querySysUser,false);
if(!Objects.isNull(sysUser)){
sendMessageDTO.setSendUser(sysUser.getId());
}
Map<String, String> sendMap = new HashMap<>();
sendMap.put("standardNumber","测试占位符1");
sendMap.put("standardName", "测试占位符2");
sendMessageDTO.setMap(sendMap);
sendMessageAPI.sendMessage(sendMessageDTO);
log.info("国内整车型号和VIN前八位管控流程:监听执行器执行结束");
}
}
@@ -2,9 +2,10 @@ package com.jero.modules.activiti.process.vehicledomestic.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jero.common.api.vo.Result;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.process.vehicledomestic.entity.ProcessVehicleDomesticRelease;
import com.jero.modules.activiti.process.vehicledomestic.vo.ProcessVehicleDomesticReleaseVo;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
@@ -20,4 +21,12 @@ public interface IProcessVehicleDomesticReleaseService extends IService<ProcessV
ModelAndView exportTemplateByType(HttpServletRequest request);
Result<?> importExcel(HttpServletRequest request);
void startProcess(ProcessInfoVO<ProcessVehicleDomesticReleaseVo> processInfoVO);
void approveTask(ProcessInfoVO<ProcessVehicleDomesticReleaseVo> processInfoVO, boolean pass);
void submit(ProcessInfoVO<ProcessVehicleDomesticReleaseVo> processInfoVO);
ProcessInfoVO<ProcessVehicleDomesticReleaseVo> getHandleData(String taskId);
}
@@ -1,16 +1,42 @@
package com.jero.modules.activiti.process.vehicledomestic.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.api.vo.Result;
import com.jero.common.api.vo.ResultCommon;
import com.jero.common.exception.JeroBootException;
import com.jero.common.system.base.controller.JeroController;
import com.jero.common.util.ImportExcelUtil;
import com.jero.modules.activiti.process.vehicledomestic.common.Constant;
import com.jero.modules.activiti.common.ActivitiCommon;
import com.jero.modules.activiti.entity.ProcessAll;
import com.jero.modules.activiti.entity.ProcessApprovalRecord;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.abolish.entity.ProcessAbolishRelease;
import com.jero.modules.activiti.process.common.enums.ProcessType;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.fb.dto.BasicProcessInfoDTO;
import com.jero.modules.activiti.process.fb.dto.BasicTaskInfoDTO;
import com.jero.modules.activiti.process.fb.service.IProcessHandleService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.process.vehicledomestic.entity.ProcessVehicleDomesticRelease;
import com.jero.modules.activiti.process.vehicledomestic.mapper.ProcessVehicleDomesticReleaseMapper;
import com.jero.modules.activiti.process.vehicledomestic.service.IProcessVehicleDomesticReleaseService;
import com.jero.modules.activiti.process.vehicledomestic.vo.ProcessVehicleDomesticReleaseVo;
import com.jero.modules.activiti.process.vehicledomestic.vo.excel.*;
import com.jero.modules.activiti.service.ProcessAllService;
import com.jero.modules.activiti.service.ProcessApprovalRecordService;
import com.jero.modules.activiti.service.ProcessNodeLinkService;
import com.jero.modules.laws.businessSupport.common.Constant;
import com.jero.modules.laws.businessSupport.entity.LawsVehicleDomesticLibrary;
import com.jero.modules.laws.businessSupport.entity.LawsVehicleDomesticLibrarySublist;
import com.jero.modules.laws.businessSupport.service.ILawsVehicleDomesticLibraryService;
import com.jero.modules.laws.businessSupport.service.ILawsVehicleDomesticLibrarySublistService;
import com.jero.modules.sys.utils.UserUtils;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.lang3.StringUtils;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
@@ -20,16 +46,17 @@ import org.jeecgframework.poi.excel.entity.enmus.ExcelType;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
import static com.jero.modules.activiti.common.ActivitiCommon.PASS;
/**
@@ -41,12 +68,33 @@ import java.util.stream.Collectors;
* @since 2024-09-23
*/
@Service
@Transactional(rollbackFor = JeroBootException.class)
@Slf4j
public class ProcessVehicleDomesticReleaseServiceImpl extends ServiceImpl<ProcessVehicleDomesticReleaseMapper, ProcessVehicleDomesticRelease> implements IProcessVehicleDomesticReleaseService {
private static final String NEWLINE_CHARACTER = "</br>";
private static final String ENERGY_TYPE = "energyType";
@Resource
private ActFlowCommonService actFlowCommonService;
@Resource
private ProcessNodeLinkService processNodeLinkService;
@Resource
private ProcessApprovalRecordService processApprovalRecordService;
@Resource
private ProcessAllService processAllService;
@Resource
private RuntimeService runtimeService;
@Resource
private IProcessHandleService processHandleService;
@Resource
private TaskService taskService;
@Resource
private ILawsVehicleDomesticLibraryService lawsVehicleDomesticLibraryService;
@Resource
private ILawsVehicleDomesticLibrarySublistService lawsVehicleDomesticLibrarySublistService;
@Override
public ModelAndView exportTemplateByType(HttpServletRequest request) {
String energyType = request.getParameter(ENERGY_TYPE);
@@ -118,6 +166,248 @@ public class ProcessVehicleDomesticReleaseServiceImpl extends ServiceImpl<Proces
return Result.OK(excelList);
}
@Override
public void startProcess(ProcessInfoVO<ProcessVehicleDomesticReleaseVo> processInfoVO) {
// 流程Key
String processDefinitionKey = ProcessType.DOMESTIC_VEHICLE_CONTROL_PUBLISH.getProcessKey();
// 流程信息
BasicProcessInfoDTO processInfo = processInfoVO.getBasicProcessInfoDTO();
// 任务信息
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
// 人员信息
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
// 业务数据
ProcessVehicleDomesticReleaseVo businessInfoDTO = processInfoVO.getBusinessInfoDTO();
// 设置流程变量
Map<String, Object> actVariables = setVariables(userInfoMap);
// 删除草稿
actFlowCommonService.getExistDraftAndRemove(processInfoVO.getDraftId());
// 启动流程
ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, actVariables);
// 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId();
String processInstanceId = processInstance.getId();
businessInfoDTO.setProcessInstanceId(processInstanceId);
processInfo.setProcessInstanceId(processInstanceId);
processInfo.setProcessDefinitionId(processDefinitionId);
processInfo.setProcessType(ProcessTypeEnum.DOMESTIC_VEHICLE_CONTROL_PUBLISH.getValue());
// 第一个节点业务数据处理
startNodeBusProcess(processInfoVO);
// 保存选人信息
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, changeVariables(userInfoMap));
// 当前用户Id
String userId = UserUtils.getUserId();
// 获取第一个任务的taskId
String taskId = actFlowCommonService.getFirstTaskId(processInstanceId, userId, processDefinitionId);
processTask.setTaskId(taskId);
// 保存第一个节点的草稿
processHandleService.saveToDraft(processInfoVO, UserUtils.getUserId());
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 根据流程实例id更新流程总表
actFlowCommonService.updateProcessAll(processInfo);
// 自动完成第一个任务
actFlowCommonService.completeTask(taskId, userId);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO,userId);
}
@Override
public void approveTask(ProcessInfoVO<ProcessVehicleDomesticReleaseVo> processInfoVO, boolean pass) {
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
String taskId = processTask.getTaskId();
// 获取task
if (StringUtils.isBlank(taskId) || !actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException("taskId为空或任务不存在");
}
// 获取当前节点的id
ProcessApprovalRecord processApprovalRecord = actFlowCommonService.getNodeIdByTaskId(taskId);
String xmlNodeId = processApprovalRecord.getNodeId();
//任务Id 查询任务对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String processInstanceId = task.getProcessInstanceId();
String userId = actFlowCommonService.getOriginTaskAssignee(taskId);
if(Objects.isNull(task)){
throw new JeroBootException("找不到对应任务");
}
if (pass && task.getName().equals("法规部门处理人审批")) {
startRegulatoryProcess(processInfoVO, processInstanceId);
}
if(Objects.isNull(processTask.getCommitFlag())){
processTask.setCommitFlag(pass ? ActivitiCommon.COMMIT_FLAG1 : ActivitiCommon.COMMIT_FLAG2);
}
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 设置流程变量
runtimeService.setVariable(processInstanceId, PASS, pass);
// 审批节点
actFlowCommonService.completeTask(taskId, userId);
// 驳回,结束所有节点
processApprovalRecordService.updateApprovalRecordFinishFlag(pass, taskId, xmlNodeId, processInstanceId);
// 保存快照
// 获取流程通用数据
ProcessAll process = processAllService.getByProcessInstanceId(processInstanceId);
if(!Objects.isNull(process)){
BasicProcessInfoDTO basicProcessInfoDTO = new BasicProcessInfoDTO();
basicProcessInfoDTO.setProcessName(process.getPrcName());
basicProcessInfoDTO.setProcessType(process.getPrcType());
basicProcessInfoDTO.setProcessDefinitionId(process.getProcessDefinitionId());
basicProcessInfoDTO.setProcessInstanceId(process.getProcessInstanceId());
basicProcessInfoDTO.setProcessDescription(process.getPrcMes());
basicProcessInfoDTO.setProcessDueDate(process.getDueTime());
processInfoVO.setBasicProcessInfoDTO(basicProcessInfoDTO);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO,userId);
}
}
@Override
public void submit(ProcessInfoVO<ProcessVehicleDomesticReleaseVo> processInfoVO) {
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
String taskId = processTask.getTaskId();
// 获取task
if (StringUtils.isBlank(taskId) || !actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException("taskId为空或任务不存在");
}
//任务Id 查询任务对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if(Objects.isNull(task)){
throw new JeroBootException("找不到对应任务");
}
// 人员信息
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
// 设置流程变量
Map<String, Object> actVariables = setVariables(userInfoMap);
String processInstanceId = task.getProcessInstanceId();
runtimeService.setVariables(processInstanceId,actVariables);
String userId = actFlowCommonService.getOriginTaskAssignee(taskId);
// 发起节点 更新业务数据
startNodeBusProcess(processInfoVO);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 审批节点
actFlowCommonService.completeTask(taskId, userId);
// 保存快照
// 获取流程通用数据
ProcessAll process = processAllService.getByProcessInstanceId(processInstanceId);
if(!Objects.isNull(process)){
BasicProcessInfoDTO basicProcessInfoDTO = new BasicProcessInfoDTO();
basicProcessInfoDTO.setProcessName(process.getPrcName());
basicProcessInfoDTO.setProcessType(process.getPrcType());
basicProcessInfoDTO.setProcessDefinitionId(process.getProcessDefinitionId());
basicProcessInfoDTO.setProcessInstanceId(process.getProcessInstanceId());
basicProcessInfoDTO.setProcessDescription(process.getPrcMes());
basicProcessInfoDTO.setProcessDueDate(process.getDueTime());
processInfoVO.setBasicProcessInfoDTO(basicProcessInfoDTO);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO,userId);
}
}
@Override
public ProcessInfoVO<ProcessVehicleDomesticReleaseVo> getHandleData(String taskId) {
if (!actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException("任务不存在");
}
ProcessInfoVO<ProcessVehicleDomesticReleaseVo> result = new ProcessInfoVO<>();
// 使用流程引擎根据taskId找到流程实例Id
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
// 获取流程通用数据
ProcessAll process = processAllService.getByProcessInstanceId(processInstanceId);
if(!Objects.isNull(process)){
BasicProcessInfoDTO basicProcessInfoDTO = new BasicProcessInfoDTO();
basicProcessInfoDTO.setProcessName(process.getPrcName());
basicProcessInfoDTO.setProcessType(process.getPrcType());
basicProcessInfoDTO.setProcessDefinitionId(process.getProcessDefinitionId());
basicProcessInfoDTO.setProcessInstanceId(process.getProcessInstanceId());
basicProcessInfoDTO.setProcessDescription(process.getPrcMes());
basicProcessInfoDTO.setProcessDueDate(process.getDueTime());
result.setBasicProcessInfoDTO(basicProcessInfoDTO);
}
// 获取流程实例数据
ProcessVehicleDomesticReleaseVo processVehicleDomesticReleaseVo = new ProcessVehicleDomesticReleaseVo();
// 流程表
LambdaQueryWrapper<ProcessVehicleDomesticRelease> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ProcessVehicleDomesticRelease::getProcessInstanceId, processInstanceId);
ProcessVehicleDomesticRelease processVehicleDomesticRelease = getOne(lambdaQueryWrapper,false);
processVehicleDomesticReleaseVo.setCopyUser(processVehicleDomesticRelease.getCopyUser());
// 业务主表
LawsVehicleDomesticLibrary lawsVehicleDomesticLibrary = lawsVehicleDomesticLibraryService.getById(processVehicleDomesticRelease.getVehicleId());
processVehicleDomesticReleaseVo.setRemark(lawsVehicleDomesticLibrary.getRemark());
processVehicleDomesticReleaseVo.setEnergyType(lawsVehicleDomesticLibrary.getEnergyType());
// 业务子表
LambdaQueryWrapper<LawsVehicleDomesticLibrarySublist> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(LawsVehicleDomesticLibrarySublist::getVehicleId, processVehicleDomesticRelease.getVehicleId());
LawsVehicleDomesticLibrarySublist lawsVehicleDomesticLibrarySublist = lawsVehicleDomesticLibrarySublistService.getOne(queryWrapper);
BeanUtils.copyProperties(lawsVehicleDomesticLibrarySublist, processVehicleDomesticReleaseVo);
result.setBusinessInfoDTO(processVehicleDomesticReleaseVo);
return result;
}
private void startRegulatoryProcess(ProcessInfoVO<ProcessVehicleDomesticReleaseVo> processInfoVO, String processInstanceId) {
ProcessVehicleDomesticReleaseVo businessInfoDTO = processInfoVO.getBusinessInfoDTO();
if (!Objects.isNull(businessInfoDTO)) {
ProcessVehicleDomesticRelease processVehicleDomesticRelease = getOne(new LambdaQueryWrapper<ProcessVehicleDomesticRelease>().eq(ProcessVehicleDomesticRelease::getProcessInstanceId, processInstanceId), false);
LawsVehicleDomesticLibrary lawsVehicleDomesticLibrary = lawsVehicleDomesticLibraryService.getById(processVehicleDomesticRelease.getVehicleId());
lawsVehicleDomesticLibrary.setVehicleModel(businessInfoDTO.getVehicleModel()); // 整车型号
lawsVehicleDomesticLibrary.setVinTopEight(businessInfoDTO.getVinTopEight()); // VIN前八位
lawsVehicleDomesticLibrary.setVehicleBasis(businessInfoDTO.getVehicleBasis()); // 整车型号编制依据
lawsVehicleDomesticLibrary.setVinBasis(businessInfoDTO.getVinBasis()); // VIN编制依据
lawsVehicleDomesticLibrary.setRegulatoryEngineer(UserUtils.getUserId()); // 法规工程师
lawsVehicleDomesticLibraryService.updateById(lawsVehicleDomesticLibrary);
}
}
private Map<String, Object> changeVariables(Map<String, Object> userInfoMap) {
Map<String, Object> map = new HashMap<>();
userInfoMap.forEach((key, value) -> {
if(Objects.equals("checkUserLeader2List",key + "List")){
map.put(key + "List", value);
}
map.put(key, value);
});
return map;
}
private void startNodeBusProcess(ProcessInfoVO<ProcessVehicleDomesticReleaseVo> processInfoVO) {
ProcessVehicleDomesticReleaseVo businessInfoDTO = processInfoVO.getBusinessInfoDTO();
// 保存数据到 国内整车型号及VIN前八位管控库表
LawsVehicleDomesticLibrary lawsVehicleDomesticLibrary = new LawsVehicleDomesticLibrary();
BeanUtils.copyProperties(businessInfoDTO, lawsVehicleDomesticLibrary);
lawsVehicleDomesticLibrary.setIsFinish(Constant.NOT_FINISH); // 流程未完成
lawsVehicleDomesticLibrary.setApplicant(UserUtils.getUserId()); // 流程发起人
lawsVehicleDomesticLibraryService.save(lawsVehicleDomesticLibrary);
String vehicleId = lawsVehicleDomesticLibrary.getId(); // 主表id
// 保存数据到 国内整车型号及VIN前八位管控库子表
LawsVehicleDomesticLibrarySublist lawsVehicleDomesticLibrarySublist = new LawsVehicleDomesticLibrarySublist();
BeanUtils.copyProperties(businessInfoDTO, lawsVehicleDomesticLibrarySublist);
lawsVehicleDomesticLibrarySublist.setVehicleId(vehicleId);
lawsVehicleDomesticLibrarySublistService.save(lawsVehicleDomesticLibrarySublist);
// 保存数据到 国内整车型号及VIN前八位管控库流程表
ProcessVehicleDomesticRelease processVehicleDomesticRelease = new ProcessVehicleDomesticRelease();
processVehicleDomesticRelease.setVehicleId(vehicleId);
processVehicleDomesticRelease.setProcessInstanceId(businessInfoDTO.getProcessInstanceId());
processVehicleDomesticRelease.setCopyUser(businessInfoDTO.getCopyUser());
this.save(processVehicleDomesticRelease);
}
private Map<String, Object> setVariables(Map<String, Object> userInfoMap) {
Map<String, Object> map = new HashMap<>();
// 人员信息
userInfoMap.forEach((key, value) -> {
if(Objects.equals("checkUserLeader1List",key + "List") ||
Objects.equals("checkUserLeader2List",key + "List") ||
Objects.equals("checkUserLeader3List",key + "List") ||
Objects.equals("checkUserLeader4List",key + "List")){
map.put(key, value);
map.put(key + "List", Arrays.asList(value.toString().split(",")));
return;
}
map.put(key, value);
});
return map;
}
private StringBuilder validatorExcel(String energyType, List<?> excelList) {
StringBuilder msg;
if (Constant.FUEL_OIL.equals(energyType)) {
@@ -0,0 +1,135 @@
package com.jero.modules.activiti.process.vehicledomestic.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class ProcessVehicleDomesticReleaseVo {
@ApiModelProperty(value = "主键ID")
private String id;
@ApiModelProperty(value = "流程实例Id")
private String processInstanceId;
@ApiModelProperty(value = "抄送人员")
private String copyUser;
@ApiModelProperty(value = "能源类型")
private String energyType;
@ApiModelProperty(value = "整车型号")
private String vehicleModel;
@ApiModelProperty(value = "vin前八位")
private String vinTopEight;
@ApiModelProperty(value = "整车型号编制依据")
private String vehicleBasis;
@ApiModelProperty(value = "vin编制依据")
private String vinBasis;
@ApiModelProperty(value = "代替整车型号")
private String insteadVehicleModel;
@ApiModelProperty(value = "申请人")
private String applicant;
@ApiModelProperty(value = "完成日期")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date finishDate;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "法规工程师")
private String regulatoryEngineer;
@ApiModelProperty(value = "状态")
private String state;
@ApiModelProperty(value = "车型代码")
private String vehicleTypeCode;
@ApiModelProperty(value = "动力类型")
private String powerType;
@ApiModelProperty(value = "车辆外廓尺寸(长*宽*高)")
private String carOutSize;
@ApiModelProperty(value = "前后标牌")
private String aroundSignage;
@ApiModelProperty(value = "整备质量(教练车)")
private String vehicleQuality;
@ApiModelProperty(value = "驱动型式")
private String drivingType;
@ApiModelProperty(value = "车身形式")
private String bodyType;
@ApiModelProperty(value = "燃料类型")
private String fuelType;
@ApiModelProperty(value = "发动机型号")
private String engineType;
@ApiModelProperty(value = "变速器型式")
private String transmissionType;
@ApiModelProperty(value = "变速器型号")
private String transmissionModel;
@ApiModelProperty(value = "发动机排量(L)")
private String engineCapacity;
@ApiModelProperty(value = "驱动电机型号")
private String driveMotorModel;
@ApiModelProperty(value = "驱动电机峰值功率(kw)")
private String driveMotorPeakPower;
@ApiModelProperty(value = "驱动电机额定功率(kw)")
private String driveMotorRatedPower;
@ApiModelProperty(value = "驱动电机类型")
private String driveMotorType;
@ApiModelProperty(value = "动力电池型号")
private String powerBatteryModel;
@ApiModelProperty(value = "电池类型")
private String batteryType;
@ApiModelProperty(value = "混合方式")
private String mixedModel;
@ApiModelProperty(value = "动力电池组标称电压")
private String powerBatteryVoltage;
@ApiModelProperty(value = "动力电池组总成标称容量")
private String powerBatteryVolume;
@ApiModelProperty(value = "驱动电机的布置位置")
private String driveMotorPlace;
@ApiModelProperty(value = "排放水平")
private String emissionLevel;
@ApiModelProperty(value = "油耗阶段")
private String fuelConsumptionStage;
@ApiModelProperty(value = "前排正面气囊")
private String frontFrontAirbag;
@ApiModelProperty(value = "前排座椅侧气囊")
private String frontSeatSideAirbags;
}
@@ -3,15 +3,40 @@ package com.jero.modules.laws.businessSupport.common;
public interface Constant {
/**
* 整车型号及vin前八位库-状态:现行
* 国内整车型号及vin前八位库-燃料类型:传统燃油
*/
String FUEL_OIL = "1";
/**
* 国内整车型号及vin前八位库-燃料类型:混合动力
*/
String HYBRID_POWER = "2";
/**
* 国内整车型号及vin前八位库-燃料类型:纯电动
*/
String PURE_ELECTRIC = "3";
/**
* 整车型号及vin前八位库-状态:生效
*/
String TAKE_EFFECT = "1";
/**
* 整车型号及vin前八位库-状态:废
* 整车型号及vin前八位库-状态:
*/
String ABOLISH = "2";
/**
* 整车型号及vin前八位库-流程未完成
*/
String NOT_FINISH = "0";
/**
* 整车型号及vin前八位库-流程已完成
*/
String IS_FINISH = "1";
/**
* 法规释疑库-发布状态:未发布
*/
@@ -67,12 +67,15 @@ public class LawsVehicleDomesticLibrary implements Serializable {
@ApiModelProperty(value = "法规工程师")
private String regulatoryEngineer;
@ApiModelProperty(value = "状态")
@ApiModelProperty(value = "状态 1-生效 2-作废")
private String state;
@ApiModelProperty(value = "逻辑删除")
private Integer delFlag;
@ApiModelProperty(value = "流程是否完成 0-未完成 1-已完成")
private String isFinish;
@ApiModelProperty(value = "创建人")
private String createBy;
@@ -97,28 +100,4 @@ public class LawsVehicleDomesticLibrary implements Serializable {
@ApiModelProperty(value = "子表数据")
private LawsVehicleDomesticLibrarySublist lawsVehicleDomesticLibrarySublist;
@ApiModelProperty(value = "发动机型号")
private String engineType;
@ApiModelProperty(value = "变速器型式")
private String transmissionType;
@ApiModelProperty(value = "变速器型号")
private String transmissionModel;
@ApiModelProperty(value = "发动机排量(L)")
private String engineCapacity;
@ApiModelProperty(value = "排放水平")
private String emissionLevel;
@ApiModelProperty(value = "油耗阶段")
private String fuelConsumptionStage;
@ApiModelProperty(value = "前排正面气囊")
private String frontFrontAirbag;
@ApiModelProperty(value = "前排座椅侧气囊")
private String frontSeatSideAirbags;
}
@@ -0,0 +1,173 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
<process id="domestic_vehicle_control_publish" name="国内整车型号和VIN前八位管控流程" isExecutable="true">
<documentation>国内整车型号和VIN前八位管控流程</documentation>
<startEvent id="sid-7fc1abd4-9818-45fe-ac03-52f7deebe198"/>
<userTask id="sid-8605d400-fb36-48db-8249-be0fd4eab8ff" name="发起人发起" activiti:assignee="${importStartUser}"/>
<exclusiveGateway id="sid-ee3b5f18-fd95-4037-af61-a5055283cfa6"/>
<userTask id="sid-c9b1b2a7-a883-468a-aecf-47e86b400b4a" name="起草部门经理审批" activiti:assignee="${checkUserLeader1}"/>
<exclusiveGateway id="sid-879f73b8-1ad7-4ae3-a43a-2dacea4a0fa7"/>
<userTask id="sid-e2712d42-ea23-4ac5-aa40-cd356a092276" name="项目经理审批 " activiti:assignee="${checkUserLeader2}">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="checkUserLeader2List" activiti:elementVariable="checkUserLeader2">
<completionCondition>${!pass}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<userTask id="sid-a70444e4-f061-4fd4-82ec-0ea77b6a9584" name="法规部门处理人审批 " activiti:assignee="${checkUserLeader3}"/>
<exclusiveGateway id="sid-b8e7efdd-31d3-4fee-8585-8489260ba0c9"/>
<userTask id="sid-8683ed8e-3fa4-415f-92c3-c3a591c59528" name="法规部门经理审批 " activiti:assignee="${checkUserLeader4}"/>
<exclusiveGateway id="sid-f7bfdc25-c5f2-4604-8e7a-b812a1890b04"/>
<sequenceFlow id="sid-3a28372b-6cdf-4d82-971b-aab55aa185f4" sourceRef="sid-7fc1abd4-9818-45fe-ac03-52f7deebe198" targetRef="sid-8605d400-fb36-48db-8249-be0fd4eab8ff"/>
<sequenceFlow id="sid-4a0f31fb-1119-4fa9-af29-f3cef2d5b863" sourceRef="sid-8605d400-fb36-48db-8249-be0fd4eab8ff" targetRef="sid-ee3b5f18-fd95-4037-af61-a5055283cfa6"/>
<sequenceFlow id="sid-5190baa6-efdb-4376-9d96-acda5d39e734" sourceRef="sid-ee3b5f18-fd95-4037-af61-a5055283cfa6" targetRef="sid-c9b1b2a7-a883-468a-aecf-47e86b400b4a">
<conditionExpression xsi:type="tFormalExpression"/>
</sequenceFlow>
<sequenceFlow id="sid-5b56a0e6-44b0-48d1-a4d9-74a1e3be017b" sourceRef="sid-c9b1b2a7-a883-468a-aecf-47e86b400b4a" targetRef="sid-f7bfdc25-c5f2-4604-8e7a-b812a1890b04">
<conditionExpression/>
</sequenceFlow>
<sequenceFlow id="sid-42db14bf-ccb0-4fee-958d-d3401b693cdc" sourceRef="sid-f7bfdc25-c5f2-4604-8e7a-b812a1890b04" targetRef="sid-e2712d42-ea23-4ac5-aa40-cd356a092276" name="通过">
<conditionExpression xsi:type="tFormalExpression">${pass}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-59da8e1f-c1c1-4c9a-ac6b-03fa05052dbf" sourceRef="sid-e2712d42-ea23-4ac5-aa40-cd356a092276" targetRef="sid-879f73b8-1ad7-4ae3-a43a-2dacea4a0fa7">
<conditionExpression/>
</sequenceFlow>
<sequenceFlow id="sid-a11e99b0-28e9-4f86-bb9b-62b34a2cacfa" sourceRef="sid-879f73b8-1ad7-4ae3-a43a-2dacea4a0fa7" targetRef="sid-a70444e4-f061-4fd4-82ec-0ea77b6a9584" name="通过">
<conditionExpression xsi:type="tFormalExpression">${pass}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-f0492ae4-c40d-45a3-b2de-ee04982c669e" sourceRef="sid-a70444e4-f061-4fd4-82ec-0ea77b6a9584" targetRef="sid-b8e7efdd-31d3-4fee-8585-8489260ba0c9">
<conditionExpression/>
</sequenceFlow>
<sequenceFlow id="sid-bc36e9c9-27f2-464d-a748-587161b505ae" sourceRef="sid-b8e7efdd-31d3-4fee-8585-8489260ba0c9" targetRef="sid-8683ed8e-3fa4-415f-92c3-c3a591c59528" name="通过">
<conditionExpression xsi:type="tFormalExpression">${pass}</conditionExpression>
</sequenceFlow>
<exclusiveGateway id="sid-8be4e2c2-89d6-4ae3-8e32-11469f8a488a"/>
<endEvent id="sid-fca19eca-d725-4791-91d2-3dca22631c67">
<extensionElements>
<activiti:executionListener event="end" delegateExpression="${ProcessDomesticVehicleEndListener}"/>
</extensionElements>
</endEvent>
<sequenceFlow id="sid-872db765-c1d8-476d-89fc-8ce10e960fa2" sourceRef="sid-8683ed8e-3fa4-415f-92c3-c3a591c59528" targetRef="sid-8be4e2c2-89d6-4ae3-8e32-11469f8a488a"/>
<sequenceFlow id="sid-29c1c062-cfbb-41c3-ae46-e366ee0d0ea3" sourceRef="sid-8be4e2c2-89d6-4ae3-8e32-11469f8a488a" targetRef="sid-fca19eca-d725-4791-91d2-3dca22631c67" name="通过">
<conditionExpression xsi:type="tFormalExpression">${pass}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-541ff5cf-a60a-460b-9fa9-fdf48062cb47" sourceRef="sid-f7bfdc25-c5f2-4604-8e7a-b812a1890b04" targetRef="sid-8605d400-fb36-48db-8249-be0fd4eab8ff" name="驳回">
<conditionExpression xsi:type="tFormalExpression">${!pass}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-b041214e-f7fa-4b8c-80fb-58b4ea60eef7" sourceRef="sid-879f73b8-1ad7-4ae3-a43a-2dacea4a0fa7" targetRef="sid-8605d400-fb36-48db-8249-be0fd4eab8ff" name="驳回">
<conditionExpression xsi:type="tFormalExpression">${!pass}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-cd9eebb7-ae8d-4d3d-96a7-e0c363211664" sourceRef="sid-b8e7efdd-31d3-4fee-8585-8489260ba0c9" targetRef="sid-8605d400-fb36-48db-8249-be0fd4eab8ff" name="驳回">
<conditionExpression xsi:type="tFormalExpression">${!pass}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-aa1436d0-a664-4165-b559-987c080e85fb" sourceRef="sid-8be4e2c2-89d6-4ae3-8e32-11469f8a488a" targetRef="sid-8605d400-fb36-48db-8249-be0fd4eab8ff" name="驳回">
<conditionExpression xsi:type="tFormalExpression">${!pass}</conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_domestic-vehicle">
<bpmndi:BPMNPlane bpmnElement="domestic_vehicle_control_publish" id="BPMNPlane_domestic-vehicle">
<bpmndi:BPMNShape id="shape-706a00ba-14c0-4cf7-af0e-1f2c835b32d0" bpmnElement="sid-7fc1abd4-9818-45fe-ac03-52f7deebe198">
<omgdc:Bounds x="-320.0" y="-27.5" width="30.0" height="30.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-7eeb629e-b541-4d8b-9cf6-d8fb1da97953" bpmnElement="sid-8605d400-fb36-48db-8249-be0fd4eab8ff">
<omgdc:Bounds x="-265.0" y="-35.000008" width="75.0" height="45.00001"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-b30170b1-c4c2-486b-8265-f078551e7d84" bpmnElement="sid-ee3b5f18-fd95-4037-af61-a5055283cfa6">
<omgdc:Bounds x="-165.0" y="-32.5" width="40.0" height="40.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-09d87809-3a05-4ec2-ba2f-aa7a2ad4bdeb" bpmnElement="sid-c9b1b2a7-a883-468a-aecf-47e86b400b4a">
<omgdc:Bounds x="-105.0" y="-35.0" width="80.0" height="45.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-71aebc70-3655-44ff-8870-3b7735df04d1" bpmnElement="sid-879f73b8-1ad7-4ae3-a43a-2dacea4a0fa7">
<omgdc:Bounds x="165.0" y="-32.5" width="40.0" height="40.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-1e533537-8d0a-46f6-9135-9ce0ac1fb2d0" bpmnElement="sid-a70444e4-f061-4fd4-82ec-0ea77b6a9584">
<omgdc:Bounds x="235.0" y="-35.0" width="75.0" height="45.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-2a877952-33fc-4580-b803-18d1fa384e48" bpmnElement="sid-b8e7efdd-31d3-4fee-8585-8489260ba0c9">
<omgdc:Bounds x="330.0" y="-32.5" width="40.0" height="40.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-b9480e1d-6c3b-4578-9149-e406d9625454" bpmnElement="sid-8683ed8e-3fa4-415f-92c3-c3a591c59528">
<omgdc:Bounds x="400.0" y="-35.0" width="75.0" height="45.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-43e4ea71-42a1-45d3-9d1f-cc94d5b99bfa" bpmnElement="sid-f7bfdc25-c5f2-4604-8e7a-b812a1890b04">
<omgdc:Bounds x="0.0" y="-32.5" width="40.0" height="40.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-88308590-6d1d-4964-b009-ae64eb9d351a" bpmnElement="sid-e2712d42-ea23-4ac5-aa40-cd356a092276">
<omgdc:Bounds x="67.5" y="-35.0" width="75.0" height="45.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="edge-bc516af6-2230-4138-bff3-eb4ce0478294" bpmnElement="sid-3a28372b-6cdf-4d82-971b-aab55aa185f4">
<omgdi:waypoint x="-289.99997" y="-12.5"/>
<omgdi:waypoint x="-265.0" y="-12.5"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-07b379d8-9845-4a99-a709-38b39d2d04ab" bpmnElement="sid-4a0f31fb-1119-4fa9-af29-f3cef2d5b863">
<omgdi:waypoint x="-190.0" y="-12.5"/>
<omgdi:waypoint x="-165.0" y="-12.5"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-24f98be5-1496-46c8-a62f-74bf0c08f801" bpmnElement="sid-5190baa6-efdb-4376-9d96-acda5d39e734">
<omgdi:waypoint x="-125.0" y="-12.5"/>
<omgdi:waypoint x="-105.0" y="-12.5"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-bfd9900d-3d71-4fa1-b401-575e1f36c4b0" bpmnElement="sid-5b56a0e6-44b0-48d1-a4d9-74a1e3be017b">
<omgdi:waypoint x="-25.0" y="-12.5"/>
<omgdi:waypoint x="0.0" y="-12.5"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-2ed09466-6d85-4968-8fcb-2b2a1c1659b6" bpmnElement="sid-42db14bf-ccb0-4fee-958d-d3401b693cdc">
<omgdi:waypoint x="40.0" y="-12.5"/>
<omgdi:waypoint x="67.5" y="-12.5"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-7aae95e5-4e50-48aa-8335-ef43e468c384" bpmnElement="sid-59da8e1f-c1c1-4c9a-ac6b-03fa05052dbf">
<omgdi:waypoint x="142.5" y="-12.5"/>
<omgdi:waypoint x="165.0" y="-12.5"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-6ad3fc2c-05d0-401c-8feb-a3a42c5f75e8" bpmnElement="sid-a11e99b0-28e9-4f86-bb9b-62b34a2cacfa">
<omgdi:waypoint x="205.0" y="-12.5"/>
<omgdi:waypoint x="235.0" y="-12.5"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-c082fec3-8097-4f34-933f-c6a6f0ffde2f" bpmnElement="sid-f0492ae4-c40d-45a3-b2de-ee04982c669e">
<omgdi:waypoint x="310.0" y="-12.5"/>
<omgdi:waypoint x="330.0" y="-12.5"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-9c0fbdd0-bf07-409b-ba52-7501bb2c9b70" bpmnElement="sid-bc36e9c9-27f2-464d-a748-587161b505ae">
<omgdi:waypoint x="370.0" y="-12.5"/>
<omgdi:waypoint x="400.0" y="-12.5"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="shape-932edc76-a405-43ea-8031-b628a8ef72b0" bpmnElement="sid-8be4e2c2-89d6-4ae3-8e32-11469f8a488a">
<omgdc:Bounds x="495.0" y="-32.5" width="40.0" height="40.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-52ebaee7-e8ad-4656-8c63-ee203db1a235" bpmnElement="sid-fca19eca-d725-4791-91d2-3dca22631c67">
<omgdc:Bounds x="570.0" y="-27.5" width="30.0" height="30.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="edge-9fb168cf-54f0-4ed1-a111-dff339566dc1" bpmnElement="sid-872db765-c1d8-476d-89fc-8ce10e960fa2">
<omgdi:waypoint x="475.0" y="-12.5"/>
<omgdi:waypoint x="495.0" y="-12.5"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-18b74d0d-362b-4898-9859-1ff66367e7d0" bpmnElement="sid-29c1c062-cfbb-41c3-ae46-e366ee0d0ea3">
<omgdi:waypoint x="535.0" y="-12.5"/>
<omgdi:waypoint x="570.0" y="-12.499998"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-63d0a3e3-567f-441b-a222-5f66a21b5de1" bpmnElement="sid-541ff5cf-a60a-460b-9fa9-fdf48062cb47">
<omgdi:waypoint x="20.0" y="7.5"/>
<omgdi:waypoint x="20.0" y="43.75"/>
<omgdi:waypoint x="-227.5" y="43.75"/>
<omgdi:waypoint x="-227.5" y="10.000008"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-d565573a-7d98-4568-acbe-1b644816824b" bpmnElement="sid-b041214e-f7fa-4b8c-80fb-58b4ea60eef7">
<omgdi:waypoint x="185.0" y="7.5"/>
<omgdi:waypoint x="185.0" y="43.75"/>
<omgdi:waypoint x="-227.5" y="43.749992"/>
<omgdi:waypoint x="-227.49997" y="10.000004"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-d01e2557-105c-4ca0-95dd-1565c8aa5cf7" bpmnElement="sid-cd9eebb7-ae8d-4d3d-96a7-e0c363211664">
<omgdi:waypoint x="350.0" y="7.5"/>
<omgdi:waypoint x="350.00003" y="43.750008"/>
<omgdi:waypoint x="-227.5" y="43.75"/>
<omgdi:waypoint x="-227.5" y="10.000008"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-8a94ed6b-9404-4929-b8ea-d33adb314f86" bpmnElement="sid-aa1436d0-a664-4165-b559-987c080e85fb">
<omgdi:waypoint x="515.0" y="7.5"/>
<omgdi:waypoint x="515.00006" y="43.750004"/>
<omgdi:waypoint x="-227.5" y="43.75"/>
<omgdi:waypoint x="-227.49997" y="10.000004"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>