Przeglądaj źródła

Merge remote-tracking branch 'origin/master' into master

肖路 8 godzin temu
rodzic
commit
b62617ba06
34 zmienionych plików z 850 dodań i 79 usunięć
  1. 11 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteComCurrencyService.java
  2. 11 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteComCustomerTypeService.java
  3. 2 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteComStaffService.java
  4. 2 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteErpStaffService.java
  5. 11 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteProductTaxrateService.java
  6. 8 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSupplierLevelService.java
  7. 7 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSupplierTypeService.java
  8. 7 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSupplierTypeVo.java
  9. 12 14
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInfoController.java
  10. 10 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierInfoController.java
  11. 1 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInfoBo.java
  12. 45 3
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInfoImportVo.java
  13. 25 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/SupplierInfoImportVo.java
  14. 19 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/listener/CustomerImportListener.java
  15. 12 4
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerInfoMapper.java
  16. 8 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerInfoService.java
  17. 9 2
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplierInfoService.java
  18. 282 33
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java
  19. 238 14
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierInfoServiceImpl.java
  20. 4 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderDeliver.java
  21. 4 1
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderDeliverBo.java
  22. 5 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderDeliverVo.java
  23. 23 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderDeliverServiceImpl.java
  24. 18 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteComCurrencyServiceImpl.java
  25. 18 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteComCustomerTypeServiceImpl.java
  26. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteComStaffServiceImpl.java
  27. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteErpStaffServiceImpl.java
  28. 17 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteProductTaxrateServiceImpl.java
  29. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSupplierLevelServiceImpl.java
  30. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSupplierTypeServiceImpl.java
  31. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IComStaffService.java
  32. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IErpStaffService.java
  33. 11 6
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ComStaffServiceImpl.java
  34. 4 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ErpStaffServiceImpl.java

+ 11 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteComCurrencyService.java

@@ -3,7 +3,18 @@ package org.dromara.system.api;
 import org.dromara.system.api.domain.vo.RemoteComCompanyVo;
 import org.dromara.system.api.domain.vo.RemoteComCurrencyVo;
 
+import java.util.List;
+import java.util.Set;
+
 public interface RemoteComCurrencyService {
 
     RemoteComCurrencyVo selectByCurrencyName(String currencyName);
+
+    /**
+     * 根据ID集合批量查询交易币别
+     *
+     * @param ids 交易币别ID集合
+     * @return 交易币别VO列表
+     */
+    List<RemoteComCurrencyVo> selectCurrencyByIds(Set<Long> ids);
 }

+ 11 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteComCustomerTypeService.java

@@ -3,6 +3,17 @@ package org.dromara.system.api;
 import org.dromara.system.api.domain.vo.RemoteComCustomerLevelVo;
 import org.dromara.system.api.domain.vo.RemoteComCustomerTypeVo;
 
+import java.util.List;
+import java.util.Set;
+
 public interface RemoteComCustomerTypeService {
     RemoteComCustomerTypeVo selectCustomerTypeByTypeName(String typeName);
+
+    /**
+     * 根据ID集合批量查询客户类型
+     *
+     * @param ids 客户类型ID集合
+     * @return 客户类型VO列表
+     */
+    List<RemoteComCustomerTypeVo> selectCustomerTypeByIds(Set<Long> ids);
 }

+ 2 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteComStaffService.java

@@ -22,6 +22,8 @@ public interface RemoteComStaffService {
 
     RemoteComStaffVo selectStaffByStaffName(String staffName);
 
+    RemoteComStaffVo selectStaffByStaffCode(String staffCode);
+
     RemoteComStaffVo selectStaffByUserId(Long userId);
 
 }

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

@@ -11,6 +11,8 @@ public interface RemoteErpStaffService {
 
     Map<Long, String> selectStaffNameByIds(Set<Long> ids);
 
+    RemoteErpStaffVo selectStaffByStaffNameOne(String staffName);
+
     RemoteErpStaffVo selectStaffByStaffName(String staffName);
 
 }

+ 11 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteProductTaxrateService.java

@@ -3,7 +3,18 @@ package org.dromara.system.api;
 
 import org.dromara.system.api.domain.vo.RemoteProductTaxrateVo;
 
+import java.util.List;
+import java.util.Set;
+
 public interface RemoteProductTaxrateService {
 
     RemoteProductTaxrateVo selectByTaxrateNo(String taxrateNo);
+
+    /**
+     * 根据ID集合批量查询产品税率
+     *
+     * @param ids 产品税率ID集合
+     * @return 产品税率VO列表
+     */
+    List<RemoteProductTaxrateVo> selectTaxrateByIds(Set<Long> ids);
 }

+ 8 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSupplierLevelService.java

@@ -5,4 +5,12 @@ import org.dromara.system.api.domain.vo.RemoteSupplierLevelVo;
 public interface RemoteSupplierLevelService {
 
     RemoteSupplierLevelVo selectByLevelName(String levelName);
+
+    /**
+     * 根据ID查询供应商等级
+     *
+     * @param id 等级ID
+     * @return 供应商等级信息
+     */
+    RemoteSupplierLevelVo selectByLevelId(Long id);
 }

+ 7 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteSupplierTypeService.java

@@ -14,4 +14,11 @@ public interface RemoteSupplierTypeService {
 
     RemoteSupplierTypeVo selectByTypeName(String typeName);
 
+    /**
+     * 根据ID查询供应商类型
+     *
+     * @param id 类型ID
+     * @return 供应商类型信息
+     */
+    RemoteSupplierTypeVo selectByTypeId(Long id);
 }

+ 7 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSupplierTypeVo.java

@@ -21,4 +21,11 @@ public class RemoteSupplierTypeVo implements Serializable {
 
     private String typeName;
 
+    private String supplierTypeNo;
+
+    /**
+     * 名称
+     */
+    private String supplierTypeName;
+
 }

+ 12 - 14
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInfoController.java

@@ -15,7 +15,6 @@ import org.dromara.common.log.annotation.Log;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.customer.domain.bo.*;
 import org.dromara.customer.domain.dto.ReleaseToPoolDto;
@@ -26,7 +25,6 @@ import org.dromara.customer.service.ICustomerInfoService;
 import org.dromara.system.api.*;
 import org.dromara.system.api.domain.vo.RemoteComCompanyVo;
 import org.dromara.system.api.domain.vo.RemoteComCustomerLevelVo;
-import org.dromara.system.api.domain.vo.RemoteComStaffVo;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -79,21 +77,11 @@ public class CustomerInfoController extends BaseController {
 
     /**
      * 查询客户信息列表
+     * <p>数据权限通过框架 @DataPermission 注解自动处理,
+     * 根据角色数据范围(全部/本部门/本部门及以下/仅本人)自动过滤</p>
      */
     @GetMapping("/list")
     public TableDataInfo<CustomerInfoVo> list(CustomerInfoBo bo, PageQuery pageQuery) {
-        Long userId = LoginHelper.getLoginUser().getUserId();
-        RemoteComStaffVo remoteComStaffVo = remoteComStaffService.selectStaffByUserId(userId);
-
-        // 设置数据权限过滤:只能查看自己创建的、或者是业务负责人、或者是客服支持的客户
-        if (remoteComStaffVo != null && remoteComStaffVo.getStaffId() != null) {
-            Long staffId = remoteComStaffVo.getStaffId();
-            // 将权限条件传递到查询条件中
-            bo.setCreateBy(userId);
-            bo.setSalesPersonId(staffId);
-            bo.setServiceStaffId(staffId);
-        }
-
         return customerInfoService.queryPageList(bo, pageQuery);
     }
 
@@ -284,6 +272,16 @@ public class CustomerInfoController extends BaseController {
         ExcelUtil.exportExcel(new ArrayList<>(), "客户数据", CustomerInfoImportVo.class, response);
     }
 
+    /**
+     * 导出模板数据(带30条真实客户数据)
+     */
+    @Log(title = "客户信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportTemplateData")
+    public void exportTemplateData(HttpServletResponse response) {
+        List<CustomerInfoImportVo> list = customerInfoService.queryImportTemplateList(9999);
+        ExcelUtil.exportExcel(list, "客户数据", CustomerInfoImportVo.class, response);
+    }
+
     /**
      * 获取公司下拉列表
      */

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

@@ -256,6 +256,16 @@ public class SupplierInfoController extends BaseController {
         ExcelUtil.exportExcel(new ArrayList<>(), "供应商数据", SupplierInfoImportVo.class, response);
     }
 
+    /**
+     * 导出模板数据(带30条真实供应商数据)
+     */
+    @Log(title = "供应商信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportTemplateData")
+    public void exportTemplateData(HttpServletResponse response) {
+        List<SupplierInfoImportVo> list = supplierInfoService.queryImportTemplateList(0);
+        ExcelUtil.exportExcel(list, "供应商数据", SupplierInfoImportVo.class, response);
+    }
+
     /**
      * 获取供应商名称模糊查询供应商列表信息
      *

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

@@ -175,7 +175,7 @@ public class CustomerInfoBo extends BaseEntity {
     private String provincialCityCounty;
 
     /**
-     * 状态(0正常 1停用)
+     * 状态(1正常 0停用)
      */
     private String status;
 

+ 45 - 3
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInfoImportVo.java

@@ -106,6 +106,24 @@ public class CustomerInfoImportVo implements Serializable {
     @ExcelProperty(value = "企业规模名称")
     private String enterpriseScale;
 
+    /**
+     * 省
+     */
+    @ExcelProperty(value = "省")
+    private String provinceNo;
+
+    /**
+     * 市
+     */
+    @ExcelProperty(value = "市")
+    private String cityNo;
+
+    /**
+     * 区
+     */
+    @ExcelProperty(value = "区")
+    private String areaNo;
+
     /**
      * 详细地址
      */
@@ -113,10 +131,34 @@ public class CustomerInfoImportVo implements Serializable {
     private String address;
 
     /**
-     * 发票地址
+     * 系统人员--业务负责人
      */
-    @ExcelProperty(value = "发票地址")
-    private String invoiceAddress;
+    @ExcelProperty(value = "项目负责人编号")
+    private String xtSalesPersonNo;
+
+    /**
+     * 系统人员--业务负责人
+     */
+    @ExcelProperty(value = "项目负责人名称")
+    private String xtSalesPersonName;
+
+    /**
+     * 系统人员--客服支持
+     */
+    @ExcelProperty(value = "客服支持编号")
+    private String xtServiceStaffNo;
+
+    /**
+     * 系统人员--客服支持
+     */
+    @ExcelProperty(value = "客服支持名称")
+    private String xtServiceStaffName;
+
+//    /**
+//     * 发票地址
+//     */
+//    @ExcelProperty(value = "发票地址")
+//    private String invoiceAddress;
 
     /**
      * 销售人员--业务人员

+ 25 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/SupplierInfoImportVo.java

@@ -69,6 +69,12 @@ public class SupplierInfoImportVo implements Serializable {
     @ExcelProperty(value = "姓名")
     private String buyerName;
 
+    /**
+     * 采购员
+     */
+    @ExcelProperty(value = "采购员")
+    private String buyerOne;
+
     /**
      * 付款类型
      */
@@ -105,6 +111,25 @@ public class SupplierInfoImportVo implements Serializable {
     @ExcelProperty(value = "办公电话")
     private String fixedPhone;
 
+    /**
+     * 省
+     */
+    @ExcelProperty(value = "省")
+    private String officeProvince;
+
+    /**
+     * 市
+     */
+    @ExcelProperty(value = "市")
+    private String officeCity;
+
+    /**
+     * 区
+     */
+    @ExcelProperty(value = "区")
+    private String officeCounty;
+
+
     /**
      * 联系地址
      */

+ 19 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/listener/CustomerImportListener.java

@@ -72,7 +72,8 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
                                   RemoteComCustomerTypeService remoteComCustomerTypeService,
                                   RemoteProductTaxrateService remoteProductTaxrateService,
                                   RemoteComStaffService remoteComStaffService,
-                                  RemoteErpStaffService remoteErpStaffService) {
+                                  RemoteErpStaffService remoteErpStaffService
+                                  ) {
         this.customerInfoService = SpringUtils.getBean(ICustomerInfoService.class);
         this.remoteComCompanyService = remoteComCompanyService;
         this.remoteComCustomerLevelService = remoteComCustomerLevelService;
@@ -114,6 +115,8 @@ 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 xtSalesPerson = remoteComStaffService.selectStaffByStaffCode(customerInfoImportVo.getXtSalesPersonNo());
+            RemoteComStaffVo xtServiceStaff = remoteComStaffService.selectStaffByStaffCode(customerInfoImportVo.getXtServiceStaffNo());
             RemoteErpStaffVo SalesPerson = remoteErpStaffService.selectStaffByStaffName(customerInfoImportVo.getSalesPersonNo());
             RemoteErpStaffVo ServiceStaff = remoteErpStaffService.selectStaffByStaffName(customerInfoImportVo.getServiceStaffNo());
             CustomerSalesInfoBo customerSalesInfo = new CustomerSalesInfoBo();
@@ -155,6 +158,14 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
             // 验证是否存在这个客户
             if (ObjectUtil.isNull(customerInfo)) {
                 CustomerInfoBo customerInfoBo = BeanUtil.toBean(customerInfoImportVo, CustomerInfoBo.class);
+                customerInfoBo.setStatus("1");
+                if (ObjectUtil.isNotEmpty(xtSalesPerson)) {
+                    customerInfoBo.setSalesPersonId(xtSalesPerson.getStaffId());
+                    customerInfoBo.setBelongingDepartmentId(xtSalesPerson.getDeptId());
+                }
+                if (ObjectUtil.isNotEmpty(xtServiceStaff)) {
+                    customerInfoBo.setServiceStaffId(xtServiceStaff.getStaffId());
+                }
                 if (ObjectUtil.isNotEmpty(remoteComCompanyVo)) {
                     customerInfoBo.setBelongCompanyId(remoteComCompanyVo.getId());
                 }
@@ -183,6 +194,13 @@ public class CustomerImportListener extends AnalysisEventListener<CustomerInfoIm
                 Long customerId = customerInfo.getId();
                 CustomerInfoBo customerInfoBo = BeanUtil.toBean(customerInfoImportVo, CustomerInfoBo.class);
                 customerInfoBo.setId(customerId);
+                if (ObjectUtil.isNotEmpty(xtSalesPerson)) {
+                    customerInfoBo.setSalesPersonId(xtSalesPerson.getStaffId());
+                    customerInfoBo.setBelongingDepartmentId(xtSalesPerson.getDeptId());
+                }
+                if (ObjectUtil.isNotEmpty(xtServiceStaff)) {
+                    customerInfoBo.setServiceStaffId(xtServiceStaff.getStaffId());
+                }
                 if (ObjectUtil.isNotEmpty(remoteComCompanyVo)) {
                     customerInfoBo.setBelongCompanyId(remoteComCompanyVo.getId());
                 }

+ 12 - 4
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerInfoMapper.java

@@ -2,12 +2,14 @@ package org.dromara.customer.mapper;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
+import org.dromara.common.mybatis.annotation.DataColumn;
+import org.dromara.common.mybatis.annotation.DataPermission;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.customer.domain.CustomerInfo;
 import org.dromara.customer.domain.bo.CustomerInfoBo;
 import org.dromara.customer.domain.bo.CustomerListBo;
 import org.dromara.customer.domain.bo.MessagePublishCustomerBo;
 import org.dromara.customer.domain.vo.CustomerInfoVo;
-import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.customer.domain.vo.CustomerListVo;
 import org.dromara.customer.domain.vo.MessagePublishCustomerVo;
 
@@ -17,23 +19,29 @@ import org.dromara.customer.domain.vo.MessagePublishCustomerVo;
  * @author LionLi
  * @date 2025-12-11
  */
+@DataPermission({
+    @DataColumn(key = "deptName", value = "belonging_department_id"),
+    @DataColumn(key = "userName", value = "create_by"),
+    @DataColumn(key = "salesPersonName", value = "sales_person_id"),
+    @DataColumn(key = "serviceStaffName", value = "service_staff_id")
+})
 public interface CustomerInfoMapper extends BaseMapperPlus<CustomerInfo, CustomerInfoVo> {
 
     /**
      * 消息发布-分页查询客户列表
      */
     Page<MessagePublishCustomerVo> selectMessagePublishCustomerPage(@Param("page") Page<MessagePublishCustomerVo> page,
-                                                                     @Param("bo") MessagePublishCustomerBo bo);
+                                                                    @Param("bo") MessagePublishCustomerBo bo);
 
     /**
      * 客户列表-分页查询
      */
     Page<CustomerListVo> selectCustomerListPage(@Param("page") Page<CustomerListVo> page,
-                                                 @Param("bo") CustomerListBo bo);
+                                                @Param("bo") CustomerListBo bo);
 
     /**
      * 公海客户列表-分页查询(基于 customer_info 表,筛选无业务负责人的客户)
      */
     Page<CustomerInfoVo> selectHighSeasVoPage(@Param("page") Page<CustomerInfoVo> page,
-                                                @Param("bo") CustomerInfoBo bo);
+                                              @Param("bo") CustomerInfoBo bo);
 }

+ 8 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerInfoService.java

@@ -196,4 +196,12 @@ public interface ICustomerInfoService extends IService<CustomerInfo> {
     R<CustomerIndexDataVo> customerIndexData();
 
     Boolean isNeedAffirmOrder(Long customerId);
+
+    /**
+     * 导出模板数据:查询指定数量的客户数据,转换为导入模板格式
+     *
+     * @param limit 查询数量上限
+     * @return 导入模板VO列表
+     */
+    List<CustomerInfoImportVo> queryImportTemplateList(int limit);
 }

+ 9 - 2
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplierInfoService.java

@@ -6,11 +6,10 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import jakarta.validation.constraints.NotNull;
 import org.dromara.customer.domain.SupplierInfo;
 import org.dromara.customer.domain.bo.*;
-import org.dromara.customer.domain.vo.PartnerInfoVo;
+import org.dromara.customer.domain.vo.SupplierInfoImportVo;
 import org.dromara.customer.domain.vo.SupplierInfoVo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.customer.domain.vo.SupplierInformationVo;
 
 import java.util.Collection;
 import java.util.List;
@@ -161,4 +160,12 @@ public interface ISupplierInfoService extends IService<SupplierInfo> {
      * @return 是否同步成功
      */
     Boolean syncToTemporaryTable();
+
+    /**
+     * 导出模板数据:查询指定数量的供应商数据,转换为导入模板格式
+     *
+     * @param limit 导出数量
+     * @return 导入模板格式的供应商列表
+     */
+    List<SupplierInfoImportVo> queryImportTemplateList(int limit);
 }

+ 282 - 33
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java

@@ -41,9 +41,7 @@ import org.dromara.product.api.domain.dto.OrderStatusCountDto;
 import org.dromara.system.api.*;
 import org.dromara.system.api.domain.bo.RemoteUserBo;
 import org.dromara.system.api.domain.dto.AddressAreaDTO;
-import org.dromara.system.api.domain.vo.RemoteDeptVo;
-import org.dromara.system.api.domain.vo.RemoteDictDataVo;
-import org.dromara.system.api.domain.vo.RemoteUserWechatVo;
+import org.dromara.system.api.domain.vo.*;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -92,6 +90,15 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
     @DubboReference
     private RemoteComCustomerLevelService remoteComCustomerLevelService;
 
+    @DubboReference
+    private RemoteComCurrencyService remoteComCurrencyService;
+
+    @DubboReference
+    private RemoteComCustomerTypeService remoteComCustomerTypeService;
+
+    @DubboReference
+    private RemoteProductTaxrateService remoteProductTaxrateService;
+
     @DubboReference
     private RemoteDictService remoteDictService;
 
@@ -740,36 +747,6 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
         LambdaQueryWrapper<CustomerInfo> lqw = Wrappers.lambdaQuery();
         lqw.orderByDesc(CustomerInfo::getId);
 
-        // 数据权限过滤:只能查看自己创建的、或者是业务负责人、或者是客服支持的客户
-        if (bo.getCreateBy() != null || bo.getSalesPersonId() != null || bo.getServiceStaffId() != null) {
-            lqw.and(wrapper -> {
-                boolean first = true;
-                if (bo.getCreateBy() != null) {
-                    if (first) {
-                        wrapper.eq(CustomerInfo::getCreateBy, bo.getCreateBy());
-                        first = false;
-                    } else {
-                        wrapper.or().eq(CustomerInfo::getCreateBy, bo.getCreateBy());
-                    }
-                }
-                if (bo.getSalesPersonId() != null) {
-                    if (first) {
-                        wrapper.eq(CustomerInfo::getSalesPersonId, bo.getSalesPersonId());
-                        first = false;
-                    } else {
-                        wrapper.or().eq(CustomerInfo::getSalesPersonId, bo.getSalesPersonId());
-                    }
-                }
-                if (bo.getServiceStaffId() != null) {
-                    if (first) {
-                        wrapper.eq(CustomerInfo::getServiceStaffId, bo.getServiceStaffId());
-                    } else {
-                        wrapper.or().eq(CustomerInfo::getServiceStaffId, bo.getServiceStaffId());
-                    }
-                }
-            });
-        }
-
         lqw.eq(StringUtils.isNotBlank(bo.getCustomerNo()), CustomerInfo::getCustomerNo, bo.getCustomerNo());
         lqw.eq(bo.getBelongCompanyId() != null, CustomerInfo::getBelongCompanyId, bo.getBelongCompanyId());
         lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), CustomerInfo::getCompanyName, bo.getCompanyName());
