浏览代码

feat(customer): 完善投诉建议功能并优化企业信息管理

- 在投诉建议模块中添加企业ID字段,实现按企业过滤功能
- 实现投诉建议的新增、修改、删除权限验证机制
- 集成序列号工具生成唯一的投诉编号
- 添加客户联系人姓名显示功能
- 在企业信息模块增加营业执照和法人证件字段
- 实现PC端企业信息更新功能pcUpdateCustomerInfo
- 重构工作流分类实体继承关系,统一租户实体基类
- 优化订单评价列表查询,支持评价状态筛选
- 更新订单状态枚举,添加取消订单状态
- 统一PC端各模块的企业ID获取方式,使用LoginHelper获取客户ID
- 优化员工信息展示,增加角色名称显示功能
hurx 2 月之前
父节点
当前提交
0461db3ec1
共有 45 个文件被更改,包括 643 次插入155 次删除
  1. 3 1
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/OrderStatus.java
  2. 2 2
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java
  3. 12 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/pc/PcStatementInvoiceController.java
  4. 4 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/domain/bo/StatementInvoiceBo.java
  5. 8 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/service/IStatementInvoiceService.java
  6. 30 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/service/impl/StatementInvoiceServiceImpl.java
  7. 54 5
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/pc/PcComplaintsSuggestionsController.java
  8. 3 3
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/pc/PcContactController.java
  9. 1 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/pc/PcEnterpriseController.java
  10. 28 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/pc/PcEnterpriseScaleController.java
  11. 27 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/pc/PcIndustryCategoryController.java
  12. 6 6
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/pc/PcInvoiceController.java
  13. 7 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/ComplaintsSuggestions.java
  14. 8 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInfo.java
  15. 7 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/ComplaintsSuggestionsBo.java
  16. 8 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInfoBo.java
  17. 13 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/ComplaintsSuggestionsVo.java
  18. 8 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInfoVo.java
  19. 2 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemoteCustomerSalesServiceImpl.java
  20. 8 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerInfoService.java
  21. 26 4
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/ComplaintsSuggestionsServiceImpl.java
  22. 5 4
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerContactServiceImpl.java
  23. 31 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java
  24. 125 19
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/pc/PcOrderController.java
  25. 7 5
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/pc/PcOrderEvaluationController.java
  26. 2 2
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/pc/PcOrderReturnController.java
  27. 5 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderEvaluation.java
  28. 7 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderEvaluationBo.java
  29. 10 5
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/PcSubmitOrderBo.java
  30. 2 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderEvaluationListVo.java
  31. 5 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderEvaluationVo.java
  32. 1 1
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderMainMapper.java
  33. 1 1
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderEvaluationService.java
  34. 2 2
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderEvaluationServiceImpl.java
  35. 7 1
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java
  36. 29 15
      ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMainMapper.xml
  37. 2 1
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteProductShoppingCartServiceImpl.java
  38. 71 69
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java
  39. 28 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/pc/PcComBankController.java
  40. 11 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/pc/PcComStaffController.java
  41. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ComStaffVo.java
  42. 19 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ComStaffServiceImpl.java
  43. 2 1
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java
  44. 2 1
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java
  45. 2 1
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java

+ 3 - 1
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/OrderStatus.java

@@ -40,7 +40,9 @@ public enum OrderStatus {
     /**
      * 已关闭(取消、超时、全额退款等)
      */
-    CLOSED("6", "已关闭");
+    CLOSED("6", "已关闭"),
+
+    CANCEL("7", "取消");
 
 
     private final String code;

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

@@ -77,6 +77,7 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "order_product",
         "com_",
         "product_",
+        "flow_",
         "supplier_level",
         "enterprise_scale",
         "industry_category",
@@ -96,7 +97,6 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "authorize_type_level"
 
 
-
         // 注意:前缀匹配需特殊处理(如 qrtz_),见 isIgnoreTable 方法
     ));
 
@@ -210,7 +210,7 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         }
 
         // 前缀匹配
-        return tableName.startsWith("qrtz_") || tableName.startsWith("product_") || tableName.startsWith("com_") ||tableName.startsWith("supplier_");
+        return tableName.startsWith("qrtz_") || tableName.startsWith("product_") || tableName.startsWith("com_") || tableName.startsWith("supplier_") || tableName.startsWith("flow_");
     }
 
     /**

+ 12 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/controller/pc/PcStatementInvoiceController.java

@@ -3,6 +3,10 @@ package org.dromara.bill.controller.pc;
 import lombok.RequiredArgsConstructor;
 import jakarta.validation.constraints.*;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+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;
@@ -55,4 +59,12 @@ public class PcStatementInvoiceController extends BaseController {
         }
         return R.ok(vo);
     }
+
+    /*pc端客户申请开票*/
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody StatementInvoiceBo bo) {
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
+        bo.setCustomerId(customerId);
+        return toAjax(statementInvoiceService.pcInsertByBo(bo));
+    }
 }

+ 4 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/domain/bo/StatementInvoiceBo.java

@@ -11,6 +11,7 @@ import jakarta.validation.constraints.*;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 
@@ -90,4 +91,7 @@ public class StatementInvoiceBo extends BaseEntity {
 
     private List<InvoiceInfoBo> invoiceList;
 
+    /*客户申请开票提供的对账单id*/
+    private Set<Long> statementOrderIds;
+
 }

+ 8 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/service/IStatementInvoiceService.java

@@ -54,6 +54,14 @@ public interface IStatementInvoiceService extends IService<StatementInvoice> {
      */
     Boolean insertByBo(StatementInvoiceBo bo);
 
+    /**
+     * pc新增销售发票主
+     *
+     * @param bo 销售发票主
+     * @return 是否新增成功
+     */
+    Boolean pcInsertByBo(StatementInvoiceBo bo);
+
     /**
      * 修改销售发票主
      *

+ 30 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/service/impl/StatementInvoiceServiceImpl.java

@@ -186,6 +186,36 @@ public class StatementInvoiceServiceImpl extends ServiceImpl<StatementInvoiceMap
         return success;
     }
 
+    /**
+     * pc新增销售发票主
+     *
+     * @param bo 销售发票主
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean pcInsertByBo(StatementInvoiceBo bo) {
+        // 1. 设置发票编号
+        String statementInvoiceNo = SequenceUtils.generateOrderCode("BL");
+        bo.setStatementInvoiceNo(statementInvoiceNo);
+
+        // 2. 设置初始状态为“待确认”
+        bo.setInvoiceStatus(InvoiceStatus.NOT_INVOICED.getCode()); // 假设 PENDING = "0" 或 "pending"
+
+        // 3. 转换并保存主表
+        StatementInvoice entity = MapstructUtils.convert(bo, StatementInvoice.class);
+        validEntityBeforeSave(entity);
+        boolean success = this.save(entity);
+
+        if (success) {
+            bo.setId(entity.getId());
+            // 4. 保存明细、商品、发票信息(不含真实发票)
+            saveDetailsAndProductsAndInvoiceInfos(bo);
+        }
+
+
+        return success;
+    }
+
     /**
      * 修改销售发票主
      *

+ 54 - 5
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/pc/PcComplaintsSuggestionsController.java

@@ -1,5 +1,6 @@
 package org.dromara.customer.controller.pc;
 
+import jakarta.validation.constraints.NotEmpty;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.validate.AddGroup;
@@ -12,10 +13,13 @@ import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.customer.domain.bo.ComplaintsSuggestionsBo;
 import org.dromara.customer.domain.vo.ComplaintsSuggestionsVo;
+import org.dromara.customer.domain.vo.CustomerInvoiceInfoVo;
 import org.dromara.customer.service.IComplaintsSuggestionsService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 @Validated
 @RequiredArgsConstructor
 @RestController
@@ -27,24 +31,69 @@ public class PcComplaintsSuggestionsController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<ComplaintsSuggestionsVo> getComplaintsSuggestions(PageQuery pageQuery) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
         ComplaintsSuggestionsBo bo = new ComplaintsSuggestionsBo();
-        bo.setUserId(customerId);
+        bo.setCustomerId(customerId);
         return pcComplaintsSuggestionsService.queryPageList(bo, pageQuery);
     }
 
     /**
-     * 新增订单评价
+     * 新增投诉建议
      */
     @Log(title = "PC端-新增投诉建议", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody ComplaintsSuggestionsBo bo) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long userId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
         // 强制设置ID,防止为其他企业创建售后申请
-        bo.setUserId(customerId);
+        bo.setUserId(userId);
+        bo.setCustomerId(customerId);
 
         return toAjax(pcComplaintsSuggestionsService.insertByBo(bo));
     }
