diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/constant/ProReTemplateConst.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/constant/ProReTemplateConst.java index 69a197257..95418a359 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/constant/ProReTemplateConst.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/constant/ProReTemplateConst.java @@ -24,4 +24,38 @@ public interface ProReTemplateConst { Integer OFFLINE = 0; String DIC = "ProReTemplate-Status"; + + // ==================== 审核状态常量 ==================== + + /** + * 审核状态-待审核 + */ + Integer AUDIT_STATUS_PENDING = 0; + + /** + * 审核状态-审核中 + */ + Integer AUDIT_STATUS_AUDITING = 1; + + /** + * 审核状态-审核通过 + */ + Integer AUDIT_STATUS_APPROVED = 2; + + /** + * 审核状态-审核不通过 + */ + Integer AUDIT_STATUS_REJECTED = 3; + + // ==================== 类型常量 ==================== + + /** + * 类型-线下 + */ + String LINE_OFFLINE = "0"; + + /** + * 类型-线上 + */ + String LINE_ONLINE = "1"; } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/enums/AuditResultEnum.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/enums/AuditResultEnum.java new file mode 100644 index 000000000..a44477f4d --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/enums/AuditResultEnum.java @@ -0,0 +1,73 @@ +package org.springblade.desk.quality.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 审核结果枚举 + * + * @author qyl + * @since 2026-05-13 + */ +@Getter +@AllArgsConstructor +public enum AuditResultEnum { + + /** + * 通过 + */ + PASS(1, "通过"), + + /** + * 不通过 + */ + REJECT(2, "不通过"); + + /** + * 结果代码 + */ + private final Integer code; + + /** + * 结果描述 + */ + private final String description; + + /** + * 根据代码获取枚举 + * + * @param code 结果代码 + * @return 枚举值 + */ + public static AuditResultEnum getByCode(Integer code) { + if (code == null) { + return null; + } + for (AuditResultEnum result : values()) { + if (result.getCode().equals(code)) { + return result; + } + } + return null; + } + + /** + * 判断是否通过 + * + * @param code 结果代码 + * @return true-通过,false-不通过 + */ + public static boolean isPass(Integer code) { + return PASS.getCode().equals(code); + } + + /** + * 判断是否不通过 + * + * @param code 结果代码 + * @return true-不通过,false-通过 + */ + public static boolean isReject(Integer code) { + return REJECT.getCode().equals(code); + } +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/ProReTemplate.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/ProReTemplate.java index 18c394f2c..32d00a782 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/ProReTemplate.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/ProReTemplate.java @@ -100,4 +100,52 @@ public class ProReTemplate extends BaseEntity { */ @Schema(description = "备注") private String remark; + + /** + * 审核状态: 0-待审核, 1-审核中, 2-审核通过, 3-审核不通过 + */ + @Schema(description = "审核状态: 0-待审核, 1-审核中, 2-审核通过, 3-审核不通过") + private Integer auditStatus; + + /** + * 一级审核人ID + */ + @Schema(description = "一级审核人ID") + private Long auditor1Id; + + /** + * 一级审核人姓名 + */ + @Schema(description = "一级审核人姓名") + private String auditor1Name; + + /** + * 一级审核时间 + */ + @Schema(description = "一级审核时间") + private java.util.Date auditTime1; + + /** + * 二级审核人ID + */ + @Schema(description = "二级审核人ID") + private Long auditor2Id; + + /** + * 二级审核人姓名 + */ + @Schema(description = "二级审核人姓名") + private String auditor2Name; + + /** + * 二级审核时间 + */ + @Schema(description = "二级审核时间") + private java.util.Date auditTime2; + + /** + * 审核意见 + */ + @Schema(description = "审核意见") + private String auditRemark; } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/ProReTemplateAuditRequest.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/ProReTemplateAuditRequest.java new file mode 100644 index 000000000..58a89125d --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/request/ProReTemplateAuditRequest.java @@ -0,0 +1,50 @@ +package org.springblade.desk.quality.pojo.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springblade.desk.quality.enums.AuditResultEnum; + +import jakarta.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 审核请求DTO + * + * @author qyl + * @since 2026-05-13 + */ +@Data +@Schema(description = "审核请求DTO") +public class ProReTemplateAuditRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "模板ID不能为空") + @Schema(description = "模板ID") + private Long id; + + @NotNull(message = "审核结果不能为空") + @Schema(description = "审核结果: 1-通过, 2-不通过", allowableValues = {"1", "2"}) + private Integer result; + + @Schema(description = "审核意见(不通过时必填)") + private String remark; + + /** + * 判断是否通过 + * + * @return true-通过,false-不通过 + */ + public boolean isPass() { + return AuditResultEnum.isPass(this.result); + } + + /** + * 判断是否不通过 + * + * @return true-不通过,false-通过 + */ + public boolean isReject() { + return AuditResultEnum.isReject(this.result); + } +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateAuditHistoryVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateAuditHistoryVO.java new file mode 100644 index 000000000..c5cb6facc --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateAuditHistoryVO.java @@ -0,0 +1,86 @@ +package org.springblade.desk.quality.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 过程记录模板审核历史VO + * + * @author qyl + * @since 2026-05-13 + */ +@Data +@Schema(description = "过程记录模板审核历史VO") +public class ProReTemplateAuditHistoryVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 模板ID + */ + @Schema(description = "模板ID") + private Long id; + + /** + * 模板名称 + */ + @Schema(description = "模板名称") + private String name; + + /** + * 审核状态: 0-待审核, 1-审核中, 2-审核通过, 3-审核不通过 + */ + @Schema(description = "审核状态: 0-待审核, 1-审核中, 2-审核通过, 3-审核不通过") + private Integer auditStatus; + + /** + * 审核状态名称 + */ + @Schema(description = "审核状态名称") + private String auditStatusName; + + /** + * 一级审核人ID + */ + @Schema(description = "一级审核人ID") + private Long auditor1Id; + + /** + * 一级审核人姓名 + */ + @Schema(description = "一级审核人姓名") + private String auditor1Name; + + /** + * 一级审核时间 + */ + @Schema(description = "一级审核时间") + private Date auditTime1; + + /** + * 二级审核人ID + */ + @Schema(description = "二级审核人ID") + private Long auditor2Id; + + /** + * 二级审核人姓名 + */ + @Schema(description = "二级审核人姓名") + private String auditor2Name; + + /** + * 二级审核时间 + */ + @Schema(description = "二级审核时间") + private Date auditTime2; + + /** + * 审核意见 + */ + @Schema(description = "审核意见") + private String auditRemark; +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateVO.java index f0e2d93e0..34dc30488 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateVO.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateVO.java @@ -34,4 +34,10 @@ public class ProReTemplateVO extends ProReTemplate { private String approvalStatusName; @Schema(description = "tank 槽明细") private List preserveSlotList; + + @Schema(description = "审核状态名称") + private String auditStatusName; + + @Schema(description = "类型名称") + private String lineName; } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/ProReTemplateController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/ProReTemplateController.java index fd90537d6..c52894a52 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/ProReTemplateController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/ProReTemplateController.java @@ -3,6 +3,7 @@ */ package org.springblade.desk.quality.controller; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; @@ -30,6 +31,8 @@ import org.springblade.desk.quality.constant.ProReTemplateConst; import org.springblade.desk.quality.constant.QAModuleConst; import org.springblade.desk.quality.excel.ProReTemplateExcel; import org.springblade.desk.quality.pojo.entity.ProReTemplate; +import org.springblade.desk.quality.pojo.request.ProReTemplateAuditRequest; +import org.springblade.desk.quality.pojo.vo.ProReTemplateAuditHistoryVO; import org.springblade.desk.quality.pojo.vo.ProReTemplateVO; import org.springblade.desk.quality.service.IProReTemplateService; import org.springblade.desk.quality.wrapper.ProReTemplateWrapper; @@ -138,6 +141,11 @@ public class ProReTemplateController extends BladeController { } addOne.setStatus(ProReTemplateConst.STATUS_NEW); + addOne.setAuditStatus(ProReTemplateConst.AUDIT_STATUS_PENDING); // 设置初始审核状态 + // 设置默认类型为线上 + if (StrUtil.isEmpty(addOne.getLine())) { + addOne.setLine(ProReTemplateConst.LINE_ONLINE); + } // addOne.setApprovalStatus(ProReTemplateConst.APPROVAL_STATUS_1); addOne.setId(null); return R.status(service.save(addOne)); @@ -153,6 +161,11 @@ public class ProReTemplateController extends BladeController { public R saveBat(@Valid @RequestBody List addList) { addList.forEach(one -> { one.setStatus(ProReTemplateConst.STATUS_NEW); + one.setAuditStatus(ProReTemplateConst.AUDIT_STATUS_PENDING); // 设置初始审核状态 + // 设置默认类型为线上 + if (StrUtil.isEmpty(one.getLine())) { + one.setLine(ProReTemplateConst.LINE_ONLINE); + } one.setApprovalStatus(ProReTemplateConst.APPROVAL_STATUS_1); one.setId(null); }); @@ -168,6 +181,10 @@ public class ProReTemplateController extends BladeController { @Operation(summary = "修改一条", description = "传入ProReTemplate Obj") public R update(@Valid @RequestBody ProReTemplate updateOne) { + // 检查唯一性(增加line字段) + //if (!service.checkUnique(updateOne.getWcId(), updateOne.getPpsId(), updateOne.getLine(), updateOne.getId())) { + // return R.fail("存在对应作业中心-工序-类型的已启用模板"); + //} QueryWrapper qw = new QueryWrapper<>(); qw.eq("WC_ID",updateOne.getWcId()); @@ -310,4 +327,36 @@ public class ProReTemplateController extends BladeController { public R copy(@Parameter(description = "主键", required = true) @RequestParam Long id) { return service.copy(id); } + + /** + * 发布过程记录模板 + */ + @PostMapping("/publish") + @ApiOperationSupport(order = 35) + @ApiLog("发布过程记录模板") + @Operation(summary = "发布模板", description = "发布模板提交审核") + public R publish(@Parameter(description = "模板ID", required = true) @RequestParam Long id) { + return service.publish(id); + } + + /** + * 审核过程记录模板(一级或二级) + */ + @PostMapping("/audit") + @ApiOperationSupport(order = 36) + @ApiLog("审核过程记录模板") + @Operation(summary = "审核模板", description = "审核") + public R audit(@Valid @RequestBody ProReTemplateAuditRequest request) { + return service.audit(request); + } + + /** + * 查询审核历史 + */ + @GetMapping("/auditHistory/{id}") + @ApiOperationSupport(order = 38) + @Operation(summary = "查询审核历史", description = "传入模板ID") + public R getAuditHistory(@Parameter(description = "模板ID", required = true) @PathVariable Long id) { + return R.data(service.getAuditHistory(id)); + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/IProReTemplateService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/IProReTemplateService.java index bd7af0a7e..38d6c5f3b 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/IProReTemplateService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/IProReTemplateService.java @@ -9,10 +9,13 @@ import org.springblade.core.tool.api.R; import org.springblade.desk.basic.service.en.EnBaseService; import org.springblade.desk.quality.excel.ProReTemplateExcel; import org.springblade.desk.quality.pojo.entity.ProReTemplate; +import org.springblade.desk.quality.pojo.request.ProReTemplateAuditRequest; +import org.springblade.desk.quality.pojo.vo.ProReTemplateAuditHistoryVO; import org.springblade.desk.quality.pojo.vo.ProReTemplateVO; import java.math.BigDecimal; import java.util.List; +import java.util.Map; /** * [过程记录模板] 服务类 @@ -54,4 +57,39 @@ public interface IProReTemplateService extends EnBaseService { R removeFromDetail(Long tankId); List getDataByWcIdAndPpsId(Long wcId, Long ppsId, Boolean aTrue); + + /** + * 发布模板(启动审核流程) + * + * @param id 模板ID + * @return R + */ + R publish(Long id); + + /** + * 审核模板(自动判断一级或二级) + * + * @param request 审核请求 + * @return R + */ + R audit(ProReTemplateAuditRequest request); + + /** + * 查询审核历史 + * + * @param id 模板ID + * @return 审核历史信息 + */ + ProReTemplateAuditHistoryVO getAuditHistory(Long id); + + /** + * 检查唯一性(增加line字段) + * + * @param wcId 作业中心ID + * @param ppsId 工序ID + * @param line 类型 + * @param excludeId 排除的ID + * @return true-唯一,false-不唯一 + */ + boolean checkUnique(Long wcId, Long ppsId, String line, Long excludeId); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/ProReTemplateServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/ProReTemplateServiceImpl.java index 837b1581f..051d7ccfb 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/ProReTemplateServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/ProReTemplateServiceImpl.java @@ -6,6 +6,7 @@ package org.springblade.desk.quality.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jakarta.annotation.Resource; @@ -13,16 +14,24 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springblade.common.exception.BusinessException; +import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.desk.basic.pojo.entity.WorkCenter; import org.springblade.desk.basic.service.IWorkCenterService; import org.springblade.desk.basic.service.en.impl.EnBaseServiceImpl; +import org.springblade.desk.common.feign.IMesNotifyMessageClient; +import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity; import org.springblade.desk.dashboard.pojo.entity.BsProcessSetEntity; import org.springblade.desk.dashboard.service.IBsProcessSetService; import org.springblade.desk.quality.constant.ProReTemplateConst; +import org.springblade.desk.quality.enums.AuditResultEnum; import org.springblade.desk.quality.excel.ProReTemplateExcel; import org.springblade.desk.quality.mapper.ProReTemplateMapper; import org.springblade.desk.quality.pojo.entity.ProReTemplate; +import org.springblade.desk.quality.pojo.request.ProReTemplateAuditRequest; +import org.springblade.desk.quality.pojo.vo.ProReTemplateAuditHistoryVO; import org.springblade.desk.quality.pojo.vo.ProReTemplateDetailVO; import org.springblade.desk.quality.pojo.vo.ProReTemplateTankVO; import org.springblade.desk.quality.pojo.vo.ProReTemplateVO; @@ -30,13 +39,16 @@ import org.springblade.desk.quality.service.IProReTemplateDetailService; import org.springblade.desk.quality.service.IProReTemplateService; import org.springblade.desk.quality.service.IProReTemplateTankService; import org.springblade.desk.basic.util.IdUtil; +import org.springblade.desk.basic.util.RoleUtil; import org.springblade.system.feign.IDictClient; import org.springblade.system.feign.ISysClient; import org.springblade.system.feign.IUserClient; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; +import java.util.stream.Stream; /** * [过程记录模板] 服务实现类 @@ -66,6 +78,8 @@ public class ProReTemplateServiceImpl extends EnBaseServiceImpl selectProReTemplatePage(IPage page, ProReTemplateVO proReTemplate) { @@ -141,6 +155,7 @@ public class ProReTemplateServiceImpl extends EnBaseServiceImpl queryWrapper = Wrappers.lambdaQuery(ProReTemplate.class); queryWrapper.eq(wcId != null, ProReTemplate::getWcId, wcId); queryWrapper.eq(ProReTemplate::getPpsId, ppsId); - queryWrapper.eq(ProReTemplate::getLine, aTrue ? "1" : "0"); - queryWrapper.eq(ProReTemplate::getStatus, 2); + queryWrapper.eq(ProReTemplate::getLine, aTrue ? ProReTemplateConst.LINE_ONLINE : ProReTemplateConst.LINE_OFFLINE); + queryWrapper.eq(ProReTemplate::getStatus, ProReTemplateConst.STATUS_OK); return this.list(queryWrapper); } + + @Override + @Transactional(rollbackFor = Exception.class) + public R publish(Long id) { + ProReTemplate template = getById(id); + if (template == null) { + return R.fail("模板不存在"); + } + + // 只有新建状态才能发布 + if (!ProReTemplateConst.STATUS_NEW.equals(template.getStatus())) { + return R.fail("只有新建状态的模板才能发布"); + } + + // 更新状态为待审核 + template.setAuditStatus(ProReTemplateConst.AUDIT_STATUS_PENDING); + updateById(template); + + // 发送消息通知给一级审核人 + sendNotificationToLevel1(template); + + return R.success(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R audit(ProReTemplateAuditRequest request) { + // 查询模板 + ProReTemplate template = getById(request.getId()); + if (template == null) { + throw new RuntimeException("模板不存在"); + } + + // 校验审核结果 + if (request.getResult() == null || AuditResultEnum.getByCode(request.getResult()) == null) { + throw new RuntimeException("审核结果错误,1-通过,2-不通过"); + } + + // 审核不通过时,意见必填 + if (request.isReject() && StringUtils.isBlank(request.getRemark())) { + return R.fail("审核不通过时,必须填写审核意见"); + } + + // 根据当前状态判断是一级还是二级审核 + Integer auditStatus = template.getAuditStatus(); + + if (ProReTemplateConst.AUDIT_STATUS_PENDING.equals(auditStatus)) { + // 一级审核 + return processLevel1Audit(template, request); + } else if (ProReTemplateConst.AUDIT_STATUS_AUDITING.equals(auditStatus)) { + // 二级审核 + return processLevel2Audit(template, request); + } else { + throw new RuntimeException("当前状态不允许审核"); + } + } + + /** + * 处理一级审核 + */ + private R processLevel1Audit(ProReTemplate template, ProReTemplateAuditRequest request) { + // 校验权限 + if (!hasAuditRoleLevel1()) { + return R.fail("您没有一级审核权限"); + } + + Long currentUserId = AuthUtil.getUserId(); + String currentUserName = AuthUtil.getUserName(); + Date now = new Date(); + + if (request.isPass()) { + // 审核通过 + template.setAuditor1Id(currentUserId); + template.setAuditor1Name(currentUserName); + template.setAuditTime1(now); + template.setAuditStatus(ProReTemplateConst.AUDIT_STATUS_AUDITING); + template.setAuditRemark(null); + + // 发送消息通知给二级审核人 + sendNotificationToLevel2(template); + updateById(template); + return R.success(); + } else { + // 审核不通过 + template.setAuditStatus(ProReTemplateConst.AUDIT_STATUS_REJECTED); + template.setAuditRemark(request.getRemark()); + updateById(template); + return R.success(); + } + } + + /** + * 处理二级审核 + */ + private R processLevel2Audit(ProReTemplate template, ProReTemplateAuditRequest request) { + // 校验权限 + if (!hasAuditRoleLevel2()) { + return R.fail("您没有二级审核权限"); + } + + Long currentUserId = AuthUtil.getUserId(); + String currentUserName = AuthUtil.getUserName(); + Date now = new Date(); + + if (request.isPass()) { + // 审核通过 + template.setAuditor2Id(currentUserId); + template.setAuditor2Name(currentUserName); + template.setAuditTime2(now); + template.setAuditStatus(ProReTemplateConst.AUDIT_STATUS_APPROVED); + + // 将同一作业中心-工序-类型的其他模板改为废弃 + disableOtherTemplates(template.getWcId(), template.getPpsId(), template.getLine(), template.getId()); + + // 更新当前模板为使用中 + template.setStatus(ProReTemplateConst.STATUS_OK); + template.setAuditRemark(null); + updateById(template); + return R.success("二级审核通过,模板已生效"); + } else { + // 审核不通过 + template.setAuditStatus(ProReTemplateConst.AUDIT_STATUS_REJECTED); + template.setAuditRemark(request.getRemark()); + updateById(template); + return R.success("二级审核不通过"); + } + } + + @Override + public ProReTemplateAuditHistoryVO getAuditHistory(Long id) { + ProReTemplate template = getById(id); + if (template == null) { + return null; + } + + ProReTemplateAuditHistoryVO history = new ProReTemplateAuditHistoryVO(); + history.setId(template.getId()); + history.setName(template.getName()); + history.setAuditStatus(template.getAuditStatus()); + history.setAuditStatusName(getAuditStatusName(template.getAuditStatus())); + history.setAuditor1Id(template.getAuditor1Id()); + history.setAuditor1Name(template.getAuditor1Name()); + history.setAuditTime1(template.getAuditTime1()); + history.setAuditor2Id(template.getAuditor2Id()); + history.setAuditor2Name(template.getAuditor2Name()); + history.setAuditTime2(template.getAuditTime2()); + history.setAuditRemark(template.getAuditRemark()); + + return history; + } + + /** + * 获取审核状态名称 + * + * @param auditStatus 审核状态 + * @return 状态名称 + */ + private String getAuditStatusName(Integer auditStatus) { + if (auditStatus == null) { + return "未知"; + } + switch (auditStatus) { + case 0: + return "待审核"; + case 1: + return "审核中"; + case 2: + return "审核通过"; + case 3: + return "审核不通过"; + default: + return "未知"; + } + } + + @Override + public boolean checkUnique(Long wcId, Long ppsId, String line, Long excludeId) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(ProReTemplate.class); + queryWrapper.eq(ProReTemplate::getWcId, wcId); + queryWrapper.eq(ProReTemplate::getPpsId, ppsId); + queryWrapper.eq(ProReTemplate::getLine, line); + queryWrapper.eq(ProReTemplate::getStatus, ProReTemplateConst.STATUS_OK); + if (excludeId != null) { + queryWrapper.ne(ProReTemplate::getId, excludeId); + } + + return count(queryWrapper) == 0; + } + + /** + * 检查一级审核权限 + */ + private boolean hasAuditRoleLevel1() { + // 工艺组长/工艺室主任 + return RoleUtil.hasAnyRole("process_manager","热表-工艺组长"); + } + + /** + * 检查二级审核权限 + */ + private boolean hasAuditRoleLevel2() { + // 厂长/副厂长 + return RoleUtil.hasAnyRole("plant_manager","deputy_plant_manager"); + } + + /** + * 发送消息通知给二级审核人 + */ + private void sendNotificationToLevel2(ProReTemplate template) { + try { + Map roleIdNameMap = new HashMap<>(2){{ + put(2049025452882501633L, "厂长"); + put(2049026003313598466L, "副厂长"); + }}; + roleIdNameMap.entrySet().stream().forEach(entry -> { + Long level2RoleId = entry.getKey(); + String roleName = entry.getValue(); + + String title = String.format("过程记录模板审核提醒 - %s", template.getName()); + + String content = String.format( + "过程记录模板审核详情:\n" + + "- 模板名称:%s\n" + + "- 作业中心ID:%s\n" + + "- 工序ID:%s\n" + + "- 类型:%s\n" + + "- 一级审核人:%s\n" + + "- 一级审核时间:%s\n" + + "- 状态:一级审核通过,等待二级审核", + template.getName(), + template.getWcId(), + template.getPpsId(), + ProReTemplateConst.LINE_ONLINE.equals(template.getLine()) ? "线上" : "线下", + template.getAuditor1Name(), + template.getAuditTime1() + ); + + MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder() + .title(title) + .content(content) + .receiveRoleId(level2RoleId) + .receiveRoleName(roleName) + .receiveUserId(AuthUtil.getUserId()) + .build(); + + R result = mesNotifyMessageClient.save(notifyMessage); + + if (result != null && result.isSuccess()) { + log.info("成功发送二级审核提醒,模板ID: {}", template.getId()); + } + }); + } catch (Exception e) { + log.error("发送二级审核提醒时发生异常,模板ID: {}", template.getId(), e); + } + } + + /** + * 发送消息通知给一级审核人 + */ + private void sendNotificationToLevel1(ProReTemplate template) { + try { + Map roleMap = new HashMap<>(2){{ + put(2038575519089082370L,"工艺组长"); + put(2032370955230949378L,"工艺室主任"); + }}; + // 工艺组长/工艺室主任 + roleMap.forEach((level1RoleId, roleName) -> { + + String title = String.format("过程记录模板发布提醒 - %s", template.getName()); + + String content = String.format( + "过程记录模板已发布,等待审核:\n" + + "- 模板名称:%s\n" + + "- 作业中心ID:%s\n" + + "- 工序ID:%s\n" + + "- 类型:%s\n" + + "- 状态:待一级审核", + template.getName(), + template.getWcId(), + template.getPpsId(), + ProReTemplateConst.LINE_ONLINE.equals(template.getLine()) ? "线上" : "线下" + ); + + MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder() + .title(title) + .content(content) + .receiveRoleId(level1RoleId) + .receiveRoleName(roleName) + .receiveUserId(AuthUtil.getUserId()) + .build(); + + R result = mesNotifyMessageClient.save(notifyMessage); + + if (result != null && result.isSuccess()) { + log.info("成功发送一级审核提醒,模板ID: {}", template.getId()); + } + }); + + } catch (Exception e) { + log.error("发送一级审核提醒时发生异常,模板ID: {}", template.getId(), e); + } + } + + /** + * 将其他模板改为废弃 + */ + private void disableOtherTemplates(Long wcId, Long ppsId, String line, Long excludeId) { + LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(ProReTemplate.class) + .eq(ProReTemplate::getWcId, wcId) + .eq(ProReTemplate::getPpsId, ppsId) + .eq(ProReTemplate::getLine, line) + .eq(ProReTemplate::getStatus, ProReTemplateConst.STATUS_OK) + .ne(ProReTemplate::getId, excludeId) + .set(ProReTemplate::getStatus, ProReTemplateConst.STATUS_NO); + update(updateWrapper); + } }