@@ -1756,6 +1733,7 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setId(add.getId());
+
             CustomerSalesInfoBo customerSalesInfoBo = bo.getCustomerSalesInfoBo();
             customerSalesInfoBo.setCustomerId(add.getId());
             CustomerSalesInfo bean = BeanUtil.toBean(customerSalesInfoBo, CustomerSalesInfo.class);
@@ -2032,4 +2010,275 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
         }
         return affirmFlag;
     }
+
+    /**
+     * 导出模板数据:查询指定数量的客户数据,转换为导入模板格式
+     */
+    @Override
+    public List<CustomerInfoImportVo> queryImportTemplateList(int limit) {
+        List<CustomerInfoVo> list;
+
+        if (limit <= 0) {
+            // 导出全部
+            list = baseMapper.selectVoList(new LambdaQueryWrapper<>());
+        } else {
+            // 1. 分页查询客户主表数据(带销售信息)
+            PageQuery pageQuery = new PageQuery();
+            pageQuery.setPageNum(1);
+            pageQuery.setPageSize(limit);
+            TableDataInfo<CustomerInfoVo> pageResult = queryPageList(new CustomerInfoBo(), pageQuery);
+            list = pageResult.getRows();
+        }
+
+        if (CollUtil.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+
+        // 2. 收集所有需要远程查询的ID
+        Set<Long> companyIds = new HashSet<>();
+        Set<Long> customerLevelIds = new HashSet<>();
+        Set<Long> customerTypeIds = new HashSet<>();
+        Set<Long> industryCategoryIds = new HashSet<>();
+        Set<Long> enterpriseScaleIds = new HashSet<>();
+        Set<Long> comStaffIds = new HashSet<>();
+        Set<Long> creditLevelIds = new HashSet<>();
+        Set<Long> dealCurrencyIds = new HashSet<>();
+        Set<Long> rateIds = new HashSet<>();
+        Set<Long> erpStaffIds = new HashSet<>();
+
+        for (CustomerInfoVo vo : list) {
+            if (vo.getBelongCompanyId() != null) companyIds.add(vo.getBelongCompanyId());
+            if (vo.getCustomerLevelId() != null) customerLevelIds.add(vo.getCustomerLevelId());
+            if (vo.getCustomerTypeId() != null) customerTypeIds.add(vo.getCustomerTypeId());
+            if (vo.getIndustryCategoryId() != null) industryCategoryIds.add(vo.getIndustryCategoryId());
+            if (vo.getEnterpriseScaleId() != null) enterpriseScaleIds.add(vo.getEnterpriseScaleId());
+            if (vo.getSalesPersonId() != null) comStaffIds.add(vo.getSalesPersonId());
+            if (vo.getServiceStaffId() != null) comStaffIds.add(vo.getServiceStaffId());
+
+            CustomerSalesInfoVo salesVo = vo.getCustomerSalesInfoVo();
+            if (salesVo != null) {
+                if (salesVo.getCreditLevelId() != null) creditLevelIds.add(salesVo.getCreditLevelId());
+                if (salesVo.getDealCurrencyId() != null) dealCurrencyIds.add(salesVo.getDealCurrencyId());
+                if (salesVo.getRateId() != null) rateIds.add(salesVo.getRateId());
+                if (salesVo.getSalesPersonId() != null) erpStaffIds.add(salesVo.getSalesPersonId());
+                if (salesVo.getServiceStaffId() != null) erpStaffIds.add(salesVo.getServiceStaffId());
+            }
+        }
+
+        // 3. 批量查询远程服务获取名称和编码
+        // 公司:通过 selectCompanyList 全量加载后构建Map(因无批量ID查询方法)
+        Map<Long, RemoteComCompanyVo> companyMap = new HashMap<>();
+        if (!companyIds.isEmpty()) {
+            List<RemoteComCompanyVo> companyList = remoteComCompanyService.selectCompanyList();
+            for (RemoteComCompanyVo vo : companyList) {
+                if (companyIds.contains(vo.getId())) {
+                    companyMap.put(vo.getId(), vo);
+                }
+            }
+        }
+
+        // 客户等级:通过ID批量查询
+        Map<Long, String> customerLevelNameMap = customerLevelIds.isEmpty()
+            ? Collections.emptyMap()
+            : remoteComCustomerLevelService.selectCustomerLevelNameByIds(customerLevelIds);
+        Map<Long, RemoteComCustomerLevelVo> customerLevelMap = new HashMap<>();
+        if (!customerLevelIds.isEmpty()) {
+            List<RemoteComCustomerLevelVo> levelList = remoteComCustomerLevelService.selectCustomerLevelList();
+            for (RemoteComCustomerLevelVo vo : levelList) {
+                if (customerLevelIds.contains(vo.getId())) {
+                    customerLevelMap.put(vo.getId(), vo);
+                }
+            }
+        }
+
+        // 客户类型
+        Map<Long, RemoteComCustomerTypeVo> customerTypeMap = new HashMap<>();
+        if (!customerTypeIds.isEmpty()) {
+            List<RemoteComCustomerTypeVo> typeList = remoteComCustomerTypeService.selectCustomerTypeByIds(customerTypeIds);
+            for (RemoteComCustomerTypeVo vo : typeList) {
+                customerTypeMap.put(vo.getId(), vo);
+            }
+        }
+
+        // 行业类别
+        Map<Long, IndustryCategoryVo> industryCategoryMap = new HashMap<>();
+        if (!industryCategoryIds.isEmpty()) {
+            List<IndustryCategoryVo> industryList = industryCategoryMapper.selectVoByIds(industryCategoryIds);
+            for (IndustryCategoryVo vo : industryList) {
+                industryCategoryMap.put(vo.getId(), vo);
+            }
+        }
+
+        // 企业规模
+        Map<Long, EnterpriseScaleVo> enterpriseScaleMap = new HashMap<>();
+        if (!enterpriseScaleIds.isEmpty()) {
+            List<EnterpriseScaleVo> scaleList = enterpriseScaleMapper.selectVoByIds(enterpriseScaleIds);
+            for (EnterpriseScaleVo vo : scaleList) {
+                enterpriseScaleMap.put(vo.getId(), vo);
+            }
+        }
+
+        // 系统人员(ComStaff)
+        Map<Long, RemoteComStaffVo> comStaffMap = new HashMap<>();
+        if (!comStaffIds.isEmpty()) {
+            List<RemoteComStaffVo> staffList = remoteComStaffService.selectStaffByIds(comStaffIds);
+            for (RemoteComStaffVo vo : staffList) {
+                comStaffMap.put(vo.getStaffId(), vo);
+            }
+        }
+
+        // 信用等级
+        Map<Long, String> creditLevelNameMap = creditLevelIds.isEmpty()
+            ? Collections.emptyMap()
+            : remoteCreditLevelService.selectCreditLevelNameByIds(creditLevelIds);
+
+        // 交易币别
+        Map<Long, RemoteComCurrencyVo> currencyMap = new HashMap<>();
+        if (!dealCurrencyIds.isEmpty()) {
+            List<RemoteComCurrencyVo> currencyList = remoteComCurrencyService.selectCurrencyByIds(dealCurrencyIds);
+            for (RemoteComCurrencyVo vo : currencyList) {
+                currencyMap.put(vo.getId(), vo);
+            }
+        }
+
+        // 税码
+        Map<Long, RemoteProductTaxrateVo> taxrateMap = new HashMap<>();
+        if (!rateIds.isEmpty()) {
+            List<RemoteProductTaxrateVo> taxrateList = remoteProductTaxrateService.selectTaxrateByIds(rateIds);
+            for (RemoteProductTaxrateVo vo : taxrateList) {
+                taxrateMap.put(vo.getId(), vo);
+            }
+        }
+
+        // ERP人员
+        Map<Long, String> erpStaffNameMap = erpStaffIds.isEmpty()
+            ? Collections.emptyMap()
+            : remoteErpStaffService.selectStaffNameByIds(erpStaffIds);
+
+        // 信用等级名称 → 数字映射(用于导出)
+        Map<String, String> creditLevelReverseMap = Map.of(
+            "A", "0", "B", "1", "C", "2", "D", "3", "E", "4", "F", "5", "G", "6"
+        );
+
+        // 客户来源字典 (customer_source) - dictValue → dictLabel
+        Map<String, String> customerSourceDictMap = new HashMap<>();
+        List<RemoteDictDataVo> customerSourceDicts = remoteDictService.selectDictDataByType("customer_source");
+        CollUtil.emptyIfNull(customerSourceDicts).forEach(d -> customerSourceDictMap.put(d.getDictValue(), d.getDictLabel()));
+
+        // 销售通路字典 (sell_channel) - dictValue → dictLabel
+        Map<String, String> sellChannelDictMap = new HashMap<>();
+        List<RemoteDictDataVo> sellChannelDicts = remoteDictService.selectDictDataByType("sell_channel");
+        CollUtil.emptyIfNull(sellChannelDicts).forEach(d -> sellChannelDictMap.put(d.getDictValue(), d.getDictLabel()));
+
+        // 4. 构建导出VO列表
+        List<CustomerInfoImportVo> exportList = new ArrayList<>();
+        for (CustomerInfoVo vo : list) {
+            CustomerInfoImportVo importVo = new CustomerInfoImportVo();
+
+            // 公司信息
+            RemoteComCompanyVo companyVo = companyMap.get(vo.getBelongCompanyId());
+            importVo.setCompanyCode(companyVo != null ? companyVo.getCompanyCode() : null);
+            importVo.setCompanyName(companyVo != null ? companyVo.getCompanyName() : vo.getCompanyName());
+
+            // 基本信息
+            importVo.setCustomerNo(vo.getCustomerNo());
+            importVo.setCustomerName(vo.getCustomerName());
+            importVo.setBusinessCustomerName(vo.getBusinessCustomerName());
+            importVo.setShortName(vo.getShortName());
+            importVo.setSocialCreditCode(vo.getSocialCreditCode());
+
+            // 地址信息
+            importVo.setProvinceNo(vo.getRegProvincialNo());
+            importVo.setCityNo(vo.getRegCityNo());
+            importVo.setAreaNo(vo.getRegCountyNo());
+            importVo.setAddress(vo.getAddress());
+
+            // 客户等级
+            RemoteComCustomerLevelVo levelVo = customerLevelMap.get(vo.getCustomerLevelId());
+            importVo.setCustomerLevelNo(levelVo != null ? levelVo.getLevelCode() : null);
+            importVo.setCustomerLevelName(levelVo != null ? levelVo.getLevelName() : customerLevelNameMap.get(vo.getCustomerLevelId()));
+
+            // 客户类型
+            RemoteComCustomerTypeVo typeVo = customerTypeMap.get(vo.getCustomerTypeId());
+            importVo.setCustomerTypeNo(typeVo != null ? typeVo.getTypeCode() : null);
+            importVo.setCustomerTypeName(typeVo != null ? typeVo.getTypeName() : null);
+
+            // 行业类别
+            IndustryCategoryVo industryVo = industryCategoryMap.get(vo.getIndustryCategoryId());
+            importVo.setIndustryCategoryNo(industryVo != null ? industryVo.getIndustryCode() : null);
+            importVo.setIndustryCategory(industryVo != null ? industryVo.getIndustryCategoryName() : vo.getIndustryCategory());
+
+            // 企业规模
+            EnterpriseScaleVo scaleVo = enterpriseScaleMap.get(vo.getEnterpriseScaleId());
+            importVo.setEnterpriseScaleNo(scaleVo != null ? scaleVo.getEnterpriseScaleCode() : null);
+            importVo.setEnterpriseScale(scaleVo != null ? scaleVo.getEnterpriseScaleName() : null);
+
+            // 系统人员(业务负责人)
+            RemoteComStaffVo xtSales = comStaffMap.get(vo.getSalesPersonId());
+            importVo.setXtSalesPersonNo(xtSales != null ? xtSales.getStaffCode() : null);
+            importVo.setXtSalesPersonName(xtSales != null ? xtSales.getStaffName() : vo.getSalesPersonName());
+
+            // 系统人员(客服支持)
+            RemoteComStaffVo xtService = comStaffMap.get(vo.getServiceStaffId());
+            importVo.setXtServiceStaffNo(xtService != null ? xtService.getStaffCode() : null);
+            importVo.setXtServiceStaffName(xtService != null ? xtService.getStaffName() : vo.getServiceStaffName());
+
+            // 销售信息
+            CustomerSalesInfoVo salesVo = vo.getCustomerSalesInfoVo();
+            if (salesVo != null) {
+                // 客户来源(从字典获取,格式:编码,名称,如"0001,主动来电")
+                String customerSourceLabel = customerSourceDictMap.get(salesVo.getCustomerSource());
+                if (StringUtils.isNotBlank(customerSourceLabel)) {
+                    String[] parts = customerSourceLabel.split(",");
+                    importVo.setSourceNo(parts.length > 0 ? parts[0].trim() : null);
+                    importVo.setSourceName(parts.length > 1 ? parts[1].trim() : customerSourceLabel);
+                }
+                // 销售通路(从字典获取,格式:编码,名称)
+                String sellChannelLabel = sellChannelDictMap.get(salesVo.getSellChannel());
+                if (StringUtils.isNotBlank(sellChannelLabel)) {
+                    String[] parts = sellChannelLabel.split(",");
+                    importVo.setSellChannelNo(parts.length > 0 ? parts[0].trim() : null);
+                    importVo.setSellChannel(parts.length > 1 ? parts[1].trim() : sellChannelLabel);
+                }
+                // 单价含税
+                importVo.setUnitPrice(salesVo.getUnitPrice());
+                // 账款额度超限
+                importVo.setCreditLimit(salesVo.getCreditLimit());
+                // 额度超期
+                importVo.setCreditTimeLimit(salesVo.getCreditTimeLimit());
+                // 账款归属
+                importVo.setAccountBelong(salesVo.getAccountBelong());
+
+                // ERP 业务人员(salesPersonNo 在导入时按 staffName 查询)
+                String erpSalesName = erpStaffNameMap.get(salesVo.getSalesPersonId());
+                importVo.setSalesPersonNo(erpSalesName != null ? erpSalesName : salesVo.getSalesPerson());
+                importVo.setSalesPersonName(erpSalesName != null ? erpSalesName : salesVo.getSalesPerson());
+
+                // ERP 业务助理(serviceStaffNo 在导入时按 staffName 查询)
+                String erpServiceName = erpStaffNameMap.get(salesVo.getServiceStaffId());
+                importVo.setServiceStaffNo(erpServiceName != null ? erpServiceName : salesVo.getServiceStaff());
+                importVo.setServiceStaffName(erpServiceName != null ? erpServiceName : salesVo.getServiceStaff());
+
+                // 信用等级:将名称映射回数字
+                String creditLevelName = creditLevelNameMap.get(salesVo.getCreditLevelId());
+                importVo.setCreditLevel(creditLevelName != null ? creditLevelReverseMap.getOrDefault(creditLevelName, creditLevelName) : null);
+
+                // 交易币别:导出 currencyCode
+                RemoteComCurrencyVo currencyVo = currencyMap.get(salesVo.getDealCurrencyId());
+                importVo.setDealCurrency(currencyVo != null ? currencyVo.getCurrencyCode() : null);
+
+                // 税码
+                RemoteProductTaxrateVo taxrateVo = taxrateMap.get(salesVo.getRateId());
+                importVo.setRateName(taxrateVo != null ? taxrateVo.getTaxrateNo() : null);
+            }
+
+            // 销售开票类型(直接从 CustomerInfoVo 获取)
+            importVo.setSellInvoiceTypeNo(vo.getSellInvoiceTypeNo());
+            importVo.setSellInvoiceType(vo.getSellInvoiceType());
+
+            exportList.add(importVo);
+        }
+
+        return exportList;
+    }
 }

+ 238 - 14
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierInfoServiceImpl.java

@@ -1,6 +1,7 @@
 package org.dromara.customer.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.crypto.digest.BCrypt;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -38,11 +39,9 @@ import org.dromara.customer.utils.qcc.domain.CompanyInfoResponse;
 import org.dromara.product.api.RemoteCategoryService;
 import org.dromara.product.api.RemoteProductService;
 import org.dromara.product.api.domain.RemoteProductBrand;
-import org.dromara.system.api.RemoteComStaffService;
-import org.dromara.system.api.RemoteSupplierTypeService;
-import org.dromara.system.api.RemoteUserService;
+import org.dromara.system.api.*;
 import org.dromara.system.api.domain.bo.RemoteUserBo;
-import org.dromara.system.api.domain.vo.RemoteSupplierTypeVo;
+import org.dromara.system.api.domain.vo.*;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -103,6 +102,21 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
     @DubboReference
     private final RemoteSupplierTypeService remoteSupplierTypeService;
 
+    @DubboReference
+    private RemoteComCompanyService remoteComCompanyService;
+
+    @DubboReference
+    private RemoteErpStaffService remoteErpStaffService;
+
+    @DubboReference
+    private RemoteComCurrencyService remoteComCurrencyService;
+
+    @DubboReference
+    private RemoteProductTaxrateService remoteProductTaxrateService;
+
+    @DubboReference
+    private RemoteSupplierLevelService remoteSupplierLevelService;
+
 
     /**
      * 新增供应商信息
@@ -206,11 +220,11 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
             //状态为修改待审核
             supplierInfoVo.setSupplyStatus(SupplierStatusEnum.REVIEW_UPDATED.getCode());
             //先copy到临时表
-            SupplierInfoTemporary supplierInfoTemporary =  supplierInfoTemporaryService.getOne(Wrappers.lambdaQuery(SupplierInfoTemporary.class)
+            SupplierInfoTemporary supplierInfoTemporary = supplierInfoTemporaryService.getOne(Wrappers.lambdaQuery(SupplierInfoTemporary.class)
                 .eq(SupplierInfoTemporary::getSupplierId, bo.getId())
                 .last("limit 1")
             );
-            if(supplierInfoTemporary == null){
+            if (supplierInfoTemporary == null) {
                 supplierInfoTemporary = new SupplierInfoTemporary();
             }
             BeanUtils.copyProperties(bo, supplierInfoTemporary, "id");
@@ -370,17 +384,17 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
                 throw new RuntimeException("更新供应商待审核基础数据失败,请联系管理员", e);
             }
         }
-        SupplierInfoTemporary supplierInfoTemporary =  supplierInfoTemporaryService.getOne(Wrappers.lambdaQuery(SupplierInfoTemporary.class)
+        SupplierInfoTemporary supplierInfoTemporary = supplierInfoTemporaryService.getOne(Wrappers.lambdaQuery(SupplierInfoTemporary.class)
             .eq(SupplierInfoTemporary::getSupplierId, bo.getId())
             .last("limit 1")
         );
-        if(supplierInfoTemporary == null){
+        if (supplierInfoTemporary == null) {
             supplierInfoTemporary = new SupplierInfoTemporary();
             BeanUtils.copyProperties(bo, supplierInfoTemporary, "id");
             supplierInfoTemporary.setSupplyStatus(bo.getSupplyStatus());
             supplierInfoTemporaryService.saveOrUpdate(supplierInfoTemporary);
-        }else{
-            if(bo.getSupplyStatus() == SupplierStatusEnum.OFFICIAL_SUPPLIER.getCode()){
+        } else {
+            if (bo.getSupplyStatus() == SupplierStatusEnum.OFFICIAL_SUPPLIER.getCode()) {
                 supplierInfoTemporary.setSupplyStatus(bo.getSupplyStatus());
                 supplierInfoTemporaryService.saveOrUpdate(supplierInfoTemporary);
                 SupplierInfo supplierInfo = BeanUtil.toBean(supplierInfoTemporary, SupplierInfo.class);
@@ -388,7 +402,7 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
                 return baseMapper.updateById(supplierInfo) > 0;
             }
 
-            if(bo.getSupplyStatus() == SupplierStatusEnum.REVIEW_FAILED.getCode()){
+            if (bo.getSupplyStatus() == SupplierStatusEnum.REVIEW_FAILED.getCode()) {
                 supplierInfoTemporary.setSupplyStatus(bo.getSupplyStatus());
                 supplierInfoTemporaryService.saveOrUpdate(supplierInfoTemporary);
                 SupplierInfo supplierInfo = BeanUtil.toBean(supplierInfoTemporary, SupplierInfo.class);
@@ -647,13 +661,13 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
             .eq(SupplierInfo::getId, id));
         SupplierInfoVo supplierInfoVo = new SupplierInfoVo();
 //        if (supplierInfoVo1 != null && supplierInfoVo1.getSupplyStatus() == SupplierStatusEnum.REVIEW_UPDATED.getCode()) {
-        if (supplierInfoVo1 != null ) {
+        if (supplierInfoVo1 != null) {
             SupplierInfoTemporaryVo supplierInfoTemporaryVo = supplierInfoTemporaryService.getVoOne(id);
             if (supplierInfoTemporaryVo != null) {
                 BeanUtils.copyProperties(supplierInfoTemporaryVo, supplierInfoVo);
             }
         } else {
-                supplierInfoVo = baseMapper.selectVoById(id);
+            supplierInfoVo = baseMapper.selectVoById(id);
         }
         SupplierInfoVo supplierInformationVo = handleProcurementInfo(supplierInfoVo);
         //返回工商信息
@@ -2139,7 +2153,7 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
             add.setSupplierId(supplierInfo.getId());
             add.setSupplyStatus(0L);
             supplierInfoTemporaryService.updateById(add);
-        }else {
+        } else {
             SupplierInfoTemporary add = BeanUtil.toBean(supplierInfo, SupplierInfoTemporary.class);
             add.setSupplierId(supplierInfo.getId());
             add.setSupplyStatus(0L);
@@ -2526,4 +2540,214 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
 
         return temporary;
     }
+
+    /**
+     * 导出模板数据:查询指定数量的供应商数据,转换为导入模板格式
+     */
+    @Override
+    public List<SupplierInfoImportVo> queryImportTemplateList(int limit) {
+        // 1. 查询供应商主表数据
+        List<SupplierInfoVo> list;
+        if (limit <= 0) {
+            // 导出全部
+            list = baseMapper.selectVoList(new LambdaQueryWrapper<>());
+        } else {
+            PageQuery pageQuery = new PageQuery();
+            pageQuery.setPageNum(1);
+            pageQuery.setPageSize(limit);
+            TableDataInfo<SupplierInfoVo> pageResult = queryPageList(new SupplierInfoBo(), pageQuery);
+            list = pageResult.getRows();
+        }
+
+        if (CollUtil.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+
+        // 2. 收集所有供应商ID
+        Set<Long> supplierIds = list.stream()
+            .map(SupplierInfoVo::getId)
+            .filter(Objects::nonNull)
+            .collect(Collectors.toSet());
+
+        // 3. 查询供应商的ERP信息
+        Map<Long, SupplierErpInfoVo> erpInfoMap = new HashMap<>();
+        if (!supplierIds.isEmpty()) {
+            List<SupplierErpInfoVo> erpInfoList = supplierErpInfoMapper.selectVoList(
+                new LambdaQueryWrapper<SupplierErpInfo>().in(SupplierErpInfo::getSupplierId, supplierIds));
+            for (SupplierErpInfoVo vo : erpInfoList) {
+                erpInfoMap.put(vo.getSupplierId(), vo);
+            }
+        }
+
+        // 4. 收集需要远程查询的ID
+        Set<Long> companyIds = new HashSet<>();
+        Set<Long> supplierTypeIds = new HashSet<>();
+        Set<Long> erpStaffIds = new HashSet<>();
+        Set<Long> dealCurrencyIds = new HashSet<>();
+        Set<Long> rateIds = new HashSet<>();
+
+        for (SupplierInfoVo vo : list) {
+            if (vo.getOwnedCompany() != null) companyIds.add(vo.getOwnedCompany());
+            if (vo.getSupplierType() != null) supplierTypeIds.add(vo.getSupplierType());
+            SupplierErpInfoVo erpVo = erpInfoMap.get(vo.getId());
+            if (erpVo != null) {
+                if (erpVo.getPurchaseId() != null) erpStaffIds.add(erpVo.getPurchaseId());
+                if (erpVo.getDealCurrencyId() != null) dealCurrencyIds.add(erpVo.getDealCurrencyId());
+                if (erpVo.getRateId() != null) rateIds.add(erpVo.getRateId());
+            }
+        }
+
+        // 5. 批量查询远程服务
+        // 公司
+        Map<Long, RemoteComCompanyVo> companyMap = new HashMap<>();
+        if (!companyIds.isEmpty()) {
+            List<RemoteComCompanyVo> companyList = remoteComCompanyService.selectCompanyList();
+            for (RemoteComCompanyVo vo : companyList) {
+                if (companyIds.contains(vo.getId())) {
+                    companyMap.put(vo.getId(), vo);
+                }
+            }
+        }
+
+        // 供应商类型(按ID逐个查询,避免 queryList 的 dataSource 过滤导致遗漏)
+        Map<Long, RemoteSupplierTypeVo> supplierTypeMap = new HashMap<>();
+        for (Long id : supplierTypeIds) {
+            RemoteSupplierTypeVo typeVo = remoteSupplierTypeService.selectByTypeId(id);
+            if (typeVo != null) {
+                supplierTypeMap.put(id, typeVo);
+            }
+        }
+
+        // 采购员(ERP人员)
+        Map<Long, String> erpStaffNameMap = erpStaffIds.isEmpty()
+            ? Collections.emptyMap()
+            : remoteErpStaffService.selectStaffNameByIds(erpStaffIds);
+
+        // 交易币别
+        Map<Long, RemoteComCurrencyVo> currencyMap = new HashMap<>();
+        if (!dealCurrencyIds.isEmpty()) {
+            List<RemoteComCurrencyVo> currencyList = remoteComCurrencyService.selectCurrencyByIds(dealCurrencyIds);
+            for (RemoteComCurrencyVo vo : currencyList) {
+                currencyMap.put(vo.getId(), vo);
+            }
+        }
+
+        // 税码
+        Map<Long, RemoteProductTaxrateVo> taxrateMap = new HashMap<>();
+        if (!rateIds.isEmpty()) {
+            List<RemoteProductTaxrateVo> taxrateList = remoteProductTaxrateService.selectTaxrateByIds(rateIds);
+            for (RemoteProductTaxrateVo vo : taxrateList) {
+                taxrateMap.put(vo.getId(), vo);
+            }
+        }
+
+        // 供应商等级(按ID逐个查询,每次导出最多30条)
+        Map<Long, RemoteSupplierLevelVo> supplierLevelMap = new HashMap<>();
+        Set<Long> levelIds = list.stream()
+            .map(SupplierInfoVo::getCooperateLevel)
+            .filter(Objects::nonNull)
+            .map(s -> {
+                try {
+                    return Long.valueOf(s);
+                } catch (NumberFormatException e) {
+                    return null;
+                }
+            })
+            .filter(Objects::nonNull)
+            .collect(Collectors.toSet());
+        for (Long levelId : levelIds) {
+            RemoteSupplierLevelVo levelVo = remoteSupplierLevelService.selectByLevelId(levelId);
+            if (levelVo != null) {
+                supplierLevelMap.put(levelId, levelVo);
+            }
+        }
+
+        // ERP人员编码(通过姓名反查staffCode)
+        Map<String, String> staffNameToCodeMap = new HashMap<>();
+        for (String staffName : new HashSet<>(erpStaffNameMap.values())) {
+            if (StringUtils.isNotBlank(staffName)) {
+                RemoteErpStaffVo staffVo = remoteErpStaffService.selectStaffByStaffNameOne(staffName);
+                if (staffVo != null && StringUtils.isNotBlank(staffVo.getStaffCode())) {
+                    staffNameToCodeMap.put(staffName, staffVo.getStaffCode());
+                }
+            }
+        }
+
+        // 6. 构建导出VO列表
+        List<SupplierInfoImportVo> exportList = new ArrayList<>();
+        for (SupplierInfoVo vo : list) {
+            SupplierInfoImportVo importVo = new SupplierInfoImportVo();
+
+            // 公司
+            RemoteComCompanyVo companyVo = companyMap.get(vo.getOwnedCompany());
+            importVo.setCompanyCode(companyVo != null ? companyVo.getCompanyCode() : null);
+            importVo.setOwnedCompanyName(companyVo != null ? companyVo.getCompanyName() : null);
+
+            // 基本信息
+            importVo.setSupplierNo(vo.getSupplierNo());
+            importVo.setEnterpriseName(vo.getEnterpriseName());
+            importVo.setBusinessName(vo.getBusinessName());
+            importVo.setShortName(vo.getShortName());
+            importVo.setSocialCreditCode(vo.getSocialCreditCode());
+
+            // 供应商类型
+            RemoteSupplierTypeVo typeVo = supplierTypeMap.get(vo.getSupplierType());
+            importVo.setSupplierTypeNo(typeVo != null ? typeVo.getSupplierTypeNo() : null);
+            importVo.setSupplierTypeName(typeVo != null ? typeVo.getSupplierTypeName() : null);
+
+            // 供应商等级
+            Long levelId = null;
+            if (vo.getCooperateLevel() != null) {
+                try {
+                    levelId = Long.valueOf(vo.getCooperateLevel());
+                } catch (NumberFormatException ignored) {
+                }
+            }
+            RemoteSupplierLevelVo levelVo = levelId != null ? supplierLevelMap.get(levelId) : null;
+            importVo.setSupplierLevelNo(levelVo != null ? levelVo.getSupplierLevelNo() : null);
+            importVo.setSupplierLevelName(levelVo != null ? levelVo.getSupplierLevelName() : null);
+
+            // 联系信息
+            importVo.setFixedPhone(vo.getFixedPhone());
+            importVo.setOfficeProvince(vo.getOfficeProvince());
+            importVo.setOfficeCity(vo.getOfficeCity());
+            importVo.setOfficeCounty(vo.getOfficeCounty());
+            importVo.setOfficeAddress(vo.getOfficeAddress());
+
+            // ERP信息
+            SupplierErpInfoVo erpVo = erpInfoMap.get(vo.getId());
+            if (erpVo != null) {
+                // 采购员
+                String buyerName = erpStaffNameMap.get(erpVo.getPurchaseId());
+                importVo.setBuyerNo(staffNameToCodeMap.get(buyerName));
+                importVo.setBuyerName(buyerName);
+                importVo.setBuyerOne("");
+
+                // 付款类型
+                importVo.setBuyType(erpVo.getSettlementMethod());
+
+                // 开票类型
+                importVo.setInvoiceTypeNo(erpVo.getPurchaseInvoiceNo());
+                importVo.setInvoiceType(erpVo.getPurchaseInvoice());
+
+                // 单价含税
+                importVo.setUnitPrice(erpVo.getUnitPrice());
+
+                // 交易币别
+                RemoteComCurrencyVo currencyVo = currencyMap.get(erpVo.getDealCurrencyId());
+                importVo.setDealCurrency(currencyVo != null ? currencyVo.getCurrencyCode() : null);
+
+                // 税码
+                RemoteProductTaxrateVo taxrateVo = taxrateMap.get(erpVo.getRateId());
+                importVo.setRateName(taxrateVo != null ? taxrateVo.getTaxrateNo() : null);
+
+                // 账款归属
+                importVo.setAccountBelong(erpVo.getAccountBelong());
+            }
+
+            exportList.add(importVo);
+        }
+
+        return exportList;
+    }
 }

