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 |  274 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 265 insertions(+), 9 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 1b352a2..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,12 +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.Valid;
+import javax.validation.constraints.*;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
@@ -18,22 +22,274 @@
 
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty("涓氬姟绫诲瀷")
+    /**
+     * 涓氬姟绫诲瀷鏋氫妇
+     */
+    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"; // 鐩存帴璋冩嫧鍗�
+    }
+
+    /**
+     * 鍗曟嵁绫诲瀷鏋氫妇
+     */
+    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;
 
-    @ApiModelProperty("鍗曞彿")
+    @NotBlank(message = "鍗曟嵁绫诲瀷涓嶈兘涓虹┖")
+    @Pattern(regexp = "^[123]$", message = "鍗曟嵁绫诲瀷鍙兘鏄�1(鍑哄簱鍗�)銆�2(鍏ュ簱鍗�)鎴�3(璋冩嫧鍗�)")
+    @ApiModelProperty(value = "鍗曟嵁绫诲瀷: 1-鍑哄簱鍗�, 2-鍏ュ簱鍗�, 3-璋冩嫧鍗�", required = true, example = "2")
+    private String type;
+
+    @NotBlank(message = "鍗曞彿涓嶈兘涓虹┖")
+    @Size(max = 50, message = "鍗曞彿闀垮害涓嶈兘瓒呰繃50涓瓧绗�")
+    @ApiModelProperty(value = "鍗曞彿", required = true, example = "PO202401010001")
     private String orderNo;
 
-    @ApiModelProperty("璁㈠崟ID")
+    @NotNull(message = "鍗曟嵁鍐呯爜涓嶈兘涓虹┖")
+    @Positive(message = "鍗曟嵁鍐呯爜蹇呴』鏄鏁存暟")
+    @ApiModelProperty(value = "鍗曟嵁鍐呯爜锛屽敮涓�鏍囪瘑", required = true, example = "100001")
+    private Long orderInternalCode;
+
+//    @NotNull(message = "璁㈠崟ID涓嶈兘涓虹┖")
+//    @Positive(message = "璁㈠崟ID蹇呴』鏄鏁存暟")
+//    @ApiModelProperty(value = "璁㈠崟ID", required = true, example = "200001")
     private Long orderId;
 
-    @ApiModelProperty("鏁伴噺")
+//    @NotNull(message = "鏁伴噺涓嶈兘涓虹┖")
+//    @DecimalMin(value = "0.0", inclusive = false, message = "鏁伴噺蹇呴』澶т簬0")
+//    @ApiModelProperty(value = "鏁伴噺", required = true, example = "100.5")
     private Double anfme;
 
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:ss:mm")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:ss:mm")
+    @ApiModelProperty(value = "瀹㈡埛缂栫爜", example = "CUST001")
+    private String customerId;
+
+    @ApiModelProperty(value = "瀹㈡埛鍚嶇О", example = "XX绉戞妧鏈夐檺鍏徃")
+    private String customerName;
+
+    @ApiModelProperty(value = "渚涘簲鍟嗙紪鐮�", example = "SUP001")
+    private String supplierId;
+
+    @ApiModelProperty(value = "渚涘簲鍟嗗悕绉�", example = "XX渚涘簲鍟�")
+    private String supplierName;
+
+    @DateTimeFormat(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("鍗曟嵁鏄庣粏淇℃伅")
-    private List<SyncOrdersItem> ordersItems;
-}
+    @NotNull(message = "鍒涘缓鏃ユ湡涓嶈兘涓虹┖")
+    @Positive(message = "鍒涘缓鏃ユ湡蹇呴』鏄鏁存暟")
+    @ApiModelProperty(value = "鍒涘缓鏃ユ湡锛屾椂闂存埑锛岀簿纭埌绉�", required = true, example = "1704067200")
+    private Long createTime;
+
+    @NotNull(message = "涓氬姟鏃ユ湡涓嶈兘涓虹┖")
+    @Positive(message = "涓氬姟鏃ユ湡蹇呴』鏄鏁存暟")
+    @ApiModelProperty(value = "涓氬姟鏃ユ湡锛屽璐︿娇鐢紝鏃堕棿鎴筹紝绮剧‘鍒扮", required = true, example = "1704067200")
+    private Long businessTime;
+
+    @Valid
+    @NotNull(message = "鍗曟嵁鏄庣粏淇℃伅涓嶈兘涓虹┖")
+    @Size(min = 1, message = "鑷冲皯闇�瑕佷竴涓槑缁嗛」")
+    @ApiModelProperty(value = "鍗曟嵁鏄庣粏淇℃伅", required = true)
+    private List<SyncOrdersItem> orderItems;
+
+    @ApiModelProperty(value = "鏀舵枡/鍙戣揣缁勭粐", example = "ORG001")
+    private String stockOrgId;
+
+    @ApiModelProperty(value = "鏀舵枡/鍙戣揣缁勭粐鍚嶇О", example = "鍙戣揣閮�")
+    private String stockOrgName;
+
+    @ApiModelProperty(value = "閲囪喘缁勭粐", example = "PUR001")
+    private String purchaseOrgId;
+
+    @ApiModelProperty(value = "閲囪喘缁勭粐鍚嶇О", example = "閲囪喘閮�")
+    private String purchaseOrgName;
+
+    @ApiModelProperty(value = "閲囪喘鍛�", example = "USER001")
+    private String purchaseUserId;
+
+    @ApiModelProperty(value = "閲囪喘鍛樺悕绉�", example = "寮犱笁")
+    private String purchaseUserName;
+
+    @ApiModelProperty(value = "鐢熶骇缁勭粐", example = "PRD001")
+    private String prdOrgId;
+
+    @ApiModelProperty(value = "鐢熶骇缁勭粐鍚嶇О", example = "鐢熶骇閮�")
+    private String prdOrgName;
+
+    @ApiModelProperty(value = "閿�鍞粍缁�", example = "SALE001")
+    private String saleOrgId;
+
+    @ApiModelProperty(value = "閿�鍞粍缁囧悕绉�", example = "閿�鍞儴")
+    private String saleOrgName;
+
+    @ApiModelProperty(value = "閿�鍞憳", example = "USER002")
+    private String saleUserId;
+
+    @ApiModelProperty(value = "閿�鍞憳鍚嶇О", example = "鏉庡洓")
+    private String saleUserName;
+
+    @ApiModelProperty(value = "搴撳瓨鏂瑰悜", example = "IN")
+    private String stockDirect;
+
+    @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