Przeglądaj źródła

feat(erp): 添加ERP系统数据实体类及接口实现

- 新增银行、品牌、城市、公司等ERP主数据实体类
- 创建客户、部门、职位、产品类别等业务实体定义
- 添加省市区、行业、收入费用类型等分类数据结构
- 实现外部API与系统内部服务的数据转换功能
- 集成远程服务调用实现数据同步操作
- 添加日志记录和文件操作工具类支持
- 完善数据映射转换和异常处理机制
肖路 2 miesięcy temu
rodzic
commit
6d0e759989
59 zmienionych plików z 2613 dodań i 16 usunięć
  1. 35 0
      ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/RemoteErpCustomerService.java
  2. 18 0
      ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/erp/domain/ErpCompanyScaleData.java
  3. 18 0
      ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/erp/domain/ErpIndustryData.java
  4. 26 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpBank.java
  5. 22 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpBrand.java
  6. 24 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCity.java
  7. 23 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCompanyScale.java
  8. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCountry.java
  9. 25 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCustomer.java
  10. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCustomerGrade.java
  11. 47 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCustomerSalesPriceList.java
  12. 23 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCustomerType.java
  13. 28 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpDepartment.java
  14. 24 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpDistrict.java
  15. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpExpense.java
  16. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpExpress.java
  17. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpIncomeApplication.java
  18. 23 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpIncomeExpenseType.java
  19. 23 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpIndustry.java
  20. 27 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpPerson.java
  21. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpPosition.java
  22. 24 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpProductCategory.java
  23. 22 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpProvince.java
  24. 28 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpSalesDelivery.java
  25. 22 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpSalesOrder.java
  26. 46 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpSalesPriceList.java
  27. 22 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpSalesReturnApplication.java
  28. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpSupplierType.java
  29. 22 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpTaxCode.java
  30. 23 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpUnit.java
  31. 23 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpWarehouse.java
  32. 47 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteErpProductService.java
  33. 18 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/erp/domain/ErpBrandData.java
  34. 19 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/erp/domain/ErpProductCategoryData.java
  35. 18 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/erp/domain/ErpUnitData.java
  36. 165 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteErpSystemService.java
  37. 21 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpBankData.java
  38. 19 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCityData.java
  39. 39 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCompanyData.java
  40. 17 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCountryData.java
  41. 16 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCustomerGradeData.java
  42. 18 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCustomerTypeData.java
  43. 24 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpDepartmentData.java
  44. 19 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpDistrictData.java
  45. 16 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpExpressData.java
  46. 19 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpIncomeExpenseTypeData.java
  47. 18 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpPersonData.java
  48. 17 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpPositionData.java
  49. 17 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpProvinceData.java
  50. 16 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpSupplierTypeData.java
  51. 18 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpTaxCodeData.java
  52. 18 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpWarehouseData.java
  53. 8 8
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierInfoController.java
  54. 73 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemoteErpCustomerServiceImpl.java
  55. 580 6
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/erp/ErpPullController.java
  56. 105 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteErpProductServiceImpl.java
  57. 498 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteErpSystemServiceImpl.java
  58. 3 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java
  59. 2 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java

+ 35 - 0
ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/RemoteErpCustomerService.java

@@ -0,0 +1,35 @@
+package org.dromara.customer.api;
+
+import org.dromara.customer.api.erp.domain.*;
+
+import java.util.Map;
+
+/**
+ * erp客户服务
+ * @author
+ * @date 2026/1/23 下午6:18
+ */
+public interface RemoteErpCustomerService {
+
+    /**
+    * 同步企业规模
+    * */
+    Boolean syncCompanyScale(ErpCompanyScaleData companyScale);
+
+    /**
+    * 删除企业规模
+    * */
+    Boolean deleteCompanyScale(ErpCompanyScaleData companyScale);
+
+
+
+    /**
+    * 同步行业类别
+    * */
+    Boolean syncIndustry(ErpIndustryData industry);
+    /**
+    * 删除行业类别
+    * */
+    Boolean deleteIndustry(ErpIndustryData industry);
+
+}

+ 18 - 0
ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/erp/domain/ErpCompanyScaleData.java

@@ -0,0 +1,18 @@
+package org.dromara.customer.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:13
+ */
+@Data
+public class ErpCompanyScaleData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private Long ValidityFromDate; // 有效期从(时间戳,单位通常为毫秒)
+    private Long ValidityToDate;   // 有效期至(时间戳)
+    private String CropSclId;      // 编码(如 "SMALL", "MEDIUM", "LARGE")
+    private String CropSclNm;      // 名称(如 "小型企业", "中型企业", "大型企业")
+}

+ 18 - 0
ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/erp/domain/ErpIndustryData.java

@@ -0,0 +1,18 @@
+package org.dromara.customer.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:28
+ */
+@Data
+public class ErpIndustryData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String InduId;             // 编码(如 "IT", "FINANCE", "MANUFACTURE")
+    private String InduNm;             // 名称(如 "信息技术", "金融", "制造业")
+    private Long ValidityFromDate;     // 有效期从(时间戳)
+    private Long ValidityToDate;       // 有效期至(时间戳)
+}

+ 26 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpBank.java

@@ -0,0 +1,26 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 银行主数据实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpBank implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComBn comBn; // 顶层字段名,与 JSON 中的 "comBn" 一致
+
+    @Data
+    public static class ComBn {
+        private String BnAddr;     // 银行地址
+        private String BnCatgId;   // 银行类别(关联银行类别主数据)
+        private String FaxNo;      // 传真
+        private String Remark;     // 备注
+        private String TelNo;      // 联系电话
+        private String BnId;       // 编号(如 "ICBC", "BOC", "BNK001")
+        private String BnNm;       // 名称(如 "中国工商银行", "Bank of China")
+    }
+}

+ 22 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpBrand.java

@@ -0,0 +1,22 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 品牌资料实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpBrand implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComTradMrkDt comTradMrkDt; // 顶层字段名,与 JSON 中的 "comTradMrkDt" 一致
+
+    @Data
+    public static class ComTradMrkDt {
+        private String MnemonicId;  // 助记码(如 "APPL", "HW")
+        private String TradMrkId;   // 编码(品牌唯一标识)
+        private String TradMrkNm;   // 名称(如 "Apple", "华为")
+    }
+}

+ 24 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCity.java

@@ -0,0 +1,24 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 城市信息实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpCity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComCity comCity; // 顶层字段名,与 JSON 一致
+
+    @Data
+    public static class ComCity {
+        private String AreaCode;     // 区号
+        private String CountryId;    // 所属国家
+        private String PrvnId;       // 所属省份
+        private String CityId;       // 编号
+        private String CityNm;       // 名称
+    }
+}

+ 23 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCompanyScale.java

@@ -0,0 +1,23 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 企业规模主数据实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpCompanyScale implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private CrmCropScl crmCropScl; // 顶层字段名,与 JSON 中的 "crmCropScl" 完全一致
+
+    @Data
+    public static class CrmCropScl {
+        private Long ValidityFromDate; // 有效期从(时间戳,单位通常为毫秒)
+        private Long ValidityToDate;   // 有效期至(时间戳)
+        private String CropSclId;      // 编码(如 "SMALL", "MEDIUM", "LARGE")
+        private String CropSclNm;      // 名称(如 "小型企业", "中型企业", "大型企业")
+    }
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCountry.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 国家/地区信息实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpCountry implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComCountry comCountry; // 顶层字段名,与 JSON 中的 "comCountry" 一致
+
+    @Data
+    public static class ComCountry {
+        private String CountryId;     // 编号(如 "CN", "US", "JP")
+        private String CountryName;   // 名称(如 "中国", "United States")
+    }
+}

+ 25 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCustomer.java

@@ -0,0 +1,25 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 客户资料设定实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpCustomer implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private CustomerData data;        // 对应顶层 "data"
+    private String GathCndInfo;       // 条件说明(独立顶层字段)
+
+    @Data
+    public static class CustomerData {
+        private Integer ChkoutDa;   // 结账日(通常为 1~31 的整数)
+        private String CustId;      // 编号
+        private String CustNm;      // 名称
+        private String GathCnd;     // 收款条件
+        private Integer GathDays;   // 收款天数
+    }
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCustomerGrade.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 客户等级信息实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpCustomerGrade implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComCustGad comCustGad; // 顶层字段名,与 JSON 中的 "comCustGad" 一致
+
+    @Data
+    public static class ComCustGad {
+        private String GadId; // 编号(如 "VIP", "A01", "NORMAL")
+        private String GadNm; // 名称(如 "金牌客户", "普通客户")
+    }
+}

+ 47 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCustomerSalesPriceList.java

@@ -0,0 +1,47 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 销售价格清单-客户产品实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpCustomerSalesPriceList implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Header salSalePrList;           // 单据头
+    private CompanyInfo salSalePrListCo;    // 公司信息
+    private List<Detail> salSalePrListDt;   // 明细行(客户+产品价格列表)
+
+    @Data
+    public static class Header {
+        private String TypeId;             // 单据类型
+        private Long BlDa;                 // 单据日期(时间戳)
+        private String BlNo;               // 单据编号
+        private String Remark;             // 备注
+        private Long ValidityFromDate;     // 有效期从
+        private Long ValidityToDate;       // 有效期至
+    }
+
+    @Data
+    public static class CompanyInfo {
+        private String CoId;               // 公司编号
+    }
+
+    @Data
+    public static class Detail {
+        private String CU_Remark;          // 备注(注意字段名含下划线)
+        private String CurId;              // 币别编号
+        private String CustId;             // 客户编号(新增字段!)
+        private Double Pr;                 // 未税单价
+        private String ProdId;             // 产品编号
+        private Double PrWTax;             // 含税单价
+        private String RowCd;              // 标识号
+        private Integer RowNo;             // 序号
+        private String SUiId;              // 交易单位编号
+        private String TaxId;              // 税码编号
+    }
+}

+ 23 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpCustomerType.java

@@ -0,0 +1,23 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 客户类别信息实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpCustomerType implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComCustTy comCustTy; // 顶层字段名,与 JSON 中的 "comCustTy" 一致
+
+    @Data
+    public static class ComCustTy {
+        private Long ValidityFromDate; // 有效期从(时间戳,单位通常为毫秒或秒)
+        private Long ValidityToDate;   // 有效期至(时间戳)
+        private String CustTyId;       // 编号(如 "CORP", "RETAIL")
+        private String CustTyNm;       // 名称(如 "企业客户", "零售客户")
+    }
+}

+ 28 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpDepartment.java

@@ -0,0 +1,28 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 部门信息实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpDepartment implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComDept comDept; // 顶层字段名与 JSON 一致
+
+    @Data
+    public static class ComDept {
+        private String DepartmentCategory;   // 部门类型
+        private String Executive;            // 主管
+        private Integer Lv;                  // 级数
+        private String PDeptId;              // 上级部门
+        private String RtDeptId;             // 一级部门
+        private Long ValidityFromDate;       // 有效期从
+        private Long ValidityToDate;         // 有效期至
+        private String DeptId;               // 编号
+        private String DeptNm;               // 名称
+    }
+}

+ 24 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpDistrict.java

@@ -0,0 +1,24 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 区/县主数据实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpDistrict implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComDistrict comDistrict; // 顶层字段名,与 JSON 中的 "comDistrict" 一致
+
+    @Data
+    public static class ComDistrict {
+        private String CityId;      // 城市(上级城市编码)
+        private String CountryId;   // 所属国家
+        private String PrvnId;      // 所属省份
+        private String DistrictId;  // 编码(如 "DIST_001", "310115")
+        private String DistrictNm;  // 名称(如 "浦东新区", "朝阳区")
+    }
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpExpense.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 费用申请单实体类(避免内部类与 Lombok @Data 冲突)
+ */
+@Data
+public class ErpExpense implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ExpenseData data; // 字段名仍为 "data",匹配 JSON;但内部类不叫 Data
+
+    @Data
+    public static class ExpenseData {
+        private String BlNo;       // 单据编号
+        private String IsRelChk;   // 是否关联确认单(通常 "Y"/"N" 或 "0"/"1",用 String 更安全)
+    }
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpExpress.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 快递主数据实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpExpress implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComExpr comExpr; // 顶层字段名,与 JSON 中的 "comExpr" 一致
+
+    @Data
+    public static class ComExpr {
+        private String ExprId; // 编码(如 "SF", "YTO", "ZTO")
+        private String ExprNm; // 名称(如 "顺丰速运", "圆通速递")
+    }
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpIncomeApplication.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 收入申请单实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpIncomeApplication implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private IncomeData data; // 字段名保持为 "data",匹配 JSON;内部类使用语义化名称
+
+    @Data
+    public static class IncomeData {
+        private String BlNo;       // 单据编号
+        private String IsRelChk;   // 是否关联确认单(通常为 "Y"/"N" 或 "1"/"0")
+    }
+}

+ 23 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpIncomeExpenseType.java

@@ -0,0 +1,23 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 收入费用类型主数据实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpIncomeExpenseType implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComIcmCs comIcmCs; // 顶层字段名,与 JSON 中的 "comIcmCs" 一致
+
+    @Data
+    public static class ComIcmCs {
+        private String IsCs;   // 费用标识(如 "Y"/"N" 或 "1"/"0")
+        private String IsIcm;  // 收入标识(如 "Y"/"N" 或 "1"/"0")
+        private String TyNm;   // 名称(如 "差旅费", "销售收入")
+        private String TypeId; // 编号(如 "EXP001", "INC001")
+    }
+}

+ 23 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpIndustry.java

@@ -0,0 +1,23 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 行业别主数据实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpIndustry implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private CrmIndu crmIndu; // 顶层字段名,与 JSON 中的 "crmIndu" 一致
+
+    @Data
+    public static class CrmIndu {
+        private String InduId;             // 编码(如 "IT", "FINANCE", "MANUFACTURE")
+        private String InduNm;             // 名称(如 "信息技术", "金融", "制造业")
+        private Long ValidityFromDate;     // 有效期从(时间戳)
+        private Long ValidityToDate;       // 有效期至(时间戳)
+    }
+}

+ 27 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpPerson.java

@@ -0,0 +1,27 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 人员资料设定实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpPerson implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComPerDt comPerDt; // 顶层字段名,与 JSON 中的 "comPerDt" 一致
+
+    @Data
+    public static class ComPerDt {
+        private String Phone;              // 移动电话
+        private String PostId;             // 岗位(岗位编码,关联岗位主数据)
+        private String Sex;                // 性别(如 "M"/"F" 或 "男"/"女")
+        private Long ValidityFromDate;     // 有效期从(时间戳)
+        private Long ValidityToDate;       // 有效期至(时间戳)
+        private String DeptId;             // 所属部门(部门编码)
+        private String PerId;              // 编号(人员唯一标识)
+        private String PerNm;              // 姓名
+    }
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpPosition.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 岗位信息实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpPosition implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComPot comPot; // 顶层字段名,与 JSON 中的 "ComPot" 一致
+
+    @Data
+    public static class ComPot {
+        private String PotId; // 编号
+        private String PotNm; // 名称
+    }
+}

+ 24 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpProductCategory.java

@@ -0,0 +1,24 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 产品类别信息实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpProductCategory implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComProdCatg comProdCatg; // 顶层字段名,与 JSON 一致
+
+    @Data
+    public static class ComProdCatg {
+        private Integer Lv;                   // 级数
+        private String PurPerId;              // 采购员
+        private String ParentProdCatgId;      // 上级类别
+        private String ProdCatgId;            // 编码
+        private String ProdCatgNm;            // 名称
+    }
+}

+ 22 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpProvince.java

@@ -0,0 +1,22 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 省份主数据实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpProvince implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComProvince comProvince; // 顶层字段名,与 JSON 中的 "comProvince" 一致
+
+    @Data
+    public static class ComProvince {
+        private String CountryId; // 所属国家(如 "CN")
+        private String PrvnId;    // 编号(如 "110000", "PROV_GD")
+        private String PrvnNm;    // 名称(如 "广东省", "北京市")
+    }
+}

+ 28 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpSalesDelivery.java

@@ -0,0 +1,28 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 销售出货申请单实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpSalesDelivery implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private SalesDelivery data; // 顶层字段名,与 JSON 中的 "data" 一致
+
+    @Data
+    public static class SalesDelivery {
+        private String AnaPerId;   // 复点人员编号
+        private String BlNo;       // 单据编号
+        private String ChkPerId;   // 清货人员编号
+        private String DisPerId;   // 配货人员编号
+        private String ExprId;     // 快递编号
+        private String ExprNo;     // 快递单号
+        private String ExprPay;    // 快递付款方式
+        private String RecBlNo;    // 库存记录单号
+        private String ReSign;     // 回签信息
+    }
+}

+ 22 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpSalesOrder.java

@@ -0,0 +1,22 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 销售订单实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpSalesOrder implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private SalesOrderData data; // 顶层字段名,对应 JSON 中的 "data"
+
+    @Data
+    public static class SalesOrderData {
+        private String BlNo;      // 单据编号
+        private String OutStkSt;  // 出库状态(数据库原值,通常为状态码如 "NOT_OUT", "PARTIAL
+
+    }
+}

+ 46 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpSalesPriceList.java

@@ -0,0 +1,46 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 销售价格清单实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpSalesPriceList implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Header salSalePrList;           // 单据头
+    private CompanyInfo salSalePrListCo;    // 公司信息
+    private List<Detail> salSalePrListDt;   // 明细行(列表)
+
+    @Data
+    public static class Header {
+        private Long BlDa;                // 单据日期(时间戳)
+        private String BlNo;              // 单据编号
+        private String Remark;            // 备注
+        private String TypeId;            // 单据类型
+        private Long ValidityFromDate;    // 有效期从
+        private Long ValidityToDate;      // 有效期至
+    }
+
+    @Data
+    public static class CompanyInfo {
+        private String CoId;              // 公司编号
+    }
+
+    @Data
+    public static class Detail {
+        private String CU_Remark;         // 备注(注意字段名含下划线)
+        private String CurId;             // 币别编号
+        private Double Pr;                // 未税单价
+        private String ProdId;            // 产品编号
+        private Double PrWTax;            // 含税单价
+        private String RowCd;             // 标识号
+        private Integer RowNo;            // 序号
+        private String SUiId;             // 交易单位编号
+        private String TaxId;             // 税码编号
+    }
+}

+ 22 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpSalesReturnApplication.java

@@ -0,0 +1,22 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 销售退货申请单实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpSalesReturnApplication implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ReturnData data; // 字段名保持为 "data",匹配 JSON;内部类使用语义化名称
+
+    @Data
+    public static class ReturnData {
+        private String BlNo;      // 商城订单退货号
+        private String InStkSt;   // 入库状态(数据库原值,如 "NOT_IN", "PARTIAL", "COMPLETE")
+        private String OrdBlno;   // 商城订单号
+    }
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpSupplierType.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 供应商类别信息实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpSupplierType implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComSupTy comSupTy; // 顶层字段名,与 JSON 中的 "comSupTy" 一致
+
+    @Data
+    public static class ComSupTy {
+        private String TyNm;   // 名称
+        private String TypeId; // 编号
+    }
+}

+ 22 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpTaxCode.java

@@ -0,0 +1,22 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 税码设定主数据实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpTaxCode implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComSetTax comSetTax; // 顶层字段名,与 JSON 中的 "comSetTax" 一致
+
+    @Data
+    public static class ComSetTax {
+        private String TaxId;   // 编号(如 "VAT13", "GST05")
+        private String TaxNm;   // 名称(如 "增值税-13%", "消费税")
+        private Double TaxRt;   // 税率(%),例如 13.0 表示 13%
+    }
+}

+ 23 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpUnit.java