+ 4 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderDeliver.java

@@ -117,4 +117,8 @@ public class OrderDeliver extends TenantEntity {
      */
     private String remark;
 
+    /**
+     * 物流轨迹
+     */
+    private String logisticsTrack;
 }

+ 4 - 1
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderDeliverBo.java

@@ -112,5 +112,8 @@ public class OrderDeliverBo extends BaseEntity {
 
     private List<OrderDeliverProductBo> orderDeliverProducts;
 
-
+    /**
+     * 物流轨迹
+     */
+    private String logisticsTrack;
 }

+ 5 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderDeliverVo.java

@@ -150,4 +150,9 @@ public class OrderDeliverVo implements Serializable {
 
     //物流公司
     private String logisticsCompanyName;
+
+    /**
+     * 物流轨迹
+     */
+    private String logisticsTrack;
 }

+ 23 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderDeliverServiceImpl.java

@@ -2,6 +2,7 @@ package org.dromara.order.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -170,6 +171,17 @@ public class OrderDeliverServiceImpl extends ServiceImpl<OrderDeliverMapper, Ord
             try {
                 log.info("开始查询物流信息,单号: {}, 公司代码: {}", dto.getNum(), dto.getCom());
                 trackVO = Kd100Util.queryTrack(dto);
+                // 将物流轨迹以JSON格式保存到字段
+                if (trackVO != null) {
+                    String trackJson = JSONUtil.toJsonStr(trackVO);
+                    bo.setLogisticsTrack(trackJson);
+                    // 如果发货记录已存在,同步更新数据库
+                    if (bo.getId() != null) {
+                        baseMapper.update(null, new LambdaUpdateWrapper<OrderDeliver>()
+                            .eq(OrderDeliver::getId, bo.getId())
+                            .set(OrderDeliver::getLogisticsTrack, trackJson));
+                    }
+                }
                 return trackVO;
 
             } catch (Exception e) {
@@ -690,6 +702,17 @@ public class OrderDeliverServiceImpl extends ServiceImpl<OrderDeliverMapper, Ord
             try {
                 log.info("API开始查询物流信息,单号: {}, 公司代码: {}", dto.getNum(), dto.getCom());
                 trackVO = Kd100Util.queryTrack(dto);
+                // 将物流轨迹以JSON格式保存到字段
+                if (trackVO != null) {
+                    String trackJson = JSONUtil.toJsonStr(trackVO);
+                    bo.setLogisticsTrack(trackJson);
+                    // 如果发货记录已存在,同步更新数据库
+                    if (bo.getId() != null) {
+                        baseMapper.update(null, new LambdaUpdateWrapper<OrderDeliver>()
+                            .eq(OrderDeliver::getId, bo.getId())
+                            .set(OrderDeliver::getLogisticsTrack, trackJson));
+                    }
+                }
                 log.info("API成功查询物流信息,单号: {}, 状态: {}", logisticNo, trackVO != null ? trackVO.getState() : "null");
                 return trackVO;
 

+ 18 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteComCurrencyServiceImpl.java

@@ -1,15 +1,22 @@
 package org.dromara.system.dubbo;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.system.api.RemoteComCurrencyService;
 import org.dromara.system.api.domain.vo.RemoteComCurrencyVo;
+import org.dromara.system.domain.ComCurrency;
 import org.dromara.system.domain.vo.ComCurrencyVo;
 import org.dromara.system.service.IComCurrencyService;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 @RequiredArgsConstructor
 @Service
 @DubboService
@@ -22,4 +29,15 @@ public class RemoteComCurrencyServiceImpl implements RemoteComCurrencyService {
         ComCurrencyVo comCurrencyVo = comCurrencyService.selectCurrencyByName(currencyName);
         return BeanUtil.toBean(comCurrencyVo, RemoteComCurrencyVo.class);
     }
+
+    @Override
+    public List<RemoteComCurrencyVo> selectCurrencyByIds(Set<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return new ArrayList<>();
+        }
+        List<ComCurrency> list = comCurrencyService.listByIds(ids);
+        return list.stream()
+            .map(e -> BeanUtil.toBean(e, RemoteComCurrencyVo.class))
+            .collect(Collectors.toList());
+    }
 }

