Bladeren bron

refactor(customer): 重构客户和供应商信息管理功能

- 将客户信息中的来源、单价、额度等字段迁移至销售信息表
- 替换员工服务调用为ERP员工服务以获取正确的人员和部门信息
- 新增客户业务信息表并完善客户信息保存和更新逻辑
- 优化供应商导入监听器实现并新增供应商ERP信息处理
- 在数据权限拦截器中添加ERP相关表的忽略配置
hurx 1 week geleden
bovenliggende
commit
9bed6021b7
55 gewijzigde bestanden met toevoegingen van 3583 en 225 verwijderingen
  1. 19 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteErpDeptService.java
  2. 16 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteErpStaffService.java
  3. 46 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteErpDeptVo.java
  4. 64 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteErpStaffVo.java
  5. 4 1
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java
  6. 4 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInfoController.java
  7. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierErpInfoController.java
  8. 9 6
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierInfoController.java
  9. 0 48
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInfo.java
  10. 40 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerSalesInfo.java
  11. 99 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SupplierErpInfo.java
  12. 0 50
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInfoBo.java
  13. 40 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerSalesInfoBo.java
  14. 91 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SupplierErpInfoBo.java
  15. 2 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SupplierInfoBo.java
  16. 0 50
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInfoVo.java
  17. 40 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerSalesInfoVo.java
  18. 112 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/SupplierErpInfoVo.java
  19. 5 3
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/SupplierInfoVo.java
  20. 35 17
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/listener/CustomerImportListener.java
  21. 46 19
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/listener/SupplierImportListener.java
  22. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/SupplierErpInfoMapper.java
  23. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplierErpInfoService.java
  24. 21 4
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java
  25. 143 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierErpInfoServiceImpl.java
  26. 48 20
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierInfoServiceImpl.java
  27. 7 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/SupplierErpInfoMapper.xml
  28. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ErpCompanyController.java
  29. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ErpDeptController.java
  30. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ErpStaffController.java
  31. 169 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ErpCompany.java
  32. 127 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ErpDept.java
  33. 104 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ErpStaff.java
  34. 161 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ErpCompanyBo.java
  35. 119 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ErpDeptBo.java
  36. 96 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ErpStaffBo.java
  37. 198 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ErpCompanyVo.java
  38. 151 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ErpDeptVo.java
  39. 125 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ErpStaffVo.java
  40. 43 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteErpDeptServiceImpl.java
  41. 30 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteErpStaffServiceImpl.java
  42. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ErpCompanyMapper.java
  43. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ErpDeptMapper.java
  44. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ErpStaffMapper.java
  45. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IErpCompanyService.java
  46. 83 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IErpDeptService.java
  47. 76 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IErpStaffService.java
  48. 5 5
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/AddressAreaServiceImpl.java
  49. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/CreditLevelServiceImpl.java
  50. 158 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ErpCompanyServiceImpl.java
  51. 201 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ErpDeptServiceImpl.java
  52. 200 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ErpStaffServiceImpl.java
  53. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ErpCompanyMapper.xml
  54. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ErpDeptMapper.xml
  55. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ErpStaffMapper.xml

+ 19 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteErpDeptService.java

@@ -0,0 +1,19 @@
+package org.dromara.system.api;
+
+import cn.hutool.core.lang.tree.Tree;
+import org.dromara.system.api.domain.vo.RemoteDeptVo;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 部门服务
+ *
+ * @author Lion Li
+ */
+public interface RemoteErpDeptService {
+
+    Map<Long, String> selectDeptNameByIds(Set<Long> ids);
+
+}

+ 16 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteErpStaffService.java

@@ -0,0 +1,16 @@
+package org.dromara.system.api;
+
+import org.dromara.system.api.domain.vo.RemoteComStaffVo;
+import org.dromara.system.api.domain.vo.RemoteErpStaffVo;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface RemoteErpStaffService {
+
+    Map<Long, String> selectStaffNameByIds(Set<Long> ids);
+
+    RemoteErpStaffVo selectStaffByStaffName(String staffName);
+
+}

+ 46 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteErpDeptVo.java

@@ -0,0 +1,46 @@
+package org.dromara.system.api.domain.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 部门
+ *
+ * @author AprilWind
+ */
+
+@Data
+@NoArgsConstructor
+public class RemoteErpDeptVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 父部门ID
+     */
+    private Long parentId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    private String status;
+
+    private Integer orderNum;
+
+    private Long companyId;
+
+
+    private String platformCode;
+
+}

+ 64 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteErpStaffVo.java

@@ -0,0 +1,64 @@
+package org.dromara.system.api.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 远程调用 - 人员信息视图对象
+ *
+ * @author Claude
+ * @date 2026-04-02
+ */
+@Data
+public class RemoteErpStaffVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 人员ID
+     */
+    private Long staffId;
+
+    /**
+     * 人员编码
+     */
+    private String staffCode;
+
+    /**
+     * 姓名
+     */
+    private String staffName;
+
+    /**
+     * 所属部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 所属部门名称
+     */
+    private String deptName;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 岗位ID
+     */
+    private Long postId;
+
+    /**
+     * 岗位名称
+     */
+    private String postName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+}

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

@@ -107,7 +107,10 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "statement_invoice_detail",
         "statement_invoice_product",
         "external_",
-        "sys_tax_code"
+        "sys_tax_code",
+        "erp_company",
+        "erp_dept",
+        "erp_staff"
         // 注意:前缀匹配需特殊处理(如 qrtz_),见 isIgnoreTable 方法
     ));
 

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