@@ -0,0 +1,23 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 计量单位信息实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpUnit implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComUnit comUnit; // 顶层字段名,与 JSON 中的 "comUnit" 一致
+
+    @Data
+    public static class ComUnit {
+        private String UnitProperty;     // 属性(数据库原值,如 "STANDARD", "WEIGHT" 等)
+        private Integer DecimalDigits;   // 小数位数(数据库原值,通常为整数)
+        private String UnitId;           // 编号(如 "KG", "PCS", "MTR")
+        private String UnitName;         // 名称(如 "千克", "件", "米")
+    }
+}

+ 23 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/erp/domain/ErpWarehouse.java

@@ -0,0 +1,23 @@
+package org.dromara.external.api.erp.domain;
+
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 仓库信息实体类(字段名与 JSON 保持一致)
+ */
+@Data
+public class ErpWarehouse implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private ComWhs comWhs; // 顶层字段名与 JSON 一致
+
+    @Data
+    public static class ComWhs {
+        private String CoId;      // 公司
+        private String StkStu;    // 预设库存状态
+        private String WhsId;     // 编号
+        private String WhsNm;     // 名称
+    }
+}

+ 47 - 0
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteErpProductService.java

@@ -0,0 +1,47 @@
+package org.dromara.product.api;
+
+import org.dromara.product.api.erp.domain.*;
+
+import java.util.Map;
+
+/**
+ * erp商品服务
+ * @author
+ * @date 2026/1/23 下午6:16
+ */
+public interface RemoteErpProductService {
+
+
+    /**
+     * 同步erp商品品牌
+     * */
+    Boolean syncErpBrand(ErpBrandData erpBrand);
+
+    /**
+     * 删除erp商品品牌
+     * */
+    Boolean deleteErpBrand(ErpBrandData erpBrand);
+
+    /**
+     * 同步erp商品分类
+     * */
+    Boolean syncErpCategory(ErpProductCategoryData erpCategory);
+
+    /**
+     * 删除erp商品分类
+     * */
+    Boolean deleteErpCategory(ErpProductCategoryData erpCategory);
+    /**
+     * 同步计量单位
+     * */
+    Boolean syncErpUnit(ErpUnitData erpUnit);
+    /**
+     * 删除计量单位
+     * */
+    Boolean deleteErpUnit(ErpUnitData erpUnit);
+    /**
+     * 销售价格清单-产品
+     * */
+    Boolean syncSalesPriceList(Map<String,Object> salesPriceList);
+}
+

+ 18 - 0
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/erp/domain/ErpBrandData.java

@@ -0,0 +1,18 @@
+package org.dromara.product.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:17
+ */
+@Data
+public class ErpBrandData implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String MnemonicId;  // 助记码(如 "APPL", "HW")
+    private String TradMrkId;   // 编码(品牌唯一标识)
+    private String TradMrkNm;   // 名称(如 "Apple", "华为")
+}

+ 19 - 0
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/erp/domain/ErpProductCategoryData.java

@@ -0,0 +1,19 @@
+package org.dromara.product.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:38
+ */
+@Data
+public class ErpProductCategoryData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private Integer Lv;                   // 级数
+    private String PurPerId;              // 采购员
+    private String ParentProdCatgId;      // 上级类别
+    private String ProdCatgId;            // 编码
+    private String ProdCatgNm;            // 名称
+}

+ 18 - 0
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/erp/domain/ErpUnitData.java

@@ -0,0 +1,18 @@
+package org.dromara.product.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:29
+ */
+@Data
+public class ErpUnitData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String UnitProperty;     // 属性(数据库原值,如 "STANDARD", "WEIGHT" 等)
+    private Integer DecimalDigits;   // 小数位数(数据库原值,通常为整数)
+    private String UnitId;           // 编号(如 "KG", "PCS", "MTR")
+    private String UnitName;         // 名称(如 "千克", "件", "米")
+}

+ 165 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteErpSystemService.java

@@ -0,0 +1,165 @@
+package org.dromara.system.api;
+
+import org.dromara.system.api.erp.domain.*;
+
+
+/**
+ * erp系统服务
+ *
+ * @author
+ * @date 2026/1/23 下午6:17
+ */
+public interface RemoteErpSystemService {
+
+
+    /**
+     * 同步人员资料
+     * */
+    Boolean syncPerson(ErpPersonData person);
+
+    /**
+     * 删除人员资料
+     * */
+    Boolean deletePerson(ErpPersonData person);
+    /**
+     * 同步公司数据
+     * */
+    Boolean syncCompany(ErpCompanyData company);
+
+    /**
+     * 删除公司数据
+     * */
+    Boolean deleteCompany(ErpCompanyData company);
+
+    /**
+    * 同步仓库数据
+    * */
+    Boolean syncWarehouse(ErpWarehouseData warehouse);
+
+    /**
+    * 删除仓库数据
+    * */
+    Boolean deleteWarehouse(ErpWarehouseData warehouse);
+
+    /**
+    * 同步区县数据
+    * */
+    Boolean syncDistrict(ErpDistrictData district);
+
+    /**
+    * 删除区县数据
+    * */
+    Boolean deleteDistrict(ErpDistrictData district);
+
+    /**
+    * 同步国家数据
+    * */
+    Boolean syncCountry(ErpCountryData country);
+
+    /**
+    * 删除国家数据
+    * */
+    Boolean deleteCountry(ErpCountryData country);
+
+    /**
+    * 同步城市数据
+    * */
+    Boolean syncCity(ErpCityData city);
+
+    /**
+    * 删除城市数据
+    * */
+    Boolean deleteCity(ErpCityData city);
+
+    /**
+    * 同步岗位数据
+    * */
+    Boolean syncPosition(ErpPositionData position);
+
+    /**
+    * 删除岗位数据
+    * */
+    Boolean deletePosition(ErpPositionData position);
+
+    /**
+    * 同步快递物流公司数据
+    * */
+    Boolean syncExpress(ErpExpressData express);
+
+    /**
+    * 删除快递物流公司数据
+    * */
+    Boolean deleteExpress(ErpExpressData express);
+
+    /**
+     * 同步收入费用
+     * */
+    Boolean syncIncomeExpense(ErpIncomeExpenseTypeData incomeExpense);
+    /**
+     * 删除收入费用类型
+     * */
+    Boolean deleteIncomeExpense(ErpIncomeExpenseTypeData incomeExpense);
+    /**
+     * 同步省份
+     * */
+    Boolean syncProvince(ErpProvinceData province);
+    /**
+     * 删除省份
+     * */
+    Boolean deleteProvince(ErpProvinceData province);
+    /**
+     * 同步税码
+     * */
+    Boolean syncTaxCode(ErpTaxCodeData taxCode);
+    /**
+     * 删除税码
+     * */
+    Boolean deleteTaxCode(ErpTaxCodeData taxCode);
+
+    /**
+    * 同步部门
+    * */
+    Boolean syncDepartment(ErpDepartmentData department);
+    /**
+    * 删除部门
+    * */
+    Boolean deleteDepartment(ErpDepartmentData department);
+    /**
+    * 同步银行
+    * */
+    Boolean syncBank(ErpBankData bank);
+    /**
+    * 删除银行
+    * */
+    Boolean deleteBank(ErpBankData bank);
+
+    /**
+     * 同步供应商类别
+     * */
+    Boolean syncSupplierType(ErpSupplierTypeData supplierType);
+
+    /**
+     * 删除供应商类别
+     * */
+    Boolean deleteSupplierType(ErpSupplierTypeData supplierType);
+
+    /**
+     * 同步客户等级
+     * */
+    Boolean syncCustomerGrade(ErpCustomerGradeData customerGrade);
+    /**
+     * 删除客户等级
+     * */
+    Boolean deleteCustomerGrade(ErpCustomerGradeData customerGrade);
+
+    /**
+     * 同步客户类别
+     * */
+    Boolean syncCustomerType(ErpCustomerTypeData customerType);
+
+    /**
+     * 删除客户类别
+     * */
+    Boolean deleteCustomerType(ErpCustomerTypeData customerType);
+
+}

+ 21 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpBankData.java

@@ -0,0 +1,21 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:31
+ */
+@Data
+public class ErpBankData implements Serializable {
+
+    private String BnAddr;     // 银行地址
+    private String BnCatgId;   // 银行类别(关联银行类别主数据)
+    private String FaxNo;      // 传真
+    private String Remark;     // 备注
+    private String TelNo;      // 联系电话
+    private String BnId;       // 编号(如 "ICBC", "BOC", "BNK001")
+    private String BnNm;       // 名称(如 "中国工商银行", "Bank of China")
+}

+ 19 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCityData.java

@@ -0,0 +1,19 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:19
+ */
+@Data
+public class ErpCityData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String AreaCode;     // 区号
+    private String CountryId;    // 所属国家
+    private String PrvnId;       // 所属省份
+    private String CityId;       // 编号
+    private String CityNm;       // 名称
+}

+ 39 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCompanyData.java

@@ -0,0 +1,39 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:33
+ */
+@Data
+public class ErpCompanyData implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String AccBnId;      // 开户银行
+    private String AccBnNo;      // 开户银行帐号
+    private String Address;      // 地址信息
+    private Long BegDa;          // 营业期限(开始)— JSON 中是数字 0
+    private String BusScp;       // 经营范围
+    private Double CapAmt;       // 注册资本 — JSON 是 0.000000
+    private String CoFuNm;       // 企业名称
+    private String Corporation;  // 法定代表人
+    private String EMail;        // E-Mail
+    private Long EndDa;          // 营业期限(结束)
+    private Long FoundDa;        // 成立日期
+    private String InCustId;     // 内部交易客户
+    private String InSupId;      // 内部交易供应商
+    private String LelPer;       // 法人代表
+    private String Phone;        // 办公电话
+    private String Principal;    // 负责人
+    private String RegAddr;      // 注册地址
+    private Long RegDa;          // 登记日期
+    private String RegOrg;       // 登记机关
+    private String Remark;       // 备注
+    private String TaxNo;        // 统一社会信用代码
+    private String CoId;         // 编号
+    private String CoNm;         // 名称
+
+}