+ 18 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteComCustomerTypeServiceImpl.java

@@ -1,15 +1,22 @@
 package org.dromara.system.dubbo;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.system.api.RemoteComCustomerTypeService;
 import org.dromara.system.api.domain.vo.RemoteComCustomerTypeVo;
+import org.dromara.system.domain.ComCustomerType;
 import org.dromara.system.domain.vo.ComCustomerTypeVo;
 import org.dromara.system.service.IComCustomerTypeService;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 @RequiredArgsConstructor
 @Service
 @DubboService
@@ -22,4 +29,15 @@ public class RemoteComCustomerTypeServiceImpl implements RemoteComCustomerTypeSe
         ComCustomerTypeVo comCustomerTypeVo = comCustomerTypeService.selectCustomerTypeByName(typeName);
         return BeanUtil.toBean(comCustomerTypeVo, RemoteComCustomerTypeVo.class);
     }
+
+    @Override
+    public List<RemoteComCustomerTypeVo> selectCustomerTypeByIds(Set<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return new ArrayList<>();
+        }
+        List<ComCustomerType> list = comCustomerTypeService.listByIds(ids);
+        return list.stream()
+            .map(e -> BeanUtil.toBean(e, RemoteComCustomerTypeVo.class))
+            .collect(Collectors.toList());
+    }
 }

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteComStaffServiceImpl.java

