parent
9dc103d1c9
commit
66bfe969e3
25 changed files with 2158 additions and 10 deletions
@ -0,0 +1,98 @@ |
||||
package org.springblade.desk.oem.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 qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
@Data |
||||
@TableName("MES_OEM_SETTLE_APPROVAL_DTL") |
||||
@Schema(description = "OemSettlementApprovalDetail对象") |
||||
@EqualsAndHashCode(callSuper = true) |
||||
public class OemSettlementApprovalDetailEntity extends BaseEntity { |
||||
|
||||
@Serial |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
/** |
||||
* 审批主表ID |
||||
*/ |
||||
@Schema(description = "审批主表ID") |
||||
private Long approvalId; |
||||
|
||||
/** |
||||
* 外协厂家ID |
||||
*/ |
||||
@Schema(description = "外协厂家ID") |
||||
private Long ocId; |
||||
|
||||
/** |
||||
* 外协厂家编码 |
||||
*/ |
||||
@Schema(description = "外协厂家编码") |
||||
private String ocCode; |
||||
|
||||
/** |
||||
* 外协厂家名称 |
||||
*/ |
||||
@Schema(description = "外协厂家名称") |
||||
private String ocName; |
||||
|
||||
/** |
||||
* 标准工序代码(结算大类) |
||||
*/ |
||||
@Schema(description = "标准工序代码(结算大类)") |
||||
private String standardProcessCode; |
||||
|
||||
/** |
||||
* 结算大类ID |
||||
*/ |
||||
@Schema(description = "结算大类ID") |
||||
private Long statementCategoryId; |
||||
|
||||
/** |
||||
* 结算大类名称 |
||||
*/ |
||||
@Schema(description = "结算大类名称") |
||||
private String statementCategory; |
||||
|
||||
/** |
||||
* 批数(分组结算数据数量) |
||||
*/ |
||||
@Schema(description = "批数") |
||||
private Integer batchCount; |
||||
|
||||
/** |
||||
* 总面积(dm²)(分组结算数据总面积) |
||||
*/ |
||||
@Schema(description = "总面积(dm²)") |
||||
private BigDecimal totalArea; |
||||
|
||||
/** |
||||
* 面积月占比(%) |
||||
*/ |
||||
@Schema(description = "面积月占比(%)") |
||||
private BigDecimal areaMonthRatio; |
||||
|
||||
/** |
||||
* 月结算金额(元)(分组结算数据总金额) |
||||
*/ |
||||
@Schema(description = "月结算金额(元)") |
||||
private BigDecimal monthAmount; |
||||
|
||||
/** |
||||
* 金额月占比(%) |
||||
*/ |
||||
@Schema(description = "金额月占比(%)") |
||||
private BigDecimal amountMonthRatio; |
||||
} |
||||
@ -0,0 +1,191 @@ |
||||
package org.springblade.desk.oem.pojo.entity; |
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName; |
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Data; |
||||
import lombok.EqualsAndHashCode; |
||||
import lombok.Getter; |
||||
import org.springblade.core.mp.base.BaseEntity; |
||||
|
||||
import java.io.Serial; |
||||
import java.math.BigDecimal; |
||||
import java.util.Date; |
||||
|
||||
/** |
||||
* 外协结算审批主表 实体类 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
@Data |
||||
@TableName("MES_OEM_SETTLEMENT_APPROVAL") |
||||
@Schema(description = "OemSettlementApproval对象") |
||||
@EqualsAndHashCode(callSuper = true) |
||||
public class OemSettlementApprovalEntity extends BaseEntity { |
||||
|
||||
@Serial |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
/** |
||||
* 审批状态枚举 |
||||
*/ |
||||
@Getter |
||||
@AllArgsConstructor |
||||
public enum ApprovalStatusEnum { |
||||
//(待校对、校对中、待审核、审核通过、不通过)
|
||||
|
||||
/** |
||||
* 待审批 |
||||
*/ |
||||
PENDING(1, "待校对"), |
||||
|
||||
/** |
||||
* 校对中 |
||||
*/ |
||||
PROOFREADING(2, "校对中"), |
||||
|
||||
/** |
||||
* 审批通过 |
||||
*/ |
||||
APPROVED(3, "审核通过"), |
||||
|
||||
/** |
||||
* 审批不通过 |
||||
*/ |
||||
REJECTED(4, "不通过"), |
||||
|
||||
/** |
||||
* 待审核 |
||||
*/ |
||||
WAITING_AUDIT(5, "待审核"); |
||||
|
||||
private final Integer code; |
||||
private final String name; |
||||
|
||||
/** |
||||
* 根据code获取枚举 |
||||
*/ |
||||
public static ApprovalStatusEnum getByCode(Integer code) { |
||||
if (code == null) { |
||||
return null; |
||||
} |
||||
for (ApprovalStatusEnum status : values()) { |
||||
if (status.getCode().equals(code)) { |
||||
return status; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 根据code获取名称 |
||||
*/ |
||||
public static String getNameByCode(Integer code) { |
||||
ApprovalStatusEnum status = getByCode(code); |
||||
return status != null ? status.getName() : "未知"; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 审批单号 |
||||
*/ |
||||
@Schema(description = "审批单号") |
||||
private String approvalNo; |
||||
|
||||
/** |
||||
* 结算总批数 |
||||
*/ |
||||
@Schema(description = "结算总批数") |
||||
private Integer totalCount; |
||||
|
||||
/** |
||||
* 结算总面积(dm²) |
||||
*/ |
||||
@Schema(description = "结算总面积(dm²)") |
||||
private BigDecimal totalArea; |
||||
|
||||
/** |
||||
* 结算总金额(元) |
||||
*/ |
||||
@Schema(description = "结算总金额(元)") |
||||
private BigDecimal totalAmount; |
||||
|
||||
/** |
||||
* 结算说明 |
||||
*/ |
||||
@Schema(description = "结算说明") |
||||
private String settlementMemo; |
||||
|
||||
/** |
||||
* 审批状态:1-待校对,2-校对中,3-审核通过,4-不通过,5-待审核 |
||||
*/ |
||||
@Schema(description = "审批状态:1-待校对,2-校对中,3-审核通过,4-不通过,5-待审核") |
||||
private Integer approvalStatus; |
||||
|
||||
/** |
||||
* 提交时间 |
||||
*/ |
||||
@Schema(description = "提交时间") |
||||
private Date submitTime; |
||||
|
||||
/** |
||||
* 审批时间 |
||||
*/ |
||||
@Schema(description = "审批时间") |
||||
private Date approvalTime; |
||||
|
||||
/** |
||||
* 审批人ID |
||||
*/ |
||||
@Schema(description = "审批人ID") |
||||
private Long approvalUserId; |
||||
|
||||
/** |
||||
* 审批人姓名 |
||||
*/ |
||||
@Schema(description = "审批人姓名") |
||||
private String approvalUserName; |
||||
|
||||
/** |
||||
* 审批意见 |
||||
*/ |
||||
@Schema(description = "审批意见") |
||||
private String approvalMemo; |
||||
|
||||
/** |
||||
* 校对人1 ID |
||||
*/ |
||||
@Schema(description = "校对人1 ID") |
||||
private Long proofreader1Id; |
||||
|
||||
/** |
||||
* 校对人1 姓名 |
||||
*/ |
||||
@Schema(description = "校对人1 姓名") |
||||
private String proofreader1Name; |
||||
|
||||
/** |
||||
* 校对时间1 |
||||
*/ |
||||
@Schema(description = "校对时间1") |
||||
private Date proofreadTime1; |
||||
|
||||
/** |
||||
* 校对人2 ID |
||||
*/ |
||||
@Schema(description = "校对人2 ID") |
||||
private Long proofreader2Id; |
||||
|
||||
/** |
||||
* 校对人2 姓名 |
||||
*/ |
||||
@Schema(description = "校对人2 姓名") |
||||
private String proofreader2Name; |
||||
|
||||
/** |
||||
* 校对时间2 |
||||
*/ |
||||
@Schema(description = "校对时间2") |
||||
private Date proofreadTime2; |
||||
} |
||||
@ -0,0 +1,62 @@ |
||||
package org.springblade.desk.oem.pojo.request; |
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import lombok.Data; |
||||
import org.springframework.format.annotation.DateTimeFormat; |
||||
|
||||
import java.time.LocalDate; |
||||
|
||||
/** |
||||
* 外协结算审批查询条件类 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
@Data |
||||
@Schema(description = "外协结算审批查询条件") |
||||
public class SettlementApprovalQuery { |
||||
|
||||
/** |
||||
* 审批单号 |
||||
*/ |
||||
@Schema(description = "审批单号") |
||||
private String approvalNo; |
||||
|
||||
/** |
||||
* 审批状态:1-待审批,2-审批中,3-审批通过,4-审批不通过 |
||||
*/ |
||||
@Schema(description = "审批状态:1-待审批,2-审批中,3-审批通过,4-审批不通过") |
||||
private Integer approvalStatus; |
||||
|
||||
/** |
||||
* 提交时间开始 |
||||
*/ |
||||
@DateTimeFormat(pattern = "yyyy-MM-dd") |
||||
@Schema(description = "提交时间开始") |
||||
private LocalDate submitTimeStart; |
||||
|
||||
/** |
||||
* 提交时间结束 |
||||
*/ |
||||
@DateTimeFormat(pattern = "yyyy-MM-dd") |
||||
@Schema(description = "提交时间结束") |
||||
private LocalDate submitTimeEnd; |
||||
|
||||
/** |
||||
* 校对人1 ID |
||||
*/ |
||||
@Schema(description = "校对人1 ID") |
||||
private Long proofreader1Id; |
||||
|
||||
/** |
||||
* 校对人2 ID |
||||
*/ |
||||
@Schema(description = "校对人2 ID") |
||||
private Long proofreader2Id; |
||||
|
||||
/** |
||||
* 是否按厂家分组:true-按厂家,false-按厂家+结算大类(默认) |
||||
*/ |
||||
@Schema(description = "是否按厂家分组:true-按厂家,false-按厂家+结算大类(默认)") |
||||
private Boolean groupByOc; |
||||
} |
||||
@ -0,0 +1,43 @@ |
||||
package org.springblade.desk.oem.pojo.request; |
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import jakarta.validation.constraints.NotNull; |
||||
import lombok.Data; |
||||
|
||||
/** |
||||
* 外协结算审批请求 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
@Data |
||||
@Schema(description = "外协结算审批请求") |
||||
public class SettlementApprovalRequest { |
||||
|
||||
/** |
||||
* 审批ID |
||||
*/ |
||||
@NotNull(message = "审批ID不能为空") |
||||
@Schema(description = "审批ID", required = true) |
||||
private Long approvalId; |
||||
|
||||
/** |
||||
* 审批类型:1-校对,2-审核 |
||||
*/ |
||||
@NotNull(message = "审批类型不能为空") |
||||
@Schema(description = "审批类型:1-校对,2-审核", required = true) |
||||
private Integer approvalType; |
||||
|
||||
/** |
||||
* 审批结果:1-通过,2-不通过 |
||||
*/ |
||||
@NotNull(message = "审批结果不能为空") |
||||
@Schema(description = "审批结果:1-通过,2-不通过", required = true) |
||||
private Integer approvalResult; |
||||
|
||||
/** |
||||
* 审批意见(不通过时必填) |
||||
*/ |
||||
@Schema(description = "审批意见(不通过时必填)") |
||||
private String approvalMemo; |
||||
} |
||||
@ -0,0 +1,100 @@ |
||||
package org.springblade.desk.oem.pojo.vo; |
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import lombok.Data; |
||||
|
||||
import java.io.Serial; |
||||
import java.io.Serializable; |
||||
import java.math.BigDecimal; |
||||
|
||||
/** |
||||
* 外协结算审批明细 VO |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
@Data |
||||
@Schema(description = "外协结算审批明细VO") |
||||
public class OemSettlementApprovalDetailVO implements Serializable { |
||||
|
||||
@Serial |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
/** |
||||
* 主键ID |
||||
*/ |
||||
@Schema(description = "主键ID") |
||||
private Long id; |
||||
|
||||
/** |
||||
* 审批主表ID |
||||
*/ |
||||
@Schema(description = "审批主表ID") |
||||
private Long approvalId; |
||||
|
||||
/** |
||||
* 外协厂家ID |
||||
*/ |
||||
@Schema(description = "外协厂家ID") |
||||
private Long ocId; |
||||
|
||||
/** |
||||
* 外协厂家编码 |
||||
*/ |
||||
@Schema(description = "外协厂家编码") |
||||
private String ocCode; |
||||
|
||||
/** |
||||
* 外协厂家名称 |
||||
*/ |
||||
@Schema(description = "外协厂家名称") |
||||
private String ocName; |
||||
|
||||
/** |
||||
* 标准工序代码 |
||||
*/ |
||||
@Schema(description = "标准工序代码") |
||||
private String standardProcessCode; |
||||
|
||||
/** |
||||
* 结算大类ID |
||||
*/ |
||||
@Schema(description = "结算大类ID") |
||||
private Long statementCategoryId; |
||||
|
||||
/** |
||||
* 结算大类名称 |
||||
*/ |
||||
@Schema(description = "结算大类名称") |
||||
private String statementCategory; |
||||
|
||||
/** |
||||
* 批数 |
||||
*/ |
||||
@Schema(description = "批数") |
||||
private Integer batchCount; |
||||
|
||||
/** |
||||
* 总面积(dm²) |
||||
*/ |
||||
@Schema(description = "总面积(dm²)") |
||||
private BigDecimal totalArea; |
||||
|
||||
/** |
||||
* 面积月占比(%) |
||||
*/ |
||||
@Schema(description = "面积月占比(%)") |
||||
private BigDecimal areaMonthRatio; |
||||
|
||||
/** |
||||
* 月结算金额(元) |
||||
*/ |
||||
@Schema(description = "月结算金额(元)") |
||||
private BigDecimal monthAmount; |
||||
|
||||
/** |
||||
* 金额月占比(%) |
||||
*/ |
||||
@Schema(description = "金额月占比(%)") |
||||
private BigDecimal amountMonthRatio; |
||||
} |
||||
@ -0,0 +1,159 @@ |
||||
package org.springblade.desk.oem.pojo.vo; |
||||
|
||||
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; |
||||
import java.util.Date; |
||||
|
||||
/** |
||||
* 外协结算审批主表 VO |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
@Data |
||||
@Schema(description = "外协结算审批主表VO") |
||||
@EqualsAndHashCode(callSuper = true) |
||||
public class OemSettlementApprovalVO extends BaseEntity { |
||||
|
||||
@Serial |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
/** |
||||
* 审批单号 |
||||
*/ |
||||
@Schema(description = "审批单号") |
||||
private String approvalNo; |
||||
|
||||
/** |
||||
* 结算总批数 |
||||
*/ |
||||
@Schema(description = "结算总批数") |
||||
private Integer totalCount; |
||||
|
||||
/** |
||||
* 结算总面积(dm²) |
||||
*/ |
||||
@Schema(description = "结算总面积(dm²)") |
||||
private BigDecimal totalArea; |
||||
|
||||
/** |
||||
* 结算总金额(元) |
||||
*/ |
||||
@Schema(description = "结算总金额(元)") |
||||
private BigDecimal totalAmount; |
||||
|
||||
/** |
||||
* 结算说明 |
||||
*/ |
||||
@Schema(description = "结算说明") |
||||
private String settlementMemo; |
||||
|
||||
/** |
||||
* 审批状态:1-待审批,2-审批中,3-审批通过,4-审批不通过 |
||||
*/ |
||||
@Schema(description = "审批状态:1-待审批,2-审批中,3-审批通过,4-审批不通过") |
||||
private Integer approvalStatus; |
||||
|
||||
/** |
||||
* 审批状态名称 |
||||
*/ |
||||
@Schema(description = "审批状态名称") |
||||
private String approvalStatusName; |
||||
|
||||
/** |
||||
* 提交时间 |
||||
*/ |
||||
@Schema(description = "提交时间") |
||||
private Date submitTime; |
||||
|
||||
/** |
||||
* 提交日期字符串 |
||||
*/ |
||||
@Schema(description = "提交日期") |
||||
private String submitDate; |
||||
|
||||
/** |
||||
* 审批时间 |
||||
*/ |
||||
@Schema(description = "审批时间") |
||||
private Date approvalTime; |
||||
|
||||
/** |
||||
* 审批日期字符串 |
||||
*/ |
||||
@Schema(description = "审批日期") |
||||
private String approvalDate; |
||||
|
||||
/** |
||||
* 审批人ID |
||||
*/ |
||||
@Schema(description = "审批人ID") |
||||
private Long approvalUserId; |
||||
|
||||
/** |
||||
* 审批人姓名 |
||||
*/ |
||||
@Schema(description = "审批人姓名") |
||||
private String approvalUserName; |
||||
|
||||
/** |
||||
* 审批意见 |
||||
*/ |
||||
@Schema(description = "审批意见") |
||||
private String approvalMemo; |
||||
|
||||
/** |
||||
* 校对人1 ID |
||||
*/ |
||||
@Schema(description = "校对人1 ID") |
||||
private Long proofreader1Id; |
||||
|
||||
/** |
||||
* 校对人1 姓名 |
||||
*/ |
||||
@Schema(description = "校对人1 姓名") |
||||
private String proofreader1Name; |
||||
|
||||
/** |
||||
* 校对时间1 |
||||
*/ |
||||
@Schema(description = "校对时间1") |
||||
private Date proofreadTime1; |
||||
|
||||
/** |
||||
* 校对时间1字符串 |
||||
*/ |
||||
@Schema(description = "校对时间1") |
||||
private String proofreadTime1Str; |
||||
|
||||
/** |
||||
* 校对人2 ID |
||||
*/ |
||||
@Schema(description = "校对人2 ID") |
||||
private Long proofreader2Id; |
||||
|
||||
/** |
||||
* 校对人2 姓名 |
||||
*/ |
||||
@Schema(description = "校对人2 姓名") |
||||
private String proofreader2Name; |
||||
|
||||
/** |
||||
* 校对时间2 |
||||
*/ |
||||
@Schema(description = "校对时间2") |
||||
private Date proofreadTime2; |
||||
|
||||
/** |
||||
* 校对时间2字符串 |
||||
*/ |
||||
@Schema(description = "校对时间2") |
||||
private String proofreadTime2Str; |
||||
|
||||
private String createUserName; |
||||
} |
||||
@ -0,0 +1,32 @@ |
||||
package org.springblade.erpdata.feign; |
||||
|
||||
import org.springblade.common.constant.LauncherConstant; |
||||
import org.springblade.core.launch.constant.AppConstant; |
||||
import org.springblade.core.tool.api.R; |
||||
import org.springblade.erpdata.pojo.dto.OemProcessSettlementDTO; |
||||
import org.springframework.cloud.openfeign.FeignClient; |
||||
import org.springframework.web.bind.annotation.PostMapping; |
||||
import org.springframework.web.bind.annotation.RequestBody; |
||||
|
||||
/** |
||||
* ERP外协结算 Feign接口类 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-13 |
||||
*/ |
||||
@FeignClient(value = LauncherConstant.APPLICATION_ERP_DATA_NAME, |
||||
fallback = IErpPartoplinkFirseqClientFallback.class) |
||||
public interface IErpOemSettlementClient { |
||||
|
||||
String API_PREFIX = "/feign/client/erpOemSettlement"; |
||||
String PUSH_SINGLE = API_PREFIX + "/pushSingle"; |
||||
|
||||
/** |
||||
* 推送单条外协结算数据到ERP |
||||
* |
||||
* @param dto 结算数据 |
||||
* @return 结果 |
||||
*/ |
||||
@PostMapping(PUSH_SINGLE) |
||||
R pushSingleToErp(@RequestBody OemProcessSettlementDTO dto); |
||||
} |
||||
@ -0,0 +1,171 @@ |
||||
package org.springblade.erpdata.pojo.dto; |
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import lombok.Data; |
||||
|
||||
import java.io.Serializable; |
||||
import java.math.BigDecimal; |
||||
import java.util.Date; |
||||
|
||||
/** |
||||
* 外协工序结算单 DTO |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-13 |
||||
*/ |
||||
@Data |
||||
@Schema(description = "外协工序结算单DTO") |
||||
public class OemProcessSettlementDTO implements Serializable { |
||||
|
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
/** |
||||
* ID(mes_card_no) |
||||
*/ |
||||
@Schema(description = "ID") |
||||
private String id; |
||||
|
||||
/** |
||||
* 车间订单号(wo_code_run) |
||||
*/ |
||||
@Schema(description = "车间订单号") |
||||
private String sono; |
||||
|
||||
/** |
||||
* 零件号(part_code) |
||||
*/ |
||||
@Schema(description = "零件号") |
||||
private String prtno; |
||||
|
||||
/** |
||||
* 批次号(batch_no) |
||||
*/ |
||||
@Schema(description = "批次号") |
||||
private String splcode; |
||||
|
||||
/** |
||||
* 生产标识(prod_ident) |
||||
*/ |
||||
@Schema(description = "生产标识") |
||||
private String prtlotno; |
||||
|
||||
/** |
||||
* 计划部门(plan_deptcode) |
||||
*/ |
||||
@Schema(description = "计划部门") |
||||
private String plndept; |
||||
|
||||
/** |
||||
* 使用部门(use_deptcode) |
||||
*/ |
||||
@Schema(description = "使用部门") |
||||
private String usedept; |
||||
|
||||
/** |
||||
* 完成日期(put_store_time) |
||||
*/ |
||||
@Schema(description = "完成日期") |
||||
private Date soenddat; |
||||
|
||||
/** |
||||
* 厂家代码(oc_code) |
||||
*/ |
||||
@Schema(description = "厂家代码") |
||||
private String splycode; |
||||
|
||||
/** |
||||
* 厂家名称(oc_name) |
||||
*/ |
||||
@Schema(description = "厂家名称") |
||||
private String splyname; |
||||
|
||||
/** |
||||
* 合格数量(inventory_qty) |
||||
*/ |
||||
@Schema(description = "合格数量") |
||||
private BigDecimal sorecqty; |
||||
|
||||
/** |
||||
* 单价 |
||||
*/ |
||||
@Schema(description = "单价") |
||||
private BigDecimal price; |
||||
|
||||
/** |
||||
* 单位面积(po_are) |
||||
*/ |
||||
@Schema(description = "单位面积") |
||||
private BigDecimal unitarea; |
||||
|
||||
/** |
||||
* 总面积 |
||||
*/ |
||||
@Schema(description = "总面积") |
||||
private BigDecimal sumarea; |
||||
|
||||
/** |
||||
* 结算金额 |
||||
*/ |
||||
@Schema(description = "结算金额") |
||||
private BigDecimal clearfund; |
||||
|
||||
/** |
||||
* 工序名称(pps_name) |
||||
*/ |
||||
@Schema(description = "工序名称") |
||||
private String seqdesc; |
||||
|
||||
/** |
||||
* 报价单号 |
||||
*/ |
||||
@Schema(description = "报价单号") |
||||
private String priceno; |
||||
|
||||
/** |
||||
* 色标个数 |
||||
*/ |
||||
@Schema(description = "色标个数") |
||||
private String sbnumber; |
||||
|
||||
/** |
||||
* 色带个数 |
||||
*/ |
||||
@Schema(description = "色带个数") |
||||
private String sdnumber; |
||||
|
||||
/** |
||||
* 箭头个数 |
||||
*/ |
||||
@Schema(description = "箭头个数") |
||||
private String jtnumber; |
||||
|
||||
/** |
||||
* 计量单位 |
||||
*/ |
||||
@Schema(description = "计量单位") |
||||
private String prtum; |
||||
|
||||
/** |
||||
* 计划单号(4车间) |
||||
*/ |
||||
@Schema(description = "计划单号") |
||||
private String planno; |
||||
|
||||
/** |
||||
* 镀种描述 |
||||
*/ |
||||
@Schema(description = "镀种描述") |
||||
private String kdofplatdesc; |
||||
|
||||
/** |
||||
* 镀层厚度 |
||||
*/ |
||||
@Schema(description = "镀层厚度") |
||||
private String kdofplatheight; |
||||
|
||||
/** |
||||
* 零件名称 |
||||
*/ |
||||
@Schema(description = "零件名称") |
||||
private String prtdesc; |
||||
} |
||||
@ -0,0 +1,81 @@ |
||||
package org.springblade.desk.oem.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.tags.Tag; |
||||
import jakarta.validation.Valid; |
||||
import lombok.AllArgsConstructor; |
||||
import org.springblade.core.boot.ctrl.BladeController; |
||||
import org.springblade.core.mp.support.Condition; |
||||
import org.springblade.core.mp.support.Query; |
||||
import org.springblade.core.tool.api.R; |
||||
import org.springblade.desk.oem.pojo.request.SettlementApprovalQuery; |
||||
import org.springblade.desk.oem.pojo.request.SettlementApprovalRequest; |
||||
import org.springblade.desk.oem.pojo.request.StatementQuery; |
||||
import org.springblade.desk.oem.pojo.vo.OemSettlementApprovalDetailVO; |
||||
import org.springblade.desk.oem.pojo.vo.OemSettlementApprovalVO; |
||||
import org.springblade.desk.oem.service.IOemSettlementApprovalService; |
||||
import org.springframework.web.bind.annotation.*; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 外协结算审批 控制器 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
@RestController |
||||
@AllArgsConstructor |
||||
@RequestMapping("/oemSettlementApproval") |
||||
@Tag(name = "外协结算审批", description = "外协结算审批接口") |
||||
public class OemSettlementApprovalController extends BladeController { |
||||
|
||||
private final IOemSettlementApprovalService oemSettlementApprovalService; |
||||
|
||||
/** |
||||
* 审批列表分页查询 |
||||
*/ |
||||
@GetMapping("/page") |
||||
@ApiOperationSupport(order = 1) |
||||
@Operation(summary = "审批列表", description = "分页查询外协结算审批列表") |
||||
public R<IPage<OemSettlementApprovalVO>> page(SettlementApprovalQuery queryEntity, Query query) { |
||||
IPage<OemSettlementApprovalVO> page = Condition.getPage(query); |
||||
return R.data(oemSettlementApprovalService.selectApprovalPage(page, queryEntity)); |
||||
} |
||||
|
||||
/** |
||||
* 审批详情 |
||||
*/ |
||||
@GetMapping("/detail") |
||||
@ApiOperationSupport(order = 2) |
||||
@Operation(summary = "审批详情", description = "根据ID查询审批详情") |
||||
public R<OemSettlementApprovalVO> detail(@RequestParam Long id) { |
||||
return R.data(oemSettlementApprovalService.getApprovalDetail(id)); |
||||
} |
||||
|
||||
/** |
||||
* 审批明细列表 |
||||
*/ |
||||
@GetMapping("/detailList") |
||||
@ApiOperationSupport(order = 3) |
||||
@Operation(summary = "审批明细列表", description = "查询审批明细,支持按厂家或厂家+结算大类分组") |
||||
public R<List<OemSettlementApprovalDetailVO>> detailList(@RequestParam Long approvalId, |
||||
@RequestParam(required = false, defaultValue = "false") Boolean groupByOc) { |
||||
// groupByOc: true-按厂家,false-按厂家+结算大类(默认)
|
||||
return R.data(oemSettlementApprovalService.getApprovalDetailList(approvalId, groupByOc)); |
||||
} |
||||
|
||||
/** |
||||
* 提交审批(校对/审核) |
||||
*/ |
||||
@PostMapping("/submit") |
||||
@ApiOperationSupport(order = 4) |
||||
@Operation(summary = "提交审批", description = "校对员或审核员提交审批结果") |
||||
public R submit(@Valid @RequestBody SettlementApprovalRequest request) { |
||||
return oemSettlementApprovalService.submitApproval(request); |
||||
} |
||||
|
||||
|
||||
} |
||||
@ -0,0 +1,13 @@ |
||||
package org.springblade.desk.oem.mapper; |
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
import org.springblade.desk.oem.pojo.entity.OemSettlementApprovalDetailEntity; |
||||
|
||||
/** |
||||
* 外协结算审批明细表 Mapper 接口 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
public interface OemSettlementApprovalDetailMapper extends BaseMapper<OemSettlementApprovalDetailEntity> { |
||||
} |
||||
@ -0,0 +1,28 @@ |
||||
package org.springblade.desk.oem.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.oem.pojo.entity.OemSettlementApprovalEntity; |
||||
import org.springblade.desk.oem.pojo.request.SettlementApprovalQuery; |
||||
import org.springblade.desk.oem.pojo.vo.OemSettlementApprovalVO; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 外协结算审批主表 Mapper 接口 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
public interface OemSettlementApprovalMapper extends BaseMapper<OemSettlementApprovalEntity> { |
||||
|
||||
/** |
||||
* 自定义分页查询 |
||||
* |
||||
* @param page 分页参数 |
||||
* @param query 查询条件 |
||||
* @return List<OemSettlementApprovalVO> |
||||
*/ |
||||
List<OemSettlementApprovalVO> selectApprovalPage(IPage page, @Param("query") SettlementApprovalQuery query); |
||||
} |
||||
@ -0,0 +1,72 @@ |
||||
<?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.oem.mapper.OemSettlementApprovalMapper"> |
||||
|
||||
<!-- 自定义分页查询 --> |
||||
<select id="selectApprovalPage" resultType="org.springblade.desk.oem.pojo.vo.OemSettlementApprovalVO"> |
||||
SELECT |
||||
a.ID, |
||||
a.TENANT_ID, |
||||
a.CREATE_USER, |
||||
a.CREATE_TIME, |
||||
a.CREATE_DEPT, |
||||
a.UPDATE_USER, |
||||
a.UPDATE_TIME, |
||||
a.STATUS, |
||||
a.IS_DELETED, |
||||
a.APPROVAL_NO, |
||||
a.TOTAL_COUNT, |
||||
a.TOTAL_AREA, |
||||
a.TOTAL_AMOUNT, |
||||
a.SETTLEMENT_MEMO, |
||||
a.APPROVAL_STATUS, |
||||
CASE a.APPROVAL_STATUS |
||||
WHEN 1 THEN '待审批' |
||||
WHEN 2 THEN '审批中' |
||||
WHEN 3 THEN '审批通过' |
||||
WHEN 4 THEN '审批不通过' |
||||
ELSE '未知' |
||||
END AS APPROVAL_STATUS_NAME, |
||||
a.SUBMIT_TIME, |
||||
to_char(a.SUBMIT_TIME, 'yyyy-MM-dd') as SUBMIT_DATE, |
||||
a.APPROVAL_TIME, |
||||
to_char(a.APPROVAL_TIME, 'yyyy-MM-dd') as APPROVAL_DATE, |
||||
a.APPROVAL_USER_ID, |
||||
a.APPROVAL_MEMO, |
||||
a.PROOFREADER1_ID, |
||||
a.PROOFREADER1_NAME, |
||||
a.PROOFREAD_TIME1, |
||||
to_char(a.PROOFREAD_TIME1, 'yyyy-MM-dd HH24:mi:ss') as PROOFREAD_TIME1_STR, |
||||
a.PROOFREADER2_ID, |
||||
a.PROOFREADER2_NAME, |
||||
a.PROOFREAD_TIME2, |
||||
to_char(a.PROOFREAD_TIME2, 'yyyy-MM-dd HH24:mi:ss') as PROOFREAD_TIME2_STR, |
||||
u.NAME AS CREATE_USER_NAME, |
||||
a.APPROVAL_USER_NAME |
||||
FROM MES_OEM_SETTLEMENT_APPROVAL a |
||||
LEFT JOIN BLADE_USER u ON a.CREATE_USER = u.ID |
||||
<where> |
||||
a.IS_DELETED = 0 |
||||
<if test="query.approvalNo != null and query.approvalNo != ''"> |
||||
AND a.APPROVAL_NO LIKE CONCAT('%', CONCAT(#{query.approvalNo}, '%')) |
||||
</if> |
||||
<if test="query.approvalStatus != null"> |
||||
AND a.APPROVAL_STATUS = #{query.approvalStatus} |
||||
</if> |
||||
<if test="query.submitTimeStart != null"> |
||||
AND a.SUBMIT_TIME >= #{query.submitTimeStart} |
||||
</if> |
||||
<if test="query.submitTimeEnd != null"> |
||||
AND a.SUBMIT_TIME < #{query.submitTimeEnd} + 1 |
||||
</if> |
||||
<if test="query.proofreader1Id != null"> |
||||
AND a.PROOFREADER1_ID = #{query.proofreader1Id} |
||||
</if> |
||||
<if test="query.proofreader2Id != null"> |
||||
AND a.PROOFREADER2_ID = #{query.proofreader2Id} |
||||
</if> |
||||
</where> |
||||
ORDER BY a.SUBMIT_TIME DESC |
||||
</select> |
||||
|
||||
</mapper> |
||||
@ -0,0 +1,13 @@ |
||||
package org.springblade.desk.oem.service; |
||||
|
||||
import org.springblade.core.mp.base.BaseService; |
||||
import org.springblade.desk.oem.pojo.entity.OemSettlementApprovalDetailEntity; |
||||
|
||||
/** |
||||
* 外协结算审批明细表 服务类 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
public interface IOemSettlementApprovalDetailService extends BaseService<OemSettlementApprovalDetailEntity> { |
||||
} |
||||
@ -0,0 +1,55 @@ |
||||
package org.springblade.desk.oem.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.oem.pojo.entity.OemSettlementApprovalEntity; |
||||
import org.springblade.desk.oem.pojo.request.SettlementApprovalQuery; |
||||
import org.springblade.desk.oem.pojo.request.SettlementApprovalRequest; |
||||
import org.springblade.desk.oem.pojo.vo.OemSettlementApprovalDetailVO; |
||||
import org.springblade.desk.oem.pojo.vo.OemSettlementApprovalVO; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 外协结算审批主表 服务类 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
public interface IOemSettlementApprovalService extends BaseService<OemSettlementApprovalEntity> { |
||||
|
||||
/** |
||||
* 自定义分页查询 |
||||
* |
||||
* @param page 分页参数 |
||||
* @param query 查询条件 |
||||
* @return IPage<OemSettlementApprovalVO> |
||||
*/ |
||||
IPage<OemSettlementApprovalVO> selectApprovalPage(IPage<OemSettlementApprovalVO> page, SettlementApprovalQuery query); |
||||
|
||||
/** |
||||
* 根据ID查询审批详情 |
||||
* |
||||
* @param id 审批ID |
||||
* @return OemSettlementApprovalVO |
||||
*/ |
||||
OemSettlementApprovalVO getApprovalDetail(Long id); |
||||
|
||||
/** |
||||
* 查询审批明细列表 |
||||
* |
||||
* @param approvalId 审批ID |
||||
* @param groupByOc 是否按厂家分组:true-按厂家,false-按厂家+结算大类(默认) |
||||
* @return List<OemSettlementApprovalDetailVO> |
||||
*/ |
||||
List<OemSettlementApprovalDetailVO> getApprovalDetailList(Long approvalId, Boolean groupByOc); |
||||
|
||||
/** |
||||
* 提交审批(校对/审核) |
||||
* |
||||
* @param request 审批请求 |
||||
* @return R |
||||
*/ |
||||
R submitApproval(SettlementApprovalRequest request); |
||||
} |
||||
@ -0,0 +1,18 @@ |
||||
package org.springblade.desk.oem.service.impl; |
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
import org.springblade.core.mp.base.BaseServiceImpl; |
||||
import org.springblade.desk.oem.mapper.OemSettlementApprovalDetailMapper; |
||||
import org.springblade.desk.oem.pojo.entity.OemSettlementApprovalDetailEntity; |
||||
import org.springblade.desk.oem.service.IOemSettlementApprovalDetailService; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
/** |
||||
* 外协结算审批明细表 服务实现类 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
@Service |
||||
public class OemSettlementApprovalDetailServiceImpl extends BaseServiceImpl<OemSettlementApprovalDetailMapper, OemSettlementApprovalDetailEntity> implements IOemSettlementApprovalDetailService { |
||||
} |
||||
@ -0,0 +1,414 @@ |
||||
package org.springblade.desk.oem.service.impl; |
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
||||
import com.baomidou.mybatisplus.core.metadata.IPage; |
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
||||
import jakarta.annotation.Resource; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springblade.common.cache.CacheNames; |
||||
import org.springblade.core.mp.base.BaseServiceImpl; |
||||
import org.springblade.core.secure.utils.AuthUtil; |
||||
import org.springblade.core.tool.api.R; |
||||
import org.springblade.desk.common.feign.IMesNotifyMessageClient; |
||||
import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity; |
||||
import org.springblade.desk.oem.mapper.OemSettlementApprovalMapper; |
||||
import org.springblade.desk.oem.pojo.entity.OemSettlementApprovalDetailEntity; |
||||
import org.springblade.desk.oem.pojo.entity.OemSettlementApprovalEntity; |
||||
import org.springblade.desk.oem.pojo.entity.OemStatementEntity; |
||||
import org.springblade.desk.oem.pojo.request.SettlementApprovalQuery; |
||||
import org.springblade.desk.oem.pojo.request.SettlementApprovalRequest; |
||||
import org.springblade.desk.oem.pojo.vo.OemSettlementApprovalDetailVO; |
||||
import org.springblade.desk.oem.pojo.vo.OemSettlementApprovalVO; |
||||
import org.springblade.desk.oem.service.IOemSettlementApprovalDetailService; |
||||
import org.springblade.desk.oem.service.IOemSettlementApprovalService; |
||||
import org.springblade.desk.oem.service.IOemStatementService; |
||||
import org.springframework.beans.BeanUtils; |
||||
import org.springframework.context.annotation.Lazy; |
||||
import org.springframework.stereotype.Service; |
||||
import org.springframework.transaction.annotation.Transactional; |
||||
|
||||
import java.math.BigDecimal; |
||||
import java.util.*; |
||||
import java.util.stream.Collectors; |
||||
|
||||
/** |
||||
* 外协结算审批主表 服务实现类 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-12 |
||||
*/ |
||||
@Slf4j |
||||
@Service |
||||
public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlementApprovalMapper, OemSettlementApprovalEntity> implements IOemSettlementApprovalService { |
||||
|
||||
@Resource |
||||
private IOemSettlementApprovalDetailService oemSettlementApprovalDetailService; |
||||
|
||||
@Resource |
||||
private IOemStatementService oemStatementService; |
||||
|
||||
@Resource |
||||
private IMesNotifyMessageClient mesNotifyMessageClient; |
||||
|
||||
@Override |
||||
public IPage<OemSettlementApprovalVO> selectApprovalPage(IPage<OemSettlementApprovalVO> page, SettlementApprovalQuery query) { |
||||
return page.setRecords(baseMapper.selectApprovalPage(page, query)); |
||||
} |
||||
|
||||
@Override |
||||
public OemSettlementApprovalVO getApprovalDetail(Long id) { |
||||
OemSettlementApprovalEntity entity = this.getById(id); |
||||
if (entity == null) { |
||||
return null; |
||||
} |
||||
OemSettlementApprovalVO vo = new OemSettlementApprovalVO(); |
||||
BeanUtils.copyProperties(entity, vo); |
||||
|
||||
// 设置审批状态名称
|
||||
if (entity.getApprovalStatus() != null) { |
||||
vo.setApprovalStatusName(OemSettlementApprovalEntity.ApprovalStatusEnum.getNameByCode(entity.getApprovalStatus())); |
||||
} |
||||
|
||||
return vo; |
||||
} |
||||
|
||||
@Override |
||||
public List<OemSettlementApprovalDetailVO> getApprovalDetailList(Long approvalId, Boolean groupByOc) { |
||||
// 查询该审批的所有明细
|
||||
LambdaQueryWrapper<OemSettlementApprovalDetailEntity> queryWrapper = new LambdaQueryWrapper<>(); |
||||
queryWrapper.eq(OemSettlementApprovalDetailEntity::getApprovalId, approvalId); |
||||
queryWrapper.eq(OemSettlementApprovalDetailEntity::getIsDeleted, 0); |
||||
List<OemSettlementApprovalDetailEntity> detailList = oemSettlementApprovalDetailService.list(queryWrapper); |
||||
|
||||
if (detailList == null || detailList.isEmpty()) { |
||||
return new ArrayList<>(); |
||||
} |
||||
|
||||
// 默认按厂家+结算大类分组(groupByOc=false),如果groupByOc=true则按厂家分组
|
||||
if (Boolean.TRUE.equals(groupByOc)) { |
||||
// 按厂家分组
|
||||
return groupByOc(detailList); |
||||
} else { |
||||
// 按厂家+结算大类分组(原始数据)
|
||||
return convertToVOList(detailList); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 按厂家分组合并数据 |
||||
*/ |
||||
private List<OemSettlementApprovalDetailVO> groupByOc(List<OemSettlementApprovalDetailEntity> detailList) { |
||||
// 按厂家ID分组
|
||||
Map<Long, List<OemSettlementApprovalDetailEntity>> groupedMap = detailList.stream() |
||||
.collect(Collectors.groupingBy(OemSettlementApprovalDetailEntity::getOcId)); |
||||
|
||||
List<OemSettlementApprovalDetailVO> result = new ArrayList<>(); |
||||
|
||||
for (Map.Entry<Long, List<OemSettlementApprovalDetailEntity>> entry : groupedMap.entrySet()) { |
||||
List<OemSettlementApprovalDetailEntity> groupDetails = entry.getValue(); |
||||
if (groupDetails.isEmpty()) { |
||||
continue; |
||||
} |
||||
|
||||
OemSettlementApprovalDetailEntity first = groupDetails.get(0); |
||||
|
||||
// 合并统计数据
|
||||
int totalBatchCount = groupDetails.stream() |
||||
.mapToInt(d -> d.getBatchCount() != null ? d.getBatchCount() : 0) |
||||
.sum(); |
||||
|
||||
BigDecimal totalArea = groupDetails.stream() |
||||
.map(d -> d.getTotalArea() != null ? d.getTotalArea() : BigDecimal.ZERO) |
||||
.reduce(BigDecimal.ZERO, BigDecimal::add); |
||||
|
||||
BigDecimal totalAmount = groupDetails.stream() |
||||
.map(d -> d.getMonthAmount() != null ? d.getMonthAmount() : BigDecimal.ZERO) |
||||
.reduce(BigDecimal.ZERO, BigDecimal::add); |
||||
|
||||
|
||||
OemSettlementApprovalDetailVO vo = new OemSettlementApprovalDetailVO(); |
||||
vo.setOcId(first.getOcId()); |
||||
vo.setOcCode(first.getOcCode()); |
||||
vo.setOcName(first.getOcName()); |
||||
vo.setBatchCount(totalBatchCount); |
||||
vo.setTotalArea(totalArea); |
||||
vo.setMonthAmount(totalAmount); |
||||
|
||||
result.add(vo); |
||||
} |
||||
|
||||
return result; |
||||
} |
||||
|
||||
|
||||
private List<OemSettlementApprovalDetailVO> convertToVOList(List<OemSettlementApprovalDetailEntity> detailList) { |
||||
List<OemSettlementApprovalDetailVO> voList = new ArrayList<>(); |
||||
for (OemSettlementApprovalDetailEntity entity : detailList) { |
||||
OemSettlementApprovalDetailVO vo = new OemSettlementApprovalDetailVO(); |
||||
BeanUtils.copyProperties(entity, vo); |
||||
voList.add(vo); |
||||
} |
||||
return voList; |
||||
} |
||||
|
||||
@Override |
||||
@Transactional |
||||
public R submitApproval(SettlementApprovalRequest request) { |
||||
// 1. 参数校验
|
||||
if (request.getApprovalId() == null) { |
||||
throw new RuntimeException("审批ID不能为空"); |
||||
} |
||||
if (request.getApprovalType() == null || (request.getApprovalType() != 1 && request.getApprovalType() != 2)) { |
||||
throw new RuntimeException("审批类型错误,1-校对,2-审核"); |
||||
} |
||||
if (request.getApprovalResult() == null || (request.getApprovalResult() != 1 && request.getApprovalResult() != 2)) { |
||||
throw new RuntimeException("审批结果错误,1-通过,2-不通过"); |
||||
} |
||||
//if (request.getApprovalResult() == 2 && (request.getApprovalMemo() == null || request.getApprovalMemo().trim().isEmpty())) {
|
||||
// throw new RuntimeException("审批不通过时,必须填写审批意见");
|
||||
//}
|
||||
|
||||
// 2. 查询审批记录
|
||||
OemSettlementApprovalEntity approval = this.getById(request.getApprovalId()); |
||||
if (approval == null) { |
||||
throw new RuntimeException("审批记录不存在"); |
||||
} |
||||
|
||||
// 获取当前用户信息
|
||||
// TODO: 2026/5/14 是否校验用户角色
|
||||
Long currentUserId = AuthUtil.getUserId(); |
||||
String currentUserName = AuthUtil.getUserName(); |
||||
|
||||
// 4. 根据审批类型处理
|
||||
if (request.getApprovalType() == 1) { |
||||
// 校对流程
|
||||
return handleProofreading(approval, request, currentUserId, currentUserName); |
||||
} else { |
||||
// 审核流程
|
||||
return handleAudit(approval, request, currentUserId, currentUserName); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 处理校对流程 |
||||
*/ |
||||
private R handleProofreading(OemSettlementApprovalEntity approval, SettlementApprovalRequest request, |
||||
Long currentUserId, String currentUserName) { |
||||
Integer approvalStatus = approval.getApprovalStatus(); |
||||
|
||||
// 校验:只有【待审批】或【校对中】状态可以进行校对
|
||||
if (approvalStatus != 1 && approvalStatus != 2) { |
||||
throw new RuntimeException("当前审批状态不允许校对,当前状态:" + getApprovalStatusName(approvalStatus)); |
||||
} |
||||
|
||||
// 校验:一个校对员只可以校对一次
|
||||
if (currentUserId.equals(approval.getProofreader1Id()) || currentUserId.equals(approval.getProofreader2Id())) { |
||||
throw new RuntimeException("您已经校对过此审批,不能重复校对"); |
||||
} |
||||
|
||||
// 更新校对信息
|
||||
Date now = new Date(); |
||||
if (approval.getProofreader1Id() == null) { |
||||
// 第一次校对
|
||||
approval.setProofreader1Id(currentUserId); |
||||
approval.setProofreader1Name(currentUserName); |
||||
approval.setProofreadTime1(now); |
||||
|
||||
// 校对人1通过后更新为【校对中】
|
||||
if (request.getApprovalResult() == 1) { |
||||
approval.setApprovalStatus(OemSettlementApprovalEntity.ApprovalStatusEnum.PROOFREADING.getCode()); |
||||
} else { |
||||
// 校对不通过
|
||||
return handleApprovalReject(approval, request.getApprovalMemo()); |
||||
} |
||||
} else if (approval.getProofreader2Id() == null) { |
||||
// 第二次校对
|
||||
approval.setProofreader2Id(currentUserId); |
||||
approval.setProofreader2Name(currentUserName); |
||||
approval.setProofreadTime2(now); |
||||
|
||||
// 校对人2通过后更新为【待审核】
|
||||
if (request.getApprovalResult() == 1) { |
||||
// 5-待审核
|
||||
approval.setApprovalStatus(OemSettlementApprovalEntity.ApprovalStatusEnum.WAITING_AUDIT.getCode()); |
||||
// 送消息通知
|
||||
sendNotificationToAuditLeader(approval); |
||||
} else { |
||||
// 校对不通过
|
||||
return handleApprovalReject(approval, request.getApprovalMemo()); |
||||
} |
||||
} else { |
||||
return R.fail("已完成两次校对,无法再次校对"); |
||||
} |
||||
|
||||
// 保存审批记录
|
||||
this.updateById(approval); |
||||
|
||||
return R.success(); |
||||
} |
||||
|
||||
/** |
||||
* 处理审核流程 |
||||
*/ |
||||
private R handleAudit(OemSettlementApprovalEntity approval, SettlementApprovalRequest request, |
||||
Long currentUserId, String currentUserName) { |
||||
Integer approvalStatus = approval.getApprovalStatus(); |
||||
|
||||
// 校验:只有【待审核】状态可以进行审核
|
||||
if (!Objects.equals(approvalStatus, OemSettlementApprovalEntity.ApprovalStatusEnum.WAITING_AUDIT.getCode())) { |
||||
throw new RuntimeException("当前审批状态不允许审核,当前状态:" + getApprovalStatusName(approvalStatus)); |
||||
} |
||||
|
||||
// 校验:是否已完成两次校对
|
||||
if (approval.getProofreader1Id() == null || approval.getProofreader2Id() == null) { |
||||
throw new RuntimeException("尚未完成两次校对,无法进行审核"); |
||||
} |
||||
|
||||
Date now = new Date(); |
||||
|
||||
if (request.getApprovalResult() == 1) { |
||||
// 审核通过
|
||||
approval.setApprovalStatus(3); // 3-审批通过
|
||||
approval.setApprovalUserId(currentUserId); |
||||
approval.setApprovalUserName(currentUserName); |
||||
approval.setApprovalTime(now); |
||||
approval.setApprovalMemo(request.getApprovalMemo()); |
||||
|
||||
// 更新审批记录
|
||||
this.updateById(approval); |
||||
|
||||
// 更新所有关联结算单的状态为【待推送】
|
||||
updateStatementsStatus(approval.getId(), OemStatementEntity.PENDING_PUSH_SETTLEMENT, null); |
||||
|
||||
return R.success(); |
||||
} else { |
||||
// 审核不通过
|
||||
return handleApprovalReject(approval, request.getApprovalMemo()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 处理审批不通过 |
||||
*/ |
||||
private R handleApprovalReject(OemSettlementApprovalEntity approval, String memo) { |
||||
Date now = new Date(); |
||||
|
||||
// 更新审批状态为【不通过】
|
||||
approval.setApprovalStatus(OemSettlementApprovalEntity.ApprovalStatusEnum.REJECTED.getCode()); |
||||
approval.setApprovalTime(now); |
||||
approval.setApprovalMemo(memo); |
||||
this.updateById(approval); |
||||
|
||||
// 更新所有关联结算单的状态为【结算异常】
|
||||
updateStatementsStatus(approval.getId(), OemStatementEntity.ERR_SETTLEMENT, "MES结算审核不通过"); |
||||
|
||||
return R.success("审批已拒绝"); |
||||
} |
||||
|
||||
/** |
||||
* 更新结算单状态 |
||||
* |
||||
* @param approvalId 审批ID |
||||
* @param newStatus 新状态 |
||||
* @param abnormalReason 异常原因(可选) |
||||
*/ |
||||
private void updateStatementsStatus(Long approvalId, Integer newStatus, String abnormalReason) { |
||||
LambdaQueryWrapper<OemStatementEntity> queryWrapper = new LambdaQueryWrapper<>(); |
||||
queryWrapper.eq(OemStatementEntity::getApprovalId, approvalId); |
||||
List<OemStatementEntity> statements = oemStatementService.list(queryWrapper); |
||||
|
||||
if (statements == null || statements.isEmpty()) { |
||||
throw new RuntimeException("未找到审批ID=" + approvalId + "关联的结算单"); |
||||
} |
||||
|
||||
List<OemStatementEntity> updateList = new ArrayList<>(); |
||||
for (OemStatementEntity statement : statements) { |
||||
OemStatementEntity entity = new OemStatementEntity(); |
||||
entity.setId(statement.getId()); |
||||
entity.setRosStatus(newStatus); |
||||
if (abnormalReason != null) { |
||||
entity.setMemo(abnormalReason); |
||||
} |
||||
entity.setUpdateTime(new Date()); |
||||
entity.setApprovalTime(new Date()); |
||||
updateList.add(entity); |
||||
} |
||||
|
||||
oemStatementService.updateBatchById(updateList); |
||||
} |
||||
|
||||
/** |
||||
* 发送通知给外协结算审核领导 |
||||
*/ |
||||
private void sendNotificationToAuditLeader(OemSettlementApprovalEntity approval) { |
||||
try { |
||||
Long auditLeaderRoleId = 2054852195869057026L; |
||||
String roleName = "外协结算审核领导"; |
||||
|
||||
// 构建通知消息
|
||||
String title = String.format("外协结算审批提醒 - %s", |
||||
approval.getApprovalNo()); |
||||
|
||||
String content = String.format( |
||||
"外协结算审批详情:\n" + |
||||
"- 审批单号:%s\n" + |
||||
"- 结算总批数:%d\n" + |
||||
"- 结算总面积:%.2f dm²\n" + |
||||
"- 结算总金额:%.2f 元\n" + |
||||
"- 提交时间:%s\n" + |
||||
"- 状态:已完成两次校对,等待审核", |
||||
approval.getApprovalNo(), |
||||
approval.getTotalCount() != null ? approval.getTotalCount() : 0, |
||||
approval.getTotalArea() != null ? approval.getTotalArea() : BigDecimal.ZERO, |
||||
approval.getTotalAmount() != null ? approval.getTotalAmount() : BigDecimal.ZERO, |
||||
approval.getSubmitTime() |
||||
); |
||||
|
||||
// 创建通知消息实体
|
||||
MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder() |
||||
.title(title) |
||||
.content(content) |
||||
.receiveRoleId(auditLeaderRoleId) |
||||
.receiveRoleName(roleName) |
||||
.receiveUserId(AuthUtil.getUserId()) |
||||
.build(); |
||||
// 通知失败不影响主流程
|
||||
// 调用Feign客户端保存通知消息
|
||||
R result = mesNotifyMessageClient.save(notifyMessage); |
||||
|
||||
if (result != null && result.isSuccess()) { |
||||
log.info("成功发送外协结算审批提醒,审批单号: {}, 校对人: {}", |
||||
approval.getApprovalNo(), AuthUtil.getUserName()); |
||||
} else { |
||||
log.error("发送外协结算审批提醒失败,审批单号: {}, 错误信息: {}", |
||||
approval.getApprovalNo(), result != null ? result.getMsg() : "返回结果为空"); |
||||
} |
||||
|
||||
} catch (Exception e) { |
||||
log.error("发送外协结算审批提醒时发生异常,审批单号: {}", approval.getApprovalNo(), e); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获取审批状态名称 |
||||
*/ |
||||
private String getApprovalStatusName(Integer status) { |
||||
if (status == null) { |
||||
return "未知"; |
||||
} |
||||
switch (status) { |
||||
case 1: |
||||
return "待审批"; |
||||
case 2: |
||||
return "校对中"; |
||||
case 3: |
||||
return "审批通过"; |
||||
case 4: |
||||
return "审批不通过"; |
||||
case 5: |
||||
return "待审核"; |
||||
default: |
||||
return "未知"; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,29 @@ |
||||
package org.springblade.erpdata.feign; |
||||
|
||||
import io.swagger.v3.oas.annotations.Hidden; |
||||
import lombok.AllArgsConstructor; |
||||
import org.springblade.core.tenant.annotation.NonDS; |
||||
import org.springblade.core.tool.api.R; |
||||
import org.springblade.erpdata.pojo.dto.OemProcessSettlementDTO; |
||||
import org.springblade.erpdata.service.IErpOemSettlementService; |
||||
import org.springframework.web.bind.annotation.RestController; |
||||
|
||||
/** |
||||
* ERP外协结算 Feign实现类 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-13 |
||||
*/ |
||||
@NonDS |
||||
@Hidden |
||||
@RestController |
||||
@AllArgsConstructor |
||||
public class ErpOemSettlementClientImpl implements IErpOemSettlementClient { |
||||
|
||||
private final IErpOemSettlementService erpOemSettlementService; |
||||
|
||||
@Override |
||||
public R pushSingleToErp(OemProcessSettlementDTO dto) { |
||||
return erpOemSettlementService.pushSingleToErp(dto); |
||||
} |
||||
} |
||||
@ -0,0 +1,21 @@ |
||||
package org.springblade.erpdata.service; |
||||
|
||||
import org.springblade.core.tool.api.R; |
||||
import org.springblade.erpdata.pojo.dto.OemProcessSettlementDTO; |
||||
|
||||
/** |
||||
* ERP外协结算数据服务接口 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-13 |
||||
*/ |
||||
public interface IErpOemSettlementService { |
||||
|
||||
/** |
||||
* 推送单条外协结算数据到ERP |
||||
* |
||||
* @param dto 结算数据 |
||||
* @return 结果 |
||||
*/ |
||||
R pushSingleToErp(OemProcessSettlementDTO dto); |
||||
} |
||||
@ -0,0 +1,126 @@ |
||||
package org.springblade.erpdata.service.impl; |
||||
|
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springblade.core.tenant.annotation.NonDS; |
||||
import org.springblade.core.tool.api.R; |
||||
import org.springblade.erpdata.pojo.dto.OemProcessSettlementDTO; |
||||
import org.springblade.erpdata.service.IErpOemSettlementService; |
||||
import org.springframework.jdbc.core.SqlOutParameter; |
||||
import org.springframework.jdbc.core.SqlParameter; |
||||
import org.springframework.jdbc.core.simple.SimpleJdbcCall; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
import jakarta.annotation.Resource; |
||||
import java.sql.Types; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* ERP外协结算数据服务实现类 |
||||
* |
||||
* @author qyl |
||||
* @since 2026-05-13 |
||||
*/ |
||||
@NonDS |
||||
@Slf4j |
||||
@Service |
||||
@RequiredArgsConstructor |
||||
public class ErpOemSettlementServiceImpl implements IErpOemSettlementService { |
||||
|
||||
@Resource |
||||
private final org.springframework.jdbc.core.JdbcTemplate jdbcTemplate; |
||||
|
||||
@Override |
||||
public R pushSingleToErp(OemProcessSettlementDTO dto) { |
||||
try { |
||||
log.info("开始推送外协结算数据到ERP,ID: {}, 车间订单号: {}", dto.getId(), dto.getSono()); |
||||
|
||||
// 1. 配置 SimpleJdbcCall
|
||||
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate) |
||||
// 指定存储过程名称
|
||||
.withProcedureName("pro_rbwxgxclesrbill") |
||||
// 【关键】关闭元数据自动获取
|
||||
.withoutProcedureColumnMetaDataAccess() |
||||
// 2. 显式声明所有参数 (顺序建议与存储过程定义一致)
|
||||
.declareParameters( |
||||
// --- 输入参数 (IN) ---
|
||||
new SqlParameter("v_id", Types.VARCHAR), |
||||
new SqlParameter("v_sono", Types.VARCHAR), |
||||
new SqlParameter("v_prtno", Types.VARCHAR), |
||||
new SqlParameter("v_splcode", Types.VARCHAR), |
||||
new SqlParameter("v_prtlotno", Types.VARCHAR), |
||||
new SqlParameter("v_plndept", Types.VARCHAR), |
||||
new SqlParameter("v_usedept", Types.VARCHAR), |
||||
new SqlParameter("v_soenddat", Types.DATE), |
||||
new SqlParameter("v_splycode", Types.VARCHAR), |
||||
new SqlParameter("v_splyname", Types.VARCHAR), |
||||
new SqlParameter("v_sorecqty", Types.NUMERIC), |
||||
new SqlParameter("v_price", Types.NUMERIC), |
||||
new SqlParameter("v_unitarea", Types.NUMERIC), |
||||
new SqlParameter("v_sumarea", Types.NUMERIC), |
||||
new SqlParameter("v_clearfund", Types.NUMERIC), |
||||
new SqlParameter("v_seqdesc", Types.VARCHAR), |
||||
new SqlParameter("v_priceno", Types.VARCHAR), |
||||
new SqlParameter("v_sbnumber", Types.VARCHAR), |
||||
new SqlParameter("v_sdnumber", Types.VARCHAR), |
||||
new SqlParameter("v_jtnumber", Types.VARCHAR), |
||||
new SqlParameter("v_prtum", Types.VARCHAR), |
||||
new SqlParameter("v_planno", Types.VARCHAR), |
||||
new SqlParameter("v_kdofplatdesc", Types.VARCHAR), |
||||
new SqlParameter("v_kdofplatheight", Types.VARCHAR), |
||||
new SqlParameter("v_prtdesc", Types.VARCHAR), |
||||
// --- 输出参数 (OUT) ---
|
||||
new SqlOutParameter("v_excnote", Types.VARCHAR), |
||||
new SqlOutParameter("v_excflag", Types.VARCHAR) |
||||
); |
||||
|
||||
// 3. 封装输入参数 Map
|
||||
Map<String, Object> inParams = new HashMap<>(); |
||||
inParams.put("v_id", dto.getId()); |
||||
inParams.put("v_sono", dto.getSono()); |
||||
inParams.put("v_prtno", dto.getPrtno()); |
||||
inParams.put("v_splcode", dto.getSplcode()); |
||||
inParams.put("v_prtlotno", dto.getPrtlotno()); |
||||
inParams.put("v_plndept", dto.getPlndept()); |
||||
inParams.put("v_usedept", dto.getUsedept()); |
||||
inParams.put("v_soenddat", dto.getSoenddat()); |
||||
inParams.put("v_splycode", dto.getSplycode()); |
||||
inParams.put("v_splyname", dto.getSplyname()); |
||||
inParams.put("v_sorecqty", dto.getSorecqty()); |
||||
inParams.put("v_price", dto.getPrice()); |
||||
inParams.put("v_unitarea", dto.getUnitarea()); |
||||
inParams.put("v_sumarea", dto.getSumarea()); |
||||
inParams.put("v_clearfund", dto.getClearfund()); |
||||
inParams.put("v_seqdesc", dto.getSeqdesc()); |
||||
inParams.put("v_priceno", dto.getPriceno()); |
||||
inParams.put("v_sbnumber", dto.getSbnumber()); |
||||
inParams.put("v_sdnumber", dto.getSdnumber()); |
||||
inParams.put("v_jtnumber", dto.getJtnumber()); |
||||
inParams.put("v_prtum", dto.getPrtum()); |
||||
inParams.put("v_planno", dto.getPlanno()); |
||||
inParams.put("v_kdofplatdesc", dto.getKdofplatdesc()); |
||||
inParams.put("v_kdofplatheight", dto.getKdofplatheight()); |
||||
inParams.put("v_prtdesc", dto.getPrtdesc()); |
||||
|
||||
// 4. 执行存储过程
|
||||
Map<String, Object> resultMap = jdbcCall.execute(inParams); |
||||
|
||||
// 5. 获取输出参数 (安全处理:避免 null.toString() 导致空指针异常 NPE)
|
||||
String excflag = (String) resultMap.get("v_excflag"); |
||||
String excnote = (String) resultMap.get("v_excnote"); |
||||
|
||||
if ("1".equals(excflag)) { |
||||
log.info("推送外协结算数据到ERP成功,ID: {}, 结果: {}", dto.getId(), excnote); |
||||
return R.success("推送成功:" + excnote); |
||||
} else { |
||||
log.error("推送外协结算数据到ERP失败,ID: {}, 错误: {}", dto.getId(), excnote); |
||||
return R.fail("推送失败:" + excnote); |
||||
} |
||||
|
||||
} catch (Exception e) { |
||||
log.error("推送外协结算数据到ERP异常,ID: {}", dto.getId(), e); |
||||
return R.fail("推送异常:" + e.getMessage()); |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue