From a422cb5b73799050827251f835ebc53d5757a96b Mon Sep 17 00:00:00 2001
From: 1 <1@123>
Date: 星期六, 24 一月 2026 09:06:21 +0800
Subject: [PATCH] lsh#
---
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/params/SyncOrderParams.java | 287 +++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 218 insertions(+), 69 deletions(-)
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/params/SyncOrderParams.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/params/SyncOrderParams.java
index 168e934..22f2bb7 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/params/SyncOrderParams.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/params/SyncOrderParams.java
@@ -1,14 +1,16 @@
package com.vincent.rsf.server.api.controller.erp.params;
import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.vincent.rsf.framework.common.Cools;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
+import javax.validation.Valid;
+import javax.validation.constraints.*;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@@ -20,127 +22,274 @@
private static final long serialVersionUID = 1L;
- /*
- * 涓氬姟绫诲瀷锛屽緟ERP琛ュ厖锛屼互涓嬩负绀轰緥锛�
- * 鍏ュ簱锛氭敹鏂欓�氱煡鍗曪紙PUR_ReceiveBill锛夈��
- * 閲囪喘鍏ュ簱鍗曪紙STK_InStock锛夈��
- * 閫�鏂欑敵璇峰崟锛圥UR_MRAPP锛夈��
- * 閲囪喘閫�鏂欏崟锛圥UR_MRB锛夈��
- * 閫�璐ч�氱煡鍗曪紙SAL_RETURNNOTICE锛夈��
- * 閿�鍞��璐у崟锛圫AL_RETURNSTOCK锛夈��
- * 鐢熶骇閫�鏂欏崟锛圥RD_ReturnMtrl锛夈��
- * 鐢熶骇鍏ュ簱鍗曪紙PRD_INSTOCK锛�/
- * 鐢熶骇姹囨姤鍗曪紙PRD_MORPT锛夈��
- * 鍏朵粬鍏ュ簱鍗曪紙STK_MISCELLANEOUS锛�
- * 鍑哄簱锛氬彂璐ч�氱煡鍗曪紙SAL_DELIVERYNOTICE锛夈��
- * 閿�鍞嚭搴撳崟锛圫AL_OUTSTOCK锛夈��
- * 鍑哄簱鐢宠鍗曪紙STK_OutStockApply锛夈��
- * 鐢熶骇棰嗘枡鍗曪紙PRD_PickMtrl锛夈��
- * 鐢熶骇琛ユ枡鍗曪紙PRD_FeedMtrl锛夈��
- * 鍏朵粬鍑哄簱鍗曪紙STK_MisDelivery锛夎皟鎷細
- * 璋冩嫧鐢宠鍗曪紙STK_TRANSFERAPPLY锛夈��
- * 鐩存帴璋冩嫧鍗曪紙STK_TransferDirect锛�
- * */
+ /**
+ * 涓氬姟绫诲瀷鏋氫妇
+ */
+ public interface BusinessType {
+ // 鍏ュ簱鍗曟嵁
+ String PUR_RECEIVE_BILL = "PUR_ReceiveBill"; // 鏀舵枡閫氱煡鍗�
+ String STK_IN_STOCK = "STK_InStock"; // 閲囪喘鍏ュ簱鍗�
+ String PUR_MRAPP = "PUR_MRAPP"; // 閫�鏂欑敵璇峰崟
+ String PUR_MRB = "PUR_MRB"; // 閲囪喘閫�鏂欏崟
+ String SAL_RETURNNOTICE = "SAL_RETURNNOTICE"; // 閫�璐ч�氱煡鍗�
+ String SAL_RETURNSTOCK = "SAL_RETURNSTOCK"; // 閿�鍞��璐у崟
+ String PRD_RETURN_MTRL = "PRD_ReturnMtrl"; // 鐢熶骇閫�鏂欏崟 //鎺ラ┏
+ String PRD_INSTOCK = "PRD_INSTOCK"; // 鐢熶骇鍏ュ簱鍗� //鎺ラ┏
+ String PRD_MORPT = "PRD_MORPT"; // 鐢熶骇姹囨姤鍗�
+ String STK_MISCELLANEOUS = "STK_MISCELLANEOUS"; // 鍏朵粬鍏ュ簱鍗�
+ // 鍑哄簱鍗曟嵁
+ String SAL_DELIVERYNOTICE = "SAL_DELIVERYNOTICE"; // 鍙戣揣閫氱煡鍗�
+ String SAL_OUTSTOCK = "SAL_OUTSTOCK"; // 閿�鍞嚭搴撳崟
+ String STK_OUTSTOCK_APPLY = "STK_OutStockApply"; // 鍑哄簱鐢宠鍗�
+ String PRD_PICK_MTRL = "PRD_PickMtrl"; // 鐢熶骇棰嗘枡鍗� //鎺ラ┏
+ String PRD_FEED_MTRL = "PRD_FeedMtrl"; // 鐢熶骇琛ユ枡鍗� //鎺ラ┏
+ String STK_MIS_DELIVERY = "STK_MisDelivery"; // 鍏朵粬鍑哄簱鍗�
+ // 璋冩嫧鍗曟嵁
+ String STK_TRANSFER_APPLY = "STK_TRANSFERAPPLY"; // 璋冩嫧鐢宠鍗�
+ String STK_TRANSFER_DIRECT = "STK_TransferDirect"; // 鐩存帴璋冩嫧鍗�
+ }
- @NotNull(message = "涓氬姟绫诲瀷涓嶈兘涓簄ull")
- @NotEmpty(message = "涓氬姟绫诲瀷涓嶈兘涓虹┖")
- @ApiModelProperty("涓氬姟绫诲瀷")
+ /**
+ * 鍗曟嵁绫诲瀷鏋氫妇
+ */
+ public interface OrderType {
+ String OUT_STOCK = "1"; // 鍑哄簱鍗�
+ String IN_STOCK = "2"; // 鍏ュ簱鍗�
+ String TRANSFER = "3"; // 璋冩嫧鍗�
+ }
+
+ @NotBlank(message = "涓氬姟绫诲瀷涓嶈兘涓虹┖")
+ @Pattern(regexp = "^(PUR_ReceiveBill|STK_InStock|PUR_MRAPP|PUR_MRB|SAL_RETURNNOTICE|SAL_RETURNSTOCK|"
+ + "PRD_ReturnMtrl|PRD_INSTOCK|PRD_MORPT|STK_MISCELLANEOUS|SAL_DELIVERYNOTICE|SAL_OUTSTOCK|"
+ + "STK_OutStockApply|PRD_PickMtrl|PRD_FeedMtrl|STK_MisDelivery|STK_TRANSFERAPPLY|STK_TransferDirect)$",
+ message = "涓氬姟绫诲瀷鏍煎紡涓嶆纭�")
+ @ApiModelProperty(value = "涓氬姟绫诲瀷", required = true, example = "STK_InStock")
private String wkType;
-
- /*
- * 璁㈠崟绫诲瀷锛�1 鍑哄簱鍗曪紱2 鍏ュ簱鍗曪紱3 璋冩嫧鍗曪紱
- * */
-
- @NotNull(message = "鍗曟嵁绫诲瀷涓嶈兘涓簄ull")
- @NotEmpty(message = "鍗曟嵁绫诲瀷涓嶈兘涓虹┖")
- @ApiModelProperty("鍗曟嵁绫诲瀷")
+ @NotBlank(message = "鍗曟嵁绫诲瀷涓嶈兘涓虹┖")
+ @Pattern(regexp = "^[123]$", message = "鍗曟嵁绫诲瀷鍙兘鏄�1(鍑哄簱鍗�)銆�2(鍏ュ簱鍗�)鎴�3(璋冩嫧鍗�)")
+ @ApiModelProperty(value = "鍗曟嵁绫诲瀷: 1-鍑哄簱鍗�, 2-鍏ュ簱鍗�, 3-璋冩嫧鍗�", required = true, example = "2")
private String type;
- @NotNull(message = "鍗曞彿涓嶈兘涓簄ull")
- @NotEmpty(message = "鍗曞彿涓嶈兘涓虹┖")
- @ApiModelProperty("鍗曞彿")
+ @NotBlank(message = "鍗曞彿涓嶈兘涓虹┖")
+ @Size(max = 50, message = "鍗曞彿闀垮害涓嶈兘瓒呰繃50涓瓧绗�")
+ @ApiModelProperty(value = "鍗曞彿", required = true, example = "PO202401010001")
private String orderNo;
- @NotNull(message = "鍗曟嵁鍐呯爜涓嶈兘涓簄ull")
- @NotEmpty(message = "鍗曟嵁鍐呯爜涓嶈兘涓虹┖")
- @ApiModelProperty("鍗曟嵁鍐呯爜锛屽敮涓�鏍囪瘑")
+ @NotNull(message = "鍗曟嵁鍐呯爜涓嶈兘涓虹┖")
+ @Positive(message = "鍗曟嵁鍐呯爜蹇呴』鏄鏁存暟")
+ @ApiModelProperty(value = "鍗曟嵁鍐呯爜锛屽敮涓�鏍囪瘑", required = true, example = "100001")
private Long orderInternalCode;
- @NotNull(message = "璁㈠崟ID涓嶈兘涓簄ull")
- @NotEmpty(message = "璁㈠崟ID涓嶈兘涓虹┖")
- @ApiModelProperty("璁㈠崟ID")
+// @NotNull(message = "璁㈠崟ID涓嶈兘涓虹┖")
+// @Positive(message = "璁㈠崟ID蹇呴』鏄鏁存暟")
+// @ApiModelProperty(value = "璁㈠崟ID", required = true, example = "200001")
private Long orderId;
- @NotNull(message = "鏁伴噺涓嶈兘涓簄ull")
- @NotEmpty(message = "鏁伴噺涓嶈兘涓虹┖")
- @ApiModelProperty("鏁伴噺")
+// @NotNull(message = "鏁伴噺涓嶈兘涓虹┖")
+// @DecimalMin(value = "0.0", inclusive = false, message = "鏁伴噺蹇呴』澶т簬0")
+// @ApiModelProperty(value = "鏁伴噺", required = true, example = "100.5")
private Double anfme;
- @ApiModelProperty("瀹㈡埛缂栫爜")
+ @ApiModelProperty(value = "瀹㈡埛缂栫爜", example = "CUST001")
private String customerId;
- @ApiModelProperty("瀹㈡埛鍚嶇О")
+ @ApiModelProperty(value = "瀹㈡埛鍚嶇О", example = "XX绉戞妧鏈夐檺鍏徃")
private String customerName;
- @ApiModelProperty("渚涘簲鍟嗙紪鐮�")
+ @ApiModelProperty(value = "渚涘簲鍟嗙紪鐮�", example = "SUP001")
private String supplierId;
- @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+ @ApiModelProperty(value = "渚涘簲鍟嗗悕绉�", example = "XX渚涘簲鍟�")
private String supplierName;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty(value = "鍒拌揪鏃堕棿", example = "2024-01-01 10:00:00")
private Date arrTime;
- @ApiModelProperty("鍒涘缓鏃ユ湡锛屾椂闂存埑锛岀簿纭埌绉�")
+ @NotNull(message = "鍒涘缓鏃ユ湡涓嶈兘涓虹┖")
+ @Positive(message = "鍒涘缓鏃ユ湡蹇呴』鏄鏁存暟")
+ @ApiModelProperty(value = "鍒涘缓鏃ユ湡锛屾椂闂存埑锛岀簿纭埌绉�", required = true, example = "1704067200")
private Long createTime;
- @ApiModelProperty("涓氬姟鏃ユ湡锛屽璐︿娇鐢紝鏃堕棿鎴筹紝绮剧‘鍒扮")
+ @NotNull(message = "涓氬姟鏃ユ湡涓嶈兘涓虹┖")
+ @Positive(message = "涓氬姟鏃ユ湡蹇呴』鏄鏁存暟")
+ @ApiModelProperty(value = "涓氬姟鏃ユ湡锛屽璐︿娇鐢紝鏃堕棿鎴筹紝绮剧‘鍒扮", required = true, example = "1704067200")
private Long businessTime;
- @ApiModelProperty("鍗曟嵁鏄庣粏淇℃伅")
+ @Valid
+ @NotNull(message = "鍗曟嵁鏄庣粏淇℃伅涓嶈兘涓虹┖")
+ @Size(min = 1, message = "鑷冲皯闇�瑕佷竴涓槑缁嗛」")
+ @ApiModelProperty(value = "鍗曟嵁鏄庣粏淇℃伅", required = true)
private List<SyncOrdersItem> orderItems;
- @ApiModelProperty("鏀舵枡/鍙戣揣缁勭粐")
+ @ApiModelProperty(value = "鏀舵枡/鍙戣揣缁勭粐", example = "ORG001")
private String stockOrgId;
- @ApiModelProperty("鏀舵枡/鍙戣揣缁勭粐鍚嶇О")
+ @ApiModelProperty(value = "鏀舵枡/鍙戣揣缁勭粐鍚嶇О", example = "鍙戣揣閮�")
private String stockOrgName;
- @ApiModelProperty("閲囪喘缁勭粐")
+ @ApiModelProperty(value = "閲囪喘缁勭粐", example = "PUR001")
private String purchaseOrgId;
- @ApiModelProperty("閲囪喘缁勭粐鍚嶇О")
+ @ApiModelProperty(value = "閲囪喘缁勭粐鍚嶇О", example = "閲囪喘閮�")
private String purchaseOrgName;
- @ApiModelProperty("閲囪喘鍛�")
+ @ApiModelProperty(value = "閲囪喘鍛�", example = "USER001")
private String purchaseUserId;
- @ApiModelProperty("閲囪喘鍛樺悕绉�")
+ @ApiModelProperty(value = "閲囪喘鍛樺悕绉�", example = "寮犱笁")
private String purchaseUserName;
- @ApiModelProperty("鐢熶骇缁勭粐")
+ @ApiModelProperty(value = "鐢熶骇缁勭粐", example = "PRD001")
private String prdOrgId;
- @ApiModelProperty("鐢熶骇缁勭粐鍚嶇О")
+ @ApiModelProperty(value = "鐢熶骇缁勭粐鍚嶇О", example = "鐢熶骇閮�")
private String prdOrgName;
- @ApiModelProperty("閿�鍞粍缁�")
+ @ApiModelProperty(value = "閿�鍞粍缁�", example = "SALE001")
private String saleOrgId;
- @ApiModelProperty("閿�鍞粍缁囧悕绉�")
+ @ApiModelProperty(value = "閿�鍞粍缁囧悕绉�", example = "閿�鍞儴")
private String saleOrgName;
- @ApiModelProperty("閿�鍞憳")
+ @ApiModelProperty(value = "閿�鍞憳", example = "USER002")
private String saleUserId;
- @ApiModelProperty("閿�鍞憳鍚嶇О")
+ @ApiModelProperty(value = "閿�鍞憳鍚嶇О", example = "鏉庡洓")
private String saleUserName;
- @ApiModelProperty("搴撳瓨鏂瑰悜")
+ @ApiModelProperty(value = "搴撳瓨鏂瑰悜", example = "IN")
private String stockDirect;
- @ApiModelProperty("鍑哄叆搴撴帴椹崇珯鐐癸紝鍑哄簱鏃跺皢鐗╂枡鍑哄簱鍚庤繍杈撹嚦璇ョ珯鐐癸紝鍏ュ簱鏃朵粠璇ョ珯鐐瑰皢鐗╂枡杩愬洖搴撲腑")
+ @ApiModelProperty(value = "鍑哄叆搴撴帴椹崇珯鐐癸紝鍑哄簱鏃跺皢鐗╂枡鍑哄簱鍚庤繍杈撹嚦璇ョ珯鐐癸紝鍏ュ簱鏃朵粠璇ョ珯鐐瑰皢鐗╂枡杩愬洖搴撲腑", example = "STATION001")
private String stationId;
-}
+
+ /**
+ * 鑾峰彇瀹為檯鍒拌揪鏃堕棿
+ * 浼樺厛浣跨敤 arrTime锛屽鏋滀负绌哄垯浠� createTime 杞崲
+ */
+ @JsonIgnore
+ public Date getActualArrTime() {
+ if (this.arrTime != null) {
+ return this.arrTime;
+ }
+ if (this.createTime != null) {
+ return new Date(this.createTime * 1000L);
+ }
+ return null;
+ }
+
+ /**
+ * 鑾峰彇瀹為檯涓氬姟鏃堕棿
+ */
+ @JsonIgnore
+ public Date getActualBusinessTime() {
+ if (this.businessTime != null) {
+ return new Date(this.businessTime * 1000L);
+ }
+ return null;
+ }
+
+ /**
+ * 鑾峰彇瀹為檯鍒涘缓鏃堕棿
+ */
+ @JsonIgnore
+ public Date getActualCreateTime() {
+ if (this.createTime != null) {
+ return new Date(this.createTime * 1000L);
+ }
+ return null;
+ }
+
+ /**
+ * 鏄惁鍏ュ簱鍗�
+ */
+ @JsonIgnore
+ public boolean isInStockOrder() {
+ return OrderType.IN_STOCK.equals(this.type);
+ }
+
+ /**
+ * 鏄惁鍑哄簱鍗�
+ */
+ @JsonIgnore
+ public boolean isOutStockOrder() {
+ return OrderType.OUT_STOCK.equals(this.type);
+ }
+
+ /**
+ * 鏄惁璋冩嫧鍗�
+ */
+ @JsonIgnore
+ public boolean isTransferOrder() {
+ return OrderType.TRANSFER.equals(this.type);
+ }
+
+ /**
+ * 涓氬姟楠岃瘉
+ */
+ public void validateBusiness() {
+// if (isOutStockOrder() && Cools.isEmpty(customerId)) {
+// throw new IllegalArgumentException("鍑哄簱鍗曞繀椤绘寚瀹氬鎴�");
+// }
+//
+// if (isInStockOrder() && Cools.isEmpty(supplierId)) {
+// throw new IllegalArgumentException("鍏ュ簱鍗曞繀椤绘寚瀹氫緵搴斿晢");
+// }
+
+// if (Cools.isEmpty(stationId) && !isTransferOrder()) {
+// throw new IllegalArgumentException("蹇呴』鎸囧畾鎺ラ┏绔欑偣");
+// }
+
+ // 楠岃瘉鏄庣粏鎬绘暟涓庝富鍗曟暟閲忔槸鍚︿竴鑷�
+// if (orderItems != null && anfme != null) {
+// double itemsTotal = orderItems.stream()
+// .mapToDouble(item -> item.getAnfme() != null ? item.getAnfme() : 0.0)
+// .sum();
+//
+// if (Math.abs(itemsTotal - anfme) > 0.001) {
+// throw new IllegalArgumentException(String.format(
+// "涓诲崟鏁伴噺(%.3f)涓庢槑缁嗘�绘暟(%.3f)涓嶄竴鑷�", anfme, itemsTotal));
+// }
+// }
+ }
+
+ /**
+ * 璁$畻鏄庣粏鎬绘暟閲�
+ */
+ @JsonIgnore
+ public Double calculateItemsTotal() {
+ if (orderItems == null || orderItems.isEmpty()) {
+ return 0.0;
+ }
+
+ return orderItems.stream()
+ .mapToDouble(item -> item.getAnfme() != null ? item.getAnfme() : 0.0)
+ .sum();
+ }
+
+ /**
+ * 鑾峰彇鍗曟嵁鎽樿
+ */
+ @JsonIgnore
+ public String getSummary() {
+ return String.format("鍗曟嵁[%s] 绫诲瀷[%s] 涓氬姟绫诲瀷[%s] 鍗曟嵁鍐呯爜[%s]",
+ orderNo, type, wkType, orderInternalCode);
+ }
+
+ /**
+ * 鏄惁鏈夋晥鍗曟嵁
+ */
+ @JsonIgnore
+ public boolean isValid() {
+ return !Cools.isEmpty(orderNo) &&
+ orderInternalCode != null && !Cools.isEmpty(orderInternalCode) &&
+ type != null && !Cools.isEmpty(type) &&
+ wkType != null && !Cools.isEmpty(wkType) &&
+ createTime != null && !Cools.isEmpty(createTime) &&
+ businessTime != null && !Cools.isEmpty(businessTime) &&
+ orderItems != null && !orderItems.isEmpty();
+ }
+}
\ No newline at end of file
--
Gitblit v1.9.1