Merge remote-tracking branch 'origin/master'

liweidong
maxiangong 3 weeks ago
commit d34017a89a
  1. 81
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModify.java
  2. 62
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModifyApproval.java
  3. 51
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/PlanAssignSteerModifyD.java
  4. 38
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlanAssignSteerModifyDVO.java
  5. 45
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlanAssignSteerModifyTimelineVO.java
  6. 35
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/PlanAssignSteerModifyVO.java
  7. 91
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/enums/SettlementErrorReasonEnum.java
  8. 43
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/request/SettlementConfirmRequest.java
  9. 3
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalTimelineVO.java
  10. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateTimelineVO.java
  11. 24
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyApprovalMapper.java
  12. 13
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyApprovalMapper.xml
  13. 23
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyDMapper.java
  14. 31
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyDMapper.xml
  15. 32
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyMapper.java
  16. 88
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlanAssignSteerModifyMapper.xml
  17. 33
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlanAssignSteerModifyApprovalService.java
  18. 33
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlanAssignSteerModifyDService.java
  19. 44
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlanAssignSteerModifyService.java
  20. 47
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyApprovalServiceImpl.java
  21. 44
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyDServiceImpl.java
  22. 522
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlanAssignSteerModifyServiceImpl.java
  23. 44
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/wrapper/PlanAssignSteerModifyWrapper.java
  24. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java
  25. 163
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/PlanAssignSteerModifyController.java
  26. 36
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalRecordMapper.xml
  27. 123
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java
  28. 42
      doc/sql/mes/create_plan_assign_steer_modify.sql
  29. 49
      doc/sql/mes/create_plan_assign_steer_modify_approval.sql

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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<PlanAssignSteerModifyTimelineVO> children;
}

@ -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<PlanAssignSteerModifyDVO> modifyLst;
@Schema(description = "工艺能力名称")
private String platingName;
@Schema(description = "申请人名称")
private String createManName;
}

@ -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;
}
}

@ -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<Long> ids;
/**
* 确认结果true-结算正确false-结算异常
*/
@NotNull(message = "确认结果不能为空")
@Schema(description = "确认结果:true-结算正确,false-结算异常", required = true)
private Boolean confirmResult;
/**
* 异常原因结算异常时必填
* 可选值订单数据错误无需结算
*/
@Schema(description = "异常原因(结算异常时必填),可选值:订单数据错误、无需结算")
private String errorReason;
}

@ -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<DispatchConfigApprovalTimelineVO> children;
}

@ -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 = "备注")

@ -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<PlanAssignSteerModifyApproval> {
/**
* 根据调整单ID删除审批记录
*/
void deleteByPasmId(@Param("pasmId") Long pasmId);
}

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.desk.basic.mapper.PlanAssignSteerModifyApprovalMapper">
<!-- 驳回时清空审批记录:物理删除该调整单的所有审批记录,支持重新发起审批 -->
<delete id="deleteByPasmId">
UPDATE BS_PASM_APPRV
SET IS_DELETED = 1
WHERE PASM_ID = #{pasmId}
AND IS_DELETED = 0
</delete>
</mapper>

@ -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<PlanAssignSteerModifyD> {
List<PlanAssignSteerModifyD> findByPasmId(@Param("pasmId") Long pasmId);
void deleteByPasmId(@Param("pasmId") Long pasmId);
}

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.desk.basic.mapper.PlanAssignSteerModifyDMapper">
<resultMap id="planAssignSteerModifyDResultMap" type="org.springblade.desk.basic.pojo.entity.PlanAssignSteerModifyD">
<result column="ID" property="id"/>
<result column="PASM_ID" property="pasmId"/>
<result column="OEM_ID" property="oemId"/>
<result column="PLATING_ID" property="platingId"/>
<result column="ASSIGN_SCALE" property="assignScale"/>
</resultMap>
<select id="findByPasmId" resultMap="planAssignSteerModifyDResultMap">
SELECT
d.ID,
d.PASM_ID,
d.OEM_ID,
d.PLATING_ID,
d.ASSIGN_SCALE
FROM
BS_PLAN_ASSIGN_STEER_MODIFYD d
WHERE
d.PASM_ID = #{pasmId}
AND d.IS_DELETED = 0
ORDER BY d.ID
</select>
<delete id="deleteByPasmId">
DELETE FROM BS_PLAN_ASSIGN_STEER_MODIFYD WHERE PASM_ID = #{pasmId}
</delete>
</mapper>

