Эх сурвалжийг харах

feat(system): 添加物流公司和仓库信息管理功能

- 新增物流公司实体、业务对象、控制器、服务和映射器
- 新增仓库信息实体、业务对象、控制器、服务和映射器
- 实现物流公司的增删改查和状态修改功能
- 实现仓库信息的增删改查功能
- 添加物流公司和仓库信息的导出功能
- 更新数据权限范围配置,添加新的数据表前缀
- 优化客户销售信息查询,补充员工和部门名称显示
- 修复公司信息插入时的空行问题
- 移除部分接口的权限检查注解
- 添加订单编号生成工具方法
hurx 3 сар өмнө
parent
commit
1acce83ca8
43 өөрчлөгдсөн 3921 нэмэгдсэн , 44 устгасан
  1. 107 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteComStaffBo.java
  2. 63 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/OrderStatus.java
  3. 9 8
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java
  4. 15 0
      ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java
  5. 8 9
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInfoController.java
  6. 7 9
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerShippingAddressController.java
  7. 0 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerSalesInfo.java
  8. 38 5
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java
  9. 113 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderMainController.java
  10. 100 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderProductController.java
  11. 274 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderMain.java
  12. 157 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderProduct.java
  13. 273 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderMainBo.java
  14. 150 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderProductBo.java
  15. 330 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderMainVo.java
  16. 193 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderProductVo.java
  17. 15 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderMainMapper.java
  18. 15 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderProductMapper.java
  19. 72 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderMainService.java
  20. 70 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderProductService.java
  21. 251 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java
  22. 155 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderProductServiceImpl.java
  23. 7 0
      ruoyi-modules/ruoyi-order/src/main/resources/mapper.order/OrderMainMapper.xml
  24. 7 0
      ruoyi-modules/ruoyi-order/src/main/resources/mapper.order/OrderProductMapper.xml
  25. 6 6
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ComCompanyController.java
  26. 112 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ComLogisticsCompanyController.java
  27. 116 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ComWarehouseController.java
  28. 4 5
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/InvoiceTypeController.java
  29. 67 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ComLogisticsCompany.java
  30. 157 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ComWarehouse.java
  31. 60 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ComLogisticsCompanyBo.java
  32. 151 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ComWarehouseBo.java
  33. 75 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ComLogisticsCompanyVo.java
  34. 190 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ComWarehouseVo.java
  35. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ComLogisticsCompanyMapper.java
  36. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ComWarehouseMapper.java
  37. 76 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IComLogisticsCompanyService.java
  38. 76 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IComWarehouseService.java
  39. 0 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ComCompanyServiceImpl.java
  40. 159 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ComLogisticsCompanyServiceImpl.java
  41. 199 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ComWarehouseServiceImpl.java
  42. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ComLogisticsCompanyMapper.xml
  43. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ComWarehouseMapper.xml

+ 107 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteComStaffBo.java

@@ -0,0 +1,107 @@
+package org.dromara.system.api.domain.bo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@NoArgsConstructor
+public class RemoteComStaffBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 销售信息ID
+     */
+    private Long id;
+
+    /**
+     * 关联客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 信用额度
+     */
+    private BigDecimal creditAmount;
+
+    /**
+     * 剩余额度
+     */
+    private BigDecimal remainingQuota;
+
+    /**
+     * 临时额度
+     */
+    private BigDecimal temporaryQuota;
+
+    /**
+     * 账期(如:30天)
+     */
+    private Integer accountPeriod;
+
+    /**
+     * 账单日(每月几号)
+     */
+    private Integer billDate;
+
+    /**
+     * 计费日(如:每月1日)
+     */
+    private Integer billingDay;
+
+    /**
+     * 订单审核方式
+     */
+    private String orderAudit;
+
+    /**
+     * 信用管理方式
+     */
+    private String creditManagement;
+
+    /**
+     * 信用支付密码
+     */
+    private String creditPaymentPassword;
+
+    /**
+     * 付款天数
+     */
+    private Integer payDays;
+
+    /**
+     * 销售人员
+     */
+    private Long salesPersonId;
+
+    /**
+     * 服务人员
+     */
+    private Long serviceStaffId;
+
+    /**
+     * 所属部门
+     */
+    private Long belongingDepartmentId;
+
+    /**
+     * 应收账款
+     */
+    private BigDecimal accountsReceivable;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 63 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/OrderStatus.java

@@ -0,0 +1,63 @@
+package org.dromara.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum OrderStatus {
+
+    /**
+     * 待收单(初始状态)
+     */
+    PENDING_RECEIPT("0", "待收单"),
+
+    /**
+     * 已收单
+     */
+    RECEIVED("1", "已收单"),
+
+    /**
+     * 待发货
+     */
+    PENDING_SHIPMENT("2", "待发货"),
+
+    /**
+     * 部分发货
+     */
+    PARTIALLY_SHIPPED("3", "部分发货"),
+
+    /**
+     * 发货完成
+     */
+    SHIPPED("4", "发货完成"),
+
+    /**
+     * 待签收
+     */
+    PENDING_SIGN("5", "待签收"),
+
+    /**
+     * 部分签收
+     */
+    PARTIALLY_SIGNED("6", "部分签收"),
+
+    /**
+     * 签收完成
+     */
+    SIGNED("7", "签收完成"),
+
+    /**
+     * 拒单(客户拒绝)
+     */
+    REJECTED("8", "拒单"),
+
+    /**
+     * 即将逾期收单(预警状态)
+     */
+    ABOUT_TO_EXPIRE("9", "即将逾期收单");
+
+    private final String code;
+    private final String info;
+
+}

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

@@ -56,20 +56,21 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "maintenance_type",
         "maintenance_type",
         "customer_info_tag",
         "customer_info_tag",
         "invoice_type",
         "invoice_type",
-        "com_company",
+        "customer_info",
         "com_bank",
         "com_bank",
         "settlement_level",
         "settlement_level",
         "settlement_method",
         "settlement_method",
         "credit_level",
         "credit_level",
-        "com_customer_level",
-        "com_customer_type",
-        "com_dept",
-        "com_post",
-        "com_staff",
         "order_order_set",
         "order_order_set",
         "order_work_slip_type",
         "order_work_slip_type",
         "order_return_reason",
         "order_return_reason",
-        "order_pay_set"
+        "order_pay_set",
+        "customer_shipping_address",
+        "customer_sales_info",
+        "com_",
+        "product_"
+
+
         // 注意:前缀匹配需特殊处理(如 qrtz_),见 isIgnoreTable 方法
         // 注意:前缀匹配需特殊处理(如 qrtz_),见 isIgnoreTable 方法
     ));
     ));
 
 
@@ -178,7 +179,7 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         }
         }
 
 
         // 前缀匹配(例如以 "qrtz_" 开头的表)
         // 前缀匹配(例如以 "qrtz_" 开头的表)
-        return tableName.startsWith("qrtz_");
+        return tableName.startsWith("qrtz_") || tableName.startsWith("product_") || tableName.startsWith("com_");
     }
     }
 
 
     @Override
     @Override

+ 15 - 0
ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java

@@ -177,4 +177,19 @@ public class SequenceUtils {
         return StringUtils.format("{}{}", prefixKey, nextId);
         return StringUtils.format("{}{}", prefixKey, nextId);
     }
     }
 
 
+    public static String generateOrderCode(String prefix) {
+        // 构建带日期的 key,确保每天重置流水号
+        String dateKey = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_FORMATTER);
+        String businessKey = prefix + dateKey;
+
+        // 每天过期,保证每天从 0001 开始
+        Duration expireTime = Duration.ofDays(1);
+
+        // 获取补零后的4位流水号
+        String paddedSeq = SequenceUtils.nextPaddedIdStr(businessKey, expireTime, 4);
+
+        // 拼接最终单号
+        return businessKey + paddedSeq;
+    }
+
 }
 }

+ 8 - 9
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInfoController.java

