Explorar el Código

feat(customer): 添加客户联系人查询接口及供应商地址联系人管理功能

- 新增 selectCustomerContactByCustomerIdAndUserId 方法用于按客户ID和用户ID查询联系人
- 添加 RemoteCustomerContactService 远程服务接口及实现类
- 新增 RemoteCustomerContactVo 数据传输对象
- 实现供应商地址默认地址切换功能 changeDefaultAddress
- 添加供应商联系人主联系人切换功能 changeIsPrimaryContact
- 修复订单统计查询中的用户ID过滤逻辑
- 更新 ERP 员工和部门服务引用配置
- 修正供应商地址自身地址标识注释错误
- 优化供应商联系人主联系人唯一性控制逻辑
hurx hace 4 días
padre
commit
58b3a273ba
Se han modificado 17 ficheros con 329 adiciones y 71 borrados
  1. 8 0
      ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/RemoteCustomerContactService.java
  2. 77 0
      ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/domain/vo/RemoteCustomerContactVo.java
  3. 6 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierAddressController.java
  4. 7 2
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierContactController.java
  5. 1 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SupplierAddressBo.java
  6. 26 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemoteCustomerContactServiceImpl.java
  7. 8 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerContactService.java
  8. 8 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplierAddressService.java
  9. 5 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplierContactService.java
  10. 5 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerContactServiceImpl.java
  11. 62 21
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierAddressServiceImpl.java
  12. 77 30
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierContactServiceImpl.java
  13. 2 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierInfoServiceImpl.java
  14. 23 7
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/pc/PcOrderController.java
  15. 7 2
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java
  16. 7 5
      ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMainMapper.xml
  17. 0 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteErpDeptServiceImpl.java

+ 8 - 0
ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/RemoteCustomerContactService.java

@@ -0,0 +1,8 @@
+package org.dromara.customer.api;
+
+import org.dromara.customer.api.domain.vo.RemoteCustomerContactVo;
+
+public interface RemoteCustomerContactService {
+
+    RemoteCustomerContactVo selectCustomerContactByCustomerIdAndUserId(Long customerId, Long userId);
+}

+ 77 - 0
ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/domain/vo/RemoteCustomerContactVo.java

@@ -0,0 +1,77 @@
+package org.dromara.customer.api.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class RemoteCustomerContactVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 联系人ID
+     */
+    private Long id;
+
+    /*联系人编号*/
+    private String contactNo;
+
+    /*系统用户id*/
+    private Long userId;
+
+    /**
+     * 所属客户ID
+     */
+    private Long customerId;
+
+
+    /**
+     * 联系人姓名
+     */
+    private String contactName;
+
+    private String wechat;
+
+    /*自定义登录名*/
+    private String customLoginName;
+
+    /**
+     * 手机号码
+     */
+    private String phone;
+
+    /**
+     * 办公电话
+     */
+    private String officePhone;
+
+    /**
+     * 办公电话2
+     */
+    private String officePhoneTwo;
+
+    /**
+     * 性别
+     */
+    private String gender;
+
+    /**
+     * 采购角色(如:采购经理、财务)
+     */
+    private Long roleId;
+
+    private String roleName;
+
+    private Long deptId;
+
+    private String deptName;
+
+    /**
+     * 是否主联系人:0=是,1=否
+     */
+    private String isPrimary;
+
+}

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

@@ -8,6 +8,7 @@ import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.customer.domain.bo.CustomerShippingAddressBo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -118,4 +119,9 @@ public class SupplierAddressController extends BaseController {
                           @PathVariable("ids") Long[] ids) {
         return toAjax(supplierAddressService.deleteWithValidByIds(List.of(ids), true));
     }
+
+    @PutMapping("/changeDefaultAddress")
+    public R<Void> changeDefaultAddress(@RequestBody SupplierAddressBo bo) {
+        return toAjax(supplierAddressService.changeDefaultAddress(bo));
+    }
 }

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

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.customer.domain.bo.CustomerShippingAddressBo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -57,7 +58,6 @@ public class SupplierContactController extends BaseController {
     }
 
 
