فهرست منبع

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java
林小张 2 ماه پیش
والد
کامیت
a1d0662767
100فایلهای تغییر یافته به همراه3480 افزوده شده و 75 حذف شده
  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. 5 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteProductService.java
  34. 18 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/erp/domain/ErpBrandData.java
  35. 19 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/erp/domain/ErpProductCategoryData.java
  36. 18 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/erp/domain/ErpUnitData.java
  37. 165 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteErpSystemService.java
  38. 21 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpBankData.java
  39. 19 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCityData.java
  40. 39 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCompanyData.java
  41. 17 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCountryData.java
  42. 16 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCustomerGradeData.java
  43. 18 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpCustomerTypeData.java
  44. 24 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpDepartmentData.java
  45. 19 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpDistrictData.java
  46. 16 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpExpressData.java
  47. 19 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpIncomeExpenseTypeData.java
  48. 18 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpPersonData.java
  49. 17 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpPositionData.java
  50. 17 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpProvinceData.java
  51. 16 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpSupplierTypeData.java
  52. 18 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpTaxCodeData.java
  53. 18 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/erp/domain/ErpWarehouseData.java
  54. 4 0
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java
  55. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/QualificationFileController.java
  56. 1 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierAddressController.java
  57. 1 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierBankController.java
  58. 1 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierContactController.java
  59. 1 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierContractController.java
  60. 8 8
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierInfoController.java
  61. 79 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/QualificationFile.java
  62. 4 4
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SupplierBank.java
  63. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/authorData.java
  64. 66 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/QualificationFileBo.java
  65. 6 4
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SupplierAuthorizeBo.java
  66. 26 4
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SupplierBankBo.java
  67. 14 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SupplierInfoBo.java
  68. 83 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/QualificationFileVo.java
  69. 49 13
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/SupplierBankVo.java
  70. 73 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemoteErpCustomerServiceImpl.java
  71. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/QualificationFileMapper.java
  72. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IQualificationFileService.java
  73. 2 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplierAuthorizeService.java
  74. 3 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplierProcurementService.java
  75. 2 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplyAreaService.java
  76. 41 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CommonSupplierAuthorizeService.java
  77. 139 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/QualificationFileServiceImpl.java
  78. 11 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierAuthorizeServiceImpl.java
  79. 1 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierBankServiceImpl.java
  80. 3 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierContactServiceImpl.java
  81. 115 12
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierInfoServiceImpl.java
  82. 29 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierProcurementServiceImpl.java
  83. 41 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplyAreaServiceImpl.java
  84. 7 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/QualificationFileMapper.xml
  85. 5 0
      ruoyi-modules/ruoyi-external/pom.xml
  86. 580 6
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/erp/ErpPullController.java
  87. 17 0
      ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/RuoyiMallApplication.java
  88. 12 0
      ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/controller/NsDiyPageController.java
  89. 9 0
      ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/INsDiyPageService.java
  90. 194 16
      ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/impl/NsDiyPageServiceImpl.java
  91. 1 1
      ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/impl/NsDiyRouteServiceImpl.java
  92. 54 0
      ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/account_change_type.json
  93. 6 0
      ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/account_type.json
  94. 29 0
      ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/adminapp/app.json
  95. 7 0
      ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/adminapp/app_group.json
  96. 44 0
      ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/adminapp/stat.json
  97. 30 0
      ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/adminapp/todo.json
  98. 2 0
      ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/diy/adv_position.json
  99. 66 0
      ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/diy/bottom.json
  100. 59 0
      ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/diy/bottom_site.json

+ 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);
+}
+

+ 5 - 0
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteProductService.java

@@ -58,6 +58,11 @@ public interface RemoteProductService {
      */
     List<RemoteProductBrand> getProductByBrandId(List<Long> ids);
 
+    /**
+     * 根据可供货品牌名称获得id
+     */
+    Long getProductBrandIdByName(String name);
+
     /**
      * 获取品目列表
      */

+ 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;     // 名称
+}

+ 4 - 0
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java

@@ -90,6 +90,10 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "partner_contract",
         "partner_warehouse",
         "partner_qualification"
+        "address_area",
+        "supplier_",
+        "supply_area"
+
 
 
         // 注意:前缀匹配需特殊处理(如 qrtz_),见 isIgnoreTable 方法

+ 106 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/QualificationFileController.java