@@ -42,6 +42,11 @@ public class RemoteComStaffServiceImpl implements RemoteComStaffService {
         return BeanUtil.toBean(comStaffService.selectStaffByStaffName(staffName), RemoteComStaffVo.class);
     }
 
+    @Override
+    public RemoteComStaffVo selectStaffByStaffCode(String staffCode) {
+        return BeanUtil.toBean(comStaffService.selectStaffByStaffCode(staffCode), RemoteComStaffVo.class);
+    }
+
     @Override
     public RemoteComStaffVo selectStaffByUserId(Long userId) {
         return BeanUtil.toBean(comStaffService.selectStaffByUserId(userId), RemoteComStaffVo.class);

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

@@ -23,6 +23,11 @@ public class RemoteErpStaffServiceImpl implements RemoteErpStaffService {
         return erpStaffService.selectStaffNameByIds(ids);
     }
 
+    @Override
+    public RemoteErpStaffVo selectStaffByStaffNameOne(String staffName) {
+        return BeanUtil.toBean(erpStaffService.selectStaffByStaffNameOne(staffName), RemoteErpStaffVo.class);
+    }
+
     @Override
     public RemoteErpStaffVo selectStaffByStaffName(String staffName) {
         return BeanUtil.toBean(erpStaffService.selectStaffByStaffName(staffName), RemoteErpStaffVo.class);

+ 17 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteProductTaxrateServiceImpl.java

@@ -1,15 +1,22 @@
 package org.dromara.system.dubbo;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
 
 import org.dromara.system.api.RemoteProductTaxrateService;
 import org.dromara.system.api.domain.vo.RemoteProductTaxrateVo;
+import org.dromara.system.domain.ProductTaxrate;
 import org.dromara.system.service.IProductTaxrateService;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 @Slf4j
 @Service
 @RequiredArgsConstructor
@@ -23,5 +30,15 @@ public class RemoteProductTaxrateServiceImpl implements RemoteProductTaxrateServ
         return BeanUtil.toBean(productTaxrateService.selectByTaxrateNo(taxrateNo), RemoteProductTaxrateVo.class);
     }
 
+    @Override
+    public List<RemoteProductTaxrateVo> selectTaxrateByIds(Set<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return new ArrayList<>();
+        }
+        List<ProductTaxrate> list = productTaxrateService.listByIds(ids);
+        return list.stream()
+            .map(e -> BeanUtil.toBean(e, RemoteProductTaxrateVo.class))
+            .collect(Collectors.toList());
+    }
 
 }

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSupplierLevelServiceImpl.java

@@ -21,4 +21,10 @@ public class RemoteSupplierLevelServiceImpl implements RemoteSupplierLevelServic
         SupplierLevelVo supplierLevelVo = supplierLevelService.selectByLevelName(levelName);
         return BeanUtil.toBean(supplierLevelVo, RemoteSupplierLevelVo.class);
     }
+
+    @Override
+    public RemoteSupplierLevelVo selectByLevelId(Long id) {
+        SupplierLevelVo supplierLevelVo = supplierLevelService.queryById(id);
+        return BeanUtil.toBean(supplierLevelVo, RemoteSupplierLevelVo.class);
+    }
 }

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteSupplierTypeServiceImpl.java

@@ -48,4 +48,10 @@ public class RemoteSupplierTypeServiceImpl implements RemoteSupplierTypeService
         SupplierTypeVo supplierTypeVo = iSupplierTypeService.selectByTypeName(typeName);
         return BeanUtil.toBean(supplierTypeVo, RemoteSupplierTypeVo.class);
     }
+
+    @Override
+    public RemoteSupplierTypeVo selectByTypeId(Long id) {
+        SupplierTypeVo supplierTypeVo = iSupplierTypeService.queryById(id);
+        return BeanUtil.toBean(supplierTypeVo, RemoteSupplierTypeVo.class);
+    }
 }

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IComStaffService.java

@@ -90,6 +90,8 @@ public interface IComStaffService extends IService<ComStaff> {
 
     ComStaffVo selectStaffByStaffName(String staffName);
 
+    ComStaffVo selectStaffByStaffCode(String staffCode);
+
     ComStaffVo selectStaffByUserId(Long userId);
 
 }

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

@@ -63,6 +63,8 @@ public interface IErpStaffService extends IService<ErpStaff> {
 
     Map<Long, String> selectStaffNameByIds(Set<Long> ids);
 
+    ErpStaffVo selectStaffByStaffNameOne(String staffCode);
+
     ErpStaffVo selectStaffByStaffName(String staffCode);
 
     /**

+ 11 - 6
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ComStaffServiceImpl.java

@@ -298,32 +298,32 @@ public class ComStaffServiceImpl extends ServiceImpl<ComStaffMapper, ComStaff> i
         if (flag && oldStaff.getUserId() != null) {
             SysUser updateUser = new SysUser();
             updateUser.setUserId(oldStaff.getUserId());
-            
+
             // 同步平台使用范围
             if (StringUtils.isNotBlank(bo.getPlatformRange())) {
                 updateUser.setPlatformRange(bo.getPlatformRange());
             }
-            
+
             // 同步手机号
             if (StringUtils.isNotBlank(bo.getPhone())) {
                 updateUser.setPhonenumber(bo.getPhone());
             }
-            
+
             // 同步昵称(使用人员姓名)
             if (StringUtils.isNotBlank(bo.getStaffName())) {
                 updateUser.setNickName(bo.getStaffName());
             }
-            
+
             // 同步部门ID
             if (bo.getDeptId() != null) {
                 updateUser.setDeptId(bo.getDeptId());
             }
-            
+
             // 同步状态
             if (StringUtils.isNotBlank(bo.getStatus())) {
                 updateUser.setStatus(bo.getStatus());
             }
-            
+
             sysUserMapper.updateById(updateUser);
         }
 
@@ -427,6 +427,11 @@ public class ComStaffServiceImpl extends ServiceImpl<ComStaffMapper, ComStaff> i
         return baseMapper.selectVoOne(new LambdaQueryWrapper<ComStaff>().eq(ComStaff::getStaffName, staffName));
     }
 
+    @Override
+    public ComStaffVo selectStaffByStaffCode(String staffCode) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<ComStaff>().eq(ComStaff::getStaffCode, staffCode));
+    }
+
     @Override
     public ComStaffVo selectStaffByUserId(Long userId) {
         return baseMapper.selectVoOne(new LambdaQueryWrapper<ComStaff>().eq(ComStaff::getUserId, userId).eq(ComStaff::getDelFlag, "0").last("LIMIT 1"));

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

@@ -172,6 +172,10 @@ public class ErpStaffServiceImpl extends ServiceImpl<ErpStaffMapper, ErpStaff> i
     }
 
     @Override
+    public ErpStaffVo selectStaffByStaffNameOne(String staffCode) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<ErpStaff>().eq(ErpStaff::getStaffName, staffCode));
+    }
+
     public ErpStaffVo selectStaffByStaffName(String staffCode) {
         return baseMapper.selectVoOne(new LambdaQueryWrapper<ErpStaff>().eq(ErpStaff::getStaffCode, staffCode));
     }