From bc42bfbbe1374431bb7a03ca48798307c5a4014b Mon Sep 17 00:00:00 2001 From: caihaohan Date: Thu, 10 Oct 2024 10:14:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9C=A8=E7=BA=BF=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=8E=A5=E6=94=B6=E6=94=B9=E4=B8=BA=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E4=B8=BB=E5=8A=A8=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oss/service/impl/OSSFileServiceImpl.java | 1 - .../process/common/enums/ProcessType.java | 6 +- .../SpecialEsApprovalTaskNodeIdConstant.java | 25 ++ .../SpecialEsApprovalController.java | 73 +++++ .../entity/ProcessSpecialEsApproval.java | 127 +++++++ .../ProcessSpecialEsApprovalEndListener.java | 90 +++++ .../ProcessSpecialEsApprovalMapper.java | 18 + .../service/SpecialEsApprovalService.java | 21 ++ .../impl/SpecialEsApprovalServiceImpl.java | 310 ++++++++++++++++++ .../controller/OnlyOfficeController.java | 93 +++++- 10 files changed, 744 insertions(+), 20 deletions(-) create mode 100644 laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/common/SpecialEsApprovalTaskNodeIdConstant.java create mode 100644 laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/controller/SpecialEsApprovalController.java create mode 100644 laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/entity/ProcessSpecialEsApproval.java create mode 100644 laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/listener/ProcessSpecialEsApprovalEndListener.java create mode 100644 laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/mapper/ProcessSpecialEsApprovalMapper.java create mode 100644 laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/service/SpecialEsApprovalService.java create mode 100644 laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/service/impl/SpecialEsApprovalServiceImpl.java diff --git a/laws-module-system/src/main/java/com/jero/modules/oss/service/impl/OSSFileServiceImpl.java b/laws-module-system/src/main/java/com/jero/modules/oss/service/impl/OSSFileServiceImpl.java index cafdae42..9656e038 100644 --- a/laws-module-system/src/main/java/com/jero/modules/oss/service/impl/OSSFileServiceImpl.java +++ b/laws-module-system/src/main/java/com/jero/modules/oss/service/impl/OSSFileServiceImpl.java @@ -365,7 +365,6 @@ public class OSSFileServiceImpl extends ServiceImpl impl @Override public Result outUpload(HttpServletRequest request) { Result result = new Result<>(); - String savePath = ""; String bizPath = request.getParameter("biz"); //sys/common/upload接口存在任意文件上传漏洞 diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/common/enums/ProcessType.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/common/enums/ProcessType.java index 164169fc..f577bc3d 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/common/enums/ProcessType.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/common/enums/ProcessType.java @@ -21,7 +21,11 @@ public enum ProcessType { DOMESTIC_VEHICLE_CONTROL_PUBLISH("国内整车型号和VIN前八位管控流程", "8", "domestic_vehicle_control_publish", "ProcessVehicleDomesticReleaseServiceImpl"), PLAN_CHANGE("企业标准计划变更流程", "9", "process-plan-change", "ProcessPlanChangeService"), INTERNATIONAL_VEHICLE_CONTROL_PUBLISH("国际整车型号和VIN前八位管控流程", "10", "international_vehicle_control_publish", "ProcessVehicleInternationalReleaseServiceImpl"), - PART_TYPE_APPLY("关键零部件型号申请流程", "11", "part_type_apply","ProcessPartTypeApplyServiceImpl") + PART_TYPE_APPLY("关键零部件型号申请流程", "11", "part_type_apply","ProcessPartTypeApplyServiceImpl"), + SPECIAL_ES_APPROVAL("专业技术企业标准报批流程", "12", "special_es_approval", "ProcessSpecialEsApprovalServiceImpl"), + MACHINE_ES_APPROVAL("产品标准-整车企业标准报批流程", "13", "machine_es_approval", "ProcessMachineEsApprovalServiceImpl"), + ES_CAR_APPROVAL("产品标准-整机企业标准报批流程", "14", "es_car_approval", "ProcessEsCarApprovalServiceImpl"), + ES_RECHECK("企标复审流程", "15", "es_recheck", "ProcessEsRecheckServiceImpl"), ; private final String name; diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/common/SpecialEsApprovalTaskNodeIdConstant.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/common/SpecialEsApprovalTaskNodeIdConstant.java new file mode 100644 index 00000000..62dd05d0 --- /dev/null +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/common/SpecialEsApprovalTaskNodeIdConstant.java @@ -0,0 +1,25 @@ +package com.jero.modules.activiti.process.specialEsApproval.common; + +/** + * @author: Mzaxd + * @Date: 2023/12/19 15:14 + */ +public class SpecialEsApprovalTaskNodeIdConstant { + + /** 法规工程师确认是否开启征求意见 */ + public static final String CONFIRM_ADVISE = "Activity_1siuksf"; + /** 设计工程师填写意见 */ + public static final String ADVICE = "Activity_04m430n"; + /** 法规工程师汇总数据 */ + public static final String ADVICE_COLLECT = "Activity_1riqzkp"; + /** 法规工程师派号 */ + public static final String SET_STANDARD_NUMBER = "Activity_11uuyg0"; + /** 主起草人 */ + public static final String MAIN_DRAFT_USER = "mainDraftUser"; + /** 法规工程师 */ + public static final String STANDARD_ENGINEER = "standardEngineer"; + /** 征求意见人员 */ + public static final String ADVICE_USER_LIST = "adviceUserList"; + /** 开启征求意见 */ + public static final String OPEN = "open"; +} diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/controller/SpecialEsApprovalController.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/controller/SpecialEsApprovalController.java new file mode 100644 index 00000000..47e41016 --- /dev/null +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/controller/SpecialEsApprovalController.java @@ -0,0 +1,73 @@ +package com.jero.modules.activiti.process.specialEsApproval.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.specialEsApproval.entity.ProcessSpecialEsApproval; +import com.jero.modules.activiti.process.specialEsApproval.service.SpecialEsApprovalService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + + +/** + * @author: Mzaxd + * @Date: 2023/10/18 10:44 + */ +@Slf4j +@RestController +@Api(tags = "企标制修订征求意见流程") +@RequestMapping("/process/es/specialEsApproval") +public class SpecialEsApprovalController { + + @Resource + private SpecialEsApprovalService revisionService; + + @Resource + private ActFlowCommonService actFlowCommonService; + + /** + * 企标制修订流程 + * + * @param processInfoVO + */ + @AutoLog(value = "企标制修订流程-发起流程") + @ApiOperation(value="企标制修订流程-发起流程", notes="企标制修订流程-发起流程") + @PostMapping("/start") + public Result startProcess(@RequestBody ProcessInfoVO processInfoVO) { + revisionService.startProcess(processInfoVO); + return Result.OK(); + } + + @AutoLog(value = "企标制修订流程-提交") + @ApiOperation(value = "企标制修订流程-提交", notes = "企标制修订流程-提交") + @PostMapping("/submit") + public Result submit(@RequestBody ProcessInfoVO processInfoVO) { + revisionService.submit(processInfoVO); + return Result.OK(); + } + + /** + * 保存到待办 + * @param taskId + */ + @AutoLog(value = "企标制修订流程-办理") + @ApiOperation(value="企标制修订流程-办理", notes="企标制修订流程-办理") + @GetMapping("/handle/{taskId}") + @Translation + public Result handle(@PathVariable("taskId") String taskId) { + ProcessDraft draft = actFlowCommonService.getExistDraftByTaskId(taskId, ProcessTypeEnum.ES_REVISION_ADVICE); + if (draft != null) { + return Result.OK(draft); + } + return Result.OK(revisionService.getHandleData(taskId)); + } +} diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/entity/ProcessSpecialEsApproval.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/entity/ProcessSpecialEsApproval.java new file mode 100644 index 00000000..70397a66 --- /dev/null +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/entity/ProcessSpecialEsApproval.java @@ -0,0 +1,127 @@ +package com.jero.modules.activiti.process.specialEsApproval.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * + * @TableName process_es_revision + */ +@TableName(value ="process_es_revision") +@Data +public class ProcessSpecialEsApproval implements Serializable { + /** + * 主键ID + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键ID") + private String id; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private Date createTime; + + /** + * 更新人 + */ + @ApiModelProperty(value = "更新人") + private String updateBy; + + /** + * 更新时间 + */ + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + /** + * 所属部门 + */ + @ApiModelProperty(value = "所属部门") + private String orgCode; + + /** + * 0表示未删除,1表示删除 + */ + @ApiModelProperty(value = "0表示未删除,1表示删除") + private Integer delFlag; + + /** + * 企标计划Id + */ + @ApiModelProperty(value = "企标计划Id") + private String espId; + + /** + * 流程实例Id + */ + @ApiModelProperty(value = "流程实例Id") + private String processInstanceId; + + /** + * 是否开启征求意见 0不征求 1征求 + */ + @TableField(exist = false) + @ApiModelProperty(value = "是否开启征求意见 0不征求 1征求") + private String adviceFlag; + + /** + * 征求意见截止日期 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty(value = "征求意见截止日期") + private Date adviceDeadline; + + /** + * 在线编辑文件id + */ + @ApiModelProperty(value = "在线编辑文件id") + private String onEditFile; + + /** + * 业务json数据 + */ + @ApiModelProperty(value = "业务JSON数据") + private String businessJson; + + /** + * 主起草人 + */ + @TableField(exist = false) + @ApiModelProperty(value = "主起草人") + private String mainDraftUser; + + /** + * 法规工程师 + */ + @TableField(exist = false) + @ApiModelProperty(value = "法规工程师") + private String standardEngineer; + + /** + * 设计工程师 + */ + @TableField(exist = false) + @ApiModelProperty(value = "设计工程师") + private String adviceUsers; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/listener/ProcessSpecialEsApprovalEndListener.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/listener/ProcessSpecialEsApprovalEndListener.java new file mode 100644 index 00000000..c94436f9 --- /dev/null +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/listener/ProcessSpecialEsApprovalEndListener.java @@ -0,0 +1,90 @@ +package com.jero.modules.activiti.process.specialEsApproval.listener; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.jero.modules.activiti.process.common.enums.StandardStateEnum; +import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionAdviceService; +import com.jero.modules.activiti.process.specialEsApproval.entity.ProcessSpecialEsApproval; +import com.jero.modules.activiti.process.specialEsApproval.service.SpecialEsApprovalService; +import com.jero.modules.laws.common.constant.FieldCommon; +import com.jero.modules.laws.common.service.ILawsCommonService; +import com.jero.modules.oss.service.IOSSFileService; +import com.jero.modules.tag.enums.TableNameEnum; +import lombok.SneakyThrows; +import org.activiti.engine.delegate.DelegateExecution; +import org.activiti.engine.delegate.ExecutionListener; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * @author: Mzaxd + * @Date: 2023/12/19 11:59 + */ +@Component +public class ProcessSpecialEsApprovalEndListener implements ExecutionListener { + + @Resource + private SpecialEsApprovalService esRevisionService; + + @Resource + private EsRevisionAdviceService esAdviceService; + + @Resource + private ILawsCommonService lawsCommonService; + + @Resource + private IOSSFileService ossFileService; + + @Resource + private EsRevisionAdviceService revisionAdviceService; + + @Value(value = "${jero.uploadType}") + private String uploadType; + + @SneakyThrows + @Override + public void notify(DelegateExecution delegateExecution) { +// // 获取流程实例Id +// String processInstanceId = delegateExecution.getProcessInstanceId(); +// // 根据流程Id获取业务数据 +// LambdaQueryWrapper revisionWrapper = new LambdaQueryWrapper<>(); +// revisionWrapper.eq(ProcessSpecialEsApproval::getProcessInstanceId, processInstanceId); +// // 获取企标相关数据 +// ProcessSpecialEsApproval data = esRevisionService.getOne(revisionWrapper); +// // 将数据转换为Map +// Map variables = transMap(data); +// Date adviceDeadline = data.getAdviceDeadline(); +// if (adviceDeadline != null) { +// // 制作征求意见稿 +// String draftFileId = this.makeDraftFile(data); +// variables.put(FieldCommon.FILE_DRAFT_FOR_COMMENT, draftFileId); +// } +// // 发布企标 +// String esId = lawsCommonService.commonAdd(variables); +// // 所有意见设置标准Id +// LambdaQueryWrapper adviceWrapper = new LambdaQueryWrapper<>(); +// adviceWrapper.eq(EsRevisionAdvice::getProcessInstanceId, processInstanceId); +// List list = esAdviceService.list(adviceWrapper); +// if (!list.isEmpty()) { +// list.forEach(item -> item.setStandardId(esId)); +// esAdviceService.updateBatchById(list); +// } +// // 更改企标计划状态 + } + + private Map transMap(ProcessSpecialEsApproval data) { + Map variables = JSON.parseObject(data.getBusinessJson(), Map.class); + variables.put(FieldCommon.MODULE, TableNameEnum.ENTERPRISE_STANDARDS.getValue()); + // 标准状态 + variables.put(FieldCommon.STANDARD_STATE, StandardStateEnum.SEEK_FOR_OPINIONS.getStateValue()); + String standardId = IdWorker.getIdStr(); + variables.put(FieldCommon.ID, standardId); + String onEditFile = data.getOnEditFile(); + // 发布稿 + variables.put(FieldCommon.FILE_PUBLISH_OF_ORIGINAL, onEditFile); + return variables; + } +} diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/mapper/ProcessSpecialEsApprovalMapper.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/mapper/ProcessSpecialEsApprovalMapper.java new file mode 100644 index 00000000..f0399dbb --- /dev/null +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/mapper/ProcessSpecialEsApprovalMapper.java @@ -0,0 +1,18 @@ +package com.jero.modules.activiti.process.specialEsApproval.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.jero.modules.activiti.process.specialEsApproval.entity.ProcessSpecialEsApproval; + +/** +* @author ThinkBook +* @description 针对表【process_es_revision】的数据库操作Mapper +* @createDate 2023-12-19 11:58:59 +* @Entity com.jero.modules.activiti.process.esRevision.entity.EsRevision +*/ +public interface ProcessSpecialEsApprovalMapper extends BaseMapper { + +} + + + + diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/service/SpecialEsApprovalService.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/service/SpecialEsApprovalService.java new file mode 100644 index 00000000..81f9a74a --- /dev/null +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/service/SpecialEsApprovalService.java @@ -0,0 +1,21 @@ +package com.jero.modules.activiti.process.specialEsApproval.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO; +import com.jero.modules.activiti.process.specialEsApproval.entity.ProcessSpecialEsApproval; + +/** + * @author ThinkBook + * @description 针对表【process_es_revision】的数据库操作Service + * @createDate 2023-12-19 11:58:59 + */ +public interface SpecialEsApprovalService extends IService { + + + ProcessInfoVO getHandleData(String taskId); + + void startProcess(ProcessInfoVO processInfoVO); + + void submit(ProcessInfoVO processInfoVO); +} diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/service/impl/SpecialEsApprovalServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/service/impl/SpecialEsApprovalServiceImpl.java new file mode 100644 index 00000000..fbb1a43c --- /dev/null +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/specialEsApproval/service/impl/SpecialEsApprovalServiceImpl.java @@ -0,0 +1,310 @@ +package com.jero.modules.activiti.process.specialEsApproval.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jero.common.api.SendMessageAPI; +import com.jero.common.api.dto.message.SendMessageDTO; +import com.jero.common.api.vo.ResultCommon; +import com.jero.common.exception.JeroBootException; +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.common.enums.ProcessType; +import com.jero.modules.activiti.process.common.service.ActFlowCommonService; +import com.jero.modules.activiti.process.esRevisionAdvice.entity.EsRevisionAdvice; +import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionAdviceService; +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.specialEsApproval.entity.ProcessSpecialEsApproval; +import com.jero.modules.activiti.process.specialEsApproval.mapper.ProcessSpecialEsApprovalMapper; +import com.jero.modules.activiti.process.specialEsApproval.service.SpecialEsApprovalService; +import com.jero.modules.activiti.service.ProcessAllService; +import com.jero.modules.activiti.service.ProcessNodeLinkService; +import com.jero.modules.laws.common.constant.MessageTemplateCodeCommon; +import com.jero.modules.laws.enterprise.entity.ESPProjectStatus; +import com.jero.modules.laws.enterprise.entity.EnterpriseStandardPlan; +import com.jero.modules.laws.enterprise.service.EnterpriseStandardPlanService; +import com.jero.modules.laws.enterprise.util.EnterpriseStandardUtil; +import com.jero.modules.laws.standard.service.ILawsEnterpriseStandardService; +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.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.jero.modules.activiti.process.esRevisionAdvice.common.RevisionTaskNodeIdConstant.*; + +/** + * @author ThinkBook + * @description 针对表【process_es_revision】的数据库操作Service实现 + * @createDate 2023-12-19 11:58:59 + */ +@Service +@Slf4j +@Transactional(rollbackFor = JeroBootException.class) +public class SpecialEsApprovalServiceImpl extends ServiceImpl + implements SpecialEsApprovalService { + + @Resource + private ActFlowCommonService actFlowCommonService; + + @Resource + private ProcessNodeLinkService processNodeLinkService; + + @Resource + private RuntimeService runtimeService; + + @Resource + private IProcessHandleService processHandleService; + + @Resource + private ProcessAllService processAllService; + + @Resource + private TaskService taskService; + + @Resource + private EnterpriseStandardPlanService espService; + + @Resource + private EsRevisionAdviceService adviceService; + + @Resource + private SendMessageAPI sendMessageAPI; + + @Resource + private ILawsEnterpriseStandardService esService; + + @Resource + private EnterpriseStandardPlanService planService; + + @Resource + private EnterpriseStandardUtil esUtil; + + @Override + public void startProcess(ProcessInfoVO processInfoVO) { + // 流程Key + String processDefinitionKey = ProcessType.ES_REVISION_ADVICE.getProcessKey(); + // 流程信息 + BasicProcessInfoDTO processInfo = processInfoVO.getBasicProcessInfoDTO(); + // 任务信息 + BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO(); + // 人员信息 + Map userInfoMap = processInfoVO.getUserInfoMap(); + // 当前用户Id + String userId = UserUtils.getUserId(); + // 设置流程变量 + Map actVariables = this.setVariables(processInfoVO); + // 删除草稿 + actFlowCommonService.getExistDraftAndRemove(processInfoVO.getDraftId()); + // 启动流程 + ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, actVariables); + // 获取流程实例ID + String processDefinitionId = processInstance.getProcessDefinitionId(); + String processInstanceId = processInstance.getId(); + processInfo.setProcessInstanceId(processInstanceId); + processInfo.setProcessDefinitionId(processDefinitionId); + processInfo.setProcessType(ProcessTypeEnum.ES_REVISION_ADVICE.getValue()); + // 第一个节点业务数据处理 + this.startNodeBusProcess(processInfoVO); + // 保存选人信息 + processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, userInfoMap); + // 获取第一个任务的taskId + String taskId = actFlowCommonService.getFirstTaskId(processInstanceId, userId, processDefinitionId); + processTask.setTaskId(taskId); + // 保存第一个节点的草稿 + processHandleService.saveToDraft(processInfoVO, userId); + // 保存第一个节点的快照 + processHandleService.saveToSnapshot(processInfoVO, userId); + // 更新审批表为完成,填充数据 + actFlowCommonService.updateApprovalInfo(processTask, taskId); + // 根据流程实例id更新流程总表 + actFlowCommonService.updateProcessAll(processInfo); + // 自动完成第一个任务 + actFlowCommonService.completeTask(taskId, userId); + } + + private void startNodeBusProcess(ProcessInfoVO processInfoVO) { + String processInstanceId = processInfoVO.getBasicProcessInfoDTO().getProcessInstanceId(); + ProcessSpecialEsApproval processInfo = processInfoVO.getBusinessInfoDTO(); + // 修改企标计划状态 + // 检查企标计划是否已被删除 + String espId = processInfo.getEspId(); + EnterpriseStandardPlan esp = espService.getById(espId); + if (esp == null) { + throw new JeroBootException(ResultCommon.INVALID_ESP); + } + // 设置状态为运行中 + espService.updateProjectStatus(espId, ESPProjectStatus.IN_PROGRESS.getValue()); + // 保存数据 + processInfo.setProcessInstanceId(processInstanceId); + save(processInfo); + } + + private Map setVariables(ProcessInfoVO processInfoVO) { + Map userInfoMap = processInfoVO.getUserInfoMap(); + // 获取分发人 + return new HashMap<>(userInfoMap); + } + + @Override + public ProcessInfoVO getHandleData(String taskId) { + if (!actFlowCommonService.taskExists(taskId)) { + throw new JeroBootException(ResultCommon.TASK_NOT_EXISTS); + } + ProcessInfoVO result = new ProcessInfoVO<>(); + ProcessSpecialEsApproval processVo = new ProcessSpecialEsApproval(); + // 使用流程引擎根据taskId找到流程实例Id + String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId); + result.setBasicProcessInfoDTO(actFlowCommonService.getProcessInfo(processInstanceId)); + // 获取流程通用数据 + ProcessApprovalRecord record = actFlowCommonService.getNodeIdByTaskId(taskId); + // 获取当前流程数据 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProcessSpecialEsApproval::getProcessInstanceId, processInstanceId); + ProcessSpecialEsApproval data = getOne(queryWrapper); + // 获取当前流程 + String xmlNodeId = record.getNodeId(); + // 设置流程信息 + switch (xmlNodeId) { + case CONFIRM_ADVISE: + case ADVICE: + case SET_STANDARD_NUMBER: + break; + } + // 设置流程变量等相关信息 +// processVo.setProcessInfo(data); + result.setBusinessInfoDTO(processVo); + return result; + } + + @Override + public void submit(ProcessInfoVO processInfoVO) { +// BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO(); +// String taskId = processTask.getTaskId(); +// // 校验是否有权限操作此待办 +// processHandleService.validTask(taskId); +// // 获取当前节点的id +// ProcessApprovalRecord record = actFlowCommonService.getNodeIdByTaskId(taskId); +// String xmlNodeId = record.getNodeId(); +// String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId); +// BasicProcessInfoDTO processInfo = new BasicProcessInfoDTO(); +// // 使用流程引擎根据taskId找到流程实例Id +// String mainInstanceId = (String) taskService.getVariable(taskId, MAIN_INSTANCE_ID); +// processInfo.setProcessInstanceId(mainInstanceId); +// processInfoVO.setBasicProcessInfoDTO(processInfo); +// // 更新审批表为完成,填充数据 +// actFlowCommonService.updateApprovalInfo(processTask, taskId); +// String curUserId = UserUtils.getUserId(); +// ProcessSpecialEsApproval businessInfoDTO = processInfoVO.getBusinessInfoDTO(); +//// ProcessSpecialEsApproval data = businessInfoDTO.getProcessInfo(); +//// List adviceList = businessInfoDTO.getAdviceList(); +// // 根据流程实例Id获取流程定义ID +// ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); +// // 获取数据库中的流程信息 +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(ProcessSpecialEsApproval::getProcessInstanceId, processInstanceId); +// ProcessSpecialEsApproval dataFromDb = getOne(queryWrapper); +// if (dataFromDb != null) { +// data.setId(dataFromDb.getId()); +// } +// // 获取流程实例ID +// String processDefinitionId = processInstance.getProcessDefinitionId(); +// Map userMap = new HashMap<>(); +// LambdaQueryWrapper detailQueryWrapper = new LambdaQueryWrapper<>(); +// detailQueryWrapper.eq(EsRevisionAdvice::getProcessInstanceId, processInstanceId); +// List dbAdviceList = adviceService.list(detailQueryWrapper); +// // 筛选出最新一轮 +// Integer maxBatchNum = this.calculateAdviceBatchNum(dbAdviceList); +// switch (xmlNodeId) { +// case CONFIRM_ADVISE: +// // 判断是否开启征求意见子流程 设置流程变量 +// boolean adviceFlag = !data.getAdviceFlag().equals(YesOrNoEnum.NO.getValue()); +// if (adviceFlag) { +// List adviceUserList = Arrays.asList(data.getAdviceUsers().split(",")); +// taskService.setVariable(taskId, ADVICE_USER_LIST, adviceUserList); +// taskService.setVariable(taskId, STANDARD_ENGINEER, curUserId); +// taskService.setVariable(taskId, OPEN, true); +// // 保存流程数据 +// saveOrUpdate(data); +// userMap.put(STANDARD_ENGINEER, curUserId); +// userMap.put(ADVICE_USER_LIST, data.getAdviceUsers()); +// processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, userMap); +// } else { +// taskService.setVariable(taskId, OPEN, false); +// } +// break; +// case SET_STANDARD_NUMBER: +// // 判断标准编号是否重复 +// Map variables = JSON.parseObject(data.getBusinessJson(), Map.class); +// // 根据派号字段重新生成标准编号 +// String standardNumberTmp = (String) variables.get(FieldCommon.STANDARD_NUMBER_TEMP); +// String standardNumber = ""; +// if (StringUtils.isNotBlank(standardNumberTmp)) { +// // 组合企标编号 +// standardNumber = esUtil.combineStandardNumber(variables); +// } else { +// // 生成企标编号 +// standardNumber = esUtil.generateStandardNumber(variables); +// standardNumberTmp = EnterpriseStandardUtil.getSequenceNoFromStandardNo(standardNumber); +// } +// variables.put(FieldCommon.STANDARD_NUMBER, standardNumber); +// variables.put(FieldCommon.STANDARD_NUMBER_TEMP, standardNumberTmp); +// // 重新序列化为json +// data.setBusinessJson(JSON.toJSONString(variables)); +// // 校验重复 +// LambdaQueryWrapper esQueryWrapper = new LambdaQueryWrapper<>(); +// esQueryWrapper.eq(LawsEnterpriseStandard::getStandardNumber, standardNumber); +// LawsEnterpriseStandard es = esService.getOne(esQueryWrapper); +// if (Objects.nonNull(es)) { +// throw new JeroBootException(ResultCommon.STANDARD_NUMBER_ALREADY_EXISTS); +// } +// LambdaQueryWrapper planQueryWrapper = new LambdaQueryWrapper<>(); +// planQueryWrapper.eq(EnterpriseStandardPlan::getStandardNumber, standardNumber); +// EnterpriseStandardPlan plan = planService.getOne(planQueryWrapper); +// if (Objects.nonNull(plan)) { +// throw new JeroBootException(ResultCommon.STANDARD_NUMBER_ALREADY_EXISTS); +// } +// // 保存数据 +// updateById(data); +// break; +// } + // 审批节点 +// actFlowCommonService.completeTask(taskId, curUserId); +// // 更新审批表为完成,填充数据 +// actFlowCommonService.updateApprovalInfo(processTask, taskId); +// // 删除草稿 +// actFlowCommonService.removeDraft(curUserId, taskId, processInstanceId); +// // 保存快照 +// processHandleService.saveToSnapshot(processInfoVO, curUserId); + } + + private Integer calculateAdviceBatchNum(List adviceList) { + return adviceList.stream().mapToInt(EsRevisionAdvice::getBatchNum).max().orElse(0); + } + + private void sendMessageToMainDraftUser(String mainDraftUser, String processInstanceId, Integer maxBatchNum) { + ProcessAll processAll = processAllService.getByProcessInstanceId(processInstanceId); + SendMessageDTO sendMessageDTO = new SendMessageDTO(); + sendMessageDTO.setTemplateCode(MessageTemplateCodeCommon.ES_REVISION_ADVICE); + sendMessageDTO.setToUserId(mainDraftUser); + Map sendMap = new HashMap<>(); + sendMap.put("prcNum", processAll.getPrcNum()); + sendMap.put("batchNum", maxBatchNum.toString()); + sendMessageDTO.setMap(sendMap); + sendMessageAPI.sendMessage(sendMessageDTO); + } +} + + + + diff --git a/laws-modules/src/main/java/com/jero/modules/onlyoffice/controller/OnlyOfficeController.java b/laws-modules/src/main/java/com/jero/modules/onlyoffice/controller/OnlyOfficeController.java index be52b38e..d83c6ab0 100644 --- a/laws-modules/src/main/java/com/jero/modules/onlyoffice/controller/OnlyOfficeController.java +++ b/laws-modules/src/main/java/com/jero/modules/onlyoffice/controller/OnlyOfficeController.java @@ -4,6 +4,7 @@ import cn.hutool.core.io.IoUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.jero.common.api.vo.Result; import com.jero.common.api.vo.ResultCommon; +import com.jero.common.util.IntekeyUtils; import com.jero.common.util.MessageUtils; import com.jero.common.util.obs.ObsBootUtil; import com.jero.modules.onlyoffice.entity.ProcessFile; @@ -16,15 +17,16 @@ import com.sini.com.spire.doc.documents.PageOrientation; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.mock.web.MockMultipartHttpServletRequest; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.File; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; +import java.net.URL; +import java.net.URLConnection; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.text.SimpleDateFormat; @@ -46,32 +48,87 @@ public class OnlyOfficeController { @Resource private IOSSFileService ossFileService; - @Value("${file.path}") - private String filePath;//文件存储路径 - - @ApiOperation(value = "|onlyOffice接收文件") + @ApiOperation(value = "onlyOffice接收文件") @PostMapping("/receiveFile") - public void receiveFile(HttpServletRequest request, String fileId) { + public void receiveFileBefore(HttpServletRequest request, HttpServletResponse response, String fileId, String fileNm) throws IOException { log.info("**********进入receiveFile接收文档接口************"); log.info("**********fileId************" + fileId + "======="); + try { - request.setAttribute("biz", "onlyOffice"); - Result result = ossFileService.outUpload(request); + PrintWriter writer = response.getWriter(); + String body = ""; + try { + Scanner scanner = new Scanner(request.getInputStream()); + scanner.useDelimiter("\\A"); + body = scanner.hasNext() ? scanner.next() : ""; + scanner.close(); + } catch (Exception ex) { + writer.write("get request.getInputStream error:" + ex.getMessage()); + return; + } + + if (body.isEmpty()) { + writer.write("empty request.getInputStream"); + return; + } + + net.sf.json.JSONObject jsonObj = net.sf.json.JSONObject.fromObject(body); + log.info("**********onlyoffice接收文档接口获得结果body************" + body); + + String downloadUri = (String) jsonObj.get("url"); + + log.info("**********onlyoffice接收文档接口获得downloadUri************" + downloadUri); + // 创建临时文件 + File file = File.createTempFile("onlyoffice", ".docx"); + downloadNetFile(downloadUri, file); + + // 将file转换为MultiPartFile + // 创建一个 MockMultipartHttpServletRequest 对象 + MockMultipartHttpServletRequest mockRequest = new MockMultipartHttpServletRequest(); + // 将文件转换为 InputStream + InputStream inputStream = Files.newInputStream(file.toPath()); + // 使用工具类转换 InputStream 到 MultipartFile 对象 + MultipartFile multipartFile = IntekeyUtils.convertMultipart(inputStream, fileNm); + // 将 MultipartFile 添加到 MockMultipartHttpServletRequest 中 + mockRequest.addFile(multipartFile); + mockRequest.setParameter("biz", "onlyOffice"); + Result result = ossFileService.outUpload(mockRequest); // 将文件名字改成和原始文件一样 - OSSFile file = ossFileService.getById(fileId); + OSSFile dbFile = ossFileService.getById(fileId); if (result.isSuccess()) { OSSFile ossFile = result.getResult(); - ossFile.setFileName(file.getFileName()); - ossFile.setStandardId(file.getStandardId()); - ossFile.setStandardNo(file.getStandardNo()); - ossFile.setStandardFileType(file.getStandardFileType()); - ossFile.setOnlId(file.getOnlId()); + ossFile.setFileName(dbFile.getFileName()); + ossFile.setStandardId(dbFile.getStandardId()); + ossFile.setStandardNo(dbFile.getStandardNo()); + ossFile.setStandardFileType(dbFile.getStandardFileType()); + ossFile.setOnlId(dbFile.getOnlId()); ossFileService.updateById(ossFile); } } catch (Exception e) { - log.error("**********onlyoffice接收文档接口异常************" + e.getMessage()); + log.error("onlyOffice接收文档接口异常", e); } } + + public void downloadNetFile(String downloadUrl, File file) { + try { + FileOutputStream fileOutputStream = new FileOutputStream(file); + URL url = new URL(downloadUrl); + URLConnection connection = url.openConnection(); + InputStream inputStream = connection.getInputStream(); + int length = 0; + byte[] bytes = new byte[1024]; + while ((length = inputStream.read(bytes)) != -1) { + fileOutputStream.write(bytes, 0, length); + } + fileOutputStream.close(); + inputStream.close(); + } catch (IOException e) { + log.error("download error ! url :{}", downloadUrl); + log.error(e.getMessage()); + } + } + + @GetMapping("/processEditFile") public ProcessFile processEditFile(String id) { return ProcessFileService.processEditFile(id);