add 法规采购流程

This commit is contained in:
liao
2023-11-14 15:08:42 +08:00
parent 77929f01b6
commit 70a7ddb2a5
19 changed files with 829 additions and 4 deletions
+20
View File
@@ -416,4 +416,24 @@ CREATE TABLE `process_fb_consultation_list`
alter table process_fb_consultation_list
comment '标准征求意见流程-征求意见列表表';
DROP TABLE IF EXISTS `process_fb_standard_purchase`;
CREATE TABLE `process_fb_standard_purchase`
(
`id` varchar(36) NOT NULL PRIMARY KEY COMMENT '主键ID',
`create_by` varchar(36) COMMENT '创建人',
`create_time` datetime(0) COMMENT '创建时间',
`update_by` varchar(36) COMMENT '更新人',
`update_time` datetime(0) COMMENT '更新时间',
`org_code` varchar(64) COMMENT '所属部门',
`del_flag` int(1) DEFAULT 0 COMMENT '0表示未删除,1表示删除',
`business_id` varchar(50) COMMENT '业务id',
`sort` int(8) COMMENT '排序',
`standard_number` varchar(50) COMMENT '标准编号',
`standard_name` varchar(50) COMMENT '标准名称',
`purchase_reason` varchar(500) COMMENT '采购理由'
) COMMENT = '法规采购流程表';
alter table process_fb_standard_purchase
comment '法规采购流程表';
@@ -14,6 +14,7 @@ public enum ProcessTypeEnum {
FB_ENTRY_CHANGE("标准法规入库/变更流程",1, "com.jero.modules.activiti.process.fb.service.impl.ProcessHandleServiceImpl"),
FB_STANDARD_CONSULTATION("标准征求意见流程",2, "com.jero.modules.activiti.process.fb.service.impl.ProcessFbStandardConsultationServiceImpl"),
FB_STANDARD_PURCHASE("法规采购流程",6, "com.jero.modules.activiti.process.fb.service.impl.ProcessFbStandardPurchaseServiceImpl"),
ES_INIT_CHANGE("企标立项/变更计划",7, "com.jero.modules.activiti.process.esInitChange.service.impl.ProcessEsInitChangeServiceImpl"),
ES_ANNUAL_REPORT("年度制修订计划审批流程(各部门主动上报)",8, "com.jero.modules.activiti.process.esAbolish.service.impl.ProcessEsAbolishServiceImpl"),
ES_ANNUAL_INIT("年度制修订计划审批流程(标准化发起)",9, "com.jero.modules.activiti.process.esAnnualReport.service.impl.ProcessEsAnnualReportServiceImpl"),
@@ -5,9 +5,9 @@ package com.jero.modules.activiti.process.fb.common;
* @Date: 2023/11/13 10:55
* @Description: 标准征求意见流程taskId
*/
public class ConsultationTaskId {
public class ConsultationTaskKey {
private ConsultationTaskId() {}
private ConsultationTaskKey() {}
public static final String ENGINEER_START = "engineer_start"; // 法规工程师发起
@@ -13,4 +13,6 @@ public class ProcessDefinitionKey {
public static final String FB_STANDARD_CONSULTATION = "fb-standard-consultation"; // 标准征求意见流程
public static final String FB_STANDARD_PURCHASE = "fb-standard-purchase"; // 法规采购流程
}
@@ -78,8 +78,8 @@ public class ProcessFbEntryChangeController extends JeroController<ProcessFbEntr
return Result.OK();
}
@AutoLog(value = "流程处理-保存为草稿")
@ApiOperation(value = "流程处理-保存为草稿", notes = "流程处理-保存为草稿")
@AutoLog(value = "标准法规入库_变更流程-保存为草稿")
@ApiOperation(value = "标准法规入库_变更流程-保存为草稿", notes = "标准法规入库_变更流程-保存为草稿")
@PostMapping(value = "/saveToDraft")
public Result<T> saveToDraft(@Validated @RequestBody ProcessInfoVO<ProcessFbEntryChange> processInfoVO) {
processFbEntryChangeService.saveToDraft(processInfoVO);
@@ -18,6 +18,8 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.runtime.ProcessInstance;
import org.apache.poi.ss.formula.functions.T;
import org.apache.shiro.SecurityUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -74,4 +76,20 @@ public class ProcessFbInfoController {
return Result.OK(sentList);
}
@ApiOperation(value = "测试")
@GetMapping("/test")
public Result<T> test() {
List<ProcessInstance> subProcessInstanceList = processHandleService
.subProcessList("20231114120041259", "Activity_0mj9ddw");
System.out.println("================================测试开始=================================");
subProcessInstanceList.forEach(subProcessInstance -> {
System.out.println("Sub Process Instance ID: " + subProcessInstance.getId());
System.out.println("Sub Process Definition Key: " + subProcessInstance.getProcessDefinitionKey());
// 其他子流程实例信息
System.out.println(subProcessInstance.toString());
});
System.out.println("=======================================================================");
return Result.OK();
}
}
@@ -54,4 +54,12 @@ public class ProcessFbStandardConsultationController extends JeroController<Proc
processFbStandardConsultationService.approveTask(processInfoVO, false);
return Result.OK();
}
@AutoLog(value = "标准征求意见流程-提交")
@ApiOperation(value="标准征求意见流程-提交", notes="标准征求意见流程-提交")
@PostMapping("/submit")
public Result<T> submit(@Validated @RequestBody ProcessInfoVO<ProcessFbStandardConsultationVO> processInfoVO) {
processFbStandardConsultationService.submit(processInfoVO);
return Result.OK();
}
}
@@ -0,0 +1,106 @@
package com.jero.modules.activiti.process.fb.controller;
import com.jero.common.api.vo.Result;
import com.jero.common.aspect.annotation.AutoLog;
import com.jero.modules.activiti.process.common.entity.TransferVO;
import com.jero.modules.activiti.process.fb.entity.ProcessFbStandardPurchase;
import com.jero.modules.activiti.process.fb.service.IProcessFbStandardPurchaseService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import com.jero.common.system.base.controller.JeroController;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.Api;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
/**
* @Description: 法规采购流程表
* @Author: jero-boot
* @Date: 2023-11-14
* @Version: V1.0
*/
@Api(tags="法规采购流程表")
@RestController
@RequestMapping("/activiti.process.fb/processFbStandardPurchase")
@Slf4j
public class ProcessFbStandardPurchaseController extends JeroController<ProcessFbStandardPurchase, IProcessFbStandardPurchaseService> {
@Autowired
private IProcessFbStandardPurchaseService processFbStandardPurchaseService;
@GetMapping("/queryProcessInfoVO")
@AutoLog(value = "法规采购流程表-查询流程信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "draftId", value = "草稿id"),
@ApiImplicitParam(name = "processInstanceId", value = "流程实例id")
})
@ApiOperation("法规采购流程表-查询流程信息")
public Result<ProcessInfoVO<List<ProcessFbStandardPurchase>>> queryProcessInfoVO(String draftId, String processInstanceId){
ProcessInfoVO<List<ProcessFbStandardPurchase>> processInfoVO = processFbStandardPurchaseService.queryProcessInfoVO(draftId, processInstanceId);
return Result.OK(processInfoVO);
}
@AutoLog(value = "法规采购流程表-发起流程")
@ApiOperation(value = "法规采购流程表-发起流程", notes = "流程处理-发起流程")
@PostMapping(value = "/startProcess")
public Result<T> startProcess(@Validated @RequestBody ProcessInfoVO<List<ProcessFbStandardPurchase>> processInfoVO) {
processFbStandardPurchaseService.startProcess(processInfoVO);
return Result.OK();
}
@AutoLog(value = "法规采购流程表-同意")
@ApiOperation(value="法规采购流程表-同意", notes="法规采购流程表-同意")
@PostMapping("/agree")
public Result<T> agree(@Validated @RequestBody ProcessInfoVO<List<ProcessFbStandardPurchase>> processInfoVO) {
processFbStandardPurchaseService.approveTask(processInfoVO, true);
return Result.OK();
}
@AutoLog(value = "法规采购流程表-驳回")
@ApiOperation(value="法规采购流程表-驳回", notes="法规采购流程表-驳回")
@PostMapping("/reject")
public Result<T> reject(@Validated @RequestBody ProcessInfoVO<List<ProcessFbStandardPurchase>> processInfoVO) {
processFbStandardPurchaseService.approveTask(processInfoVO, false);
return Result.OK();
}
@AutoLog(value = "法规采购流程表-转办")
@ApiOperation(value="法规采购流程表-转办", notes="法规采购流程表-转办")
@PostMapping(value = "/transfer")
public Result<T> transfer(@RequestBody TransferVO transferVO) {
processFbStandardPurchaseService.transfer(transferVO.getTaskId(), transferVO.getUserId());
return Result.OK();
}
@AutoLog(value = "法规采购流程表-保存为草稿")
@ApiOperation(value = "法规采购流程表-保存为草稿", notes = "法规采购流程表-保存为草稿")
@PostMapping(value = "/saveToDraft")
public Result<T> saveToDraft(@Validated @RequestBody ProcessInfoVO<List<ProcessFbStandardPurchase>> processInfoVO) {
processFbStandardPurchaseService.saveToDraft(processInfoVO);
return Result.OK();
}
@AutoLog(value = "法规采购流程表-导出")
@ApiOperation(value = "法规采购流程表-导出", notes = "法规采购流程表-导出")
@GetMapping(value = "/exportXls")
public ModelAndView exportXls(@RequestParam(name = "businessId") String businessId) {
return processFbStandardPurchaseService.exportXls(businessId);
}
@AutoLog(value = "法规采购流程表-抄送")
@ApiOperation(value = "法规采购流程表-抄送", notes = "法规采购流程表-抄送")
@GetMapping(value = "/carbonCopy")
public Result<T> carbonCopy(@RequestParam(name = "processInstanceId") String processInstanceId,
@RequestParam(name = "userIds") String userIds) {
processFbStandardPurchaseService.carbonCopy(processInstanceId, userIds);
return Result.OK();
}
}
@@ -0,0 +1,74 @@
package com.jero.modules.activiti.process.fb.entity;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 法规采购流程表
* @Author: jero-boot
* @Date: 2023-11-14
* @Version: V1.0
*/
@Data
@TableName("process_fb_standard_purchase")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="process_fb_standard_purchase对象", description="法规采购流程表")
public class ProcessFbStandardPurchase implements Serializable {
private static final long serialVersionUID = 1L;
/**主键ID*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键ID")
private java.lang.String id;
/**创建人*/
@ApiModelProperty(value = "创建人")
private java.lang.String createBy;
/**创建时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "创建时间")
private java.util.Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private java.lang.String updateBy;
/**更新时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "更新时间")
private java.util.Date updateTime;
/**所属部门*/
@ApiModelProperty(value = "所属部门")
private java.lang.String orgCode;
/**0表示未删除,1表示删除*/
@ApiModelProperty(value = "0表示未删除,1表示删除")
private java.lang.Integer delFlag;
/**业务id*/
@ApiModelProperty(value = "业务id")
private java.lang.String businessId;
/**排序*/
@ApiModelProperty(value = "排序")
private java.lang.Integer sort;
/**标准编号*/
@Excel(name = "标准号", width = 15)
@ApiModelProperty(value = "标准编号")
private java.lang.String standardNumber;
/**标准名称*/
@Excel(name = "标准名称", width = 15)
@ApiModelProperty(value = "标准名称")
private java.lang.String standardName;
/**采购理由*/
@ApiModelProperty(value = "采购理由")
private java.lang.String purchaseReason;
}
@@ -0,0 +1,9 @@
package com.jero.modules.activiti.process.fb.listener;
/**
* @Author: liao
* @Date: 2023/11/13 17:01
* @Description: 设置子流程变量名
*/
public class SetVariableListener {
}
@@ -0,0 +1,17 @@
package com.jero.modules.activiti.process.fb.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.jero.modules.activiti.process.fb.entity.ProcessFbStandardPurchase;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 法规采购流程表
* @Author: jero-boot
* @Date: 2023-11-14
* @Version: V1.0
*/
public interface ProcessFbStandardPurchaseMapper extends BaseMapper<ProcessFbStandardPurchase> {
}
@@ -0,0 +1,18 @@
<?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.jero.modules.activiti.process.fb.mapper.ProcessFbStandardPurchaseMapper">
<resultMap id="ProcessFbStandardPurchaseResultMap" type="com.jero.modules.activiti.process.fb.entity.ProcessFbStandardPurchase">
<id column="id" property="id" />
<result column="create_by" property="createBy" />
<result column="create_time" property="createTime" />
<result column="update_by" property="updateBy" />
<result column="update_time" property="updateTime" />
<result column="org_code" property="orgCode" />
<result column="del_flag" property="delFlag" />
<result column="business_id" property="businessId" />
<result column="sort" property="sort" />
<result column="standard_number" property="standardNumber" />
<result column="standard_name" property="standardName" />
<result column="purchase_reason" property="purchaseReason" />
</resultMap>
</mapper>
@@ -26,4 +26,11 @@ public interface IProcessFbStandardConsultationService extends IService<ProcessF
* @Description: 审批
**/
void approveTask(ProcessInfoVO<ProcessFbStandardConsultationVO> processInfoVO, boolean pass);
/**
* @Author: liao
* @Date: 2023/11/13 16:00
* @Description: 提交
**/
void submit(ProcessInfoVO<ProcessFbStandardConsultationVO> processInfoVO);
}
@@ -0,0 +1,66 @@
package com.jero.modules.activiti.process.fb.service;
import com.jero.modules.activiti.process.fb.entity.ProcessFbStandardPurchase;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
/**
* @Description: 法规采购流程表
* @Author: jero-boot
* @Date: 2023-11-14
* @Version: V1.0
*/
public interface IProcessFbStandardPurchaseService extends IService<ProcessFbStandardPurchase> {
/**
* @Author: liao
* @Date: 2023/11/14 14:07
* @Description: 查询流程信息
**/
ProcessInfoVO<List<ProcessFbStandardPurchase>> queryProcessInfoVO(String draftId, String processInstanceId);
/**
* @Author: liao
* @Date: 2023/11/14 14:07
* @Description: 发起流程
**/
void startProcess(ProcessInfoVO<List<ProcessFbStandardPurchase>> processInfoVO);
/**
* @Author: liao
* @Date: 2023/11/14 14:07
* @Description: 审批
**/
void approveTask(ProcessInfoVO<List<ProcessFbStandardPurchase>> processInfoVO, boolean pass);
/**
* @Author: liao
* @Date: 2023/11/14 14:08
* @Description: 转办
**/
void transfer(String taskId, String toUserId);
/**
* @Author: liao
* @Date: 2023/11/14 14:08
* @Description: 保存为草稿
**/
void saveToDraft(ProcessInfoVO<List<ProcessFbStandardPurchase>> processInfoVO);
/**
* @Author: liao
* @Date: 2023/11/14 14:55
* @Description: 导出
**/
ModelAndView exportXls(String businessId);
/**
* @Author: liao
* @Date: 2023/11/14 15:07
* @Description: 抄送
**/
void carbonCopy(String processInstanceId, String userIds);
}
@@ -2,7 +2,9 @@ package com.jero.modules.activiti.process.fb.service;
import com.jero.modules.activiti.process.fb.dto.ProcessDTO;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import org.activiti.engine.runtime.ProcessInstance;
import java.util.List;
import java.util.Map;
/**
@@ -94,4 +96,11 @@ public interface IProcessHandleService {
* @Description: 判断流程是否结束
**/
Boolean isProcessFinish(String processInstanceId);
/**
* @Author: liao
* @Date: 2023/11/14 11:37
* @Description: 获取全部子流程实例
**/
List<ProcessInstance> subProcessList(String superProcessInstanceId, String subProcessDefinitionKey);
}
@@ -1,10 +1,14 @@
package com.jero.modules.activiti.process.fb.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jero.common.api.vo.ResultCommon;
import com.jero.common.util.UUIDUtils;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.fb.common.ConsultationTaskKey;
import com.jero.modules.activiti.process.fb.common.ProcessDefinitionKey;
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.entity.ProcessFbConsultationList;
import com.jero.modules.activiti.process.fb.entity.ProcessFbConsultationUserLink;
import com.jero.modules.activiti.process.fb.entity.ProcessFbStandardConsultation;
import com.jero.modules.activiti.process.fb.mapper.ProcessFbStandardConsultationMapper;
@@ -14,6 +18,9 @@ import com.jero.modules.activiti.process.fb.service.IProcessHandleService;
import com.jero.modules.activiti.process.fb.vo.ProcessFbStandardConsultationVO;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.laws.common.util.CurrentUserUtil;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -41,6 +48,10 @@ public class ProcessFbStandardConsultationServiceImpl extends ServiceImpl<Proces
private IProcessHandleService processHandleService;
@Resource
private IProcessFbConsultationUserLinkService processFbConsultationUserLinkService;
@Resource
private TaskService taskService;
@Resource
private RuntimeService runtimeService;
/**
* @Author: liao
@@ -88,4 +99,63 @@ public class ProcessFbStandardConsultationServiceImpl extends ServiceImpl<Proces
public void approveTask(ProcessInfoVO<ProcessFbStandardConsultationVO> processInfoVO, boolean pass) {
}
/**
* @Author: liao
* @Date: 2023/11/13 16:00
* @Description: 提交
**/
@Override
public void submit(ProcessInfoVO<ProcessFbStandardConsultationVO> processInfoVO) {
BasicTaskInfoDTO taskInfo = processInfoVO.getBasicTaskInfoDTO(); // 任务信息
ProcessFbStandardConsultationVO businessInfoDTO = processInfoVO.getBusinessInfoDTO(); // 全部业务信息
ProcessFbStandardConsultation businessBasicInfo = businessInfoDTO.getProcessFbStandardConsultation(); // 业务基本信息
processInfoVO.setBusinessId(businessBasicInfo.getId());
updateById(businessBasicInfo); // 更新业务基本信息
String taskId = taskInfo.getTaskId();
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String taskDefinitionKey = task.getTaskDefinitionKey(); // 任务定义id
processHandleService.isMyTask(taskId); // 判断是否拥有任务处理权
if (ConsultationTaskKey.DEPART_LEADER_START.equals(taskDefinitionKey)) { // 各部所主管级领导分发
processDepartLeaderStart(processInfoVO);
}
}
/**
* @Author: liao
* @Date: 2023/11/14 9:35
* @Description: 各部所主管级领导分发
**/
private void processDepartLeaderStart(ProcessInfoVO<ProcessFbStandardConsultationVO> processInfoVO) {
ProcessFbStandardConsultationVO businessInfoDTO = processInfoVO.getBusinessInfoDTO(); // 全部业务信息
ProcessFbConsultationUserLink userLink = businessInfoDTO.getProcessFbConsultationUserLink(); // 业务分派信息
LambdaQueryWrapper<ProcessFbConsultationUserLink> removeWrapper = new LambdaQueryWrapper<>();
removeWrapper.eq(ProcessFbConsultationUserLink::getBusinessId, processInfoVO.getBusinessId());
removeWrapper.eq(ProcessFbConsultationUserLink::getDepartLeaderId, CurrentUserUtil.getId());
processFbConsultationUserLinkService.remove(removeWrapper); // 删除原先存储的关联
if ("1".equals(userLink.getUserType())) { // 模块负责人
if (StringUtils.isBlank(userLink.getModuleOwnerId())) {
throw new JeroBootException(ResultCommon.EMPTY_COMMON, "moduleOwnerId");
}
List<String> moduleOwnerIds = Arrays.asList(userLink.getModuleOwnerId().split(","));
List<ProcessFbConsultationUserLink> linkList = new ArrayList<>();
moduleOwnerIds.forEach(moduleOwnerId -> {
ProcessFbConsultationUserLink link = new ProcessFbConsultationUserLink();
link.setBusinessId(processInfoVO.getBusinessId());
link.setDepartLeaderId(CurrentUserUtil.getId());
link.setModuleOwnerId(moduleOwnerId);
linkList.add(link);
});
processFbConsultationUserLinkService.saveBatch(linkList, linkList.size());
} else { // 设计工程师
}
}
}
@@ -0,0 +1,198 @@
package com.jero.modules.activiti.process.fb.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jero.common.api.vo.ResultCommon;
import com.jero.common.system.base.controller.JeroController;
import com.jero.common.util.UUIDUtils;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.fb.common.ProcessDefinitionKey;
import com.jero.modules.activiti.process.fb.dto.BasicProcessInfoDTO;
import com.jero.modules.activiti.process.fb.entity.ProcessFbEntryChange;
import com.jero.modules.activiti.process.fb.entity.ProcessFbStandardPurchase;
import com.jero.modules.activiti.process.fb.mapper.ProcessFbStandardPurchaseMapper;
import com.jero.modules.activiti.process.fb.service.IProcessFbStandardPurchaseService;
import com.jero.modules.activiti.process.fb.service.IProcessHandleService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.laws.common.util.CurrentUserUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jero.common.exception.JeroBootException;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* @Description: 法规采购流程表
* @Author: jero-boot
* @Date: 2023-11-14
* @Version: V1.0
*/
@Service
@Slf4j
@Transactional(rollbackFor = JeroBootException.class)
public class ProcessFbStandardPurchaseServiceImpl extends ServiceImpl<ProcessFbStandardPurchaseMapper, ProcessFbStandardPurchase> implements IProcessFbStandardPurchaseService {
@Resource
private IProcessHandleService processHandleService;
@Value("${jero.path.upload}")
private String upLoadPath;
/**
* @Author: liao
* @Date: 2023/11/14 14:08
* @Description: 查询流程信息
**/
@Override
public ProcessInfoVO<List<ProcessFbStandardPurchase>> queryProcessInfoVO(String draftId, String processInstanceId) {
ProcessInfoVO processInfoVO = processHandleService.queryProcessInfoVO(draftId, processInstanceId);
LambdaQueryWrapper<ProcessFbStandardPurchase> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessFbStandardPurchase::getBusinessId, processInfoVO.getBusinessId());
queryWrapper.orderByAsc(ProcessFbStandardPurchase::getSort);
List<ProcessFbStandardPurchase> purchaseList = list(queryWrapper);
processInfoVO.setBusinessInfoDTO(purchaseList);
return processInfoVO;
}
/**
* @Author: liao
* @Date: 2023/11/14 14:09
* @Description: 发起流程
**/
@Override
public void startProcess(ProcessInfoVO<List<ProcessFbStandardPurchase>> processInfoVO) {
String processName = addBusinessInfo(processInfoVO);// 保存业务信息
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap(); // 用户变量map
userInfoMap.put("engineer", CurrentUserUtil.getId()); // 第一个任务节点设置成自己
BasicProcessInfoDTO basicProcessInfoDTO = processInfoVO.getBasicProcessInfoDTO();
basicProcessInfoDTO.setProcessDefinitionId(processHandleService.getDefinitionIdByKey(ProcessDefinitionKey.FB_STANDARD_PURCHASE)); // 流程定义id
basicProcessInfoDTO.setProcessName(processName); // 流程名称
basicProcessInfoDTO.setProcessType(ProcessTypeEnum.FB_STANDARD_PURCHASE.getValue()); // 流程类型
processHandleService.startProcess(processInfoVO);
}
/**
* @Author: liao
* @Date: 2023/11/14 14:18
* @Description: 添加业务信息
**/
private String addBusinessInfo(ProcessInfoVO<List<ProcessFbStandardPurchase>> processInfoVO) {
List<ProcessFbStandardPurchase> businessInfoList = processInfoVO.getBusinessInfoDTO();
if (CollectionUtils.isEmpty(businessInfoList)) {
throw new JeroBootException(ResultCommon.EMPTY_COMMON, "businessInfo");
}
String businessId = businessInfoList.get(0).getBusinessId();
if (StringUtils.isBlank(businessId)) {
businessId = UUIDUtils.randomUUID20();
}
processInfoVO.setBusinessId(businessId);
for (int i = 0; i < businessInfoList.size(); i++) {
if (StringUtils.isBlank(businessInfoList.get(i).getStandardNumber())) {
throw new JeroBootException(ResultCommon.EMPTY_COMMON, "standardNumber");
}
if (StringUtils.isBlank(businessInfoList.get(i).getStandardName())) {
throw new JeroBootException(ResultCommon.EMPTY_COMMON, "standardName");
}
businessInfoList.get(i).setBusinessId(businessId);
businessInfoList.get(i).setSort(i + 1);
}
LambdaQueryWrapper<ProcessFbStandardPurchase> removeWrapper = new LambdaQueryWrapper<>();
removeWrapper.eq(ProcessFbStandardPurchase::getBusinessId, businessId);
remove(removeWrapper); // 先删除历史数据
saveBatch(businessInfoList, businessInfoList.size()); // 保存到数据库
return businessInfoList.get(0).getStandardNumber() + "-" + businessInfoList.get(0).getStandardName() + "-" + "采购";
}
/**
* @Author: liao
* @Date: 2023/11/14 14:09
* @Description: 审批
**/
@Override
public void approveTask(ProcessInfoVO<List<ProcessFbStandardPurchase>> processInfoVO, boolean pass) {
List<ProcessFbStandardPurchase> businessInfoList = processInfoVO.getBusinessInfoDTO();
processInfoVO.setBusinessId(businessInfoList.get(0).getBusinessId());
processHandleService.approveTask(processInfoVO, pass);
BasicProcessInfoDTO basicProcessInfoDTO = processInfoVO.getBasicProcessInfoDTO();
String processInstanceId = basicProcessInfoDTO.getProcessInstanceId();
// 如果流程结束
if (pass && processHandleService.isProcessFinish(processInstanceId)) {
log.info("《法规采购流程》结束,流程名称:{}", basicProcessInfoDTO.getProcessName());
}
}
/**
* @Author: liao
* @Date: 2023/11/14 14:09
* @Description: 转办
**/
@Override
public void transfer(String taskId, String toUserId) {
processHandleService.transfer(taskId, toUserId);
}
/**
* @Author: liao
* @Date: 2023/11/14 14:09
* @Description: 保存为草稿
**/
@Override
public void saveToDraft(ProcessInfoVO<List<ProcessFbStandardPurchase>> processInfoVO) {
addBusinessInfo(processInfoVO); // 保存业务信息
// 流程信息
BasicProcessInfoDTO basicProcessInfoDTO = processInfoVO.getBasicProcessInfoDTO();
basicProcessInfoDTO.setProcessType(ProcessTypeEnum.FB_STANDARD_PURCHASE.getValue()); // 流程类型
processHandleService.saveToDraft(processInfoVO);
}
/**
* @Author: liao
* @Date: 2023/11/14 14:55
* @Description: 导出
**/
@Override
public ModelAndView exportXls(String businessId) {
LambdaQueryWrapper<ProcessFbStandardPurchase> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessFbStandardPurchase::getBusinessId, businessId);
queryWrapper.orderByAsc(ProcessFbStandardPurchase::getSort);
List<ProcessFbStandardPurchase> exportList = list(queryWrapper); // 准备数据
String title = "法规采购流程";
ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
mv.addObject(JeroController.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
mv.addObject(JeroController.CLASS, ProcessFbStandardPurchase.class);
ExportParams exportParams=new ExportParams(title + "报表", "导出人:" + CurrentUserUtil.getRealName(), title);
exportParams.setImageBasePath(upLoadPath);
mv.addObject(JeroController.PARAMS,exportParams);
mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
return mv;
}
/**
* @Author: liao
* @Date: 2023/11/14 15:07
* @Description: 抄送
**/
@Override
public void carbonCopy(String processInstanceId, String userIds) {
log.info("已发送抄送消息...");
}
}
@@ -96,6 +96,11 @@ public class ProcessHandleServiceImpl implements IProcessHandleService {
// 完成任务
taskService.complete(taskId);
System.out.println("================================流程信息=================================");
System.out.println("流程实例id: " + processInstanceId);
System.out.println("流程实例name: " + processInstance.getName());
System.out.println("=======================================================================");
}
/**
@@ -356,4 +361,17 @@ public class ProcessHandleServiceImpl implements IProcessHandleService {
return false;
}
/**
* @Author: liao
* @Date: 2023/11/14 11:38
* @Description: 获取全部子流程实例
**/
@Override
public List<ProcessInstance> subProcessList(String superProcessInstanceId, String subProcessDefinitionKey) {
return runtimeService.createProcessInstanceQuery()
.superProcessInstanceId(superProcessInstanceId)
.processDefinitionKey(subProcessDefinitionKey)
.list();
}
}
@@ -0,0 +1,184 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:bpmn="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:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="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/test">
<bpmn:process id="fb-standard-purchase" name="法规采购流程" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_1w8ixsw</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:userTask id="Activity_0fmr3id" name="申请采购标准法规" activiti:assignee="${engineer}">
<bpmn:incoming>Flow_1w8ixsw</bpmn:incoming>
<bpmn:incoming>Flow_0o2iuu5</bpmn:incoming>
<bpmn:incoming>Flow_0s4y3m3</bpmn:incoming>
<bpmn:incoming>Flow_0fdb834</bpmn:incoming>
<bpmn:outgoing>Flow_0r9olk3</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_1w8ixsw" sourceRef="StartEvent_1" targetRef="Activity_0fmr3id" />
<bpmn:userTask id="Activity_1fr1x5i" name="发起人主管级领导审批" activiti:assignee="${leader1}">
<bpmn:incoming>Flow_0r9olk3</bpmn:incoming>
<bpmn:outgoing>Flow_0fzcm0e</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_0r9olk3" sourceRef="Activity_0fmr3id" targetRef="Activity_1fr1x5i" />
<bpmn:exclusiveGateway id="Gateway_0nz2dud">
<bpmn:incoming>Flow_0fzcm0e</bpmn:incoming>
<bpmn:outgoing>Flow_1scfly1</bpmn:outgoing>
<bpmn:outgoing>Flow_0o2iuu5</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_0fzcm0e" sourceRef="Activity_1fr1x5i" targetRef="Gateway_0nz2dud" />
<bpmn:userTask id="Activity_06jy4oo" name="标准化主管级领导" activiti:assignee="${leader2}">
<bpmn:incoming>Flow_1scfly1</bpmn:incoming>
<bpmn:outgoing>Flow_074022s</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_1scfly1" name="通过" sourceRef="Gateway_0nz2dud" targetRef="Activity_06jy4oo">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${pass}</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:exclusiveGateway id="Gateway_0yz0e0x">
<bpmn:incoming>Flow_074022s</bpmn:incoming>
<bpmn:outgoing>Flow_1vgiww1</bpmn:outgoing>
<bpmn:outgoing>Flow_0s4y3m3</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_074022s" sourceRef="Activity_06jy4oo" targetRef="Gateway_0yz0e0x" />
<bpmn:userTask id="Activity_1u5337a" name="标准化主管级上一级领导审批" activiti:assignee="${leader3}">
<bpmn:incoming>Flow_1vgiww1</bpmn:incoming>
<bpmn:outgoing>Flow_1d7vhzl</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_1vgiww1" name="通过" sourceRef="Gateway_0yz0e0x" targetRef="Activity_1u5337a">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${pass}</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:exclusiveGateway id="Gateway_158gpae">
<bpmn:incoming>Flow_1d7vhzl</bpmn:incoming>
<bpmn:outgoing>Flow_0u0oqjz</bpmn:outgoing>
<bpmn:outgoing>Flow_0fdb834</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_1d7vhzl" sourceRef="Activity_1u5337a" targetRef="Gateway_158gpae" />
<bpmn:userTask id="Activity_1q01zfq" name="法规工程师确认" activiti:assignee="${engineer}">
<bpmn:incoming>Flow_0u0oqjz</bpmn:incoming>
<bpmn:outgoing>Flow_0j7mfpf</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_0u0oqjz" name="通过" sourceRef="Gateway_158gpae" targetRef="Activity_1q01zfq">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${pass}</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:endEvent id="Event_1n779t0">
<bpmn:incoming>Flow_0j7mfpf</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_0j7mfpf" sourceRef="Activity_1q01zfq" targetRef="Event_1n779t0" />
<bpmn:sequenceFlow id="Flow_0o2iuu5" name="驳回" sourceRef="Gateway_0nz2dud" targetRef="Activity_0fmr3id">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${!pass}</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_0s4y3m3" name="驳回" sourceRef="Gateway_0yz0e0x" targetRef="Activity_0fmr3id">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${!pass}</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_0fdb834" name="驳回" sourceRef="Gateway_158gpae" targetRef="Activity_0fmr3id">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${!pass}</bpmn:conditionExpression>
</bpmn:sequenceFlow>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="fb-standard-purchase">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="239" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0fmr3id_di" bpmnElement="Activity_0fmr3id">
<dc:Bounds x="270" y="217" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1fr1x5i_di" bpmnElement="Activity_1fr1x5i">
<dc:Bounds x="430" y="217" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0nz2dud_di" bpmnElement="Gateway_0nz2dud" isMarkerVisible="true">
<dc:Bounds x="595" y="232" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_06jy4oo_di" bpmnElement="Activity_06jy4oo">
<dc:Bounds x="710" y="217" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0yz0e0x_di" bpmnElement="Gateway_0yz0e0x" isMarkerVisible="true">
<dc:Bounds x="875" y="232" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1u5337a_di" bpmnElement="Activity_1u5337a">
<dc:Bounds x="990" y="217" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_158gpae_di" bpmnElement="Gateway_158gpae" isMarkerVisible="true">
<dc:Bounds x="1155" y="232" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1q01zfq_di" bpmnElement="Activity_1q01zfq">
<dc:Bounds x="1270" y="217" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1n779t0_di" bpmnElement="Event_1n779t0">
<dc:Bounds x="1442" y="239" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_1w8ixsw_di" bpmnElement="Flow_1w8ixsw">
<di:waypoint x="215" y="257" />
<di:waypoint x="270" y="257" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0r9olk3_di" bpmnElement="Flow_0r9olk3">
<di:waypoint x="370" y="257" />
<di:waypoint x="430" y="257" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0fzcm0e_di" bpmnElement="Flow_0fzcm0e">
<di:waypoint x="530" y="257" />
<di:waypoint x="595" y="257" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1scfly1_di" bpmnElement="Flow_1scfly1">
<di:waypoint x="645" y="257" />
<di:waypoint x="710" y="257" />
<bpmndi:BPMNLabel>
<dc:Bounds x="667" y="239" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_074022s_di" bpmnElement="Flow_074022s">
<di:waypoint x="810" y="257" />
<di:waypoint x="875" y="257" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1vgiww1_di" bpmnElement="Flow_1vgiww1">
<di:waypoint x="925" y="257" />
<di:waypoint x="990" y="257" />
<bpmndi:BPMNLabel>
<dc:Bounds x="947" y="239" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1d7vhzl_di" bpmnElement="Flow_1d7vhzl">
<di:waypoint x="1090" y="257" />
<di:waypoint x="1155" y="257" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0u0oqjz_di" bpmnElement="Flow_0u0oqjz">
<di:waypoint x="1205" y="257" />
<di:waypoint x="1270" y="257" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1227" y="239" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0j7mfpf_di" bpmnElement="Flow_0j7mfpf">
<di:waypoint x="1370" y="257" />
<di:waypoint x="1442" y="257" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0o2iuu5_di" bpmnElement="Flow_0o2iuu5">
<di:waypoint x="620" y="232" />
<di:waypoint x="620" y="190" />
<di:waypoint x="350" y="190" />
<di:waypoint x="350" y="217" />
<bpmndi:BPMNLabel>
<dc:Bounds x="476" y="172" width="21" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0s4y3m3_di" bpmnElement="Flow_0s4y3m3">
<di:waypoint x="900" y="232" />
<di:waypoint x="900" y="150" />
<di:waypoint x="330" y="150" />
<di:waypoint x="330" y="217" />
<bpmndi:BPMNLabel>
<dc:Bounds x="606" y="132" width="21" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0fdb834_di" bpmnElement="Flow_0fdb834">
<di:waypoint x="1180" y="232" />
<di:waypoint x="1180" y="100" />
<di:waypoint x="310" y="100" />
<di:waypoint x="310" y="217" />
<bpmndi:BPMNLabel>
<dc:Bounds x="736" y="82" width="21" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>