diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/common/RecordCommonUtils.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/common/RecordCommonUtils.java new file mode 100644 index 00000000..7c7badc5 --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/common/RecordCommonUtils.java @@ -0,0 +1,26 @@ +package com.zt.plat.module.qms.resource.record.common; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public class RecordCommonUtils { + + // 返回第 n 个非空段(0-based),例如 n=1 会返回 "3"(对 "//0//3//...") + public static Optional getSegment(String idPath, int n) { + if (idPath == null) return Optional.empty(); + List segs = Arrays.stream(idPath.split("/")) + .filter(s -> !s.isEmpty()) + .collect(Collectors.toList()); + if (n < 0 || n >= segs.size()) return Optional.empty(); + return Optional.of(segs.get(n)); + } + + // 简单演示 +// public static void main(String[] args) { +// String idPath = "//0//11//2021848472377016322/"; +// Optional seg1 = getSegment(idPath, 1); // 取第二个非空段,索引1 +// System.out.println(seg1.orElse("not found")); // 输出 "3" +// } +} diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/constant/RecordConstants.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/constant/RecordConstants.java index ee75850b..57b98cf7 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/constant/RecordConstants.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/constant/RecordConstants.java @@ -60,7 +60,43 @@ public class RecordConstants { * 评审 */ public static final String REVIEW = "评审"; - /** 文件提交 */ + /** + * 文件提交 + * */ public static final String RECORD_SUBMIT = "文件提交"; + /** + * 文件提交 + * */ + public static final String RECORD_UPDATE = "文件修改"; + } + + /** + * 流程定义key常量 + */ + public static class ProcessDefinitionKey{ + /** + * 分发 + */ + public static final String DISTRIBUTION__DEFINITION_KEY = "分发"; + /** + * 查看申请 + */ + public static final String VIEW_APPLY_DEFINITION_KEY = "查看申请"; + /** + * 作废 + */ + public static final String INVALID_DEFINITION_KEY = "作废"; + /** + * 评审 + */ + public static final String REVIEW_DEFINITION_KEY = "评审"; + /** + * 文件提交 + */ + public static final String RECORD_SUBMIT_DEFINITION_KEY = "QMS_RECORD_REPAIR"; + /** + * 文件提交 + * */ + public static final String RECORD_UPDATE_DEFINITION_KEY = "文件修改"; } } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/RecordApplyController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/RecordApplyController.java index ccda9059..d6a90217 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/RecordApplyController.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/RecordApplyController.java @@ -14,8 +14,11 @@ import com.zt.plat.framework.excel.core.util.ExcelUtils; import com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo.RecordApplyPageReqVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo.RecordApplyRespVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo.RecordApplySaveReqVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordRespVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordSaveReqVO; import com.zt.plat.module.qms.resource.record.dal.dataobject.recordapply.RecordApplyDO; import com.zt.plat.module.qms.resource.record.service.recordapply.RecordApplyService; +import com.zt.plat.module.qms.resource.record.service.recordrecord.RecordRecordService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -49,13 +52,21 @@ public class RecordApplyController extends AbstractFileUploadController implemen @Resource private RecordApplyService recordApplyService; + @PostMapping("/create") - @Operation(summary = "创建文件记录通用申请") + @Operation(summary = "创建文件记录创建申请") //@PreAuthorize("@ss.hasPermission('qms:record-apply:create')") public CommonResult createRecordApply(@Valid @RequestBody RecordApplySaveReqVO createReqVO) { return success(recordApplyService.createRecordApply(createReqVO)); } + @PostMapping("/submitApply") + @Operation(summary = "创建文件记录通用申请") + //@PreAuthorize("@ss.hasPermission('qms:record-apply:create')") + public CommonResult submitApply(@Valid @RequestBody RecordApplyRespVO respVO) { + return recordApplyService.submitRecordApply(respVO); + } + @PutMapping("/update") @Operation(summary = "更新文件记录通用申请") //@PreAuthorize("@ss.hasPermission('qms:record-apply:update')") diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplyRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplyRespVO.java index 9ce41dce..ad89b5ff 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplyRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplyRespVO.java @@ -1,6 +1,7 @@ package com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; import lombok.*; import java.util.*; import org.springframework.format.annotation.DateTimeFormat; @@ -22,6 +23,7 @@ public class RecordApplyRespVO { @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @ExcelProperty("业务类型") + @NotEmpty(message = "业务类型不能为空") private String businessType; @Schema(description = "申请人id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15000") @@ -84,8 +86,26 @@ public class RecordApplyRespVO { @ExcelProperty("备注") private String remark; + @Schema(description = "流程实例ID") + @ExcelProperty("流程实例ID") + private String flowInstanceId; + + @Schema(description = "业务状态") + @ExcelProperty("业务状态") + private String businessStatus; + @Schema(description = "创建时间") @ExcelProperty("创建时间") private LocalDateTime createTime; + +// ===============临时字段=================》 + + // needApply : 是否需要申请,true-需要,false-不需要 + @Schema(description = "是否需要申请") + private Boolean needApply; + + @Schema(description = "流程类型") + private Long recordId; + } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplySaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplySaveReqVO.java index 55d988b9..f7048b16 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplySaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapply/vo/RecordApplySaveReqVO.java @@ -72,4 +72,10 @@ public class RecordApplySaveReqVO { @Schema(description = "备注") private String remark; + @Schema(description = "流程实例ID") + private String flowInstanceId; + + @Schema(description = "业务状态") + private String businessStatus; + } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailJoinVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailJoinVO.java new file mode 100644 index 00000000..4aeb9fc1 --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordapplydetail/vo/RecordApplyDetailJoinVO.java @@ -0,0 +1,32 @@ +package com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo; + +import lombok.*; +import java.time.LocalDateTime; + +/** + * 文件记录申请与申请明细联合查询VO + * + * @author 后台管理 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RecordApplyDetailJoinVO { + + // RecordApplyDO 字段 + private Long applyId; + private String businessStatus; + private String businessType; + private String flowInstanceId; + + // RecordApplyDetailDO 字段 + private Long detailId; + private Long documentId; + private String permanently; + private LocalDateTime applyStartDate; + private LocalDateTime applyEndDate; + private String sortNo; + private String systemDepartmentCode; + private String remark; +} diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/RecordRecordController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/RecordRecordController.java index 5e342069..026eb3f2 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/RecordRecordController.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/RecordRecordController.java @@ -105,11 +105,11 @@ public class RecordRecordController extends AbstractFileUploadController impleme return success(true); } - @PostMapping("/submitRecordApply") - @Operation(summary = "提交流程申请") - public CommonResult submitRecordApply(@RequestBody RecordRecordSaveReqVO param) { - return recordRecordService.submitRecordApply(param); - } +// @PostMapping("/submitRecordApply") +// @Operation(summary = "提交流程申请") +// public CommonResult submitRecordApply(@RequestBody RecordRecordSaveReqVO param) { +// return recordRecordService.submitRecordApply(param); +// } @GetMapping("/get") diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordPageReqVO.java index 574809f9..4a701474 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordPageReqVO.java @@ -60,15 +60,12 @@ public class RecordRecordPageReqVO extends PageParam { @Schema(description = "是否长期有效") private Integer permanently; - @Schema(description = "业务状态") - private String businessStatus; - - @Schema(description = "流程实例Id") - private String flowInstanceId; - @Schema(description = "是否需要提交(用来判断文件是否需要走流程)") private String submitFlag; + @Schema(description = "文件记录状态,0: 无效,1: 有效") + private Integer recordStatus; + @Schema(description = "过期日期") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] expirationDate; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordRespVO.java index 239b2d44..a5637821 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordRespVO.java @@ -89,18 +89,14 @@ public class RecordRecordRespVO { @Dict(dicCode = "yes_or_no") private Integer permanently; - @Schema(description = "业务状态") - @ExcelProperty("业务状态") - private String businessStatus; - - @Schema(description = "流程实例Id") - @ExcelProperty("流程实例Id") - private String flowInstanceId; - @Schema(description = "是否需要提交(用来判断文件是否需要走流程)") @ExcelProperty("是否需要提交(用来判断文件是否需要走流程)") private String submitFlag; + @Schema(description = "文件记录状态,0: 无效,1: 有效") + @ExcelProperty("文件记录状态,0: 无效,1: 有效") + private Integer recordStatus; + @Schema(description = "过期日期") @ExcelProperty("过期日期") private LocalDateTime expirationDate; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordSaveReqVO.java index 577a7d36..65651cb6 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/controller/admin/recordrecord/vo/RecordRecordSaveReqVO.java @@ -67,15 +67,12 @@ public class RecordRecordSaveReqVO { @Schema(description = "是否长期有效", requiredMode = Schema.RequiredMode.REQUIRED) private Integer permanently; - @Schema(description = "业务状态") - private String businessStatus; - - @Schema(description = "流程实例Id") - private String flowInstanceId; - @Schema(description = "是否需要提交(用来判断文件是否需要走流程)") private String submitFlag; + @Schema(description = "文件记录状态,0: 无效,1: 有效") + private Integer recordStatus; + @Schema(description = "过期日期") private LocalDateTime expirationDate; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dao/recordapplydetail/RecordApplyDetailMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dao/recordapplydetail/RecordApplyDetailMapper.java index a360fc39..8419a3e8 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dao/recordapplydetail/RecordApplyDetailMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dao/recordapplydetail/RecordApplyDetailMapper.java @@ -5,7 +5,10 @@ import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailPageReqVO; import com.zt.plat.module.qms.resource.record.dal.dataobject.recordapplydetail.RecordApplyDetailDO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailJoinVO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import java.util.List; /** * 文件记录通用申请明细 Mapper @@ -29,4 +32,20 @@ public interface RecordApplyDetailMapper extends BaseMapperX selectJoinByDocumentIdAndBusinessType(Long documentId, String businessType); + } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordapply/RecordApplyDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordapply/RecordApplyDO.java index 6656bba5..c3bb8a8e 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordapply/RecordApplyDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordapply/RecordApplyDO.java @@ -43,6 +43,16 @@ public class RecordApplyDO extends BusinessBaseDO { */ @TableField("BSN_TP") private String businessType; + /** + * 业务状态 + */ + @TableField("BSN_STS") + private String businessStatus; + /** + * 流程实例Id + */ + @TableField("FLW_INSC_ID") + private String flowInstanceId; /** * 申请人id */ diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordrecord/RecordRecordDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordrecord/RecordRecordDO.java index 2552f002..6e1e6416 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordrecord/RecordRecordDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/dal/dataobject/recordrecord/RecordRecordDO.java @@ -108,21 +108,16 @@ public class RecordRecordDO extends BusinessBaseDO { */ @TableField("PMNT") private String permanently; - /** - * 业务状态 - */ - @TableField("BSN_STS") - private String businessStatus; - /** - * 流程实例Id - */ - @TableField("FLW_INSC_ID") - private String flowInstanceId; /** * 是否需要提交(用来判断文件是否需要走流程) */ @TableField("SBM_FLG") private String submitFlag; + /** + * 是否需要提交(用来判断文件是否需要走流程) + */ + @TableField("RCD_STS") + private Integer recordStatus; /** * 过期日期 */ diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyService.java index e73245d1..7b430f4a 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyService.java @@ -2,6 +2,9 @@ package com.zt.plat.module.qms.resource.record.service.recordapply; import java.util.*; +import com.alibaba.fastjson.JSONObject; +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.module.qms.api.task.dto.QmsBpmDTO; import com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo.RecordApplyPageReqVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo.RecordApplyRespVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo.RecordApplySaveReqVO; @@ -61,4 +64,60 @@ public interface RecordApplyService { */ PageResult getRecordApplyPage(RecordApplyPageReqVO pageReqVO); + /** + * 创建临时数据 + * + * @param createReqVO 创建信息 + * @return 申请信息 + */ + CommonResult createTempData(@Valid RecordApplySaveReqVO createReqVO); + + /** + * 增加明细 + * + * @param param 参数 + * @return 结果 + */ + CommonResult addDetail(JSONObject param); + + /** + * 删除明细 + * + * @param param 参数 + * @return 结果 + */ + CommonResult removeDetail(JSONObject param); + + /** + * 保存申请 + * + * @param updateReqVO 更新信息 + * @return 结果 + */ + CommonResult saveRecordApply(@Valid RecordApplySaveReqVO updateReqVO); + + /** + * 提交申请-发起流程 + * + * @param param 参数 + * @return 申请信息 + */ + CommonResult submitRecordApply(@Valid RecordApplyRespVO param); + + /** + * 获取申请及意见 + * + * @param id 申请ID + * @return 申请及意见信息 + */ + CommonResult getWithOpinions(Long id); + + /** + * 流程回调 + * + * @param reqDTO 回调数据 + * @return 结果 + */ + CommonResult callback(QmsBpmDTO reqDTO); + } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyServiceImpl.java index dd08bd39..989429b7 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapply/RecordApplyServiceImpl.java @@ -1,36 +1,86 @@ package com.zt.plat.module.qms.resource.record.service.recordapply; import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSONObject; +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.framework.security.core.LoginUser; +import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; +import com.zt.plat.module.bpm.api.task.BpmProcessInstanceApi; +import com.zt.plat.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import com.zt.plat.module.qms.api.task.BMPCallbackInterface; +import com.zt.plat.module.qms.api.task.dto.QmsBpmDTO; +import com.zt.plat.module.qms.common.data.dal.dataobject.DataCommonType; +import com.zt.plat.module.qms.common.data.dal.dataobject.DataOpinionDO; +import com.zt.plat.module.qms.common.data.service.DataKeyCheckService; +import com.zt.plat.module.qms.common.data.service.DataOpinionService; +import com.zt.plat.module.qms.enums.QmsBpmConstant; +import com.zt.plat.module.qms.enums.QmsCommonConstant; +import com.zt.plat.module.qms.resource.record.common.RecordCommonUtils; +import com.zt.plat.module.qms.resource.record.constant.RecordConstants; import com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo.RecordApplyPageReqVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo.RecordApplyRespVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo.RecordApplySaveReqVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailPageReqVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailSaveReqVO; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordapply.RecordApplyDO; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordapplydetail.RecordApplyDetailDO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailJoinVO; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordcategory.RecordCategoryDO; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordrecord.RecordRecordDO; +import com.zt.plat.module.qms.resource.record.service.recordapplydetail.RecordApplyDetailService; +import com.zt.plat.module.qms.resource.record.service.recordcategory.RecordCategoryService; +import com.zt.plat.module.qms.resource.record.service.recordrecord.RecordRecordService; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; -import com.zt.plat.module.qms.resource.record.dal.dataobject.recordapply.RecordApplyDO; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.module.qms.resource.record.dal.dao.recordapply.RecordApplyMapper; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception0; import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList; import static com.zt.plat.module.qms.enums.ErrorCodeConstants.*; +import static com.zt.plat.module.qms.enums.QmsBpmConstant.BPM_CALLBACK_BEAN_NAME; /** * 文件记录通用申请 Service 实现类 * * @author 后台管理 */ -@Service +@Service("recordApplyService") @Validated -public class RecordApplyServiceImpl implements RecordApplyService { +@Slf4j +public class RecordApplyServiceImpl implements RecordApplyService, BMPCallbackInterface { @Resource private RecordApplyMapper recordApplyMapper; + @Resource + private RecordApplyDetailService recordApplyDetailService; + @Resource + private BpmProcessInstanceApi bpmProcessInstanceApi; + @Resource + private DataKeyCheckService dataKeyCheckService; + @Resource + private DataOpinionService dataOpinionService; + + @Resource + private RecordRecordService recordRecordService; + + @Resource + private RecordCategoryService recordCategoryService; + + private LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); @Override public RecordApplyRespVO createRecordApply(RecordApplySaveReqVO createReqVO) { @@ -59,12 +109,12 @@ public class RecordApplyServiceImpl implements RecordApplyService { } @Override - public void deleteRecordApplyListByIds(List ids) { + public void deleteRecordApplyListByIds(List ids) { // 校验存在 validateRecordApplyExists(ids); // 删除 recordApplyMapper.deleteByIds(ids); - } + } private void validateRecordApplyExists(List ids) { List list = recordApplyMapper.selectByIds(ids); @@ -89,4 +139,345 @@ public class RecordApplyServiceImpl implements RecordApplyService { return recordApplyMapper.selectPage(pageReqVO); } + //创建临时数据 + @Override + @Transactional(rollbackFor = Exception.class) + public CommonResult createTempData(RecordApplySaveReqVO createReqVO) { + String businessType = createReqVO.getBusinessType(); + if (ObjectUtils.isEmpty(businessType)) + return CommonResult.error(RECORD_APPLY_NOT_EXISTS.getCode(), "请选择业务类型"); + + RecordApplyDO recordApply = BeanUtils.toBean(createReqVO, RecordApplyDO.class); + recordApply.setBusinessStatus(QmsCommonConstant.TEMP_DATA_CODE); + + //取当前用户 + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + String nickName = SecurityFrameworkUtils.getLoginUserNickname(); + recordApply.setApplyUserId(loginUser.getId()); + recordApply.setApplyUserName(nickName); + recordApply.setApplyDepartmentId(loginUser.getVisitDeptId()); + recordApply.setApplyDepartmentName(loginUser.getVisitDeptName()); + + //生成标题 + String title = nickName + "的文件下发申请_" + new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(new Date()); + recordApply.setTitle(title); + + recordApplyMapper.insert(recordApply); + return CommonResult.success(BeanUtils.toBean(recordApply, RecordApplyRespVO.class)); + } + + //增加明细 + @Override + @Transactional(rollbackFor = Exception.class) + public CommonResult addDetail(JSONObject param) { + String documentIds = param.getString("documentIds"); + String applyId = param.getString("applyId"); + if (ObjectUtils.isEmpty(documentIds)) + return CommonResult.error(RECORD_APPLY_NOT_EXISTS.getCode(), "请选择文件"); + if (ObjectUtils.isEmpty(applyId)) + return CommonResult.error(RECORD_APPLY_NOT_EXISTS.getCode(), "缺少申请id参数,请刷新后重试!"); + + Long id = Long.valueOf(applyId); + RecordApplyDO apply = getRecordApply(id); + if (apply == null) + return CommonResult.error(RECORD_APPLY_NOT_EXISTS.getCode(), "申请不存在"); + + List documentIdList = Arrays.stream(documentIds.split(",")).map(Long::valueOf).toList(); + + //查询已有明细,避免重复添加 + RecordApplyDetailPageReqVO detailPageReqVO = new RecordApplyDetailPageReqVO(); + detailPageReqVO.setApplyId(id); + List detailList = recordApplyDetailService.getRecordApplyDetailPage(detailPageReqVO).getList(); + + //过滤已添加文件 + List addDocumentIds = documentIdList.stream().filter(docId -> + detailList.stream().noneMatch(detail -> detail.getDocumentId().equals(docId))).toList(); + + List detailDOList = new ArrayList<>(); + for (Long documentId : addDocumentIds) { + RecordApplyDetailDO detail = new RecordApplyDetailDO(); + detail.setApplyId(id); + detail.setDocumentId(documentId); + detailDOList.add(detail); + } + + if (!detailDOList.isEmpty()) { + for (RecordApplyDetailDO detail : detailDOList) { + recordApplyDetailService.createRecordApplyDetail( + BeanUtils.toBean(detail, com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailSaveReqVO.class) + ); + } + } + + return CommonResult.success(true); + } + + @Override + public CommonResult removeDetail(JSONObject param) { + String detailIds = param.getString("detailIds"); + if (ObjectUtils.isEmpty(detailIds)) + return CommonResult.error(RECORD_APPLY_NOT_EXISTS.getCode(), "请选择需要删除的明细数据"); + List detailIdList = Arrays.stream(detailIds.split(",")).map(Long::valueOf).toList(); + recordApplyDetailService.deleteRecordApplyDetailListByIds(detailIdList); + return CommonResult.success(true); + } + + //保存 + @Override + @Transactional(rollbackFor = Exception.class) + public CommonResult saveRecordApply(RecordApplySaveReqVO updateReqVO) { + // 校验存在 + RecordApplyDO backData = getRecordApply(updateReqVO.getId()); + if (backData == null) + throw exception(RECORD_APPLY_NOT_EXISTS); + // 如果是临时数据,保存后状态变更为未发起 + if (QmsCommonConstant.TEMP_DATA_CODE.equals(backData.getBusinessStatus())) { + updateReqVO.setBusinessStatus(QmsCommonConstant.NOT_START); + } + // 更新 + RecordApplyDO updateObj = BeanUtils.toBean(updateReqVO, RecordApplyDO.class); + recordApplyMapper.updateById(updateObj); + return CommonResult.success(true); + } + + @Override + public CommonResult getWithOpinions(Long id) { + RecordApplyDO entity = recordApplyMapper.selectById(id); + if (entity == null) + return CommonResult.error(RECORD_APPLY_NOT_EXISTS.getCode(), "申请不存在"); + + List opinions = dataOpinionService.getListByBusId(entity.getId()); + JSONObject opinionJson = new JSONObject(); + for (DataOpinionDO opinion : opinions) { + String nodeKey = opinion.getNodeKey(); + if (ObjectUtils.isEmpty(nodeKey)) + continue; + JSONObject nodeJson = new JSONObject(); + LocalDateTime opinionTime = opinion.getOpinionTime(); + nodeJson.put("nodeName", opinion.getNodeName()); + nodeJson.put("nodeKey", opinion.getNodeKey()); + nodeJson.put("opinionContent", opinion.getOpinionContent()); + if (opinionTime != null) + nodeJson.put("opinionTime", opinionTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + nodeJson.put("opinionUserName", opinion.getOpinionUserName()); + nodeJson.put("opinionUserId", opinion.getOpinionUserId()); + nodeJson.put("opinionDepartmentName", opinion.getOpinionDepartmentName()); + nodeJson.put("opinionDepartmentId", opinion.getOpinionDepartmentId()); + nodeJson.put("opinionSignatureId", opinion.getOpinionSignatureId()); + opinionJson.put(nodeKey, nodeJson); + } + + JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(entity)); + json.put("opinions", opinionJson); + return CommonResult.success(json); + } + + public boolean justifyRecordApply(RecordRecordDO recordDO) { + Integer recordStatus = recordDO.getRecordStatus(); + if (recordStatus != null) throw exception(RECORD_APPLY_NOT_EXISTS, "文件已提交,无法提交申请"); + RecordCategoryDO recordCategory = recordCategoryService.getRecordCategory(recordDO.getCategoryId()); + // 获取分类的根分类Id + String idPath = recordCategory.getIdPath(); + Optional segment = RecordCommonUtils.getSegment(idPath, 1); + String s = segment.orElse(null); + if (ObjectUtils.isEmpty(s)) + throw exception(RECORD_APPLY_NOT_EXISTS); + RecordCategoryDO category = recordCategoryService.getRecordCategory(Long.valueOf(s)); + String customConfig = category.getCustomConfig(); + if (!ObjectUtils.isEmpty(customConfig)){ + JSONObject jsonObject = JSONObject.parseObject(customConfig); + Integer submitFlag = jsonObject.getInteger("submitFlag"); + if (submitFlag == 0) { + // 不允许提交,直接修改文件记录状态 + recordDO.setRecordStatus(1); // 已生效 + recordRecordService.updateRecordRecordById(recordDO); + return true; + }else { + // 把状态改为0 + recordDO.setRecordStatus(0); // 未生效 + recordRecordService.updateRecordRecordById(recordDO); + } + } + return false; + } + + //提交申请-发起流程 + @Override + @Transactional(rollbackFor = Exception.class) + public CommonResult submitRecordApply(RecordApplyRespVO param) { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + String nickName = SecurityFrameworkUtils.getLoginUserNickname(); + Long recordId = param.getRecordId();// 文件Id + String businessType = param.getBusinessType(); + RecordRecordDO entity = recordRecordService.getRecordById(recordId); + if (ObjectUtils.isEmpty(entity)) throw exception(RECORD_APPLY_NOT_EXISTS); + + BpmProcessInstanceCreateReqDTO reqDTO = new BpmProcessInstanceCreateReqDTO(); + reqDTO.setBusinessKey(String.valueOf(recordId)); + // TODO 流程定义key 待定 + switch (businessType) { + case RecordConstants.BusinessType.RECORD_SUBMIT: + // 判断根分类上是否配置自定义配置,允许提交,则需要走流程,否则直接提交 + boolean b = justifyRecordApply(entity); + if (b) { + // 不需要走流程,直接返回成功 + return CommonResult.success(BeanUtils.toBean(entity, RecordApplyRespVO.class)); + } + reqDTO.setProcessDefinitionKey(RecordConstants.ProcessDefinitionKey.RECORD_SUBMIT_DEFINITION_KEY); + break; + case RecordConstants.BusinessType.DISTRIBUTION: + reqDTO.setProcessDefinitionKey(RecordConstants.ProcessDefinitionKey.DISTRIBUTION__DEFINITION_KEY); + // 文件分发需要关联权限表 + break; + case RecordConstants.BusinessType.VIEW_APPLY: + reqDTO.setProcessDefinitionKey(RecordConstants.ProcessDefinitionKey.VIEW_APPLY_DEFINITION_KEY); + break; + case RecordConstants.BusinessType.INVALID: + reqDTO.setProcessDefinitionKey(RecordConstants.ProcessDefinitionKey.INVALID_DEFINITION_KEY); + break; + case RecordConstants.BusinessType.REVIEW: + reqDTO.setProcessDefinitionKey(RecordConstants.ProcessDefinitionKey.REVIEW_DEFINITION_KEY); + break; + case RecordConstants.BusinessType.RECORD_UPDATE: + reqDTO.setProcessDefinitionKey(RecordConstants.ProcessDefinitionKey.RECORD_UPDATE_DEFINITION_KEY); + break; + default: + throw exception(RECORD_APPLY_NOT_EXISTS, "未知的业务类型"); + } + reqDTO.setProcessDefinitionKey(RecordConstants.ProcessDefinitionKey.RECORD_SUBMIT_DEFINITION_KEY); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + JSONObject formData = new JSONObject(); + formData.put("mainId", recordId); + formData.put("applyUser", nickName); + formData.put("applyUserId", loginUser.getId()); + formData.put("applyDepartment", loginUser.getVisitDeptName()); + formData.put("applyDepartmentId", loginUser.getVisitDeptId()); + formData.put("applyTime", sdf.format(new Date())); + formData.put("businessType", businessType); + formData.put("title", entity.getName()); // 文件名 + + Map variables = formData.toJavaObject(Map.class); + variables.put(BPM_CALLBACK_BEAN_NAME, "recordApplyService"); + + reqDTO.setVariables(variables); + + CommonResult result = bpmProcessInstanceApi.createProcessInstance(loginUser.getId(), reqDTO); + if (!result.isSuccess()) { + throw exception0(ERROR_CODE_MODULE_COMMON, result.getMsg()); + } + + String wfInsId = result.getData(); + + RecordApplyDO recordApplyDO = new RecordApplyDO(); + recordApplyDO.setApplyUserId(loginUser.getId()); + recordApplyDO.setApplyUserName(SecurityFrameworkUtils.getLoginUserNickname()); + recordApplyDO.setApplyDepartmentId(loginUser.getVisitDeptId()); + recordApplyDO.setApplyDepartmentName(loginUser.getVisitDeptName()); + recordApplyDO.setBusinessType(businessType); // 业务类型:记录提交 + recordApplyDO.setTitle(entity.getName()); + recordApplyDO.setFlowInstanceId(wfInsId); + // 提交后状态变更为审核中 + recordApplyDO.setBusinessStatus(QmsCommonConstant.RUNNING); + recordApplyMapper.insert(recordApplyDO); + + //申请通用明细记录 + RecordApplyDetailSaveReqVO recordApplyDetailSaveReqVO = new RecordApplyDetailSaveReqVO(); + recordApplyDetailSaveReqVO.setApplyId(recordApplyDO.getId()); + recordApplyDetailSaveReqVO.setDocumentId(recordId); // 文件Id + recordApplyDetailService.createRecordApplyDetail(recordApplyDetailSaveReqVO); + + return CommonResult.success(BeanUtils.toBean(recordApplyDO, RecordApplyRespVO.class)); + } + + //流程回调 + @Override + @Transactional(rollbackFor = Exception.class) + public CommonResult callback(QmsBpmDTO reqDTO) { + log.error("文件下发流程回调:{}", JSONObject.toJSONString(reqDTO)); + JSONObject variables = reqDTO.getVariables(); + // TODO 目前审批意见在流程回调时保存,后续可以考虑在每个节点完成时保存审批意见,这样可以避免审批意见丢失的情况,同时也能更及时地记录审批意见 + JSONObject taskVariables = variables.getJSONObject("taskVariables"); + String processInsId = variables.getString(QmsBpmConstant.BPM_PROCESS_INS_ID); + String currentActivityInsId = variables.getString(QmsBpmConstant.BPM_CUR_ACTIVITY_INS_ID); + String currentActivityId = variables.getString(QmsBpmConstant.BPM_CALLBACK_ACTIVITY_ID); + String currentActivityName = variables.getString(QmsBpmConstant.BPM_CALLBACK_ACTIVITY_NAME); + String returnFlag = variables.getString(QmsBpmConstant.BPM_REJECT_TO_FIRST_FLAG); + String businessType = variables.getString("businessType"); + + //同一个节点实例只触发一次 + String checkKey = currentActivityInsId; + if (ObjectUtils.isEmpty(currentActivityInsId)) + checkKey = processInsId + "-create"; + if ("1".equals(returnFlag)) + checkKey += "-reject"; + try { + dataKeyCheckService.create(checkKey, this.getClass().getName()); + } catch (Exception e) { + log.error("checkKey 重复:key={}", checkKey); + return CommonResult.success(new JSONObject()); + } + + String PROCESS_STATUS = variables.getString(QmsBpmConstant.PROCESS_INSTANCE_VARIABLE_STATUS); + String recordId = variables.getString("mainId"); + + RecordRecordDO entity = recordRecordService.getRecordById(Long.valueOf(recordId)); + if (ObjectUtils.isEmpty(entity)) + return CommonResult.error(RECORD_APPLY_NOT_EXISTS.getCode(), "申请不存在"); + + List recordApplyDetailJoinList = recordApplyDetailService.getRecordApplyDetailJoinList(Long.valueOf(recordId), businessType); + RecordApplyDetailJoinVO recordApplyDetailJoinVO = recordApplyDetailJoinList.get(0); + if (ObjectUtils.isEmpty(recordApplyDetailJoinVO)) { + log.error("未找到对应的申请明细记录,recordId={}", recordId); + return CommonResult.error(RECORD_APPLY_NOT_EXISTS.getCode(), "未找到对应的申请明细记录"); + } + + if (("1").equals(returnFlag)) { + //驳回,状态变更为未发起 +// entity.setBusinessStatus(QmsCommonConstant.NOT_START); + dataOpinionService.disableOpinionsByBusId(entity.getId()); + } else if ("4".equals(PROCESS_STATUS)) { + //作废 +// entity.setBusinessStatus(QmsCommonConstant.VOID); + } else if ("1".equals(PROCESS_STATUS)) { + //通过 + // TODO 业务代码,通过业务类型判断 + switch (businessType) { + case RecordConstants.BusinessType.RECORD_SUBMIT: + recordRecordFlowStatus(entity,1); + break; + case RecordConstants.BusinessType.DISTRIBUTION: // 分发 + + default: + throw exception(RECORD_APPLY_NOT_EXISTS, "未知的业务类型"); + } + + + } + + Long applyId = recordApplyDetailJoinVO.getApplyId(); + RecordApplyDO recordApplyDO = recordApplyMapper.selectById(applyId); + + DataCommonType dataCommonType = new DataCommonType(); + dataCommonType.setBusinessId(entity.getId()); + dataCommonType.setFlowInstanceId(recordApplyDO.getFlowInstanceId()); + dataOpinionService.saveOpinionByWfCallback(dataCommonType, currentActivityId, currentActivityName, taskVariables); + + // 审批完成,修改申请通用记录状态为已完成 + RecordApplySaveReqVO updateReqVO = new RecordApplySaveReqVO(); + updateReqVO.setId(recordApplyDetailJoinVO.getApplyId()); + updateReqVO.setBusinessStatus(QmsCommonConstant.COMPLETED); + recordApplyMapper.updateById(BeanUtils.toBean(updateReqVO, RecordApplyDO.class)); + + JSONObject ret = new JSONObject(); + return CommonResult.success(ret); + } + + // 文件提交-更改状态 + public void recordRecordFlowStatus(RecordRecordDO recordDO, Integer status) { + // 修改文件状态为已生效 + recordDO.setRecordStatus(status); + recordRecordService.updateRecordRecordById(recordDO); + } } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailService.java index 4e4f2bff..ef47676b 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailService.java @@ -5,6 +5,7 @@ import java.util.*; import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailPageReqVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailRespVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailSaveReqVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailJoinVO; import jakarta.validation.*; import com.zt.plat.module.qms.resource.record.dal.dataobject.recordapplydetail.RecordApplyDetailDO; import com.zt.plat.framework.common.pojo.PageResult; @@ -61,4 +62,20 @@ public interface RecordApplyDetailService { */ PageResult getRecordApplyDetailPage(RecordApplyDetailPageReqVO pageReqVO); + /** + * 获得文件记录通用申请明细列表 + * + * @param pageReqVO 查询条件 + * @return 文件记录通用申请明细列表 + */ + List selectList(RecordApplyDetailPageReqVO pageReqVO); + + /** + * 联合查询:根据文件ID和业务类型查询申请和申请明细 + * + * @param documentId 文件ID + * @param businessType 业务类型 + * @return 联合查询结果列表 + */ + List getRecordApplyDetailJoinList(Long documentId, String businessType); } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailServiceImpl.java index 61a50af4..1164c2c6 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordapplydetail/RecordApplyDetailServiceImpl.java @@ -1,9 +1,11 @@ package com.zt.plat.module.qms.resource.record.service.recordapplydetail; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailPageReqVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailRespVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailSaveReqVO; +import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailJoinVO; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -89,4 +91,15 @@ public class RecordApplyDetailServiceImpl implements RecordApplyDetailService { return recordApplyDetailMapper.selectPage(pageReqVO); } + @Override + public List selectList(RecordApplyDetailPageReqVO pageReqVO) { + PageResult pageResult = recordApplyDetailMapper.selectPage(pageReqVO); + return pageResult.getList(); + } + + @Override + public List getRecordApplyDetailJoinList(Long documentId, String businessType) { + return recordApplyDetailMapper.selectJoinByDocumentIdAndBusinessType(documentId, businessType); + } + } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordService.java index 1573776e..35506515 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordService.java @@ -65,8 +65,6 @@ public interface RecordRecordService { */ PageResult getRecordRecordPage(RecordRecordPageReqVO pageReqVO); -// PageResult getRecordListByCategoryId(Long categoryId); - PageResult getRecordHistoryPage(RecordRecordPageReqVO pageReqVO); CommonResult justRecordPermission(Long recordId); @@ -76,10 +74,11 @@ public interface RecordRecordService { /** * 提交申请-发起流程 * - * @param param 参数 * @return 申请信息 */ - CommonResult submitRecordApply(RecordRecordSaveReqVO param); +// CommonResult submitRecordApply(RecordApplyRespVO param); RecordRecordDO getRecordById(Long id); + + RecordRecordRespVO updateRecordRecordById(RecordRecordDO recordDO); } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordServiceImpl.java index 08645eae..c84d799d 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/record/service/recordrecord/RecordRecordServiceImpl.java @@ -1,74 +1,45 @@ package com.zt.plat.module.qms.resource.record.service.recordrecord; import cn.hutool.core.collection.CollUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.zt.plat.framework.common.exception.ServiceException; import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.framework.common.pojo.PageResult; +import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.framework.security.core.LoginUser; import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; -import com.zt.plat.module.bpm.api.task.BpmProcessInstanceApi; -import com.zt.plat.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; -import com.zt.plat.module.qms.api.task.BMPCallbackInterface; -import com.zt.plat.module.qms.api.task.dto.QmsBpmDTO; -import com.zt.plat.module.qms.common.data.controller.vo.DataTemplateSaveReqVO; -import com.zt.plat.module.qms.common.data.dal.dataobject.DataCommonType; -import com.zt.plat.module.qms.common.data.dal.dataobject.DataTemplateDO; -import com.zt.plat.module.qms.common.data.service.DataKeyCheckService; -import com.zt.plat.module.qms.common.data.service.DataOpinionService; import com.zt.plat.module.qms.common.dic.dal.dataobject.DictionaryBusinessDO; import com.zt.plat.module.qms.common.dic.service.DictionaryBusinessService; import com.zt.plat.module.qms.common.service.BusinessFileService; -import com.zt.plat.module.qms.enums.QmsBpmConstant; -import com.zt.plat.module.qms.enums.QmsCommonConstant; -import com.zt.plat.module.qms.resource.clientManage.controller.vo.UploadFileVo; import com.zt.plat.module.qms.resource.record.constant.RecordConstants; -import com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo.RecordApplyRespVO; -import com.zt.plat.module.qms.resource.record.controller.admin.recordapply.vo.RecordApplySaveReqVO; -import com.zt.plat.module.qms.resource.record.controller.admin.recordapplydetail.vo.RecordApplyDetailSaveReqVO; -import com.zt.plat.module.qms.resource.record.controller.admin.recordpermission.vo.RecordPermissionPageReqVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordPageReqVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordRespVO; import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordSaveReqVO; import com.zt.plat.module.qms.resource.record.dal.dao.recordcategory.RecordCategoryMapper; import com.zt.plat.module.qms.resource.record.dal.dao.recordpermission.RecordPermissionMapper; -import com.zt.plat.module.qms.resource.record.dal.dataobject.recordapply.RecordApplyDO; +import com.zt.plat.module.qms.resource.record.dal.dao.recordrecord.RecordRecordMapper; import com.zt.plat.module.qms.resource.record.dal.dataobject.recordcategory.RecordCategoryDO; import com.zt.plat.module.qms.resource.record.dal.dataobject.recordpermission.RecordPermissionDO; -import com.zt.plat.module.qms.resource.record.service.recordapply.RecordApplyService; -import com.zt.plat.module.qms.resource.record.service.recordapplydetail.RecordApplyDetailService; +import com.zt.plat.module.qms.resource.record.dal.dataobject.recordrecord.RecordRecordDO; import com.zt.plat.module.qms.resource.record.service.recordpermission.RecordPermissionService; import com.zt.plat.module.system.api.dept.DeptApi; import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; import com.zt.plat.module.system.api.permission.PermissionApi; - -import java.text.SimpleDateFormat; -import java.util.Set; - -import com.alibaba.fastjson.JSON; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import jakarta.annotation.Resource; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; -import java.util.*; - -import com.zt.plat.module.qms.resource.record.dal.dataobject.recordrecord.RecordRecordDO; -import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.util.object.BeanUtils; - -import com.zt.plat.module.qms.resource.record.dal.dao.recordrecord.RecordRecordMapper; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception0; -import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList; import static com.zt.plat.module.qms.enums.ErrorCodeConstants.*; -import static com.zt.plat.module.qms.enums.QmsBpmConstant.BPM_CALLBACK_BEAN_NAME; /** * 文件、模板、记录 Service 实现类 @@ -78,7 +49,7 @@ import static com.zt.plat.module.qms.enums.QmsBpmConstant.BPM_CALLBACK_BEAN_NAME @Slf4j @Service("recordRecordService") @Validated -public class RecordRecordServiceImpl implements RecordRecordService, BMPCallbackInterface { +public class RecordRecordServiceImpl implements RecordRecordService { @Resource private RecordRecordMapper recordRecordMapper; @@ -101,18 +72,18 @@ public class RecordRecordServiceImpl implements RecordRecordService, BMPCallback @Resource private PermissionApi permissionApi; - @Resource - private RecordApplyService recordApplyService; - - @Resource - private RecordApplyDetailService recordApplyDetailService; - - @Resource - private BpmProcessInstanceApi bpmProcessInstanceApi; - @Resource - private DataKeyCheckService dataKeyCheckService; - @Resource - private DataOpinionService dataOpinionService; +// @Resource +// private RecordApplyService recordApplyService; +// +// @Resource +// private RecordApplyDetailService recordApplyDetailService; +// +// @Resource +// private BpmProcessInstanceApi bpmProcessInstanceApi; +// @Resource +// private DataKeyCheckService dataKeyCheckService; +// @Resource +// private DataOpinionService dataOpinionService; @Autowired private DictionaryBusinessService dictionaryBusinessService; // 字典服务 @@ -173,6 +144,16 @@ public class RecordRecordServiceImpl implements RecordRecordService, BMPCallback } } + @Override + public RecordRecordRespVO updateRecordRecordById(RecordRecordDO recordDO) { + try { + recordRecordMapper.updateById(recordDO); + return BeanUtils.toBean(recordDO, RecordRecordRespVO.class); + } catch (Exception e) { + throw new RuntimeException("update record error"); + } + } + @Override @Transactional(rollbackFor = Exception.class) public RecordRecordRespVO updateRecordRecord(RecordRecordSaveReqVO updateReqVO) { @@ -626,125 +607,4 @@ public class RecordRecordServiceImpl implements RecordRecordService, BMPCallback return matchedList; } - //提交申请-发起流程 - @Override - @Transactional(rollbackFor = Exception.class) - public CommonResult submitRecordApply(RecordRecordSaveReqVO param) { - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - String nickName = SecurityFrameworkUtils.getLoginUserNickname(); - Long id = param.getId();// 文件Id - RecordRecordDO entity = getRecordById(id); - if (entity == null) - throw exception(RECORD_APPLY_NOT_EXISTS); - - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - - JSONObject formData = new JSONObject(); - formData.put("mainId", id); - formData.put("applyUser", nickName); - formData.put("applyUserId", loginUser.getId()); - formData.put("applyDepartment", loginUser.getVisitDeptName()); - formData.put("applyDepartmentId", loginUser.getVisitDeptId()); - formData.put("applyTime", sdf.format(new Date())); - formData.put("businessType", entity.getBusinessType()); - formData.put("title", entity.getName()); // 文件名 - - Map variables = formData.toJavaObject(Map.class); - variables.put(BPM_CALLBACK_BEAN_NAME, "recordRecordService"); - - BpmProcessInstanceCreateReqDTO reqDTO = new BpmProcessInstanceCreateReqDTO(); - reqDTO.setBusinessKey(String.valueOf(id)); - // TODO 流程定义key 待定 - reqDTO.setProcessDefinitionKey("QMS_RECORD_REPAIR"); - reqDTO.setVariables(variables); - - CommonResult result = bpmProcessInstanceApi.createProcessInstance(loginUser.getId(), reqDTO); - if (!result.isSuccess()) { - throw exception0(ERROR_CODE_MODULE_COMMON, result.getMsg()); - } - - String wfInsId = result.getData(); - entity.setFlowInstanceId(wfInsId); - // 提交后状态变更为审核中 - entity.setBusinessStatus(QmsCommonConstant.RUNNING); - int i = recordRecordMapper.updateById(entity); - if (i<0) throw exception(RECORD_RECORD_NOT_EXISTS); - - // 添加申请通用记录,跟申请通用明细记录 - RecordApplySaveReqVO recordApplySaveReqVO = new RecordApplySaveReqVO(); - recordApplySaveReqVO.setApplyUserId(loginUser.getId()); - recordApplySaveReqVO.setApplyUserName(nickName); - recordApplySaveReqVO.setApplyDepartmentId(loginUser.getVisitDeptId()); - recordApplySaveReqVO.setApplyDepartmentName(loginUser.getVisitDeptName()); - recordApplySaveReqVO.setBusinessType(RecordConstants.BusinessType.RECORD_SUBMIT); // 业务类型:记录提交 - recordApplySaveReqVO.setTitle(entity.getName()); - recordApplyService.createRecordApply(recordApplySaveReqVO); - - //申请通用明细记录 - RecordApplyDetailSaveReqVO recordApplyDetailSaveReqVO = new RecordApplyDetailSaveReqVO(); - recordApplyDetailSaveReqVO.setApplyId(recordApplySaveReqVO.getId()); - recordApplyDetailSaveReqVO.setDocumentId(id); // 文件Id - recordApplyDetailService.createRecordApplyDetail(recordApplyDetailSaveReqVO); - - return CommonResult.success(BeanUtils.toBean(entity, RecordRecordRespVO.class)); - } - - //流程回调 - @Override - @Transactional(rollbackFor = Exception.class) - public CommonResult callback(QmsBpmDTO reqDTO) { - log.error("文件下发流程回调:{}", JSONObject.toJSONString(reqDTO)); - JSONObject variables = reqDTO.getVariables(); -// JSONObject taskVariables = variables.getJSONObject("taskVariables"); - // TODO 目前审批意见在流程回调时保存,后续可以考虑在每个节点完成时保存审批意见,这样可以避免审批意见丢失的情况,同时也能更及时地记录审批意见 - JSONObject taskVariables = variables.getJSONObject("taskVariables"); - String processInsId = variables.getString(QmsBpmConstant.BPM_PROCESS_INS_ID); - String currentActivityInsId = variables.getString(QmsBpmConstant.BPM_CUR_ACTIVITY_INS_ID); - String currentActivityId = variables.getString(QmsBpmConstant.BPM_CALLBACK_ACTIVITY_ID); - String currentActivityName = variables.getString(QmsBpmConstant.BPM_CALLBACK_ACTIVITY_NAME); - String returnFlag = variables.getString(QmsBpmConstant.BPM_REJECT_TO_FIRST_FLAG); - - //同一个节点实例只触发一次 - String checkKey = currentActivityInsId; - if (ObjectUtils.isEmpty(currentActivityInsId)) - checkKey = processInsId + "-create"; - if ("1".equals(returnFlag)) - checkKey += "-reject"; - try { - dataKeyCheckService.create(checkKey, this.getClass().getName()); - } catch (Exception e) { - log.error("checkKey 重复:key={}", checkKey); - return CommonResult.success(new JSONObject()); - } - - String PROCESS_STATUS = variables.getString(QmsBpmConstant.PROCESS_INSTANCE_VARIABLE_STATUS); - String mainId = variables.getString("mainId"); - - RecordRecordDO entity = getRecordById(Long.valueOf(mainId)); - if (ObjectUtils.isEmpty(entity)) - return CommonResult.error(RECORD_APPLY_NOT_EXISTS.getCode(), "申请不存在"); - - if (("1").equals(returnFlag)) { - //驳回,状态变更为未发起 - entity.setBusinessStatus(QmsCommonConstant.NOT_START); - dataOpinionService.disableOpinionsByBusId(entity.getId()); - } else if ("4".equals(PROCESS_STATUS)) { - //作废 - entity.setBusinessStatus(QmsCommonConstant.VOID); - } else if ("1".equals(PROCESS_STATUS)) { - //通过 - // TODO 目前审批意见在流程回调时保存,后续可以考虑在每个节点完成时保存审批意见,这样可以避免审批意见丢失的情况,同时也能更及时地记录审批意见 - DataCommonType dataCommonType = new DataCommonType(); - dataCommonType.setBusinessId(entity.getId()); - dataCommonType.setFlowInstanceId(entity.getFlowInstanceId()); - dataOpinionService.saveOpinionByWfCallback(dataCommonType, currentActivityId, currentActivityName, taskVariables); - // 审批完成 - entity.setBusinessStatus(QmsCommonConstant.COMPLETED); - } - - recordRecordMapper.updateById(entity); - JSONObject ret = new JSONObject(); - return CommonResult.success(ret); - } - } \ No newline at end of file