+ 17 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCountryData.java

@@ -0,0 +1,17 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:18
+ */
+@Data
+public class ErpCountryData implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String CountryId;     // 编号(如 "CN", "US", "JP")
+    private String CountryName;   // 名称(如 "中国", "United States")
+}

+ 16 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCustomerGradeData.java

@@ -0,0 +1,16 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:20
+ */
+@Data
+public class ErpCustomerGradeData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String GadId; // 编号(如 "VIP", "A01", "NORMAL")
+    private String GadNm; // 名称(如 "金牌客户", "普通客户")
+}

+ 18 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCustomerTypeData.java

@@ -0,0 +1,18 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:21
+ */
+@Data
+public class ErpCustomerTypeData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private Long ValidityFromDate; // 有效期从(时间戳,单位通常为毫秒或秒)
+    private Long ValidityToDate;   // 有效期至(时间戳)
+    private String CustTyId;       // 编号(如 "CORP", "RETAIL")
+    private String CustTyNm;       // 名称(如 "企业客户", "零售客户")
+}

+ 24 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpDepartmentData.java

@@ -0,0 +1,24 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:30
+ */
+@Data
+public class ErpDepartmentData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    private String DepartmentCategory;   // 部门类型
+    private String Executive;            // 主管
+    private Integer Lv;                  // 级数
+    private String PDeptId;              // 上级部门
+    private String RtDeptId;             // 一级部门
+    private Long ValidityFromDate;       // 有效期从
+    private Long ValidityToDate;         // 有效期至
+    private String DeptId;               // 编号
+    private String DeptNm;               // 名称
+}

+ 19 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpDistrictData.java

@@ -0,0 +1,19 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:16
+ */
+@Data
+public class ErpDistrictData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String CityId;      // 城市(上级城市编码)
+    private String CountryId;   // 所属国家
+    private String PrvnId;      // 所属省份
+    private String DistrictId;  // 编码(如 "DIST_001", "310115")
+    private String DistrictNm;  // 名称(如 "浦东新区", "朝阳区")
+}

+ 16 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpExpressData.java

@@ -0,0 +1,16 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:22
+ */
+@Data
+public class ErpExpressData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String ExprId; // 编码(如 "SF", "YTO", "ZTO")
+    private String ExprNm; // 名称(如 "顺丰速运", "圆通速递")
+}

+ 19 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpIncomeExpenseTypeData.java

@@ -0,0 +1,19 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:24
+ */
+@Data
+public class ErpIncomeExpenseTypeData implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String IsCs;   // 费用标识(如 "Y"/"N" 或 "1"/"0")
+    private String IsIcm;  // 收入标识(如 "Y"/"N" 或 "1"/"0")
+    private String TyNm;   // 名称(如 "差旅费", "销售收入")
+    private String TypeId; // 编号(如 "EXP001", "INC001")
+}

+ 18 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpPersonData.java

@@ -0,0 +1,18 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ErpPersonData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String Phone;              // 移动电话
+    private String PostId;             // 岗位(岗位编码,关联岗位主数据)
+    private String Sex;                // 性别(如 "M"/"F" 或 "男"/"女")
+    private Long ValidityFromDate;     // 有效期从(时间戳)
+    private Long ValidityToDate;       // 有效期至(时间戳)
+    private String DeptId;             // 所属部门(部门编码)
+    private String PerId;              // 编号(人员唯一标识)
+    private String PerNm;              // 姓名
+}

+ 17 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpPositionData.java

@@ -0,0 +1,17 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:21
+ */
+@Data
+public class ErpPositionData implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String PotId; // 编号
+    private String PotNm; // 名称
+}

+ 17 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpProvinceData.java

@@ -0,0 +1,17 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:26
+ */
+@Data
+public class ErpProvinceData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String CountryId; // 所属国家(如 "CN")
+    private String PrvnId;    // 编号(如 "110000", "PROV_GD")
+    private String PrvnNm;    // 名称(如 "广东省", "北京市")
+}

+ 16 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpSupplierTypeData.java

@@ -0,0 +1,16 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:14
+ */
+@Data
+public class ErpSupplierTypeData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String TyNm;   // 名称
+    private String TypeId; // 编号
+}

+ 18 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpTaxCodeData.java

@@ -0,0 +1,18 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:27
+ */
+@Data
+public class ErpTaxCodeData implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String TaxId;   // 编号(如 "VAT13", "GST05")
+    private String TaxNm;   // 名称(如 "增值税-13%", "消费税")
+    private Double TaxRt;   // 税率(%),例如 13.0 表示 13%
+}

+ 18 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpWarehouseData.java

@@ -0,0 +1,18 @@
+package org.dromara.system.api.erp.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/1/27 下午7:12
+ */
+@Data
+public class ErpWarehouseData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String CoId;      // 公司
+    private String StkStu;    // 预设库存状态
+    private String WhsId;     // 编号
+    private String WhsNm;     // 名称
+}

+ 8 - 8
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierInfoController.java