@@ -0,0 +1,106 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.customer.domain.vo.QualificationFileVo;
+import org.dromara.customer.domain.bo.QualificationFileBo;
+import org.dromara.customer.service.IQualificationFileService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 供应商授权信息文件
+ * 前端访问路由地址为:/customer/qualificationFile
+ *
+ * @author LionLi
+ * @date 2026-01-26
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/qualificationFile")
+public class QualificationFileController extends BaseController {
+
+    private final IQualificationFileService qualificationFileService;
+
+    /**
+     * 查询供应商授权信息文件列表
+     */
+    //@SaCheckPermission("customer:qualificationFile:list")
+    @GetMapping("/list")
+    public TableDataInfo<QualificationFileVo> list(QualificationFileBo bo, PageQuery pageQuery) {
+        return qualificationFileService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出供应商授权信息文件列表
+     */
+    //@SaCheckPermission("customer:qualificationFile:export")
+    @Log(title = "供应商授权信息文件", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(QualificationFileBo bo, HttpServletResponse response) {
+        List<QualificationFileVo> list = qualificationFileService.queryList(bo);
+        ExcelUtil.exportExcel(list, "供应商授权信息文件", QualificationFileVo.class, response);
+    }
+
+    /**
+     * 获取供应商授权信息文件详细信息
+     *
+     * @param id 主键
+     */
+    //@SaCheckPermission("customer:qualificationFile:query")
+    @GetMapping("/{id}")
+    public R<QualificationFileVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(qualificationFileService.queryById(id));
+    }
+
+    /**
+     * 新增供应商授权信息文件
+     */
+    //@SaCheckPermission("customer:qualificationFile:add")
+    @Log(title = "供应商授权信息文件", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody QualificationFileBo bo) {
+        return toAjax(qualificationFileService.insertByBo(bo));
+    }
+
+    /**
+     * 修改供应商授权信息文件
+     */
+    //@SaCheckPermission("customer:qualificationFile:edit")
+    @Log(title = "供应商授权信息文件", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody QualificationFileBo bo) {
+        return toAjax(qualificationFileService.updateByBo(bo));
+    }
+
+    /**
+     * 删除供应商授权信息文件
+     *
+     * @param ids 主键串
+     */
+    //@SaCheckPermission("customer:qualificationFile:remove")
+    @Log(title = "供应商授权信息文件", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(qualificationFileService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 1 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierAddressController.java

@@ -48,7 +48,7 @@ public class SupplierAddressController extends BaseController {
     /**
      * 查询供应商地址列表
      */
-    @SaCheckPermission("supplierAddress:supplieraddress:list")
+    //@SaCheckPermission("supplierAddress:supplieraddress:list")
     @GetMapping("/list")
     public TableDataInfo<SupplierAddressVo> list(SupplierAddressBo bo, PageQuery pageQuery) {
         return supplierAddressService.queryPageList(bo, pageQuery);

+ 1 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierBankController.java

@@ -70,7 +70,7 @@ public class SupplierBankController extends BaseController {
         return R.ok(supplierBankService.queryById(id));
     }
 
-    @SaCheckPermission("customer:bank:query")
+    //@SaCheckPermission("customer:bank:query")
     @GetMapping("/getBankBySupplierId")
     public R<List<SupplierBankVo>> getBankBySupplierId(@RequestParam Long id) {
         SupplierBankBo supplierBankBo = new SupplierBankBo();

+ 1 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierContactController.java

@@ -50,7 +50,7 @@ public class SupplierContactController extends BaseController {
     /**
      * 根据id获取业务联系人
      */
-    @SaCheckPermission("supplier:contact:list")
+//    @SaCheckPermission("supplier:contact:list")
     @GetMapping("/getSupplierContactlistById")
     public TableDataInfo<SupplierContactVo> getlistById(SupplierContactBo bo, PageQuery pageQuery) {
         return supplierContactService.queryPageListById(bo, pageQuery);

+ 1 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierContractController.java

@@ -71,7 +71,7 @@ public class SupplierContractController extends BaseController {
     /**
      * 根据supplierid查询合同列表
      */
-    @SaCheckPermission("supplier:contract:list")
+    //@SaCheckPermission("supplier:contract:list")
     @GetMapping("/supplierContractsById")
     public TableDataInfo<SupplierContractVo> supplierContractsById(SupplierContractBo bo, PageQuery pageQuery) {
         TableDataInfo<SupplierContractVo> supplierContracts = supplierContractService.queryContractsPageList(bo, pageQuery);

+ 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 = "主键不能为空")

+ 79 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/QualificationFile.java

@@ -0,0 +1,79 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 供应商授权信息文件对象 qualification_file
+ *
+ * @author LionLi
+ * @date 2026-01-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("qualification_file")
+public class QualificationFile extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 资质编号
+     */
+    private String authorizeNo;
+
+    /**
+     * 资质类型名称
+     */
+    private String name;
+
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+    /**
+     * 文件类型
+     */
+    private String fileType;
+
+    /**
+     * 文件上传路径
+     */
+    private String fileUrl;
+
+    /**
+     * 资质到期日期
+     */
+    private Date endTime;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 4 - 4
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SupplierBank.java

@@ -48,9 +48,9 @@ public class SupplierBank extends TenantEntity {
     private String bankNum;
 
     /**
-     * 银行信息编号(可能为内部系统编号)
+     * 银行信息Id
      */
-    private String bankInfoNo;
+    private Long bankInfoNo;
 
     /**
      * 银行名称
@@ -78,9 +78,9 @@ public class SupplierBank extends TenantEntity {
     private String phone;
 
     /**
-     * 发票类型编码
+     * 发票类型Id
      */
-    private String invoiceTypeNo;
+    private Long invoiceTypeNo;
 
     /**
      * 发票类型名称

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/authorData.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.domain;
+
+import lombok.Data;
+
+/**
+ * author
+ * 时间:2026/1/26,17:18
+ */
+@Data
+public class authorData {
+
+    private Long id;
+
+    private String brandLicensor;
+}

+ 66 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/QualificationFileBo.java

@@ -0,0 +1,66 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.QualificationFile;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 供应商授权信息文件业务对象 qualification_file
+ *
+ * @author LionLi
+ * @date 2026-01-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = QualificationFile.class, reverseConvertGenerate = false)
+public class QualificationFileBo extends BaseEntity {
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 资质编号
+     */
+    private String authorizeNo;
+
+    /**
+     * 资质类型名称
+     */
+    private String name;
+
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+    /**
+     * 文件类型
+     */
+    private String fileType;
+
+    /**
+     * 文件上传路径
+     */
+    private String fileUrl;
+
+    /**
+     * 资质到期日期
+     */
+    private Date endTime;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+
+}

+ 6 - 4
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SupplierAuthorizeBo.java

@@ -31,6 +31,11 @@ public class SupplierAuthorizeBo extends BaseEntity {
      */
     private String supplierNo;
 
+    /**
+     * 可供应品牌
+     */
+    private String supplyBrand;
+
     /**
      * 供应商ID
      */
@@ -51,10 +56,7 @@ public class SupplierAuthorizeBo extends BaseEntity {
      */
     private String supplyProCate;
 
-    /**
-     * 可供货品牌
-     */
-    private String supplyBrand;
+
 
     /**
      * 授权单编号

+ 26 - 4
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SupplierBankBo.java

@@ -1,5 +1,6 @@
 package org.dromara.customer.domain.bo;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import org.dromara.customer.domain.SupplierBank;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.core.validate.AddGroup;
@@ -43,9 +44,9 @@ public class SupplierBankBo extends BaseEntity {
     private String bankNum;
 
     /**
-     * 银行信息编号(可能为内部系统编号)
+     * 银行信息Id
      */
-    private String bankInfoNo;
+    private Long bankInfoNo;
 
     /**
      * 银行名称
@@ -73,14 +74,35 @@ public class SupplierBankBo extends BaseEntity {
     private String phone;
 
     /**
-     * 发票类型编码
+     * 发票类型Id
      */
-    private String invoiceTypeNo;
+    private Long invoiceTypeNo;
 
     /**
      * 发票类型名称
      */
     private String invoiceTypeName;
 
+    /**
+     * 推送状态(例如:0-未推送, 1-已推送, 16-推送失败)
+     */
+    private String pushStatus;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
 
 }

+ 14 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SupplierInfoBo.java

@@ -47,6 +47,15 @@ public class SupplierInfoBo extends BaseEntity {
     //@NotBlank(message = "人员规模不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long membershipSize;
 
+    /**
+     * 产品经理Id
+     */
+    private Long productManager;
+
+    /**
+     * 采购人员Id
+     */
+    private Long buyer;
     /**
      * 供应商类型
      */
@@ -363,4 +372,9 @@ public class SupplierInfoBo extends BaseEntity {
     private Long cooperative;
 
 
+    private String province;
+
+    private String city;
+
+
 }

+ 83 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/QualificationFileVo.java

@@ -0,0 +1,83 @@
+package org.dromara.customer.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.customer.domain.QualificationFile;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 供应商授权信息文件视图对象 qualification_file
+ *
+ * @author LionLi
+ * @date 2026-01-26
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = QualificationFile.class)
+public class QualificationFileVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @ExcelProperty(value = "id")
+    private Long id;
+
+    /**
+     * 资质编号
+     */
+    @ExcelProperty(value = "资质编号")
+    private String authorizeNo;
+
+    /**
+     * 资质类型名称
+     */
+    @ExcelProperty(value = "资质类型名称")
+    private String name;
+
+    /**
+     * 文件名称
+     */
+    @ExcelProperty(value = "文件名称")
+    private String fileName;
+
+    /**
+     * 文件类型
+     */
+    @ExcelProperty(value = "文件类型")
+    private String fileType;
+
+    /**
+     * 文件上传路径
+     */
+    @ExcelProperty(value = "文件上传路径")
+    private String fileUrl;
+
+    /**
+     * 资质到期日期
+     */
+    @ExcelProperty(value = "资质到期日期")
+    private Date endTime;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+}

+ 49 - 13
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/SupplierBankVo.java

@@ -1,5 +1,6 @@
 package org.dromara.customer.domain.vo;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import org.dromara.customer.domain.SupplierBank;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
@@ -28,53 +29,88 @@ public class SupplierBankVo implements Serializable {
     @Serial
     private static final long serialVersionUID = 1L;
 
-    /**
-     * 主键
-     */
     private Long id;
 
     /**
      * 账户序号
      */
-    @ExcelProperty(value = "账户序号")
     private Long num;
 
     /**
      * 供应商编号
      */
-    @ExcelProperty(value = "供应商编号")
     private String supplierNo;
 
     /**
      * 供应商ID
      */
-    @ExcelProperty(value = "供应商ID")
     private Long supplierId;
 
     /**
      * 银行行号
      */
-    @ExcelProperty(value = "银行行号")
     private String bankNum;
 
     /**
-     * 银行信息编号(可能为内部系统编号)
+     * 银行信息Id
      */
-    @ExcelProperty(value = "银行信息编号", converter = ExcelDictConvert.class)
-    @ExcelDictFormat(readConverterExp = "可=能为内部系统编号")
-    private String bankInfoNo;
+    private Long bankInfoNo;
 
     /**
      * 银行名称
      */
-    @ExcelProperty(value = "银行名称")
     private String bankName;
 
     /**
      * 银行账号
      */
-    @ExcelProperty(value = "银行账号")
     private String bankNo;
 
+    /**
+     * 账户有效性标识(1-有效, 0-无效)
+     */
+    private String isture;
+
+    /**
+     * 账户户名
+     */
+    private String circlesName;
+
+    /**
+     * 账户预留电话
+     */
+    private String phone;
+
+    /**
+     * 发票类型Id
+     */
+    private Long invoiceTypeNo;
+
+    /**
+     * 发票类型名称
+     */
+    private String invoiceTypeName;
+
+    /**
+     * 推送状态(例如:0-未推送, 1-已推送, 16-推送失败)
+     */
+    private String pushStatus;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
 
 }

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

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/QualificationFileMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.QualificationFile;
+import org.dromara.customer.domain.vo.QualificationFileVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 供应商授权信息文件Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-01-26
+ */
+public interface QualificationFileMapper extends BaseMapperPlus<QualificationFile, QualificationFileVo> {
+
+}

+ 70 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IQualificationFileService.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.QualificationFile;
+import org.dromara.customer.domain.vo.QualificationFileVo;
+import org.dromara.customer.domain.bo.QualificationFileBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 供应商授权信息文件Service接口
+ *
+ * @author LionLi
+ * @date 2026-01-26
+ */
+public interface IQualificationFileService extends IService<QualificationFile>{
+
+    /**
+     * 查询供应商授权信息文件
+     *
+     * @param id 主键
+     * @return 供应商授权信息文件
+     */
+    QualificationFileVo queryById(Long id);
+
+    /**
+     * 分页查询供应商授权信息文件列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 供应商授权信息文件分页列表
+     */
+    TableDataInfo<QualificationFileVo> queryPageList(QualificationFileBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的供应商授权信息文件列表
+     *
+     * @param bo 查询条件
+     * @return 供应商授权信息文件列表
+     */
+    List<QualificationFileVo> queryList(QualificationFileBo bo);
+
+    /**
+     * 新增供应商授权信息文件
+     *
+     * @param bo 供应商授权信息文件
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(QualificationFileBo bo);
+
+    /**
+     * 修改供应商授权信息文件
+     *
+     * @param bo 供应商授权信息文件
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(QualificationFileBo bo);
+
+    /**
+     * 校验并批量删除供应商授权信息文件信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 2 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplierAuthorizeService.java

@@ -72,4 +72,6 @@ public interface ISupplierAuthorizeService extends IService<SupplierAuthorize>{
     List<SupplierAuthorizeVo> getAuthorizeDetailList(Long supplierId);
 
     TableDataInfo<SupplierAuthorizeVo> getSupplyCapacityList(SupplierAuthorizeBo bo, PageQuery pageQuery);
+
+
 }

+ 3 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplierProcurementService.java

@@ -71,4 +71,7 @@ public interface ISupplierProcurementService extends IService<SupplierProcuremen
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     Map<String,Long> selectSupplierId(Long id);
+
+
+    List<Long> getSupplierIdsByProcurement(Long productManager, Long buyer);
 }

+ 2 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplyAreaService.java

@@ -70,4 +70,6 @@ public interface ISupplyAreaService extends IService<SupplyArea>{
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     Map<Long, String> queryProvincesorCity(Long supplierId,Map<Long, List<String>> areaMap,int level);
+
+    List<Long> getSupplierIdsByArea(String province, String city);
 }

+ 41 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CommonSupplierAuthorizeService.java

@@ -0,0 +1,41 @@
+package org.dromara.customer.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.customer.domain.SupplierAuthorize;
+import org.dromara.customer.mapper.SupplierAuthorizeMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * author
+ * 时间:2026/1/23,14:04
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class CommonSupplierAuthorizeService {
+
+    private final SupplierAuthorizeMapper baseMapper;
+
+    public List<Long> getSupplierIdsByBrandName(String brandName) {
+        // 需要注入SupplierAuthorizeMapper或Service
+        // 这里假设你有SupplierAuthorizeMapper
+        LambdaQueryWrapper<SupplierAuthorize> authorizeQueryWrapper =
+            new LambdaQueryWrapper<>();
+        authorizeQueryWrapper.eq(SupplierAuthorize::getBrandName, brandName);
+
+        // 查询符合条件的授权记录
+        List<SupplierAuthorize> authorizeList =
+            baseMapper.selectList(authorizeQueryWrapper);
+
+        // 提取供应商ID并去重
+        return authorizeList.stream()
+            .map(org.dromara.customer.domain.SupplierAuthorize::getSupplierId)
+            .distinct()
+            .collect(Collectors.toList());
+    }
+}

+ 139 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/QualificationFileServiceImpl.java

@@ -0,0 +1,139 @@
+package org.dromara.customer.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.customer.domain.bo.QualificationFileBo;
+import org.dromara.customer.domain.vo.QualificationFileVo;
+import org.dromara.customer.domain.QualificationFile;
+import org.dromara.customer.mapper.QualificationFileMapper;
+import org.dromara.customer.service.IQualificationFileService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 供应商授权信息文件Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-01-26
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class QualificationFileServiceImpl  extends ServiceImpl<QualificationFileMapper, QualificationFile> implements IQualificationFileService {
+
+    private final QualificationFileMapper baseMapper;
+
+    /**
+     * 查询供应商授权信息文件
+     *
+     * @param id 主键
+     * @return 供应商授权信息文件
+     */
+    @Override
+    public QualificationFileVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询供应商授权信息文件列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 供应商授权信息文件分页列表
+     */
+    @Override
+    public TableDataInfo<QualificationFileVo> queryPageList(QualificationFileBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<QualificationFile> lqw = buildQueryWrapper(bo);
+        Page<QualificationFileVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的供应商授权信息文件列表
+     *
+     * @param bo 查询条件
+     * @return 供应商授权信息文件列表
+     */
+    @Override
+    public List<QualificationFileVo> queryList(QualificationFileBo bo) {
+        LambdaQueryWrapper<QualificationFile> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<QualificationFile> buildQueryWrapper(QualificationFileBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<QualificationFile> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(QualificationFile::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getAuthorizeNo()), QualificationFile::getAuthorizeNo, bo.getAuthorizeNo());
+        lqw.like(StringUtils.isNotBlank(bo.getName()), QualificationFile::getName, bo.getName());
+        lqw.like(StringUtils.isNotBlank(bo.getFileName()), QualificationFile::getFileName, bo.getFileName());
+        lqw.eq(StringUtils.isNotBlank(bo.getFileType()), QualificationFile::getFileType, bo.getFileType());
+        lqw.eq(StringUtils.isNotBlank(bo.getFileUrl()), QualificationFile::getFileUrl, bo.getFileUrl());
+        lqw.eq(bo.getEndTime() != null, QualificationFile::getEndTime, bo.getEndTime());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), QualificationFile::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增供应商授权信息文件
+     *
+     * @param bo 供应商授权信息文件
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(QualificationFileBo bo) {
+        QualificationFile add = MapstructUtils.convert(bo, QualificationFile.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改供应商授权信息文件
+     *
+     * @param bo 供应商授权信息文件
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(QualificationFileBo bo) {
+        QualificationFile update = MapstructUtils.convert(bo, QualificationFile.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(QualificationFile entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除供应商授权信息文件信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 11 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierAuthorizeServiceImpl.java

@@ -22,6 +22,7 @@ import org.dromara.product.api.RemoteCategoryService;
 import org.dromara.product.api.RemoteProductService;
 import org.dromara.product.api.domain.RemoteProductBrand;
 import org.springframework.beans.BeanUtils;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.dromara.customer.domain.bo.SupplierAuthorizeBo;
 import org.dromara.customer.domain.vo.SupplierAuthorizeVo;
@@ -50,12 +51,16 @@ public class SupplierAuthorizeServiceImpl  extends ServiceImpl<SupplierAuthorize
 
     private final ISupplyAreaService supplyAreaService;
 
+    private final StringRedisTemplate stringRedisTemplate;
+
     @DubboReference
     private final RemoteCategoryService remoteCategoryService;
 
     @DubboReference
     private final RemoteProductService remoteProductService;
 
+    private static final String SUPPLY_CAPACITY_KEY = "supply_capacity:";
+
     /**
      * 查询供应能力查询
      *
@@ -93,6 +98,8 @@ public class SupplierAuthorizeServiceImpl  extends ServiceImpl<SupplierAuthorize
         return baseMapper.selectVoList(lqw);
     }
 
+
+
     @Override
     public TableDataInfo<SupplierAuthorizeVo> getSupplyCapacityList(SupplierAuthorizeBo bo, PageQuery pageQuery) {
         //查询供应商信息
@@ -311,8 +318,11 @@ public class SupplierAuthorizeServiceImpl  extends ServiceImpl<SupplierAuthorize
     @Override
     public Boolean insertByBo(SupplierAuthorizeBo bo) {
         SupplierAuthorize add = MapstructUtils.convert(bo, SupplierAuthorize.class);
-        validEntityBeforeSave(add);
+        stringRedisTemplate.opsForValue().set(RedisConstants.SUPPLY_CAPACITY_KEY+add.getId(),add);
         boolean flag = baseMapper.insert(add) > 0;
+        if (flag){
+            add.setId(add.getId());
+        }
         return flag;
     }
 

+ 1 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierBankServiceImpl.java

@@ -79,7 +79,7 @@ public class SupplierBankServiceImpl  extends ServiceImpl<SupplierBankMapper, Su
         lqw.eq(StringUtils.isNotBlank(bo.getSupplierNo()), SupplierBank::getSupplierNo, bo.getSupplierNo());
         lqw.eq(bo.getSupplierId() != null, SupplierBank::getSupplierId, bo.getSupplierId());
         lqw.eq(StringUtils.isNotBlank(bo.getBankNum()), SupplierBank::getBankNum, bo.getBankNum());
-        lqw.eq(StringUtils.isNotBlank(bo.getBankInfoNo()), SupplierBank::getBankInfoNo, bo.getBankInfoNo());
+        lqw.eq(bo.getBankInfoNo() != null, SupplierBank::getBankInfoNo, bo.getBankInfoNo());
         lqw.like(StringUtils.isNotBlank(bo.getBankName()), SupplierBank::getBankName, bo.getBankName());
         lqw.eq(StringUtils.isNotBlank(bo.getBankNo()), SupplierBank::getBankNo, bo.getBankNo());
         return lqw;

+ 3 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierContactServiceImpl.java

@@ -122,7 +122,8 @@ public class SupplierContactServiceImpl  extends ServiceImpl<SupplierContactMapp
     @Override
     public TableDataInfo<SupplierContactVo> queryPageListById(SupplierContactBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<SupplierContact> lqw = buildQueryWrapper(bo);
-        lqw.eq(SupplierContact::getSupplierId , bo.getSupplierId());
+        lqw.eq(bo.getSupplierId()!=null , SupplierContact::getSupplierId , bo.getSupplierId());
+        lqw.eq(bo.getUserId()!=null , SupplierContact::getUserId , bo.getUserId());
         Page<SupplierContactVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         setSupplierNames(result.getRecords());
         return TableDataInfo.build(result);
@@ -185,6 +186,7 @@ public class SupplierContactServiceImpl  extends ServiceImpl<SupplierContactMapp
         long l = Long.parseLong(maxUserNo) + 1;
         add.setUserNo(String.valueOf(l));
         add.setUserId(userId);
+        add.setPassword(ObjectUtil.isNotEmpty(bo.getPassword()) ? bo.getPassword() : "123456");
         boolean flag = baseMapper.insert(add) > 0;
         return flag;
     }

+ 115 - 12
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierInfoServiceImpl.java

@@ -1,6 +1,7 @@
 package org.dromara.customer.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -25,10 +26,9 @@ import org.dromara.customer.domain.vo.EnterpriseScaleVo;
 import org.dromara.customer.domain.vo.SupplierBusinessInfoVo;
 import org.dromara.customer.domain.vo.SupplierInformationVo;
 import org.dromara.customer.enums.SupplierStatusEnum;
+import org.dromara.customer.mapper.SupplierAuthorizeMapper;
 import org.dromara.customer.mapper.SupplierBusinessInfoMapper;
-import org.dromara.customer.service.IEnterpriseScaleService;
-import org.dromara.customer.service.ISupplierProcurementService;
-import org.dromara.customer.service.ISupplyAreaService;
+import org.dromara.customer.service.*;
 import org.dromara.product.api.RemoteCategoryService;
 import org.dromara.product.api.RemoteProductService;
 import org.dromara.product.api.domain.RemoteProductBrand;
@@ -41,7 +41,6 @@ import org.dromara.customer.domain.bo.SupplierInfoBo;
 import org.dromara.customer.domain.vo.SupplierInfoVo;
 import org.dromara.customer.domain.SupplierInfo;
 import org.dromara.customer.mapper.SupplierInfoMapper;
-import org.dromara.customer.service.ISupplierInfoService;
 import org.springframework.util.CollectionUtils;
 
 import java.util.*;
@@ -68,6 +67,8 @@ public class SupplierInfoServiceImpl  extends ServiceImpl<SupplierInfoMapper, Su
 
     private final SupplierBusinessInfoMapper supplierBusinessInfoMapper;
 
+    private final CommonSupplierAuthorizeService commonSupplierAuthorizeMapper;
+
     @DubboReference
     private final RemoteComStaffService remoteComStaffService;
 
@@ -246,17 +247,50 @@ public class SupplierInfoServiceImpl  extends ServiceImpl<SupplierInfoMapper, Su
 
     @Override
     public TableDataInfo<SupplierInfoVo> getSupplierInformation(SupplierInfoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SupplierInfo> lqw = new LambdaQueryWrapper<>();
         // 1. 基础分页查询
         if (bo.getSupplyStatus() == null){
             //正式供应商
-            bo.setSupplyStatus(1L);
+            lqw.eq(SupplierInfo::getSupplyStatus, 1L);
+        }else {
+            lqw.eq(SupplierInfo::getSupplyStatus,bo.getSupplyStatus());
         }
+
+
+
         // 2. 添加品牌条件
-        if (bo.getOperatingBrand()!= null){
+        if (bo.getOperatingBrand()!= null && StringUtils.isNotBlank(bo.getOperatingBrand())){
+            if (StringUtils.isNotBlank(bo.getOperatingBrand())){
+                Long productBrandIdByName = remoteProductService.getProductBrandIdByName(bo.getOperatingBrand());
+                if (productBrandIdByName != null){
+                    lqw.like(SupplierInfo::getOperatingBrand, productBrandIdByName);
+                }
+            }
+        }
+        //3.可供货区域省和市 - 添加供应区域过滤
+        if (StringUtils.isNotBlank(bo.getProvince()) || StringUtils.isNotBlank(bo.getCity())) {
+            // 查询符合条件的供应商ID列表
+            List<Long> supplierIds = supplyAreaService.getSupplierIdsByArea(bo.getProvince(), bo.getCity());
+            if (supplierIds != null && !supplierIds.isEmpty()) {
+                lqw.in(SupplierInfo::getId, supplierIds);
 
+            } else {
+                lqw.in(SupplierInfo::getId, -1L);
 
+            }
         }
-        LambdaQueryWrapper<SupplierInfo> lqw = buildQueryWrapper(bo);
+
+        //产品经理和采购人员
+        if (bo.getProductManager() != null || bo.getBuyer() != null) {
+            // 查询符合条件的供应商ID列表
+            List<Long> supplierIds = supplierProcurementService.getSupplierIdsByProcurement(bo.getProductManager(), bo.getBuyer());
+            if (supplierIds != null && !supplierIds.isEmpty()) {
+                lqw.in(SupplierInfo::getId, supplierIds);
+            } else {
+                lqw.in(SupplierInfo::getId, -1L);
+            }
+        }
+
         Page<SupplierInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         List<SupplierInfoVo> supplierVos = result.getRecords();
 
@@ -271,16 +305,53 @@ public class SupplierInfoServiceImpl  extends ServiceImpl<SupplierInfoMapper, Su
         // 3. 封装分页结果
         Page<SupplierInfoVo> newPage = copyPageResult(result, supplierVos);
         return TableDataInfo.build(newPage);
+
     }
 
     @Override
     public TableDataInfo<SupplierInfoVo> getSupplierApproveInformation(SupplierInfoBo bo, PageQuery pageQuery) {
         // 1. 构建审批状态条件
-        LambdaQueryWrapper<SupplierInfo> lqw = buildQueryWrapper(bo);
+        LambdaQueryWrapper<SupplierInfo> lqw = new LambdaQueryWrapper<>();
         if (bo.getSupplyStatus() == null) {
             List<Long> status = Arrays.asList(0L, 4L);
             lqw.in(SupplierInfo::getSupplyStatus, status);
+        }else {
+            lqw.eq(SupplierInfo::getSupplyStatus,bo.getSupplyStatus());
+        }
+
+        // 2.添加品牌条件
+        if (bo.getOperatingBrand()!= null && StringUtils.isNotBlank(bo.getOperatingBrand())){
+            if (StringUtils.isNotBlank(bo.getOperatingBrand())){
+                Long productBrandIdByName = remoteProductService.getProductBrandIdByName(bo.getOperatingBrand());
+                if (productBrandIdByName != null){
+                    lqw.like(SupplierInfo::getOperatingBrand, productBrandIdByName);
+                }
+            }
         }
+        //3.可供货区域省和市 - 添加供应区域过滤
+        if (StringUtils.isNotBlank(bo.getProvince()) || StringUtils.isNotBlank(bo.getCity())) {
+            // 查询符合条件的供应商ID列表
+            List<Long> supplierIds = supplyAreaService.getSupplierIdsByArea(bo.getProvince(), bo.getCity());
+            if (supplierIds != null && !supplierIds.isEmpty()) {
+                lqw.in(SupplierInfo::getId, supplierIds);
+
+            } else {
+                lqw.in(SupplierInfo::getId, -1L);
+
+            }
+        }
+
+        //产品经理和采购人员
+        if (bo.getProductManager() != null || bo.getBuyer() != null) {
+            // 查询符合条件的供应商ID列表
+            List<Long> supplierIds = supplierProcurementService.getSupplierIdsByProcurement(bo.getProductManager(), bo.getBuyer());
+            if (supplierIds != null && !supplierIds.isEmpty()) {
+                lqw.in(SupplierInfo::getId, supplierIds);
+            } else {
+                lqw.in(SupplierInfo::getId, -1L);
+            }
+        }
+
 
         // 2. 基础分页查询
         Page<SupplierInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
@@ -302,8 +373,40 @@ public class SupplierInfoServiceImpl  extends ServiceImpl<SupplierInfoMapper, Su
         // 1. 构建产能列表查询条件
         LambdaQueryWrapper<SupplierInfo> lqw = new LambdaQueryWrapper<>();
         lqw.eq(StringUtils.isNotBlank(bo.getSupplierNo()), SupplierInfo::getSupplierNo, bo.getSupplierNo());
-        lqw.eq(StringUtils.isNotBlank(bo.getSupplierName()), SupplierInfo::getSupplierName, bo.getSupplierName());
-        lqw.like(StringUtils.isNotBlank(bo.getSupplyBrand()), SupplierInfo::getOperatingBrand, bo.getSupplyBrand());
+        lqw.eq(StringUtils.isNotBlank(bo.getSupplierName()), SupplierInfo::getEnterpriseName, bo.getSupplierName());
+
+        //可供应品牌
+        if (StringUtils.isNotBlank(bo.getSupplyBrand())){
+            Long productBrandIdByName = remoteProductService.getProductBrandIdByName(bo.getSupplyBrand());
+            if (productBrandIdByName != null){
+                lqw.like(SupplierInfo::getOperatingBrand, productBrandIdByName);
+            }
+        }
+        //可供货区域省和市 - 添加供应区域过滤
+        if (StringUtils.isNotBlank(bo.getProvince()) || StringUtils.isNotBlank(bo.getCity())) {
+            // 查询符合条件的供应商ID列表
+            List<Long> supplierIds = supplyAreaService.getSupplierIdsByArea(bo.getProvince(), bo.getCity());
+            if (supplierIds != null &&!supplierIds.isEmpty()) {
+                lqw.in(SupplierInfo::getId, supplierIds);
+
+            }else {
+                lqw.in(SupplierInfo::getId, -1L);
+
+            }
+        }
+
+        // 新增:根据品牌名称过滤(从SupplierAuthorize表)
+        if (StringUtils.isNotBlank(bo.getBrandName())) {
+            // 通过SupplierAuthorizeService查询符合条件的供应商ID
+            List<Long> supplierIdsByBrand = commonSupplierAuthorizeMapper.getSupplierIdsByBrandName(bo.getBrandName());
+            if (supplierIdsByBrand!=null &&!supplierIdsByBrand.isEmpty()) {
+                lqw.in(SupplierInfo::getId, supplierIdsByBrand);
+            }else {
+                lqw.in(SupplierInfo::getId, -1L);
+
+            }
+        }
+
         lqw.orderByDesc(SupplierInfo::getSupplierNo);
 
         // 2. 基础分页查询
@@ -1336,8 +1439,8 @@ public class SupplierInfoServiceImpl  extends ServiceImpl<SupplierInfoMapper, Su
         lqw.like(StringUtils.isNotBlank(bo.getSupplierName()), SupplierInfo::getSupplierName, bo.getSupplierName());
         lqw.eq(StringUtils.isNotBlank(bo.getSupplierPhone()), SupplierInfo::getSupplierPhone, bo.getSupplierPhone());
         lqw.eq(StringUtils.isNotBlank(bo.getSupplierPassword()), SupplierInfo::getSupplierPassword, bo.getSupplierPassword());
-        lqw.eq(StringUtils.isNotBlank(bo.getOperatingCategory()), SupplierInfo::getOperatingCategory, bo.getOperatingCategory());
-        lqw.eq(StringUtils.isNotBlank(bo.getOperatingBrand()), SupplierInfo::getOperatingBrand, bo.getOperatingBrand());
+        lqw.like(StringUtils.isNotBlank(bo.getOperatingCategory()), SupplierInfo::getOperatingCategory, bo.getOperatingCategory());
+        lqw.like(StringUtils.isNotBlank(bo.getOperatingBrand()), SupplierInfo::getOperatingBrand, bo.getOperatingBrand());
         lqw.eq(StringUtils.isNotBlank(bo.getOtherCustomers()), SupplierInfo::getOtherCustomers, bo.getOtherCustomers());
         lqw.like(StringUtils.isNotBlank(bo.getShortName()), SupplierInfo::getShortName, bo.getShortName());
         lqw.eq(ObjectUtil.isNotEmpty(bo.getIndustrCategory()), SupplierInfo::getIndustrCategory, bo.getIndustrCategory());

+ 29 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierProcurementServiceImpl.java

@@ -19,6 +19,7 @@ import org.dromara.customer.mapper.SupplierProcurementMapper;
 import org.dromara.customer.service.ISupplierProcurementService;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 供应商采购结算配置Service业务层处理
@@ -151,4 +152,32 @@ public class SupplierProcurementServiceImpl  extends ServiceImpl<SupplierProcure
         ids.put("purchaser",supplierProcurement.getPurchaser());
         return ids;
     }
+
+    /**
+     * 根据产品经理或采购员查询符合条件的供应商ID列表
+     *
+     * @param productManager 产品经理ID
+     * @param buyer 采购员ID
+     * @return 供应商ID列表
+     */
+    public List<Long> getSupplierIdsByProcurement(Long productManager, Long buyer) {
+        LambdaQueryWrapper<SupplierProcurement> procurementWrapper = new LambdaQueryWrapper<>();
+
+        // 构建查询条件:产品经理ID或采购员ID匹配
+        if (productManager != null) {
+            procurementWrapper.or(wrapper -> wrapper.eq(SupplierProcurement::getProductManager, productManager));
+        }
+        if (buyer != null) {
+            procurementWrapper.or(wrapper -> wrapper.eq(SupplierProcurement::getPurchaser, buyer));
+        }
+
+        // 查询符合条件的采购信息
+        List<SupplierProcurement> procurementList = baseMapper.selectList(procurementWrapper);
+
+        // 提取供应商ID并去重
+        return procurementList.stream()
+            .map(SupplierProcurement::getSupplierId)
+            .distinct()
+            .collect(Collectors.toList());
+    }
 }

+ 41 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplyAreaServiceImpl.java

@@ -91,6 +91,47 @@ public class SupplyAreaServiceImpl  extends ServiceImpl<SupplyAreaMapper, Supply
         return provinceList;
     }
 
+    /**
+     * 根据省市信息查询符合条件的供应商ID列表
+     *
+     * @param province 省份
+     * @param city 城市
+     * @return 供应商ID列表
+     */
+    public List<Long> getSupplierIdsByArea(String province, String city) {
+        LambdaQueryWrapper<SupplyArea> areaQueryWrapper = new LambdaQueryWrapper<>();
+
+        // 如果同时提供省和市,则需要同时匹配
+        if (StringUtils.isNotBlank(province) && StringUtils.isNotBlank(city)) {
+            areaQueryWrapper.and(wrapper -> wrapper
+                .and(provinceWrapper -> provinceWrapper
+                    .eq(SupplyArea::getLevel, "1") // 省级
+                    .eq(SupplyArea::getAreaName, province))
+                .or(cityWrapper -> cityWrapper
+                    .eq(SupplyArea::getLevel, "2") // 市级
+                    .eq(SupplyArea::getAreaName, city)));
+        }
+        // 只提供省份
+        else if (StringUtils.isNotBlank(province)) {
+            areaQueryWrapper.eq(SupplyArea::getLevel, "1") // 省级
+                .eq(SupplyArea::getAreaName, province);
+        }
+        // 只提供城市
+        else if (StringUtils.isNotBlank(city)) {
+            areaQueryWrapper.eq(SupplyArea::getLevel, "2") // 市级
+                .eq(SupplyArea::getAreaName, city);
+        }
+
+        // 查询符合条件的供应区域
+        List<SupplyArea> supplyAreas = baseMapper.selectList(areaQueryWrapper);
+
+        // 提取供应商ID并去重
+        return supplyAreas.stream()
+            .map(SupplyArea::getSupplierId)
+            .distinct()
+            .collect(Collectors.toList());
+    }
+
     /**
      * 分页查询供应区域列表
      *

+ 7 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/QualificationFileMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.QualificationFileMapper">
+
+</mapper>

+ 5 - 0
ruoyi-modules/ruoyi-external/pom.xml

@@ -118,6 +118,11 @@
             <artifactId>ruoyi-api-order</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-customer</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>com.microsoft.sqlserver</groupId>
             <artifactId>mssql-jdbc</artifactId>

+ 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();
     }
 }

+ 17 - 0
ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/RuoyiMallApplication.java

@@ -0,0 +1,17 @@
+package org.dromara.mall;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+@SpringBootApplication
+public class RuoyiMallApplication {
+
+    public static void main(String[] args) {
+        SpringApplication application = new SpringApplication(RuoyiMallApplication.class);
+        application.setApplicationStartup(new BufferingApplicationStartup(2048));
+        application.run(args);
+        System.out.println("(♥◠‿◠)ノ゙  装修模块启动成功   ლ(´ڡ`ლ)゙  ");
+    }
+
+}

+ 12 - 0
ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/controller/NsDiyPageController.java

@@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.mall.domain.param.DiyLinkParam;
 import org.dromara.mall.domain.param.DiyPageInitParam;
 import org.dromara.mall.domain.param.DiyPageSearchParam;
 import org.dromara.mall.domain.param.TemplateParam;
@@ -152,4 +153,15 @@ public class NsDiyPageController extends BaseController {
     public R<NsDiyPageVo> getPageInit(@Validated DiyPageInitParam param) {
         return R.ok(nsDiyPageService.getPageInit(param));
     }
+
+
+    /**
+     * 获取自定义链接列表
+     * @return
+     */
+    @GetMapping("/link")
+    public R<JSONObject> getLink(DiyLinkParam param) {
+
+        return R.ok(nsDiyPageService.getLink(param));
+    }
 }

+ 9 - 0
ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/INsDiyPageService.java

@@ -3,6 +3,7 @@ package org.dromara.mall.service;
 import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.dromara.mall.domain.NsDiyPage;
+import org.dromara.mall.domain.param.DiyLinkParam;
 import org.dromara.mall.domain.param.DiyPageInitParam;
 import org.dromara.mall.domain.param.DiyPageSearchParam;
 import org.dromara.mall.domain.param.TemplateParam;
@@ -109,4 +110,12 @@ public interface INsDiyPageService extends IService<NsDiyPage>{
      * @return
      */
     NsDiyPageVo getPageInit(DiyPageInitParam param);
+
+    /**
+     * 获取自定义链接列表
+     *
+     * @return
+     */
+    JSONObject getLink(DiyLinkParam param);
+
 }

+ 194 - 16
ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/impl/NsDiyPageServiceImpl.java

@@ -18,10 +18,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.dromara.mall.domain.param.DiyPageInitParam;
-import org.dromara.mall.domain.param.DiyPageSearchParam;
-import org.dromara.mall.domain.param.DiyRouteSearchParam;
-import org.dromara.mall.domain.param.TemplateParam;
+import org.dromara.mall.domain.param.*;
 import org.dromara.mall.domain.vo.NsDiyRouteVo;
 import org.dromara.mall.domain.vo.SceneDomainVo;
 import org.dromara.mall.domain.vo.StartUpPageConfigVo;
@@ -195,7 +192,7 @@ public class NsDiyPageServiceImpl  extends ServiceImpl<NsDiyPageMapper, NsDiyPag
         if (ObjectUtil.isNotEmpty(searchParam.getType())) queryWrapper.eq("type", searchParam.getType());
 
         //获取resource/json/loader/diy/template.json
-        String templateJsonStr = ResourceUtil.readUtf8Str("json/loader/diy/template.json");
+        String templateJsonStr = ResourceUtil.readUtf8Str("json/mall/loader/diy/template.json");
         JSONObject template = JSONUtil.parseObj(templateJsonStr);
 
         IPage<NsDiyPageVo> iPage = baseMapper.selectVoPage(pageQuery.build(), queryWrapper);
@@ -219,7 +216,7 @@ public class NsDiyPageServiceImpl  extends ServiceImpl<NsDiyPageMapper, NsDiyPag
             param.setAppType("site");
         }
         //获取resource/json/loader/diy/template.json
-        String templateJsonStr = ResourceUtil.readUtf8Str("json/loader/diy/template.json");
+        String templateJsonStr = ResourceUtil.readUtf8Str("json/mall/loader/diy/template.json");
         JSONObject template = JSONUtil.parseObj(templateJsonStr);
 
         for (String key : template.keySet()) {
@@ -232,7 +229,7 @@ public class NsDiyPageServiceImpl  extends ServiceImpl<NsDiyPageMapper, NsDiyPag
 
     public static JSONObject getPages(String type, String mode){
         //获取resource/json/loader/diy/template.json
-        String pageJsonStr = ResourceUtil.readUtf8Str("json/loader/diy/pages.json");
+        String pageJsonStr = ResourceUtil.readUtf8Str("json/mall/loader/diy/pages.json");
         JSONObject pages = JSONUtil.parseObj(pageJsonStr);
 
         if (!type.isEmpty() && pages != null) {
@@ -253,7 +250,7 @@ public class NsDiyPageServiceImpl  extends ServiceImpl<NsDiyPageMapper, NsDiyPag
 
     public static JSONObject getPagesByAddon(String type, String addon){
         //获取resource/json/loader/diy/template.json
-        String pageJsonStr = ResourceUtil.readUtf8Str("json/loader/diy/pages.json");
+        String pageJsonStr = ResourceUtil.readUtf8Str("json/mall/loader/diy/pages.json");
         JSONObject pages = JSONUtil.parseObj(pageJsonStr);
 
         if (type != null && !type.isEmpty() && pages != null) {
@@ -284,7 +281,7 @@ public class NsDiyPageServiceImpl  extends ServiceImpl<NsDiyPageMapper, NsDiyPag
 
     public static void main(String[] args) {
         //获取resource/json/loader/diy/template.json
-        String jsonStr = ResourceUtil.readUtf8Str("json/loader/diy/template.json");
+        String jsonStr = ResourceUtil.readUtf8Str("json/mall/loader/diy/template.json");
         //jan
         JSONObject template = JSONUtil.parseObj(jsonStr);
         System.out.println(template.toStringPretty());
@@ -451,11 +448,15 @@ public class NsDiyPageServiceImpl  extends ServiceImpl<NsDiyPageMapper, NsDiyPag
     }
 
     public JSONObject getComponentList(String type) {
-        String templateJsonStr = ResourceUtil.readUtf8Str("json/loader/diy/components.json");
-        JSONObject ComponentList = JSONUtil.parseObj(templateJsonStr);
+        String templateJsonStr1 = ResourceUtil.readUtf8Str("json/mall/loader/diy/components.json");
+        JSONObject ComponentList1 = JSONUtil.parseObj(templateJsonStr1);
+//        String templateJsonStr2 = ResourceUtil.readUtf8Str("json/core/loader/diy/components.json");
+//        JSONObject ComponentList2 = JSONUtil.parseObj(templateJsonStr2);
+//        //合并两个组件
+//        ComponentList1.putAll(ComponentList2);
         JSONObject res = new JSONObject();
-        for (String formComponentObj : ComponentList.keySet()) {
-            JSONObject formComponent = ComponentList.getJSONObject(formComponentObj);
+        for (String formComponentObj : ComponentList1.keySet()) {
+            JSONObject formComponent = ComponentList1.getJSONObject(formComponentObj);
             JSONObject list = formComponent.getJSONObject("list");
             Iterator<Map.Entry<String, Object>> iterator = list.entrySet().iterator();
             while (iterator.hasNext()) {
@@ -474,9 +475,8 @@ public class NsDiyPageServiceImpl  extends ServiceImpl<NsDiyPageMapper, NsDiyPag
             }
             // 根据 sort 排序
             iterator = list.entrySet().iterator();
-            if(iterator.hasNext())
-            {
-                formComponent.put("list", sortJSONObjectBySortField(list));
+            if(iterator.hasNext()) {
+                formComponent.put("list", list);
                 res.put(formComponentObj, formComponent);
             }
         }
@@ -506,4 +506,182 @@ public class NsDiyPageServiceImpl  extends ServiceImpl<NsDiyPageMapper, NsDiyPag
 
         return sortedJsonObject;
     }
+
+    /**
+     * 获取自定义链接列表
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public JSONObject getLink(DiyLinkParam params) {
+        String templateJsonStr = ResourceUtil.readUtf8Str("json/mall/loader/diy/links.json");
+        JSONObject linkEnum = JSONUtil.parseObj(templateJsonStr);
+        Integer siteId = 0;
+
+        // 使用迭代器安全地遍历和删除
+        Iterator<Map.Entry<String, Object>> iterator = linkEnum.entrySet().iterator();
+        while (iterator.hasNext()) {
+            Map.Entry<String, Object> entry = iterator.next();
+            String key = entry.getKey();
+            JSONObject linkGroup = (JSONObject) entry.getValue();
+
+            // 设置name属性
+            linkGroup.put("name", key);
+
+            // 处理child_list
+            if (linkGroup.containsKey("child_list")) {
+                JSONArray childList = linkGroup.getJSONArray("child_list");
+                if (childList != null && childList.size() > 0) {
+                    // 过滤child_list中的项目
+                        filterChildList(childList, key, siteId, params);
+
+                    // 如果过滤后child_list为空,则移除整个分组
+                    if (childList.size() == 0) {
+                        iterator.remove();
+                        continue;
+                    }
+                }
+            }
+
+            // 处理DIY_PAGE特殊逻辑
+            if (key.equals("DIY_PAGE")) {
+                handleDiyPageLinks(linkGroup, siteId);
+            }
+
+            // 设置DIY_LINK的parent属性
+            if (key.equals("DIY_LINK")) {
+                linkGroup.put("parent", "DIY_LINK");
+            }
+        }
+
+        return linkEnum;
+    }
+
+    /**
+     * 过滤child_list中的项目
+     */
+    private void filterChildList(JSONArray childList, String parentKey, Integer siteId, DiyLinkParam params) {
+        Iterator<Object> childIterator = childList.iterator();
+        while (childIterator.hasNext()) {
+            JSONObject childItem = (JSONObject) childIterator.next();
+
+            // 设置parent属性
+            childItem.put("parent", parentKey);
+
+            // 处理嵌套的child_list
+            if (childItem.containsKey("child_list")) {
+                JSONArray nestedChildList = childItem.getJSONArray("child_list");
+                if (nestedChildList != null && nestedChildList.size() > 0) {
+                    // 递归过滤嵌套的child_list
+                    filterNestedChildList(nestedChildList, siteId, params);
+
+                    // 如果嵌套child_list为空,则移除该项
+                    if (nestedChildList.size() == 0) {
+                        childIterator.remove();
+                        continue;
+                    }
+                }
+            } else {
+                // 根据link_type过滤
+                if (!shouldIncludeByLinkType(childItem, siteId)) {
+                    childIterator.remove();
+                    continue;
+                }
+
+                // 根据url_type过滤
+                if (!shouldIncludeByUrlType(childItem, params)) {
+                    childIterator.remove();
+                    continue;
+                }
+            }
+        }
+    }
+
+    /**
+     * 根据link_type判断是否应该包含该项
+     */
+    private boolean shouldIncludeByLinkType(JSONObject item, Integer siteId) {
+        String linkType = item.getStr("link_type");
+
+        if (siteId > 0) {
+            // 站点模式:只显示site和all类型的链接
+            return linkType == null || "site".equals(linkType) || "all".equals(linkType);
+        } else {
+            // 管理员模式:不显示site类型的链接
+            return !"site".equals(linkType);
+        }
+    }
+
+    /**
+     * 根据url_type判断是否应该包含该项
+     */
+    private boolean shouldIncludeByUrlType(JSONObject item, DiyLinkParam params) {
+        String urlType = item.getStr("url_type");
+        String typeParam = params.getType();
+
+        // 如果没有指定type参数,则过滤掉tab类型的链接
+        if (typeParam == null || typeParam.isEmpty()) {
+            return !"tab".equals(urlType);
+        }
+
+        return true;
+    }
+
+
+    /**
+     * 处理DIY_PAGE的特殊链接逻辑
+     */
+    private void handleDiyPageLinks(JSONObject linkGroup, Integer siteId) {
+        // 查询自定义页面
+        QueryWrapper<NsDiyPage> queryWrapper = new QueryWrapper<>();
+        queryWrapper.and(wrapper ->
+            wrapper.eq("type", "DIY_PAGE")
+                .eq("site_id", siteId)
+        ).or(wrapper ->
+            wrapper.ne("type", "DIY_PAGE")
+                .eq("site_id", siteId)
+                .eq("is_default", 0)
+        );
+        queryWrapper.select("id", "title", "page_title", "name", "template", "type", "mode", "is_default", "share", "visit_count", "create_time", "update_time");
+        queryWrapper.orderByDesc("update_time");
+
+        List<NsDiyPage> pageList = baseMapper.selectList(queryWrapper);
+
+        JSONArray childList = linkGroup.getJSONArray("child_list");
+        if (childList == null) {
+            childList = new JSONArray();
+            linkGroup.put("child_list", childList);
+        }
+
+        for (NsDiyPage item : pageList) {
+            JSONObject page = new JSONObject();
+            page.put("name", item.getName());
+            page.put("title", item.getPageTitle()); // 使用page_title字段
+            page.put("url", "/app/pages/index/diy?id=" + item.getId());
+            childList.add(page);
+        }
+    }
+
+    /**
+     * 过滤嵌套的child_list
+     */
+    private void filterNestedChildList(JSONArray nestedChildList, Integer siteId, DiyLinkParam params) {
+        Iterator<Object> nestedIterator = nestedChildList.iterator();
+        while (nestedIterator.hasNext()) {
+            JSONObject nestedItem = (JSONObject) nestedIterator.next();
+
+            // 根据link_type过滤
+            if (!shouldIncludeByLinkType(nestedItem, siteId)) {
+                nestedIterator.remove();
+                continue;
+            }
+
+            // 根据url_type过滤
+            if (!shouldIncludeByUrlType(nestedItem, params)) {
+                nestedIterator.remove();
+                continue;
+            }
+        }
+    }
 }

+ 1 - 1
ruoyi-modules/ruoyi-mall/src/main/java/org/dromara/mall/service/impl/NsDiyRouteServiceImpl.java

@@ -196,7 +196,7 @@ public class NsDiyRouteServiceImpl  extends ServiceImpl<NsDiyRouteMapper, NsDiyR
 
     public static JSONObject getLink(){
         //获取resource/json/loader/diy/links.json
-        String pageJsonStr = ResourceUtil.readUtf8Str("json/loader/diy/links.json");
+        String pageJsonStr = ResourceUtil.readUtf8Str("json/mall/loader/diy/links.json");
         JSONObject link = JSONUtil.parseObj(pageJsonStr);
         return link;
     }

+ 54 - 0
ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/account_change_type.json

@@ -0,0 +1,54 @@
+{
+  "point": {
+
+    "account_point_exchange_close": {
+      "name": "兑换订单关闭",
+      "inc": 0,
+      "dec": 1
+    },
+    "account_point_exchange_order": {
+      "name": "兑换订单消费",
+      "inc": 1,
+      "dec": 0
+    },
+    "account_point_exchange_refund": {
+      "name": "兑换订单维权",
+      "inc": 1,
+      "dec": 0
+    },
+    "consume_reward": {
+      "name": "消费奖励",
+      "inc": 1,
+      "dec": 0
+    },
+    "manjian_gift_give": {
+      "name": "满减活动赠品发放",
+      "inc": 1,
+      "dec": 0
+    },
+    "manjian_gift_back": {
+      "name": "满减活动赠品退还",
+      "inc": 0,
+      "dec": 1
+    }
+  },
+  "balance": {
+    "manjian_gift_give": {
+      "name": "满减活动赠品发放",
+      "inc": 1,
+      "dec": 0
+    },
+    "manjian_gift_back": {
+      "name": "满减活动赠品退还",
+      "inc": 0,
+      "dec": 1
+    }
+  },
+  "growth": {
+    "consume_reward": {
+      "name": "消费奖励",
+      "inc": 1,
+      "dec": 0
+    }
+  }
+}

+ 6 - 0
ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/account_type.json

@@ -0,0 +1,6 @@
+[
+  {
+    "name": "佣金",
+    "key": "commission"
+  }
+]

+ 29 - 0
ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/adminapp/app.json

@@ -0,0 +1,29 @@
+[
+  {
+    "name": "商品管理",
+    "key": "mall_goods",
+    "group": "mall",
+    "menu_key": "mall_goods_list",
+    "sort": 1,
+    "page": "/addon/mall/pages/goods/list",
+    "icon": "/addon/mall/site/menu/goods.png"
+  },
+  {
+    "name": "订单管理",
+    "key": "mall_order",
+    "group": "mall",
+    "menu_key": "mall_order_list",
+    "sort": 2,
+    "page": "/addon/mall/pages/order/list",
+    "icon": "/addon/mall/site/menu/order.png"
+  },
+  {
+    "name": "售后管理",
+    "key": "mall_order_refund",
+    "group": "mall",
+    "menu_key": "",
+    "sort": 3,
+    "page": "/addon/mall/pages/refund/list",
+    "icon": "/addon/mall/site/menu/refund.png"
+  }
+]

+ 7 - 0
ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/adminapp/app_group.json

@@ -0,0 +1,7 @@
+[
+  {
+    "name": "商城",
+    "key": "mall",
+    "sort": 1
+  }
+]

+ 44 - 0
ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/adminapp/stat.json

@@ -0,0 +1,44 @@
+[
+  {
+    "name": "订单销售额",
+    "key": "sale_money",
+    "url": "mall/site/stat/total",
+    "sort": 1,
+    "page": ""
+  },
+  {
+    "name": "退款总金额",
+    "key": "refund_money",
+    "url": "mall/site/stat/total",
+    "sort": 2,
+    "page": ""
+  },
+  {
+    "name": "订单销售量",
+    "key": "order_num",
+    "url": "mall/site/stat/total",
+    "sort": 3,
+    "page": ""
+  },
+  {
+    "name": "订单退款量",
+    "key": "refund_num",
+    "url": "mall/site/stat/total",
+    "sort": 4,
+    "page": ""
+  },
+  {
+    "name": "商品浏览量",
+    "key": "access_num",
+    "url": "mall/site/stat/total",
+    "sort": 5,
+    "page": ""
+  },
+  {
+    "name": "订单下单数",
+    "key": "sale_num",
+    "url": "mall/site/stat/total",
+    "sort": 6,
+    "page": ""
+  }
+]

+ 30 - 0
ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/adminapp/todo.json

@@ -0,0 +1,30 @@
+[
+  {
+    "name": "待发货订单",
+    "key": "wait_delivery",
+    "url": "mall/site/stat/todo",
+    "sort": 1,
+    "page": "/addon/mall/pages/order/list?status=2"
+  },
+  {
+    "name": "售后待处理",
+    "key": "wait_refund",
+    "url": "mall/site/stat/todo",
+    "sort": 2,
+    "page": "/addon/mall/pages/refund/list?status=1"
+  },
+  {
+    "name": "待核销订单",
+    "key": "wait_verify",
+    "url": "mall/site/stat/todo",
+    "sort": 3,
+    "page": "/addon/mall/pages/order/list?status=3"
+  },
+  {
+    "name": "提现待转账",
+    "key": "wait_transfer",
+    "url": "mall/site/stat/todo",
+    "sort": 4,
+    "page": ""
+  }
+]

+ 2 - 0
ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/diy/adv_position.json

@@ -0,0 +1,2 @@
+[
+]

+ 66 - 0
ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/diy/bottom.json

@@ -0,0 +1,66 @@
+{
+	"key": "mall",
+	"value": {
+		"backgroundColor": "#ffffff",
+		"textColor": "#333333",
+		"textHoverColor": "#F92510",
+		"type": "1",
+		"list": [
+			{
+				"text": "首页",
+				"link": {
+					"parent": "MALL_LINK",
+					"name": "MALL_INDEX",
+					"title": "get_lang ('dict_diy.mall_link_index')",
+					"url": "/app/pages/index/index"
+				},
+				"iconPath": "addon/mall/diy/tabbar/system-home.png",
+				"iconSelectPath": "addon/mall/diy/tabbar/system-home-selected.png"
+			},
+			{
+				"text": "商品分类",
+				"link": {
+					"parent": "MALL_LINK",
+					"name": "MALL_GOODS_CATEGORY",
+					"title": "商品分类",
+					"url": "/addon/mall/pages/goods/category"
+				},
+				"iconPath": "addon/mall/diy/tabbar/system-category.png",
+				"iconSelectPath": "addon/mall/diy/tabbar/system-category-selected.png"
+			},
+			{
+				"text": "店铺街",
+				"link": {
+					"parent": "MALL_LINK",
+					"name": "MALL_SHOP_STREET",
+					"title": "店铺街",
+					"url": "/addon/mall/pages/shop/list"
+				},
+				"iconPath": "addon/mall/diy/tabbar/system-shop.png",
+				"iconSelectPath": "addon/mall/diy/tabbar/system-shop-selected.png"
+			},
+			{
+				"text": "购物车",
+				"link": {
+					"parent": "MALL_LINK",
+					"name": "MALL_GOODS_CART",
+					"title": "购物车",
+					"url": "/addon/mall/pages/goods/cart"
+				},
+				"iconPath": "addon/mall/diy/tabbar/system-cart.png",
+				"iconSelectPath": "addon/mall/diy/tabbar/system-cart-selected.png"
+			},
+			{
+				"text": "我的",
+				"link": {
+					"parent": "MALL_LINK",
+					"name": "MALL_MEMBER_INDEX",
+					"title": "get_lang ('dict_diy.member_index')",
+					"url": "/app/pages/member/index"
+				},
+				"iconPath": "addon/mall/diy/tabbar/system-my.png",
+				"iconSelectPath": "addon/mall/diy/tabbar/system-my-selected.png"
+			}
+		]
+	}
+}

+ 59 - 0
ruoyi-modules/ruoyi-mall/src/main/resources/json/core/loader/diy/bottom_site.json

@@ -0,0 +1,59 @@
+{
+	"key": "mall",
+	"value": {
+		"backgroundColor": "#ffffff",
+		"textColor": "#333333",
+		"textHoverColor": "#F92510",
+		"type": "1",
+		"list": [
+			{
+				"text": "首页",
+				"link": {
+					"parent": "MALL_LINK_TAB",
+					"name": "MALL_SHOP_INDEX",
+					"title": "店铺首页",
+					"url": "shop_index",
+					"url_type": "tab"
+				},
+				"iconPath": "addon/mall/diy/site_tabbar/shop-home.png",
+				"iconSelectPath": "addon/mall/diy/site_tabbar/shop-home-selected.png"
+			},
+			{
+				"text": "全部商品",
+				"link": {
+					"parent": "MALL_LINK_TAB",
+					"name": "MALL_SHOP_GOODS_LIST",
+					"title": "店铺商品列表",
+					"url": "shop_goods_list",
+					"url_type": "tab"
+				},
+				"iconPath": "addon/mall/diy/site_tabbar/shop-goods.png",
+				"iconSelectPath": "addon/mall/diy/site_tabbar/shop-goods-selected.png"
+			},
+			{
+				"text": "全部分类",
+				"link": {
+					"parent": "MALL_LINK_TAB",
+					"name": "MALL_SHOP_GOODS_CATEGORY",
+					"title": "店铺商品分类",
+					"url": "shop_goods_category",
+					"url_type": "tab"
+				},
+				"iconPath": "addon/mall/diy/site_tabbar/shop-category.png",
+				"iconSelectPath": "addon/mall/diy/site_tabbar/shop-category-selected.png"
+			},
+			{
+				"text": "领券中心",
+				"link": {
+					"parent": "MALL_LINK_TAB",
+					"name": "MALL_SHOP_COUPON_LIST",
+					"title": "店铺优惠券列表",
+					"url": "shop_coupon_list",
+					"url_type": "tab"
+				},
+				"iconPath": "addon/mall/diy/site_tabbar/shop-coupon.png",
+				"iconSelectPath": "addon/mall/diy/site_tabbar/shop-coupon-selected.png"
+			}
+		]
+	}
+}

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است