-
     /**
      * 导出联系人列表
      */
@@ -77,7 +77,7 @@ public class SupplierContactController extends BaseController {
     //@SaCheckPermission("supplier:contact:query")
     @GetMapping("/{id}")
     public R<SupplierContactVo> getInfo(@NotNull(message = "主键不能为空")
-                                     @PathVariable("id") Long id) {
+                                        @PathVariable("id") Long id) {
         return R.ok(supplierContactService.queryById(id));
     }
 
@@ -115,4 +115,9 @@ public class SupplierContactController extends BaseController {
                           @PathVariable("ids") Long[] ids) {
         return toAjax(supplierContactService.deleteWithValidByIds(List.of(ids), true));
     }
+
+    @PutMapping("/changeIsPrimaryContact")
+    public R<Void> changeDefaultAddress(@RequestBody SupplierContactBo bo) {
+        return toAjax(supplierContactService.changeIsPrimaryContact(bo));
+    }
 }

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

@@ -81,7 +81,7 @@ public class SupplierAddressBo extends BaseEntity {
     private String pushStatus;
 
     /**
-     * 是否为自身地址(1-是, 0-否
+     * 是否为自身地址(1-否, 0-是
      */
     private String isSelf;
 

+ 26 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemoteCustomerContactServiceImpl.java

@@ -0,0 +1,26 @@
+package org.dromara.customer.dubbo;
+
+import cn.hutool.core.bean.BeanUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.customer.api.RemoteCustomerContactService;
+import org.dromara.customer.api.domain.vo.RemoteCustomerContactVo;
+import org.dromara.customer.domain.vo.CustomerContactVo;
+import org.dromara.customer.service.ICustomerContactService;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@DubboService
+public class RemoteCustomerContactServiceImpl implements RemoteCustomerContactService {
+
+    private final ICustomerContactService customerContactService;
+
+    @Override
+    public RemoteCustomerContactVo selectCustomerContactByCustomerIdAndUserId(Long customerId, Long userId) {
+        CustomerContactVo customerContactVo = customerContactService.selectCustomerContactByCustomerIdAndUserId(customerId, userId);
+        return BeanUtil.toBean(customerContactVo, RemoteCustomerContactVo.class);
+    }
+}

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

@@ -27,6 +27,14 @@ public interface ICustomerContactService extends IService<CustomerContact> {
      */
     CustomerContactVo queryById(Long id);
 
+
+    /**
+     * 根据客户id和用户id查询
+     *
+     * @return 客户联系人信息
+     */
+    CustomerContactVo selectCustomerContactByCustomerIdAndUserId(Long customerId, Long userId);
+
     /**
      * 分页查询客户联系人信息列表
      *

+ 8 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplierAddressService.java

@@ -2,6 +2,7 @@ package org.dromara.customer.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.dromara.customer.domain.SupplierAddress;
+import org.dromara.customer.domain.bo.CustomerShippingAddressBo;
 import org.dromara.customer.domain.vo.SupplierAddressVo;
 import org.dromara.customer.domain.bo.SupplierAddressBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -16,7 +17,7 @@ import java.util.List;
  * @author LJY
  * @date 2026-01-19
  */
-public interface ISupplierAddressService extends IService<SupplierAddress>{
+public interface ISupplierAddressService extends IService<SupplierAddress> {
 
     /**
      * 查询供应商地址
@@ -66,6 +67,12 @@ public interface ISupplierAddressService extends IService<SupplierAddress>{
      * @param isValid 是否进行有效性校验
      * @return 是否删除成功
      */
+
+    /**
+     * 设置默认地址
+     */
+    int changeDefaultAddress(SupplierAddressBo bo);
+
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     List<SupplierAddressVo> getSupplierAddressById(SupplierAddressBo bo);

+ 5 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplierContactService.java

@@ -2,6 +2,7 @@ package org.dromara.customer.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.dromara.customer.domain.SupplierContact;
+import org.dromara.customer.domain.bo.CustomerShippingAddressBo;
 import org.dromara.customer.domain.vo.SupplierContactVo;
 import org.dromara.customer.domain.bo.SupplierContactBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -16,7 +17,7 @@ import java.util.List;
  * @author LJY
  * @date 2026-01-13
  */
-public interface ISupplierContactService extends IService<SupplierContact>{
+public interface ISupplierContactService extends IService<SupplierContact> {
 
     /**
      * 查询联系人
@@ -59,6 +60,9 @@ public interface ISupplierContactService extends IService<SupplierContact>{
      */
     Boolean updateByBo(SupplierContactBo bo);
 
+    int changeIsPrimaryContact(SupplierContactBo bo);
+
+
     /**
      * 校验并批量删除联系人信息
      *

+ 5 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerContactServiceImpl.java

@@ -69,6 +69,11 @@ public class CustomerContactServiceImpl extends ServiceImpl<CustomerContactMappe
         return baseMapper.selectVoById(id);
     }
 
+    @Override
+    public CustomerContactVo selectCustomerContactByCustomerIdAndUserId(Long customerId, Long userId) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<CustomerContact>().eq(CustomerContact::getCustomerId, customerId).eq(CustomerContact::getUserId, userId).last("limit 1"));
+    }
+
     /**
      * 分页查询客户联系人信息列表
      *

+ 62 - 21
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierAddressServiceImpl.java

@@ -1,26 +1,26 @@
 package org.dromara.customer.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+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.enums.IsDefault;
 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.dromara.customer.domain.SupplierInfo;
-import org.dromara.customer.domain.vo.SupplierInfoVo;
-import org.dromara.customer.mapper.SupplierInfoMapper;
-import org.springframework.stereotype.Service;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.customer.domain.SupplierAddress;
 import org.dromara.customer.domain.bo.SupplierAddressBo;
 import org.dromara.customer.domain.vo.SupplierAddressVo;
-import org.dromara.customer.domain.SupplierAddress;
+import org.dromara.customer.domain.vo.SupplierInfoVo;
 import org.dromara.customer.mapper.SupplierAddressMapper;
+import org.dromara.customer.mapper.SupplierInfoMapper;
 import org.dromara.customer.service.ISupplierAddressService;
+import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
@@ -35,7 +35,7 @@ import java.util.stream.Collectors;
 @Slf4j
 @RequiredArgsConstructor
 @Service
-public class SupplierAddressServiceImpl  extends ServiceImpl<SupplierAddressMapper, SupplierAddress> implements ISupplierAddressService {
+public class SupplierAddressServiceImpl extends ServiceImpl<SupplierAddressMapper, SupplierAddress> implements ISupplierAddressService {
 
     private final SupplierAddressMapper baseMapper;
 
@@ -48,7 +48,7 @@ public class SupplierAddressServiceImpl  extends ServiceImpl<SupplierAddressMapp
      * @return 供应商地址
      */
     @Override
-    public SupplierAddressVo queryById(Long id){
+    public SupplierAddressVo queryById(Long id) {
         return baseMapper.selectVoById(id);
     }
 
@@ -140,12 +140,12 @@ public class SupplierAddressServiceImpl  extends ServiceImpl<SupplierAddressMapp
         SupplierAddress add = MapstructUtils.convert(bo, SupplierAddress.class);
         validEntityBeforeSave(add);
         // 如果设置为自身地址
-        if ("1".equals(add.getIsSelf())) {
+        if (IsDefault.Yes.getCode().equals(add.getIsSelf())) {
 
-            // 把该供应商下其他地址全部改为0
+            // 把该供应商下其他地址全部改为
             LambdaUpdateWrapper<SupplierAddress> updateWrapper = Wrappers.lambdaUpdate();
             updateWrapper.eq(SupplierAddress::getSupplierId, add.getSupplierId())
-                .set(SupplierAddress::getIsSelf, "0");
+                .set(SupplierAddress::getIsSelf, IsDefault.No.getCode());
 
             baseMapper.update(null, updateWrapper);
         }
@@ -156,7 +156,7 @@ public class SupplierAddressServiceImpl  extends ServiceImpl<SupplierAddressMapp
         SupplierAddress supplierAddress = baseMapper.selectOne(lqw);
         String addressNo = supplierAddress.getAddressNo();
         Long maxNo = Long.parseLong(addressNo);
-        String newAddressNo = String.valueOf(maxNo+1);
+        String newAddressNo = String.valueOf(maxNo + 1);
         add.setAddressNo(newAddressNo);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
@@ -177,22 +177,63 @@ public class SupplierAddressServiceImpl  extends ServiceImpl<SupplierAddressMapp
         SupplierAddress update = MapstructUtils.convert(bo, SupplierAddress.class);
         validEntityBeforeSave(update);
         // 如果本次修改设置为自身地址
-        if ("1".equals(update.getIsSelf())) {
+        if (IsDefault.Yes.getCode().equals(update.getIsSelf())) {
 
             LambdaUpdateWrapper<SupplierAddress> updateWrapper = Wrappers.lambdaUpdate();
             updateWrapper.eq(SupplierAddress::getSupplierId, update.getSupplierId())
                 .ne(SupplierAddress::getId, update.getId()) // 排除自己
-                .set(SupplierAddress::getIsSelf, "0");
+                .set(SupplierAddress::getIsSelf, IsDefault.No.getCode());
 
             baseMapper.update(null, updateWrapper);
         }
         return baseMapper.updateById(update) > 0;
     }
 
+    @Override
+    public int changeDefaultAddress(SupplierAddressBo bo) {
+        try {
+            if (bo == null || bo.getId() == null) {
+                return 0;
+            }
+            SupplierAddressVo supplierAddressVo = baseMapper.selectVoById(bo.getId());
+            log.info("修改默认地址:" + supplierAddressVo);
+            if (IsDefault.Yes.getCode().equals(bo.getIsSelf())) {
+                // 1. 清除该供应商下所有默认地址
+                SupplierAddress updateObj = new SupplierAddress();
+                updateObj.setIsSelf(IsDefault.No.getCode()); //
+
+                baseMapper.update(
+                    updateObj,
+                    new LambdaUpdateWrapper<SupplierAddress>()
+                        .eq(SupplierAddress::getSupplierId, supplierAddressVo.getSupplierId()) //
+                        .eq(SupplierAddress::getIsSelf, IsDefault.Yes.getCode())
+                );
+
+                // 2. 设置当前地址为默认
+                SupplierAddress current = new SupplierAddress();
+                current.setId(bo.getId());
+                current.setIsSelf(IsDefault.Yes.getCode());
+                baseMapper.updateById(current);
+
+                return 1;
+            } else {
+                // 取消默认
+                SupplierAddress current = new SupplierAddress();
+                current.setId(bo.getId());
+                current.setIsSelf(IsDefault.No.getCode());
+                baseMapper.updateById(current);
+                return 1;
+            }
+        } catch (Exception e) {
+            log.error("修改默认地址失败:" + e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+    }
+
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(SupplierAddress entity){
+    private void validEntityBeforeSave(SupplierAddress entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
@@ -205,7 +246,7 @@ public class SupplierAddressServiceImpl  extends ServiceImpl<SupplierAddressMapp
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteByIds(ids) > 0;

+ 77 - 30
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierContactServiceImpl.java

@@ -2,37 +2,36 @@ package org.dromara.customer.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.crypto.digest.BCrypt;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+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.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.enums.SysPlatformYesNo;
 import org.dromara.common.core.exception.ServiceException;
 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.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.customer.controller.SupplierInfoController;
+import org.dromara.customer.domain.SupplierContact;
 import org.dromara.customer.domain.SupplierInfo;
-import org.dromara.customer.domain.vo.SupplierInformationVo;
-import org.dromara.customer.service.ISupplierInfoService;
-import org.dromara.system.api.RemoteUserService;
-import org.dromara.system.api.domain.bo.RemoteUserBo;
-import org.springframework.stereotype.Service;
 import org.dromara.customer.domain.bo.SupplierContactBo;
 import org.dromara.customer.domain.vo.SupplierContactVo;
-import org.dromara.customer.domain.SupplierContact;
 import org.dromara.customer.mapper.SupplierContactMapper;
 import org.dromara.customer.service.ISupplierContactService;
+import org.dromara.customer.service.ISupplierInfoService;
+import org.dromara.system.api.RemoteUserService;
+import org.dromara.system.api.domain.bo.RemoteUserBo;
+import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.Collection;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
@@ -178,14 +177,21 @@ public class SupplierContactServiceImpl extends ServiceImpl<SupplierContactMappe
         //4.如果是待修改审核  能登录  user是能登录的 status = 0
         SupplierContact add = MapstructUtils.convert(bo, SupplierContact.class);
         // ====== 主联系人唯一控制 ======
-        if ("1".equals(add.getIsPrimaryContact())) {
-
-            LambdaUpdateWrapper<SupplierContact> updateWrapper = Wrappers.lambdaUpdate();
-            updateWrapper.eq(SupplierContact::getSupplierId, add.getSupplierId())
-                .set(SupplierContact::getIsPrimaryContact, "0");
-
-            baseMapper.update(null, updateWrapper);
+//        if ("1".equals(add.getIsPrimaryContact())) {
+//
+//            LambdaUpdateWrapper<SupplierContact> updateWrapper = Wrappers.lambdaUpdate();
+//            updateWrapper.eq(SupplierContact::getSupplierId, add.getSupplierId())
+//                .set(SupplierContact::getIsPrimaryContact, "0");
+//
+//            baseMapper.update(null, updateWrapper);
+//        }
+        List<SupplierContact> supplierContacts = baseMapper.selectList(new LambdaQueryWrapper<SupplierContact>().eq(SupplierContact::getSupplierId, add.getSupplierId()).eq(SupplierContact::getIsPrimaryContact, SysPlatformYesNo.YES.getCode()));
+        if (ObjectUtil.isNotEmpty(supplierContacts) && supplierContacts.size() > 0) {
+            add.setIsPrimaryContact(SysPlatformYesNo.NO.getCode());
+        } else {
+            add.setIsPrimaryContact(SysPlatformYesNo.YES.getCode());
         }
+
         RemoteUserBo remoteUserBo = new RemoteUserBo();
         remoteUserBo.setNickName(bo.getUserName());
         remoteUserBo.setUserName(bo.getPhone());
@@ -227,15 +233,15 @@ public class SupplierContactServiceImpl extends ServiceImpl<SupplierContactMappe
     public Boolean updateByBo(SupplierContactBo bo) {
         SupplierContact update = MapstructUtils.convert(bo, SupplierContact.class);
         // ====== 主联系人唯一控制 ======
-        if ("1".equals(update.getIsPrimaryContact())) {
-
-            LambdaUpdateWrapper<SupplierContact> updateWrapper = Wrappers.lambdaUpdate();
-            updateWrapper.eq(SupplierContact::getSupplierId, update.getSupplierId())
-                .ne(SupplierContact::getId, update.getId()) // 排除自己
-                .set(SupplierContact::getIsPrimaryContact, "0");
-
-            baseMapper.update(null, updateWrapper);
-        }
+//        if ("1".equals(update.getIsPrimaryContact())) {
+//
+//            LambdaUpdateWrapper<SupplierContact> updateWrapper = Wrappers.lambdaUpdate();
+//            updateWrapper.eq(SupplierContact::getSupplierId, update.getSupplierId())
+//                .ne(SupplierContact::getId, update.getId()) // 排除自己
+//                .set(SupplierContact::getIsPrimaryContact, "0");
+//
+//            baseMapper.update(null, updateWrapper);
+//        }
         if (update.getUserId() != null) {
             RemoteUserBo remoteUserBo = new RemoteUserBo();
             remoteUserBo.setNickName(bo.getUserName());
@@ -252,6 +258,47 @@ public class SupplierContactServiceImpl extends ServiceImpl<SupplierContactMappe
         return baseMapper.updateById(update) > 0;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int changeIsPrimaryContact(SupplierContactBo bo) {
+        try {
+            if (bo == null || bo.getId() == null) {
+                return 0;
+            }
+            SupplierContactVo supplierContactVo = baseMapper.selectVoById(bo.getId());
+            log.info("修改主联系人:" + supplierContactVo);
+            if (SysPlatformYesNo.YES.getCode().equals(bo.getIsPrimaryContact())) {
+                // 1. 清除该供应商下默认联系人
+                SupplierContact updateObj = new SupplierContact();
+                updateObj.setIsPrimaryContact(SysPlatformYesNo.NO.getCode()); //
+
+                baseMapper.update(
+                    updateObj,
+                    new LambdaUpdateWrapper<SupplierContact>()
+                        .eq(SupplierContact::getSupplierId, supplierContactVo.getSupplierId()) //
+                        .eq(SupplierContact::getIsPrimaryContact, SysPlatformYesNo.YES.getCode())
+                );
+
+                // 2. 设置当前为默认
+                SupplierContact current = new SupplierContact();
+                current.setId(bo.getId());
+                current.setIsPrimaryContact(SysPlatformYesNo.YES.getCode());
+                baseMapper.updateById(current);
+
+                return 1;
+            } else {
+                // 取消默认
+                SupplierContact current = new SupplierContact();
+                current.setId(bo.getId());
+                current.setIsPrimaryContact(SysPlatformYesNo.NO.getCode());
+                baseMapper.updateById(current);
+                return 1;
+            }
+        } catch (Exception e) {
+            log.error("修改失败:" + e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+    }
 
     /**
      * 校验并批量删除联系人信息

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

@@ -193,6 +193,7 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
         if (supplierInfoVo.getSupplyStatus() == SupplierStatusEnum.OFFICIAL_SUPPLIER.getCode() && bo.getSupplyStatus() == SupplierStatusEnum.DISABLED.getCode()) {
             SupplierInfo update = MapstructUtils.convert(bo, SupplierInfo.class);
             update.setCooperative(0l);
+
             return baseMapper.updateById(update) > 0;
         }
         //正式供应商 -> 修改待审核
@@ -2283,6 +2284,7 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
     @Override
     public int scmUpdateByBo(SupplierInfoBo bo) {
         SupplierInfo update = MapstructUtils.convert(bo, SupplierInfo.class);
+        saveSupplierBusinessInfoFromJson(bo.getOtherCustomers(), bo.getId());
         return baseMapper.updateById(update);
     }
 

+ 23 - 7
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/pc/PcOrderController.java

@@ -1,6 +1,7 @@
 package org.dromara.order.controller.pc;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import jakarta.validation.constraints.NotNull;
@@ -10,20 +11,18 @@ import org.dromara.common.core.domain.R;
 import org.dromara.common.core.enums.OrderSourceEnum;
 import org.dromara.common.core.enums.OrderStatus;
 import org.dromara.common.core.enums.SysPlatformYesNo;
-import org.dromara.common.core.exception.ServiceException;
 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.redis.utils.SequenceUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.api.RemoteCustomerContactService;
 import org.dromara.customer.api.RemoteCustomerService;
 import org.dromara.customer.api.domain.CustomerApiVo;
+import org.dromara.customer.api.domain.vo.RemoteCustomerContactVo;
 import org.dromara.order.domain.OrderCustomerFlowLink;
-import org.dromara.order.domain.OrderCustomerFlowNode;
 import org.dromara.order.domain.OrderCustomerFlowNodeLink;
-import org.dromara.order.domain.OrderMain;
 import org.dromara.order.domain.bo.*;
 import org.dromara.order.domain.dto.OrderPayDto;
 import org.dromara.order.domain.vo.OrderCountVo;
@@ -38,14 +37,12 @@ import org.dromara.product.api.RemoteProductService;
 import org.dromara.product.api.RemoteProductShoppingCartService;
 import org.dromara.product.api.domain.ProductVo;
 import org.dromara.product.api.domain.RemoteProductShoppingCartVo;
-import org.springframework.dao.DuplicateKeyException;
+import org.dromara.system.api.RemoteUserService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
-import java.time.Duration;
 import java.time.LocalDate;
-import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -65,12 +62,18 @@ import static org.dromara.common.mybatis.core.mapper.BaseMapperPlus.log;
 @RequestMapping("/pcOrder")
 public class PcOrderController extends BaseController {
 
+    @DubboReference
+    private RemoteUserService remoteUserService;
+
     @DubboReference
     private RemoteCustomerService remoteCustomerService;
 
     @DubboReference
     private RemoteProductService remoteProductService;
 
+    @DubboReference
+    private RemoteCustomerContactService remoteCustomerContactService;
+
     @DubboReference
     private RemoteProductShoppingCartService remoteProductShoppingCartService;
 
@@ -99,6 +102,13 @@ public class PcOrderController extends BaseController {
         bo.setUserId(userId);
         bo.setIsSplitChild(SysPlatformYesNo.NO.getCode());
 
+        RemoteCustomerContactVo remoteCustomerContactVo = remoteCustomerContactService.selectCustomerContactByCustomerIdAndUserId(customerId, userId);
+        if (ObjectUtil.isNotEmpty(remoteCustomerContactVo)) {
+            if (Long.valueOf(1).equals(remoteCustomerContactVo.getRoleId())) {
+                bo.setUserId(null);
+            }
+        }
+
         return orderMainService.queryPageList(bo, pageQuery);
     }
 
@@ -108,6 +118,12 @@ public class PcOrderController extends BaseController {
         Long customerId = LoginHelper.getLoginUser().getCustomerId();
 
         Long userId = LoginHelper.getLoginUser().getUserId();
+        RemoteCustomerContactVo remoteCustomerContactVo = remoteCustomerContactService.selectCustomerContactByCustomerIdAndUserId(customerId, userId);
+        if (ObjectUtil.isNotEmpty(remoteCustomerContactVo)) {
+            if (Long.valueOf(1).equals(remoteCustomerContactVo.getRoleId())) {
+                userId = null;
+            }
+        }
         return R.ok(orderMainService.countOrderNum(customerId, userId));
     }
 

+ 7 - 2
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java

@@ -94,6 +94,11 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
     @DubboReference
     private RemoteComDeptService remoteComDeptService;
 
+    private RemoteErpStaffService remoteErpStaffService;
+
+    @DubboReference
+    private RemoteErpDeptService remoteErpDeptService;
+
     //客户订单流程
     private final IOrderCustomerFlowService orderCustomerFlowService;
 
@@ -589,11 +594,11 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
 
             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);
 
             mainBo.setBusinessStaff(staffMap.get(salesPersonId));
             mainBo.setCustomerService(staffMap.get(serviceStaffId));

+ 7 - 5
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMainMapper.xml

@@ -47,12 +47,14 @@
 
     <select id="countOrderNum" resultType="org.dromara.order.domain.vo.OrderCountVo">
         SELECT SUM(CASE WHEN order_status = '0' THEN 1 ELSE 0 END) AS pendingPaymentCount,
-               SUM(CASE WHEN order_status = '2' THEN 1 ELSE 0 END) AS pendingShipmentCount,
-               SUM(CASE WHEN order_status = '4' THEN 1 ELSE 0 END) AS pendingReceiptCount
+        SUM(CASE WHEN order_status = '2' THEN 1 ELSE 0 END) AS pendingShipmentCount,
+        SUM(CASE WHEN order_status = '4' THEN 1 ELSE 0 END) AS pendingReceiptCount
         FROM order_main
         WHERE customer_id = #{customerId}
-          AND user_id = #{userId}
-          AND is_split_child = '1'
-          AND del_flag = '0'
+        <if test="userId != null ">
+            AND user_id = #{userId}
+        </if>
+        AND is_split_child = '1'
+        AND del_flag = '0'
     </select>
 </mapper>

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

@@ -33,7 +33,6 @@ public class RemoteErpDeptServiceImpl implements RemoteErpDeptService {
     /**
      * 通过部门ID查询部门名称
      *
-     * @param deptIds 部门ID串逗号分隔
      * @return 部门名称串逗号分隔
      */
     @Override