+
+    /**
+     * 修改投诉建议
+     */
+    @Log(title = "PC端-修改投诉建议", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> update(@Validated(AddGroup.class) @RequestBody ComplaintsSuggestionsBo bo) {
+        // 获取当前登录用户的企业ID
+        Long userId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
+        // 强制设置ID,防止为其他企业创建售后申请
+        bo.setUserId(userId);
+        bo.setCustomerId(customerId);
+
+        return toAjax(pcComplaintsSuggestionsService.updateByBo(bo));
+    }
+
+    /**
+     * 删除投诉建议
+     *
+     * @param ids 主键串
+     */
+    @Log(title = "PC端-投诉建议", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        // 获取当前登录用户的企业ID
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
+
+        // 验证所有发票是否都属于当前用户的企业
+        for (Long id : ids) {
+            ComplaintsSuggestionsVo suggestionsVo = pcComplaintsSuggestionsService.queryById(id);
+            if (suggestionsVo == null) {
+                return R.fail("投诉建议ID " + id + " 不存在");
+            }
+            if (!customerId.equals(suggestionsVo.getCustomerId())) {
+                return R.fail("无权删除投诉建议ID " + id);
+            }
+        }
+
+        return toAjax(pcComplaintsSuggestionsService.deleteWithValidByIds(List.of(ids), true));
+    }
 }

+ 3 - 3
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/pc/PcContactController.java

@@ -66,7 +66,7 @@ public class PcContactController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<CustomerContactVo> list(CustomerContactBo bo, PageQuery pageQuery) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
         // 强制设置企业ID,防止越权访问
         bo.setCustomerId(customerId);
 
@@ -104,7 +104,7 @@ public class PcContactController extends BaseController {
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody CustomerContactBo bo) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
         // 强制设置企业ID,防止为其他企业添加联系人
         bo.setCustomerId(customerId);
 
@@ -146,7 +146,7 @@ public class PcContactController extends BaseController {
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable("ids") Long[] ids) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
 
         // 验证所有联系人是否都属于当前用户的企业
         for (Long id : ids) {

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

@@ -66,7 +66,7 @@ public class PcEnterpriseController extends BaseController {
         bo.setId(customerId);
 
         // 调用Service更新企业信息
-        boolean result = customerInfoService.updateByBo(bo);
+        boolean result = customerInfoService.pcUpdateCustomerInfo(bo);
         return toAjax(result);
     }
 }

+ 28 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/pc/PcEnterpriseScaleController.java

@@ -0,0 +1,28 @@
+package org.dromara.customer.controller.pc;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.EnterpriseScaleBo;
+import org.dromara.customer.domain.vo.EnterpriseScaleVo;
+import org.dromara.customer.service.IEnterpriseScaleService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/pcEnterpriseScale")
+public class PcEnterpriseScaleController extends BaseController {
+
+    private final IEnterpriseScaleService enterpriseScaleService;
+
+
+    @GetMapping("/list")
+    public TableDataInfo<EnterpriseScaleVo> list(PageQuery pageQuery) {
+        return enterpriseScaleService.queryPageList(new EnterpriseScaleBo(), pageQuery);
+    }
+}

+ 27 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/pc/PcIndustryCategoryController.java

@@ -0,0 +1,27 @@
+package org.dromara.customer.controller.pc;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.customer.domain.bo.IndustryCategoryBo;
+import org.dromara.customer.domain.vo.IndustryCategoryVo;
+import org.dromara.customer.service.IIndustryCategoryService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/pcIndustryCategory")
+public class PcIndustryCategoryController extends BaseController {
+
+    private final IIndustryCategoryService industryCategoryService;
+
+    @GetMapping("/list")
+    public TableDataInfo<IndustryCategoryVo> list(PageQuery pageQuery) {
+        return industryCategoryService.queryPageList(new IndustryCategoryBo(), pageQuery);
+    }
+}

+ 6 - 6
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/pc/PcInvoiceController.java

@@ -30,7 +30,7 @@ import org.dromara.common.idempotent.annotation.RepeatSubmit;
 @Validated
 @RequiredArgsConstructor
 @RestController
