diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModify.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModify.java new file mode 100644 index 000000000..addc348d5 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModify.java @@ -0,0 +1,81 @@ +/** + * Author: Tom Shuo + */ +package org.springblade.desk.basic.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; +import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyDVO; + +import java.io.Serial; +import java.time.LocalDateTime; +import java.util.List; + +/** + * [分派控制调整] 实体类 + * + * @author Tom Shuo + * @since 2026-05-20 + */ +@Data +@TableName("BS_PLAN_ASSIGN_STEER_MODIFY") +@Schema(description = "PlanAssignSteerModify Entity对象") +@EqualsAndHashCode(callSuper = true) +public class PlanAssignSteerModify extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public static final String COL_PASM_ID = "PASM_ID"; + public static final String COL_PASM_MEMO = "PASM_MEMO"; + public static final String COL_PLATING_ID = "PLATING_ID"; + public static final String COL_CREATE_MAN = "CREATE_MAN"; + public static final String COL_CREATE_TIME = "CREATE_TIME"; + public static final String COL_APPROVAL_STATUS = "APPROVAL_STATUS"; + + /** + * 审批状态常量定义 + */ + public interface ApprovalStatus { + /** + * 草稿(待提交) + */ + Integer DRAFT = 0; + + /** + * 一级审批 + */ + Integer LEVEL1_APPROVING = 1; + + /** + * 审批通过 + */ + Integer PASS = 2; + + /** + * 审批驳回 + */ + Integer REJECT = 3; + + /** + * 二级审批 + */ + Integer LEVEL2_APPROVING = 4; + } + + @Schema(description = "工艺能力ID") + private Long platingId; + + @Schema(description = "备注") + private String pasmMemo; + + @Schema(description = "申请人") + private Long createMan; + + @Schema(description = "审批状态: 0-草稿, 1-一级审批中, 2-审批通过, 3-审批驳回, 4-二级审批中") + private Integer approvalStatus = ApprovalStatus.DRAFT; +} \ No newline at end of file diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModifyApproval.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModifyApproval.java new file mode 100644 index 000000000..9716feec1 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModifyApproval.java @@ -0,0 +1,62 @@ +/** + * Author: AI Assistant + */ +package org.springblade.desk.basic.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * [分派控制调整审批记录] 实体类 + * + * @author AI Assistant + * @since 2026-05-22 + */ +@Data +@TableName("BS_PASM_APPRV") +@Schema(description = "PlanAssignSteerModifyApproval Entity对象") +@EqualsAndHashCode(callSuper = true) +public class PlanAssignSteerModifyApproval extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public static final String COL_PASM_ID = "PASM_ID"; + public static final String COL_APPROVAL_NODE = "APPROVAL_NODE"; + public static final String COL_APPROVAL_NODE_NAME = "APPROVAL_NODE_NAME"; + public static final String COL_AUDITOR_ID = "AUDITOR_ID"; + public static final String COL_AUDITOR_NAME = "AUDITOR_NAME"; + public static final String COL_AUDIT_RESULT = "AUDIT_RESULT"; + public static final String COL_AUDIT_REMARK = "AUDIT_REMARK"; + public static final String COL_AUDIT_TIME = "AUDIT_TIME"; + + @Schema(description = "调整单ID") + private Long pasmId; + + @Schema(description = "审批节点:1-一级审批,2-二级审批") + private Integer approvalNode; + + @Schema(description = "审批节点名称") + private String approvalNodeName; + + @Schema(description = "审批人ID") + private Long auditorId; + + @Schema(description = "审批人姓名") + private String auditorName; + + @Schema(description = "审批结果:1-通过,2-驳回") + private Integer auditResult; + + @Schema(description = "审批意见") + private String auditRemark; + + @Schema(description = "审批时间") + private Date auditTime; +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModifyD.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModifyD.java new file mode 100644 index 000000000..986693f79 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModifyD.java @@ -0,0 +1,51 @@ +/** + * Author: Tom Shuo + */ +package org.springblade.desk.basic.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.io.Serial; +import java.math.BigDecimal; + +/** + * [分派控制调整明细] 实体类 + * + * @author Tom Shuo + * @since 2026-05-20 + */ +@Data +@TableName("BS_PLAN_ASSIGN_STEER_MODIFYD") +@Schema(description = "PlanAssignSteerModifyD Entity对象") +@EqualsAndHashCode(callSuper = true) +public class PlanAssignSteerModifyD extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public static final String COL_PASMD_ID = "PASMD_ID"; + public static final String COL_PASM_ID = "PASM_ID"; + public static final String COL_OEM_ID = "OEM_ID"; + public static final String COL_PLATING_ID = "PLATING_ID"; + public static final String COL_ASSIGN_SCALE = "ASSIGN_SCALE"; + public static final String COL_PAS_ID = "PAS_ID"; + + @Schema(description = "分派控制调整单ID") + private Long pasmId; + + @Schema(description = "供应商ID") + private Long oemId; + + @Schema(description = "工艺能力ID") + private Long platingId; + + @Schema(description = "分派比例") + private BigDecimal assignScale; + + @Schema(description = "计划分派控制ID") + private Long pasId; +} \ No newline at end of file diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlanAssignSteerModifyDVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlanAssignSteerModifyDVO.java new file mode 100644 index 000000000..85ab121c2 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlanAssignSteerModifyDVO.java @@ -0,0 +1,38 @@ +/** + * Author: Tom Shuo + */ +package org.springblade.desk.basic.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyD; + +import java.io.Serial; +import java.math.BigDecimal; + +/** + * [分派控制调整明细] 视图实体类 + * + * @author Tom Shuo + * @since 2026-05-20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class PlanAssignSteerModifyDVO extends PlanAssignSteerModifyD { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "供应商名称") + private String oemName; + + @Schema(description = "工艺能力名称") + private String platingName; + @Schema(description = "供应商ID") + private Long oemId; + + @Schema(description = "工艺能力ID") + private Long platingId; + @Schema(description = "分派比例") + private BigDecimal assignScale; +} \ No newline at end of file diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlanAssignSteerModifyTimelineVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlanAssignSteerModifyTimelineVO.java new file mode 100644 index 000000000..b0a2d2279 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlanAssignSteerModifyTimelineVO.java @@ -0,0 +1,45 @@ + +package org.springblade.desk.basic.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * [分派控制调整审批时间线数据] VO + * + * @author AI Assistant + * @since 2026-05-22 + */ +@Data +@Schema(description = "分派控制调整审批时间线数据VO") +public class PlanAssignSteerModifyTimelineVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "类型: submit-提交, audit-审核") + private String type; + + @Schema(description = "标签: 提交人/审核人") + private String label; + + @Schema(description = "值: 人员姓名") + private String value; + + @Schema(description = "时间") + private String time; + + @Schema(description = "状态: false-待处理, success-已完成") + private String status; + + @Schema(description = "审批节点:1-室主任审批,2-领导审批") + private Integer approvalNode; + + @Schema(description = "审批意见") + private String remark; + + @Schema(description = "子节点列表") + private List children; +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlanAssignSteerModifyVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlanAssignSteerModifyVO.java new file mode 100644 index 000000000..00244cefa --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlanAssignSteerModifyVO.java @@ -0,0 +1,35 @@ +package org.springblade.desk.basic.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModify; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyD; + +import java.io.Serial; +import java.util.List; + +/** + * [分派控制调整] 视图实体类 + * + * @author Tom Shuo + * @since 2026-05-20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class PlanAssignSteerModifyVO extends PlanAssignSteerModify { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "当前状态描述") + private String approvalStatusDesc; + + @Schema(description = "明细列表") + private List modifyLst; + + @Schema(description = "工艺能力名称") + private String platingName; + + @Schema(description = "申请人名称") + private String createManName; +} \ No newline at end of file diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/enums/SettlementErrorReasonEnum.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/enums/SettlementErrorReasonEnum.java new file mode 100644 index 000000000..6fb75691a --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/enums/SettlementErrorReasonEnum.java @@ -0,0 +1,91 @@ +package org.springblade.desk.oem.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 外协结算异常原因枚举 + * + * @author qyl + * @since 2026-05-13 + */ +@Getter +@AllArgsConstructor +public enum SettlementErrorReasonEnum { + + /** + * 未找到报价单 + */ + NO_QUOTATION("NO_QUOTATION", "未找到报价单"), + + /** + * 订单数据错误 + */ + ORDER_DATA_ERROR("ORDER_DATA_ERROR", "订单数据错误"), + + /** + * MES结算审核不通过 + */ + MES_APPROVAL_REJECTED("MES_APPROVAL_REJECTED", "MES结算审核不通过"), + + /** + * ERP结算审核不通过 + */ + ERP_APPROVAL_REJECTED("ERP_APPROVAL_REJECTED", "ERP结算审核不通过"), + + /** + * 无需结算 + */ + NO_SETTLEMENT_NEEDED("NO_SETTLEMENT_NEEDED", "无需结算"), + + /** + * 重复镀后入库 + */ + DUPLICATE_PUT_STORE("DUPLICATE_PUT_STORE", "重复镀后入库"); + + /** + * 异常原因编码 + */ + private final String code; + + /** + * 异常原因描述 + */ + private final String description; + + /** + * 根据编码获取枚举 + * + * @param code 异常原因编码 + * @return 枚举对象 + */ + public static SettlementErrorReasonEnum getByCode(String code) { + if (code == null) { + return null; + } + for (SettlementErrorReasonEnum reason : values()) { + if (reason.getCode().equals(code)) { + return reason; + } + } + return null; + } + + /** + * 根据描述获取枚举 + * + * @param description 异常原因描述 + * @return 枚举对象 + */ + public static SettlementErrorReasonEnum getByDescription(String description) { + if (description == null) { + return null; + } + for (SettlementErrorReasonEnum reason : values()) { + if (reason.getDescription().equals(description)) { + return reason; + } + } + return null; + } +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/request/SettlementConfirmRequest.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/request/SettlementConfirmRequest.java new file mode 100644 index 000000000..da1c745b2 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/request/SettlementConfirmRequest.java @@ -0,0 +1,43 @@ +package org.springblade.desk.oem.pojo.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 结算确认请求 + * + * @author qyl + * @since 2026-05-12 + */ +@Data +@Schema(description = "结算确认请求") +public class SettlementConfirmRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 结算单ID列表 + */ + @NotEmpty(message = "结算单ID不能为空") + @Schema(description = "结算单ID列表", required = true) + private List ids; + + /** + * 确认结果:true-结算正确,false-结算异常 + */ + @NotNull(message = "确认结果不能为空") + @Schema(description = "确认结果:true-结算正确,false-结算异常", required = true) + private Boolean confirmResult; + + /** + * 异常原因(结算异常时必填) + * 可选值:订单数据错误、无需结算 + */ + @Schema(description = "异常原因(结算异常时必填),可选值:订单数据错误、无需结算") + private String errorReason; +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalTimelineVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalTimelineVO.java index de2086600..2218bb5b7 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalTimelineVO.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalTimelineVO.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; +import java.util.List; /** * 分派配置审批时间线数据VO @@ -37,4 +38,6 @@ public class DispatchConfigApprovalTimelineVO implements Serializable { @Schema(description = "审批意见") private String remark; + + List children; } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateTimelineVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateTimelineVO.java index 18ff7cb23..29b24f54b 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateTimelineVO.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateTimelineVO.java @@ -29,7 +29,7 @@ public class ProReTemplateTimelineVO implements Serializable { @Schema(description = "时间") private String time; - @Schema(description = "状态: pending-待处理, success-已完成") + @Schema(description = "状态") private String status; @Schema(description = "备注") diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyApprovalMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyApprovalMapper.java new file mode 100644 index 000000000..0a70feb71 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyApprovalMapper.java @@ -0,0 +1,24 @@ +/** + * Author: AI Assistant + */ +package org.springblade.desk.basic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyApproval; + +/** + * [分派控制调整审批记录] Mapper接口 + * + * @author AI Assistant + * @since 2026-05-22 + */ +@Mapper +public interface PlanAssignSteerModifyApprovalMapper extends BaseMapper { + + /** + * 根据调整单ID删除审批记录 + */ + void deleteByPasmId(@Param("pasmId") Long pasmId); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyApprovalMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyApprovalMapper.xml new file mode 100644 index 000000000..111e50707 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyApprovalMapper.xml @@ -0,0 +1,13 @@ + + + + + + + UPDATE BS_PASM_APPRV + SET IS_DELETED = 1 + WHERE PASM_ID = #{pasmId} + AND IS_DELETED = 0 + + + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyDMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyDMapper.java new file mode 100644 index 000000000..375aa02e6 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyDMapper.java @@ -0,0 +1,23 @@ +/** + * Author: Tom Shuo + */ +package org.springblade.desk.basic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyD; + +import java.util.List; + +/** + * [分派控制调整明细] Mapper 接口 + * + * @author Tom Shuo + * @since 2026-05-20 + */ +public interface PlanAssignSteerModifyDMapper extends BaseMapper { + + List findByPasmId(@Param("pasmId") Long pasmId); + + void deleteByPasmId(@Param("pasmId") Long pasmId); +} \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyDMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyDMapper.xml new file mode 100644 index 000000000..9bafe8e03 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyDMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + DELETE FROM BS_PLAN_ASSIGN_STEER_MODIFYD WHERE PASM_ID = #{pasmId} + + \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyMapper.java new file mode 100644 index 000000000..b29ace575 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyMapper.java @@ -0,0 +1,32 @@ +/** + * Author: Tom Shuo + */ +package org.springblade.desk.basic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModify; +import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyVO; +import org.springblade.system.pojo.entity.UserInfo; + +import java.util.List; + +/** + * [分派控制调整] Mapper 接口 + * + * @author Tom Shuo + * @since 2026-05-20 + */ +public interface PlanAssignSteerModifyMapper extends BaseMapper { + + List selectPlanAssignSteerModifyPage(IPage page, PlanAssignSteerModify planAssignSteerModify); + + List exportPlanAssignSteerModify(PlanAssignSteerModifyVO planAssignSteerModify); + + List findByPasmId(@Param("pasmId") Long pasmId); + + + List getLevel2AuditorIds(); + +} \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyMapper.xml new file mode 100644 index 000000000..93d589801 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyMapper.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlanAssignSteerModifyApprovalService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlanAssignSteerModifyApprovalService.java new file mode 100644 index 000000000..6f3ea98fe --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlanAssignSteerModifyApprovalService.java @@ -0,0 +1,33 @@ +/** + * Author: AI Assistant + */ +package org.springblade.desk.basic.service; + +import org.springblade.core.mp.base.BaseService; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyApproval; + +import java.util.List; + +/** + * [分派控制调整审批记录] 服务类 + * + * @author AI Assistant + * @since 2026-05-22 + */ +public interface IPlanAssignSteerModifyApprovalService extends BaseService { + + /** + * 根据调整单ID查询审批记录列表 + * + * @param pasmId 调整单ID + * @return 审批记录列表 + */ + List findByPasmId(Long pasmId); + + /** + * 根据调整单ID删除审批记录 + * + * @param pasmId 调整单ID + */ + void deleteByPasmId(Long pasmId); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlanAssignSteerModifyDService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlanAssignSteerModifyDService.java new file mode 100644 index 000000000..e5c6b0a57 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlanAssignSteerModifyDService.java @@ -0,0 +1,33 @@ +/** + * Author: Tom Shuo + */ +package org.springblade.desk.basic.service; + +import org.springblade.core.mp.base.BaseService; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyD; + +import java.util.List; + +/** + * [分派控制调整明细] 服务类 + * + * @author Tom Shuo + * @since 2026-05-20 + */ +public interface IPlanAssignSteerModifyDService extends BaseService { + + /** + * 根据主表ID查询明细列表 + * + * @param pasmId 主表ID + * @return 明细列表 + */ + List findByPasmId(Long pasmId); + + /** + * 根据主表ID删除明细 + * + * @param pasmId 主表ID + */ + void deleteByPasmId(Long pasmId); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlanAssignSteerModifyService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlanAssignSteerModifyService.java new file mode 100644 index 000000000..1c785c69c --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlanAssignSteerModifyService.java @@ -0,0 +1,44 @@ +/** + * Author: Tom Shuo + */ +package org.springblade.desk.basic.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.mp.base.BaseService; +import org.springblade.core.tool.api.R; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModify; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyD; +import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyDVO; +import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyTimelineVO; +import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyVO; + +import java.util.List; + +/** + * [分派控制调整] 服务类 + * + * @author Tom Shuo + * @since 2026-05-20 + */ +public interface IPlanAssignSteerModifyService extends BaseService { + + IPage selectPlanAssignSteerModifyPage(IPage page, PlanAssignSteerModify planAssignSteerModify); + + List exportPlanAssignSteerModify(PlanAssignSteerModifyVO planAssignSteerModify); + + R saveOrUpdateModify(PlanAssignSteerModifyVO modify, List modifyLst); + + R submitApproval(Long id); + + R audit(Long id, Integer result, String remark); + + /** + * 查询审批时间线 + * + * @param id 主键ID + * @return 审批时间线数据列表 + */ + List getAuditTimeline(Long id); + + PlanAssignSteerModifyVO getDetail(Long pasmId, Long caId); +} \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyApprovalServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyApprovalServiceImpl.java new file mode 100644 index 000000000..8d98ed1c9 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyApprovalServiceImpl.java @@ -0,0 +1,47 @@ +/** + * Author: AI Assistant + */ +package org.springblade.desk.basic.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.desk.basic.mapper.PlanAssignSteerModifyApprovalMapper; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyApproval; +import org.springblade.desk.basic.service.IPlanAssignSteerModifyApprovalService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * [分派控制调整审批记录] 服务实现类 + * + * @author AI Assistant + * @since 2026-05-22 + */ +@Service +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class PlanAssignSteerModifyApprovalServiceImpl extends BaseServiceImpl implements IPlanAssignSteerModifyApprovalService { + + + @Override + public List findByPasmId(Long pasmId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("PASM_ID", pasmId) + .eq("IS_DELETED", 0) + .orderByAsc("APPROVAL_NODE", "AUDIT_TIME"); + return baseMapper.selectList(queryWrapper); + } + + @Override + public void deleteByPasmId(Long pasmId) { + //planAssignSteerModifyApprovalMapper.deleteByPasmId(pasmId); + remove(Wrappers.lambdaQuery(PlanAssignSteerModifyApproval.class) + .eq(PlanAssignSteerModifyApproval::getPasmId, pasmId)); + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyDServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyDServiceImpl.java new file mode 100644 index 000000000..8f4c5f8b5 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyDServiceImpl.java @@ -0,0 +1,44 @@ +/** + * Author: Tom Shuo + */ +package org.springblade.desk.basic.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import jakarta.annotation.Resource; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.desk.basic.mapper.PlanAssignSteerModifyDMapper; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyD; +import org.springblade.desk.basic.service.IPlanAssignSteerModifyDService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * [分派控制调整明细] 服务实现类 + * + * @author Tom Shuo + * @since 2026-05-20 + */ +@Service +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class PlanAssignSteerModifyDServiceImpl extends BaseServiceImpl implements IPlanAssignSteerModifyDService { + + @Resource + private PlanAssignSteerModifyDMapper planAssignSteerModifyDMapper; + + @Override + public List findByPasmId(Long pasmId) { + return planAssignSteerModifyDMapper.findByPasmId(pasmId); + } + + @Override + public void deleteByPasmId(Long pasmId) { + remove(Wrappers.lambdaQuery(PlanAssignSteerModifyD.class) + .eq(PlanAssignSteerModifyD::getPasmId,pasmId)); + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyServiceImpl.java new file mode 100644 index 000000000..7518e6e1f --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyServiceImpl.java @@ -0,0 +1,522 @@ +/** + * Author: Tom Shuo + */ +package org.springblade.desk.basic.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import jakarta.annotation.Resource; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; +import org.springblade.desk.basic.mapper.PlanAssignSteerModifyApprovalMapper; +import org.springblade.desk.basic.mapper.PlanAssignSteerModifyMapper; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteer; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModify; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyApproval; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyD; +import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyDVO; +import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyTimelineVO; +import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyVO; +import org.springblade.desk.basic.service.*; +import org.springblade.system.feign.IUserClient; +import org.springblade.system.pojo.entity.User; +import org.springblade.system.pojo.entity.UserInfo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +import cn.hutool.core.date.DateUtil; + +/** + * [分派控制调整] 服务实现类 + * + * @author Tom Shuo + * @since 2026-05-20 + */ +@Service +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Slf4j +public class PlanAssignSteerModifyServiceImpl extends BaseServiceImpl implements IPlanAssignSteerModifyService { + + @Resource + private IPlanAssignSteerModifyDService planAssignSteerModifyDService; + + + @Resource + private IPlanAssignSteerModifyApprovalService planAssignSteerModifyApprovalService; + + @Resource + private IPlanAssignSteerService planAssignSteerService; + + @Resource + private IBsAssignService bsAssignService; + + @Resource + IUserClient userClient; + + @Override + public IPage selectPlanAssignSteerModifyPage(IPage page, PlanAssignSteerModify planAssignSteerModify) { + return page.setRecords(baseMapper.selectPlanAssignSteerModifyPage(page, planAssignSteerModify)); + } + + @Override + public List exportPlanAssignSteerModify(PlanAssignSteerModifyVO planAssignSteerModify) { + return baseMapper.exportPlanAssignSteerModify(planAssignSteerModify); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R saveOrUpdateModify(PlanAssignSteerModifyVO modify, List modifyLst) { + // 校验明细列表不能为空 + if (modifyLst == null || modifyLst.isEmpty()) { + return R.fail("明细列表不能为空"); + } + + // 计算分派比例总和 + BigDecimal totalScale = BigDecimal.ZERO; + for (PlanAssignSteerModifyDVO modifyD : modifyLst) { + if (modifyD.getAssignScale() != null) { + totalScale = totalScale.add(modifyD.getAssignScale()); + } + } + + if (totalScale.compareTo(new BigDecimal("100")) != 0) { + return R.fail("分派比例总和必须等于100"); + } + + PlanAssignSteerModify entity = new PlanAssignSteerModify(); + BeanUtil.copyProperties(modify, entity); + + if (Objects.isNull(entity.getId())) { + save(entity); + for (PlanAssignSteerModifyDVO detail : modifyLst) { + PlanAssignSteerModifyD d = new PlanAssignSteerModifyD(); + BeanUtil.copyProperties(detail, d); + d.setPasmId(entity.getId()); + planAssignSteerModifyDService.save(d); + } + } else { + updateById(entity); + planAssignSteerModifyDService.remove(Wrappers.lambdaQuery(PlanAssignSteerModifyD.class) + .eq(PlanAssignSteerModifyD::getPasmId,entity.getId())); + for (PlanAssignSteerModifyDVO detail : modifyLst) { + PlanAssignSteerModifyD d = new PlanAssignSteerModifyD(); + BeanUtil.copyProperties(detail, d); + d.setId(null); + d.setPasmId(entity.getId()); + planAssignSteerModifyDService.save(d); + } + } + return R.success(); + } + + @Override + public R submitApproval(Long id) { + PlanAssignSteerModify modify = getById(id); + if (modify == null) { + return R.fail("记录不存在"); + } + + Integer status = modify.getApprovalStatus(); + if (status == null || + (!PlanAssignSteerModify.ApprovalStatus.DRAFT.equals(status) + && !PlanAssignSteerModify.ApprovalStatus.REJECT.equals(status))) { + return R.fail("只有草稿状态或驳回状态的记录才能发起审批"); + } + + // 重新发起审批时清空历史记录 + planAssignSteerModifyApprovalService.deleteByPasmId(id); + + modify.setApprovalStatus(PlanAssignSteerModify.ApprovalStatus.LEVEL1_APPROVING); + updateById(modify); + + log.info("重新发起审批,清空历史记录,申请单ID:{}", id); + return R.success("已提交至一级审批(室主任审批)"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R audit(Long id, Integer result, String remark) { + PlanAssignSteerModify modify = auditAndGetModify(id, result, remark); + + Long currentUserId = AuthUtil.getUserId(); + String currentUserName = AuthUtil.getUserName(); + String userAccount = AuthUtil.getUserAccount(); + Date now = new Date(); + + // 根据当前状态判断审批节点 + Integer currentNode = PlanAssignSteerModify.ApprovalStatus.LEVEL1_APPROVING.equals(modify.getApprovalStatus()) ? 1 : 2; + String currentNodeName = currentNode == 1 ? "一级审批" : "二级审批"; + + // 执行审批 + if (currentNode == 1) { + return auditLevel1(id, modify, userAccount, currentUserId, currentUserName, currentNode, currentNodeName, result, remark, now); + } else { + return auditLevel2(id, modify, currentUserId, currentUserName, currentNode, currentNodeName, result, remark, now); + } + } + + /** + * 一级审批处理 + */ + private R auditLevel1(Long id, PlanAssignSteerModify modify, String userAccount, + Long currentUserId, String currentUserName, Integer currentNode, + String currentNodeName, Integer result, String remark, Date now) { + // 验证审批人 + if (!"lixiangyu".equals(userAccount)) { + return R.fail("您不是当前审批节点的审批人(需要李相宇审批)"); + } + + // 检查重复审批 + if (checkDuplicateApproval(id, currentNode, currentUserId)) { + return R.fail("您已经完成审批,不能重复审批"); + } + + // 创建审批记录 + createApprovalRecord(id, currentNode, currentNodeName, currentUserId, currentUserName, result, remark, now); + + // 处理审批结果 + if (PlanAssignSteerModify.ApprovalStatus.REJECT.equals(result)) { + // 驳回:保留审批记录供查看 + modify.setApprovalStatus(PlanAssignSteerModify.ApprovalStatus.REJECT); + modify.setUpdateTime(now); + updateById(modify); + return R.success("审批已驳回"); + } else { + // 通过:进入二级审批 + modify.setApprovalStatus(PlanAssignSteerModify.ApprovalStatus.LEVEL2_APPROVING); + modify.setUpdateTime(now); + updateById(modify); + log.info("一级审批通过,进入二级审批,申请单ID:{}", id); + return R.success("审批成功"); + } + } + + /** + * 二级审批处理 + */ + private R auditLevel2(Long id, PlanAssignSteerModify modify, Long currentUserId, + String currentUserName, Integer currentNode, String currentNodeName, + Integer result, String remark, Date now) { + List level2AuditorIds = getLevel2AuditorIds(); + + if (level2AuditorIds.isEmpty()) { + return R.fail("二级审批节点没有审批人"); + } + + if (!level2AuditorIds.contains(currentUserId)) { + return R.fail("您不是当前审批节点的审批人"); + } + + if (checkDuplicateApproval(id, currentNode, currentUserId)) { + return R.fail("您已经完成审批,不能重复审批"); + } + + // 创建审批记录 + createApprovalRecord(id, currentNode, currentNodeName, currentUserId, currentUserName, result, remark, now); + + // 处理审批结果 + if (PlanAssignSteerModify.ApprovalStatus.REJECT.equals(result)) { + // 驳回:保留审批记录供查看 + modify.setApprovalStatus(PlanAssignSteerModify.ApprovalStatus.REJECT); + modify.setUpdateTime(now); + updateById(modify); + return R.success("审批已驳回"); + } else { + // 通过:检查是否所有人都已通过 + List planAssignSteerModifyApprovals = planAssignSteerModifyApprovalService.list( + new QueryWrapper() + .eq("PASM_ID", id) + .eq("APPROVAL_NODE", currentNode) + .eq("AUDIT_RESULT", PlanAssignSteerModify.ApprovalStatus.PASS) + .eq("IS_DELETED", 0) + ); + Set auditorIds = + planAssignSteerModifyApprovals.stream().map(PlanAssignSteerModifyApproval::getAuditorId).collect(Collectors.toSet()); + + if (auditorIds.containsAll(level2AuditorIds)) { + // 全部通过:更新状态并同步数据 + modify.setApprovalStatus(PlanAssignSteerModify.ApprovalStatus.PASS); + modify.setUpdateTime(now); + updateById(modify); + updatePlanAssignSteerFromModify(id); + } + + return R.success("审批成功"); + } + } + + /** + * 检查是否已经审批过 + */ + private boolean checkDuplicateApproval(Long pasmId, Integer approvalNode, Long auditorId) { + QueryWrapper recordQuery = new QueryWrapper<>(); + recordQuery.eq("PASM_ID", pasmId) + .eq("APPROVAL_NODE", approvalNode) + .eq("AUDITOR_ID", auditorId) + .eq("IS_DELETED", 0); + return planAssignSteerModifyApprovalService.getOne(recordQuery) != null; + } + + /** + * 创建审批记录 + */ + private void createApprovalRecord(Long pasmId, Integer approvalNode, String approvalNodeName, + Long auditorId, String auditorName, Integer auditResult, + String auditRemark, Date auditTime) { + PlanAssignSteerModifyApproval approvalRecord = new PlanAssignSteerModifyApproval(); + approvalRecord.setPasmId(pasmId); + approvalRecord.setApprovalNode(approvalNode); + approvalRecord.setApprovalNodeName(approvalNodeName); + approvalRecord.setAuditorId(auditorId); + approvalRecord.setAuditorName(auditorName); + approvalRecord.setAuditResult(auditResult); + approvalRecord.setAuditRemark(auditRemark); + approvalRecord.setAuditTime(auditTime); + + approvalRecord.setCreateTime(auditTime); + approvalRecord.setCreateUser(auditorId); + approvalRecord.setUpdateTime(auditTime); + approvalRecord.setUpdateUser(auditorId); + planAssignSteerModifyApprovalService.save(approvalRecord); + } + + private PlanAssignSteerModify auditAndGetModify(Long id, Integer result, String remark) { + PlanAssignSteerModify modify = getById(id); + if (modify == null) { + throw new RuntimeException("记录不存在"); + } + + // 只有审批中状态才能审批(一级或二级) + if (!PlanAssignSteerModify.ApprovalStatus.LEVEL1_APPROVING.equals(modify.getApprovalStatus()) + && !PlanAssignSteerModify.ApprovalStatus.LEVEL2_APPROVING.equals(modify.getApprovalStatus())) { + throw new RuntimeException("只有审批中的记录才能进行审批"); + } + + // 校验审批结果 + if (result == null || (!PlanAssignSteerModify.ApprovalStatus.PASS.equals(result) && !PlanAssignSteerModify.ApprovalStatus.REJECT.equals(result))) { + throw new RuntimeException("审批结果错误,1-通过,2-驳回"); + } + + // 审批不通过时,意见必填 + if (PlanAssignSteerModify.ApprovalStatus.REJECT.equals(result) && Func.isEmpty(remark)) { + throw new RuntimeException("审批不通过时,必须填写审批意见"); + } + + return modify; + } + + + /** + * 获取二级审批人列表(角色:热表-主任) + */ + private List getLevel2AuditorIds() { + return baseMapper.getLevel2AuditorIds(); + } + + /** + * 根据审批通过的调整单更新分外协分派管理列表 + */ + private void updatePlanAssignSteerFromModify(Long pasmId) { + //List modifyDLst = planAssignSteerModifyDMapper.findByPasmId(pasmId); + //if (modifyDLst == null || modifyDLst.isEmpty()) { + // return; + //} + // + //PlanAssignSteerModify modify = getById(pasmId); + //if (modify == null) { + // return; + //} + // + //for (PlanAssignSteerModifyD modifyD : modifyDLst) { + // // 根据工艺能力和外协厂商查找现有分派规则 + // QueryWrapper queryWrapper = new QueryWrapper<>(); + // queryWrapper.eq("CRAFT_ABILITY_ID", modifyD.getPlatingId()) + // .eq("OEM_ID", modifyD.getOemId()); + // BsAssignEntity assign = bsAssignService.getOne(queryWrapper); + // + // if (assign == null) { + // // 不存在则创建新记录 + // assign = new BsAssignEntity(); + // assign.setCraftAbilityId(modifyD.getPlatingId()); + // assign.setOemId(modifyD.getOemId()); + // log.warn("分派规则不存在,创建新记录:工艺能力ID={},外协厂商ID={}", + // modifyD.getPlatingId(), modifyD.getOemId()); + // } + // + // // 更新备注信息(记录来源) + // String remark = "分派控制调整单ID:" + pasmId; + // if (Func.isNotEmpty(assign.getRemark())) { + // remark = assign.getRemark() + "; " + remark; + // } + // assign.setRemark(remark); + // + // // 保存或更新 + // if (assign.getId() == null || assign.getId() == 0) { + // bsAssignService.save(assign); + // } else { + // bsAssignService.updateById(assign); + // } + //} + + } + + @Override + public PlanAssignSteerModifyVO getDetail(Long pasmId, Long caId) { + // 参数校验:pasmId为空直接返回null + if (pasmId == null) { + return null; + } + + // 查询主表信息 + List list = baseMapper.findByPasmId(pasmId); + if (list.isEmpty()) { + return null; + } + + PlanAssignSteerModifyVO modifyVO = list.get(0); + + // 判断是否需要查询明细:caId为空 或 caId与主表的platingId匹配 + // // TODO: 2026/5/22 caId根据工艺能力查询计划分派控制 + boolean shouldQueryDetail = caId == null || caId.equals(modifyVO.getPlatingId()); + + List modifyLst = null; + if (shouldQueryDetail) { + List detailList = planAssignSteerModifyDService.findByPasmId(pasmId); + if (!detailList.isEmpty()) { + modifyLst = detailList.stream() + .map(d -> { + PlanAssignSteerModifyDVO vo = new PlanAssignSteerModifyDVO(); + BeanUtil.copyProperties(d, vo); + return vo; + }) + .collect(Collectors.toList()); + } + } + + modifyVO.setModifyLst(modifyLst); + return modifyVO; + } + + @Override + public List getAuditTimeline(Long id) { + PlanAssignSteerModify entity = getById(id); + if (entity == null) { + return new ArrayList<>(); + } + + List timelineList = new ArrayList<>(); + + // 1. 添加提交记录 + PlanAssignSteerModifyTimelineVO submitNode = new PlanAssignSteerModifyTimelineVO(); + submitNode.setType("submit"); + submitNode.setLabel("提交人"); + + // 查询申请人姓名 + String applicantName = "-"; + if (entity.getCreateMan() != null) { + R userR = userClient.userInfoById(entity.getCreateMan()); + if (userR.isSuccess()) { + User user = userR.getData(); + if (user != null) { + applicantName = user.getRealName(); + } + } + } + submitNode.setValue(applicantName); + submitNode.setTime(entity.getCreateTime() != null ? DateUtil.format(entity.getCreateTime(), "yyyy-MM-dd HH:mm:ss") : ""); + submitNode.setStatus("success"); + submitNode.setApprovalNode(0); + PlanAssignSteerModifyTimelineVO planAssignSteerModifyTimelineVO = + BeanUtil.copyProperties(submitNode, PlanAssignSteerModifyTimelineVO.class); + submitNode.setChildren(List.of(planAssignSteerModifyTimelineVO)); + timelineList.add(submitNode); + + // 2. 查询所有审批记录并按节点分组 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("PASM_ID", id) + .eq("IS_DELETED", 0) + .orderByAsc("APPROVAL_NODE") + .orderByAsc("AUDIT_TIME"); + List allRecords = planAssignSteerModifyApprovalService.list(queryWrapper); + Map> nodeMap = allRecords.stream() + .collect(Collectors.groupingBy(PlanAssignSteerModifyApproval::getApprovalNode)); + + // 3. 处理一级审批节点 + buildApprovalNodes(nodeMap.get(1), 1, timelineList, entity); + + // 4. 处理二级审批节点 + buildApprovalNodes(nodeMap.get(2), 2, timelineList, entity); + + return timelineList; + } + + /** + * 构建审批节点时间线记录 + * + * @param records 审批记录列表 + * @param approvalNode 审批节点(1-一级审批,2-二级审批) + * @param timelineList 时间线结果集 + * @param entity 主表实体 + */ + private void buildApprovalNodes(List records, + Integer approvalNode, + List timelineList, + PlanAssignSteerModify entity) { + if (records == null || records.isEmpty()) { + return; + } + + String status = "false"; + if (approvalNode == 1 && PlanAssignSteerModify.ApprovalStatus.LEVEL2_APPROVING.equals(entity.getApprovalStatus())) { + status = "success"; + } + if (approvalNode == 2 && PlanAssignSteerModify.ApprovalStatus.PASS.equals(entity.getApprovalStatus())) { + status = "success"; + } + + PlanAssignSteerModifyTimelineVO submitNode = new PlanAssignSteerModifyTimelineVO(); + submitNode.setType("audit"); + submitNode.setStatus(status); + submitNode.setApprovalNode(approvalNode); + + List childRecords = records.stream().map(record -> { + PlanAssignSteerModifyTimelineVO node = new PlanAssignSteerModifyTimelineVO(); + node.setType("audit"); + node.setLabel("审批人"); + + // 根据审批结果设置状态和值 + if (PlanAssignSteerModify.ApprovalStatus.PASS.equals(record.getAuditResult())) { + node.setValue(record.getAuditorName() != null ? record.getAuditorName() : "未知"); + node.setStatus("success"); + } + if (PlanAssignSteerModify.ApprovalStatus.REJECT.equals(record.getAuditResult())) { + node.setValue(record.getAuditorName() != null ? record.getAuditorName() : "未知"); + node.setStatus("false"); + } + + node.setTime(record.getAuditTime() != null ? DateUtil.format(record.getAuditTime(), "yyyy-MM-dd HH:mm:ss") : ""); + node.setApprovalNode(approvalNode); + node.setRemark(record.getAuditRemark()); + return node; + }).sorted(Comparator.comparing(PlanAssignSteerModifyTimelineVO::getTime, Comparator.nullsLast(Comparator.naturalOrder()))) + .collect(Collectors.toList()); + + submitNode.setChildren(childRecords); + + timelineList.add(submitNode); + } +} \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/wrapper/PlanAssignSteerModifyWrapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/wrapper/PlanAssignSteerModifyWrapper.java new file mode 100644 index 000000000..228faf93c --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/wrapper/PlanAssignSteerModifyWrapper.java @@ -0,0 +1,44 @@ +/** + * Author: Tom Shuo + */ +package org.springblade.desk.basic.wrapper; + +import org.springblade.core.mp.support.BaseEntityWrapper; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModify; +import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyVO; + +import java.util.Objects; + +/** + * [分派控制调整] 包装类,返回视图层所需的字段 + * + * @author Tom Shuo + * @since 2026-05-20 + */ +public class PlanAssignSteerModifyWrapper extends BaseEntityWrapper { + + public static PlanAssignSteerModifyWrapper build() { + return new PlanAssignSteerModifyWrapper(); + } + + @Override + public PlanAssignSteerModifyVO entityVO(PlanAssignSteerModify entity) { + PlanAssignSteerModifyVO vo = Objects.requireNonNull(BeanUtil.copy(entity, PlanAssignSteerModifyVO.class)); + vo.setApprovalStatusDesc(getApprovalStatusDesc(entity.getApprovalStatus())); + return vo; + } + + private String getApprovalStatusDesc(Integer status) { + if (status == null) { + return "未知"; + } + return switch (status) { + case -1 -> "待提交"; + case 0 -> "待审核"; + case 1 -> "审核通过"; + case 2 -> "审核失败"; + default -> "未知"; + }; + } +} \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java index dd678ca9d..b1073cc07 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java @@ -194,7 +194,7 @@ public class DispatchConfigApprovalController extends BladeController { /** * [分派配置审批] 查询审批时间线 */ - @GetMapping("/auditTimeline/{id}") + @GetMapping("/auditHistory/{id}") @ApiOperationSupport(order = 90) @Operation(summary = "查询审批时间线", description = "传入主键ID") public R> getAuditTimeline(@Parameter(description = "主键ID", required = true) @PathVariable Long id) { diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/PlanAssignSteerModifyController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/PlanAssignSteerModifyController.java new file mode 100644 index 000000000..81e52acea --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/PlanAssignSteerModifyController.java @@ -0,0 +1,163 @@ +/** + * Author: Tom Shuo + */ +package org.springblade.desk.quality.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.excel.util.ExcelUtil; +import org.springblade.core.log.annotation.ApiLog; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModify; +import org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyD; +import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyTimelineVO; +import org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyVO; +import org.springblade.desk.basic.service.IPlanAssignSteerModifyService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * [分派控制调整] 控制器 + * + * @author Tom Shuo + * @since 2026-05-20 + */ +@RestController +@RequestMapping("/quality/planAssignSteerModify") +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Slf4j +@Tag(name = "[分派控制调整]", description = "[分派控制调整]接口") +public class PlanAssignSteerModifyController extends BladeController { + + @Resource + private IPlanAssignSteerModifyService service; + + @GetMapping("/detail") + @ApiOperationSupport(order = 10) + @Operation(summary = "详情", description = "传入pasmId和caId") + public R detail( + @Parameter(description = "调整单ID") @RequestParam(required = false) Long pasmId, + @Parameter(description = "工艺能力ID") @RequestParam(required = false) Long caId) { + PlanAssignSteerModifyVO detail = service.getDetail(pasmId, caId); + return R.data(detail); + } + + + /** + * [分派控制调整] page分页 + */ + @GetMapping("/page") + @ApiOperationSupport(order = 21) + @Operation(summary = "page分页", description = "传入PlanAssignSteerModifyVO Obj") + public R> page(PlanAssignSteerModifyVO planAssignSteerModify, Query query) { + IPage pages = service.selectPlanAssignSteerModifyPage( + Condition.getPage(query), planAssignSteerModify + ); + return R.data(pages); + } + + /** + * [分派控制调整] 新增一条 + */ + @PostMapping("/save") + @ApiOperationSupport(order = 30) + @ApiLog("分派控制调整新增") + @Operation(summary = "新增一条", description = "传入PlanAssignSteerModifyVO Obj") + public R save(@Valid @RequestBody PlanAssignSteerModifyVO vo) { + vo.setId(null); + return service.saveOrUpdateModify(vo, vo.getModifyLst()); + } + + /** + * [分派控制调整] 修改一条 + */ + @PostMapping("/update") + @ApiOperationSupport(order = 40) + @ApiLog("分派控制调整修改") + @Operation(summary = "修改一条", description = "传入PlanAssignSteerModifyVO Obj") + public R update(@Valid @RequestBody PlanAssignSteerModifyVO vo) { + return service.saveOrUpdateModify(vo, vo.getModifyLst()); + } + + /** + * [分派控制调整] 逻辑删除 + */ + @PostMapping("/remove") + @ApiOperationSupport(order = 61) + @ApiLog("分派控制调整删除") + @Operation(summary = "逻辑删除", description = "传入ids") + public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + return R.status(service.removeByIds(Func.toLongList(ids))); + } + + + /** + * [分派控制调整] 导出Excel + */ + @GetMapping("/exportExcel") + @ApiOperationSupport(order = 70) + @Operation(summary = "导出Excel", description = "传入PlanAssignSteerModify") + public void exportExcel(@Parameter(hidden = true) @RequestParam Map planAssignSteerModify, + HttpServletResponse response) { + List list = service.exportPlanAssignSteerModify( + BeanUtil.copyProperties(planAssignSteerModify, PlanAssignSteerModifyVO.class) + ); + ExcelUtil.export(response, "[分派控制调整]数据" + DateUtil.time(), + "[分派控制调整]数据表", list, PlanAssignSteerModifyVO.class); + } + + /** + * [分派控制调整] 发起审批 + */ + @PostMapping("/submitApproval") + @ApiOperationSupport(order = 90) + @ApiLog("发起审批") + @Operation(summary = "发起审批", description = "传入id") + public R submitApproval(@Parameter(description = "主键ID", required = true) @RequestParam Long id) { + return service.submitApproval(id); + } + + /** + * [分派控制调整] 审批 + */ + @PostMapping("/audit") + @ApiOperationSupport(order = 91) + @ApiLog("审批") + @Operation(summary = "审批", description = "传入id, result, remark") + public R audit( + @Parameter(description = "主键ID", required = true) @RequestParam Long id, + @Parameter(description = "审批结果: 1-通过, 2-驳回", required = true) @RequestParam Integer result, + @Parameter(description = "审批意见") @RequestParam(required = false) String remark) { + return service.audit(id, result, remark); + } + + /** + * [分派控制调整] 查询审批时间线 + */ + @GetMapping("/auditHistory/{id}") + @ApiOperationSupport(order = 100) + @Operation(summary = "查询审批时间线", description = "传入主键ID") + public R> getAuditTimeline(@Parameter(description = "主键ID", required = true) @PathVariable Long id) { + return R.data(service.getAuditTimeline(id)); + } +} \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalRecordMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalRecordMapper.xml index 52bd097e8..17c6bbd51 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalRecordMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalRecordMapper.xml @@ -5,30 +5,30 @@ diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java index 0853e7763..b5edd644e 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java @@ -1,5 +1,6 @@ package org.springblade.desk.quality.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; @@ -177,6 +178,12 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl deleteQuery = new QueryWrapper<>(); + deleteQuery.eq("APPROVAL_ID", id); + approvalRecordMapper.delete(deleteQuery); + return R.success("提交审批成功"); } @@ -267,6 +274,10 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl deleteQuery = new QueryWrapper<>(); - deleteQuery.eq("APPROVAL_ID", id); - approvalRecordMapper.delete(deleteQuery); return R.success("审批已驳回"); } @@ -323,6 +329,7 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl getAuditTimeline(Long id) { + DispatchConfigApproval entity = getById(id); if (entity == null) { return new ArrayList<>(); @@ -333,59 +340,91 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl allRecords = approvalRecordMapper.selectByApprovalId(id); - - // 按审批节点分组 Map> nodeMap = allRecords.stream() .collect(Collectors.groupingBy(DispatchConfigApprovalRecord::getApprovalNode)); - // 3. 添加一级审批节点(如果有审批记录) - if (nodeMap.containsKey(1)) { - List level1Records = nodeMap.get(1); - // 只展示第一个通过的审批人 - DispatchConfigApprovalRecord firstRecord = level1Records.get(0); - DispatchConfigApprovalTimelineVO node = new DispatchConfigApprovalTimelineVO(); - node.setType("audit"); - node.setLabel("一级审批:"); - node.setValue("已通过"); - node.setTime(firstRecord.getAuditTime() != null ? DateUtil.format(firstRecord.getAuditTime(), "yyyy-MM-dd HH:mm:ss") : ""); - node.setApprovalNode(1); - node.setStatus("success"); - timelineList.add(node); + // 3. 处理一级审批节点 + buildApprovalNodes(nodeMap.getOrDefault(1, new ArrayList<>()), 1, timelineList,entity); + + // 4. 处理二级审批节点 + buildApprovalNodes(nodeMap.getOrDefault(2, new ArrayList<>()), 2, timelineList,entity); + + return timelineList; + } + + /** + * 构建审批节点时间线记录 + * + * @param records 审批记录列表 + * @param approvalNode 审批节点(1-一级审批,2-二级审批) + * @param timelineList 时间线结果集 + */ + private void buildApprovalNodes(List records, + Integer approvalNode, + List timelineList, + DispatchConfigApproval entity) { + String status = "false"; + if (1 == approvalNode && DispatchConfigApprovalConst.STATUS_LEVEL2_APPROVING.equals(entity.getStatus())) { + status = "success"; + } + if (2 == approvalNode && DispatchConfigApprovalConst.STATUS_APPROVED.equals(entity.getStatus())) { + status = "success"; + } + String label; + if (1 == approvalNode) { + label = "一级审批"; + } else { + label = " 二级审批"; } + DispatchConfigApprovalTimelineVO submitNode = new DispatchConfigApprovalTimelineVO(); + submitNode.setLabel(label); + submitNode.setType("audit"); + submitNode.setStatus(status); + submitNode.setApprovalNode(approvalNode); + + if (records == null || records.isEmpty()) { + timelineList.add(submitNode); + return; + } + - // 4. 添加二级审批节点(如果有审批记录) - if (nodeMap.containsKey(2)) { - List level2Records = nodeMap.get(2); - // 只展示第一个通过的审批人 - DispatchConfigApprovalRecord firstRecord = level2Records.get(0); + // 为每个审批人创建一条时间线记录 + List childRecords = records.stream().map(record -> { DispatchConfigApprovalTimelineVO node = new DispatchConfigApprovalTimelineVO(); node.setType("audit"); - node.setLabel("二级审批:"); - node.setValue("已通过"); - node.setTime(firstRecord.getAuditTime() != null ? DateUtil.format(firstRecord.getAuditTime(), "yyyy-MM-dd HH:mm:ss") : ""); - node.setApprovalNode(2); - node.setStatus("success"); - timelineList.add(node); - } - - // 按时间倒序排列(最新的在前面) - timelineList.sort((a, b) -> { - if (a.getTime() == null || b.getTime() == null) { - return 0; + node.setLabel("审批人"); + + // 根据审批结果设置状态和值 + if (DispatchConfigApprovalConst.AUDIT_RESULT_PASS.equals(record.getAuditResult())) { + node.setValue(record.getAuditorName() != null ? record.getAuditorName() : "未知"); + node.setStatus("success"); + } else if (DispatchConfigApprovalConst.AUDIT_RESULT_REJECT.equals(record.getAuditResult())) { + node.setValue(record.getAuditorName() != null ? record.getAuditorName() : "未知"); + node.setStatus("false"); } - return b.getTime().compareTo(a.getTime()); - }); - return timelineList; + node.setTime(record.getAuditTime() != null ? DateUtil.format(record.getAuditTime(), "yyyy-MM-dd HH:mm:ss") : ""); + node.setApprovalNode(approvalNode); + node.setRemark(record.getAuditRemark()); + return node; + }).sorted(Comparator.comparing(DispatchConfigApprovalTimelineVO::getTime, Comparator.nullsLast(Comparator.naturalOrder()))) + .collect(Collectors.toList()); + + submitNode.setChildren(childRecords); + + timelineList.add(submitNode); } /** diff --git a/doc/sql/mes/create_plan_assign_steer_modify.sql b/doc/sql/mes/create_plan_assign_steer_modify.sql new file mode 100644 index 000000000..305bddf97 --- /dev/null +++ b/doc/sql/mes/create_plan_assign_steer_modify.sql @@ -0,0 +1,42 @@ +-- 分派控制调整主表 +CREATE TABLE BS_PLAN_ASSIGN_STEER_MODIFY ( + ID NUMBER(19) NOT NULL, + PLATING_ID NUMBER(19), + PASM_MEMO VARCHAR2(2000), + CREATE_MAN NUMBER(19), + CREATE_TIME DATE, + APPROVAL_STATUS NUMBER(3) DEFAULT -1, + STATUS NUMBER(1,0) DEFAULT 0, + IS_DELETED NUMBER(1) DEFAULT 0, + CREATE_BY NUMBER(19), + CREATE_DATE DATE, + UPDATE_BY NUMBER(19), + UPDATE_DATE DATE, + PRIMARY KEY (ID) +); + +-- 分派控制调整明细表 +CREATE TABLE BS_PLAN_ASSIGN_STEER_MODIFYD ( + ID NUMBER(19) NOT NULL, + PASM_ID NUMBER(19), + OEM_ID NUMBER(19), + PLATING_ID NUMBER(19), + ASSIGN_SCALE NUMBER(10,2), + PAS_ID NUMBER(19), + IS_DELETED NUMBER(1) DEFAULT 0, + STATUS NUMBER(1,0) DEFAULT 0, + CREATE_BY NUMBER(19), + CREATE_DATE DATE, + UPDATE_BY NUMBER(19), + UPDATE_DATE DATE, + PRIMARY KEY (ID) +); + +-- 创建序列 +CREATE SEQUENCE SEQ_ASSIGN_STEER_MODIFY MINVALUE 1 MAXVALUE 9999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE NOORDER NOCYCLE; +CREATE SEQUENCE SEQ_ASSIGN_STEER_MODIFYD MINVALUE 1 MAXVALUE 9999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE NOORDER NOCYCLE; + +-- 创建索引 +CREATE INDEX IDX_MODIFY_PLATING_ID ON BS_PLAN_ASSIGN_STEER_MODIFY(PLATING_ID); +CREATE INDEX IDX_MODIFY_APPROVAL_STATUS ON BS_PLAN_ASSIGN_STEER_MODIFY(APPROVAL_STATUS); +CREATE INDEX IDX_MODIFYD_PASM_ID ON BS_PLAN_ASSIGN_STEER_MODIFYD(PASM_ID); diff --git a/doc/sql/mes/create_plan_assign_steer_modify_approval.sql b/doc/sql/mes/create_plan_assign_steer_modify_approval.sql new file mode 100644 index 000000000..52f3867cb --- /dev/null +++ b/doc/sql/mes/create_plan_assign_steer_modify_approval.sql @@ -0,0 +1,49 @@ +-- 分派控制调整审批记录表 +CREATE TABLE BS_PASM_APPRV ( + ID NUMBER(20) NOT NULL, + PASM_ID NUMBER(20) NOT NULL, + APPROVAL_NODE NUMBER(10) NOT NULL, + APPROVAL_NODE_NAME VARCHAR2(100), + AUDITOR_ID NUMBER(20) NOT NULL, + AUDITOR_NAME VARCHAR2(100), + AUDIT_RESULT NUMBER(10) NOT NULL, + AUDIT_REMARK VARCHAR2(500), + AUDIT_TIME DATE, + IS_DELETED NUMBER(10) DEFAULT 0, + STATUS NUMBER(1,0) DEFAULT 0, + CREATE_USER NUMBER(20), + CREATE_TIME DATE, + UPDATE_USER NUMBER(20), + UPDATE_TIME DATE, + CONSTRAINT PK_PASM_APPRV PRIMARY KEY (ID) +); + +-- 添加表注释 +COMMENT ON TABLE BS_PASM_APPRV IS '分派控制调整审批记录表'; +COMMENT ON COLUMN BS_PASM_APPRV.ID IS '主键ID'; +COMMENT ON COLUMN BS_PASM_APPRV.PASM_ID IS '调整单ID'; +COMMENT ON COLUMN BS_PASM_APPRV.APPROVAL_NODE IS '审批节点:1-一级审批,2-二级审批'; +COMMENT ON COLUMN BS_PASM_APPRV.APPROVAL_NODE_NAME IS '审批节点名称'; +COMMENT ON COLUMN BS_PASM_APPRV.AUDITOR_ID IS '审批人ID'; +COMMENT ON COLUMN BS_PASM_APPRV.AUDITOR_NAME IS '审批人姓名'; +COMMENT ON COLUMN BS_PASM_APPRV.AUDIT_RESULT IS '审批结果:1-通过,2-驳回'; +COMMENT ON COLUMN BS_PASM_APPRV.AUDIT_REMARK IS '审批意见'; +COMMENT ON COLUMN BS_PASM_APPRV.AUDIT_TIME IS '审批时间'; +COMMENT ON COLUMN BS_PASM_APPRV.IS_DELETED IS '是否删除:0-未删除,1-已删除'; +COMMENT ON COLUMN BS_PASM_APPRV.STATUS IS '状态'; +COMMENT ON COLUMN BS_PASM_APPRV.CREATE_USER IS '创建人'; +COMMENT ON COLUMN BS_PASM_APPRV.CREATE_TIME IS '创建时间'; +COMMENT ON COLUMN BS_PASM_APPRV.UPDATE_USER IS '更新人'; +COMMENT ON COLUMN BS_PASM_APPRV.UPDATE_TIME IS '更新时间'; + +-- 创建索引(标识符不超过30字符) +CREATE INDEX IDX_PASM_APPRV_PID ON BS_PASM_APPRV(PASM_ID); +CREATE INDEX IDX_PASM_APPRV_AID ON BS_PASM_APPRV(AUDITOR_ID); +CREATE INDEX IDX_PASM_APPRV_NODE ON BS_PASM_APPRV(APPROVAL_NODE); + +-- 创建序列(标识符不超过30字符) +CREATE SEQUENCE SEQ_PASM_APPRV_ID +START WITH 1 +INCREMENT BY 1 +NOCACHE +NOCYCLE;