@ -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<PlanAssignSteerModify> {
List<PlanAssignSteerModifyVO> selectPlanAssignSteerModifyPage(IPage page, PlanAssignSteerModify planAssignSteerModify);
List<PlanAssignSteerModifyVO> exportPlanAssignSteerModify(PlanAssignSteerModifyVO planAssignSteerModify);
List<PlanAssignSteerModifyVO> findByPasmId(@Param("pasmId") Long pasmId);
List<Long> getLevel2AuditorIds();
}

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.desk.basic.mapper.PlanAssignSteerModifyMapper">
<resultMap id="planAssignSteerModifyResultMap" type="org.springblade.desk.basic.pojo.vo.PlanAssignSteerModifyVO">
<result column="ID" property="id"/>
<result column="PLATING_ID" property="platingId"/>
<result column="PASM_MEMO" property="pasmMemo"/>
<result column="CREATE_MAN" property="createMan"/>
<result column="CREATE_TIME" property="createTime"/>
<result column="APPROVAL_STATUS" property="approvalStatus"/>
<result column="PLATING_NAME" property="platingName"/>
<result column="CREATE_MAN_NAME" property="createManName"/>
</resultMap>
<select id="selectPlanAssignSteerModifyPage" resultMap="planAssignSteerModifyResultMap">
SELECT
m.ID,
m.PLATING_ID,
m.PASM_MEMO,
m.CREATE_MAN,
m.CREATE_TIME,
m.APPROVAL_STATUS,
c.CA_NAME AS PLATING_NAME,
u.REAL_NAME AS CREATE_MAN_NAME
FROM
BS_PLAN_ASSIGN_STEER_MODIFY m
LEFT JOIN BS_CRAFT_ABILITY c ON m.PLATING_ID = c.ID
LEFT JOIN BLADE_USER u ON m.CREATE_MAN = u.ID
WHERE
m.IS_DELETED = 0
<if test="planAssignSteerModify.platingId != null">
AND m.PLATING_ID = #{planAssignSteerModify.platingId}
</if>
<if test="planAssignSteerModify.approvalStatus != null">
AND m.APPROVAL_STATUS = #{planAssignSteerModify.approvalStatus}
</if>
ORDER BY m.CREATE_TIME DESC
</select>
<select id="exportPlanAssignSteerModify" resultMap="planAssignSteerModifyResultMap">
SELECT
m.ID,
m.PLATING_ID,
m.PASM_MEMO,
m.CREATE_MAN,
m.CREATE_TIME,
m.APPROVAL_STATUS,
c.CA_NAME AS PLATING_NAME,
u.REAL_NAME AS CREATE_MAN_NAME
FROM
BS_PLAN_ASSIGN_STEER_MODIFY m
LEFT JOIN BS_CRAFT_ABILITY c ON m.PLATING_ID = c.ID
LEFT JOIN BLADE_USER u ON m.CREATE_MAN = u.ID
WHERE
m.IS_DELETED = 0
</select>
<select id="findByPasmId" resultMap="planAssignSteerModifyResultMap">
SELECT
m.ID,
m.PLATING_ID,
m.PASM_MEMO,
m.CREATE_MAN,
m.CREATE_TIME,
m.APPROVAL_STATUS,
c.CA_NAME AS PLATING_NAME,
u.REAL_NAME AS CREATE_MAN_NAME
FROM
BS_PLAN_ASSIGN_STEER_MODIFY m
LEFT JOIN BS_CRAFT_ABILITY c ON m.PLATING_ID = c.ID
LEFT JOIN BLADE_USER u ON m.CREATE_MAN = u.ID
WHERE
m.ID = #{pasmId}
AND m.IS_DELETED = 0
</select>
<select id="getLevel2AuditorIds" resultType="java.lang.Long">
SELECT DISTINCT
u.ID
FROM BLADE_USER u
INNER JOIN BLADE_ROLE r ON INSTR(',' || u.ROLE_ID || ',', ',' || r.ID || ',') > 0
WHERE r.ROLE_ALIAS IN ('rb_manager')
AND u.IS_DELETED = 0
AND r.IS_DELETED = 0
</select>
</mapper>

@ -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<PlanAssignSteerModifyApproval> {
/**
* 根据调整单ID查询审批记录列表
*
* @param pasmId 调整单ID
* @return 审批记录列表
*/
List<PlanAssignSteerModifyApproval> findByPasmId(Long pasmId);
/**
* 根据调整单ID删除审批记录
*
* @param pasmId 调整单ID
*/
void deleteByPasmId(Long pasmId);
}