@@ -44,7 +44,6 @@ public class CustomerInfoController extends BaseController {
     /**
     /**
      * 查询客户信息列表
      * 查询客户信息列表
      */
      */
-    @SaCheckPermission("customer:customerInfo:list")
     @GetMapping("/list")
     @GetMapping("/list")
     public TableDataInfo<CustomerInfoVo> list(CustomerInfoBo bo, PageQuery pageQuery) {
     public TableDataInfo<CustomerInfoVo> list(CustomerInfoBo bo, PageQuery pageQuery) {
         return customerInfoService.queryPageList(bo, pageQuery);
         return customerInfoService.queryPageList(bo, pageQuery);
@@ -61,7 +60,7 @@ public class CustomerInfoController extends BaseController {
     /**
     /**
      * 导出客户信息列表
      * 导出客户信息列表
      */
      */
-    @SaCheckPermission("customer:customerInfo:export")
+//    @SaCheckPermission("customer:customerInfo:export")
     @Log(title = "客户信息", businessType = BusinessType.EXPORT)
     @Log(title = "客户信息", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     @PostMapping("/export")
     public void export(CustomerInfoBo bo, HttpServletResponse response) {
     public void export(CustomerInfoBo bo, HttpServletResponse response) {
@@ -74,7 +73,7 @@ public class CustomerInfoController extends BaseController {
      *
      *
      * @param id 主键
      * @param id 主键
      */
      */
-    @SaCheckPermission("customer:customerInfo:query")
+//    @SaCheckPermission("customer:customerInfo:query")
     @GetMapping("/{id}")
     @GetMapping("/{id}")
     public R<CustomerInfoVo> getInfo(@NotNull(message = "主键不能为空")
     public R<CustomerInfoVo> getInfo(@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
                                      @PathVariable("id") Long id) {
@@ -84,7 +83,7 @@ public class CustomerInfoController extends BaseController {
     /**
     /**
      * 新增客户信息
      * 新增客户信息
      */
      */
-    @SaCheckPermission("customer:customerInfo:add")
+//    @SaCheckPermission("customer:customerInfo:add")
     @Log(title = "客户信息", businessType = BusinessType.INSERT)
     @Log(title = "客户信息", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @RepeatSubmit()
     @PostMapping()
     @PostMapping()
@@ -95,7 +94,7 @@ public class CustomerInfoController extends BaseController {
     /**
     /**
      * 修改客户信息
      * 修改客户信息
      */
      */
-    @SaCheckPermission("customer:customerInfo:edit")
+//    @SaCheckPermission("customer:customerInfo:edit")
     @Log(title = "客户信息", businessType = BusinessType.UPDATE)
     @Log(title = "客户信息", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @RepeatSubmit()
     @PutMapping()
     @PutMapping()
@@ -108,7 +107,7 @@ public class CustomerInfoController extends BaseController {
      *
      *
      * @param ids 主键串
      * @param ids 主键串
      */
      */
-    @SaCheckPermission("customer:customerInfo:remove")
+//    @SaCheckPermission("customer:customerInfo:remove")
     @Log(title = "客户信息", businessType = BusinessType.DELETE)
     @Log(title = "客户信息", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
@@ -119,7 +118,7 @@ public class CustomerInfoController extends BaseController {
     /**
     /**
      * 状态修改
      * 状态修改
      */
      */
-    @SaCheckPermission("customer:customerInfo:edit")
+//    @SaCheckPermission("customer:customerInfo:edit")
     @Log(title = "客户信息", businessType = BusinessType.UPDATE)
     @Log(title = "客户信息", businessType = BusinessType.UPDATE)
     @PutMapping("/changeStatus")
     @PutMapping("/changeStatus")
     public R<Void> changeStatus(@RequestBody CustomerInfoBo bo) {
     public R<Void> changeStatus(@RequestBody CustomerInfoBo bo) {
@@ -129,7 +128,7 @@ public class CustomerInfoController extends BaseController {
     /**
     /**
      * 状态临时额度
      * 状态临时额度
      */
      */
-    @SaCheckPermission("customer:customerInfo:edit")
+//    @SaCheckPermission("customer:customerInfo:edit")
     @Log(title = "客户信息", businessType = BusinessType.UPDATE)
     @Log(title = "客户信息", businessType = BusinessType.UPDATE)
     @PutMapping("/updateCreditAmount")
     @PutMapping("/updateCreditAmount")
     public R<Void> updateCreditAmount(@RequestBody CustomerSalesInfoBo bo) {
     public R<Void> updateCreditAmount(@RequestBody CustomerSalesInfoBo bo) {
@@ -139,7 +138,7 @@ public class CustomerInfoController extends BaseController {
     /**
     /**
      * 设置客户标签
      * 设置客户标签
      */
      */
-    @SaCheckPermission("customer:customerInfo:edit")
+//    @SaCheckPermission("customer:customerInfo:edit")
     @Log(title = "客户信息", businessType = BusinessType.UPDATE)
     @Log(title = "客户信息", businessType = BusinessType.UPDATE)
     @PutMapping("/setCustomerInfoTag")
     @PutMapping("/setCustomerInfoTag")
     public R<Void> setCustomerInfoTag(@RequestBody SetCustomerInfoTagDto bo) {
     public R<Void> setCustomerInfoTag(@RequestBody SetCustomerInfoTagDto bo) {

+ 7 - 9
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerShippingAddressController.java

@@ -42,7 +42,6 @@ public class CustomerShippingAddressController extends BaseController {
     /**
     /**
      * 查询客户收货地址列表
      * 查询客户收货地址列表
      */
      */
-    @SaCheckPermission("customer:shippingAddress:list")
     @GetMapping("/list")
     @GetMapping("/list")
     public TableDataInfo<CustomerShippingAddressVo> list(CustomerShippingAddressBo bo, PageQuery pageQuery) {
     public TableDataInfo<CustomerShippingAddressVo> list(CustomerShippingAddressBo bo, PageQuery pageQuery) {
         return customerShippingAddressService.queryPageList(bo, pageQuery);
         return customerShippingAddressService.queryPageList(bo, pageQuery);
@@ -51,7 +50,6 @@ public class CustomerShippingAddressController extends BaseController {
     /**
     /**
      * 导出客户收货地址列表
      * 导出客户收货地址列表
      */
      */
-    @SaCheckPermission("customer:shippingAddress:export")
     @Log(title = "客户收货地址", businessType = BusinessType.EXPORT)
     @Log(title = "客户收货地址", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     @PostMapping("/export")
     public void export(CustomerShippingAddressBo bo, HttpServletResponse response) {
     public void export(CustomerShippingAddressBo bo, HttpServletResponse response) {
@@ -64,17 +62,17 @@ public class CustomerShippingAddressController extends BaseController {
      *
      *
      * @param id 主键
      * @param id 主键
      */
      */
-    @SaCheckPermission("customer:shippingAddress:query")
+//    @SaCheckPermission("customer:shippingAddress:query")
     @GetMapping("/{id}")
     @GetMapping("/{id}")
     public R<CustomerShippingAddressVo> getInfo(@NotNull(message = "主键不能为空")
     public R<CustomerShippingAddressVo> getInfo(@NotNull(message = "主键不能为空")
-                                     @PathVariable("id") Long id) {
+                                                @PathVariable("id") Long id) {
         return R.ok(customerShippingAddressService.queryById(id));
         return R.ok(customerShippingAddressService.queryById(id));
     }
     }
 
 
     /**
     /**
      * 新增客户收货地址
      * 新增客户收货地址
      */
      */
-    @SaCheckPermission("customer:shippingAddress:add")
+//    @SaCheckPermission("customer:shippingAddress:add")
     @Log(title = "客户收货地址", businessType = BusinessType.INSERT)
     @Log(title = "客户收货地址", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @RepeatSubmit()
     @PostMapping()
     @PostMapping()
@@ -85,7 +83,7 @@ public class CustomerShippingAddressController extends BaseController {
     /**
     /**
      * 修改客户收货地址
      * 修改客户收货地址
      */
      */
-    @SaCheckPermission("customer:shippingAddress:edit")
+//    @SaCheckPermission("customer:shippingAddress:edit")
     @Log(title = "客户收货地址", businessType = BusinessType.UPDATE)
     @Log(title = "客户收货地址", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @RepeatSubmit()
     @PutMapping()
     @PutMapping()
@@ -98,7 +96,7 @@ public class CustomerShippingAddressController extends BaseController {
      *
      *
      * @param ids 主键串
      * @param ids 主键串
      */
      */
-    @SaCheckPermission("customer:shippingAddress:remove")
+//    @SaCheckPermission("customer:shippingAddress:remove")
     @Log(title = "客户收货地址", businessType = BusinessType.DELETE)
     @Log(title = "客户收货地址", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
@@ -109,8 +107,8 @@ public class CustomerShippingAddressController extends BaseController {
     /**
     /**
      * 设置默认地址
      * 设置默认地址
      */
      */
-    @SaCheckPermission("customer:shippingAddress:edit")
-    @Log(title = "客户收货地址", businessType = BusinessType.UPDATE)
+//    @SaCheckPermission("customer:shippingAddress:edit")
+//    @Log(title = "客户收货地址", businessType = BusinessType.UPDATE)
     @PutMapping("/changeDefaultAddress")
     @PutMapping("/changeDefaultAddress")
     public R<Void> changeDefaultAddress(@RequestBody CustomerShippingAddressBo bo) {
     public R<Void> changeDefaultAddress(@RequestBody CustomerShippingAddressBo bo) {
         return toAjax(customerShippingAddressService.changeDefaultAddress(bo));
         return toAjax(customerShippingAddressService.changeDefaultAddress(bo));

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

@@ -120,5 +120,4 @@ public class CustomerSalesInfo extends TenantEntity {
      */
      */
     private String remark;
     private String remark;
 
 
-
 }
 }

+ 38 - 5
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java

@@ -97,11 +97,44 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
                 .orElse(null)
                 .orElse(null)
         );
         );
 
 
-        vo.setCustomerSalesInfoVo(
-            Optional.ofNullable(customerSalesInfoMapper.selectByCustomerId(id))
-                .map(entity -> MapstructUtils.convert(entity, CustomerSalesInfoVo.class))
-                .orElse(null)
-        );
+        CustomerSalesInfo customerSalesInfo = customerSalesInfoMapper.selectByCustomerId(id);
+        if (customerSalesInfo == null) {
+            vo.setCustomerSalesInfoVo(null);
+            return vo;
+        }
+
+        Set<Long> staffIds = new HashSet<>();
+        Set<Long> deptIds = new HashSet<>();
+
+        if (customerSalesInfo.getSalesPersonId() != null) {
+            staffIds.add(customerSalesInfo.getSalesPersonId());
+        }
+        if (customerSalesInfo.getServiceStaffId() != null) {
+            staffIds.add(customerSalesInfo.getServiceStaffId());
+        }
+        if (customerSalesInfo.getBelongingDepartmentId() != null) {
+            deptIds.add(customerSalesInfo.getBelongingDepartmentId());
+        }
+
+        Map<Long, String> staffMap = staffIds.isEmpty()
+            ? Collections.emptyMap()
+            : remoteComStaffService.selectStaffNameByIds(staffIds);
+
+        Map<Long, String> deptMap = deptIds.isEmpty()
+            ? Collections.emptyMap()
+            : remoteComDeptService.selectDeptNameByIds(deptIds);
+
+        // 先转换
+        CustomerSalesInfoVo voObj = MapstructUtils.convert(customerSalesInfo, CustomerSalesInfoVo.class);
+
+        // 再补充名称
+        if (voObj != null) {
+            voObj.setSalesPerson(staffMap.get(customerSalesInfo.getSalesPersonId()));
+            voObj.setServiceStaff(staffMap.get(customerSalesInfo.getServiceStaffId()));
+            voObj.setBelongingDepartment(deptMap.get(customerSalesInfo.getBelongingDepartmentId()));
+        }
+
+        vo.setCustomerSalesInfoVo(voObj);
 
 
         List<CustomerContact> contactEntities = customerContactMapper.selectListByCustomerId(id);
         List<CustomerContact> contactEntities = customerContactMapper.selectListByCustomerId(id);
         vo.setCustomerContactVoList(
         vo.setCustomerContactVoList(

+ 113 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderMainController.java

@@ -0,0 +1,113 @@
+package org.dromara.order.controller;
+
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.utils.ExcelUtil;
+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.web.core.BaseController;
+import org.dromara.order.domain.bo.OrderMainBo;
+import org.dromara.order.domain.vo.OrderMainVo;
+import org.dromara.order.service.IOrderMainService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 订单主信息
+ * 前端访问路由地址为:/system/orderMain
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/orderMain")
+public class OrderMainController extends BaseController {
+
+    private final IOrderMainService orderMainService;
+
+    /**
+     * 查询订单主信息列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<OrderMainVo> list(OrderMainBo bo, PageQuery pageQuery) {
+        return orderMainService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出订单主信息列表
+     */
+//    @SaCheckPermission("system:orderMain:export")
+//    @Log(title = "订单主信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(OrderMainBo bo, HttpServletResponse response) {
+        List<OrderMainVo> list = orderMainService.queryList(bo);
+        ExcelUtil.exportExcel(list, "订单主信息", OrderMainVo.class, response);
+    }
+
+    /**
+     * 获取订单主信息详细信息
+     *
+     * @param id 主键
+     */
+//    @SaCheckPermission("system:orderMain:query")
+    @GetMapping("/{id}")
+    public R<OrderMainVo> getInfo(@NotNull(message = "主键不能为空")
+                                  @PathVariable("id") Long id) {
+        return R.ok(orderMainService.queryById(id));
+    }
+
+    /**
+     * 新增订单主信息
+     */
+//    @SaCheckPermission("system:orderMain:add")
+    @Log(title = "订单主信息", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody OrderMainBo bo) {
+        return toAjax(orderMainService.insertByBo(bo));
+    }
+
+    /**
+     * 修改订单主信息
+     */
+//    @SaCheckPermission("system:orderMain:edit")
+    @Log(title = "订单主信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody OrderMainBo bo) {
+        return toAjax(orderMainService.updateByBo(bo));
+    }
+
+    /**
+     * 删除订单主信息
+     *
+     * @param ids 主键串
+     */
+//    @SaCheckPermission("system:orderMain:remove")
+    @Log(title = "订单主信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(orderMainService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    /**
+     * 状态修改
+     */
+    @Log(title = "订单主信息", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public R<Void> changeStatus(@RequestBody OrderMainBo bo) {
+        return toAjax(orderMainService.updateStatus(bo));
+    }
+}

+ 100 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderProductController.java

@@ -0,0 +1,100 @@
+package org.dromara.order.controller;
+
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.utils.ExcelUtil;
+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.web.core.BaseController;
+import org.dromara.order.domain.bo.OrderProductBo;
+import org.dromara.order.domain.vo.OrderProductVo;
+import org.dromara.order.service.IOrderProductService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 订单商品明细
+ * 前端访问路由地址为:/system/orderProduct
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/orderProduct")
+public class OrderProductController extends BaseController {
+
+    private final IOrderProductService orderProductService;
+
+    /**
+     * 查询订单商品明细列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<OrderProductVo> list(OrderProductBo bo, PageQuery pageQuery) {
+        return orderProductService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出订单商品明细列表
+     */
+    @Log(title = "订单商品明细", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(OrderProductBo bo, HttpServletResponse response) {
+        List<OrderProductVo> list = orderProductService.queryList(bo);
+        ExcelUtil.exportExcel(list, "订单商品明细", OrderProductVo.class, response);
+    }
+
+    /**
+     * 获取订单商品明细详细信息
+     *
+     * @param id 主键
+     */
+    @GetMapping("/{id}")
+    public R<OrderProductVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(orderProductService.queryById(id));
+    }
+
+    /**
+     * 新增订单商品明细
+     */
+    @Log(title = "订单商品明细", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody OrderProductBo bo) {
+        return toAjax(orderProductService.insertByBo(bo));
+    }
+
+    /**
+     * 修改订单商品明细
+     */
+    @Log(title = "订单商品明细", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody OrderProductBo bo) {
+        return toAjax(orderProductService.updateByBo(bo));
+    }
+
+    /**
+     * 删除订单商品明细
+     *
+     * @param ids 主键串
+     */
+    @Log(title = "订单商品明细", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(orderProductService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 274 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderMain.java

@@ -0,0 +1,274 @@
+package org.dromara.order.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.order.domain.bo.OrderProductBo;
+import org.dromara.order.domain.vo.OrderProductVo;
+
+import java.io.Serial;
+import java.util.List;
+
+/**
+ * 订单主信息对象 order_main
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("order_main")
+public class OrderMain extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 发货单号
+     */
+    private String shipmentNo;
+
+    /**
+     * 子订单编号
+     */
+    private String subOrderNo;
+
+    /**
+     * 所属公司
+     */
+    private Long companyId;
+
+    /**
+     * 客户ID(关联客户主表)
+     */
+    private Long customerId;
+
+    /**
+     * 用户ID(关联用户表)
+     */
+    private Long userId;
+
+    /**
+     * 收货地址ID
+     */
+    private Long shippingAddressId;
+
+    /**
+     * 采购事由
+     */
+    private String purchaseReason;
+
+    /**
+     * 发票类型
+     */
+    private String invoiceType;
+
+    /**
+     * 支付方式
+     */
+    private String payType;
+
+    /**
+     * 发货仓库
+     */
+    private Long warehouseId;
+
+    /**
+     * 信用额度(元)
+     */
+    private BigDecimal creditLimit;
+
+    /**
+     * 预计送达时间
+     */
+    private Date expectedDeliveryTime;
+
+    /**
+     * 业务员姓名/工号
+     */
+    private String businessStaff;
+
+    /**
+     * 客服人员
+     */
+    private String customerService;
+
+    /**
+     * 业务部门
+     */
+    private String businessDept;
+
+    /**
+     * 用户所属部门
+     */
+    private String userDept;
+
+    /**
+     * 商品总数量
+     */
+    private Long productQuantity;
+
+    /**
+     * 运费(元)
+     */
+    private Long shippingFee;
+
+    /**
+     * 订单总金额(元)
+     */
+    private Long totalAmount;
+
+    /**
+     * 应付金额(元)
+     */
+    private Long payableAmount;
+
+    /**
+     * 支付状态
+     */
+    private String paymentStatus;
+
+    /**
+     * 订单来源
+     */
+    private String orderSource;
+
+    /**
+     * 订单状态
+     */
+    private String orderStatus;
+
+    /**
+     * 下单时间
+     */
+    private Date orderTime;
+
+    /**
+     * 确认时间
+     */
+    private Date confirmTime;
+
+    /**
+     * 发货时间
+     */
+    private Date shippingTime;
+
+    /**
+     * 收货时间
+     */
+    private Date receivingTime;
+
+    /**
+     * 已发货数量
+     */
+    private Long shippedQuantity;
+
+    /**
+     * 未发货数量
+     */
+    private Long unshippedQuantity;
+
+    /**
+     * 包裹数量
+     */
+    private Long packageCount;
+
+    /**
+     * 签收数量
+     */
+    private Long signedQuantity;
+
+    /**
+     * 已完成售后数量
+     */
+    private Long afterSaleCompleted;
+
+    /**
+     * 申请售后数量
+     */
+    private Long afterSalePending;
+
+    /**
+     * 配送时效描述
+     */
+    private String deliveryDesc;
+
+    /**
+     * 推送状态
+     */
+    private String pushStatus;
+
+    /**
+     * 订单附件文件路径
+     */
+    private String attachmentPath;
+
+    /**
+     * 配送类型
+     */
+    private String deliveryType;
+
+    /**
+     * 创建类别
+     */
+    private String orderCategory;
+
+    /**
+     * 商品编码
+     */
+    private String productCode;
+
+    /**
+     * 取消或异常原因
+     */
+    private String cancelReason;
+
+    /**
+     * 费用类型
+     */
+    private String expenseType;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 用户编号
+     */
+    private String userNo;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 157 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderProduct.java

@@ -0,0 +1,157 @@
+package org.dromara.order.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+import org.dromara.common.translation.annotation.Translation;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 订单商品明细对象 order_product
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("order_product")
+public class OrderProduct extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单商品明细ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 订单ID
+     */
+    private Long orderId;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 发货单编号
+     */
+    private String shipmentNo;
+
+    /**
+     * 产品ID
+     */
+    private Long productId;
+
+    /**
+     * 产品编号(业务编码)
+     */
+    private String productNo;
+
+    /**
+     * 产品名称
+     */
+    private String productName;
+
+    /**
+     * 产品单位
+     */
+    private String productUnit;
+
+    /**
+     * 产品图片URL
+     */
+    private String productImage;
+
+    /**
+     * 平台价格(元)
+     */
+    private BigDecimal platformPrice;
+
+    /**
+     * 最小起订量
+     */
+    private Long minOrderQuantity;
+
+    /**
+     * 订单单价(元)
+     */
+    private BigDecimal orderPrice;
+
+    /**
+     * 订购数量
+     */
+    private Long orderQuantity;
+
+    /**
+     * 行小计金额(元)
+     */
+    private BigDecimal subtotal;
+
+    /**
+     * 最低销售价(元)
+     */
+    private BigDecimal minSellingPrice;
+
+    /**
+     * 已签收数量
+     */
+    private Long signedQuantity;
+
+    /**
+     * 已发货数量
+     */
+    private Long quantitySent;
+
+    /**
+     * 未发货数量
+     */
+    private Long unsentQuantity;
+
+    /**
+     * 是否申请售后
+     */
+    private String isAfterSale;
+
+    /**
+     * 售后申请数量
+     */
+    private Long afterSaleQuantity;
+
+    /**
+     * 退款金额(元)
+     */
+    private BigDecimal returnAmount;
+
+    /**
+     * 预计送达时间
+     */
+    private Date preDeliveryDate;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 273 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderMainBo.java

@@ -0,0 +1,273 @@
+package org.dromara.order.domain.bo;
+
+import org.dromara.order.domain.OrderMain;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 订单主信息业务对象 order_main
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = OrderMain.class, reverseConvertGenerate = false)
+public class OrderMainBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 发货单号
+     */
+    private String shipmentNo;
+
+    /**
+     * 子订单编号
+     */
+    private String subOrderNo;
+
+    /**
+     * 所属公司
+     */
+    private Long companyId;
+
+    /**
+     * 客户ID(关联客户主表)
+     */
+    @NotNull(message = "客户ID(关联客户主表)不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long customerId;
+
+    /**
+     * 用户ID(关联用户表)
+     */
+    private Long userId;
+
+    /**
+     * 收货地址ID
+     */
+    private Long shippingAddressId;
+
+    /**
+     * 采购事由
+     */
+    private String purchaseReason;
+
+    /**
+     * 发票类型
+     */
+    private String invoiceType;
+
+    /**
+     * 支付方式
+     */
+    @NotBlank(message = "支付方式不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String payType;
+
+    /**
+     * 发货仓库
+     */
+    @NotNull(message = "发货仓库不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long warehouseId;
+
+    /**
+     * 信用额度(元)
+     */
+    private BigDecimal creditLimit;
+
+    /**
+     * 预计送达时间
+     */
+    @NotNull(message = "预计送达时间不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Date expectedDeliveryTime;
+
+    /**
+     * 业务员姓名/工号
+     */
+    private String businessStaff;
+
+    /**
+     * 客服人员
+     */
+    private String customerService;
+
+    /**
+     * 业务部门
+     */
+    private String businessDept;
+
+    /**
+     * 用户所属部门
+     */
+    private String userDept;
+
+    /**
+     * 商品总数量
+     */
+    private Long productQuantity;
+
+    /**
+     * 运费(元)
+     */
+    @NotNull(message = "运费(元)不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long shippingFee;
+
+    /**
+     * 订单总金额(元)
+     */
+    private Long totalAmount;
+
+    /**
+     * 应付金额(元)
+     */
+    private Long payableAmount;
+
+    /**
+     * 支付状态
+     */
+    private String paymentStatus;
+
+    /**
+     * 订单来源
+     */
+    private String orderSource;
+
+    /**
+     * 订单状态
+     */
+    private String orderStatus;
+
+    /**
+     * 下单时间
+     */
+    private Date orderTime;
+
+    /**
+     * 确认时间
+     */
+    private Date confirmTime;
+
+    /**
+     * 发货时间
+     */
+    private Date shippingTime;
+
+    /**
+     * 收货时间
+     */
+    private Date receivingTime;
+
+    /**
+     * 已发货数量
+     */
+    private Long shippedQuantity;
+
+    /**
+     * 未发货数量
+     */
+    private Long unshippedQuantity;
+
+    /**
+     * 包裹数量
+     */
+    private Long packageCount;
+
+    /**
+     * 签收数量
+     */
+    private Long signedQuantity;
+
+    /**
+     * 已完成售后数量
+     */
+    private Long afterSaleCompleted;
+
+    /**
+     * 申请售后数量
+     */
+    private Long afterSalePending;
+
+    /**
+     * 配送时效描述
+     */
+    private String deliveryDesc;
+
+    /**
+     * 推送状态
+     */
+    private String pushStatus;
+
+    /**
+     * 订单附件文件路径
+     */
+    private String attachmentPath;
+
+    /**
+     * 配送类型
+     */
+    private String deliveryType;
+
+    /**
+     * 创建类别
+     */
+    private String orderCategory;
+
+    /**
+     * 商品编码
+     */
+    private String productCode;
+
+    /**
+     * 取消或异常原因
+     */
+    private String cancelReason;
+
+    /**
+     * 费用类型
+     */
+    @NotBlank(message = "费用类型不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String expenseType;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 用户编号
+     */
+    private String userNo;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    List<OrderProductBo> orderProductBos;
+
+
+}

+ 150 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderProductBo.java

@@ -0,0 +1,150 @@
+package org.dromara.order.domain.bo;
+
+import org.dromara.order.domain.OrderProduct;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+import org.dromara.common.translation.annotation.Translation;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 订单商品明细业务对象 order_product
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = OrderProduct.class, reverseConvertGenerate = false)
+public class OrderProductBo extends BaseEntity {
+
+    /**
+     * 订单商品明细ID
+     */
+    private Long id;
+
+    /**
+     * 订单ID
+     */
+    @NotNull(message = "订单ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long orderId;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 发货单编号
+     */
+    private String shipmentNo;
+
+    /**
+     * 产品ID
+     */
+    private Long productId;
+
+    /**
+     * 产品编号(业务编码)
+     */
+    private String productNo;
+
+    /**
+     * 产品名称
+     */
+    private String productName;
+
+    /**
+     * 产品单位
+     */
+    private String productUnit;
+
+    /**
+     * 产品图片URL
+     */
+    private String productImage;
+
+    /**
+     * 平台价格(元)
+     */
+    private BigDecimal platformPrice;
+
+    /**
+     * 最小起订量
+     */
+    private Long minOrderQuantity;
+
+    /**
+     * 订单单价(元)
+     */
+    private BigDecimal orderPrice;
+
+    /**
+     * 订购数量
+     */
+    private Long orderQuantity;
+
+    /**
+     * 行小计金额(元)
+     */
+    private BigDecimal subtotal;
+
+    /**
+     * 最低销售价(元)
+     */
+    private BigDecimal minSellingPrice;
+
+    /**
+     * 已签收数量
+     */
+    private Long signedQuantity;
+
+    /**
+     * 已发货数量
+     */
+    private Long quantitySent;
+
+    /**
+     * 未发货数量
+     */
+    private Long unsentQuantity;
+
+    /**
+     * 是否申请售后
+     */
+    private String isAfterSale;
+
+    /**
+     * 售后申请数量
+     */
+    private Long afterSaleQuantity;
+
+    /**
+     * 退款金额(元)
+     */
+    private BigDecimal returnAmount;
+
+    /**
+     * 预计送达时间
+     */
+    private Date preDeliveryDate;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 330 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderMainVo.java

@@ -0,0 +1,330 @@
+package org.dromara.order.domain.vo;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.order.domain.OrderMain;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 订单主信息视图对象 order_main
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = OrderMain.class)
+public class OrderMainVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 订单编号
+     */
+    @ExcelProperty(value = "订单编号")
+    private String orderNo;
+
+    /**
+     * 发货单号
+     */
+    @ExcelProperty(value = "发货单号")
+    private String shipmentNo;
+
+    /**
+     * 子订单编号
+     */
+    @ExcelProperty(value = "子订单编号")
+    private String subOrderNo;
+
+    /**
+     * 所属公司
+     */
+    @ExcelProperty(value = "所属公司")
+    private Long companyId;
+
+    /**
+     * 客户ID(关联客户主表)
+     */
+    @ExcelProperty(value = "客户ID", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "关=联客户主表")
+    private Long customerId;
+
+    /**
+     * 用户ID(关联用户表)
+     */
+    @ExcelProperty(value = "用户ID", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "关=联用户表")
+    private Long userId;
+
+    /**
+     * 收货地址ID
+     */
+    @ExcelProperty(value = "收货地址ID")
+    private Long shippingAddressId;
+
+    /**
+     * 采购事由
+     */
+    @ExcelProperty(value = "采购事由")
+    private String purchaseReason;
+
+    /**
+     * 发票类型
+     */
+    @ExcelProperty(value = "发票类型")
+    private String invoiceType;
+
+    /**
+     * 支付方式
+     */
+    @ExcelProperty(value = "支付方式", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "pay_method")
+    private String payType;
+
+    /**
+     * 发货仓库
+     */
+    @ExcelProperty(value = "发货仓库")
+    private Long warehouseId;
+
+    /**
+     * 信用额度(元)
+     */
+    @ExcelProperty(value = "信用额度", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private BigDecimal creditLimit;
+
+    /**
+     * 预计送达时间
+     */
+    @ExcelProperty(value = "预计送达时间")
+    private Date expectedDeliveryTime;
+
+    /**
+     * 业务员姓名/工号
+     */
+    @ExcelProperty(value = "业务员姓名/工号")
+    private String businessStaff;
+
+    /**
+     * 客服人员
+     */
+    @ExcelProperty(value = "客服人员")
+    private String customerService;
+
+    /**
+     * 业务部门
+     */
+    @ExcelProperty(value = "业务部门")
+    private String businessDept;
+
+    /**
+     * 用户所属部门
+     */
+    @ExcelProperty(value = "用户所属部门")
+    private String userDept;
+
+    /**
+     * 商品总数量
+     */
+    @ExcelProperty(value = "商品总数量")
+    private Long productQuantity;
+
+    /**
+     * 运费(元)
+     */
+    @ExcelProperty(value = "运费", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private Long shippingFee;
+
+    /**
+     * 订单总金额(元)
+     */
+    @ExcelProperty(value = "订单总金额", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private Long totalAmount;
+
+    /**
+     * 应付金额(元)
+     */
+    @ExcelProperty(value = "应付金额", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private Long payableAmount;
+
+    /**
+     * 支付状态
+     */
+    @ExcelProperty(value = "支付状态")
+    private String paymentStatus;
+
+    /**
+     * 订单来源
+     */
+    @ExcelProperty(value = "订单来源")
+    private String orderSource;
+
+    /**
+     * 订单状态
+     */
+    @ExcelProperty(value = "订单状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "order_status")
+    private String orderStatus;
+
+    /**
+     * 下单时间
+     */
+    @ExcelProperty(value = "下单时间")
+    private Date orderTime;
+
+    /**
+     * 确认时间
+     */
+    @ExcelProperty(value = "确认时间")
+    private Date confirmTime;
+
+    /**
+     * 发货时间
+     */
+    @ExcelProperty(value = "发货时间")
+    private Date shippingTime;
+
+    /**
+     * 收货时间
+     */
+    @ExcelProperty(value = "收货时间")
+    private Date receivingTime;
+
+    /**
+     * 已发货数量
+     */
+    @ExcelProperty(value = "已发货数量")
+    private Long shippedQuantity;
+
+    /**
+     * 未发货数量
+     */
+    @ExcelProperty(value = "未发货数量")
+    private Long unshippedQuantity;
+
+    /**
+     * 包裹数量
+     */
+    @ExcelProperty(value = "包裹数量")
+    private Long packageCount;
+
+    /**
+     * 签收数量
+     */
+    @ExcelProperty(value = "签收数量")
+    private Long signedQuantity;
+
+    /**
+     * 已完成售后数量
+     */
+    @ExcelProperty(value = "已完成售后数量")
+    private Long afterSaleCompleted;
+
+    /**
+     * 申请售后数量
+     */
+    @ExcelProperty(value = "申请售后数量")
+    private Long afterSalePending;
+
+    /**
+     * 配送时效描述
+     */
+    @ExcelProperty(value = "配送时效描述")
+    private String deliveryDesc;
+
+    /**
+     * 推送状态
+     */
+    @ExcelProperty(value = "推送状态")
+    private String pushStatus;
+
+    /**
+     * 订单附件文件路径
+     */
+    @ExcelProperty(value = "订单附件文件路径")
+    private String attachmentPath;
+
+    /**
+     * 配送类型
+     */
+    @ExcelProperty(value = "配送类型")
+    private String deliveryType;
+
+    /**
+     * 创建类别
+     */
+    @ExcelProperty(value = "创建类别")
+    private String orderCategory;
+
+    /**
+     * 商品编码
+     */
+    @ExcelProperty(value = "商品编码")
+    private String productCode;
+
+    /**
+     * 取消或异常原因
+     */
+    @ExcelProperty(value = "取消或异常原因")
+    private String cancelReason;
+
+    /**
+     * 费用类型
+     */
+    @ExcelProperty(value = "费用类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "fee_type")
+    private String expenseType;
+
+    /**
+     * 客户编号
+     */
+    @ExcelProperty(value = "客户编号")
+    private String customerNo;
+
+    /**
+     * 用户编号
+     */
+    @ExcelProperty(value = "用户编号")
+    private String userNo;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    private List<OrderProductVo> orderProductList;
+
+
+}

+ 193 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderProductVo.java

@@ -0,0 +1,193 @@
+package org.dromara.order.domain.vo;
+
+import java.math.BigDecimal;
+import org.dromara.common.translation.annotation.Translation;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.order.domain.OrderProduct;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 订单商品明细视图对象 order_product
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = OrderProduct.class)
+public class OrderProductVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单商品明细ID
+     */
+    @ExcelProperty(value = "订单商品明细ID")
+    private Long id;
+
+    /**
+     * 订单ID
+     */
+    @ExcelProperty(value = "订单ID")
+    private Long orderId;
+
+    /**
+     * 订单编号
+     */
+    @ExcelProperty(value = "订单编号")
+    private String orderNo;
+
+    /**
+     * 发货单编号
+     */
+    @ExcelProperty(value = "发货单编号")
+    private String shipmentNo;
+
+    /**
+     * 产品ID
+     */
+    @ExcelProperty(value = "产品ID")
+    private Long productId;
+
+    /**
+     * 产品编号(业务编码)
+     */
+    @ExcelProperty(value = "产品编号", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "业=务编码")
+    private String productNo;
+
+    /**
+     * 产品名称
+     */
+    @ExcelProperty(value = "产品名称")
+    private String productName;
+
+    /**
+     * 产品单位
+     */
+    @ExcelProperty(value = "产品单位")
+    private String productUnit;
+
+    /**
+     * 产品图片URL
+     */
+    @ExcelProperty(value = "产品图片URL")
+    private String productImage;
+
+    /**
+     * 产品图片URLUrl
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "productImage")
+    private String productImageUrl;
+    /**
+     * 平台价格(元)
+     */
+    @ExcelProperty(value = "平台价格", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private BigDecimal platformPrice;
+
+    /**
+     * 最小起订量
+     */
+    @ExcelProperty(value = "最小起订量")
+    private Long minOrderQuantity;
+
+    /**
+     * 订单单价(元)
+     */
+    @ExcelProperty(value = "订单单价", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private BigDecimal orderPrice;
+
+    /**
+     * 订购数量
+     */
+    @ExcelProperty(value = "订购数量")
+    private Long orderQuantity;
+
+    /**
+     * 行小计金额(元)
+     */
+    @ExcelProperty(value = "行小计金额", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private BigDecimal subtotal;
+
+    /**
+     * 最低销售价(元)
+     */
+    @ExcelProperty(value = "最低销售价", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private BigDecimal minSellingPrice;
+
+    /**
+     * 已签收数量
+     */
+    @ExcelProperty(value = "已签收数量")
+    private Long signedQuantity;
+
+    /**
+     * 已发货数量
+     */
+    @ExcelProperty(value = "已发货数量")
+    private Long quantitySent;
+
+    /**
+     * 未发货数量
+     */
+    @ExcelProperty(value = "未发货数量")
+    private Long unsentQuantity;
+
+    /**
+     * 是否申请售后
+     */
+    @ExcelProperty(value = "是否申请售后")
+    private String isAfterSale;
+
+    /**
+     * 售后申请数量
+     */
+    @ExcelProperty(value = "售后申请数量")
+    private Long afterSaleQuantity;
+
+    /**
+     * 退款金额(元)
+     */
+    @ExcelProperty(value = "退款金额", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private BigDecimal returnAmount;
+
+    /**
+     * 预计送达时间
+     */
+    @ExcelProperty(value = "预计送达时间")
+    private Date preDeliveryDate;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.order.mapper;
+
+import org.dromara.order.domain.OrderMain;
+import org.dromara.order.domain.vo.OrderMainVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 订单主信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+public interface OrderMainMapper extends BaseMapperPlus<OrderMain, OrderMainVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderProductMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.order.mapper;
+
+import org.dromara.order.domain.OrderProduct;
+import org.dromara.order.domain.vo.OrderProductVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 订单商品明细Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+public interface OrderProductMapper extends BaseMapperPlus<OrderProduct, OrderProductVo> {
+
+}

+ 72 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderMainService.java

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

+ 70 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderProductService.java

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

+ 251 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java

@@ -0,0 +1,251 @@
+package org.dromara.order.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.redis.utils.SequenceUtils;
+import org.dromara.order.domain.OrderMain;
+import org.dromara.order.domain.OrderProduct;
+import org.dromara.order.domain.bo.OrderMainBo;
+import org.dromara.order.domain.bo.OrderProductBo;
+import org.dromara.order.domain.vo.OrderMainVo;
+import org.dromara.order.domain.vo.OrderProductVo;
+import org.dromara.order.mapper.OrderMainMapper;
+import org.dromara.order.mapper.OrderProductMapper;
+import org.dromara.order.service.IOrderMainService;
+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.stream.Collectors;
+
+/**
+ * 订单主信息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain> implements IOrderMainService {
+
+    private final OrderMainMapper baseMapper;
+
+    private final OrderProductMapper orderProductMapper;
+
+    /**
+     * 查询订单主信息
+     *
+     * @param id 主键
+     * @return 订单主信息
+     */
+    @Override
+    public OrderMainVo queryById(Long id) {
+        // 1. 查询主订单
+        OrderMainVo orderMainVo = baseMapper.selectVoById(id);
+        if (orderMainVo == null) {
+            return null;
+        }
+
+        // 2. 查询关联的商品列表
+        List<OrderProductVo> orderProductVoList = orderProductMapper.selectVoList(
+            new LambdaQueryWrapper<OrderProduct>().eq(OrderProduct::getOrderId, orderMainVo.getId())
+        );
+
+        // 3. 组装数据
+        orderMainVo.setOrderProductList(orderProductVoList);
+
+        // 4. 返回已组装好的对象
+        return orderMainVo;
+    }
+
+    /**
+     * 分页查询订单主信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 订单主信息分页列表
+     */
+    @Override
+    public TableDataInfo<OrderMainVo> queryPageList(OrderMainBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<OrderMain> lqw = buildQueryWrapper(bo);
+        Page<OrderMainVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的订单主信息列表
+     *
+     * @param bo 查询条件
+     * @return 订单主信息列表
+     */
+    @Override
+    public List<OrderMainVo> queryList(OrderMainBo bo) {
+        LambdaQueryWrapper<OrderMain> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<OrderMain> buildQueryWrapper(OrderMainBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<OrderMain> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(OrderMain::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getOrderNo()), OrderMain::getOrderNo, bo.getOrderNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getShipmentNo()), OrderMain::getShipmentNo, bo.getShipmentNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getSubOrderNo()), OrderMain::getSubOrderNo, bo.getSubOrderNo());
+        lqw.eq(bo.getCompanyId() != null, OrderMain::getCompanyId, bo.getCompanyId());
+        lqw.eq(bo.getCustomerId() != null, OrderMain::getCustomerId, bo.getCustomerId());
+        lqw.eq(bo.getUserId() != null, OrderMain::getUserId, bo.getUserId());
+        lqw.eq(bo.getShippingAddressId() != null, OrderMain::getShippingAddressId, bo.getShippingAddressId());
+        lqw.eq(StringUtils.isNotBlank(bo.getPurchaseReason()), OrderMain::getPurchaseReason, bo.getPurchaseReason());
+        lqw.eq(StringUtils.isNotBlank(bo.getInvoiceType()), OrderMain::getInvoiceType, bo.getInvoiceType());
+        lqw.eq(StringUtils.isNotBlank(bo.getPayType()), OrderMain::getPayType, bo.getPayType());
+        lqw.eq(bo.getWarehouseId() != null, OrderMain::getWarehouseId, bo.getWarehouseId());
+        lqw.eq(bo.getCreditLimit() != null, OrderMain::getCreditLimit, bo.getCreditLimit());
+        lqw.eq(bo.getExpectedDeliveryTime() != null, OrderMain::getExpectedDeliveryTime, bo.getExpectedDeliveryTime());
+        lqw.eq(StringUtils.isNotBlank(bo.getBusinessStaff()), OrderMain::getBusinessStaff, bo.getBusinessStaff());
+        lqw.eq(StringUtils.isNotBlank(bo.getCustomerService()), OrderMain::getCustomerService, bo.getCustomerService());
+        lqw.eq(StringUtils.isNotBlank(bo.getBusinessDept()), OrderMain::getBusinessDept, bo.getBusinessDept());
+        lqw.eq(StringUtils.isNotBlank(bo.getUserDept()), OrderMain::getUserDept, bo.getUserDept());
+        lqw.eq(bo.getProductQuantity() != null, OrderMain::getProductQuantity, bo.getProductQuantity());
+        lqw.eq(bo.getShippingFee() != null, OrderMain::getShippingFee, bo.getShippingFee());
+        lqw.eq(bo.getTotalAmount() != null, OrderMain::getTotalAmount, bo.getTotalAmount());
+        lqw.eq(bo.getPayableAmount() != null, OrderMain::getPayableAmount, bo.getPayableAmount());
+        lqw.eq(StringUtils.isNotBlank(bo.getPaymentStatus()), OrderMain::getPaymentStatus, bo.getPaymentStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getOrderSource()), OrderMain::getOrderSource, bo.getOrderSource());
+        lqw.eq(StringUtils.isNotBlank(bo.getOrderStatus()), OrderMain::getOrderStatus, bo.getOrderStatus());
+        lqw.eq(bo.getOrderTime() != null, OrderMain::getOrderTime, bo.getOrderTime());
+        lqw.eq(bo.getConfirmTime() != null, OrderMain::getConfirmTime, bo.getConfirmTime());
+        lqw.eq(bo.getShippingTime() != null, OrderMain::getShippingTime, bo.getShippingTime());
+        lqw.eq(bo.getReceivingTime() != null, OrderMain::getReceivingTime, bo.getReceivingTime());
+        lqw.eq(bo.getShippedQuantity() != null, OrderMain::getShippedQuantity, bo.getShippedQuantity());
+        lqw.eq(bo.getUnshippedQuantity() != null, OrderMain::getUnshippedQuantity, bo.getUnshippedQuantity());
+        lqw.eq(bo.getPackageCount() != null, OrderMain::getPackageCount, bo.getPackageCount());
+        lqw.eq(bo.getSignedQuantity() != null, OrderMain::getSignedQuantity, bo.getSignedQuantity());
+        lqw.eq(bo.getAfterSaleCompleted() != null, OrderMain::getAfterSaleCompleted, bo.getAfterSaleCompleted());
+        lqw.eq(bo.getAfterSalePending() != null, OrderMain::getAfterSalePending, bo.getAfterSalePending());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeliveryDesc()), OrderMain::getDeliveryDesc, bo.getDeliveryDesc());
+        lqw.eq(StringUtils.isNotBlank(bo.getPushStatus()), OrderMain::getPushStatus, bo.getPushStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getAttachmentPath()), OrderMain::getAttachmentPath, bo.getAttachmentPath());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeliveryType()), OrderMain::getDeliveryType, bo.getDeliveryType());
+        lqw.eq(StringUtils.isNotBlank(bo.getOrderCategory()), OrderMain::getOrderCategory, bo.getOrderCategory());
+        lqw.eq(StringUtils.isNotBlank(bo.getProductCode()), OrderMain::getProductCode, bo.getProductCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getCancelReason()), OrderMain::getCancelReason, bo.getCancelReason());
+        lqw.eq(StringUtils.isNotBlank(bo.getExpenseType()), OrderMain::getExpenseType, bo.getExpenseType());
+        lqw.eq(StringUtils.isNotBlank(bo.getCustomerNo()), OrderMain::getCustomerNo, bo.getCustomerNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), OrderMain::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增订单主信息
+     *
+     * @param bo 订单主信息
+     * @return 是否新增成功
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean insertByBo(OrderMainBo bo) {
+        // 1. 校验商品列表
+        List<OrderProductBo> orderProductBos = bo.getOrderProductBos();
+        if (CollUtil.isEmpty(orderProductBos)) {
+            throw new IllegalArgumentException("订单商品列表不能为空");
+        }
+
+        // 可选:校验每个商品的数量、价格等
+        for (OrderProductBo productBo : orderProductBos) {
+            if (productBo.getOrderQuantity() == null || productBo.getOrderQuantity() <= 0) {
+                throw new IllegalArgumentException("商品数量必须大于0");
+            }
+        }
+
+        // 2. 生成订单号并转换主单
+        String orderNo = SequenceUtils.generateOrderCode("RS");
+        bo.setOrderNo(orderNo);
+        OrderMain orderMain = MapstructUtils.convert(bo, OrderMain.class);
+
+        validEntityBeforeSave(orderMain);
+
+        // 3. 插入主订单
+        boolean mainSaved = baseMapper.insert(orderMain) > 0;
+        if (!mainSaved) {
+            throw new RuntimeException("主订单保存失败");
+        }
+
+        // 4. 转换并填充子订单商品
+        Long orderId = orderMain.getId();
+        List<OrderProduct> orderProducts = orderProductBos.stream()
+            .map(productBo -> {
+                OrderProduct product = MapstructUtils.convert(productBo, OrderProduct.class);
+                product.setOrderId(orderId);      // 关联主单ID
+                product.setOrderNo(orderNo);      // 关联订单号
+                return product;
+            })
+            .collect(Collectors.toList());
+
+        // 5. 批量插入订单商品
+        boolean productsSaved = orderProductMapper.insertBatch(orderProducts);
+
+
+        return productsSaved;
+    }
+
+    /**
+     * 修改订单主信息
+     *
+     * @param bo 订单主信息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(OrderMainBo bo) {
+        OrderMain update = MapstructUtils.convert(bo, OrderMain.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 修改状态
+     *
+     * @param bo 信息
+     * @return 结果
+     */
+    @Override
+    public int updateStatus(OrderMainBo bo) {
+        OrderMain order = new OrderMain();
+        order.setId(bo.getId());
+        order.setOrderStatus(bo.getOrderStatus());
+        return baseMapper.updateById(order);
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(OrderMain entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除订单主信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 155 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderProductServiceImpl.java

@@ -0,0 +1,155 @@
+package org.dromara.order.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.order.domain.OrderProduct;
+import org.dromara.order.domain.bo.OrderProductBo;
+import org.dromara.order.domain.vo.OrderProductVo;
+import org.dromara.order.mapper.OrderProductMapper;
+import org.dromara.order.service.IOrderProductService;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 订单商品明细Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class OrderProductServiceImpl extends ServiceImpl<OrderProductMapper, OrderProduct> implements IOrderProductService {
+
+    private final OrderProductMapper baseMapper;
+
+    /**
+     * 查询订单商品明细
+     *
+     * @param id 主键
+     * @return 订单商品明细
+     */
+    @Override
+    public OrderProductVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询订单商品明细列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 订单商品明细分页列表
+     */
+    @Override
+    public TableDataInfo<OrderProductVo> queryPageList(OrderProductBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<OrderProduct> lqw = buildQueryWrapper(bo);
+        Page<OrderProductVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的订单商品明细列表
+     *
+     * @param bo 查询条件
+     * @return 订单商品明细列表
+     */
+    @Override
+    public List<OrderProductVo> queryList(OrderProductBo bo) {
+        LambdaQueryWrapper<OrderProduct> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<OrderProduct> buildQueryWrapper(OrderProductBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<OrderProduct> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(OrderProduct::getId);
+        lqw.eq(bo.getOrderId() != null, OrderProduct::getOrderId, bo.getOrderId());
+        lqw.eq(StringUtils.isNotBlank(bo.getOrderNo()), OrderProduct::getOrderNo, bo.getOrderNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getShipmentNo()), OrderProduct::getShipmentNo, bo.getShipmentNo());
+        lqw.eq(bo.getProductId() != null, OrderProduct::getProductId, bo.getProductId());
+        lqw.eq(StringUtils.isNotBlank(bo.getProductNo()), OrderProduct::getProductNo, bo.getProductNo());
+        lqw.like(StringUtils.isNotBlank(bo.getProductName()), OrderProduct::getProductName, bo.getProductName());
+        lqw.eq(StringUtils.isNotBlank(bo.getProductUnit()), OrderProduct::getProductUnit, bo.getProductUnit());
+        lqw.eq(StringUtils.isNotBlank(bo.getProductImage()), OrderProduct::getProductImage, bo.getProductImage());
+        lqw.eq(bo.getPlatformPrice() != null, OrderProduct::getPlatformPrice, bo.getPlatformPrice());
+        lqw.eq(bo.getMinOrderQuantity() != null, OrderProduct::getMinOrderQuantity, bo.getMinOrderQuantity());
+        lqw.eq(bo.getOrderPrice() != null, OrderProduct::getOrderPrice, bo.getOrderPrice());
+        lqw.eq(bo.getOrderQuantity() != null, OrderProduct::getOrderQuantity, bo.getOrderQuantity());
+        lqw.eq(bo.getSubtotal() != null, OrderProduct::getSubtotal, bo.getSubtotal());
+        lqw.eq(bo.getMinSellingPrice() != null, OrderProduct::getMinSellingPrice, bo.getMinSellingPrice());
+        lqw.eq(bo.getSignedQuantity() != null, OrderProduct::getSignedQuantity, bo.getSignedQuantity());
+        lqw.eq(bo.getQuantitySent() != null, OrderProduct::getQuantitySent, bo.getQuantitySent());
+        lqw.eq(bo.getUnsentQuantity() != null, OrderProduct::getUnsentQuantity, bo.getUnsentQuantity());
+        lqw.eq(StringUtils.isNotBlank(bo.getIsAfterSale()), OrderProduct::getIsAfterSale, bo.getIsAfterSale());
+        lqw.eq(bo.getAfterSaleQuantity() != null, OrderProduct::getAfterSaleQuantity, bo.getAfterSaleQuantity());
+        lqw.eq(bo.getReturnAmount() != null, OrderProduct::getReturnAmount, bo.getReturnAmount());
+        lqw.eq(bo.getPreDeliveryDate() != null, OrderProduct::getPreDeliveryDate, bo.getPreDeliveryDate());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), OrderProduct::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), OrderProduct::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增订单商品明细
+     *
+     * @param bo 订单商品明细
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(OrderProductBo bo) {
+        OrderProduct add = MapstructUtils.convert(bo, OrderProduct.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改订单商品明细
+     *
+     * @param bo 订单商品明细
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(OrderProductBo bo) {
+        OrderProduct update = MapstructUtils.convert(bo, OrderProduct.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(OrderProduct entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除订单商品明细信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

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

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

+ 7 - 0
ruoyi-modules/ruoyi-order/src/main/resources/mapper.order/OrderProductMapper.xml

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

+ 6 - 6
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ComCompanyController.java

@@ -49,7 +49,7 @@ public class ComCompanyController extends BaseController {
     /**
     /**
      * 导出公司信息列表
      * 导出公司信息列表
      */
      */
-    @SaCheckPermission("system:company:export")
+//    @SaCheckPermission("system:company:export")
     @Log(title = "公司信息", businessType = BusinessType.EXPORT)
     @Log(title = "公司信息", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     @PostMapping("/export")
     public void export(ComCompanyBo bo, HttpServletResponse response) {
     public void export(ComCompanyBo bo, HttpServletResponse response) {
@@ -62,7 +62,7 @@ public class ComCompanyController extends BaseController {
      *
      *
      * @param id 主键
      * @param id 主键
      */
      */
-    @SaCheckPermission("system:company:query")
+//    @SaCheckPermission("system:company:query")
     @GetMapping("/{id}")
     @GetMapping("/{id}")
     public R<ComCompanyVo> getInfo(@NotNull(message = "主键不能为空")
     public R<ComCompanyVo> getInfo(@NotNull(message = "主键不能为空")
                                    @PathVariable("id") Long id) {
                                    @PathVariable("id") Long id) {
@@ -72,7 +72,7 @@ public class ComCompanyController extends BaseController {
     /**
     /**
      * 新增公司信息
      * 新增公司信息
      */
      */
-    @SaCheckPermission("system:company:add")
+//    @SaCheckPermission("system:company:add")
     @Log(title = "公司信息", businessType = BusinessType.INSERT)
     @Log(title = "公司信息", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @RepeatSubmit()
     @PostMapping()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ComCompanyController extends BaseController {
     /**
     /**
      * 修改公司信息
      * 修改公司信息
      */
      */
-    @SaCheckPermission("system:company:edit")
+//    @SaCheckPermission("system:company:edit")
     @Log(title = "公司信息", businessType = BusinessType.UPDATE)
     @Log(title = "公司信息", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @RepeatSubmit()
     @PutMapping()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ComCompanyController extends BaseController {
      *
      *
      * @param ids 主键串
      * @param ids 主键串
      */
      */
-    @SaCheckPermission("system:company:remove")
+//    @SaCheckPermission("system:company:remove")
     @Log(title = "公司信息", businessType = BusinessType.DELETE)
     @Log(title = "公司信息", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
@@ -107,7 +107,7 @@ public class ComCompanyController extends BaseController {
     /**
     /**
      * 状态修改
      * 状态修改
      */
      */
-    @SaCheckPermission("system:company:edit")
+//    @SaCheckPermission("system:company:edit")
     @Log(title = "公司信息", businessType = BusinessType.UPDATE)
     @Log(title = "公司信息", businessType = BusinessType.UPDATE)
     @PutMapping("/changeStatus")
     @PutMapping("/changeStatus")
     public R<Void> changeStatus(@RequestBody ComCompanyBo bo) {
     public R<Void> changeStatus(@RequestBody ComCompanyBo bo) {

+ 112 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ComLogisticsCompanyController.java

@@ -0,0 +1,112 @@
+package org.dromara.system.controller.system;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.system.domain.bo.ComPostBo;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.ComLogisticsCompanyVo;
+import org.dromara.system.domain.bo.ComLogisticsCompanyBo;
+import org.dromara.system.service.IComLogisticsCompanyService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 物流公司
+ * 前端访问路由地址为:/system/logisticsCompany
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/logisticsCompany")
+public class ComLogisticsCompanyController extends BaseController {
+
+    private final IComLogisticsCompanyService comLogisticsCompanyService;
+
+    /**
+     * 查询物流公司列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<ComLogisticsCompanyVo> list(ComLogisticsCompanyBo bo, PageQuery pageQuery) {
+        return comLogisticsCompanyService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出物流公司列表
+     */
+    @Log(title = "物流公司", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ComLogisticsCompanyBo bo, HttpServletResponse response) {
+        List<ComLogisticsCompanyVo> list = comLogisticsCompanyService.queryList(bo);
+        ExcelUtil.exportExcel(list, "物流公司", ComLogisticsCompanyVo.class, response);
+    }
+
+    /**
+     * 获取物流公司详细信息
+     *
+     * @param id 主键
+     */
+    @GetMapping("/{id}")
+    public R<ComLogisticsCompanyVo> getInfo(@NotNull(message = "主键不能为空")
+                                            @PathVariable("id") Long id) {
+        return R.ok(comLogisticsCompanyService.queryById(id));
+    }
+
+    /**
+     * 新增物流公司
+     */
+    @Log(title = "物流公司", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ComLogisticsCompanyBo bo) {
+        return toAjax(comLogisticsCompanyService.insertByBo(bo));
+    }
+
+    /**
+     * 修改物流公司
+     */
+//    @SaCheckPermission("system:logisticsCompany:edit")
+    @Log(title = "物流公司", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ComLogisticsCompanyBo bo) {
+        return toAjax(comLogisticsCompanyService.updateByBo(bo));
+    }
+
+    /**
+     * 删除物流公司
+     *
+     * @param ids 主键串
+     */
+//    @SaCheckPermission("system:logisticsCompany:remove")
+    @Log(title = "物流公司", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(comLogisticsCompanyService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    /**
+     * 状态修改
+     */
+    @Log(title = "物流公司", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public R<Void> changeStatus(@RequestBody ComLogisticsCompanyBo bo) {
+        return toAjax(comLogisticsCompanyService.updateStatus(bo));
+    }
+}

+ 116 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ComWarehouseController.java

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

+ 4 - 5
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/InvoiceTypeController.java

@@ -48,7 +48,6 @@ public class InvoiceTypeController extends BaseController {
     /**
     /**
      * 导出发票类型列表
      * 导出发票类型列表
      */
      */
-    @SaCheckPermission("system:invoiceType:export")
     @Log(title = "发票类型", businessType = BusinessType.EXPORT)
     @Log(title = "发票类型", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     @PostMapping("/export")
     public void export(InvoiceTypeBo bo, HttpServletResponse response) {
     public void export(InvoiceTypeBo bo, HttpServletResponse response) {
@@ -61,7 +60,7 @@ public class InvoiceTypeController extends BaseController {
      *
      *
      * @param id 主键
      * @param id 主键
      */
      */
-    @SaCheckPermission("system:invoiceType:query")
+//    @SaCheckPermission("system:invoiceType:query")
     @GetMapping("/{id}")
     @GetMapping("/{id}")
     public R<InvoiceTypeVo> getInfo(@NotNull(message = "主键不能为空")
     public R<InvoiceTypeVo> getInfo(@NotNull(message = "主键不能为空")
                                     @PathVariable("id") Long id) {
                                     @PathVariable("id") Long id) {
@@ -71,7 +70,7 @@ public class InvoiceTypeController extends BaseController {
     /**
     /**
      * 新增发票类型
      * 新增发票类型
      */
      */
-    @SaCheckPermission("system:invoiceType:add")
+//    @SaCheckPermission("system:invoiceType:add")
     @Log(title = "发票类型", businessType = BusinessType.INSERT)
     @Log(title = "发票类型", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @RepeatSubmit()
     @PostMapping()
     @PostMapping()
@@ -82,7 +81,7 @@ public class InvoiceTypeController extends BaseController {
     /**
     /**
      * 修改发票类型
      * 修改发票类型
      */
      */
-    @SaCheckPermission("system:invoiceType:edit")
+//    @SaCheckPermission("system:invoiceType:edit")
     @Log(title = "发票类型", businessType = BusinessType.UPDATE)
     @Log(title = "发票类型", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @RepeatSubmit()
     @PutMapping()
     @PutMapping()
@@ -95,7 +94,7 @@ public class InvoiceTypeController extends BaseController {
      *
      *
      * @param ids 主键串
      * @param ids 主键串
      */
      */
-    @SaCheckPermission("system:invoiceType:remove")
+//    @SaCheckPermission("system:invoiceType:remove")
     @Log(title = "发票类型", businessType = BusinessType.DELETE)
     @Log(title = "发票类型", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 67 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ComLogisticsCompany.java

@@ -0,0 +1,67 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 物流公司对象 com_logistics_company
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("com_logistics_company")
+public class ComLogisticsCompany extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 物流公司编码
+     */
+    private String logisticsCode;
+
+    /**
+     * 物流公司名称
+     */
+    private String logisticsName;
+
+    /**
+     * 物流公司描述
+     */
+    private String logisticsDescription;
+
+    /**
+     * 是否显示
+     */
+    private String isShow;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 157 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ComWarehouse.java

@@ -0,0 +1,157 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 仓库信息对象 com_warehouse
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("com_warehouse")
+public class ComWarehouse extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 仓库编码
+     */
+    private String warehouseCode;
+
+    /**
+     * 仓库名称
+     */
+    private String warehouseName;
+
+    /**
+     * 库存状态
+     */
+    private String stkStu;
+
+    /**
+     * 所属公司
+     */
+    private Long companyId;
+
+    /**
+     * 省份
+     */
+    private String province;
+
+    /**
+     * 城市
+     */
+    private String city;
+
+    /**
+     * 区/县
+     */
+    private String district;
+
+    /**
+     * 省市区
+     */
+    private String provinceCityDistrict;
+
+    /**
+     * 仓库类型
+     */
+    private String warehouseType;
+
+    /**
+     * 仓库功能
+     */
+    private String warehouseFunction;
+
+    /**
+     * 是否支持发货
+     */
+    private String isShip;
+
+    /**
+     * 是否支持退货
+     */
+    private String isReturn;
+
+    /**
+     * 是否默认仓库
+     */
+    private String isDefault;
+
+    /**
+     * 是否前台展示
+     */
+    private String isShow;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 联系人姓名
+     */
+    private String contacts;
+
+    /**
+     * 手机号
+     */
+    private String mobile;
+
+    /**
+     * 固定电话
+     */
+    private String phone;
+
+    /**
+     * 详细地址
+     */
+    private String address;
+
+    /**
+     * 邮政编码
+     */
+    private String zipCode;
+
+    /**
+     * 最大配送时效(天)
+     */
+    private Long maxLeadTime;
+
+    /**
+     * 最小配送时效(天)
+     */
+    private Long minLeadTime;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 60 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ComLogisticsCompanyBo.java

@@ -0,0 +1,60 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.ComLogisticsCompany;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 物流公司业务对象 com_logistics_company
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ComLogisticsCompany.class, reverseConvertGenerate = false)
+public class ComLogisticsCompanyBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 物流公司编码
+     */
+    private String logisticsCode;
+
+    /**
+     * 物流公司名称
+     */
+    @NotBlank(message = "物流公司名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String logisticsName;
+
+    /**
+     * 物流公司描述
+     */
+    private String logisticsDescription;
+
+    /**
+     * 是否显示
+     */
+    private String isShow;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 151 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ComWarehouseBo.java

@@ -0,0 +1,151 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.ComWarehouse;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 仓库信息业务对象 com_warehouse
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ComWarehouse.class, reverseConvertGenerate = false)
+public class ComWarehouseBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 仓库编码
+     */
+    private String warehouseCode;
+
+    /**
+     * 仓库名称
+     */
+    @NotBlank(message = "仓库名称不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String warehouseName;
+
+    /**
+     * 库存状态
+     */
+    private String stkStu;
+
+    /**
+     * 所属公司
+     */
+    @NotNull(message = "所属公司不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long companyId;
+
+    /**
+     * 省份
+     */
+    private String province;
+
+    /**
+     * 城市
+     */
+    private String city;
+
+    /**
+     * 区/县
+     */
+    private String district;
+
+    /**
+     * 省市区
+     */
+    private String provinceCityDistrict;
+
+    /**
+     * 仓库类型
+     */
+    private String warehouseType;
+
+    /**
+     * 仓库功能
+     */
+    private String warehouseFunction;
+
+    /**
+     * 是否支持发货
+     */
+    private String isShip;
+
+    /**
+     * 是否支持退货
+     */
+    private String isReturn;
+
+    /**
+     * 是否默认仓库
+     */
+    private String isDefault;
+
+    /**
+     * 是否前台展示
+     */
+    private String isShow;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 联系人姓名
+     */
+    private String contacts;
+
+    /**
+     * 手机号
+     */
+    private String mobile;
+
+    /**
+     * 固定电话
+     */
+    private String phone;
+
+    /**
+     * 详细地址
+     */
+    private String address;
+
+    /**
+     * 邮政编码
+     */
+    private String zipCode;
+
+    /**
+     * 最大配送时效(天)
+     */
+    private Long maxLeadTime;
+
+    /**
+     * 最小配送时效(天)
+     */
+    private Long minLeadTime;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 75 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ComLogisticsCompanyVo.java

@@ -0,0 +1,75 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.ComLogisticsCompany;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 物流公司视图对象 com_logistics_company
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ComLogisticsCompany.class)
+public class ComLogisticsCompanyVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 物流公司编码
+     */
+    @ExcelProperty(value = "物流公司编码")
+    private String logisticsCode;
+
+    /**
+     * 物流公司名称
+     */
+    @ExcelProperty(value = "物流公司名称")
+    private String logisticsName;
+
+    /**
+     * 物流公司描述
+     */
+    @ExcelProperty(value = "物流公司描述")
+    private String logisticsDescription;
+
+    /**
+     * 是否显示
+     */
+    @ExcelProperty(value = "是否显示", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_platform_yes_no")
+    private String isShow;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 190 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ComWarehouseVo.java

@@ -0,0 +1,190 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.ComWarehouse;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 仓库信息视图对象 com_warehouse
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ComWarehouse.class)
+public class ComWarehouseVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 仓库编码
+     */
+    @ExcelProperty(value = "仓库编码")
+    private String warehouseCode;
+
+    /**
+     * 仓库名称
+     */
+    @ExcelProperty(value = "仓库名称")
+    private String warehouseName;
+
+    /**
+     * 库存状态
+     */
+    @ExcelProperty(value = "库存状态")
+    private String stkStu;
+
+    /**
+     * 所属公司
+     */
+    @ExcelProperty(value = "所属公司")
+    private Long companyId;
+
+    /**
+     * 省份
+     */
+    @ExcelProperty(value = "省份")
+    private String province;
+
+    /**
+     * 城市
+     */
+    @ExcelProperty(value = "城市")
+    private String city;
+
+    /**
+     * 区/县
+     */
+    @ExcelProperty(value = "区/县")
+    private String district;
+
+    /**
+     * 省市区
+     */
+    @ExcelProperty(value = "省市区")
+    private String provinceCityDistrict;
+
+    /**
+     * 仓库类型
+     */
+    @ExcelProperty(value = "仓库类型")
+    private String warehouseType;
+
+    /**
+     * 仓库功能
+     */
+    @ExcelProperty(value = "仓库功能")
+    private String warehouseFunction;
+
+    /**
+     * 是否支持发货
+     */
+    @ExcelProperty(value = "是否支持发货", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_platform_yes_no")
+    private String isShip;
+
+    /**
+     * 是否支持退货
+     */
+    @ExcelProperty(value = "是否支持退货", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_platform_yes_no")
+    private String isReturn;
+
+    /**
+     * 是否默认仓库
+     */
+    @ExcelProperty(value = "是否默认仓库", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_platform_yes_no")
+    private String isDefault;
+
+    /**
+     * 是否前台展示
+     */
+    @ExcelProperty(value = "是否前台展示", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_platform_yes_no")
+    private String isShow;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+     * 联系人姓名
+     */
+    @ExcelProperty(value = "联系人姓名")
+    private String contacts;
+
+    /**
+     * 手机号
+     */
+    @ExcelProperty(value = "手机号")
+    private String mobile;
+
+    /**
+     * 固定电话
+     */
+    @ExcelProperty(value = "固定电话")
+    private String phone;
+
+    /**
+     * 详细地址
+     */
+    @ExcelProperty(value = "详细地址")
+    private String address;
+
+    /**
+     * 邮政编码
+     */
+    @ExcelProperty(value = "邮政编码")
+    private String zipCode;
+
+    /**
+     * 最大配送时效(天)
+     */
+    @ExcelProperty(value = "最大配送时效", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "天=")
+    private Long maxLeadTime;
+
+    /**
+     * 最小配送时效(天)
+     */
+    @ExcelProperty(value = "最小配送时效", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "天=")
+    private Long minLeadTime;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    private String companyName;
+
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.ComLogisticsCompany;
+import org.dromara.system.domain.vo.ComLogisticsCompanyVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 物流公司Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface ComLogisticsCompanyMapper extends BaseMapperPlus<ComLogisticsCompany, ComLogisticsCompanyVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.ComWarehouse;
+import org.dromara.system.domain.vo.ComWarehouseVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 仓库信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+public interface ComWarehouseMapper extends BaseMapperPlus<ComWarehouse, ComWarehouseVo> {
+
+}

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

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

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

@@ -0,0 +1,76 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.ComWarehouse;
+import org.dromara.system.domain.bo.ComStaffBo;
+import org.dromara.system.domain.vo.ComWarehouseVo;
+import org.dromara.system.domain.bo.ComWarehouseBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 仓库信息Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+public interface IComWarehouseService extends IService<ComWarehouse> {
+
+    /**
+     * 查询仓库信息
+     *
+     * @param id 主键
+     * @return 仓库信息
+     */
+    ComWarehouseVo queryById(Long id);
+
+    /**
+     * 分页查询仓库信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 仓库信息分页列表
+     */
+    TableDataInfo<ComWarehouseVo> queryPageList(ComWarehouseBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的仓库信息列表
+     *
+     * @param bo 查询条件
+     * @return 仓库信息列表
+     */
+    List<ComWarehouseVo> queryList(ComWarehouseBo bo);
+
+    /**
+     * 新增仓库信息
+     *
+     * @param bo 仓库信息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ComWarehouseBo bo);
+
+    /**
+     * 修改仓库信息
+     *
+     * @param bo 仓库信息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ComWarehouseBo bo);
+
+    /**
+     * 修改状态
+     */
+    int updateStatus(ComWarehouseBo bo);
+
+    /**
+     * 校验并批量删除仓库信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -118,7 +118,6 @@ public class ComCompanyServiceImpl extends ServiceImpl<ComCompanyMapper, ComComp
     @Override
     @Override
     public Boolean insertByBo(ComCompanyBo bo) {
     public Boolean insertByBo(ComCompanyBo bo) {
 
 
-
         bo.setCompanyCode(SequenceUtils.nextPaddedIdStr(COMPANY_CODE_KEY, Duration.ofDays(3650), 4));
         bo.setCompanyCode(SequenceUtils.nextPaddedIdStr(COMPANY_CODE_KEY, Duration.ofDays(3650), 4));
         ComCompany add = MapstructUtils.convert(bo, ComCompany.class);
         ComCompany add = MapstructUtils.convert(bo, ComCompany.class);
         validEntityBeforeSave(add);
         validEntityBeforeSave(add);

+ 159 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ComLogisticsCompanyServiceImpl.java

@@ -0,0 +1,159 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.redis.utils.SequenceUtils;
+import org.dromara.system.domain.ComPost;
+import org.dromara.system.domain.bo.ComPostBo;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.ComLogisticsCompanyBo;
+import org.dromara.system.domain.vo.ComLogisticsCompanyVo;
+import org.dromara.system.domain.ComLogisticsCompany;
+import org.dromara.system.mapper.ComLogisticsCompanyMapper;
+import org.dromara.system.service.IComLogisticsCompanyService;
+
+import java.time.Duration;
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 物流公司Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ComLogisticsCompanyServiceImpl extends ServiceImpl<ComLogisticsCompanyMapper, ComLogisticsCompany> implements IComLogisticsCompanyService {
+
+    private static final String LOGISTICS_CODE_KEY = "com_logistics_company:logistics_code";
+
+    private final ComLogisticsCompanyMapper baseMapper;
+
+    /**
+     * 查询物流公司
+     *
+     * @param id 主键
+     * @return 物流公司
+     */
+    @Override
+    public ComLogisticsCompanyVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询物流公司列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 物流公司分页列表
+     */
+    @Override
+    public TableDataInfo<ComLogisticsCompanyVo> queryPageList(ComLogisticsCompanyBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ComLogisticsCompany> lqw = buildQueryWrapper(bo);
+        Page<ComLogisticsCompanyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的物流公司列表
+     *
+     * @param bo 查询条件
+     * @return 物流公司列表
+     */
+    @Override
+    public List<ComLogisticsCompanyVo> queryList(ComLogisticsCompanyBo bo) {
+        LambdaQueryWrapper<ComLogisticsCompany> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ComLogisticsCompany> buildQueryWrapper(ComLogisticsCompanyBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ComLogisticsCompany> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ComLogisticsCompany::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getLogisticsCode()), ComLogisticsCompany::getLogisticsCode, bo.getLogisticsCode());
+        lqw.like(StringUtils.isNotBlank(bo.getLogisticsName()), ComLogisticsCompany::getLogisticsName, bo.getLogisticsName());
+        lqw.eq(StringUtils.isNotBlank(bo.getLogisticsDescription()), ComLogisticsCompany::getLogisticsDescription, bo.getLogisticsDescription());
+        lqw.eq(StringUtils.isNotBlank(bo.getIsShow()), ComLogisticsCompany::getIsShow, bo.getIsShow());
+        lqw.eq(StringUtils.isNotBlank(bo.getDataSource()), ComLogisticsCompany::getDataSource, bo.getDataSource());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ComLogisticsCompany::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增物流公司
+     *
+     * @param bo 物流公司
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ComLogisticsCompanyBo bo) {
+        bo.setLogisticsCode(SequenceUtils.nextPaddedIdStr(LOGISTICS_CODE_KEY, Duration.ofDays(3650), 4));
+        ComLogisticsCompany add = MapstructUtils.convert(bo, ComLogisticsCompany.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改物流公司
+     *
+     * @param bo 物流公司
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ComLogisticsCompanyBo bo) {
+        ComLogisticsCompany update = MapstructUtils.convert(bo, ComLogisticsCompany.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 修改状态
+     *
+     * @param bo 信息
+     * @return 结果
+     */
+    @Override
+    public int updateStatus(ComLogisticsCompanyBo bo) {
+        ComLogisticsCompany company = new ComLogisticsCompany();
+        company.setId(bo.getId());
+        company.setIsShow(bo.getIsShow());
+        return baseMapper.updateById(company);
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ComLogisticsCompany entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除物流公司信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 199 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ComWarehouseServiceImpl.java

@@ -0,0 +1,199 @@
+package org.dromara.system.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.redis.utils.SequenceUtils;
+import org.dromara.system.domain.ComCompany;
+import org.dromara.system.domain.ComWarehouse;
+import org.dromara.system.domain.bo.ComWarehouseBo;
+import org.dromara.system.domain.vo.ComWarehouseVo;
+import org.dromara.system.mapper.ComCompanyMapper;
+import org.dromara.system.mapper.ComWarehouseMapper;
+import org.dromara.system.service.IComWarehouseService;
+import org.springframework.stereotype.Service;
+
+import java.time.Duration;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 仓库信息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-26
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ComWarehouseServiceImpl extends ServiceImpl<ComWarehouseMapper, ComWarehouse> implements IComWarehouseService {
+
+    private static final String WAREHOUSE_CODE_KEY = "com_warehouse:warehouse_code";
+
+    private final ComWarehouseMapper baseMapper;
+
+    private final ComCompanyMapper companyMapper;
+
+    /**
+     * 查询仓库信息
+     *
+     * @param id 主键
+     * @return 仓库信息
+     */
+    @Override
+    public ComWarehouseVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询仓库信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 仓库信息分页列表
+     */
+    @Override
+    public TableDataInfo<ComWarehouseVo> queryPageList(ComWarehouseBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ComWarehouse> lqw = buildQueryWrapper(bo);
+        Page<ComWarehouseVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<ComWarehouseVo> records = result.getRecords();
+        if (CollUtil.isNotEmpty(records)) {
+            Set<Long> companyIds = records.stream()
+                .map(ComWarehouseVo::getCompanyId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+            Map<Long, String> companyMap = companyMapper.selectBatchIds(companyIds).stream()
+                .collect(Collectors.toMap(
+                    ComCompany::getId,
+                    ComCompany::getCompanyName,
+                    (oldVal, newVal) -> newVal,
+                    HashMap::new
+                ));
+
+            records.forEach(vo ->
+                vo.setCompanyName(companyMap.get(vo.getCompanyId()))
+            );
+        }
+
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的仓库信息列表
+     *
+     * @param bo 查询条件
+     * @return 仓库信息列表
+     */
+    @Override
+    public List<ComWarehouseVo> queryList(ComWarehouseBo bo) {
+        LambdaQueryWrapper<ComWarehouse> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ComWarehouse> buildQueryWrapper(ComWarehouseBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ComWarehouse> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ComWarehouse::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getWarehouseCode()), ComWarehouse::getWarehouseCode, bo.getWarehouseCode());
+        lqw.like(StringUtils.isNotBlank(bo.getWarehouseName()), ComWarehouse::getWarehouseName, bo.getWarehouseName());
+        lqw.eq(StringUtils.isNotBlank(bo.getStkStu()), ComWarehouse::getStkStu, bo.getStkStu());
+        lqw.eq(bo.getCompanyId() != null, ComWarehouse::getCompanyId, bo.getCompanyId());
+        lqw.eq(StringUtils.isNotBlank(bo.getProvince()), ComWarehouse::getProvince, bo.getProvince());
+        lqw.eq(StringUtils.isNotBlank(bo.getCity()), ComWarehouse::getCity, bo.getCity());
+        lqw.eq(StringUtils.isNotBlank(bo.getDistrict()), ComWarehouse::getDistrict, bo.getDistrict());
+        lqw.eq(StringUtils.isNotBlank(bo.getProvinceCityDistrict()), ComWarehouse::getProvinceCityDistrict, bo.getProvinceCityDistrict());
+        lqw.eq(StringUtils.isNotBlank(bo.getWarehouseType()), ComWarehouse::getWarehouseType, bo.getWarehouseType());
+        lqw.eq(StringUtils.isNotBlank(bo.getWarehouseFunction()), ComWarehouse::getWarehouseFunction, bo.getWarehouseFunction());
+        lqw.eq(StringUtils.isNotBlank(bo.getIsShip()), ComWarehouse::getIsShip, bo.getIsShip());
+        lqw.eq(StringUtils.isNotBlank(bo.getIsReturn()), ComWarehouse::getIsReturn, bo.getIsReturn());
+        lqw.eq(StringUtils.isNotBlank(bo.getIsDefault()), ComWarehouse::getIsDefault, bo.getIsDefault());
+        lqw.eq(StringUtils.isNotBlank(bo.getIsShow()), ComWarehouse::getIsShow, bo.getIsShow());
+        lqw.eq(StringUtils.isNotBlank(bo.getDataSource()), ComWarehouse::getDataSource, bo.getDataSource());
+        lqw.eq(StringUtils.isNotBlank(bo.getContacts()), ComWarehouse::getContacts, bo.getContacts());
+        lqw.eq(StringUtils.isNotBlank(bo.getMobile()), ComWarehouse::getMobile, bo.getMobile());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), ComWarehouse::getPhone, bo.getPhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getAddress()), ComWarehouse::getAddress, bo.getAddress());
+        lqw.eq(StringUtils.isNotBlank(bo.getZipCode()), ComWarehouse::getZipCode, bo.getZipCode());
+        lqw.eq(bo.getMaxLeadTime() != null, ComWarehouse::getMaxLeadTime, bo.getMaxLeadTime());
+        lqw.eq(bo.getMinLeadTime() != null, ComWarehouse::getMinLeadTime, bo.getMinLeadTime());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ComWarehouse::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ComWarehouse::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增仓库信息
+     *
+     * @param bo 仓库信息
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ComWarehouseBo bo) {
+        bo.setWarehouseCode(SequenceUtils.nextPaddedIdStr(WAREHOUSE_CODE_KEY, Duration.ofDays(3650), 5));
+        ComWarehouse add = MapstructUtils.convert(bo, ComWarehouse.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改仓库信息
+     *
+     * @param bo 仓库信息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ComWarehouseBo bo) {
+        ComWarehouse update = MapstructUtils.convert(bo, ComWarehouse.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 修改显示状态
+     *
+     * @param bo 信息
+     * @return 结果
+     */
+    @Override
+    public int updateStatus(ComWarehouseBo bo) {
+        ComWarehouse warehouse = new ComWarehouse();
+        warehouse.setId(bo.getId());
+        warehouse.setIsShow(bo.getIsShow());
+        return baseMapper.updateById(warehouse);
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ComWarehouse entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除仓库信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ComLogisticsCompanyMapper.xml

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

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ComWarehouseMapper.xml

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