-@RequestMapping("/pc/enterprise/invoice")
+@RequestMapping("/pcInvoice")
 public class PcInvoiceController extends BaseController {
 
     private final ICustomerInvoiceInfoService customerInvoiceInfoService;
@@ -42,7 +42,7 @@ public class PcInvoiceController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<CustomerInvoiceInfoVo> list(CustomerInvoiceInfoBo bo, PageQuery pageQuery) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
         // 强制设置企业ID,防止越权访问
         bo.setCustomerId(customerId);
 
@@ -63,7 +63,7 @@ public class PcInvoiceController extends BaseController {
 
         // 验证发票是否属于当前用户的企业
         if (vo != null) {
-            Long customerId = LoginHelper.getUserId();
+            Long customerId = LoginHelper.getLoginUser().getCustomerId();
             if (!customerId.equals(vo.getCustomerId())) {
                 return R.fail("无权访问该发票信息");
             }
@@ -80,7 +80,7 @@ public class PcInvoiceController extends BaseController {
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody CustomerInvoiceInfoBo bo) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
         // 强制设置企业ID,防止为其他企业添加发票
         bo.setCustomerId(customerId);
 
@@ -95,7 +95,7 @@ public class PcInvoiceController extends BaseController {
     @PutMapping()
     public R<Void> edit(@Validated(EditGroup.class) @RequestBody CustomerInvoiceInfoBo bo) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
 
         // 验证发票是否属于当前用户的企业
         CustomerInvoiceInfoVo existingInvoice = customerInvoiceInfoService.queryById(bo.getId());
@@ -122,7 +122,7 @@ public class PcInvoiceController extends BaseController {
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable("ids") Long[] ids) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
 
         // 验证所有发票是否都属于当前用户的企业
         for (Long id : ids) {

+ 7 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/ComplaintsSuggestions.java

@@ -4,7 +4,9 @@ import org.dromara.common.tenant.core.TenantEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 
 import java.io.Serial;
@@ -34,6 +36,11 @@ public class ComplaintsSuggestions extends TenantEntity {
      */
     private String complainNo;
 
+    /**
+     * 企业id
+     */
+    private Long customerId;
+
     /**
      * 用户id
      */

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

@@ -101,6 +101,14 @@ public class CustomerInfo extends TenantEntity {
      */
     private String url;
 
+    /*营业执照*/
+    private String businessLicense;
+
+    /**
+     * 法人证件
+     */
+    private String legalPersonCardUrl;
+
     /**
      * 邮政编码
      */

+ 7 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/ComplaintsSuggestionsBo.java

@@ -8,7 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 
 /**
@@ -32,6 +34,11 @@ public class ComplaintsSuggestionsBo extends BaseEntity {
      */
     private String complainNo;
 
+    /**
+     * 企业id
+     */
+    private Long customerId;
+
     /**
      * 用户id
      */

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

@@ -109,6 +109,14 @@ public class CustomerInfoBo extends BaseEntity {
      */
     private String url;
 
+    /*营业执照*/
+    private String businessLicense;
+
+    /**
+     * 法人证件
+     */
+    private String legalPersonCardUrl;
+
     /**
      * 邮政编码
      */

+ 13 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/ComplaintsSuggestionsVo.java

@@ -1,6 +1,7 @@
 package org.dromara.customer.domain.vo;
 
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.customer.domain.ComplaintsSuggestions;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
@@ -15,7 +16,6 @@ import java.io.Serializable;
 import java.util.Date;
 
 
-
 /**
  * 投诉与建议记录视图对象 complaints_suggestions
  *
@@ -42,6 +42,12 @@ public class ComplaintsSuggestionsVo implements Serializable {
     @ExcelProperty(value = "投诉/建议编号")
     private String complainNo;
 
+
+    /**
+     * 企业id
+     */
+    private Long customerId;
+
     /**
      * 用户id
      */
@@ -127,5 +133,11 @@ public class ComplaintsSuggestionsVo implements Serializable {
     @ExcelProperty(value = "备注")
     private String remark;
 
+    private Long createBy;
+
+    private Date createTime;
+
+    private String createName;
+
 
 }

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

@@ -126,6 +126,14 @@ public class CustomerInfoVo implements Serializable {
     @ExcelProperty(value = "网址")
     private String url;
 
+    /*营业执照*/
+    private String businessLicense;
+
+    /**
+     * 法人证件
+     */
+    private String legalPersonCardUrl;
+
     /**
      * 邮政编码
      */

+ 2 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemoteCustomerSalesServiceImpl.java

@@ -27,7 +27,7 @@ public class RemoteCustomerSalesServiceImpl implements RemoteCustomerSalesServic
     @Override
     public RemoteCustomerSalesVo selectCustomerSalesInfoByCustomerId(Long customerId) {
         CustomerSalesInfoVo salesInfoVo = customerSalesInfoService.queryByCustomerId(customerId);
-        return MapstructUtils.convert(salesInfoVo, RemoteCustomerSalesVo.class);
+        return BeanUtil.toBean(salesInfoVo, RemoteCustomerSalesVo.class);
     }
 
     /*更新客户销售信息*/
@@ -42,6 +42,7 @@ public class RemoteCustomerSalesServiceImpl implements RemoteCustomerSalesServic
         }
         salesInfo.setId(vo.getId());
         salesInfo.setRemainingQuota(vo.getRemainingQuota());
+        salesInfo.setTemporaryQuota(vo.getTemporaryQuota());
 
         return customerSalesInfoService.saveOrUpdate(salesInfo);
 

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

@@ -93,6 +93,14 @@ public interface ICustomerInfoService extends IService<CustomerInfo> {
      */
     Boolean updateByBo(CustomerInfoBo bo);
 
+    /**
+     * 修改客户信息
+     *
+     * @param bo 客户信息
+     * @return 是否修改成功
+     */
+    Boolean pcUpdateCustomerInfo(CustomerInfoBo bo);
+
     /**
      * 修改状态
      */

+ 26 - 4
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/ComplaintsSuggestionsServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.customer.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -10,6 +11,9 @@ 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.redis.utils.SequenceUtils;
+import org.dromara.customer.domain.CustomerContact;
+import org.dromara.customer.mapper.CustomerContactMapper;
 import org.springframework.stereotype.Service;
 import org.dromara.customer.domain.bo.ComplaintsSuggestionsBo;
 import org.dromara.customer.domain.vo.ComplaintsSuggestionsVo;
@@ -17,9 +21,12 @@ import org.dromara.customer.domain.ComplaintsSuggestions;
 import org.dromara.customer.mapper.ComplaintsSuggestionsMapper;
 import org.dromara.customer.service.IComplaintsSuggestionsService;
 
+import java.time.Duration;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 投诉与建议记录Service业务层处理
@@ -30,10 +37,14 @@ import java.util.Collection;
 @Slf4j
 @RequiredArgsConstructor
 @Service
-public class ComplaintsSuggestionsServiceImpl  extends ServiceImpl<ComplaintsSuggestionsMapper, ComplaintsSuggestions> implements IComplaintsSuggestionsService {
+public class ComplaintsSuggestionsServiceImpl extends ServiceImpl<ComplaintsSuggestionsMapper, ComplaintsSuggestions> implements IComplaintsSuggestionsService {
+
+    private static final String COMPLAIN_CODE_KEY = "complaints_suggestions:complain_no";
 
     private final ComplaintsSuggestionsMapper baseMapper;
 
+    private final CustomerContactMapper customerContactMapper;
+
     /**
      * 查询投诉与建议记录
      *
@@ -41,7 +52,7 @@ public class ComplaintsSuggestionsServiceImpl  extends ServiceImpl<ComplaintsSug
      * @return 投诉与建议记录
      */
     @Override
-    public ComplaintsSuggestionsVo queryById(Long id){
+    public ComplaintsSuggestionsVo queryById(Long id) {
         return baseMapper.selectVoById(id);
     }
 
@@ -56,6 +67,15 @@ public class ComplaintsSuggestionsServiceImpl  extends ServiceImpl<ComplaintsSug
     public TableDataInfo<ComplaintsSuggestionsVo> queryPageList(ComplaintsSuggestionsBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<ComplaintsSuggestions> lqw = buildQueryWrapper(bo);
         Page<ComplaintsSuggestionsVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<ComplaintsSuggestionsVo> records = result.getRecords();
+        if (CollUtil.isNotEmpty(records)) {
+            Set<Long> createByIds = records.stream().map(ComplaintsSuggestionsVo::getCreateBy).collect(Collectors.toSet());
+            List<CustomerContact> customerContacts = customerContactMapper.selectByIds(createByIds);
+            Map<Long, String> createByMap = customerContacts.stream().collect(Collectors.toMap(CustomerContact::getId, CustomerContact::getContactName));
+            records.forEach(r -> {
+                r.setCreateName(createByMap.get(r.getCreateBy()));
+            });
+        }
         return TableDataInfo.build(result);
     }
 
@@ -77,6 +97,7 @@ public class ComplaintsSuggestionsServiceImpl  extends ServiceImpl<ComplaintsSug
         lqw.orderByAsc(ComplaintsSuggestions::getId);
         lqw.eq(StringUtils.isNotBlank(bo.getComplainNo()), ComplaintsSuggestions::getComplainNo, bo.getComplainNo());
         lqw.eq(bo.getUserId() != null, ComplaintsSuggestions::getUserId, bo.getUserId());
+        lqw.eq(bo.getCustomerId() != null, ComplaintsSuggestions::getCustomerId, bo.getCustomerId());
         lqw.eq(StringUtils.isNotBlank(bo.getUserNo()), ComplaintsSuggestions::getUserNo, bo.getUserNo());
         lqw.like(StringUtils.isNotBlank(bo.getUserName()), ComplaintsSuggestions::getUserName, bo.getUserName());
         lqw.eq(StringUtils.isNotBlank(bo.getPhone()), ComplaintsSuggestions::getPhone, bo.getPhone());
@@ -101,6 +122,7 @@ public class ComplaintsSuggestionsServiceImpl  extends ServiceImpl<ComplaintsSug
      */
     @Override
     public Boolean insertByBo(ComplaintsSuggestionsBo bo) {
+        bo.setComplainNo(SequenceUtils.nextPaddedIdStr(COMPLAIN_CODE_KEY, Duration.ofDays(3650), 4));
         ComplaintsSuggestions add = MapstructUtils.convert(bo, ComplaintsSuggestions.class);
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
@@ -126,7 +148,7 @@ public class ComplaintsSuggestionsServiceImpl  extends ServiceImpl<ComplaintsSug
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(ComplaintsSuggestions entity){
+    private void validEntityBeforeSave(ComplaintsSuggestions entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
@@ -139,7 +161,7 @@ public class ComplaintsSuggestionsServiceImpl  extends ServiceImpl<ComplaintsSug
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteByIds(ids) > 0;

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

@@ -30,7 +30,7 @@ import java.util.Collection;
 @Slf4j
 @RequiredArgsConstructor
 @Service
-public class CustomerContactServiceImpl  extends ServiceImpl<CustomerContactMapper, CustomerContact> implements ICustomerContactService {
+public class CustomerContactServiceImpl extends ServiceImpl<CustomerContactMapper, CustomerContact> implements ICustomerContactService {
 
     private final CustomerContactMapper baseMapper;
 
@@ -41,7 +41,7 @@ public class CustomerContactServiceImpl  extends ServiceImpl<CustomerContactMapp
      * @return 客户联系人信息
      */
     @Override
-    public CustomerContactVo queryById(Long id){
+    public CustomerContactVo queryById(Long id) {
         return baseMapper.selectVoById(id);
     }
 
@@ -56,6 +56,7 @@ public class CustomerContactServiceImpl  extends ServiceImpl<CustomerContactMapp
     public TableDataInfo<CustomerContactVo> queryPageList(CustomerContactBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<CustomerContact> lqw = buildQueryWrapper(bo);
         Page<CustomerContactVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+
         return TableDataInfo.build(result);
     }
 
@@ -126,7 +127,7 @@ public class CustomerContactServiceImpl  extends ServiceImpl<CustomerContactMapp
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(CustomerContact entity){
+    private void validEntityBeforeSave(CustomerContact entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
@@ -139,7 +140,7 @@ public class CustomerContactServiceImpl  extends ServiceImpl<CustomerContactMapp
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteByIds(ids) > 0;

+ 31 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java

@@ -679,6 +679,37 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
         return true;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean pcUpdateCustomerInfo(CustomerInfoBo bo) {
+        if (bo == null || bo.getId() == null || bo.getId() <= 0) {
+            return false;
+        }
+        CustomerInfo customerInfo = baseMapper.selectById(bo.getId());
+        if (customerInfo == null) {
+            return false;
+        }
+        customerInfo.setProvincialCityCounty(bo.getProvincialCityCounty());
+        customerInfo.setRegProvincialNo(bo.getRegProvincialNo());
+        customerInfo.setRegCityNo(bo.getRegCityNo());
+        customerInfo.setRegCountyNo(bo.getRegCountyNo());
+        customerInfo.setAddress(bo.getAddress());
+        customerInfo.setIndustryCategoryId(bo.getIndustryCategoryId());
+        customerInfo.setEnterpriseScaleId(bo.getEnterpriseScaleId());
+        customerInfo.setLandline(bo.getLandline());
+        customerInfo.setFax(bo.getFax());
+        customerInfo.setUrl(bo.getUrl());
+        customerInfo.setBusinessLicense(bo.getBusinessLicense());
+        customerInfo.setLegalPersonCardUrl(bo.getLegalPersonCardUrl());
+
+        validEntityBeforeSave(customerInfo);
+        boolean mainUpdated = baseMapper.updateById(customerInfo) > 0;
+        if (!mainUpdated) {
+            return false;
+        }
+
+        return true;
+    }
+
     /**
      * 保存客户的关联信息
      */

+ 125 - 19
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 lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.enums.OrderSourceEnum;
 import org.dromara.common.core.enums.OrderStatus;
@@ -10,23 +11,30 @@ 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.api.RemoteCustomerService;
+import org.dromara.customer.api.domain.CustomerApiVo;
 import org.dromara.order.domain.bo.OrderMainBo;
+import org.dromara.order.domain.bo.OrderProductBo;
 import org.dromara.order.domain.bo.PcSubmitOrderBo;
+import org.dromara.order.domain.dto.OrderPayDto;
 import org.dromara.order.domain.vo.OrderMainVo;
 import org.dromara.order.domain.vo.OrderProductVo;
 import org.dromara.order.domain.vo.OrderStatusStats;
 import org.dromara.order.service.IOrderMainService;
+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.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import jakarta.validation.constraints.NotNull;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static org.dromara.common.mybatis.core.mapper.BaseMapperPlus.log;
 
@@ -40,9 +48,18 @@ import static org.dromara.common.mybatis.core.mapper.BaseMapperPlus.log;
 @Validated
 @RequiredArgsConstructor
 @RestController
-@RequestMapping("/pc/enterprise/order")
+@RequestMapping("/pcOrder")
 public class PcOrderController extends BaseController {
 
+    @DubboReference
+    private RemoteCustomerService remoteCustomerService;
+
+    @DubboReference
+    private RemoteProductService remoteProductService;
+
+    @DubboReference
+    private RemoteProductShoppingCartService remoteProductShoppingCartService;
+
     private final IOrderMainService orderMainService;
 
     /**
@@ -52,7 +69,7 @@ public class PcOrderController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<OrderMainVo> list(OrderMainBo bo, PageQuery pageQuery) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
         // 强制设置企业ID,防止越权访问
         bo.setCustomerId(customerId);
 
@@ -82,7 +99,7 @@ public class PcOrderController extends BaseController {
 
         // 验证订单是否属于当前用户的企业
         if (vo != null) {
-            Long customerId = LoginHelper.getUserId();
+            Long customerId = LoginHelper.getLoginUser().getCustomerId();
             if (!customerId.equals(vo.getCustomerId())) {
                 return R.fail("无权访问该订单");
             }
@@ -107,7 +124,7 @@ public class PcOrderController extends BaseController {
         }
 
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
 
         // 验证所有订单是否都属于当前用户的企业
         for (Long orderId : orderIds) {
@@ -134,7 +151,7 @@ public class PcOrderController extends BaseController {
     @PutMapping("/cancel")
     public R<Void> cancelOrder(@RequestBody OrderMainBo bo) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
 
         // 验证订单是否属于当前用户的企业
         OrderMainVo existingOrder = orderMainService.queryById(bo.getId());
@@ -147,6 +164,7 @@ public class PcOrderController extends BaseController {
 
         // 强制设置企业ID
         bo.setCustomerId(customerId);
+        bo.setOrderStatuses(OrderStatus.CANCEL.getCode());
 
         return toAjax(orderMainService.updateStatus(bo));
     }
@@ -161,7 +179,7 @@ public class PcOrderController extends BaseController {
     @PutMapping("/checkStatus")
     public R<Void> checkStatus(@RequestBody OrderMainBo bo) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
 
         // 验证订单是否属于当前用户的企业
         OrderMainVo existingOrder = orderMainService.queryById(bo.getId());
@@ -187,31 +205,36 @@ public class PcOrderController extends BaseController {
     public R<Long> submitOrder(@RequestBody @Validated PcSubmitOrderBo bo) {
         try {
             // 获取当前登录用户的企业ID
-            Long customerId = LoginHelper.getUserId();
+            Long userId = LoginHelper.getUserId();
+
+            Long customerId = LoginHelper.getLoginUser().getCustomerId();
+            Map<Long, CustomerApiVo> longCustomerApiVoMap = remoteCustomerService.selectCustomerByIds(Set.of(customerId));
+            CustomerApiVo customerApiVo = longCustomerApiVoMap.get(customerId);
 
             // 构造 OrderMainBo 对象
             OrderMainBo mainBo = new OrderMainBo();
             mainBo.setCustomerId(customerId);
+            mainBo.setUserId(userId);
             mainBo.setShippingAddressId(bo.getShippingAddressId());
             mainBo.setPurchaseReason(bo.getPurchaseReason());
             mainBo.setRemark(bo.getRemark());
+            mainBo.setExpenseType(bo.getExpenseType());
             mainBo.setShippingFee(bo.getShippingFee());
 
+            if (null != customerApiVo) {
+                mainBo.setCompanyId(customerApiVo.getCompanyId());
+                mainBo.setCustomerCode(customerApiVo.getCustomerNo());
+            }
+
             // 解析配送时间
             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
             LocalDate deliveryLocalDate = LocalDate.parse(bo.getDeliveryDate(), formatter);
             Date expectedDeliveryTime = Date.from(deliveryLocalDate.atStartOfDay().toInstant(java.time.ZoneOffset.UTC));
             mainBo.setExpectedDeliveryTime(expectedDeliveryTime);
 
-            // 设置支付方式(假设固定为“信用支付等”)
-            mainBo.setPayType("0");
-
             // 设置仓库(假设默认仓库)
             mainBo.setWarehouseId(1L); // TODO: 后续可配置或根据客户动态获取
 
-            // 设置费用类型(默认0 日常物资采购)
-            mainBo.setExpenseType("0");
-
 
             // 设置订单状态为待审核
             mainBo.setOrderStatus(OrderStatus.PENDING_PAYMENT.getCode());
@@ -222,10 +245,75 @@ public class PcOrderController extends BaseController {
             mainBo.setOrderSource(OrderSourceEnum.BEFORE_ADD.getCode());
 
             // 设置订单商品列表
-            mainBo.setOrderProductBos(bo.getOrderProductBos());
+            // mainBo.setOrderProductBos(bo.getOrderProductBos());
+            // 1. 获取购物车项
+            Set<Long> productShoppingCartIds = bo.getProductShoppingCartId();
+            if (productShoppingCartIds == null || productShoppingCartIds.isEmpty()) {
+                throw new IllegalArgumentException("购物车项ID不能为空");
+            }
 
-            // 调用服务层保存订单
+            List<RemoteProductShoppingCartVo> shoppingCartList = remoteProductShoppingCartService.getShoppingCartList(productShoppingCartIds);
+            if (shoppingCartList.isEmpty()) {
+                throw new IllegalStateException("购物车数据不存在");
+            }
+
+            // 2. 构建 productId -> productNum 映射(防御性:过滤 null key)
+            Map<Long, Long> productNumMap = shoppingCartList.stream()
+                .filter(item -> item.getProductId() != null && item.getProductNum() != null)
+                .collect(Collectors.toMap(
+                    RemoteProductShoppingCartVo::getProductId,
+                    RemoteProductShoppingCartVo::getProductNum,
+                    (existing, replacement) -> existing // 防止重复 key 冲突(理论上不应发生)
+                ));
+
+            // 3. 提取所有商品 ID(使用 List/Collection,而非拼接字符串!)
+            List<Long> productIds = new ArrayList<>(productNumMap.keySet());
+
+
+            // 如果远程服务只接受字符串
+            String productIdStr = productIds.stream().map(String::valueOf).collect(Collectors.joining(","));
+            List<ProductVo> productDetails = remoteProductService.getProductDetails(productIdStr);
+
+            // 4. 构建订单商品列表
+            List<OrderProductBo> orderProductBos = productDetails.stream()
+                .map(productVo -> {
+                    Long productId = productVo.getId();
+                    Long quantity = productNumMap.get(productId);
+                    if (quantity == null) {
+                        // 理论上不会发生,但防御性处理
+                        log.warn("商品 {} 在购物车中无数量信息,跳过");
+                        return null;
+                    }
+
+                    OrderProductBo orderProductBo = new OrderProductBo();
+                    orderProductBo.setProductId(productId);
+                    orderProductBo.setProductNo(productVo.getProductNo());
+                    orderProductBo.setProductName(productVo.getItemName());
+                    orderProductBo.setProductUnitId(Long.valueOf(productVo.getUnitId()));
+                    orderProductBo.setProductUnit(productVo.getUnitName());
+                    orderProductBo.setProductImage(productVo.getProductImageUrl());
+                    orderProductBo.setOrderPrice(productVo.getMarketPrice());
+                    orderProductBo.setOrderQuantity(quantity);
+                    orderProductBo.setSubtotal(productVo.getMarketPrice().multiply(BigDecimal.valueOf(quantity)));
+                    return orderProductBo;
+                })
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+            if (orderProductBos.isEmpty()) {
+                throw new IllegalStateException("无可下单的商品");
+            }
+
+            mainBo.setOrderProductBos(orderProductBos);
+
+            // 5. 保存订单(关键:成功后再删除购物车)
             Long orderId = orderMainService.insertByBo(mainBo);
+            if (orderId != null && orderId > 0) {
+                // 成功下单后,删除对应的购物车项
+                remoteProductShoppingCartService.deleteWithValidByIds(productShoppingCartIds);
+            } else {
+                throw new RuntimeException("订单创建失败");
+            }
 
             return R.ok(orderId); // 正确返回 ID
         } catch (Exception e) {
@@ -233,4 +321,22 @@ public class PcOrderController extends BaseController {
             return R.fail("下单失败:" + e.getMessage());
         }
     }
+
+    /**
+     * 订单支付(PC端下单)
+     */
+    @Log(title = "PC端-订单支付", businessType = BusinessType.UPDATE)
+    @PostMapping("/orderPay")
+    public R<?> orderPay(@RequestBody @Validated OrderPayDto payDto) {
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
+
+        // 调用 Service,返回支付结果
+        Boolean orderPayResult = orderMainService.orderPay(
+            customerId,
+            payDto.getOrderId(),
+            payDto.getPayType()
+        );
+
+        return R.ok(orderPayResult);
+    }
 }

+ 7 - 5
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/pc/PcOrderEvaluationController.java

@@ -11,6 +11,7 @@ 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.order.domain.bo.OrderEvaluationBo;
+import org.dromara.order.domain.bo.OrderReturnBo;
 import org.dromara.order.domain.vo.OrderEvaluationListVo;
 import org.dromara.order.service.IOrderEvaluationService;
 import org.springframework.validation.annotation.Validated;
@@ -25,10 +26,10 @@ public class PcOrderEvaluationController extends BaseController {
     private final IOrderEvaluationService orderEvaluationService;
 
     @GetMapping("/list")
-    public TableDataInfo<OrderEvaluationListVo> getEvaluationList(PageQuery pageQuery) {
+    public TableDataInfo<OrderEvaluationListVo> getEvaluationList(OrderEvaluationBo bo, PageQuery pageQuery) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
-        return orderEvaluationService.getEvaluationOrderList(customerId, pageQuery);
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
+        return orderEvaluationService.getEvaluationOrderList(customerId, bo.getEvaluationStatus(), pageQuery);
     }
 
     /**
@@ -39,10 +40,11 @@ public class PcOrderEvaluationController extends BaseController {
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody OrderEvaluationBo bo) {
         // 获取当前登录用户的企业ID
-        Long customerId = LoginHelper.getUserId();
-        LoginHelper.getLoginUser().getCustomerId();
+        Long userId = LoginHelper.getUserId();
+        Long customerId = LoginHelper.getLoginUser().getCustomerId();
         // 强制设置企业ID,防止为其他企业创建售后申请
         bo.setCustomerId(customerId);
+        bo.setUserId(userId);
 
         return toAjax(orderEvaluationService.insertByBo(bo));
     }

+ 2 - 2
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/pc/PcOrderReturnController.java

@@ -24,7 +24,7 @@ import java.util.List;
 
 /**
  * PC端 - 售后服务管理
- * 前端访问路由地址为:/pc/enterprise/orderReturn
+ * 前端访问路由地址为:/pcOrder/orderReturn
  *
  * @author Claude
  * @date 2026-01-29
@@ -32,7 +32,7 @@ import java.util.List;
 @Validated
 @RequiredArgsConstructor
 @RestController
-@RequestMapping("/pc/enterprise/orderReturn")
+@RequestMapping("/pcOrder/orderReturn")
 public class PcOrderReturnController extends BaseController {
 
     private final IOrderReturnService orderReturnService;

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

@@ -67,6 +67,11 @@ public class OrderEvaluation extends TenantEntity {
      */
     private String customerNo;
 
+    private Long userId;
+
+    /*评价内容*/
+    private String content;
+
     /**
      * 删除标志(0代表存在 2代表删除)
      */

+ 7 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderEvaluationBo.java

@@ -65,10 +65,17 @@ public class OrderEvaluationBo extends BaseEntity {
      */
     private String customerNo;
 
+    private Long userId;
+
+    /*评价内容*/
+    private String content;
+
     /**
      * 备注
      */
     private String remark;
 
+    private String evaluationStatus;
+
 
 }

+ 10 - 5
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/PcSubmitOrderBo.java

@@ -1,11 +1,10 @@
 package org.dromara.order.domain.bo;
 
-import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
 import java.math.BigDecimal;
-import java.util.List;
+import java.util.Set;
 
 @Data
 public class PcSubmitOrderBo {
@@ -22,6 +21,13 @@ public class PcSubmitOrderBo {
 //    @NotBlank(message = "配送时间不能为空")
     private String deliveryDate; // 前端传字符串,后端转为 Date
 
+
+    /*支付方式*/
+    private String payType;
+
+    /*费用类型*/
+    private String expenseType;
+
     /**
      * 采购事由
      */
@@ -39,8 +45,7 @@ public class PcSubmitOrderBo {
     private BigDecimal shippingFee;
 
     /**
-     * 商品明细列表
+     * 购物车项id
      */
-//    @NotNull(message = "商品明细不能为空")
-    private List<OrderProductBo> orderProductBos;
+    private Set<Long> productShoppingCartId;
 }

+ 2 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderEvaluationListVo.java

@@ -19,6 +19,8 @@ public class OrderEvaluationListVo implements Serializable {
 
     private BigDecimal totalAmount;   // 订单总金额
 
+    private String orderStatus;
+
     private String evaluationStatus; // 待评价 / 待追评 / 已评价
 
     private List<OrderProductBriefVo> productList;

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

@@ -85,6 +85,11 @@ public class OrderEvaluationVo implements Serializable {
     @ExcelProperty(value = "客户编号")
     private String customerNo;
 
+    private Long userId;
+
+    /*评价内容*/
+    private String content;
+
     /**
      * 备注
      */

+ 1 - 1
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderMainMapper.java

@@ -23,6 +23,6 @@ public interface OrderMainMapper extends BaseMapperPlus<OrderMain, OrderMainVo>
     /**
      * 查询客户的所有已完成订单(主信息 + 评价状态)
      */
-    IPage<OrderEvaluationListVo> selectEvaluationMainListPage(IPage<?> page, @Param("customerId") Long customerId);
+    IPage<OrderEvaluationListVo> selectEvaluationMainListPage(IPage<?> page, @Param("customerId") Long customerId, @Param("evaluationStatus") String evaluationStatus);
 
 }

+ 1 - 1
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderEvaluationService.java

@@ -27,7 +27,7 @@ public interface IOrderEvaluationService extends IService<OrderEvaluation> {
      */
     OrderEvaluationVo queryById(Long id);
 
-    TableDataInfo<OrderEvaluationListVo> getEvaluationOrderList(Long customerId, PageQuery pageQuery);
+    TableDataInfo<OrderEvaluationListVo> getEvaluationOrderList(Long customerId, String evaluationStatus, PageQuery pageQuery);
 
     /**
      * 分页查询订单评价列表

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

@@ -58,9 +58,9 @@ public class OrderEvaluationServiceImpl extends ServiceImpl<OrderEvaluationMappe
     }
 
     @Override
-    public TableDataInfo<OrderEvaluationListVo> getEvaluationOrderList(Long customerId, PageQuery pageQuery) {
+    public TableDataInfo<OrderEvaluationListVo> getEvaluationOrderList(Long customerId, String evaluationStatus, PageQuery pageQuery) {
         // 1. 分页查询主订单(含评价状态)
-        IPage<OrderEvaluationListVo> page = orderMainMapper.selectEvaluationMainListPage(pageQuery.build(), customerId);
+        IPage<OrderEvaluationListVo> page = orderMainMapper.selectEvaluationMainListPage(pageQuery.build(), customerId, evaluationStatus);
         List<OrderEvaluationListVo> orders = page.getRecords();
 
         if (!orders.isEmpty()) {

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

@@ -540,7 +540,13 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
         if (!updated) {
             throw new RuntimeException("信用额度更新失败,请重试");
         }
-
+        OrderMain order = new OrderMain();
+        order.setId(orderId);
+        order.setOrderStatus(OrderStatus.PENDING_CONFIRMATION.getCode());
+        Boolean result = baseMapper.updateById(order) > 0;
+        if (!result) {
+            throw new RuntimeException("订单支付失败");
+        }
         return true;
     }
 

+ 29 - 15
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMainMapper.xml

@@ -16,22 +16,36 @@
     </select>
 
     <select id="selectEvaluationMainListPage" resultType="org.dromara.order.domain.vo.OrderEvaluationListVo">
-        SELECT o.id           AS orderId,
-               o.order_no     AS orderNo,
-               o.order_time   AS orderTime,
-               o.total_amount AS totalAmount,
-               CASE
-                   WHEN oe.max_type IS NULL THEN '待评价'
-                   WHEN oe.max_type = 1 THEN '待追评'
-                   WHEN oe.max_type = 2 THEN '已评价'
-                   END        AS evaluationStatus
+        SELECT
+        o.id AS orderId,
+        o.order_no AS orderNo,
+        o.order_time AS orderTime,
+        o.total_amount AS totalAmount,
+        o.order_status as orderStatus,
+        CASE
+        WHEN oe.max_type IS NULL THEN '0'
+        WHEN oe.max_type = 1 THEN '1'
+        WHEN oe.max_type = 2 THEN '2'
+        END AS evaluationStatus
         FROM order_main o
-                 LEFT JOIN (SELECT order_id, MAX(evaluation_type) AS max_type
-                            FROM order_evaluation
-                            GROUP BY order_id) oe ON o.id = oe.order_id
-        WHERE o.customer_id = #{customerId}
-          AND o.order_status = '5'
-          AND o.del_flag = '0'
+        LEFT JOIN (
+        SELECT order_id, MAX(evaluation_type) AS max_type
+        FROM order_evaluation
+        GROUP BY order_id
+        ) oe ON o.id = oe.order_id
+        WHERE
+        o.customer_id = #{customerId}
+        AND o.order_status = '5'
+        AND o.del_flag = '0'
+        <if test="evaluationStatus != null and evaluationStatus == '0'">
+            AND oe.max_type IS NULL
+        </if>
+        <if test="evaluationStatus != null and evaluationStatus == '1'">
+            AND oe.max_type = 1
+        </if>
+        <if test="evaluationStatus != null and evaluationStatus == '2'">
+            AND oe.max_type = 2
+        </if>
         ORDER BY o.order_time DESC
     </select>
 </mapper>

+ 2 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteProductShoppingCartServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.product.dubbo;
 
+import cn.hutool.core.bean.BeanUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
@@ -47,7 +48,7 @@ public class RemoteProductShoppingCartServiceImpl implements RemoteProductShoppi
     @Override
     public List<RemoteProductShoppingCartVo> getShoppingCartList(Set<Long> cartIds) {
         List<ProductShoppingCart> productShoppingCarts = productShoppingCartService.listByIds(cartIds);
-        return MapstructUtils.convert(productShoppingCarts, RemoteProductShoppingCartVo.class);
+        return BeanUtil.copyToList(productShoppingCarts, RemoteProductShoppingCartVo.class);
     }
 
     @Override

+ 71 - 69
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java

@@ -46,6 +46,7 @@ import java.util.*;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.core.type.TypeReference;
+
 import java.math.BigDecimal;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -54,33 +55,33 @@ import java.util.stream.Collectors;
 
 /**
  * 产品基础信息Service业务层处理
- *
+ * <p>
  * 性能优化说明(针对200万级别数据量):
  * 1. 启动时ES同步使用分页流式处理,每次只加载1000条数据
  * 2. 提供流式查询API(selectAllListStream)避免OOM
  * 3. 单条查询优化,建议添加缓存
  * 4. 批量删除优化,减少数据库交互
- *
+ * <p>
  * 数据库索引建议(必须添加):
  * product_base表:
- *   - idx_product_no: product_no (产品编号,唯一索引)
- *   - idx_brand_id: brand_id (品牌ID)
- *   - idx_category: top_category_id, medium_category_id, bottom_category_id (组合索引)
- *   - idx_status: product_status, product_review_status (状态组合索引)
- *   - idx_create_time: create_time (创建时间)
- *
+ * - idx_product_no: product_no (产品编号,唯一索引)
+ * - idx_brand_id: brand_id (品牌ID)
+ * - idx_category: top_category_id, medium_category_id, bottom_category_id (组合索引)
+ * - idx_status: product_status, product_review_status (状态组合索引)
+ * - idx_create_time: create_time (创建时间)
+ * <p>
  * product_extend表:
- *   - idx_product_id: product_id (外键索引)
- *
+ * - idx_product_id: product_id (外键索引)
+ * <p>
  * product_price_inventory表:
- *   - PRIMARY KEY: product_id (主键)
- *
+ * - PRIMARY KEY: product_id (主键)
+ * <p>
  * product_classification表:
- *   - idx_product_id: product_id (外键索引)
- *   - idx_category_id: category_id (分类索引)
- *
+ * - idx_product_id: product_id (外键索引)
+ * - idx_category_id: category_id (分类索引)
+ * <p>
  * product_customization表:
- *   - idx_product_id: product_id (外键索引)
+ * - idx_product_id: product_id (外键索引)
  *
  * @author LionLi
  * @date 2025-12-11
@@ -88,7 +89,7 @@ import java.util.stream.Collectors;
 @Slf4j
 @RequiredArgsConstructor
 @Service
-public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, ProductBase> implements IProductBaseService,ApplicationRunner {
+public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, ProductBase> implements IProductBaseService, ApplicationRunner {
 
     //产品基础信息Mapper
     private final ProductBaseMapper baseMapper;
@@ -213,7 +214,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
      * 1. 使用联表查询减少数据库交互次数(建议在Mapper中实现)
      * 2. 对于高频访问场景,建议添加缓存(Redis)
      * 3. 已优化为单次主查询+关联查询,避免N+1问题
-     *
+     * <p>
      * TODO: 性能优化建议
      * - 将分类、品牌、单位等字典数据缓存到Redis
      * - 考虑使用@Cacheable注解实现方法级缓存
@@ -223,7 +224,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
      * @return 产品基础信息
      */
     @Override
-    public ProductBaseVo queryById(Long id){
+    public ProductBaseVo queryById(Long id) {
         // 1. 查询基础信息
         ProductBaseVo vo = baseMapper.selectVoById(id);
         if (vo == null) {
@@ -232,17 +233,17 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
 
         //获取分类信息
         ProductCategory productCategory = categoryMapper.selectById(vo.getBottomCategoryId());
-        if (ObjectUtil.isNotEmpty(productCategory)){
+        if (ObjectUtil.isNotEmpty(productCategory)) {
             vo.setCategoryName(productCategory.getCategoryName());
         }
         //获取品牌信息
         ProductBrand productBrand = brandMapper.selectById(vo.getBrandId());
-        if (ObjectUtil.isNotEmpty(productBrand)){
+        if (ObjectUtil.isNotEmpty(productBrand)) {
             vo.setBrandName(productBrand.getBrandName());
         }
         //获取单位信息
         ProductUnit productUnit = unitMapper.selectById(vo.getUnitId());
-        if (ObjectUtil.isNotEmpty(productUnit)){
+        if (ObjectUtil.isNotEmpty(productUnit)) {
             vo.setUnitName(productUnit.getUnitName());
         }
         // 2. 查询并填充扩展信息(product_extend表)
@@ -324,10 +325,10 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
             }
         }
         //获取详情
-        LambdaQueryWrapper<ProductPhotos>  photosWrapper= Wrappers.lambdaQuery();
+        LambdaQueryWrapper<ProductPhotos> photosWrapper = Wrappers.lambdaQuery();
         photosWrapper.eq(ProductPhotos::getProductId, id);
         ProductPhotos productPhotos = photosMapper.selectOne(photosWrapper);
-        if(ObjectUtil.isNotEmpty(productPhotos)){
+        if (ObjectUtil.isNotEmpty(productPhotos)) {
             vo.setPcDetail(productPhotos.getProductDetailsPc());
             vo.setMobileDetail(productPhotos.getProductDetailsApp());
         }
@@ -345,18 +346,18 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
     @Override
     public TableDataInfo<ProductBaseVo> queryPageList(ProductBaseBo bo, PageQuery pageQuery) {
         QueryWrapper<ProductBase> lqw = Wrappers.query();
-        if(ObjectUtil.isNotEmpty(bo.getIds())){
-            lqw.in( "b.id", bo.getIds().split(","));
+        if (ObjectUtil.isNotEmpty(bo.getIds())) {
+            lqw.in("b.id", bo.getIds().split(","));
         }
-        lqw.ge(ObjectUtil.isNotEmpty(pageQuery.getFirstSeenId()) && pageQuery.getWay() == 0,"b.id", pageQuery.getFirstSeenId());
-        lqw.gt(ObjectUtil.isNotEmpty(pageQuery.getLastSeenId()) && pageQuery.getWay() == 1,"b.id", pageQuery.getLastSeenId());
-        lqw.eq(ObjectUtil.isNotEmpty(bo.getBottomCategoryId()),"b.bottom_category_id", bo.getBottomCategoryId());
+        lqw.ge(ObjectUtil.isNotEmpty(pageQuery.getFirstSeenId()) && pageQuery.getWay() == 0, "b.id", pageQuery.getFirstSeenId());
+        lqw.gt(ObjectUtil.isNotEmpty(pageQuery.getLastSeenId()) && pageQuery.getWay() == 1, "b.id", pageQuery.getLastSeenId());
+        lqw.eq(ObjectUtil.isNotEmpty(bo.getBottomCategoryId()), "b.bottom_category_id", bo.getBottomCategoryId());
         lqw.eq(ObjectUtil.isNotEmpty(bo.getProductStatus()), "b.product_status", bo.getProductStatus());
-        lqw.eq(ObjectUtil.isNotEmpty(bo.getProductReviewStatus()),"b.product_review_status", bo.getProductReviewStatus());
-        lqw.eq(ObjectUtil.isNotEmpty(bo.getDataSource()),"b.data_source", bo.getDataSource());
-        lqw.eq(ObjectUtil.isNotEmpty(bo.getIsSelf()),"b.is_self", bo.getIsSelf());
-        lqw.eq(ObjectUtil.isNotEmpty(bo.getProductNo()),"b.product_no", bo.getProductNo());
-        lqw.like(ObjectUtil.isNotEmpty(bo.getBrandName()),"br.brand_name", bo.getBrandName());
+        lqw.eq(ObjectUtil.isNotEmpty(bo.getProductReviewStatus()), "b.product_review_status", bo.getProductReviewStatus());
+        lqw.eq(ObjectUtil.isNotEmpty(bo.getDataSource()), "b.data_source", bo.getDataSource());
+        lqw.eq(ObjectUtil.isNotEmpty(bo.getIsSelf()), "b.is_self", bo.getIsSelf());
+        lqw.eq(ObjectUtil.isNotEmpty(bo.getProductNo()), "b.product_no", bo.getProductNo());
+        lqw.like(ObjectUtil.isNotEmpty(bo.getBrandName()), "br.brand_name", bo.getBrandName());
         // 支持分类名称模糊搜索(匹配三级分类中的任意一个)
         if (ObjectUtil.isNotEmpty(bo.getCategoryName())) {
             lqw.and(wrapper -> wrapper
@@ -367,7 +368,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
         }
         lqw.orderByAsc("b.id");
         int limit = pageQuery.getPageSize() + 1;
-        lqw.last("limit "+ limit );
+        lqw.last("limit " + limit);
         List<ProductBaseVo> result = baseMapper.selectAllList(lqw);
 //        result.forEach(vo -> {
 //
@@ -377,7 +378,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
             result.remove(result.size() - 1);
         }
         TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(result);
-        tableDataInfo.setTotal( size);
+        tableDataInfo.setTotal(size);
         return tableDataInfo;
     }
 
@@ -392,6 +393,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
         LambdaQueryWrapper<ProductBase> lqw = buildQueryWrapper(bo);
         return baseMapper.selectVoList(lqw);
     }
+
     private LambdaEsQueryWrapper<ProductBaseVo> buildEsQueryWrapper(ProductBaseBo bo) {
         return new LambdaEsQueryWrapper<ProductBaseVo>()
             .eq(ObjectUtil.isNotEmpty(bo.getProductNo()), ProductBaseVo::getProductNo, bo.getProductNo())
@@ -486,7 +488,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
     }
 
     private void saveProductDetail(ProductBaseBo bo, Long productId) {
-        ProductPhotos productPhotos= new ProductPhotos();
+        ProductPhotos productPhotos = new ProductPhotos();
         productPhotos.setProductId(productId);
         productPhotos.setProductDetailsPc(bo.getPcDetail());
         productPhotos.setProductDetailsApp(bo.getMobileDetail());
@@ -547,7 +549,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
     }
 
     private void updateProductDetail(ProductBaseBo bo, Long productId) {
-        ProductPhotos productPhotos= new ProductPhotos();
+        ProductPhotos productPhotos = new ProductPhotos();
         productPhotos.setProductId(productId);
         productPhotos.setProductDetailsPc(bo.getPcDetail());
         productPhotos.setProductDetailsApp(bo.getMobileDetail());
@@ -735,7 +737,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(ProductBase entity){
+    private void validEntityBeforeSave(ProductBase entity) {
         // 校验产品编号唯一性(新增时)
         if (entity.getId() == null && ObjectUtil.isNotEmpty(entity.getProductNo())) {
             LambdaQueryWrapper<ProductBase> wrapper = Wrappers.lambdaQuery();
@@ -785,7 +787,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             // 校验是否有关联的订单或其他业务数据
             // 性能优化:批量查询替代循环查询
             List<ProductBase> products = baseMapper.selectBatchIds(ids);
@@ -992,9 +994,9 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
     public ProductBaseVo updateProductShelfState(Long productId) {
         ProductBaseVo productBase = baseMapper.selectVoById(productId);
 
-        if(productBase.getProductStatus().equals(1)){
+        if (productBase.getProductStatus().equals(1)) {
             productBase.setProductStatus(0);
-        }else{
+        } else {
             productBase.setProductStatus(1);
         }
         baseMapper.update(Wrappers.lambdaUpdate(ProductBase.class)
@@ -1065,8 +1067,8 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
     }
 
     /**
-    * 商品审核
-    * */
+     * 商品审核
+     */
     @Override
     public void review(ProductBaseBo bo) {
         baseMapper.update(Wrappers.lambdaUpdate(ProductBase.class)
@@ -1103,7 +1105,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
      */
     @Override
     public void changeProductType(ProductBaseBo bo) {
-        if( ObjectUtil.isEmpty(bo.getProductCategory())){
+        if (ObjectUtil.isEmpty(bo.getProductCategory())) {
             return;
         }
         baseMapper.update(Wrappers.lambdaUpdate(ProductBase.class)
@@ -1203,16 +1205,16 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
     @Override
     public TableDataInfo<PcProductVo> getPcProductPage(PcProductBo bo, PageQuery pageQuery) {
         QueryWrapper<ProductBase> lqw = Wrappers.query(ProductBase.class);
-        lqw.ge(ObjectUtil.isNotEmpty(pageQuery.getFirstSeenId()) && pageQuery.getWay() == 0,"b.id", pageQuery.getFirstSeenId());
-        lqw.gt(ObjectUtil.isNotEmpty(pageQuery.getLastSeenId()) && pageQuery.getWay() == 1,"b.id", pageQuery.getLastSeenId());
+        lqw.ge(ObjectUtil.isNotEmpty(pageQuery.getFirstSeenId()) && pageQuery.getWay() == 0, "b.id", pageQuery.getFirstSeenId());
+        lqw.gt(ObjectUtil.isNotEmpty(pageQuery.getLastSeenId()) && pageQuery.getWay() == 1, "b.id", pageQuery.getLastSeenId());
         lqw.eq("b.product_status", 1);
         lqw.and(ObjectUtil.isNotEmpty(bo.getSearchKeyword())
             , (queryWrapper) -> queryWrapper.and(qw ->
                 qw.like("b.item_name", bo.getSearchKeyword())
-                .or().like("tc.category_name", bo.getSearchKeyword())
-                .or().like("mc.category_name", bo.getSearchKeyword())
-                .or().like("bc.category_name", bo.getSearchKeyword())
-                .or().like("br.brand_name", bo.getSearchKeyword())
+                    .or().like("tc.category_name", bo.getSearchKeyword())
+                    .or().like("mc.category_name", bo.getSearchKeyword())
+                    .or().like("bc.category_name", bo.getSearchKeyword())
+                    .or().like("br.brand_name", bo.getSearchKeyword())
             )
         );
         lqw.eq(ObjectUtil.isNotEmpty(bo.getBrandId()), "b.brand_id", bo.getBrandId());
@@ -1220,7 +1222,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
         lqw.eq(ObjectUtil.isNotEmpty(bo.getMiddleCategoryId()), "b.middle_category_id", bo.getMiddleCategoryId());
         lqw.eq(ObjectUtil.isNotEmpty(bo.getBottomCategoryId()), "b.bottom_category_id", bo.getBottomCategoryId());
         lqw.eq(ObjectUtil.isNotEmpty(bo.getIsCustomize()), "e.is_customize", bo.getIsCustomize());
-        if(bo.getPriceRange() != null){
+        if (bo.getPriceRange() != null) {
             //价格区间 1:1-100 2:100-500 3:500-1000 4:1000以上
             switch (bo.getPriceRange()) {
                 case "1":
@@ -1233,23 +1235,23 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
                     lqw.ge("b.market_price", 1000);
             }
         }
-        if(bo.getSortField() != null && bo.getSortOrder() != null){
+        if (bo.getSortField() != null && bo.getSortOrder() != null) {
             String[] sortFields = bo.getSortField().split(",");
             String[] sortOrders = bo.getSortOrder().split(",");
             for (int i = 0; i < sortFields.length; i++) {
                 switch (sortFields[i]) {
                     case "1":
-                        lqw.orderBy( true, sortOrders[i].equals("Asc"),"b.id");
+                        lqw.orderBy(true, sortOrders[i].equals("Asc"), "b.id");
                     case "2":
-                        lqw.orderBy( true, sortOrders[i].equals("Asc"),"p.total_inventory");
+                        lqw.orderBy(true, sortOrders[i].equals("Asc"), "p.total_inventory");
                     case "3":
-                        lqw.orderBy( true, sortOrders[i].equals("Asc"),"p.market_price");
+                        lqw.orderBy(true, sortOrders[i].equals("Asc"), "p.market_price");
                 }
             }
         }
-        lqw.select("b.id","b.product_image","p.market_price","p.member_price","p.min_selling_price","p.min_order_quantity","b.item_name","u.unit_name");
+        lqw.select("b.id", "b.product_image", "p.market_price", "p.member_price", "p.min_selling_price", "p.min_order_quantity", "b.item_name", "u.unit_name");
         int limit = pageQuery.getPageSize() + 1;
-        lqw.last("limit "+ limit );
+        lqw.last("limit " + limit);
         List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
         if (CollUtil.isNotEmpty(productBaseVos)) {
             List<PcProductVo> pcProductVos = BeanUtil.copyToList(productBaseVos, PcProductVo.class);
@@ -1281,7 +1283,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
             lqw.in("b.id", productIds);
             lqw.eq("b.product_status", 1);
             int limit = pageQuery.getPageSize() + 1;
-            lqw.last("limit "+ limit );
+            lqw.last("limit " + limit);
             List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
             if (CollUtil.isNotEmpty(productBaseVos)) {
                 List<PcProductVo> pcProductVos = BeanUtil.copyToList(productBaseVos, PcProductVo.class);
@@ -1318,7 +1320,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
             lqw.in("b.id", productIds);
             lqw.eq("b.product_status", 1);
             int limit = pageQuery.getPageSize() + 1;
-            lqw.last("limit "+ limit );
+            lqw.last("limit " + limit);
             List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
             if (CollUtil.isNotEmpty(productBaseVos)) {
                 List<PcProductVo> pcProductVos = BeanUtil.copyToList(productBaseVos, PcProductVo.class);
@@ -1330,7 +1332,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
                     pcProductVos.remove(pcProductVos.size() - 1);
                 }
                 TableDataInfo<PcProductVo> tableDataInfo = TableDataInfo.build(pcProductVos);
-                tableDataInfo.setTotal( size);
+                tableDataInfo.setTotal(size);
                 return tableDataInfo;
             }
         }
@@ -1346,16 +1348,16 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
     public TableDataInfo<PcProductVo> getCategoryRecommendProductPage(Long categoryId, PageQuery pageQuery) {
         //获取推荐的商品id
         List<ProductCategoryRecommendedLinkVo> productCategoryRecommendedLinkVos = productCategoryRecommendedLinkMapper.selectVoList(
-                Wrappers.lambdaQuery(ProductCategoryRecommendedLink.class)
-                    .eq(ProductCategoryRecommendedLink::getCategoryId, categoryId)
-            );
+            Wrappers.lambdaQuery(ProductCategoryRecommendedLink.class)
+                .eq(ProductCategoryRecommendedLink::getCategoryId, categoryId)
+        );
         if (CollUtil.isNotEmpty(productCategoryRecommendedLinkVos)) {
             List<Long> productIds = productCategoryRecommendedLinkVos.stream().map(ProductCategoryRecommendedLinkVo::getProductId).toList();
             QueryWrapper<ProductBase> lqw = Wrappers.query(ProductBase.class);
             lqw.in("b.id", productIds);
             lqw.eq("b.product_status", 1);
             int limit = pageQuery.getPageSize() + 1;
-            lqw.last("limit "+ limit );
+            lqw.last("limit " + limit);
             List<ProductBaseVo> productBaseVos = baseMapper.selectAllList(lqw);
             if (CollUtil.isNotEmpty(productBaseVos)) {
                 List<PcProductVo> pcProductVos = BeanUtil.copyToList(productBaseVos, PcProductVo.class);
@@ -1372,12 +1374,12 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
      * @param pageQuery
      */
     @Override
-    public TableDataInfo<PcProductVo> getProductShoppingCartPage(String id,Long userId, PageQuery pageQuery) {
+    public TableDataInfo<PcProductVo> getProductShoppingCartPage(String id, Long userId, PageQuery pageQuery) {
         LambdaQueryWrapper<ProductShoppingCart> lqw = Wrappers.lambdaQuery(ProductShoppingCart.class);
         lqw.eq(ProductShoppingCart::getUserId, userId);
-            if (ObjectUtil.isNotEmpty(id)) {
-                lqw.eq(ProductShoppingCart::getId, id.split(","));
-            }
+        if (ObjectUtil.isNotEmpty(id)) {
+            lqw.in(ProductShoppingCart::getId, id.split(","));
+        }
         Page<ProductShoppingCart> productShoppingCartPage = productShoppingCartMapper.selectPage(pageQuery.build(), lqw);
         if (CollUtil.isNotEmpty(productShoppingCartPage.getRecords())) {
             List<PcProductVo> productVos = new ArrayList<>();

+ 28 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/pc/PcComBankController.java

@@ -0,0 +1,28 @@
+package org.dromara.system.controller.pc;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.domain.bo.ComBankBo;
+import org.dromara.system.domain.vo.ComBankVo;
+import org.dromara.system.service.IComBankService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/pcBank")
+public class PcComBankController extends BaseController {
+
+    private final IComBankService comBankService;
+
+
+    @GetMapping("/list")
+    public TableDataInfo<ComBankVo> list(PageQuery pageQuery) {
+        return comBankService.queryPageList(new ComBankBo(), pageQuery);
+    }
+}

+ 11 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/pc/PcComStaffController.java

@@ -1,9 +1,16 @@
 package org.dromara.system.controller.pc;
 
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.web.core.BaseController;
+import org.dromara.system.domain.bo.ComBankBo;
+import org.dromara.system.domain.bo.ComStaffBo;
+import org.dromara.system.domain.vo.ComBankVo;
+import org.dromara.system.domain.vo.ComStaffVo;
 import org.dromara.system.service.IComStaffService;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -15,5 +22,8 @@ public class PcComStaffController extends BaseController {
 
     private final IComStaffService comStaffService;
 
-
+    @GetMapping("/list")
+    public TableDataInfo<ComStaffVo> list(ComStaffBo bo, PageQuery pageQuery) {
+        return comStaffService.queryPageList(bo, pageQuery);
+    }
 }

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ComStaffVo.java

@@ -127,5 +127,7 @@ public class ComStaffVo implements Serializable {
 
     private String postName;
 
+    private String roleName;
+
 
 }

+ 19 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ComStaffServiceImpl.java

@@ -38,6 +38,8 @@ public class ComStaffServiceImpl extends ServiceImpl<ComStaffMapper, ComStaff> i
 
     private final SysPostMapper sysPostMapper;
 
+    private final SysRoleMapper sysRoleMapper;
+
     /**
      * 查询人员信息
      *
@@ -70,9 +72,15 @@ public class ComStaffServiceImpl extends ServiceImpl<ComStaffMapper, ComStaff> i
             Map<Long, String> postMap = sysPostMapper.selectList(new LambdaQueryWrapper<SysPost>()
                     .select(SysPost::getPostId, SysPost::getPostName).in(SysPost::getPostId, postIds)).stream()
                 .collect(Collectors.toMap(SysPost::getPostId, SysPost::getPostName));
+            Set<Long> roleIds = records.stream().map(ComStaffVo::getRoleId).filter(Objects::nonNull).collect(Collectors.toSet());
+            Map<Long, String> roleMap = sysRoleMapper.selectList(new LambdaQueryWrapper<SysRole>().select(SysRole::getRoleId, SysRole::getRoleName).in(SysRole::getRoleId, roleIds)).stream()
+                .collect(Collectors.toMap(SysRole::getRoleId, SysRole::getRoleName));
+
+
             records.forEach(item -> {
                 item.setDeptName(deptMap.get(item.getDeptId()));
                 item.setPostName(postMap.get(item.getPostId()));
+                item.setRoleName(roleMap.get(item.getRoleId()));
             });
         }
         return TableDataInfo.build(result);
@@ -122,12 +130,21 @@ public class ComStaffServiceImpl extends ServiceImpl<ComStaffMapper, ComStaff> i
                         .select(SysPost::getPostId, SysPost::getPostName).in(SysPost::getPostId, postIds)).stream()
                     .collect(Collectors.toMap(SysPost::getPostId, SysPost::getPostName));
             }
+            Set<Long> roleIds = records.stream().map(ComStaffVo::getRoleId).filter(Objects::nonNull).collect(Collectors.toSet());
+            Map<Long, String> roleMap = new HashMap<>();
+            if (CollUtil.isNotEmpty(roleIds)) {
+                roleMap = sysRoleMapper.selectList(new LambdaQueryWrapper<SysRole>().select(SysRole::getRoleId, SysRole::getRoleName).in(SysRole::getRoleId, roleIds)).stream()
+                    .collect(Collectors.toMap(SysRole::getRoleId, SysRole::getRoleName));
+
+            }
 
             Map<Long, String> finalDeptMap = deptMap;
             Map<Long, String> finalPostMap = postMap;
+            Map<Long, String> finalRoleMap = roleMap;
             records.forEach(item -> {
                 item.setDeptName(finalDeptMap.get(item.getDeptId()));
                 item.setPostName(finalPostMap.get(item.getPostId()));
+                item.setRoleName(finalRoleMap.get(item.getRoleId()));
             });
         }
 
@@ -247,10 +264,10 @@ public class ComStaffServiceImpl extends ServiceImpl<ComStaffMapper, ComStaff> i
     }
 
     @Override
-    public Map<String,String> selectStaffNameAndCode() {
+    public Map<String, String> selectStaffNameAndCode() {
 
         List<ComStaff> staffList = baseMapper.selectList();
-        Map<String,String> resultMap = new HashMap<>();
+        Map<String, String> resultMap = new HashMap<>();
         staffList.stream()
             .filter(staff -> staff.getStaffId() != null && staff.getStaffName() != null)
             .forEach(staff -> resultMap.put(staff.getStaffCode(), staff.getStaffName()));

+ 2 - 1
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/FlowCategory.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.dromara.common.tenant.core.TenantEntity;
+import org.dromara.common.tenant.core.TenantEntityWithoutPlatformCode;
 
 import java.io.Serial;
 import java.util.ArrayList;
@@ -21,7 +22,7 @@ import java.util.List;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("flow_category")
-public class FlowCategory extends TenantEntity {
+public class FlowCategory extends TenantEntityWithoutPlatformCode {
 
     @Serial
     private static final long serialVersionUID = 1L;

+ 2 - 1
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/TestLeave.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.mybatis.core.domain.BaseEntityWithoutPlatform;
 
 import java.io.Serial;
 import java.util.Date;
@@ -18,7 +19,7 @@ import java.util.Date;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("test_leave")
-public class TestLeave extends BaseEntity {
+public class TestLeave extends BaseEntityWithoutPlatform {
 
     @Serial
     private static final long serialVersionUID = 1L;

+ 2 - 1
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java

@@ -13,6 +13,7 @@ import org.dromara.common.core.enums.BusinessStatusEnum;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.mybatis.core.domain.BaseEntityWithoutPlatform;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.tenant.helper.TenantHelper;
@@ -93,7 +94,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
         lqw.eq(StringUtils.isNotBlank(bo.getLeaveType()), TestLeave::getLeaveType, bo.getLeaveType());
         lqw.ge(bo.getStartLeaveDays() != null, TestLeave::getLeaveDays, bo.getStartLeaveDays());
         lqw.le(bo.getEndLeaveDays() != null, TestLeave::getLeaveDays, bo.getEndLeaveDays());
-        lqw.orderByDesc(BaseEntity::getCreateTime);
+        lqw.orderByDesc(BaseEntityWithoutPlatform::getCreateTime);
         return lqw;
     }