@ -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<PlanAssignSteerModifyD> {
/**
* 根据主表ID查询明细列表
*
* @param pasmId 主表ID
* @return 明细列表
*/
List<PlanAssignSteerModifyD> findByPasmId(Long pasmId);
/**
* 根据主表ID删除明细
*
* @param pasmId 主表ID
*/
void deleteByPasmId(Long pasmId);
}

@ -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<PlanAssignSteerModify> {
IPage<PlanAssignSteerModifyVO> selectPlanAssignSteerModifyPage(IPage<PlanAssignSteerModifyVO> page, PlanAssignSteerModify planAssignSteerModify);
List<PlanAssignSteerModifyVO> exportPlanAssignSteerModify(PlanAssignSteerModifyVO planAssignSteerModify);
R saveOrUpdateModify(PlanAssignSteerModifyVO modify, List<PlanAssignSteerModifyDVO> modifyLst);
R submitApproval(Long id);
R audit(Long id, Integer result, String remark);
/**
* 查询审批时间线
*
* @param id 主键ID
* @return 审批时间线数据列表
*/
List<PlanAssignSteerModifyTimelineVO> getAuditTimeline(Long id);
PlanAssignSteerModifyVO getDetail(Long pasmId, Long caId);
}

@ -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<PlanAssignSteerModifyApprovalMapper, PlanAssignSteerModifyApproval> implements IPlanAssignSteerModifyApprovalService {
@Override
public List<PlanAssignSteerModifyApproval> findByPasmId(Long pasmId) {
QueryWrapper<PlanAssignSteerModifyApproval> 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));
}
}

@ -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<PlanAssignSteerModifyDMapper, PlanAssignSteerModifyD> implements IPlanAssignSteerModifyDService {
@Resource
private PlanAssignSteerModifyDMapper planAssignSteerModifyDMapper;
@Override
public List<PlanAssignSteerModifyD> findByPasmId(Long pasmId) {
return planAssignSteerModifyDMapper.findByPasmId(pasmId);
}
@Override
public void deleteByPasmId(Long pasmId) {
remove(Wrappers.lambdaQuery(PlanAssignSteerModifyD.class)
.eq(PlanAssignSteerModifyD::getPasmId,pasmId));
}
}