@@ -49,7 +49,7 @@ public class SupplierInfoController extends BaseController {
     /**
      * 查询供应商信息列表
      */
-    @SaCheckPermission("customer:info:list")
+    //@SaCheckPermission("customer:info:list")
     @GetMapping("/list")
     public TableDataInfo<SupplierInfoVo> list(SupplierInfoBo bo, PageQuery pageQuery) {
         return supplierInfoService.queryPageList(bo, pageQuery);
@@ -61,7 +61,7 @@ public class SupplierInfoController extends BaseController {
      * @param pageQuery
      * @return
      */
-    @SaCheckPermission("customer:info:list")
+    //@SaCheckPermission("customer:info:list")
     @GetMapping("/getList")
     public TableDataInfo<SupplierInfoVo> getList(SupplierInfoBo bo, PageQuery pageQuery) {
         return supplierInfoService.getSupplierInformation(bo, pageQuery);
@@ -73,7 +73,7 @@ public class SupplierInfoController extends BaseController {
      * @param pageQuery
      * @return
      */
-    @SaCheckPermission("customer:info:list")
+    //@SaCheckPermission("customer:info:list")
     @GetMapping("/getApproveList")
     public TableDataInfo<SupplierInfoVo> getApproveList(SupplierInfoBo bo, PageQuery pageQuery) {
 
@@ -104,7 +104,7 @@ public class SupplierInfoController extends BaseController {
     /**
      * 导出供应商信息列表
      */
-    @SaCheckPermission("customer:info:export")
+    //@SaCheckPermission("customer:info:export")
     @Log(title = "供应商信息", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(SupplierInfoBo bo, HttpServletResponse response) {
@@ -117,7 +117,7 @@ public class SupplierInfoController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("customer:info:query")
+    //@SaCheckPermission("customer:info:query")
     @GetMapping("/{id}")
     public R<SupplierInfoVo> getInfo(@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) throws JsonProcessingException {
@@ -127,7 +127,7 @@ public class SupplierInfoController extends BaseController {
     /**
      * 新增供应商信息
      */
-    @SaCheckPermission("customer:info:add")
+    //@SaCheckPermission("customer:info:add")
     @Log(title = "供应商信息", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -138,7 +138,7 @@ public class SupplierInfoController extends BaseController {
     /**
      * 修改供应商信息
      */
-    @SaCheckPermission("customer:info:edit")
+    //@SaCheckPermission("customer:info:edit")
     @Log(title = "供应商信息", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -151,7 +151,7 @@ public class SupplierInfoController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("customer:info:remove")
+    //@SaCheckPermission("customer:info:remove")
     @Log(title = "供应商信息", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 73 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemoteErpCustomerServiceImpl.java

@@ -0,0 +1,73 @@
+package org.dromara.customer.dubbo;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.customer.api.RemoteErpCustomerService;
+import org.dromara.customer.api.erp.domain.*;
+import org.dromara.customer.service.IEnterpriseScaleService;
+import org.dromara.customer.service.IIndustryCategoryService;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * @author
+ * @date 2026/1/23 下午7:42
+ */
+@Service
+@RequiredArgsConstructor
+@DubboService
+public class RemoteErpCustomerServiceImpl implements RemoteErpCustomerService {
+
+    //企业规模服务
+    private final IEnterpriseScaleService enterpriseScaleService;
+    //行业类别服务
+    private final IIndustryCategoryService industryCategoryService;
+
+
+
+
+    /**
+     * 同步企业规模
+     *
+     * @param companyScale
+     */
+    @Override
+    public Boolean syncCompanyScale(ErpCompanyScaleData companyScale) {
+        return null;
+    }
+
+    /**
+     * 删除企业规模
+     *
+     * @param companyScale
+     */
+    @Override
+    public Boolean deleteCompanyScale(ErpCompanyScaleData companyScale) {
+        return null;
+    }
+
+
+
+
+
+    /**
+     * 同步行业类别
+     *
+     * @param industry
+     */
+    @Override
+    public Boolean syncIndustry(ErpIndustryData industry) {
+        return null;
+    }
+
+    /**
+     * 删除行业类别
+     *
+     * @param industry
+     */
+    @Override
+    public Boolean deleteIndustry(ErpIndustryData industry) {
+        return null;
+    }
+}

+ 580 - 6
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/erp/ErpPullController.java

@@ -1,15 +1,28 @@
 package org.dromara.external.controller.erp;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.io.FileUtil;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.common.core.domain.R;
-import org.dromara.external.api.erp.domain.ErpCompany;
+import org.dromara.customer.api.RemoteErpCustomerService;
+import org.dromara.external.api.erp.domain.*;
+import org.dromara.product.api.RemoteErpProductService;
+import org.dromara.system.api.RemoteErpSystemService;
+import org.dromara.system.api.erp.domain.ErpCompanyData;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.dromara.product.api.erp.domain.*;
+import org.dromara.system.api.erp.domain.*;
+import org.dromara.customer.api.erp.domain.*;
 
+import java.io.File;
 import java.util.Map;
 
 /**
+ * ERP数据拉取控制器
  * @author
  * @date 2026/1/15 下午2:38
  */
@@ -17,11 +30,18 @@ import java.util.Map;
 @RequiredArgsConstructor
 @RestController
 @RequestMapping("/erp")
+@Slf4j
 public class ErpPullController {
 
-    /**
-    * 同步公司数据(供应商)
-    * */
+    @DubboReference
+    private RemoteErpCustomerService remoteErpCustomerService;
+
+    @DubboReference
+    private RemoteErpProductService remoteErpProductService;
+
+    @DubboReference
+    private RemoteErpSystemService remoteErpSystemService;
+
     @PostMapping()
     public R<Void> erp(@RequestParam String type, @RequestBody Map<String,Object> map){
         if("syncCompany".equals(type)){
@@ -35,13 +55,16 @@ public class ErpPullController {
         return R.ok();
     }
 
+    // ==================== 公司主数据 ====================
 
     /**
     * 同步公司数据
     * */
     @PostMapping("/syncCompany")
     public R<Void> syncCompany(@RequestBody ErpCompany company){
-        System.out.println(company);
+        log.info("同步公司数据: " + company);
+        ErpCompanyData bean = BeanUtil.toBean(company.getComCo(), ErpCompanyData.class);
+        remoteErpSystemService.syncCompany(bean);
         return R.ok();
     }
 
@@ -51,7 +74,558 @@ public class ErpPullController {
     @PostMapping("/deleteCompany")
     public R<Void> deleteCompany(@RequestBody ErpCompany company){
         String coId = company.getComCo().getCoId();
-        System.out.println(coId);
+        log.info("删除公司数据: " + coId);
+        ErpCompanyData bean = BeanUtil.toBean(company.getComCo(), ErpCompanyData.class);
+        remoteErpSystemService.deleteCompany(bean);
+        return R.ok();
+    }
+
+    // ==================== 产品类别 ====================
+
+    /**
+    * 产品类别设定
+    * */
+    @PostMapping("/syncProductCategory")
+    public R<Void> syncProductCategory(@RequestBody ErpProductCategory category){
+        log.info("同步产品类别: " + category);
+        ErpProductCategoryData bean = BeanUtil.toBean(category.getComProdCatg(), ErpProductCategoryData.class);
+        remoteErpProductService.syncErpCategory(bean);
+        return R.ok();
+    }
+
+    /**
+    * 产品类别删除
+    * */
+    @PostMapping("/deleteProductCategory")
+    public R<Void> deleteProductCategory(@RequestBody ErpProductCategory category){
+        String categoryId = category.getComProdCatg().getProdCatgId();
+        log.info("删除产品类别: " + categoryId);
+        ErpProductCategoryData bean = BeanUtil.toBean(category.getComProdCatg(), ErpProductCategoryData.class);
+        remoteErpProductService.deleteErpCategory(bean);
+        return R.ok();
+    }
+
+    // ==================== 人员资料 ====================
+
+    /**
+    * 人员资料设定
+    * */
+    @PostMapping("/syncPerson")
+    public R<Void> syncPerson(@RequestBody ErpPerson person){
+        log.info("同步人员资料: " + person);
+        remoteErpSystemService.syncPerson(BeanUtil.toBean(person, ErpPersonData.class));
+        return R.ok();
+    }
+
+    /**
+    * 人员删除
+    * */
+    @PostMapping("/deletePerson")
+    public R<Void> deletePerson(@RequestBody ErpPerson person){
+        String perId = person.getComPerDt().getPerId();
+        log.info("删除人员: " + perId);
+        remoteErpSystemService.deletePerson(BeanUtil.toBean(person, ErpPersonData.class));
+        return R.ok();
+    }
+
+    // ==================== 仓库设定 ====================
+
+    /**
+    * 仓库设定
+    * */
+    @PostMapping("/syncWarehouse")
+    public R<Void> syncWarehouse(@RequestBody ErpWarehouse warehouse){
+        log.info("同步仓库: " + warehouse);
+        remoteErpSystemService.syncWarehouse(BeanUtil.toBean(warehouse, ErpWarehouseData.class));
+        return R.ok();
+    }
+
+    /**
+    * 仓库删除
+    * */
+    @PostMapping("/deleteWarehouse")
+    public R<Void> deleteWarehouse(@RequestBody ErpWarehouse warehouse){
+        String whsId = warehouse.getComWhs().getWhsId();
+        log.info("删除仓库: " + whsId);
+        remoteErpSystemService.deleteWarehouse(BeanUtil.toBean(warehouse, ErpWarehouseData.class));
+        return R.ok();
+    }
+
+    // ==================== 企业规模 ====================
+
+    /**
+    * 企业规模设定
+    * */
+    @PostMapping("/syncCompanyScale")
+    public R<Void> syncCompanyScale(@RequestBody ErpCompanyScale companyScale){
+        log.info("同步企业规模: " + companyScale);
+        remoteErpCustomerService.syncCompanyScale(BeanUtil.toBean(companyScale, ErpCompanyScaleData.class));
+        return R.ok();
+    }
+
+    /**
+    * 企业规模删除
+    * */
+    @PostMapping("/deleteCompanyScale")
+    public R<Void> deleteCompanyScale(@RequestBody ErpCompanyScale companyScale){
+        log.info("删除企业规模: " + companyScale);
+        remoteErpCustomerService.deleteCompanyScale(BeanUtil.toBean(companyScale, ErpCompanyScaleData.class));
+        return R.ok();
+    }
+
+    // ==================== 供应商类别 ====================
+
+    /**
+    * 供应商类别设定
+    * */
+    @PostMapping("/syncSupplierType")
+    public R<Void> syncSupplierType(@RequestBody ErpSupplierType supplierType){
+        log.info("同步供应商类别: " + supplierType);
+        remoteErpSystemService.syncSupplierType(BeanUtil.toBean(supplierType, ErpSupplierTypeData.class));
+        return R.ok();
+    }
+
+    /**
+    * 供应商类别删除
+    * */
+    @PostMapping("/deleteSupplierType")
+    public R<Void> deleteSupplierType(@RequestBody ErpSupplierType supplierType){
+        log.info("删除供应商类别: " + supplierType);
+        remoteErpSystemService.deleteSupplierType(BeanUtil.toBean(supplierType, ErpSupplierTypeData.class));
+        return R.ok();
+    }
+
+    // ==================== 出库配送信息 ====================
+
+    /**
+    * 出库配送信息(未对接)
+    * */
+    @PostMapping("/syncSalesDelivery")
+    public R<Void> syncSalesDelivery(@RequestBody ErpSalesDelivery salesDelivery){
+//        log.info("同步出库配送信息: " + salesDelivery);
+//        remoteErpCustomerService.syncSalesDelivery(BeanUtil.beanToMap(salesDelivery));
+        return R.ok();
+    }
+
+    // ==================== 区县主数据 ====================
+
+    /**
+    * 区县主数据设定
+    * */
+    @PostMapping("/syncDistrict")
+    public R<Void> syncDistrict(@RequestBody ErpDistrict district){
+        log.info("同步区县主数据: " + district);
+        remoteErpSystemService.syncDistrict(BeanUtil.toBean(district, ErpDistrictData.class));
+        return R.ok();
+    }
+
+    /**
+    * 区县主数据删除
+    * */
+    @PostMapping("/deleteDistrict")
+    public R<Void> deleteDistrict(@RequestBody ErpDistrict district){
+        String districtId = district.getComDistrict().getDistrictId();
+        log.info("删除区县: " + districtId);
+        remoteErpSystemService.deleteDistrict(BeanUtil.toBean(district, ErpDistrictData.class));
+        return R.ok();
+    }
+
+    // ==================== 品牌资料 ====================
+
+    /**
+    * 品牌资料设定
+    * */
+    @PostMapping("/syncBrand")
+    public R<Void> syncBrand(@RequestBody ErpBrand brand){
+        log.info("同步品牌资料: " + brand);
+        remoteErpProductService.syncErpBrand(BeanUtil.toBean(brand, ErpBrandData.class));
+        return R.ok();
+    }
+
+    /**
+    * 品牌删除
+    * */
+    @PostMapping("/deleteBrand")
+    public R<Void> deleteBrand(@RequestBody ErpBrand brand){
+        String brandId = brand.getComTradMrkDt().getTradMrkId();
+        log.info("删除品牌: " + brandId);
+        remoteErpProductService.deleteErpBrand(BeanUtil.toBean(brand, ErpBrandData.class));
+        return R.ok();
+    }
+
+    // ==================== 国家地区 ====================
+
+    /**
+    * 国家地区设定
+    * */
+    @PostMapping("/syncCountry")
+    public R<Void> syncCountry(@RequestBody ErpCountry country){
+        log.info("同步国家地区: " + country);
+        remoteErpSystemService.syncCountry(BeanUtil.toBean(country, ErpCountryData.class));
+        return R.ok();
+    }
+
+    /**
+    * 国家删除
+    * */
+    @PostMapping("/deleteCountry")
+    public R<Void> deleteCountry(@RequestBody ErpCountry country){
+        log.info("删除国家: " + country);
+        remoteErpSystemService.deleteCountry(BeanUtil.toBean(country, ErpCountryData.class));
+        return R.ok();
+    }
+
+    // ==================== 城市设定 ====================
+
+    /**
+    * 城市设定
+    * */
+    @PostMapping("/syncCity")
+    public R<Void> syncCity(@RequestBody ErpCity city){
+        log.info("同步城市: " + city);
+        remoteErpSystemService.syncCity(BeanUtil.toBean(city, ErpCityData.class));
+        return R.ok();
+    }
+
+    /**
+    * 城市设定删除
+    * */
+    @PostMapping("/deleteCity")
+    public R<Void> deleteCity(@RequestBody ErpCity city){
+        log.info("删除城市: " + city);
+        remoteErpSystemService.deleteCity(BeanUtil.toBean(city, ErpCityData.class));
+        return R.ok();
+    }
+
+    // ==================== 客户等级 ====================
+
+    /**
+    * 客户等级设定
+    * */
+    @PostMapping("/syncCustomerGrade")
+    public R<Void> syncCustomerGrade(@RequestBody ErpCustomerGrade customerGrade){
+        log.info("同步客户等级: " + customerGrade);
+        remoteErpSystemService.syncCustomerGrade(BeanUtil.toBean(customerGrade, ErpCustomerGradeData.class));
+        return R.ok();
+    }
+
+    /**
+    * 客户等级删除
+    * */
+    @PostMapping("/deleteCustomerGrade")
+    public R<Void> deleteCustomerGrade(@RequestBody ErpCustomerGrade customerGrade){
+        log.info("删除客户等级: " + customerGrade);
+        remoteErpSystemService.deleteCustomerGrade(BeanUtil.toBean(customerGrade, ErpCustomerGradeData.class));
+        return R.ok();
+    }
+
+    // ==================== 客户类别 ====================
+
+    /**
+    * 客户类别设定
+    * */
+    @PostMapping("/syncCustomerType")
+    public R<Void> syncCustomerType(@RequestBody ErpCustomerType customerType){
+        log.info("同步客户类别: " + customerType);
+        remoteErpSystemService.syncCustomerType(BeanUtil.toBean(customerType, ErpCustomerTypeData.class));
+        return R.ok();
+    }
+
+    /**
+    * 客户类别删除
+    * */
+    @PostMapping("/deleteCustomerType")
+    public R<Void> deleteCustomerType(@RequestBody ErpCustomerType customerType){
+
+        log.info("删除客户类别: " + customerType);
+        remoteErpSystemService.deleteCustomerType(BeanUtil.toBean(customerType, ErpCustomerTypeData.class));
+        return R.ok();
+    }
+
+    // ==================== 客户资料 ====================
+
+    /**
+     * 未对接
+    * 客户资料-收款条件异动
+    * */
+    @PostMapping("/syncCustomer")
+    public R<Void> syncCustomer(@RequestBody ErpCustomer customer){
+        log.info("同步客户资料: " + customer);
+        return R.ok();
+    }
+
+    // ==================== 岗位设定 ====================
+
+    /**
+    * 岗位设定
+    * */
+    @PostMapping("/syncPosition")
+    public R<Void> syncPosition(@RequestBody ErpPosition position){
+        log.info("同步岗位: " + position);
+        remoteErpSystemService.syncPosition(BeanUtil.toBean(position, ErpPositionData.class));
+        return R.ok();
+    }
+
+    /**
+    * 岗位删除
+    * */
+    @PostMapping("/deletePosition")
+    public R<Void> deletePosition(@RequestBody ErpPosition position){
+        String potId = position.getComPot().getPotId();
+        log.info("删除岗位: " + potId);
+        remoteErpSystemService.deletePosition(BeanUtil.toBean(position, ErpPositionData.class   ));
+        return R.ok();
+    }
+
+    // ==================== 快递主数据 ====================
+
+    /**
+    * 快递主数据设定
+    * */
+    @PostMapping("/syncExpress")
+    public R<Void> syncExpress(@RequestBody ErpExpress express){
+        log.info("同步快递: " + express);
+        remoteErpSystemService.syncExpress(BeanUtil.toBean(express, ErpExpressData.class));
+        return R.ok();
+    }
+
+    /**
+    * 快递删除
+    * */
+    @PostMapping("/deleteExpress")
+    public R<Void> deleteExpress(@RequestBody ErpExpress express){
+        log.info("删除快递: " + express);
+        remoteErpSystemService.deleteExpress(BeanUtil.toBean(express, ErpExpressData.class));
+        return R.ok();
+    }
+
+    // ==================== 收入费用设定 ====================
+
+    /**
+    * 收入费用设定
+    * */
+    @PostMapping("/syncIncomeExpenseType")
+    public R<Void> syncIncomeExpenseType(@RequestBody ErpIncomeExpenseType incomeExpenseType){
+        log.info("同步收入费用类型: " + incomeExpenseType);
+        remoteErpSystemService.syncIncomeExpense(BeanUtil.toBean(incomeExpenseType, ErpIncomeExpenseTypeData.class));
+        return R.ok();
+    }
+
+    /**
+    * 收入费用设定删除
+    * */
+    @PostMapping("/deleteIncomeExpenseType")
+    public R<Void> deleteIncomeExpenseType(@RequestBody ErpIncomeExpenseType incomeExpenseType){
+        log.info("删除收入费用类型: " + incomeExpenseType);
+        remoteErpSystemService.deleteIncomeExpense(BeanUtil.toBean(incomeExpenseType, ErpIncomeExpenseTypeData.class));
+        return R.ok();
+    }
+
+    // ==================== 收入转确认 ====================
+
+    /**
+    * 收入转确认
+    * */
+    @PostMapping("/confirmIncome")
+    public R<Void> confirmIncome(@RequestBody ErpIncomeApplication incomeApplication){
+        log.info("确认收入: " +  incomeApplication);
+        return R.ok();
+    }
+
+    // ==================== 省份设定 ====================
+
+    /**
+    * 省份设定
+    * */
+    @PostMapping("/syncProvince")
+    public R<Void> syncProvince(@RequestBody ErpProvince province){
+        log.info("同步省份: " + province);
+        remoteErpSystemService.syncProvince(BeanUtil.toBean(province, ErpProvinceData.class));
+        return R.ok();
+    }
+
+    /**
+    * 省份设定删除
+    * */
+    @PostMapping("/deleteProvince")
+    public R<Void> deleteProvince(@RequestBody ErpProvince province){
+        log.info("删除省份: " + province);
+        remoteErpSystemService.deleteProvince(BeanUtil.toBean(province, ErpProvinceData.class));
+        return R.ok();
+    }
+
+    // ==================== 税码设定 ====================
+
+    /**
+    * 税码设定
+    * */
+    @PostMapping("/syncTaxCode")
+    public R<Void> syncTaxCode(@RequestBody ErpTaxCode taxCode){
+        remoteErpSystemService.syncTaxCode(BeanUtil.toBean(taxCode, ErpTaxCodeData.class));
+        return R.ok();
+    }
+
+    /**
+    * 税码删除
+    * */
+    @PostMapping("/deleteTaxCode")
+    public R<Void> deleteTaxCode(@RequestBody ErpTaxCode taxCode){
+        log.info("删除税码: " + taxCode);
+        remoteErpSystemService.deleteTaxCode(BeanUtil.toBean(taxCode, ErpTaxCodeData.class));
+        return R.ok();
+    }
+
+    // ==================== 行业别 ====================
+
+    /**
+    * 行业别设定
+    * */
+    @PostMapping("/syncIndustry")
+    public R<Void> syncIndustry(@RequestBody ErpIndustry industry){
+        log.info("同步行业: " + industry);
+        remoteErpCustomerService.syncIndustry(BeanUtil.toBean(industry, ErpIndustryData.class));
+        return R.ok();
+    }
+
+    /**
+    * 行业别删除
+    * */
+    @PostMapping("/deleteIndustry")
+    public R<Void> deleteIndustry(@RequestBody ErpIndustry industry){
+        log.info("删除行业: " + industry);
+        remoteErpCustomerService.deleteIndustry(BeanUtil.toBean(industry, ErpIndustryData.class));
+        return R.ok();
+    }
+
+    // ==================== 计量单位设定 ====================
+
+    /**
+    * 计量单位设定
+    * */
+    @PostMapping("/syncUnit")
+    public R<Void> syncUnit(@RequestBody ErpUnit unit){
+        System.out.println(unit);
+        log.info("同步计量单位: " + unit);
+        remoteErpProductService.syncErpUnit(BeanUtil.toBean(unit, ErpUnitData.class));
+        return R.ok();
+    }
+
+    /**
+    * 计量单位设定删除
+    * */
+    @PostMapping("/deleteUnit")
+    public R<Void> deleteUnit(@RequestBody ErpUnit unit){
+        log.info("删除计量单位: " + unit);
+        remoteErpProductService.deleteErpUnit(BeanUtil.toBean(unit, ErpUnitData.class));
+        return R.ok();
+    }
+
+    // ==================== 订单出库状态变更 ====================
+
+    /**
+     * 未对接
+    * 订单出库状态变更
+    * */
+    @PostMapping("/updateSalesOrderStatus")
+    public R<Void> updateSalesOrderStatus(@RequestBody ErpSalesOrder salesOrder){
+        log.info("更新销售订单状态: " + salesOrder);
+        return R.ok();
+    }
+
+    // ==================== 费用转确认 ====================
+
+    /**
+     * 未对接
+    * 费用转确认
+    * */
+    @PostMapping("/confirmExpense")
+    public R<Void> confirmExpense(@RequestBody ErpExpense expense){
+        log.info("确认费用: " + expense);
+        return R.ok();
+    }
+
+    // ==================== 部门设定 ====================
+
+    /**
+    * 部门设定
+    * */
+    @PostMapping("/syncDepartment")
+    public R<Void> syncDepartment(@RequestBody ErpDepartment department){
+        remoteErpSystemService.syncDepartment(BeanUtil.toBean(department, ErpDepartmentData.class));
+        return R.ok();
+    }
+
+    /**
+    * 部门删除
+    * */
+    @PostMapping("/deleteDepartment")
+    public R<Void> deleteDepartment(@RequestBody ErpDepartment department){
+        String deptId = department.getComDept().getDeptId();
+        log.info("删除部门: " + deptId);
+        remoteErpSystemService.deleteDepartment(BeanUtil.toBean(department, ErpDepartmentData.class));
+        return R.ok();
+    }
+
+    // ==================== 银行设定 ====================
+
+    /**
+    * 银行设定
+    * */
+    @PostMapping("/syncBank")
+    public R<Void> syncBank(@RequestBody ErpBank bank){
+        log.info("同步银行: " + bank);
+        remoteErpSystemService.syncBank(BeanUtil.toBean(bank, ErpBankData.class));
+        return R.ok();
+    }
+
+    /**
+    * 银行删除
+    * */
+    @PostMapping("/deleteBank")
+    public R<Void> deleteBank(@RequestBody ErpBank bank){
+        log.info("删除银行: " + bank);
+        remoteErpSystemService.deleteBank(BeanUtil.toBean(bank, ErpBankData.class));
+        return R.ok();
+    }
+
+    // ==================== 销售价格清单 ====================
+
+    /**
+    * 销售价格清单-产品
+    * */
+    @PostMapping("/syncSalesPriceList")
+    public R<Void> syncSalesPriceList(@RequestBody ErpSalesPriceList salesPriceList){
+        log.info("同步销售价格清单: " + salesPriceList);
+        return R.ok();
+    }
+
+    /**
+    * 销售价格清单-客户产品 未对接
+    * */
+    @PostMapping("/syncCustomerSalesPriceList")
+    public R<Void> syncCustomerSalesPriceList(@RequestBody ErpCustomerSalesPriceList customerSalesPriceList){
+        log.info("同步客户销售价格清单: " + customerSalesPriceList);
+
+        return R.ok();
+    }
+
+    /**
+    * 销售价格清单删除 未对接
+    * */
+    @PostMapping("/deleteSalesPriceList")
+    public R<Void> deleteSalesPriceList(@RequestBody ErpSalesPriceList salesPriceList){
+        log.info("删除销售价格清单: " + salesPriceList);
+        return R.ok();
+    }
+
+    // ==================== 销售退货入库 ====================
+
+    /**
+    * 销售退货入库  未对接
+    * */
+    @PostMapping("/syncSalesReturnApplication")
+    public R<Void> syncSalesReturnApplication(@RequestBody ErpSalesReturnApplication salesReturnApplication){
+        log.info("同步销售退货入库: " + salesReturnApplication);
         return R.ok();
     }
 }

+ 105 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteErpProductServiceImpl.java

@@ -0,0 +1,105 @@
+package org.dromara.product.dubbo;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.product.api.RemoteErpProductService;
+import org.dromara.product.api.erp.domain.*;
+import org.dromara.product.service.IProductBaseService;
+import org.dromara.product.service.IProductBrandService;
+import org.dromara.product.service.IProductCategoryService;
+import org.dromara.product.service.IProductUnitService;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * erp商品服务
+ * @author
+ * @date 2026/1/23 下午6:16
+ */
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemoteErpProductServiceImpl implements RemoteErpProductService {
+
+    //商品分类服务
+    private final IProductCategoryService productCategoryService;
+    //商品品牌服务
+    private final IProductBrandService productBrandService;
+    //商品计量单位服务
+    private final IProductUnitService productUnitService;
+    //商品服务
+    private final IProductBaseService productBaseService;
+
+
+    /**
+     * 同步erp商品品牌
+     *
+     * @param erpBrand
+     */
+    @Override
+    public Boolean syncErpBrand(ErpBrandData erpBrand) {
+        return null;
+    }
+
+    /**
+     * 删除erp商品品牌
+     *
+     * @param erpBrand
+     */
+    @Override
+    public Boolean deleteErpBrand(ErpBrandData erpBrand) {
+        return null;
+    }
+
+    /**
+     * 同步erp商品分类
+     *
+     * @param erpCategory
+     */
+    @Override
+    public Boolean syncErpCategory(ErpProductCategoryData erpCategory) {
+        return null;
+    }
+
+    /**
+     * 删除erp商品分类
+     *
+     * @param erpCategory
+     */
+    @Override
+    public Boolean deleteErpCategory(ErpProductCategoryData erpCategory) {
+        return null;
+    }
+
+    /**
+     * 同步计量单位
+     *
+     * @param erpUnit
+     */
+    @Override
+    public Boolean syncErpUnit(ErpUnitData erpUnit) {
+        return null;
+    }
+
+    /**
+     * 删除计量单位
+     *
+     * @param erpUnit
+     */
+    @Override
+    public Boolean deleteErpUnit(ErpUnitData erpUnit) {
+        return null;
+    }
+
+    /**
+     * 销售价格清单-产品
+     *
+     * @param salesPriceList
+     */
+    @Override
+    public Boolean syncSalesPriceList(Map<String, Object> salesPriceList) {
+        return null;
+    }
+}
+

+ 498 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteErpSystemServiceImpl.java

@@ -0,0 +1,498 @@
+package org.dromara.system.dubbo;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.system.api.RemoteErpSystemService;
+import org.dromara.system.api.erp.domain.*;
+import org.dromara.system.domain.*;
+import org.dromara.system.service.*;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+/**
+ * @author
+ * @date 2026/1/23 下午7:46
+ */
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemoteErpSystemServiceImpl implements RemoteErpSystemService {
+
+    //仓库服务
+    private final IComWarehouseService comWarehouseService;
+    //地址区域服务
+    private final ISysAddressAreaService sysAddressAreaService;
+    //公司服务
+    private final IComCompanyService comCompanyService;
+    //岗位服务
+    private final ISysPostService sysPostService;
+    //快递物流服务
+
+    //收入费用服务
+    private final IComRevenueExpenseService comRevenueExpenseService;
+
+    //银行服务
+    private final IComBankService comBankService;
+
+    //部门服务
+    private final ISysDeptService sysDeptService;
+
+    //人员资料服务
+    private final IComStaffService comStaffService;
+
+    //供应商类别服务
+    private final ISupplierTypeService supplierTypeService;
+    //客户等级服务
+    private final IComCustomerLevelService comCustomerLevelService;
+    //客户类型服务
+    private final IComCustomerTypeService comCustomerTypeService;
+
+
+    /**
+     * 同步人员资料
+     *
+     * @param person
+     */
+    @Override
+    public Boolean syncPerson(ErpPersonData person) {
+        //先查询是否存在数据
+        ComStaff comStaff = null;
+        ComStaff one = comStaffService.getOne(Wrappers.lambdaQuery(ComStaff.class)
+            .eq(ComStaff::getStaffCode, person.getPostId())
+        );
+        if (one != null) {
+            comStaff = one;
+        }
+        comStaff.setDataSource("A10");
+        comStaff.setStaffCode(person.getPostId());
+        comStaff.setStaffName(person.getPerNm());
+        comStaff.setDeptId(Long.valueOf(person.getDeptId()));
+        comStaff.setPhone(person.getPhone());
+        comStaff.setPostId(Long.valueOf(person.getPostId()));
+        comStaff.setSex(person.getSex());
+        comStaff.setValidFrom(DateUtil.date(person.getValidityFromDate()));
+        comStaff.setValidTo(DateUtil.date(person.getValidityToDate()));
+        return comStaffService.saveOrUpdate(comStaff);
+    }
+
+    /**
+     * 删除人员资料
+     *
+     * @param person
+     */
+    @Override
+    public Boolean deletePerson(ErpPersonData person) {
+        return comStaffService.remove(Wrappers.lambdaQuery(ComStaff.class).eq(ComStaff::getStaffCode, person.getPostId()));
+    }
+
+
+    /**
+     * 同步公司数据
+     *
+     * @param company
+     */
+    @Override
+    public Boolean syncCompany(ErpCompanyData company) {
+        ComCompany comCompany = comCompanyService.getOne(Wrappers.lambdaQuery(ComCompany.class)
+            .eq(ComCompany::getCompanyCode, company.getCoId())
+        );
+        if (comCompany == null) {
+            comCompany = new ComCompany();
+        }
+
+        comCompany.setDataSource("A10");
+        comCompany.setCompanyCode(company.getCoId());
+        comCompany.setCompanyName(company.getCoNm());
+        comCompany.setCompanyFullName(company.getCoFuNm());
+        comCompany.setAccBnId(Long.valueOf(company.getAccBnId()));
+        comCompany.setAccBnNo(company.getAccBnNo());
+        comCompany.setAddress(company.getAddress());
+        comCompany.setBegDate(DateUtil.date(company.getBegDa()));
+        comCompany.setBusScp(company.getBusScp());
+        comCompany.setCapAmt(BigDecimal.valueOf(company.getCapAmt()));
+        comCompany.setCorporation(company.getCorporation());
+        comCompany.setEmail(company.getEMail());
+        comCompany.setEndDate(DateUtil.date(company.getEndDa()));
+        comCompany.setFoundDate(DateUtil.date(company.getFoundDa()));
+        comCompany.setInCustId(company.getInCustId());
+        comCompany.setInSupId(company.getInSupId());
+        comCompany.setLelPer(company.getLelPer());
+        comCompany.setPhone(company.getPhone());
+        comCompany.setPrincipal(company.getPrincipal());
+        comCompany.setRegAddr(company.getRegAddr());
+        comCompany.setRegDate(DateUtil.date(company.getRegDa()));
+        comCompany.setRegOrg(company.getRegOrg());
+        comCompany.setTaxNo(company.getTaxNo());
+
+        return comCompanyService.saveOrUpdate(comCompany);
+    }
+
+    /**
+     * 删除公司数据
+     *
+     * @param company
+     */
+    @Override
+    public Boolean deleteCompany(ErpCompanyData company) {
+        return comCompanyService.remove(Wrappers.lambdaQuery(ComCompany.class)
+            .eq(ComCompany::getCompanyCode, company.getCoId()));
+    }
+
+    /**
+     * 同步仓库数据
+     *
+     * @param warehouse
+     */
+    @Override
+    public Boolean syncWarehouse(ErpWarehouseData warehouse) {
+        ComWarehouse comWarehouse = comWarehouseService.getOne(Wrappers.lambdaQuery(ComWarehouse.class)
+            .eq(ComWarehouse::getWarehouseCode, warehouse.getWhsId())
+        );
+        if (comWarehouse == null) {
+            comWarehouse = new ComWarehouse();
+        }
+
+        comWarehouse.setDataSource("A10");
+        comWarehouse.setWarehouseCode(warehouse.getWhsId());
+        comWarehouse.setWarehouseName(warehouse.getWhsNm());
+        comWarehouse.setStkStu(warehouse.getStkStu());
+        comWarehouse.setCompanyId(Long.valueOf(warehouse.getCoId()));
+
+        return comWarehouseService.saveOrUpdate(comWarehouse);
+    }
+
+    /**
+     * 删除仓库数据
+     *
+     * @param warehouse
+     */
+    @Override
+    public Boolean deleteWarehouse(ErpWarehouseData warehouse) {
+        return comWarehouseService.remove(Wrappers.lambdaQuery(ComWarehouse.class)
+            .eq(ComWarehouse::getWarehouseCode, warehouse.getWhsId()));
+    }
+
+    /**
+     * 同步区县数据
+     *
+     * @param district
+     */
+    @Override
+    public Boolean syncDistrict(ErpDistrictData district) {
+        SysAddressArea sysAddressArea = sysAddressAreaService.getOne(Wrappers.lambdaQuery(SysAddressArea.class)
+            .eq(SysAddressArea::getAreaCode, district.getDistrictId())
+        );
+        if (sysAddressArea == null) {
+            sysAddressArea = new SysAddressArea();
+        }
+
+        sysAddressArea.setDataSource("A10");
+        sysAddressArea.setAreaCode(district.getDistrictId());
+        sysAddressArea.setAreaName(district.getDistrictNm());
+        sysAddressArea.setParentCode(district.getCityId()); // 设置上级城市编码作为父级区域编码
+        sysAddressArea.setLevel(3L); // 区县层级为3
+
+        return sysAddressAreaService.saveOrUpdate(sysAddressArea);
+    }
+
+    /**
+     * 删除区县数据
+     *
+     * @param district
+     */
+    @Override
+    public Boolean deleteDistrict(ErpDistrictData district) {
+        return sysAddressAreaService.remove(Wrappers.lambdaQuery(SysAddressArea.class)
+            .eq(SysAddressArea::getAreaCode, district.getDistrictId()));
+    }
+
+    /**
+     * 同步国家数据
+     *
+     * @param country
+     */
+    @Override
+    public Boolean syncCountry(ErpCountryData country) {
+        SysAddressArea sysAddressArea = sysAddressAreaService.getOne(Wrappers.lambdaQuery(SysAddressArea.class)
+            .eq(SysAddressArea::getAreaCode, country.getCountryId())
+        );
+        if (sysAddressArea == null) {
+            sysAddressArea = new SysAddressArea();
+        }
+
+        sysAddressArea.setDataSource("A10");
+        sysAddressArea.setAreaCode(country.getCountryId());
+        sysAddressArea.setAreaName(country.getCountryName());
+        sysAddressArea.setParentCode(null); // 国家没有父级区域
+        sysAddressArea.setLevel(1L); // 国家层级为1
+
+        return sysAddressAreaService.saveOrUpdate(sysAddressArea);
+    }
+
+    /**
+     * 删除国家数据
+     *
+     * @param country
+     */
+    @Override
+    public Boolean deleteCountry(ErpCountryData country) {
+        return sysAddressAreaService.remove(Wrappers.lambdaQuery(SysAddressArea.class)
+            .eq(SysAddressArea::getAreaCode, country.getCountryId()));
+    }
+
+    /**
+     * 同步城市数据
+     *
+     * @param city
+     */
+    @Override
+    public Boolean syncCity(ErpCityData city) {
+        SysAddressArea sysAddressArea = sysAddressAreaService.getOne(Wrappers.lambdaQuery(SysAddressArea.class)
+            .eq(SysAddressArea::getAreaCode, city.getCityId())
+        );
+        if (sysAddressArea == null) {
+            sysAddressArea = new SysAddressArea();
+        }
+
+        sysAddressArea.setDataSource("A10");
+        sysAddressArea.setAreaCode(city.getCityId());
+        sysAddressArea.setAreaName(city.getCityNm());
+        sysAddressArea.setParentCode(city.getPrvnId()); // 设置上级省份编码作为父级区域编码
+        sysAddressArea.setLevel(2L); // 城市层级为2
+
+        return sysAddressAreaService.saveOrUpdate(sysAddressArea);
+    }
+
+    /**
+     * 删除城市数据
+     *
+     * @param city
+     */
+    @Override
+    public Boolean deleteCity(ErpCityData city) {
+        return sysAddressAreaService.remove(Wrappers.lambdaQuery(SysAddressArea.class)
+            .eq(SysAddressArea::getAreaCode, city.getCityId()));
+    }
+
+    /**
+     * 同步岗位数据
+     *
+     * @param position
+     */
+    @Override
+    public Boolean syncPosition(ErpPositionData position) {
+        // 使用lambda查询根据岗位编码查找
+        SysPost one = sysPostService.getOne(Wrappers.lambdaQuery(SysPost.class)
+            .eq(SysPost::getPostCode, position.getPotId()));
+        SysPost sysPost = null;
+        if (ObjectUtil.isNotEmpty(one)) {
+            // 如果找到了现有岗位,转换它
+            sysPost = one;
+        } else {
+            // 否则创建新岗位
+            sysPost = new SysPost();
+        }
+
+        sysPost.setPostCode(position.getPotId());
+        sysPost.setPostName(position.getPotNm());
+        sysPost.setStatus("0"); // 默认启用
+        return sysPostService.saveOrUpdate(sysPost);
+    }
+
+    /**
+     * 删除岗位数据
+     *
+     * @param position
+     */
+    @Override
+    public Boolean deletePosition(ErpPositionData position) {
+        // 根据ERP岗位ID查找并删除岗位
+        return sysPostService.remove(Wrappers.lambdaQuery(SysPost.class).eq(SysPost::getPostCode, position.getPotId()));
+    }
+
+    /**
+     * 同步快递物流公司数据
+     *
+     * @param express
+     */
+    @Override
+    public Boolean syncExpress(ErpExpressData express) {
+        return null;
+    }
+
+    /**
+     * 删除快递物流公司数据
+     *
+     * @param express
+     */
+    @Override
+    public Boolean deleteExpress(ErpExpressData express) {
+        return null;
+    }
+
+    /**
+     * 同步收入费用
+     *
+     * @param incomeExpense
+     */
+    @Override
+    public Boolean syncIncomeExpense(ErpIncomeExpenseTypeData incomeExpense) {
+        return null;
+    }
+
+    /**
+     * 删除收入费用类型
+     *
+     * @param incomeExpense
+     */
+    @Override
+    public Boolean deleteIncomeExpense(ErpIncomeExpenseTypeData incomeExpense) {
+        return null;
+    }
+
+    /**
+     * 同步省份
+     *
+     * @param province
+     */
+    @Override
+    public Boolean syncProvince(ErpProvinceData province) {
+        return null;
+    }
+
+    /**
+     * 删除省份
+     *
+     * @param province
+     */
+    @Override
+    public Boolean deleteProvince(ErpProvinceData province) {
+        return null;
+    }
+
+    /**
+     * 同步税码
+     *
+     * @param taxCode
+     */
+    @Override
+    public Boolean syncTaxCode(ErpTaxCodeData taxCode) {
+        return null;
+    }
+
+    /**
+     * 删除税码
+     *
+     * @param taxCode
+     */
+    @Override
+    public Boolean deleteTaxCode(ErpTaxCodeData taxCode) {
+        return null;
+    }
+
+    /**
+     * 同步部门
+     *
+     * @param department
+     */
+    @Override
+    public Boolean syncDepartment(ErpDepartmentData department) {
+        return null;
+    }
+
+    /**
+     * 删除部门
+     *
+     * @param department
+     */
+    @Override
+    public Boolean deleteDepartment(ErpDepartmentData department) {
+        return null;
+    }
+
+    /**
+     * 同步银行
+     *
+     * @param bank
+     */
+    @Override
+    public Boolean syncBank(ErpBankData bank) {
+        return null;
+    }
+
+    /**
+     * 删除银行
+     *
+     * @param bank
+     */
+    @Override
+    public Boolean deleteBank(ErpBankData bank) {
+        return null;
+    }
+
+    /**
+     * 同步供应商类别
+     *
+     * @param supplierType
+     */
+    @Override
+    public Boolean syncSupplierType(ErpSupplierTypeData supplierType) {
+        return null;
+    }
+
+    /**
+     * 删除供应商类别
+     *
+     * @param supplierType
+     */
+    @Override
+    public Boolean deleteSupplierType(ErpSupplierTypeData supplierType) {
+        return null;
+    }
+
+    /**
+     * 同步客户等级
+     *
+     * @param customerGrade
+     */
+    @Override
+    public Boolean syncCustomerGrade(ErpCustomerGradeData customerGrade) {
+        return null;
+    }
+
+    /**
+     * 删除客户等级
+     *
+     * @param customerGrade
+     */
+    @Override
+    public Boolean deleteCustomerGrade(ErpCustomerGradeData customerGrade) {
+        return null;
+    }
+
+    /**
+     * 同步客户类别
+     *
+     * @param customerType
+     */
+    @Override
+    public Boolean syncCustomerType(ErpCustomerTypeData customerType) {
+        return null;
+    }
+
+    /**
+     * 删除客户类别
+     *
+     * @param customerType
+     */
+    @Override
+    public Boolean deleteCustomerType(ErpCustomerTypeData customerType) {
+        return null;
+    }
+}

+ 3 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java

@@ -1,7 +1,9 @@
 package org.dromara.system.service;
 
+import com.baomidou.mybatisplus.extension.service.IService;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.system.domain.SysPost;
 import org.dromara.system.domain.bo.SysPostBo;
 import org.dromara.system.domain.vo.SysPostVo;
 
@@ -12,7 +14,7 @@ import java.util.List;
  *
  * @author Lion Li
  */
-public interface ISysPostService {
+public interface ISysPostService extends IService<SysPost> {
 
 
     TableDataInfo<SysPostVo> selectPagePostList(SysPostBo post, PageQuery pageQuery);

+ 2 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.constant.SystemConstants;
 import org.dromara.common.core.exception.ServiceException;
@@ -35,7 +36,7 @@ import java.util.Map;
  */
 @RequiredArgsConstructor
 @Service
-public class SysPostServiceImpl implements ISysPostService {
+public class SysPostServiceImpl extends ServiceImpl<SysPostMapper,SysPost > implements ISysPostService {
 
     private final SysPostMapper baseMapper;
     private final SysDeptMapper deptMapper;