@@ -63,6 +63,9 @@ public class CustomerInfoController extends BaseController {
     @DubboReference
     private RemoteComStaffService remoteComStaffService;
 
+    @DubboReference
+    private RemoteErpStaffService remoteErpStaffService;
+
     private final ICustomerInfoService customerInfoService;
 
     /**
@@ -233,7 +236,7 @@ public class CustomerInfoController extends BaseController {
     @Log(title = "客户信息", businessType = BusinessType.IMPORT)
     @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
-        ExcelResult<CustomerInfoImportVo> result = ExcelUtil.importExcel(file.getInputStream(), CustomerInfoImportVo.class, new CustomerImportListener(updateSupport, remoteComCompanyService, remoteComCustomerLevelService, remoteCreditLevelService, remoteComCurrencyService, remoteComCustomerTypeService, remoteProductTaxrateService, remoteComStaffService));
+        ExcelResult<CustomerInfoImportVo> result = ExcelUtil.importExcel(file.getInputStream(), CustomerInfoImportVo.class, new CustomerImportListener(updateSupport, remoteComCompanyService, remoteComCustomerLevelService, remoteCreditLevelService, remoteComCurrencyService, remoteComCustomerTypeService, remoteProductTaxrateService, remoteComStaffService, remoteErpStaffService));
         return R.ok(result.getAnalysis());
     }
 

+ 106 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierErpInfoController.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.SupplierErpInfoVo;
+import org.dromara.customer.domain.bo.SupplierErpInfoBo;
+import org.dromara.customer.service.ISupplierErpInfoService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * erp供应商信息
+ * 前端访问路由地址为:/customer/erpSupplierInfo
+ *
+ * @author LionLi
+ * @date 2026-04-03
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/erpSupplierInfo")
+public class SupplierErpInfoController extends BaseController {
+
+    private final ISupplierErpInfoService supplierErpInfoService;
+
+    /**
+     * 查询erp供应商信息列表
+     */
+    //@SaCheckPermission("customer:erpSupplierInfo:list")
+    @GetMapping("/list")
+    public TableDataInfo<SupplierErpInfoVo> list(SupplierErpInfoBo bo, PageQuery pageQuery) {
+        return supplierErpInfoService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出erp供应商信息列表
+     */
+    //@SaCheckPermission("customer:erpSupplierInfo:export")
+    @Log(title = "erp供应商信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SupplierErpInfoBo bo, HttpServletResponse response) {
+        List<SupplierErpInfoVo> list = supplierErpInfoService.queryList(bo);
+        ExcelUtil.exportExcel(list, "erp供应商信息", SupplierErpInfoVo.class, response);
+    }
+
+    /**
+     * 获取erp供应商信息详细信息
+     *
+     * @param id 主键
+     */
+    //@SaCheckPermission("customer:erpSupplierInfo:query")
+    @GetMapping("/{id}")
+    public R<SupplierErpInfoVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(supplierErpInfoService.queryById(id));
+    }
+
+    /**
+     * 新增erp供应商信息
+     */
+    //@SaCheckPermission("customer:erpSupplierInfo:add")
+    @Log(title = "erp供应商信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SupplierErpInfoBo bo) {
+        return toAjax(supplierErpInfoService.insertByBo(bo));
+    }
+
+    /**
+     * 修改erp供应商信息
+     */
+    //@SaCheckPermission("customer:erpSupplierInfo:edit")
+    @Log(title = "erp供应商信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SupplierErpInfoBo bo) {
+        return toAjax(supplierErpInfoService.updateByBo(bo));
+    }
+
+    /**
+     * 删除erp供应商信息
+     *
+     * @param ids 主键串
+     */
+    //@SaCheckPermission("customer:erpSupplierInfo:remove")
+    @Log(title = "erp供应商信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(supplierErpInfoService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

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

@@ -24,10 +24,7 @@ import org.dromara.customer.domain.vo.SupplierInfoVo;
 import org.dromara.customer.listener.SupplierImportListener;
 import org.dromara.customer.service.ISupplierInfoService;
 import org.dromara.customer.service.ISupplierProcurementService;
-import org.dromara.system.api.RemoteComCompanyService;
-import org.dromara.system.api.RemoteComStaffService;
-import org.dromara.system.api.RemoteSupplierLevelService;
-import org.dromara.system.api.RemoteSupplierTypeService;
+import org.dromara.system.api.*;
 import org.springframework.http.MediaType;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -56,7 +53,7 @@ public class SupplierInfoController extends BaseController {
     private RemoteComCompanyService remoteComCompanyService;
 
     @DubboReference
-    private RemoteComStaffService remoteComStaffService;
+    private RemoteErpStaffService remoteErpStaffService;
 
     @DubboReference
     private RemoteSupplierTypeService remoteSupplierTypeService;
@@ -64,6 +61,12 @@ public class SupplierInfoController extends BaseController {
     @DubboReference
     private RemoteSupplierLevelService remoteSupplierLevelService;
 
+    @DubboReference
+    private RemoteComCurrencyService remoteComCurrencyService;
+
+    @DubboReference
+    private RemoteProductTaxrateService remoteProductTaxrateService;
+
 
     private final ISupplierInfoService supplierInfoService;
 
@@ -242,7 +245,7 @@ public class SupplierInfoController extends BaseController {
     @Log(title = "供应商信息", businessType = BusinessType.IMPORT)
     @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
-        ExcelResult<SupplierInfoImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SupplierInfoImportVo.class, new SupplierImportListener(updateSupport, remoteComCompanyService, remoteComStaffService, remoteSupplierTypeService, remoteSupplierLevelService));
+        ExcelResult<SupplierInfoImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SupplierInfoImportVo.class, new SupplierImportListener(updateSupport, remoteComCompanyService, remoteErpStaffService, remoteSupplierTypeService, remoteSupplierLevelService, remoteComCurrencyService, remoteProductTaxrateService));
         return R.ok(result.getAnalysis());
     }
 

+ 0 - 48
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInfo.java

@@ -61,15 +61,6 @@ public class CustomerInfo extends TenantEntity {
      * 统一社会信用代码
      */
     private String socialCreditCode;
-    /**
-     * 客户来源编码
-     */
-    private String sourceNo;
-
-    /**
-     * 客户来源
-     */
-    private String sourceName;
 
 
     private Long belongDeptId;
@@ -198,31 +189,6 @@ public class CustomerInfo extends TenantEntity {
      */
     private String remark;
 
-    /**
-     * 单价含税
-     */
-    private String unitPrice;
-
-    /**
-     * 账款额度超限 0不启用 1启用
-     */
-    private String creditLimit;
-
-    /**
-     * 额度超期 0不启用 1启用
-     */
-    private String creditTimeLimit;
-
-    /**
-     * 销售通路编号
-     */
-    private String sellChannelNo;
-
-    /**
-     * 销售通路
-     */
-    private String sellChannel;
-
     /**
      * 销售开票类型
      */
@@ -233,18 +199,4 @@ public class CustomerInfo extends TenantEntity {
      */
     private String sellInvoiceType;
 
-    /**
-     * 交易币别
-     */
-    private Long dealCurrencyId;
-
-    /**
-     * 账款归属
-     */
-    private String accountBelong;
-
-    /**
-     * 税码
-     */
-    private Long rateId;
 }

+ 40 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerSalesInfo.java

@@ -125,4 +125,44 @@ public class CustomerSalesInfo extends TenantEntity {
      */
     private String remark;
 
+    /**
+     * 客户来源
+     */
+    private String customerSource;
+
+    /**
+     * 单价含税
+     */
+    private String unitPrice;
+
+    /**
+     * 账款额度超限 0不启用 1启用
+     */
+    private String creditLimit;
+
+    /**
+     * 额度超期 0不启用 1启用
+     */
+    private String creditTimeLimit;
+
+    /**
+     * 销售通路
+     */
+    private String sellChannel;
+
+    /**
+     * 交易币别
+     */
+    private Long dealCurrencyId;
+
+    /**
+     * 税码
+     */
+    private Long rateId;
+
+    /**
+     * 账款归属
+     */
+    private String accountBelong;
+
 }

+ 99 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SupplierErpInfo.java

@@ -0,0 +1,99 @@
+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.io.Serial;
+
+/**
+ * erp供应商信息对象 supplier_erp_info
+ *
+ * @author LionLi
+ * @date 2026-04-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("supplier_erp_info")
+public class SupplierErpInfo extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联供应商ID
+     */
+    private Long supplierId;
+
+    /**
+     * 采购人员id
+     */
+    private Long purchaseId;
+
+    /**
+     * 所属部门
+     */
+    private Long belongingDepartmentId;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 单价含税
+     */
+    private String unitPrice;
+
+    /**
+     * 交易币别
+     */
+    private Long dealCurrencyId;
+
+    /**
+     * 账款归属
+     */
+    private String accountBelong;
+
+    /**
+     * 税码id
+     */
+    private Long rateId;
+
+    /**
+     * 采购开票类型id
+     */
+    private Long purchaseInvoiceId;
+
+    /**
+     * 采购开票类型编号
+     */
+    private String purchaseInvoiceNo;
+
+    /**
+     * 采购开票类型
+     */
+    private String purchaseInvoice;
+
+    private String settlementMethod;
+
+
+}

+ 0 - 50
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInfoBo.java

@@ -67,16 +67,6 @@ public class CustomerInfoBo extends BaseEntity {
      */
     private String socialCreditCode;
 
-    /**
-     * 客户来源编码
-     */
-    private String sourceNo;
-
-    /**
-     * 客户来源
-     */
-    private String sourceName;
-
     /**
      * 企业简称
      */
@@ -194,31 +184,6 @@ public class CustomerInfoBo extends BaseEntity {
      */
     private String status;
 
-    /**
-     * 单价含税
-     */
-    private String unitPrice;
-
-    /**
-     * 账款额度超限 0不启用 1启用
-     */
-    private String creditLimit;
-
-    /**
-     * 额度超期 0不启用 1启用
-     */
-    private String creditTimeLimit;
-
-    /**
-     * 销售通路编号
-     */
-    private String sellChannelNo;
-
-    /**
-     * 销售通路
-     */
-    private String sellChannel;
-
     /**
      * 销售开票类型
      */
@@ -229,21 +194,6 @@ public class CustomerInfoBo extends BaseEntity {
      */
     private String sellInvoiceType;
 
-    /**
-     * 交易币别
-     */
-    private Long dealCurrencyId;
-
-    /**
-     * 账款归属
-     */
-    private String accountBelong;
-
-    /**
-     * 税码
-     */
-    private Long rateId;
-
     /**
      * 备注
      */

+ 40 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerSalesInfoBo.java

@@ -116,6 +116,46 @@ public class CustomerSalesInfoBo extends BaseEntity {
      */
     private String status;
 
+    /**
+     * 客户来源
+     */
+    private String customerSource;
+
+    /**
+     * 单价含税
+     */
+    private String unitPrice;
+
+    /**
+     * 账款额度超限 0不启用 1启用
+     */
+    private String creditLimit;
+
+    /**
+     * 额度超期 0不启用 1启用
+     */
+    private String creditTimeLimit;
+
+    /**
+     * 销售通路
+     */
+    private String sellChannel;
+
+    /**
+     * 交易币别
+     */
+    private Long dealCurrencyId;
+
+    /**
+     * 税码
+     */
+    private Long rateId;
+
+    /**
+     * 账款归属
+     */
+    private String accountBelong;
+
     /**
      * 备注
      */

+ 91 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SupplierErpInfoBo.java

@@ -0,0 +1,91 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.SupplierErpInfo;
+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.*;
+
+/**
+ * erp供应商信息业务对象 supplier_erp_info
+ *
+ * @author LionLi
+ * @date 2026-04-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SupplierErpInfo.class, reverseConvertGenerate = false)
+public class SupplierErpInfoBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 关联供应商ID
+     */
+    private Long supplierId;
+
+    /**
+     * 采购人员id
+     */
+    private Long purchaseId;
+
+    /**
+     * 所属部门
+     */
+    private Long belongingDepartmentId;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 单价含税
+     */
+    private String unitPrice;
+
+    /**
+     * 交易币别
+     */
+    private Long dealCurrencyId;
+
+    /**
+     * 账款归属
+     */
+    private String accountBelong;
+
+    /**
+     * 税码id
+     */
+    private Long rateId;
+
+    /**
+     * 采购开票类型id
+     */
+    private Long purchaseInvoiceId;
+
+    /**
+     * 采购开票类型编号
+     */
+    private String purchaseInvoiceNo;
+
+    /**
+     * 采购开票类型
+     */
+    private String purchaseInvoice;
+
+
+    private String settlementMethod;
+
+}

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

@@ -381,5 +381,7 @@ public class SupplierInfoBo extends BaseEntity {
 
     private String settlementMethod;
 
+    private SupplierErpInfoBo supplierErpInfo;
+
 
 }

+ 0 - 50
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInfoVo.java

@@ -76,16 +76,6 @@ public class CustomerInfoVo implements Serializable {
      */
     private String socialCreditCode;
 
-    /**
-     * 客户来源编码
-     */
-    private String sourceNo;
-
-    /**
-     * 客户来源
-     */
-    private String sourceName;
-
     private Long belongDeptId;
 
     /**
@@ -226,31 +216,6 @@ public class CustomerInfoVo implements Serializable {
 
     private String enterpriseScale;//企业规模
 
-    /**
-     * 单价含税
-     */
-    private String unitPrice;
-
-    /**
-     * 账款额度超限 0不启用 1启用
-     */
-    private String creditLimit;
-
-    /**
-     * 额度超期 0不启用 1启用
-     */
-    private String creditTimeLimit;
-
-    /**
-     * 销售通路编号
-     */
-    private String sellChannelNo;
-
-    /**
-     * 销售通路
-     */
-    private String sellChannel;
-
     /**
      * 销售开票类型
      */
@@ -261,21 +226,6 @@ public class CustomerInfoVo implements Serializable {
      */
     private String sellInvoiceType;
 
-    /**
-     * 交易币别
-     */
-    private Long dealCurrencyId;
-
-    /**
-     * 账款归属
-     */
-    private String accountBelong;
-
-    /**
-     * 税码
-     */
-    private Long rateId;
-
     /**
      * 备注
      */

+ 40 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerSalesInfoVo.java

@@ -140,6 +140,46 @@ public class CustomerSalesInfoVo implements Serializable {
     @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
     private String status;
 
+    /**
+     * 客户来源
+     */
+    private String customerSource;
+
+    /**
+     * 单价含税
+     */
+    private String unitPrice;
+
+    /**
+     * 账款额度超限 0不启用 1启用
+     */
+    private String creditLimit;
+
+    /**
+     * 额度超期 0不启用 1启用
+     */
+    private String creditTimeLimit;
+
+    /**
+     * 销售通路
+     */
+    private String sellChannel;
+
+    /**
+     * 交易币别
+     */
+    private Long dealCurrencyId;
+
+    /**
+     * 税码
+     */
+    private Long rateId;
+
+    /**
+     * 账款归属
+     */
+    private String accountBelong;
+
     /**
      * 备注
      */

+ 112 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/SupplierErpInfoVo.java

@@ -0,0 +1,112 @@
+package org.dromara.customer.domain.vo;
+
+import org.dromara.customer.domain.SupplierErpInfo;
+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 org.dromara.customer.domain.bo.SupplierErpInfoBo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * erp供应商信息视图对象 supplier_erp_info
+ *
+ * @author LionLi
+ * @date 2026-04-03
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SupplierErpInfo.class)
+public class SupplierErpInfoVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 关联供应商ID
+     */
+    @ExcelProperty(value = "关联供应商ID")
+    private Long supplierId;
+
+    /**
+     * 采购人员id
+     */
+    @ExcelProperty(value = "采购人员id")
+    private Long purchaseId;
+
+    /**
+     * 所属部门
+     */
+    @ExcelProperty(value = "所属部门")
+    private Long belongingDepartmentId;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 单价含税
+     */
+    @ExcelProperty(value = "单价含税")
+    private String unitPrice;
+
+    /**
+     * 交易币别
+     */
+    @ExcelProperty(value = "交易币别")
+    private Long dealCurrencyId;
+
+    /**
+     * 账款归属
+     */
+    @ExcelProperty(value = "账款归属")
+    private String accountBelong;
+
+    /**
+     * 税码id
+     */
+    @ExcelProperty(value = "税码id")
+    private Long rateId;
+
+    /**
+     * 采购开票类型id
+     */
+    @ExcelProperty(value = "采购开票类型id")
+    private Long purchaseInvoiceId;
+
+    /**
+     * 采购开票类型编号
+     */
+    @ExcelProperty(value = "采购开票类型编号")
+    private String purchaseInvoiceNo;
+
+    /**
+     * 采购开票类型
+     */
+    @ExcelProperty(value = "采购开票类型")
+    private String purchaseInvoice;
+
+    private String settlementMethod;
+
+}

+ 5 - 3
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/SupplierInfoVo.java

@@ -1,7 +1,9 @@
 package org.dromara.customer.domain.vo;
 
 import org.dromara.common.translation.annotation.Translation;
+
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.common.translation.constant.TransConstant;
 import org.dromara.customer.domain.SupplierInfo;
@@ -11,6 +13,7 @@ import org.dromara.common.excel.annotation.ExcelDictFormat;
 import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
+import org.dromara.customer.domain.bo.SupplierErpInfoBo;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -409,7 +412,7 @@ public class SupplierInfoVo implements Serializable {
      */
     private String city;
 
-    private Map<String,Object> otherCustomersMap;
+    private Map<String, Object> otherCustomersMap;
 
 
     private Date createTime;
@@ -443,7 +446,6 @@ public class SupplierInfoVo implements Serializable {
      */
     private String paidInCapital;
 
-
-
+    private SupplierErpInfoVo supplierErpInfo;
 
 }

+ 35 - 17
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/listener/CustomerImportListener.java

@@ -50,6 +50,8 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
 
     private RemoteComStaffService remoteComStaffService;
 
+    private RemoteErpStaffService remoteErpStaffService;
+
     private IEnterpriseScaleService scaleService;
 
     private IIndustryCategoryService industryCategoryService;
@@ -69,7 +71,8 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
                                   RemoteComCurrencyService remoteComCurrencyService,
                                   RemoteComCustomerTypeService remoteComCustomerTypeService,
                                   RemoteProductTaxrateService remoteProductTaxrateService,
-                                  RemoteComStaffService remoteComStaffService) {
+                                  RemoteComStaffService remoteComStaffService,
+                                  RemoteErpStaffService remoteErpStaffService) {
         this.customerInfoService = SpringUtils.getBean(ICustomerInfoService.class);
         this.remoteComCompanyService = remoteComCompanyService;
         this.remoteComCustomerLevelService = remoteComCustomerLevelService;
@@ -78,6 +81,7 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
         this.remoteComCustomerTypeService = remoteComCustomerTypeService;
         this.remoteProductTaxrateService = remoteProductTaxrateService;
         this.remoteComStaffService = remoteComStaffService;
+        this.remoteErpStaffService = remoteErpStaffService;
         this.scaleService = SpringUtils.getBean(IEnterpriseScaleService.class);
         this.industryCategoryService = SpringUtils.getBean(IIndustryCategoryService.class);
         this.isUpdateSupport = isUpdateSupport;
@@ -101,7 +105,7 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
             }
             RemoteComCompanyVo remoteComCompanyVo = remoteComCompanyService.selectByCompanyName(customerInfoImportVo.getCompanyName());
             RemoteComCustomerLevelVo remoteComCustomerLevelVo = remoteComCustomerLevelService.selectCustomerLeveByLevelName(customerInfoImportVo.getCustomerLevelName());
-            RemoteComCurrencyVo remoteComCurrencyVo = remoteComCurrencyService.selectByCurrencyName(customerInfoImportVo.getDealCurrency());
+            RemoteComCurrencyVo remoteComCurrencyVo = remoteComCurrencyService.selectByCurrencyName(customerInfoImportVo.getDealCurrency().equals("RMB") ? "人民币" : "");
             RemoteComCustomerTypeVo remoteComCustomerTypeVo = remoteComCustomerTypeService.selectCustomerTypeByTypeName(customerInfoImportVo.getCustomerTypeName());
             RemoteProductTaxrateVo remoteProductTaxrateVo = remoteProductTaxrateService.selectByTaxrateNo(customerInfoImportVo.getRateName());
             EnterpriseScaleVo enterpriseScaleVo = scaleService.selectEnterpriseScaleByScaleName(customerInfoImportVo.getEnterpriseScale());
@@ -110,11 +114,12 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
                 : customerInfoImportVo.getCreditLevel().equals("1") ? "B" : customerInfoImportVo.getCreditLevel().equals("2") ? "C"
                 : customerInfoImportVo.getCreditLevel().equals("3") ? "D" : customerInfoImportVo.getCreditLevel().equals("4") ? "E"
                 : customerInfoImportVo.getCreditLevel().equals("5") ? "F" : "G");
-            RemoteComStaffVo SalesPerson = remoteComStaffService.selectStaffByStaffName(customerInfoImportVo.getSalesPersonName());
-            RemoteComStaffVo ServiceStaff = remoteComStaffService.selectStaffByStaffName(customerInfoImportVo.getServiceStaffName());
+            RemoteErpStaffVo SalesPerson = remoteErpStaffService.selectStaffByStaffName(customerInfoImportVo.getSalesPersonNo());
+            RemoteErpStaffVo ServiceStaff = remoteErpStaffService.selectStaffByStaffName(customerInfoImportVo.getServiceStaffNo());
             CustomerSalesInfoBo customerSalesInfo = new CustomerSalesInfoBo();
             if (ObjectUtil.isNotEmpty(SalesPerson)) {
                 customerSalesInfo.setSalesPersonId(SalesPerson.getStaffId());
+                customerSalesInfo.setBelongingDepartmentId(SalesPerson.getDeptId());
             }
             if (ObjectUtil.isNotEmpty(ServiceStaff)) {
                 customerSalesInfo.setServiceStaffId(ServiceStaff.getStaffId());
@@ -122,10 +127,33 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
             if (ObjectUtil.isNotEmpty(remoteCreditLevelVo)) {
                 customerSalesInfo.setCreditLevelId(remoteCreditLevelVo.getId());
             }
+            if (ObjectUtil.isNotEmpty(remoteComCurrencyVo)) {
+                customerSalesInfo.setDealCurrencyId(remoteComCurrencyVo.getId());
+            }
+            if (ObjectUtil.isNotEmpty(remoteProductTaxrateVo)) {
+                customerSalesInfo.setRateId(remoteProductTaxrateVo.getId());
+            }
+            if (ObjectUtil.isNotEmpty(customerInfoImportVo.getSourceName())) {
+                customerSalesInfo.setCustomerSource("1");
+            }
+            if (ObjectUtil.isNotEmpty(customerInfoImportVo.getSellChannelNo())) {
+                customerSalesInfo.setSellChannel("1");
+            }
+            if (ObjectUtil.isNotEmpty(customerInfoImportVo.getUnitPrice())) {
+                customerSalesInfo.setUnitPrice(customerInfoImportVo.getUnitPrice());
+            }
+            if (ObjectUtil.isNotEmpty(customerInfoImportVo.getCreditTimeLimit())) {
+                customerSalesInfo.setCreditTimeLimit(customerInfoImportVo.getCreditTimeLimit());
+            }
+            if (ObjectUtil.isNotEmpty(customerInfoImportVo.getCreditLimit())) {
+                customerSalesInfo.setCreditLimit(customerInfoImportVo.getCreditLimit());
+            }
+            if (ObjectUtil.isNotEmpty(customerInfoImportVo.getAccountBelong())) {
+                customerSalesInfo.setAccountBelong(customerInfoImportVo.getAccountBelong());
+            }
 
             // 验证是否存在这个客户
             if (ObjectUtil.isNull(customerInfo)) {
-
                 CustomerInfoBo customerInfoBo = BeanUtil.toBean(customerInfoImportVo, CustomerInfoBo.class);
                 if (ObjectUtil.isNotEmpty(remoteComCompanyVo)) {
                     customerInfoBo.setBelongCompanyId(remoteComCompanyVo.getId());
@@ -133,9 +161,7 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
                 if (ObjectUtil.isNotEmpty(remoteComCustomerLevelVo)) {
                     customerInfoBo.setCustomerLevelId(remoteComCustomerLevelVo.getId());
                 }
-                if (ObjectUtil.isNotEmpty(remoteComCurrencyVo)) {
-                    customerInfoBo.setDealCurrencyId(remoteComCurrencyVo.getId());
-                }
+
                 if (ObjectUtil.isNotEmpty(remoteComCustomerTypeVo)) {
                     customerInfoBo.setCustomerTypeId(remoteComCustomerTypeVo.getId());
                 }
@@ -145,9 +171,7 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
                 if (ObjectUtil.isNotEmpty(industryCategoryVo)) {
                     customerInfoBo.setIndustryCategoryId(industryCategoryVo.getId());
                 }
-                if (ObjectUtil.isNotEmpty(remoteProductTaxrateVo)) {
-                    customerInfoBo.setRateId(remoteProductTaxrateVo.getId());
-                }
+
 
                 ValidatorUtils.validate(customerInfoBo);
                 customerInfoBo.setCreateBy(operUserId);
@@ -165,9 +189,6 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
                 if (ObjectUtil.isNotEmpty(remoteComCustomerLevelVo)) {
                     customerInfoBo.setCustomerLevelId(remoteComCustomerLevelVo.getId());
                 }
-                if (ObjectUtil.isNotEmpty(remoteComCurrencyVo)) {
-                    customerInfoBo.setDealCurrencyId(remoteComCurrencyVo.getId());
-                }
                 if (ObjectUtil.isNotEmpty(remoteComCustomerTypeVo)) {
                     customerInfoBo.setCustomerTypeId(remoteComCustomerTypeVo.getId());
                 }
@@ -177,9 +198,6 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
                 if (ObjectUtil.isNotEmpty(industryCategoryVo)) {
                     customerInfoBo.setIndustryCategoryId(industryCategoryVo.getId());
                 }
-                if (ObjectUtil.isNotEmpty(remoteProductTaxrateVo)) {
-                    customerInfoBo.setRateId(remoteProductTaxrateVo.getId());
-                }
                 ValidatorUtils.validate(customerInfoBo);
 
                 customerInfoBo.setUpdateBy(operUserId);

+ 46 - 19
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/listener/SupplierImportListener.java

@@ -14,18 +14,13 @@ import org.dromara.common.core.utils.ValidatorUtils;
 import org.dromara.common.excel.core.ExcelListener;
 import org.dromara.common.excel.core.ExcelResult;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.customer.domain.bo.SupplierErpInfoBo;
 import org.dromara.customer.domain.bo.SupplierInfoBo;
 import org.dromara.customer.domain.vo.SupplierInfoImportVo;
 import org.dromara.customer.domain.vo.SupplierInfoVo;
 import org.dromara.customer.service.ISupplierInfoService;
-import org.dromara.system.api.RemoteComCompanyService;
-import org.dromara.system.api.RemoteComStaffService;
-import org.dromara.system.api.RemoteSupplierLevelService;
-import org.dromara.system.api.RemoteSupplierTypeService;
-import org.dromara.system.api.domain.vo.RemoteComCompanyVo;
-import org.dromara.system.api.domain.vo.RemoteComStaffVo;
-import org.dromara.system.api.domain.vo.RemoteSupplierLevelVo;
-import org.dromara.system.api.domain.vo.RemoteSupplierTypeVo;
+import org.dromara.system.api.*;
+import org.dromara.system.api.domain.vo.*;
 
 import java.util.List;
 
@@ -37,11 +32,15 @@ public class SupplierImportListener extends AnalysisEventListener<SupplierInfoIm
 
     private RemoteComCompanyService remoteComCompanyService;
 
-    private RemoteComStaffService remoteComStaffService;
+    private RemoteErpStaffService remoteErpStaffService;
     private RemoteSupplierTypeService remoteSupplierTypeService;
 
     private RemoteSupplierLevelService remoteSupplierLevelService;
 
+    private RemoteComCurrencyService remoteComCurrencyService;
+
+    private RemoteProductTaxrateService remoteProductTaxrateService;
+
     private final Boolean isUpdateSupport;
 
     private final Long operUserId;
@@ -53,15 +52,19 @@ public class SupplierImportListener extends AnalysisEventListener<SupplierInfoIm
 
     public SupplierImportListener(Boolean isUpdateSupport,
                                   RemoteComCompanyService remoteComCompanyService,
-                                  RemoteComStaffService remoteComStaffService,
+                                  RemoteErpStaffService remoteErpStaffService,
                                   RemoteSupplierTypeService remoteSupplierTypeService,
-                                  RemoteSupplierLevelService remoteSupplierLevelService
+                                  RemoteSupplierLevelService remoteSupplierLevelService,
+                                  RemoteComCurrencyService remoteComCurrencyService,
+                                  RemoteProductTaxrateService remoteProductTaxrateService
     ) {
         this.supplierInfoService = SpringUtils.getBean(ISupplierInfoService.class);
         this.remoteComCompanyService = remoteComCompanyService;
-        this.remoteComStaffService = remoteComStaffService;
+        this.remoteErpStaffService = remoteErpStaffService;
         this.remoteSupplierTypeService = remoteSupplierTypeService;
         this.remoteSupplierLevelService = remoteSupplierLevelService;
+        this.remoteComCurrencyService = remoteComCurrencyService;
+        this.remoteProductTaxrateService = remoteProductTaxrateService;
         this.isUpdateSupport = isUpdateSupport;
         this.operUserId = LoginHelper.getLoginUser().getUserId();
     }
@@ -82,10 +85,38 @@ public class SupplierImportListener extends AnalysisEventListener<SupplierInfoIm
                 return;
             }
             RemoteComCompanyVo remoteComCompanyVo = remoteComCompanyService.selectByCompanyName(supplierInfoImportVo.getOwnedCompanyName());
-            RemoteComStaffVo buyer = remoteComStaffService.selectStaffByStaffName(supplierInfoImportVo.getBuyerName());
+            RemoteErpStaffVo buyer = remoteErpStaffService.selectStaffByStaffName(supplierInfoImportVo.getBuyerNo());
+            RemoteComCurrencyVo remoteComCurrencyVo = remoteComCurrencyService.selectByCurrencyName(supplierInfoImportVo.getDealCurrency().equals("RMB") ? "人民币" : "");
+            RemoteProductTaxrateVo remoteProductTaxrateVo = remoteProductTaxrateService.selectByTaxrateNo(supplierInfoImportVo.getRateName());
             RemoteSupplierTypeVo remoteSupplierTypeVo = remoteSupplierTypeService.selectByTypeName(supplierInfoImportVo.getSupplierTypeName());
             RemoteSupplierLevelVo remoteSupplierLevelVo = remoteSupplierLevelService.selectByLevelName(supplierInfoImportVo.getSupplierLevelName());
+            SupplierErpInfoBo supplierErpInfoBo = new SupplierErpInfoBo();
+            if (ObjectUtil.isNotEmpty(buyer)) {
+                supplierErpInfoBo.setPurchaseId(buyer.getStaffId());
+            }
+            if (ObjectUtil.isNotEmpty(remoteComCurrencyVo)) {
+                supplierErpInfoBo.setDealCurrencyId(remoteComCurrencyVo.getId());
+            }
+            if (ObjectUtil.isNotEmpty(remoteProductTaxrateVo)) {
+                supplierErpInfoBo.setRateId(remoteProductTaxrateVo.getId());
+            }
+
+            if (ObjectUtil.isNotEmpty(supplierInfoImportVo.getUnitPrice())) {
+                supplierErpInfoBo.setUnitPrice(supplierInfoImportVo.getUnitPrice());
+            }
 
+            if (ObjectUtil.isNotEmpty(supplierInfoImportVo.getAccountBelong())) {
+                supplierErpInfoBo.setAccountBelong(supplierInfoImportVo.getAccountBelong());
+            }
+            if (ObjectUtil.isNotEmpty(supplierInfoImportVo.getInvoiceTypeNo())) {
+                supplierErpInfoBo.setPurchaseInvoiceNo(supplierInfoImportVo.getInvoiceTypeNo());
+            }
+            if (ObjectUtil.isNotEmpty(supplierInfoImportVo.getInvoiceType())) {
+                supplierErpInfoBo.setPurchaseInvoice(supplierInfoImportVo.getInvoiceType());
+            }
+            if (ObjectUtil.isNotEmpty(supplierInfoImportVo.getBuyType())) {
+                supplierErpInfoBo.setSettlementMethod(supplierInfoImportVo.getBuyType());
+            }
             // 验证是否存在这个供应商
             if (ObjectUtil.isNull(supplierInfoVo)) {
                 SupplierInfoBo supplierInfoBo = BeanUtil.toBean(supplierInfoImportVo, SupplierInfoBo.class);
@@ -95,15 +126,13 @@ public class SupplierImportListener extends AnalysisEventListener<SupplierInfoIm
                 if (ObjectUtil.isNotEmpty(remoteComCompanyVo)) {
                     supplierInfoBo.setOwnedCompany(remoteComCompanyVo.getId());
                 }
-                if (ObjectUtil.isNotEmpty(buyer)) {
-                    supplierInfoBo.setBuyer(buyer.getStaffId());
-                }
                 if (ObjectUtil.isNotEmpty(remoteSupplierTypeVo)) {
                     supplierInfoBo.setSupplierType(remoteSupplierTypeVo.getId());
                 }
                 if (ObjectUtil.isNotEmpty(remoteSupplierLevelVo)) {
                     supplierInfoBo.setCooperateLevel(remoteSupplierLevelVo.getId());
                 }
+                supplierInfoBo.setSupplierErpInfo(supplierErpInfoBo);
                 supplierInfoService.addSupplierInfo(supplierInfoBo);
                 successNum++;
                 successMsg.append("<br/>").append(successNum).append("、供应商名称 ").append(supplierInfoBo.getEnterpriseName()).append(" 导入成功");
@@ -117,15 +146,13 @@ public class SupplierImportListener extends AnalysisEventListener<SupplierInfoIm
                 if (ObjectUtil.isNotEmpty(remoteComCompanyVo)) {
                     supplierInfoBo.setOwnedCompany(remoteComCompanyVo.getId());
                 }
-                if (ObjectUtil.isNotEmpty(buyer)) {
-                    supplierInfoBo.setBuyer(buyer.getStaffId());
-                }
                 if (ObjectUtil.isNotEmpty(remoteSupplierTypeVo)) {
                     supplierInfoBo.setSupplierType(remoteSupplierTypeVo.getId());
                 }
                 if (ObjectUtil.isNotEmpty(remoteSupplierLevelVo)) {
                     supplierInfoBo.setCooperateLevel(remoteSupplierLevelVo.getId());
                 }
+                supplierInfoBo.setSupplierErpInfo(supplierErpInfoBo);
                 supplierInfoService.updateSupplierInfo(supplierInfoBo);
                 successNum++;
                 successMsg.append("<br/>").append(successNum).append("、供应商名称 ").append(supplierInfoBo.getEnterpriseName()).append(" 更新成功");

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

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.SupplierErpInfo;
+import org.dromara.customer.domain.vo.SupplierErpInfoVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * erp供应商信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-04-03
+ */
+public interface SupplierErpInfoMapper extends BaseMapperPlus<SupplierErpInfo, SupplierErpInfoVo> {
+
+}

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

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

+ 21 - 4
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java

@@ -56,6 +56,11 @@ import java.util.stream.Collectors;
 public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, CustomerInfo> implements ICustomerInfoService {
     @DubboReference
     private RemoteDeptService remoteDeptService;
+
+    @DubboReference
+    private RemoteErpDeptService remoteErpDeptService;
+    @DubboReference
+    private RemoteErpStaffService remoteErpStaffService;
     @DubboReference
     private RemoteUserService remoteUserService;
     @DubboReference
@@ -142,11 +147,11 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
 
         Map<Long, String> staffMap = staffIds.isEmpty()
             ? Collections.emptyMap()
-            : remoteComStaffService.selectStaffNameByIds(staffIds);
+            : remoteErpStaffService.selectStaffNameByIds(staffIds);
 
         Map<Long, String> deptMap = deptIds.isEmpty()
             ? Collections.emptyMap()
-            : remoteDeptService.selectDeptNameByIds(deptIds);
+            : remoteErpDeptService.selectDeptNameByIds(deptIds);
 
         // 先转换
         CustomerSalesInfoVo voObj = MapstructUtils.convert(customerSalesInfo, CustomerSalesInfoVo.class);
@@ -268,11 +273,11 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
             : remoteComCompanyService.selectCompanyNameByIds(companyIds);
         Map<Long, String> staffMap = staffIds.isEmpty()
             ? Collections.emptyMap()
-            : remoteComStaffService.selectStaffNameByIds(staffIds);
+            : remoteErpStaffService.selectStaffNameByIds(staffIds);
 
         Map<Long, String> deptMap = deptIds.isEmpty()
             ? Collections.emptyMap()
-            : remoteDeptService.selectDeptNameByIds(deptIds);
+            : remoteErpDeptService.selectDeptNameByIds(deptIds);
 
         // === 6. 回填人员和部门名称到 salesInfoVo ===
         for (CustomerSalesInfoVo vo : salesInfoVos) {
@@ -1230,6 +1235,11 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
             customerSalesInfoBo.setCustomerId(add.getId());
             CustomerSalesInfo bean = BeanUtil.toBean(customerSalesInfoBo, CustomerSalesInfo.class);
             customerSalesInfoMapper.insert(bean);
+            CustomerBusinessInfo customerBusinessInfo = new CustomerBusinessInfo();
+            customerBusinessInfo.setCustomerId(add.getId());
+            customerBusinessInfo.setBusinessCustomerName(bo.getBusinessCustomerName());
+            customerBusinessInfo.setSocialCreditCode(bo.getSocialCreditCode());
+            customerBusinessInfoMapper.insert(customerBusinessInfo);
         }
         return flag;
     }
@@ -1249,12 +1259,19 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
         if (flag) {
             CustomerSalesInfoBo customerSalesInfoBo = bo.getCustomerSalesInfoBo();
             CustomerSalesInfo customerSalesInfo = customerSalesInfoMapper.selectOne(new LambdaQueryWrapper<CustomerSalesInfo>().eq(CustomerSalesInfo::getCustomerId, update.getId()));
+            CustomerBusinessInfo customerBusinessInfo = customerBusinessInfoMapper.selectOne(new LambdaQueryWrapper<CustomerBusinessInfo>().eq(CustomerBusinessInfo::getCustomerId, update.getId()));
+
             if (customerSalesInfo != null) {
                 customerSalesInfo.setSalesPersonId(customerSalesInfoBo.getSalesPersonId());
                 customerSalesInfo.setServiceStaffId(customerSalesInfoBo.getServiceStaffId());
                 customerSalesInfo.setCreditLevelId(customerSalesInfoBo.getCreditLevelId());
                 customerSalesInfoMapper.updateById(customerSalesInfo);
             }
+            if (customerBusinessInfo != null) {
+                customerBusinessInfo.setBusinessCustomerName(bo.getBusinessCustomerName());
+                customerBusinessInfo.setSocialCreditCode(bo.getSocialCreditCode());
+                customerBusinessInfoMapper.updateById(customerBusinessInfo);
+            }
         }
 
         return flag;

+ 143 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierErpInfoServiceImpl.java

@@ -0,0 +1,143 @@
+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.SupplierErpInfoBo;
+import org.dromara.customer.domain.vo.SupplierErpInfoVo;
+import org.dromara.customer.domain.SupplierErpInfo;
+import org.dromara.customer.mapper.SupplierErpInfoMapper;
+import org.dromara.customer.service.ISupplierErpInfoService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * erp供应商信息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-04-03
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SupplierErpInfoServiceImpl extends ServiceImpl<SupplierErpInfoMapper, SupplierErpInfo> implements ISupplierErpInfoService {
+
+    private final SupplierErpInfoMapper baseMapper;
+
+    /**
+     * 查询erp供应商信息
+     *
+     * @param id 主键
+     * @return erp供应商信息
+     */
+    @Override
+    public SupplierErpInfoVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询erp供应商信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return erp供应商信息分页列表
+     */
+    @Override
+    public TableDataInfo<SupplierErpInfoVo> queryPageList(SupplierErpInfoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SupplierErpInfo> lqw = buildQueryWrapper(bo);
+        Page<SupplierErpInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的erp供应商信息列表
+     *
+     * @param bo 查询条件
+     * @return erp供应商信息列表
+     */
+    @Override
+    public List<SupplierErpInfoVo> queryList(SupplierErpInfoBo bo) {
+        LambdaQueryWrapper<SupplierErpInfo> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SupplierErpInfo> buildQueryWrapper(SupplierErpInfoBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SupplierErpInfo> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SupplierErpInfo::getId);
+        lqw.eq(bo.getSupplierId() != null, SupplierErpInfo::getSupplierId, bo.getSupplierId());
+        lqw.eq(bo.getPurchaseId() != null, SupplierErpInfo::getPurchaseId, bo.getPurchaseId());
+        lqw.eq(bo.getBelongingDepartmentId() != null, SupplierErpInfo::getBelongingDepartmentId, bo.getBelongingDepartmentId());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SupplierErpInfo::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SupplierErpInfo::getPlatformCode, bo.getPlatformCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getUnitPrice()), SupplierErpInfo::getUnitPrice, bo.getUnitPrice());
+        lqw.eq(bo.getDealCurrencyId() != null, SupplierErpInfo::getDealCurrencyId, bo.getDealCurrencyId());
+        lqw.eq(StringUtils.isNotBlank(bo.getAccountBelong()), SupplierErpInfo::getAccountBelong, bo.getAccountBelong());
+        lqw.eq(bo.getPurchaseInvoiceId() != null, SupplierErpInfo::getPurchaseInvoiceId, bo.getPurchaseInvoiceId());
+        lqw.eq(StringUtils.isNotBlank(bo.getPurchaseInvoiceNo()), SupplierErpInfo::getPurchaseInvoiceNo, bo.getPurchaseInvoiceNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getPurchaseInvoice()), SupplierErpInfo::getPurchaseInvoice, bo.getPurchaseInvoice());
+        return lqw;
+    }
+
+    /**
+     * 新增erp供应商信息
+     *
+     * @param bo erp供应商信息
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SupplierErpInfoBo bo) {
+        SupplierErpInfo add = MapstructUtils.convert(bo, SupplierErpInfo.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改erp供应商信息
+     *
+     * @param bo erp供应商信息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SupplierErpInfoBo bo) {
+        SupplierErpInfo update = MapstructUtils.convert(bo, SupplierErpInfo.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SupplierErpInfo entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除erp供应商信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 48 - 20
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierInfoServiceImpl.java

@@ -29,10 +29,7 @@ import org.dromara.customer.domain.*;
 import org.dromara.customer.domain.bo.*;
 import org.dromara.customer.domain.vo.*;
 import org.dromara.customer.enums.SupplierStatusEnum;
-import org.dromara.customer.mapper.SupplierBusinessInfoMapper;
-import org.dromara.customer.mapper.SupplierContactMapper;
-import org.dromara.customer.mapper.SupplierInfoMapper;
-import org.dromara.customer.mapper.SupplyAreaMapper;
+import org.dromara.customer.mapper.*;
 import org.dromara.customer.service.*;
 import org.dromara.customer.utils.qcc.QccUtils;
 import org.dromara.customer.utils.qcc.domain.CompanyInfoResponse;
@@ -81,6 +78,8 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
 
     private final SupplyAreaMapper supplyAreaMapper;
 
+    private final SupplierErpInfoMapper supplierErpInfoMapper;
+
     /**
      * 供应商联系人信息
      */
@@ -2329,18 +2328,39 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean addSupplierInfo(SupplierInfoBo bo) {
+        // 1. 插入供应商主表信息
         SupplierInfo add = MapstructUtils.convert(bo, SupplierInfo.class);
         boolean flag = baseMapper.insert(add) > 0;
-        if (flag) {
-            bo.setId(add.getId());
-            SupplierProcurement procurement = new SupplierProcurement();
-            procurement.setSupplierId(add.getId());
-            procurement.setSupplierNo(add.getSupplierNo());
-            procurement.setPurchaser(bo.getBuyer());
-            procurement.setSettlementMethod(bo.getSettlementMethod());
-            supplierProcurementService.insertByBo(BeanUtil.toBean(procurement, SupplierProcurementBo.class));
-        }
-        return flag;
+        if (!flag) {
+            return false;
+        }
+        bo.setId(add.getId());
+
+        // 2. 准备并校验供应商ERP信息
+        SupplierErpInfoBo supplierErpInfoBo = bo.getSupplierErpInfo();
+        SupplierErpInfo supplierErpInfo = new SupplierErpInfo();
+        supplierErpInfo.setSupplierId(add.getId());
+        supplierErpInfo.setPurchaseId(supplierErpInfoBo.getPurchaseId());
+        supplierErpInfo.setDealCurrencyId(supplierErpInfoBo.getDealCurrencyId());
+        supplierErpInfo.setRateId(supplierErpInfoBo.getRateId());
+        supplierErpInfo.setAccountBelong(supplierErpInfoBo.getAccountBelong());
+        supplierErpInfo.setPurchaseInvoiceId(supplierErpInfoBo.getPurchaseInvoiceId());
+        supplierErpInfo.setPurchaseInvoiceNo(supplierErpInfoBo.getPurchaseInvoiceNo());
+        supplierErpInfo.setPurchaseInvoice(supplierErpInfoBo.getPurchaseInvoice());
+        supplierErpInfo.setUnitPrice(supplierErpInfoBo.getUnitPrice());
+        supplierErpInfo.setSettlementMethod(supplierErpInfoBo.getSettlementMethod());
+        // 3. 插入供应商ERP信息
+        supplierErpInfoMapper.insert(supplierErpInfo);
+
+        // 4. 插入供应商业务信息
+        SupplierBusinessInfo businessInfo = new SupplierBusinessInfo();
+        businessInfo.setSupplierId(add.getId());
+        businessInfo.setBusinessName(bo.getBusinessName());
+        businessInfo.setSocialCreditCode(bo.getSocialCreditCode());
+        supplierBusinessInfoMapper.insert(businessInfo);
+
+        return true;
+
     }
 
     /**
@@ -2355,12 +2375,20 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
         SupplierInfo update = MapstructUtils.convert(bo, SupplierInfo.class);
         boolean flag = baseMapper.updateById(update) > 0;
         if (flag) {
-            SupplierProcurement procurement = new SupplierProcurement();
-            procurement.setSupplierId(update.getId());
-            procurement.setSupplierNo(update.getSupplierNo());
-            procurement.setPurchaser(bo.getBuyer());
-            procurement.setSettlementMethod(bo.getSettlementMethod());
-            supplierProcurementService.updateByBo(BeanUtil.toBean(procurement, SupplierProcurementBo.class));
+            SupplierErpInfoBo supplierErpInfoBo = bo.getSupplierErpInfo();
+            SupplierErpInfo supplierErpInfo = supplierErpInfoMapper.selectOne(new LambdaQueryWrapper<SupplierErpInfo>().eq(SupplierErpInfo::getSupplierId, update.getId()));
+            supplierErpInfo.setSupplierId(update.getId());
+            supplierErpInfo.setPurchaseId(supplierErpInfoBo.getPurchaseId());
+            supplierErpInfo.setDealCurrencyId(supplierErpInfoBo.getDealCurrencyId());
+            supplierErpInfo.setRateId(supplierErpInfoBo.getRateId());
+            supplierErpInfo.setAccountBelong(supplierErpInfoBo.getAccountBelong());
+            supplierErpInfo.setPurchaseInvoiceId(supplierErpInfoBo.getPurchaseInvoiceId());
+            supplierErpInfo.setPurchaseInvoiceNo(supplierErpInfoBo.getPurchaseInvoiceNo());
+            supplierErpInfo.setPurchaseInvoice(supplierErpInfoBo.getPurchaseInvoice());
+            supplierErpInfo.setUnitPrice(supplierErpInfoBo.getUnitPrice());
+            supplierErpInfo.setSettlementMethod(supplierErpInfoBo.getSettlementMethod());
+            supplierErpInfoMapper.updateById(supplierErpInfo);
+
         }
         return flag;
     }

+ 7 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/SupplierErpInfoMapper.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.SupplierErpInfoMapper">
+
+</mapper>

+ 106 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ErpCompanyController.java

@@ -0,0 +1,106 @@
+package org.dromara.system.controller.system;
+
+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.system.domain.vo.ErpCompanyVo;
+import org.dromara.system.domain.bo.ErpCompanyBo;
+import org.dromara.system.service.IErpCompanyService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * erp公司信息
+ * 前端访问路由地址为:/system/erpCompany
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/erpCompany")
+public class ErpCompanyController extends BaseController {
+
+    private final IErpCompanyService erpCompanyService;
+
+    /**
+     * 查询erp公司信息列表
+     */
+    //@SaCheckPermission("system:erpCompany:list")
+    @GetMapping("/list")
+    public TableDataInfo<ErpCompanyVo> list(ErpCompanyBo bo, PageQuery pageQuery) {
+        return erpCompanyService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出erp公司信息列表
+     */
+    //@SaCheckPermission("system:erpCompany:export")
+    @Log(title = "erp公司信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ErpCompanyBo bo, HttpServletResponse response) {
+        List<ErpCompanyVo> list = erpCompanyService.queryList(bo);
+        ExcelUtil.exportExcel(list, "erp公司信息", ErpCompanyVo.class, response);
+    }
+
+    /**
+     * 获取erp公司信息详细信息
+     *
+     * @param id 主键
+     */
+    //@SaCheckPermission("system:erpCompany:query")
+    @GetMapping("/{id}")
+    public R<ErpCompanyVo> getInfo(@NotNull(message = "主键不能为空")
+                                   @PathVariable("id") Long id) {
+        return R.ok(erpCompanyService.queryById(id));
+    }
+
+    /**
+     * 新增erp公司信息
+     */
+    //@SaCheckPermission("system:erpCompany:add")
+    @Log(title = "erp公司信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ErpCompanyBo bo) {
+        return toAjax(erpCompanyService.insertByBo(bo));
+    }
+
+    /**
+     * 修改erp公司信息
+     */
+    //@SaCheckPermission("system:erpCompany:edit")
+    @Log(title = "erp公司信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ErpCompanyBo bo) {
+        return toAjax(erpCompanyService.updateByBo(bo));
+    }
+
+    /**
+     * 删除erp公司信息
+     *
+     * @param ids 主键串
+     */
+    //@SaCheckPermission("system:erpCompany:remove")
+    @Log(title = "erp公司信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(erpCompanyService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 106 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ErpDeptController.java

@@ -0,0 +1,106 @@
+package org.dromara.system.controller.system;
+
+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.system.domain.vo.ErpDeptVo;
+import org.dromara.system.domain.bo.ErpDeptBo;
+import org.dromara.system.service.IErpDeptService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * erp部门
+ * 前端访问路由地址为:/system/erpDept
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/erpDept")
+public class ErpDeptController extends BaseController {
+
+    private final IErpDeptService erpDeptService;
+
+    /**
+     * 查询erp部门列表
+     */
+    //@SaCheckPermission("system:erpDept:list")
+    @GetMapping("/list")
+    public TableDataInfo<ErpDeptVo> list(ErpDeptBo bo, PageQuery pageQuery) {
+        return erpDeptService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出erp部门列表
+     */
+    //@SaCheckPermission("system:erpDept:export")
+    @Log(title = "erp部门", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ErpDeptBo bo, HttpServletResponse response) {
+        List<ErpDeptVo> list = erpDeptService.queryList(bo);
+        ExcelUtil.exportExcel(list, "erp部门", ErpDeptVo.class, response);
+    }
+
+    /**
+     * 获取erp部门详细信息
+     *
+     * @param deptId 主键
+     */
+    //@SaCheckPermission("system:erpDept:query")
+    @GetMapping("/{deptId}")
+    public R<ErpDeptVo> getInfo(@NotNull(message = "主键不能为空")
+                                @PathVariable("deptId") Long deptId) {
+        return R.ok(erpDeptService.queryById(deptId));
+    }
+
+    /**
+     * 新增erp部门
+     */
+    //@SaCheckPermission("system:erpDept:add")
+    @Log(title = "erp部门", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ErpDeptBo bo) {
+        return toAjax(erpDeptService.insertByBo(bo));
+    }
+
+    /**
+     * 修改erp部门
+     */
+    //@SaCheckPermission("system:erpDept:edit")
+    @Log(title = "erp部门", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ErpDeptBo bo) {
+        return toAjax(erpDeptService.updateByBo(bo));
+    }
+
+    /**
+     * 删除erp部门
+     *
+     * @param deptIds 主键串
+     */
+    //@SaCheckPermission("system:erpDept:remove")
+    @Log(title = "erp部门", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{deptIds}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("deptIds") Long[] deptIds) {
+        return toAjax(erpDeptService.deleteWithValidByIds(List.of(deptIds), true));
+    }
+}

+ 106 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ErpStaffController.java

@@ -0,0 +1,106 @@
+package org.dromara.system.controller.system;
+
+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.system.domain.vo.ErpStaffVo;
+import org.dromara.system.domain.bo.ErpStaffBo;
+import org.dromara.system.service.IErpStaffService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * erp人员信息
+ * 前端访问路由地址为:/system/erpStaff
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/erpStaff")
+public class ErpStaffController extends BaseController {
+
+    private final IErpStaffService erpStaffService;
+
+    /**
+     * 查询erp人员信息列表
+     */
+    //@SaCheckPermission("system:erpStaff:list")
+    @GetMapping("/list")
+    public TableDataInfo<ErpStaffVo> list(ErpStaffBo bo, PageQuery pageQuery) {
+        return erpStaffService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出erp人员信息列表
+     */
+    //@SaCheckPermission("system:erpStaff:export")
+    @Log(title = "erp人员信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ErpStaffBo bo, HttpServletResponse response) {
+        List<ErpStaffVo> list = erpStaffService.queryList(bo);
+        ExcelUtil.exportExcel(list, "erp人员信息", ErpStaffVo.class, response);
+    }
+
+    /**
+     * 获取erp人员信息详细信息
+     *
+     * @param staffId 主键
+     */
+    //@SaCheckPermission("system:erpStaff:query")
+    @GetMapping("/{staffId}")
+    public R<ErpStaffVo> getInfo(@NotNull(message = "主键不能为空")
+                                 @PathVariable("staffId") Long staffId) {
+        return R.ok(erpStaffService.queryById(staffId));
+    }
+
+    /**
+     * 新增erp人员信息
+     */
+    //@SaCheckPermission("system:erpStaff:add")
+    @Log(title = "erp人员信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ErpStaffBo bo) {
+        return toAjax(erpStaffService.insertByBo(bo));
+    }
+
+    /**
+     * 修改erp人员信息
+     */
+    //@SaCheckPermission("system:erpStaff:edit")
+    @Log(title = "erp人员信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ErpStaffBo bo) {
+        return toAjax(erpStaffService.updateByBo(bo));
+    }
+
+    /**
+     * 删除erp人员信息
+     *
+     * @param staffIds 主键串
+     */
+    //@SaCheckPermission("system:erpStaff:remove")
+    @Log(title = "erp人员信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{staffIds}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("staffIds") Long[] staffIds) {
+        return toAjax(erpStaffService.deleteWithValidByIds(List.of(staffIds), true));
+    }
+}

+ 169 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ErpCompany.java

@@ -0,0 +1,169 @@
+package org.dromara.system.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;
+
+/**
+ * erp公司信息对象 erp_company
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("erp_company")
+public class ErpCompany extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 会计主体ID
+     */
+    private Long accBnId;
+
+    /**
+     * 会计主体编号
+     */
+    private String accBnNo;
+
+    /**
+     * 公司地址
+     */
+    private String address;
+
+    /**
+     * 开始日期
+     */
+    private Date begDate;
+
+    /**
+     * 经营范围
+     */
+    private String busScp;
+
+    /**
+     * 注册资本金额
+     */
+    private Long capAmt;
+
+    /**
+     * 公司全名
+     */
+    private String companyFullName;
+
+    /**
+     * 法人代表
+     */
+    private String corporation;
+
+    /**
+     * 电子邮箱
+     */
+    private String email;
+
+    /**
+     * 结束日期
+     */
+    private Date endDate;
+
+    /**
+     * 成立日期
+     */
+    private Date foundDate;
+
+    /**
+     * 内部客户ID
+     */
+    private String inCustId;
+
+    /**
+     * 内部供应商ID
+     */
+    private String inSupId;
+
+    /**
+     * 法律代表人
+     */
+    private String lelPer;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 负责人/经办人
+     */
+    private String principal;
+
+    /**
+     * 注册地址
+     */
+    private String regAddr;
+
+    /**
+     * 注册日期
+     */
+    private Date regDate;
+
+    /**
+     * 注册机关
+     */
+    private String regOrg;
+
+    /**
+     * 税务登记号
+     */
+    private String taxNo;
+
+    /**
+     * 公司编号
+     */
+    private String companyCode;
+
+    /**
+     * 公司名称
+     */
+    private String companyName;
+
+    /**
+     * 是否显示(0-是,1-否)
+     */
+    private String isShow;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 127 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ErpDept.java

@@ -0,0 +1,127 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * erp部门对象 erp_dept
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("erp_dept")
+public class ErpDept extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 部门id
+     */
+    @TableId(value = "dept_id")
+    private Long deptId;
+
+    /**
+     * 部门编号
+     */
+    private String deptNo;
+
+    /**
+     * 父部门id
+     */
+    private Long parentId;
+
+    /**
+     * 公司id
+     */
+    private Long companyId;
+
+    /**
+     * 祖级列表
+     */
+    private String ancestors;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 部门类别编码
+     */
+    private String deptCategory;
+
+    /**
+     * 显示顺序
+     */
+    private Long orderNum;
+
+    /**
+     * 负责人
+     */
+    private Long leader;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 部门状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 是否是公司(0是  1否)
+     */
+    private String isCompanyFlag;
+
+    /**
+     * 部门经理id
+     */
+    private Long managerId;
+
+    /**
+     * 部门主管id
+     */
+    private Long chargeId;
+
+    /**
+     * 部门经理编号
+     */
+    private String managerNo;
+
+    /**
+     * 部门主管编号
+     */
+    private String chargeNo;
+
+    /**
+     * 部门经理
+     */
+    private String managerName;
+
+    /**
+     * 部门主管
+     */
+    private String chargeName;
+
+
+}

+ 104 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ErpStaff.java

@@ -0,0 +1,104 @@
+package org.dromara.system.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;
+
+/**
+ * erp人员信息对象 erp_staff
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("erp_staff")
+public class ErpStaff extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 人员ID
+     */
+    @TableId(value = "staff_id")
+    private Long staffId;
+
+    /**
+     * 人员编码
+     */
+    private String staffCode;
+
+    /**
+     * 姓名
+     */
+    private String staffName;
+
+    /**
+     * 所属部门编码
+     */
+    private Long deptId;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 岗位编码
+     */
+    private Long postId;
+
+    /**
+     * 性别
+     */
+    private String sex;
+
+    /**
+     * 角色编码
+     */
+    private Long roleId;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 有效期起始
+     */
+    private Date validFrom;
+
+    /**
+     * 有效期截止
+     */
+    private Date validTo;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 161 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ErpCompanyBo.java

@@ -0,0 +1,161 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.ErpCompany;
+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;
+
+/**
+ * erp公司信息业务对象 erp_company
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ErpCompany.class, reverseConvertGenerate = false)
+public class ErpCompanyBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 会计主体ID
+     */
+    private Long accBnId;
+
+    /**
+     * 会计主体编号
+     */
+    private String accBnNo;
+
+    /**
+     * 公司地址
+     */
+    private String address;
+
+    /**
+     * 开始日期
+     */
+    private Date begDate;
+
+    /**
+     * 经营范围
+     */
+    private String busScp;
+
+    /**
+     * 注册资本金额
+     */
+    private Long capAmt;
+
+    /**
+     * 公司全名
+     */
+    private String companyFullName;
+
+    /**
+     * 法人代表
+     */
+    private String corporation;
+
+    /**
+     * 电子邮箱
+     */
+    private String email;
+
+    /**
+     * 结束日期
+     */
+    private Date endDate;
+
+    /**
+     * 成立日期
+     */
+    private Date foundDate;
+
+    /**
+     * 内部客户ID
+     */
+    private String inCustId;
+
+    /**
+     * 内部供应商ID
+     */
+    private String inSupId;
+
+    /**
+     * 法律代表人
+     */
+    private String lelPer;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 负责人/经办人
+     */
+    private String principal;
+
+    /**
+     * 注册地址
+     */
+    private String regAddr;
+
+    /**
+     * 注册日期
+     */
+    private Date regDate;
+
+    /**
+     * 注册机关
+     */
+    private String regOrg;
+
+    /**
+     * 税务登记号
+     */
+    private String taxNo;
+
+    /**
+     * 公司编号
+     */
+    private String companyCode;
+
+    /**
+     * 公司名称
+     */
+    private String companyName;
+
+    /**
+     * 是否显示(0-是,1-否)
+     */
+    private String isShow;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 119 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ErpDeptBo.java

@@ -0,0 +1,119 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.ErpDept;
+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.*;
+
+/**
+ * erp部门业务对象 erp_dept
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ErpDept.class, reverseConvertGenerate = false)
+public class ErpDeptBo extends BaseEntity {
+
+    /**
+     * 部门id
+     */
+    private Long deptId;
+
+    /**
+     * 部门编号
+     */
+    private String deptNo;
+
+    /**
+     * 父部门id
+     */
+    private Long parentId;
+
+    /**
+     * 公司id
+     */
+    private Long companyId;
+
+    /**
+     * 祖级列表
+     */
+    private String ancestors;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 部门类别编码
+     */
+    private String deptCategory;
+
+    /**
+     * 显示顺序
+     */
+    private Long orderNum;
+
+    /**
+     * 负责人
+     */
+    private Long leader;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 部门状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 是否是公司(0是  1否)
+     */
+    private String isCompanyFlag;
+
+    /**
+     * 部门经理id
+     */
+    private Long managerId;
+
+    /**
+     * 部门主管id
+     */
+    private Long chargeId;
+
+    /**
+     * 部门经理编号
+     */
+    private String managerNo;
+
+    /**
+     * 部门主管编号
+     */
+    private String chargeNo;
+
+    /**
+     * 部门经理
+     */
+    private String managerName;
+
+    /**
+     * 部门主管
+     */
+    private String chargeName;
+
+
+}

+ 96 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ErpStaffBo.java

@@ -0,0 +1,96 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.ErpStaff;
+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;
+
+/**
+ * erp人员信息业务对象 erp_staff
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ErpStaff.class, reverseConvertGenerate = false)
+public class ErpStaffBo extends BaseEntity {
+
+    /**
+     * 人员ID
+     */
+    private Long staffId;
+
+    /**
+     * 人员编码
+     */
+    private String staffCode;
+
+    /**
+     * 姓名
+     */
+    private String staffName;
+
+    /**
+     * 所属部门编码
+     */
+    private Long deptId;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 岗位编码
+     */
+    private Long postId;
+
+    /**
+     * 性别
+     */
+    private String sex;
+
+    /**
+     * 角色编码
+     */
+    private Long roleId;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 有效期起始
+     */
+    private Date validFrom;
+
+    /**
+     * 有效期截止
+     */
+    private Date validTo;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 198 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ErpCompanyVo.java

@@ -0,0 +1,198 @@
+package org.dromara.system.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.system.domain.ErpCompany;
+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;
+
+
+
+/**
+ * erp公司信息视图对象 erp_company
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ErpCompany.class)
+public class ErpCompanyVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 会计主体ID
+     */
+    @ExcelProperty(value = "会计主体ID")
+    private Long accBnId;
+
+    /**
+     * 会计主体编号
+     */
+    @ExcelProperty(value = "会计主体编号")
+    private String accBnNo;
+
+    /**
+     * 公司地址
+     */
+    @ExcelProperty(value = "公司地址")
+    private String address;
+
+    /**
+     * 开始日期
+     */
+    @ExcelProperty(value = "开始日期")
+    private Date begDate;
+
+    /**
+     * 经营范围
+     */
+    @ExcelProperty(value = "经营范围")
+    private String busScp;
+
+    /**
+     * 注册资本金额
+     */
+    @ExcelProperty(value = "注册资本金额")
+    private Long capAmt;
+
+    /**
+     * 公司全名
+     */
+    @ExcelProperty(value = "公司全名")
+    private String companyFullName;
+
+    /**
+     * 法人代表
+     */
+    @ExcelProperty(value = "法人代表")
+    private String corporation;
+
+    /**
+     * 电子邮箱
+     */
+    @ExcelProperty(value = "电子邮箱")
+    private String email;
+
+    /**
+     * 结束日期
+     */
+    @ExcelProperty(value = "结束日期")
+    private Date endDate;
+
+    /**
+     * 成立日期
+     */
+    @ExcelProperty(value = "成立日期")
+    private Date foundDate;
+
+    /**
+     * 内部客户ID
+     */
+    @ExcelProperty(value = "内部客户ID")
+    private String inCustId;
+
+    /**
+     * 内部供应商ID
+     */
+    @ExcelProperty(value = "内部供应商ID")
+    private String inSupId;
+
+    /**
+     * 法律代表人
+     */
+    @ExcelProperty(value = "法律代表人")
+    private String lelPer;
+
+    /**
+     * 联系电话
+     */
+    @ExcelProperty(value = "联系电话")
+    private String phone;
+
+    /**
+     * 负责人/经办人
+     */
+    @ExcelProperty(value = "负责人/经办人")
+    private String principal;
+
+    /**
+     * 注册地址
+     */
+    @ExcelProperty(value = "注册地址")
+    private String regAddr;
+
+    /**
+     * 注册日期
+     */
+    @ExcelProperty(value = "注册日期")
+    private Date regDate;
+
+    /**
+     * 注册机关
+     */
+    @ExcelProperty(value = "注册机关")
+    private String regOrg;
+
+    /**
+     * 税务登记号
+     */
+    @ExcelProperty(value = "税务登记号")
+    private String taxNo;
+
+    /**
+     * 公司编号
+     */
+    @ExcelProperty(value = "公司编号")
+    private String companyCode;
+
+    /**
+     * 公司名称
+     */
+    @ExcelProperty(value = "公司名称")
+    private String companyName;
+
+    /**
+     * 是否显示(0-是,1-否)
+     */
+    @ExcelProperty(value = "是否显示", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_platform_yes_no")
+    private String isShow;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 151 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ErpDeptVo.java

@@ -0,0 +1,151 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.ErpDept;
+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;
+
+
+/**
+ * erp部门视图对象 erp_dept
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ErpDept.class)
+public class ErpDeptVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 部门id
+     */
+    @ExcelProperty(value = "部门id")
+    private Long deptId;
+
+    /**
+     * 部门编号
+     */
+    @ExcelProperty(value = "部门编号")
+    private String deptNo;
+
+    /**
+     * 父部门id
+     */
+    @ExcelProperty(value = "父部门id")
+    private Long parentId;
+
+    /**
+     * 父部门名称
+     */
+    private String parentName;
+
+    /**
+     * 公司id
+     */
+    @ExcelProperty(value = "公司id")
+    private Long companyId;
+
+    /**
+     * 祖级列表
+     */
+    @ExcelProperty(value = "祖级列表")
+    private String ancestors;
+
+    /**
+     * 部门名称
+     */
+    @ExcelProperty(value = "部门名称")
+    private String deptName;
+
+    /**
+     * 部门类别编码
+     */
+    @ExcelProperty(value = "部门类别编码")
+    private String deptCategory;
+
+    /**
+     * 显示顺序
+     */
+    @ExcelProperty(value = "显示顺序")
+    private Long orderNum;
+
+    /**
+     * 负责人
+     */
+    @ExcelProperty(value = "负责人")
+    private Long leader;
+
+    /**
+     * 联系电话
+     */
+    @ExcelProperty(value = "联系电话")
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    @ExcelProperty(value = "邮箱")
+    private String email;
+
+    /**
+     * 部门状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "部门状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_platform_yes_no")
+    private String status;
+
+    /**
+     * 是否是公司(0是  1否)
+     */
+    @ExcelProperty(value = "是否是公司(0是  1否)")
+    private String isCompanyFlag;
+
+    /**
+     * 部门经理id
+     */
+    @ExcelProperty(value = "部门经理id")
+    private Long managerId;
+
+    /**
+     * 部门主管id
+     */
+    @ExcelProperty(value = "部门主管id")
+    private Long chargeId;
+
+    /**
+     * 部门经理编号
+     */
+    @ExcelProperty(value = "部门经理编号")
+    private String managerNo;
+
+    /**
+     * 部门主管编号
+     */
+    @ExcelProperty(value = "部门主管编号")
+    private String chargeNo;
+
+    /**
+     * 部门经理
+     */
+    @ExcelProperty(value = "部门经理")
+    private String managerName;
+
+    /**
+     * 部门主管
+     */
+    @ExcelProperty(value = "部门主管")
+    private String chargeName;
+
+
+}

+ 125 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ErpStaffVo.java

@@ -0,0 +1,125 @@
+package org.dromara.system.domain.vo;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.system.domain.ErpStaff;
+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;
+
+
+/**
+ * erp人员信息视图对象 erp_staff
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ErpStaff.class)
+public class ErpStaffVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 人员ID
+     */
+    @ExcelProperty(value = "人员ID")
+    private Long staffId;
+
+    /**
+     * 人员编码
+     */
+    @ExcelProperty(value = "人员编码")
+    private String staffCode;
+
+    /**
+     * 姓名
+     */
+    @ExcelProperty(value = "姓名")
+    private String staffName;
+
+    /**
+     * 所属部门编码
+     */
+    @ExcelProperty(value = "所属部门编码")
+    private Long deptId;
+
+    /**
+     * 联系电话
+     */
+    @ExcelProperty(value = "联系电话")
+    private String phone;
+
+    /**
+     * 岗位编码
+     */
+    @ExcelProperty(value = "岗位编码")
+    private Long postId;
+
+    /**
+     * 性别
+     */
+    @ExcelProperty(value = "性别")
+    private String sex;
+
+    /**
+     * 角色编码
+     */
+    @ExcelProperty(value = "角色编码")
+    private Long roleId;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+     * 密码
+     */
+    @ExcelProperty(value = "密码")
+    private String password;
+
+    /**
+     * 有效期起始
+     */
+    @ExcelProperty(value = "有效期起始")
+    private Date validFrom;
+
+    /**
+     * 有效期截止
+     */
+    @ExcelProperty(value = "有效期截止")
+    private Date validTo;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_platform_yes_no")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    private String deptName;
+
+    private String deptCode;
+
+    private String postName;
+
+    private String roleName;
+}

+ 43 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteErpDeptServiceImpl.java

@@ -0,0 +1,43 @@
+package org.dromara.system.dubbo;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.tree.Tree;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.system.api.RemoteDeptService;
+import org.dromara.system.api.RemoteErpDeptService;
+import org.dromara.system.api.domain.vo.RemoteDeptVo;
+import org.dromara.system.domain.bo.SysDeptBo;
+import org.dromara.system.domain.vo.SysDeptVo;
+import org.dromara.system.service.IErpDeptService;
+import org.dromara.system.service.ISysDeptService;
+import org.dromara.system.service.ISysPermissionService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 部门服务
+ *
+ * @author Lion Li
+ */
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemoteErpDeptServiceImpl implements RemoteErpDeptService {
+
+    private final IErpDeptService erpDeptService;
+
+    /**
+     * 通过部门ID查询部门名称
+     *
+     * @param deptIds 部门ID串逗号分隔
+     * @return 部门名称串逗号分隔
+     */
+    @Override
+    public Map<Long, String> selectDeptNameByIds(Set<Long> ids) {
+        return erpDeptService.selectDeptNameByIds(ids);
+    }
+}

+ 30 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteErpStaffServiceImpl.java

@@ -0,0 +1,30 @@
+package org.dromara.system.dubbo;
+
+import cn.hutool.core.bean.BeanUtil;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.system.api.RemoteErpStaffService;
+import org.dromara.system.api.domain.vo.RemoteErpStaffVo;
+import org.dromara.system.service.IErpStaffService;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+import java.util.Set;
+
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemoteErpStaffServiceImpl implements RemoteErpStaffService {
+
+    private final IErpStaffService erpStaffService;
+
+    @Override
+    public Map<Long, String> selectStaffNameByIds(Set<Long> ids) {
+        return erpStaffService.selectStaffNameByIds(ids);
+    }
+
+    @Override
+    public RemoteErpStaffVo selectStaffByStaffName(String staffName) {
+        return BeanUtil.toBean(erpStaffService.selectStaffByStaffName(staffName), RemoteErpStaffVo.class);
+    }
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ErpCompanyMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.ErpCompany;
+import org.dromara.system.domain.vo.ErpCompanyVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * erp公司信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+public interface ErpCompanyMapper extends BaseMapperPlus<ErpCompany, ErpCompanyVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ErpDeptMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.ErpDept;
+import org.dromara.system.domain.vo.ErpDeptVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * erp部门Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+public interface ErpDeptMapper extends BaseMapperPlus<ErpDept, ErpDeptVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ErpStaffMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.ErpStaff;
+import org.dromara.system.domain.vo.ErpStaffVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * erp人员信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+public interface ErpStaffMapper extends BaseMapperPlus<ErpStaff, ErpStaffVo> {
+
+}

+ 70 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IErpCompanyService.java

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

+ 83 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IErpDeptService.java

@@ -0,0 +1,83 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.ErpDept;
+import org.dromara.system.domain.vo.ErpDeptVo;
+import org.dromara.system.domain.bo.ErpDeptBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.system.domain.vo.SysDeptVo;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * erp部门Service接口
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+public interface IErpDeptService extends IService<ErpDept> {
+
+    /**
+     * 查询erp部门
+     *
+     * @param deptId 主键
+     * @return erp部门
+     */
+    ErpDeptVo queryById(Long deptId);
+
+    /**
+     * 分页查询erp部门列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return erp部门分页列表
+     */
+    TableDataInfo<ErpDeptVo> queryPageList(ErpDeptBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的erp部门列表
+     *
+     * @param bo 查询条件
+     * @return erp部门列表
+     */
+    List<ErpDeptVo> queryList(ErpDeptBo bo);
+
+    /**
+     * 新增erp部门
+     *
+     * @param bo erp部门
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ErpDeptBo bo);
+
+    /**
+     * 修改erp部门
+     *
+     * @param bo erp部门
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ErpDeptBo bo);
+
+    Map<Long, String> selectDeptNameByIds(Set<Long> ids);
+
+    /**
+     * 根据部门ID查询信息
+     *
+     * @param deptId 部门ID
+     * @return 部门信息
+     */
+    ErpDeptVo selectDeptById(Long deptId);
+
+    /**
+     * 校验并批量删除erp部门信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 76 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IErpStaffService.java

@@ -0,0 +1,76 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.system.domain.ErpStaff;
+import org.dromara.system.domain.bo.ErpStaffBo;
+import org.dromara.system.domain.vo.ErpStaffVo;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * erp人员信息Service接口
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+public interface IErpStaffService extends IService<ErpStaff> {
+
+    /**
+     * 查询erp人员信息
+     *
+     * @param staffId 主键
+     * @return erp人员信息
+     */
+    ErpStaffVo queryById(Long staffId);
+
+    /**
+     * 分页查询erp人员信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return erp人员信息分页列表
+     */
+    TableDataInfo<ErpStaffVo> queryPageList(ErpStaffBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的erp人员信息列表
+     *
+     * @param bo 查询条件
+     * @return erp人员信息列表
+     */
+    List<ErpStaffVo> queryList(ErpStaffBo bo);
+
+    /**
+     * 新增erp人员信息
+     *
+     * @param bo erp人员信息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ErpStaffBo bo);
+
+    /**
+     * 修改erp人员信息
+     *
+     * @param bo erp人员信息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ErpStaffBo bo);
+
+    Map<Long, String> selectStaffNameByIds(Set<Long> ids);
+
+    ErpStaffVo selectStaffByStaffName(String staffCode);
+
+    /**
+     * 校验并批量删除erp人员信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 5 - 5
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/AddressAreaServiceImpl.java

@@ -33,7 +33,7 @@ import java.util.stream.Collectors;
 @Slf4j
 @RequiredArgsConstructor
 @Service
-public class AddressAreaServiceImpl  extends ServiceImpl<AddressAreaMapper, AddressArea> implements IAddressAreaService {
+public class AddressAreaServiceImpl extends ServiceImpl<AddressAreaMapper, AddressArea> implements IAddressAreaService {
 
     private final AddressAreaMapper baseMapper;
 
@@ -44,7 +44,7 @@ public class AddressAreaServiceImpl  extends ServiceImpl<AddressAreaMapper, Addr
      * @return 地区列表
      */
     @Override
-    public AddressAreaVo queryById(Long id){
+    public AddressAreaVo queryById(Long id) {
         return baseMapper.selectVoById(id);
     }
 
@@ -77,6 +77,7 @@ public class AddressAreaServiceImpl  extends ServiceImpl<AddressAreaMapper, Addr
     private LambdaQueryWrapper<AddressArea> buildQueryWrapper(AddressAreaBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<AddressArea> lqw = Wrappers.lambdaQuery();
+        lqw.eq(AddressArea::getLevel, bo.getLevel());
         lqw.orderByAsc(AddressArea::getId);
         return lqw;
     }
@@ -114,7 +115,7 @@ public class AddressAreaServiceImpl  extends ServiceImpl<AddressAreaMapper, Addr
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(AddressArea entity){
+    private void validEntityBeforeSave(AddressArea entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
@@ -127,7 +128,7 @@ public class AddressAreaServiceImpl  extends ServiceImpl<AddressAreaMapper, Addr
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteByIds(ids) > 0;
@@ -176,7 +177,6 @@ public class AddressAreaServiceImpl  extends ServiceImpl<AddressAreaMapper, Addr
         });
 
 
-
         return provinceList;
     }
 

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

@@ -118,7 +118,7 @@ public class CreditLevelServiceImpl extends ServiceImpl<CreditLevelMapper, Credi
      */
     @Override
     public Boolean insertByBo(CreditLevelBo bo) {
-        bo.setCreditLevelNo(SequenceUtils.nextPaddedIdStr(CREDIT_LEVEL_NO_KEY, Duration.ofDays(3650), 4));
+        bo.setCreditLevelNo(SequenceUtils.nextPaddedIdStr(CREDIT_LEVEL_NO_KEY, Duration.ofDays(3650), 1));
         CreditLevel add = MapstructUtils.convert(bo, CreditLevel.class);
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;

+ 158 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ErpCompanyServiceImpl.java

@@ -0,0 +1,158 @@
+package org.dromara.system.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.system.domain.bo.ErpCompanyBo;
+import org.dromara.system.domain.vo.ErpCompanyVo;
+import org.dromara.system.domain.ErpCompany;
+import org.dromara.system.mapper.ErpCompanyMapper;
+import org.dromara.system.service.IErpCompanyService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * erp公司信息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ErpCompanyServiceImpl  extends ServiceImpl<ErpCompanyMapper, ErpCompany> implements IErpCompanyService {
+
+    private final ErpCompanyMapper baseMapper;
+
+    /**
+     * 查询erp公司信息
+     *
+     * @param id 主键
+     * @return erp公司信息
+     */
+    @Override
+    public ErpCompanyVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询erp公司信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return erp公司信息分页列表
+     */
+    @Override
+    public TableDataInfo<ErpCompanyVo> queryPageList(ErpCompanyBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ErpCompany> lqw = buildQueryWrapper(bo);
+        Page<ErpCompanyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的erp公司信息列表
+     *
+     * @param bo 查询条件
+     * @return erp公司信息列表
+     */
+    @Override
+    public List<ErpCompanyVo> queryList(ErpCompanyBo bo) {
+        LambdaQueryWrapper<ErpCompany> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ErpCompany> buildQueryWrapper(ErpCompanyBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ErpCompany> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ErpCompany::getId);
+        lqw.eq(bo.getAccBnId() != null, ErpCompany::getAccBnId, bo.getAccBnId());
+        lqw.eq(StringUtils.isNotBlank(bo.getAccBnNo()), ErpCompany::getAccBnNo, bo.getAccBnNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getAddress()), ErpCompany::getAddress, bo.getAddress());
+        lqw.eq(bo.getBegDate() != null, ErpCompany::getBegDate, bo.getBegDate());
+        lqw.eq(StringUtils.isNotBlank(bo.getBusScp()), ErpCompany::getBusScp, bo.getBusScp());
+        lqw.eq(bo.getCapAmt() != null, ErpCompany::getCapAmt, bo.getCapAmt());
+        lqw.like(StringUtils.isNotBlank(bo.getCompanyFullName()), ErpCompany::getCompanyFullName, bo.getCompanyFullName());
+        lqw.eq(StringUtils.isNotBlank(bo.getCorporation()), ErpCompany::getCorporation, bo.getCorporation());
+        lqw.eq(StringUtils.isNotBlank(bo.getEmail()), ErpCompany::getEmail, bo.getEmail());
+        lqw.eq(bo.getEndDate() != null, ErpCompany::getEndDate, bo.getEndDate());
+        lqw.eq(bo.getFoundDate() != null, ErpCompany::getFoundDate, bo.getFoundDate());
+        lqw.eq(StringUtils.isNotBlank(bo.getInCustId()), ErpCompany::getInCustId, bo.getInCustId());
+        lqw.eq(StringUtils.isNotBlank(bo.getInSupId()), ErpCompany::getInSupId, bo.getInSupId());
+        lqw.eq(StringUtils.isNotBlank(bo.getLelPer()), ErpCompany::getLelPer, bo.getLelPer());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), ErpCompany::getPhone, bo.getPhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getPrincipal()), ErpCompany::getPrincipal, bo.getPrincipal());
+        lqw.eq(StringUtils.isNotBlank(bo.getRegAddr()), ErpCompany::getRegAddr, bo.getRegAddr());
+        lqw.eq(bo.getRegDate() != null, ErpCompany::getRegDate, bo.getRegDate());
+        lqw.eq(StringUtils.isNotBlank(bo.getRegOrg()), ErpCompany::getRegOrg, bo.getRegOrg());
+        lqw.eq(StringUtils.isNotBlank(bo.getTaxNo()), ErpCompany::getTaxNo, bo.getTaxNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getCompanyCode()), ErpCompany::getCompanyCode, bo.getCompanyCode());
+        lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), ErpCompany::getCompanyName, bo.getCompanyName());
+        lqw.eq(StringUtils.isNotBlank(bo.getIsShow()), ErpCompany::getIsShow, bo.getIsShow());
+        lqw.eq(StringUtils.isNotBlank(bo.getDataSource()), ErpCompany::getDataSource, bo.getDataSource());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ErpCompany::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ErpCompany::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增erp公司信息
+     *
+     * @param bo erp公司信息
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ErpCompanyBo bo) {
+        ErpCompany add = MapstructUtils.convert(bo, ErpCompany.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改erp公司信息
+     *
+     * @param bo erp公司信息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ErpCompanyBo bo) {
+        ErpCompany update = MapstructUtils.convert(bo, ErpCompany.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ErpCompany entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除erp公司信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 201 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ErpDeptServiceImpl.java

@@ -0,0 +1,201 @@
+package org.dromara.system.service.impl;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.ObjectUtils;
+import org.dromara.common.core.utils.SpringUtils;
+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.dromara.system.domain.ComDept;
+import org.dromara.system.domain.SysDept;
+import org.dromara.system.domain.vo.SysDeptVo;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.ErpDeptBo;
+import org.dromara.system.domain.vo.ErpDeptVo;
+import org.dromara.system.domain.ErpDept;
+import org.dromara.system.mapper.ErpDeptMapper;
+import org.dromara.system.service.IErpDeptService;
+
+import java.util.*;
+
+/**
+ * erp部门Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ErpDeptServiceImpl extends ServiceImpl<ErpDeptMapper, ErpDept> implements IErpDeptService {
+
+    private final ErpDeptMapper baseMapper;
+
+    /**
+     * 查询erp部门
+     *
+     * @param deptId 主键
+     * @return erp部门
+     */
+    @Override
+    public ErpDeptVo queryById(Long deptId) {
+        return baseMapper.selectVoById(deptId);
+    }
+
+    /**
+     * 分页查询erp部门列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return erp部门分页列表
+     */
+    @Override
+    public TableDataInfo<ErpDeptVo> queryPageList(ErpDeptBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ErpDept> lqw = buildQueryWrapper(bo);
+        Page<ErpDeptVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的erp部门列表
+     *
+     * @param bo 查询条件
+     * @return erp部门列表
+     */
+    @Override
+    public List<ErpDeptVo> queryList(ErpDeptBo bo) {
+        LambdaQueryWrapper<ErpDept> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ErpDept> buildQueryWrapper(ErpDeptBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ErpDept> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ErpDept::getDeptId);
+        lqw.eq(StringUtils.isNotBlank(bo.getDeptNo()), ErpDept::getDeptNo, bo.getDeptNo());
+        lqw.eq(bo.getParentId() != null, ErpDept::getParentId, bo.getParentId());
+        lqw.eq(bo.getCompanyId() != null, ErpDept::getCompanyId, bo.getCompanyId());
+        lqw.eq(StringUtils.isNotBlank(bo.getAncestors()), ErpDept::getAncestors, bo.getAncestors());
+        lqw.like(StringUtils.isNotBlank(bo.getDeptName()), ErpDept::getDeptName, bo.getDeptName());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeptCategory()), ErpDept::getDeptCategory, bo.getDeptCategory());
+        lqw.eq(bo.getOrderNum() != null, ErpDept::getOrderNum, bo.getOrderNum());
+        lqw.eq(bo.getLeader() != null, ErpDept::getLeader, bo.getLeader());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), ErpDept::getPhone, bo.getPhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getEmail()), ErpDept::getEmail, bo.getEmail());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ErpDept::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ErpDept::getPlatformCode, bo.getPlatformCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getIsCompanyFlag()), ErpDept::getIsCompanyFlag, bo.getIsCompanyFlag());
+        lqw.eq(bo.getManagerId() != null, ErpDept::getManagerId, bo.getManagerId());
+        lqw.eq(bo.getChargeId() != null, ErpDept::getChargeId, bo.getChargeId());
+        lqw.eq(StringUtils.isNotBlank(bo.getManagerNo()), ErpDept::getManagerNo, bo.getManagerNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getChargeNo()), ErpDept::getChargeNo, bo.getChargeNo());
+        lqw.like(StringUtils.isNotBlank(bo.getManagerName()), ErpDept::getManagerName, bo.getManagerName());
+        lqw.like(StringUtils.isNotBlank(bo.getChargeName()), ErpDept::getChargeName, bo.getChargeName());
+        return lqw;
+    }
+
+    /**
+     * 新增erp部门
+     *
+     * @param bo erp部门
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ErpDeptBo bo) {
+        ErpDept add = MapstructUtils.convert(bo, ErpDept.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setDeptId(add.getDeptId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改erp部门
+     *
+     * @param bo erp部门
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ErpDeptBo bo) {
+        ErpDept update = MapstructUtils.convert(bo, ErpDept.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    public Map<Long, String> selectDeptNameByIds(Set<Long> ids) {
+        if (ids == null || ids.isEmpty()) {
+            return Collections.emptyMap();
+        }
+
+        // 限制批量大小
+        if (ids.size() > 1000) {
+            throw new IllegalArgumentException("Batch size exceeds limit: " + ids.size());
+        }
+
+        List<ErpDept> deptList = baseMapper.selectByIds(ids);
+        Map<Long, String> resultMap = new HashMap<>(ids.size());
+
+        // 初始化所有请求的 ID 为 null
+        ids.forEach(id -> resultMap.put(id, null));
+
+        if (deptList != null) {
+            deptList.stream()
+                .filter(dept -> dept.getDeptId() != null && dept.getDeptName() != null)
+                .forEach(dept -> resultMap.put(dept.getDeptId(), dept.getDeptName()));
+        }
+
+        return resultMap;
+    }
+
+    /**
+     * 根据部门ID查询信息
+     *
+     * @param deptId 部门ID
+     * @return 部门信息
+     */
+    @Override
+    public ErpDeptVo selectDeptById(Long deptId) {
+        ErpDeptVo dept = baseMapper.selectVoById(deptId);
+        if (ObjectUtil.isNull(dept)) {
+            return null;
+        }
+        ErpDeptVo parentDept = baseMapper.selectVoOne(new LambdaQueryWrapper<ErpDept>()
+            .select(ErpDept::getDeptName).eq(ErpDept::getDeptId, dept.getParentId()));
+        dept.setParentName(ObjectUtils.notNullGetter(parentDept, ErpDeptVo::getDeptName));
+        return dept;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ErpDept entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除erp部门信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 200 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ErpStaffServiceImpl.java

@@ -0,0 +1,200 @@
+package org.dromara.system.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.system.domain.ErpDept;
+import org.dromara.system.domain.ErpStaff;
+import org.dromara.system.domain.bo.ErpStaffBo;
+import org.dromara.system.domain.vo.ErpStaffVo;
+import org.dromara.system.mapper.ErpDeptMapper;
+import org.dromara.system.mapper.ErpStaffMapper;
+import org.dromara.system.service.IErpStaffService;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * erp人员信息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-04-02
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ErpStaffServiceImpl extends ServiceImpl<ErpStaffMapper, ErpStaff> implements IErpStaffService {
+
+    private final ErpStaffMapper baseMapper;
+
+    private final ErpDeptMapper erpDeptMapper;
+
+    /**
+     * 查询erp人员信息
+     *
+     * @param staffId 主键
+     * @return erp人员信息
+     */
+    @Override
+    public ErpStaffVo queryById(Long staffId) {
+        return baseMapper.selectVoById(staffId);
+    }
+
+    /**
+     * 分页查询erp人员信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return erp人员信息分页列表
+     */
+    @Override
+    public TableDataInfo<ErpStaffVo> queryPageList(ErpStaffBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ErpStaff> lqw = buildQueryWrapper(bo);
+        Page<ErpStaffVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<ErpStaffVo> records = result.getRecords();
+        if (CollUtil.isNotEmpty(records)) {
+            // 1. 安全提取 DeptId
+            Set<Long> deptIds = Optional.ofNullable(records).orElse(Collections.emptyList()).stream()
+                .map(ErpStaffVo::getDeptId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+            Map<Long, String> deptMap = !deptIds.isEmpty() ?
+                erpDeptMapper.selectList(new LambdaQueryWrapper<ErpDept>()
+                        .select(ErpDept::getDeptId, ErpDept::getDeptName)
+                        .in(ErpDept::getDeptId, deptIds))
+                    .stream()
+                    .collect(Collectors.toMap(ErpDept::getDeptId, ErpDept::getDeptName, (v1, v2) -> v1))
+                : Collections.emptyMap();
+
+            records.forEach(item -> {
+                item.setDeptName(deptMap.get(item.getDeptId()));
+            });
+        }
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的erp人员信息列表
+     *
+     * @param bo 查询条件
+     * @return erp人员信息列表
+     */
+    @Override
+    public List<ErpStaffVo> queryList(ErpStaffBo bo) {
+        LambdaQueryWrapper<ErpStaff> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ErpStaff> buildQueryWrapper(ErpStaffBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ErpStaff> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ErpStaff::getStaffId);
+        lqw.eq(StringUtils.isNotBlank(bo.getStaffCode()), ErpStaff::getStaffCode, bo.getStaffCode());
+        lqw.like(StringUtils.isNotBlank(bo.getStaffName()), ErpStaff::getStaffName, bo.getStaffName());
+        lqw.eq(bo.getDeptId() != null, ErpStaff::getDeptId, bo.getDeptId());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), ErpStaff::getPhone, bo.getPhone());
+        lqw.eq(bo.getPostId() != null, ErpStaff::getPostId, bo.getPostId());
+        lqw.eq(StringUtils.isNotBlank(bo.getSex()), ErpStaff::getSex, bo.getSex());
+        lqw.eq(bo.getRoleId() != null, ErpStaff::getRoleId, bo.getRoleId());
+        lqw.eq(StringUtils.isNotBlank(bo.getDataSource()), ErpStaff::getDataSource, bo.getDataSource());
+        lqw.eq(StringUtils.isNotBlank(bo.getPassword()), ErpStaff::getPassword, bo.getPassword());
+        lqw.eq(bo.getValidFrom() != null, ErpStaff::getValidFrom, bo.getValidFrom());
+        lqw.eq(bo.getValidTo() != null, ErpStaff::getValidTo, bo.getValidTo());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ErpStaff::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ErpStaff::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增erp人员信息
+     *
+     * @param bo erp人员信息
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ErpStaffBo bo) {
+        ErpStaff add = MapstructUtils.convert(bo, ErpStaff.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setStaffId(add.getStaffId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改erp人员信息
+     *
+     * @param bo erp人员信息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ErpStaffBo bo) {
+        ErpStaff update = MapstructUtils.convert(bo, ErpStaff.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    @Override
+    public Map<Long, String> selectStaffNameByIds(Set<Long> ids) {
+        if (ids == null || ids.isEmpty()) {
+            return Collections.emptyMap();
+        }
+
+        // 限制批量大小
+        if (ids.size() > 1000) {
+            throw new IllegalArgumentException("Batch size exceeds limit: " + ids.size());
+        }
+
+        List<ErpStaff> staffList = baseMapper.selectByIds(ids);
+        Map<Long, String> resultMap = new HashMap<>(ids.size());
+
+        // 初始化所有请求的 ID 为 null
+        ids.forEach(id -> resultMap.put(id, null));
+
+        if (staffList != null) {
+            staffList.stream()
+                .filter(staff -> staff.getStaffId() != null && staff.getStaffName() != null)
+                .forEach(staff -> resultMap.put(staff.getStaffId(), staff.getStaffName()));
+        }
+
+        return resultMap;
+    }
+
+    @Override
+    public ErpStaffVo selectStaffByStaffName(String staffCode) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<ErpStaff>().eq(ErpStaff::getStaffCode, staffCode));
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ErpStaff entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除erp人员信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ErpCompanyMapper.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.system.mapper.ErpCompanyMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ErpDeptMapper.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.system.mapper.ErpDeptMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ErpStaffMapper.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.system.mapper.ErpStaffMapper">
+
+</mapper>