@ -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<PlanAssignSteerModifyMapper, PlanAssignSteerModify> implements IPlanAssignSteerModifyService {
@Resource
private IPlanAssignSteerModifyDService planAssignSteerModifyDService;
@Resource
private IPlanAssignSteerModifyApprovalService planAssignSteerModifyApprovalService;
@Resource
private IPlanAssignSteerService planAssignSteerService;
@Resource
private IBsAssignService bsAssignService;
@Resource
IUserClient userClient;
@Override
public IPage<PlanAssignSteerModifyVO> selectPlanAssignSteerModifyPage(IPage<PlanAssignSteerModifyVO> page, PlanAssignSteerModify planAssignSteerModify) {
return page.setRecords(baseMapper.selectPlanAssignSteerModifyPage(page, planAssignSteerModify));
}
@Override
public List<PlanAssignSteerModifyVO> exportPlanAssignSteerModify(PlanAssignSteerModifyVO planAssignSteerModify) {
return baseMapper.exportPlanAssignSteerModify(planAssignSteerModify);
}
@Override
@Transactional(rollbackFor = Exception.class)
public R saveOrUpdateModify(PlanAssignSteerModifyVO modify, List<PlanAssignSteerModifyDVO> 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<Long> 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<PlanAssignSteerModifyApproval> planAssignSteerModifyApprovals = planAssignSteerModifyApprovalService.list(
new QueryWrapper<PlanAssignSteerModifyApproval>()
.eq("PASM_ID", id)
.eq("APPROVAL_NODE", currentNode)
.eq("AUDIT_RESULT", PlanAssignSteerModify.ApprovalStatus.PASS)
.eq("IS_DELETED", 0)
);
Set<Long> 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<PlanAssignSteerModifyApproval> 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<Long> getLevel2AuditorIds() {
return baseMapper.getLevel2AuditorIds();
}
/**
* 根据审批通过的调整单更新分外协分派管理列表
*/
private void updatePlanAssignSteerFromModify(Long pasmId) {
//List<PlanAssignSteerModifyD> modifyDLst = planAssignSteerModifyDMapper.findByPasmId(pasmId);
//if (modifyDLst == null || modifyDLst.isEmpty()) {
// return;
//}
//
//PlanAssignSteerModify modify = getById(pasmId);
//if (modify == null) {
// return;
//}
//
//for (PlanAssignSteerModifyD modifyD : modifyDLst) {
// // 根据工艺能力和外协厂商查找现有分派规则
// QueryWrapper<BsAssignEntity> 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<PlanAssignSteerModifyVO> 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<PlanAssignSteerModifyDVO> modifyLst = null;
if (shouldQueryDetail) {
List<PlanAssignSteerModifyD> 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<PlanAssignSteerModifyTimelineVO> getAuditTimeline(Long id) {
PlanAssignSteerModify entity = getById(id);
if (entity == null) {
return new ArrayList<>();
}
List<PlanAssignSteerModifyTimelineVO> timelineList = new ArrayList<>();
// 1. 添加提交记录
PlanAssignSteerModifyTimelineVO submitNode = new PlanAssignSteerModifyTimelineVO();
submitNode.setType("submit");
submitNode.setLabel("提交人");
// 查询申请人姓名
String applicantName = "-";
if (entity.getCreateMan() != null) {
R<User> 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<PlanAssignSteerModifyApproval> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("PASM_ID", id)
.eq("IS_DELETED", 0)
.orderByAsc("APPROVAL_NODE")
.orderByAsc("AUDIT_TIME");
List<PlanAssignSteerModifyApproval> allRecords = planAssignSteerModifyApprovalService.list(queryWrapper);
Map<Integer, List<PlanAssignSteerModifyApproval>> 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<PlanAssignSteerModifyApproval> records,
Integer approvalNode,
List<PlanAssignSteerModifyTimelineVO> 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<PlanAssignSteerModifyTimelineVO> 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);
}
}

@ -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<PlanAssignSteerModify, PlanAssignSteerModifyVO> {
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 -> "未知";
};
}
}

@ -194,7 +194,7 @@ public class DispatchConfigApprovalController extends BladeController {
/**
* [分派配置审批] 查询审批时间线
*/
@GetMapping("/auditTimeline/{id}")
@GetMapping("/auditHistory/{id}")
@ApiOperationSupport(order = 90)
@Operation(summary = "查询审批时间线", description = "传入主键ID")
public R<List<DispatchConfigApprovalTimelineVO>> getAuditTimeline(@Parameter(description = "主键ID", required = true) @PathVariable Long id) {

@ -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<PlanAssignSteerModifyVO> 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<IPage<PlanAssignSteerModifyVO>> page(PlanAssignSteerModifyVO planAssignSteerModify, Query query) {
IPage<PlanAssignSteerModifyVO> 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<String, Object> planAssignSteerModify,
HttpServletResponse response) {
List<PlanAssignSteerModifyVO> 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<List<PlanAssignSteerModifyTimelineVO>> getAuditTimeline(@Parameter(description = "主键ID", required = true) @PathVariable Long id) {
return R.data(service.getAuditTimeline(id));
}
}

@ -5,30 +5,30 @@
<!-- 查询室主任审批节点的所有审批人 -->
<!-- 角色:热表-厂内调度室主任、热表-外协调度室主任 -->
<select id="selectLevel1Auditors" resultType="org.springblade.desk.quality.pojo.entity.DispatchConfigApprovalRecord">
SELECT
sr.ID as auditorId,
sr.REAL_NAME as auditorName,
1 as sortOrder
FROM BLADE_USER_ROLE sur
JOIN BLADE_ROLE r ON sur.ROLE_ID = r.ID
JOIN BLADE_USER sr ON sur.USER_ID = sr.ID
WHERE r.ROLE_ALIAS IN ('热表-厂内调度室主任', '热表-外协调度室主任')
AND sr.IS_DELETED = 0
SELECT DISTINCT
u.ID AS auditorId,
u.REAL_NAME AS auditorName,
1 AS sortOrder
FROM BLADE_USER u
INNER JOIN BLADE_ROLE r ON INSTR(',' || u.ROLE_ID || ',', ',' || r.ID || ',') > 0
WHERE r.ROLE_ALIAS IN ('dispatch_manger', 'supplier_dispatch_manger')
AND u.IS_DELETED = 0
AND r.IS_DELETED = 0
ORDER BY sortOrder
</select>
<!-- 查询领导审批节点的所有审批人 -->
<!-- 角色:热表-副厂长、热表-主任、热表-厂长 -->
<select id="selectLevel2Auditors" resultType="org.springblade.desk.quality.pojo.entity.DispatchConfigApprovalRecord">
SELECT
sr.ID as auditorId,
sr.REAL_NAME as auditorName,
2 as sortOrder
FROM BLADE_USER_ROLE sur
JOIN BLADE_ROLE r ON sur.ROLE_ID = r.ID
JOIN BLADE_USER sr ON sur.USER_ID = sr.ID
WHERE r.ROLE_ALIAS IN ('热表-副厂长', '热表-主任', '热表-厂长')
AND sr.IS_DELETED = 0
SELECT DISTINCT
u.ID AS auditorId,
u.REAL_NAME AS auditorName,
2 AS sortOrder
FROM BLADE_USER u
INNER JOIN BLADE_ROLE r ON INSTR(',' || u.ROLE_ID || ',', ',' || r.ID || ',') > 0
WHERE r.ROLE_ALIAS IN ('deputy_plant_manager', 'rb_manager', 'plant_manager')
AND u.IS_DELETED = 0
AND r.IS_DELETED = 0
ORDER BY sortOrder
</select>

@ -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<Dispatc
// 更新状态为一级审批中
entity.setStatus(DispatchConfigApprovalConst.STATUS_LEVEL1_APPROVING);
updateById(entity);
// 删除当前节点的审批记录,以便重新审批
QueryWrapper<DispatchConfigApprovalRecord> deleteQuery = new QueryWrapper<>();
deleteQuery.eq("APPROVAL_ID", id);
approvalRecordMapper.delete(deleteQuery);
return R.success("提交审批成功");
}
@ -267,6 +274,10 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl<Dispatc
newRecord.setAuditResult(result);
newRecord.setAuditRemark(remark);
newRecord.setAuditTime(now);
newRecord.setCreateTime(now);
newRecord.setCreateUser(currentUserId);
newRecord.setUpdateTime(now);
newRecord.setUpdateUser(currentUserId);
approvalRecordMapper.insert(newRecord);
// 如果审批驳回,直接驳回到发起人,并删除审批记录
@ -275,11 +286,6 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl<Dispatc
entity.setUpdateUser(currentUserId);
entity.setUpdateTime(now);
updateById(entity);
// 删除当前节点的审批记录,以便重新审批
QueryWrapper<DispatchConfigApprovalRecord> deleteQuery = new QueryWrapper<>();
deleteQuery.eq("APPROVAL_ID", id);
approvalRecordMapper.delete(deleteQuery);
return R.success("审批已驳回");
}
@ -323,6 +329,7 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl<Dispatc
@Override
public List<DispatchConfigApprovalTimelineVO> getAuditTimeline(Long id) {
DispatchConfigApproval entity = getById(id);
if (entity == null) {
return new ArrayList<>();
@ -333,59 +340,91 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl<Dispatc
// 1. 添加提交记录
DispatchConfigApprovalTimelineVO submitNode = new DispatchConfigApprovalTimelineVO();
submitNode.setType("submit");
submitNode.setLabel("提交人");
submitNode.setLabel("提交人");
submitNode.setValue(entity.getApplicantName() != null ? entity.getApplicantName() : "未知");
submitNode.setTime(entity.getApplicationTime() != null ? DateUtil.format(entity.getApplicationTime(), "yyyy-MM-dd HH:mm:ss") : "");
submitNode.setStatus("success");
submitNode.setApprovalNode(0);
// 提交节点不需要children
DispatchConfigApprovalTimelineVO dispatchConfigApprovalTimelineVO = BeanUtil.copyProperties(submitNode, DispatchConfigApprovalTimelineVO.class);
submitNode.setChildren(List.of(dispatchConfigApprovalTimelineVO));
timelineList.add(submitNode);
// 2. 查询所有审批记录
// 2. 查询所有审批记录并按节点分组
List<DispatchConfigApprovalRecord> allRecords = approvalRecordMapper.selectByApprovalId(id);
// 按审批节点分组
Map<Integer, List<DispatchConfigApprovalRecord>> nodeMap = allRecords.stream()
.collect(Collectors.groupingBy(DispatchConfigApprovalRecord::getApprovalNode));
// 3. 添加一级审批节点(如果有审批记录)
if (nodeMap.containsKey(1)) {
List<DispatchConfigApprovalRecord> 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<DispatchConfigApprovalRecord> records,
Integer approvalNode,
List<DispatchConfigApprovalTimelineVO> 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<DispatchConfigApprovalRecord> level2Records = nodeMap.get(2);
// 只展示第一个通过的审批人
DispatchConfigApprovalRecord firstRecord = level2Records.get(0);
// 为每个审批人创建一条时间线记录
List<DispatchConfigApprovalTimelineVO> 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);
}
/**

@ -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);

@ -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;
Loading…
Cancel
Save