Browse Source

zl-1-8-后端

林小张 3 months ago
parent
commit
c6aab3049b
97 changed files with 5977 additions and 47 deletions
  1. 10 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerInfoController.java
  2. 22 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerSalesInfoController.java
  3. 5 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/MaintenanceServerTime.java
  4. 7 7
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInfoBo.java
  5. 5 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MaintenanceServerTimeBo.java
  6. 45 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MessagePublishCustomerBo.java
  7. 6 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/MaintenanceServerTimeVo.java
  8. 80 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/MessagePublishCustomerVo.java
  9. 9 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerInfoMapper.java
  10. 11 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerInfoService.java
  11. 18 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerSalesInfoService.java
  12. 17 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java
  13. 46 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerSalesInfoServiceImpl.java
  14. 46 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerInfoMapper.xml
  15. 8 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBaseController.java
  16. 1 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductExtend.java
  17. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBaseVo.java
  18. 64 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/RecommendProductVo.java
  19. 11 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductBaseMapper.java
  20. 10 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductBaseService.java
  21. 97 37
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java
  22. 59 0
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductBaseMapper.xml
  23. 55 3
      ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysSmsController.java
  24. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAdaptSceneController.java
  25. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAddressAreaController.java
  26. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOperationMessageController.java
  27. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPriceRangeController.java
  28. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProjectTypeController.java
  29. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPurchaseCategoryController.java
  30. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRuleCategoryController.java
  31. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRuleCenterController.java
  32. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysServiceTimeController.java
  33. 57 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAdaptScene.java
  34. 82 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAddressArea.java
  35. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java
  36. 99 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperationMessage.java
  37. 62 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPriceRange.java
  38. 57 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysProjectType.java
  39. 72 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPurchaseCategory.java
  40. 84 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRuleCategory.java
  41. 84 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRuleCenter.java
  42. 62 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysServiceTime.java
  43. 53 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAdaptSceneBo.java
  44. 82 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAddressAreaBo.java
  45. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java
  46. 99 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperationMessageBo.java
  47. 59 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPriceRangeBo.java
  48. 53 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysProjectTypeBo.java
  49. 71 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPurchaseCategoryBo.java
  50. 83 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRuleCategoryBo.java
  51. 83 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRuleCenterBo.java
  52. 57 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysServiceTimeBo.java
  53. 63 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAdaptSceneVo.java
  54. 94 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAddressAreaVo.java
  55. 123 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperationMessageVo.java
  56. 69 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPriceRangeVo.java
  57. 63 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysProjectTypeVo.java
  58. 81 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPurchaseCategoryVo.java
  59. 100 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRuleCategoryVo.java
  60. 112 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRuleCenterVo.java
  61. 78 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysServiceTimeVo.java
  62. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAdaptSceneMapper.java
  63. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAddressAreaMapper.java
  64. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperationMessageMapper.java
  65. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPriceRangeMapper.java
  66. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysProjectTypeMapper.java
  67. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPurchaseCategoryMapper.java
  68. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRuleCategoryMapper.java
  69. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRuleCenterMapper.java
  70. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysServiceTimeMapper.java
  71. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAdaptSceneService.java
  72. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAddressAreaService.java
  73. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperationMessageService.java
  74. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPriceRangeService.java
  75. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysProjectTypeService.java
  76. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPurchaseCategoryService.java
  77. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRuleCategoryService.java
  78. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRuleCenterService.java
  79. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysServiceTimeService.java
  80. 161 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAdaptSceneServiceImpl.java
  81. 140 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAddressAreaServiceImpl.java
  82. 166 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperationMessageServiceImpl.java
  83. 162 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPriceRangeServiceImpl.java
  84. 161 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysProjectTypeServiceImpl.java
  85. 164 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPurchaseCategoryServiceImpl.java
  86. 187 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRuleCategoryServiceImpl.java
  87. 141 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRuleCenterServiceImpl.java
  88. 174 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysServiceTimeServiceImpl.java
  89. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAdaptSceneMapper.xml
  90. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAddressAreaMapper.xml
  91. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperationMessageMapper.xml
  92. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPriceRangeMapper.xml
  93. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysProjectTypeMapper.xml
  94. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPurchaseCategoryMapper.xml
  95. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRuleCategoryMapper.xml
  96. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRuleCenterMapper.xml
  97. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysServiceTimeMapper.xml

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

@@ -8,8 +8,10 @@ import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import org.dromara.customer.domain.CustomerSalesInfo;
 import org.dromara.customer.domain.bo.CustomerSalesInfoBo;
+import org.dromara.customer.domain.bo.MessagePublishCustomerBo;
 import org.dromara.customer.domain.dto.SetCustomerInfoTagDto;
 import org.dromara.customer.domain.vo.ContractVo;
+import org.dromara.customer.domain.vo.MessagePublishCustomerVo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -49,6 +51,14 @@ public class CustomerInfoController extends BaseController {
         return customerInfoService.queryPageList(bo, pageQuery);
     }
 
+    /**
+     * 消息发布-查询客户列表
+     */
+    @GetMapping("/messagePublishList")
+    public TableDataInfo<MessagePublishCustomerVo> messagePublishList(MessagePublishCustomerBo bo, PageQuery pageQuery) {
+        return customerInfoService.queryMessagePublishCustomerPage(bo, pageQuery);
+    }
+
     /**
      * 查询合同管理
      */

+ 22 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerSalesInfoController.java

@@ -1,6 +1,7 @@
 package org.dromara.customer.controller;
 
 import java.util.List;
+import java.util.Map;
 
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
@@ -97,4 +98,25 @@ public class CustomerSalesInfoController extends BaseController {
                           @PathVariable("ids") Long[] ids) {
         return toAjax(customerSalesInfoService.deleteWithValidByIds(List.of(ids), true));
     }
+
+    /**
+     * 分配业务人员
+     */
+    @Log(title = "分配业务人员", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/assignStaff")
+    public R<Void> assignStaff(@RequestBody Map<String, Object> params) {
+        Long customerId = Long.valueOf(params.get("customerId").toString());
+        Long salesPersonId = params.get("salesPersonId") != null ? Long.valueOf(params.get("salesPersonId").toString()) : null;
+        Long serviceStaffId = params.get("serviceStaffId") != null ? Long.valueOf(params.get("serviceStaffId").toString()) : null;
+        return toAjax(customerSalesInfoService.assignStaff(customerId, salesPersonId, serviceStaffId));
+    }
+
+    /**
+     * 根据客户ID获取销售信息
+     */
+    @GetMapping("/getByCustomerId/{customerId}")
+    public R<CustomerSalesInfoVo> getByCustomerId(@PathVariable("customerId") Long customerId) {
+        return R.ok(customerSalesInfoService.queryByCustomerId(customerId));
+    }
 }

+ 5 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/MaintenanceServerTime.java

@@ -32,6 +32,11 @@ public class MaintenanceServerTime extends TenantEntity {
      */
     private String timeName;
 
+    /**
+     * 类型值
+     */
+    private Integer typeValue;
+
     /**
      * 状态(0正常 1停用)
      */

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

@@ -33,13 +33,13 @@ public class CustomerInfoBo extends BaseEntity {
     /**
      * 客户编号
      */
-    @NotBlank(message = "客户编号不能为空", groups = {AddGroup.class, EditGroup.class})
+//    @NotBlank(message = "客户编号不能为空", groups = {AddGroup.class, EditGroup.class})
     private String customerNo;
 
     /**
      * 所属公司
      */
-    @NotNull(message = "所属公司不能为空", groups = {AddGroup.class, EditGroup.class})
+//    @NotNull(message = "所属公司不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long belongCompanyId;
 
     private Long belongDeptId;
@@ -57,25 +57,25 @@ public class CustomerInfoBo extends BaseEntity {
     /**
      * 工商名称
      */
-    @NotBlank(message = "工商名称不能为空", groups = {AddGroup.class, EditGroup.class})
+//    @NotBlank(message = "工商名称不能为空", groups = {AddGroup.class, EditGroup.class})
     private String businessCustomerName;
 
     /**
      * 企业简称
      */
-    @NotBlank(message = "企业简称不能为空", groups = {AddGroup.class, EditGroup.class})
+//    @NotBlank(message = "企业简称不能为空", groups = {AddGroup.class, EditGroup.class})
     private String shortName;
 
     /**
      * 开票类型
      */
-    @NotNull(message = "开票类型不能为空", groups = {AddGroup.class, EditGroup.class})
+//    @NotNull(message = "开票类型不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long invoiceTypeId;
 
     /**
      * 企业规模
      */
-    @NotNull(message = "企业规模不能为空", groups = {AddGroup.class, EditGroup.class})
+//    @NotNull(message = "企业规模不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long enterpriseScaleId;
 
     /**
@@ -86,7 +86,7 @@ public class CustomerInfoBo extends BaseEntity {
     /**
      * 行业类别
      */
-    @NotNull(message = "行业类别不能为空", groups = {AddGroup.class, EditGroup.class})
+//    @NotNull(message = "行业类别不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long industryCategoryId;
 
     /**

+ 5 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MaintenanceServerTimeBo.java

@@ -31,6 +31,11 @@ public class MaintenanceServerTimeBo extends BaseEntity {
     @NotBlank(message = "时间类型不能为空", groups = { AddGroup.class, EditGroup.class })
     private String timeName;
 
+    /**
+     * 类型值(月数)
+     */
+    private Integer typeValue;
+
     /**
      * 状态(0正常 1停用)
      */

+ 45 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/MessagePublishCustomerBo.java

@@ -0,0 +1,45 @@
+package org.dromara.customer.domain.bo;
+
+import lombok.Data;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+import java.util.List;
+
+/**
+ * 消息发布-客户查询条件Bo
+ *
+ * @author yoe
+ * @date 2026-01-06
+ */
+@Data
+public class MessagePublishCustomerBo extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 行业分类ID
+     */
+    private Long industryCategoryId;
+
+    /**
+     * 采购体量(客户等级ID)
+     */
+    private Long customerLevelId;
+
+    /**
+     * 企业规模ID
+     */
+    private Long enterpriseScaleId;
+
+    /**
+     * 采购标签ID
+     */
+    private Long tagId;
+
+    /**
+     * 平台标识
+     */
+    private String platformCode;
+}

+ 6 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/MaintenanceServerTimeVo.java

@@ -40,6 +40,12 @@ public class MaintenanceServerTimeVo implements Serializable {
     @ExcelProperty(value = "时间类型")
     private String timeName;
 
+    /**
+     * 类型值(月数)
+     */
+    @ExcelProperty(value = "类型值")
+    private Integer typeValue;
+
     /**
      * 状态(0正常 1停用)
      */

+ 80 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/MessagePublishCustomerVo.java

@@ -0,0 +1,80 @@
+package org.dromara.customer.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 消息发布-客户列表VO
+ *
+ * @author yoe
+ * @date 2026-01-06
+ */
+@Data
+public class MessagePublishCustomerVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 客户ID
+     */
+    private Long id;
+
+    /**
+     * 企业ID(客户编号)
+     */
+    private String customerNo;
+
+    /**
+     * 企业名称
+     */
+    private String companyName;
+
+    /**
+     * 行业类别ID
+     */
+    private Long industryCategoryId;
+
+    /**
+     * 行业类别名称
+     */
+    private String industryCategoryName;
+
+    /**
+     * 员工数(暂无数据)
+     */
+    private Integer employeeCount;
+
+    /**
+     * 账期(天)
+     */
+    private Integer accountPeriod;
+
+    /**
+     * 信用额度
+     */
+    private BigDecimal creditAmount;
+
+    /**
+     * 剩余额度
+     */
+    private BigDecimal remainingQuota;
+
+    /**
+     * 应收账款
+     */
+    private BigDecimal accountsReceivable;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 主联系人手机号
+     */
+    private String phone;
+}

+ 9 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/CustomerInfoMapper.java

@@ -1,8 +1,12 @@
 package org.dromara.customer.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 import org.dromara.customer.domain.CustomerInfo;
+import org.dromara.customer.domain.bo.MessagePublishCustomerBo;
 import org.dromara.customer.domain.vo.CustomerInfoVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.customer.domain.vo.MessagePublishCustomerVo;
 
 /**
  * 客户信息Mapper接口
@@ -12,4 +16,9 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  */
 public interface CustomerInfoMapper extends BaseMapperPlus<CustomerInfo, CustomerInfoVo> {
 
+    /**
+     * 消息发布-分页查询客户列表
+     */
+    Page<MessagePublishCustomerVo> selectMessagePublishCustomerPage(@Param("page") Page<MessagePublishCustomerVo> page,
+                                                                     @Param("bo") MessagePublishCustomerBo bo);
 }

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

@@ -2,11 +2,13 @@ package org.dromara.customer.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.dromara.customer.domain.CustomerInfo;
+import org.dromara.customer.domain.bo.MessagePublishCustomerBo;
 import org.dromara.customer.domain.vo.ContractVo;
 import org.dromara.customer.domain.vo.CustomerInfoVo;
 import org.dromara.customer.domain.bo.CustomerInfoBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.customer.domain.vo.MessagePublishCustomerVo;
 
 import java.math.BigDecimal;
 import java.util.Collection;
@@ -46,6 +48,15 @@ public interface ICustomerInfoService extends IService<CustomerInfo> {
      */
     TableDataInfo<ContractVo> queryContractPageList(CustomerInfoBo bo, PageQuery pageQuery);
 
+    /**
+     * 消息发布-分页查询客户列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户列表
+     */
+    TableDataInfo<MessagePublishCustomerVo> queryMessagePublishCustomerPage(MessagePublishCustomerBo bo, PageQuery pageQuery);
+
     /**
      * 查询符合条件的客户信息列表
      *

+ 18 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerSalesInfoService.java

@@ -67,4 +67,22 @@ public interface ICustomerSalesInfoService extends IService<CustomerSalesInfo>{
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 分配业务人员
+     *
+     * @param customerId 客户ID
+     * @param salesPersonId 销售人员ID
+     * @param serviceStaffId 服务人员ID
+     * @return 是否成功
+     */
+    Boolean assignStaff(Long customerId, Long salesPersonId, Long serviceStaffId);
+
+    /**
+     * 根据客户ID查询销售信息
+     *
+     * @param customerId 客户ID
+     * @return 销售信息
+     */
+    CustomerSalesInfoVo queryByCustomerId(Long customerId);
 }

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

@@ -384,6 +384,23 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
         return vo;
     }
 
+    /**
+     * 消息发布-分页查询客户列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客户列表
+     */
+    @Override
+    public TableDataInfo<MessagePublishCustomerVo> queryMessagePublishCustomerPage(MessagePublishCustomerBo bo, PageQuery pageQuery) {
+        // 设置平台标识
+        if (StringUtils.isBlank(bo.getPlatformCode())) {
+            bo.setPlatformCode(PlatformContext.getPlatform());
+        }
+        Page<MessagePublishCustomerVo> page = baseMapper.selectMessagePublishCustomerPage(pageQuery.build(), bo);
+        return TableDataInfo.build(page);
+    }
+
     /**
      * 查询符合条件的客户信息列表
      *

+ 46 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerSalesInfoServiceImpl.java

@@ -145,4 +145,50 @@ public class CustomerSalesInfoServiceImpl extends ServiceImpl<CustomerSalesInfoM
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    /**
+     * 分配业务人员
+     *
+     * @param customerId 客户ID
+     * @param salesPersonId 销售人员ID
+     * @param serviceStaffId 服务人员ID
+     * @return 是否成功
+     */
+    @Override
+    public Boolean assignStaff(Long customerId, Long salesPersonId, Long serviceStaffId) {
+        // 按 customerId 查询是否已有记录
+        CustomerSalesInfo existing = baseMapper.selectOne(
+            Wrappers.<CustomerSalesInfo>lambdaQuery()
+                .eq(CustomerSalesInfo::getCustomerId, customerId)
+        );
+        
+        if (existing != null) {
+            // 有记录,更新
+            existing.setSalesPersonId(salesPersonId);
+            existing.setServiceStaffId(serviceStaffId);
+            return baseMapper.updateById(existing) > 0;
+        } else {
+            // 没有记录,新增
+            CustomerSalesInfo salesInfo = new CustomerSalesInfo();
+            salesInfo.setCustomerId(customerId);
+            salesInfo.setSalesPersonId(salesPersonId);
+            salesInfo.setServiceStaffId(serviceStaffId);
+            salesInfo.setStatus("0");
+            return baseMapper.insert(salesInfo) > 0;
+        }
+    }
+
+    /**
+     * 根据客户ID查询销售信息
+     *
+     * @param customerId 客户ID
+     * @return 销售信息
+     */
+    @Override
+    public CustomerSalesInfoVo queryByCustomerId(Long customerId) {
+        return baseMapper.selectVoOne(
+            Wrappers.<CustomerSalesInfo>lambdaQuery()
+                .eq(CustomerSalesInfo::getCustomerId, customerId)
+        );
+    }
 }

+ 46 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerInfoMapper.xml

@@ -4,4 +4,50 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.dromara.customer.mapper.CustomerInfoMapper">
 
+    <!-- 消息发布-分页查询客户列表 -->
+    <select id="selectMessagePublishCustomerPage" resultType="org.dromara.customer.domain.vo.MessagePublishCustomerVo">
+        SELECT
+            ci.id,
+            ci.customer_no AS customerNo,
+            ci.company_name AS companyName,
+            ci.industry_category_id AS industryCategoryId,
+            ic.industry_category_name AS industryCategoryName,
+            0 AS employeeCount,
+            csi.account_period AS accountPeriod,
+            csi.credit_amount AS creditAmount,
+            csi.remaining_quota AS remainingQuota,
+            csi.accounts_receivable AS accountsReceivable,
+            ci.status,
+            cc.phone AS phone
+        FROM customer_info ci
+        LEFT JOIN customer_sales_info csi ON ci.id = csi.customer_id AND csi.del_flag = '0'
+        LEFT JOIN industry_category ic ON ci.industry_category_id = ic.id AND ic.del_flag = '0'
+        LEFT JOIN customer_contact cc ON ci.id = cc.customer_id AND cc.is_primary = '0' AND cc.del_flag = '0'
+        <where>
+            ci.del_flag = '0'
+            <if test="bo.platformCode != null and bo.platformCode != ''">
+                AND ci.platform_code = #{bo.platformCode}
+            </if>
+            <if test="bo.industryCategoryId != null">
+                AND ci.industry_category_id = #{bo.industryCategoryId}
+            </if>
+            <if test="bo.customerLevelId != null">
+                AND ci.customer_level_id = #{bo.customerLevelId}
+            </if>
+            <if test="bo.enterpriseScaleId != null">
+                AND ci.enterprise_scale_id = #{bo.enterpriseScaleId}
+            </if>
+            <if test="bo.tagId != null">
+                AND ci.id IN (
+                    SELECT cit.customer_id FROM customer_info_tag cit
+                    WHERE cit.tag_id = #{bo.tagId}
+                    <if test="bo.platformCode != null and bo.platformCode != ''">
+                        AND cit.platform_code = #{bo.platformCode}
+                    </if>
+                )
+            </if>
+        </where>
+        ORDER BY ci.id DESC
+    </select>
+
 </mapper>

+ 8 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBaseController.java

@@ -184,4 +184,12 @@ public class ProductBaseController extends BaseController {
         return productBaseService.querySiteProductPageList(bo, pageQuery);
     }
 
+    /**
+     * 查询推荐商品列表(联表查询分类名称,用于客户运营-推荐商品页面)
+     */
+    @GetMapping("/recommendProduct/list")
+    public TableDataInfo<RecommendProductVo> recommendProductList(ProductBaseBo bo, PageQuery pageQuery) {
+        return productBaseService.queryRecommendProductPageList(bo, pageQuery);
+    }
+
 }

+ 1 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductExtend.java

@@ -157,6 +157,7 @@ public class ProductExtend extends TenantEntity {
     /**
      * 数据来源
      */
+    @TableField(exist = false)
     private String dataSource;
 
     /**

+ 15 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBaseVo.java

@@ -77,6 +77,21 @@ public class ProductBaseVo implements Serializable {
     @ExcelProperty(value = "底层分类id")
     private Long bottomCategoryId;
 
+    /**
+     * 顶级分类名称
+     */
+    private String topCategoryName;
+
+    /**
+     * 中级分类名称
+     */
+    private String mediumCategoryName;
+
+    /**
+     * 底层分类名称
+     */
+    private String bottomCategoryName;
+
     /**
      * 分类名称
      */

+ 64 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/RecommendProductVo.java

@@ -0,0 +1,64 @@
+package org.dromara.product.domain.vo;
+
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 推荐商品视图对象(精简版)
+ *
+ * @author yoe
+ * @date 2026-01-08
+ */
+@Data
+public class RecommendProductVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    private Long id;
+
+    /** 产品编号 */
+    private String productNo;
+
+    /** 产品名称 */
+    private String itemName;
+
+    /** 产品图片URL */
+    private String productImage;
+
+    /** 一级分类名称 */
+    private String topCategoryName;
+
+    /** 二级分类名称 */
+    private String mediumCategoryName;
+
+    /** 三级分类名称 */
+    private String bottomCategoryName;
+
+    /** 平台价(最低销售价) */
+    private BigDecimal minSellingPrice;
+
+    /** 市场价 */
+    private BigDecimal marketPrice;
+
+    /** 首页推荐:1=推荐,0=不推荐 */
+    private String homeRecommended;
+
+    /** 分类推荐:1=推荐,0=不推荐 */
+    private String categoryRecommendation;
+
+    /** 购物车推荐:1=推荐,0=不推荐 */
+    private String cartRecommendation;
+
+    /** 是否爆款:1=是,0=否 */
+    private String isPopular;
+
+    /** 推荐排序 */
+    private Long recommendedProductOrder;
+
+    /** 商品状态:1=上架,0=下架 */
+    private String productStatus;
+}

+ 11 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductBaseMapper.java

@@ -3,8 +3,10 @@ package org.dromara.product.mapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
 import org.dromara.product.domain.ProductBase;
+import org.dromara.product.domain.bo.ProductBaseBo;
 import org.dromara.product.domain.bo.SiteProductBo;
 import org.dromara.product.domain.vo.ProductBaseVo;
+import org.dromara.product.domain.vo.RecommendProductVo;
 import org.dromara.product.domain.vo.SiteProductVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 
@@ -24,4 +26,13 @@ public interface ProductBaseMapper extends BaseMapperPlus<ProductBase, ProductBa
      * @return 站点产品分页列表
      */
     Page<SiteProductVo> selectSiteProductPage(@Param("page") Page<SiteProductVo> page, @Param("bo") SiteProductBo bo);
+
+    /**
+     * 分页查询推荐商品列表(联表查询分类名称)
+     *
+     * @param page 分页参数
+     * @param bo   查询条件
+     * @return 推荐商品分页列表
+     */
+    Page<RecommendProductVo> selectRecommendProductPage(@Param("page") Page<RecommendProductVo> page, @Param("bo") ProductBaseBo bo);
 }

+ 10 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductBaseService.java

@@ -3,6 +3,7 @@ package org.dromara.product.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.dromara.product.domain.ProductBase;
 import org.dromara.product.domain.vo.ProductBaseVo;
+import org.dromara.product.domain.vo.RecommendProductVo;
 import org.dromara.product.domain.vo.SiteProductVo;
 import org.dromara.product.domain.bo.ProductBaseBo;
 import org.dromara.product.domain.bo.SiteProductBo;
@@ -85,4 +86,13 @@ public interface IProductBaseService extends IService<ProductBase>{
      * @param productId 商品id
      */
     ProductBaseVo updateProductShelfState(Long productId);
+
+    /**
+     * 分页查询推荐商品列表(联表查询分类名称)
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 推荐商品分页列表
+     */
+    TableDataInfo<RecommendProductVo> queryRecommendProductPageList(ProductBaseBo bo, PageQuery pageQuery);
 }

+ 97 - 37
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java

@@ -20,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.dromara.product.domain.bo.ProductBaseBo;
 import org.dromara.product.domain.bo.SiteProductBo;
 import org.dromara.product.domain.vo.ProductBaseVo;
+import org.dromara.product.domain.vo.RecommendProductVo;
 import org.dromara.product.domain.vo.SiteProductVo;
 import org.dromara.product.domain.ProductBase;
 import org.dromara.product.domain.ProductExtend;
@@ -220,7 +221,7 @@ public class ProductBaseServiceImpl  extends ServiceImpl<ProductBaseMapper, Prod
         try {
             // 1. 保存产品基础信息
             ProductBase productBase = MapstructUtils.convert(bo, ProductBase.class);
-            validEntityBeforeSave(productBase);
+            validEntityBeforeSave(productBase, true);
 
             // 设置默认值
             setDefaultValues(productBase);
@@ -272,7 +273,7 @@ public class ProductBaseServiceImpl  extends ServiceImpl<ProductBaseMapper, Prod
 
             // 1. 更新产品基础信息
             ProductBase productBase = MapstructUtils.convert(bo, ProductBase.class);
-            validEntityBeforeSave(productBase);
+            validEntityBeforeSave(productBase, false);
 
             boolean flag = baseMapper.updateById(productBase) > 0;
             if (!flag) {
@@ -350,7 +351,7 @@ public class ProductBaseServiceImpl  extends ServiceImpl<ProductBaseMapper, Prod
         extend.setVolumeUnit(bo.getVolumeUnit());
         extend.setAfterSalesService(bo.getAfterSalesService());
         extend.setReferenceLink(bo.getReferenceLink());
-        extend.setIsCustomize(bo.getCustomizable()?"1":"0");
+        extend.setIsCustomize(Boolean.TRUE.equals(bo.getCustomizable()) ? "1" : "0");
         extend.setCustomDescription(bo.getCustomDescription());
         // 直接使用前端传递的服务保障ID列表(逗号分隔)
         extend.setServiceGuarantee(bo.getServiceGuarantee());
@@ -400,28 +401,53 @@ public class ProductBaseServiceImpl  extends ServiceImpl<ProductBaseMapper, Prod
      * 更新产品扩展信息
      */
     private void updateProductExtend(ProductBaseBo bo, Long productId) {
-        // 先删除旧的扩展信息
+        // 检查是否存在扩展信息
         LambdaQueryWrapper<ProductExtend> wrapper = Wrappers.lambdaQuery();
         wrapper.eq(ProductExtend::getProductId, productId);
-        extendMapper.delete(wrapper);
+        ProductExtend existing = extendMapper.selectOne(wrapper);
 
-        // 重新保存
-        saveProductExtend(bo, productId);
+        if (existing != null) {
+            // 存在则更新(只更新非空字段)
+            if (bo.getInvoiceName() != null) existing.setInvoiceName(bo.getInvoiceName());
+            if (bo.getInvoiceSpec() != null) existing.setInvoiceSpecs(bo.getInvoiceSpec());
+            if (bo.getUpcBarcode() != null) existing.setBarCoding(bo.getUpcBarcode());
+            if (bo.getWeight() != null) existing.setProductWeight(bo.getWeight());
+            if (bo.getWeightUnit() != null) existing.setWeightUnit(bo.getWeightUnit());
+            if (bo.getVolume() != null) existing.setProductVolume(bo.getVolume());
+            if (bo.getVolumeUnit() != null) existing.setVolumeUnit(bo.getVolumeUnit());
+            if (bo.getAfterSalesService() != null) existing.setAfterSalesService(bo.getAfterSalesService());
+            if (bo.getReferenceLink() != null) existing.setReferenceLink(bo.getReferenceLink());
+            if (bo.getCustomizable() != null) existing.setIsCustomize(bo.getCustomizable() ? "1" : "0");
+            if (bo.getCustomDescription() != null) existing.setCustomDescription(bo.getCustomDescription());
+            if (bo.getServiceGuarantee() != null) existing.setServiceGuarantee(bo.getServiceGuarantee());
+            if (bo.getFreeInstallation() != null) existing.setIsInstallService(bo.getFreeInstallation());
+            if (bo.getSalesVolume() != null) existing.setSalesVolume(bo.getSalesVolume());
+            extendMapper.updateById(existing);
+        } else {
+            // 不存在则新增
+            saveProductExtend(bo, productId);
+        }
     }
 
     /**
      * 更新产品价格库存信息
      */
     private void updateProductPriceInventory(ProductBaseBo bo, Long productId) {
+        // 如果没有传价格相关信息,不做任何操作
+        if (bo.getMidRangePrice() == null && bo.getStandardPrice() == null && 
+            bo.getCertificatePrice() == null && bo.getPurchasePrice() == null &&
+            bo.getEstimatedPurchasePrice() == null) {
+            return;
+        }
+
         ProductPriceInventory existing = priceInventoryMapper.selectById(productId);
         if (existing != null) {
-            // 更新现有记录
-            existing.setMarketPrice(bo.getMidRangePrice());
-            existing.setMemberPrice(bo.getStandardPrice());
-            existing.setMinSellingPrice(bo.getCertificatePrice());
-            existing.setPurchasingPrice(bo.getPurchasePrice());
-            existing.setMaxPurchasePrice(bo.getEstimatedPurchasePrice());
-
+            // 更新非空字段
+            if (bo.getMidRangePrice() != null) existing.setMarketPrice(bo.getMidRangePrice());
+            if (bo.getStandardPrice() != null) existing.setMemberPrice(bo.getStandardPrice());
+            if (bo.getCertificatePrice() != null) existing.setMinSellingPrice(bo.getCertificatePrice());
+            if (bo.getPurchasePrice() != null) existing.setPurchasingPrice(bo.getPurchasePrice());
+            if (bo.getEstimatedPurchasePrice() != null) existing.setMaxPurchasePrice(bo.getEstimatedPurchasePrice());
             priceInventoryMapper.updateById(existing);
         } else {
             // 创建新记录
@@ -433,21 +459,34 @@ public class ProductBaseServiceImpl  extends ServiceImpl<ProductBaseMapper, Prod
      * 更新产品属性关联信息
      */
     private void updateProductClassification(ProductBaseBo bo, Long productId) {
-        // 先删除旧的分类关联
+        // 如果没有传分类信息,不做任何操作
+        if (bo.getBottomCategoryId() == null && bo.getAttributesList() == null) {
+            return;
+        }
+
         LambdaQueryWrapper<ProductClassification> wrapper = Wrappers.lambdaQuery();
         wrapper.eq(ProductClassification::getProductId, productId);
-        classificationMapper.delete(wrapper);
+        ProductClassification existing = classificationMapper.selectOne(wrapper);
 
-        // 重新保存
-        saveProductClassification(bo, productId);
+        if (existing != null) {
+            // 存在则更新非空字段
+            if (bo.getBottomCategoryId() != null) existing.setCategoryId(bo.getBottomCategoryId());
+            if (bo.getAttributesList() != null) existing.setAttributesList(bo.getAttributesList());
+            classificationMapper.updateById(existing);
+        } else if (bo.getBottomCategoryId() != null) {
+            // 不存在且有分类ID才新增
+            saveProductClassification(bo, productId);
+        }
     }
 
     /**
      * 保存前的数据校验
+     * @param entity 实体
+     * @param isInsert 是否新增操作
      */
-    private void validEntityBeforeSave(ProductBase entity){
+    private void validEntityBeforeSave(ProductBase entity, boolean isInsert){
         // 校验产品编号唯一性(新增时)
-        if (entity.getId() == null && StringUtils.isNotBlank(entity.getProductNo())) {
+        if (isInsert && StringUtils.isNotBlank(entity.getProductNo())) {
             LambdaQueryWrapper<ProductBase> wrapper = Wrappers.lambdaQuery();
             wrapper.eq(ProductBase::getProductNo, entity.getProductNo());
             Long count = baseMapper.selectCount(wrapper);
@@ -456,8 +495,8 @@ public class ProductBaseServiceImpl  extends ServiceImpl<ProductBaseMapper, Prod
             }
         }
 
-        // 校验产品编号唯一性(更新时)
-        if (entity.getId() != null && StringUtils.isNotBlank(entity.getProductNo())) {
+        // 校验产品编号唯一性(更新时,如果传了productNo才校验
+        if (!isInsert && StringUtils.isNotBlank(entity.getProductNo())) {
             LambdaQueryWrapper<ProductBase> wrapper = Wrappers.lambdaQuery();
             wrapper.eq(ProductBase::getProductNo, entity.getProductNo());
             wrapper.ne(ProductBase::getId, entity.getId());
@@ -467,14 +506,14 @@ public class ProductBaseServiceImpl  extends ServiceImpl<ProductBaseMapper, Prod
             }
         }
 
-        // 校验必填字段
-        if (StringUtils.isBlank(entity.getItemName())) {
-            throw new RuntimeException("产品名称不能为空");
-        }
-
-        // 校验分类信息
-        if (entity.getTopCategoryId() == null || entity.getMediumCategoryId() == null || entity.getBottomCategoryId() == null) {
-            throw new RuntimeException("产品分类信息不完整,请选择完整的三级分类");
+        // 新增时校验必填字段
+        if (isInsert) {
+            if (StringUtils.isBlank(entity.getItemName())) {
+                throw new RuntimeException("产品名称不能为空");
+            }
+            if (entity.getTopCategoryId() == null || entity.getMediumCategoryId() == null || entity.getBottomCategoryId() == null) {
+                throw new RuntimeException("产品分类信息不完整,请选择完整的三级分类");
+            }
         }
 
         // 校验数值范围
@@ -636,14 +675,22 @@ public class ProductBaseServiceImpl  extends ServiceImpl<ProductBaseMapper, Prod
      * 更新产品定制信息
      */
     private void updateProductCustomization(ProductBaseBo bo, Long productId) {
-        // 先删除旧的定制信息
-        LambdaQueryWrapper<ProductCustomization> wrapper = Wrappers.lambdaQuery();
-        wrapper.eq(ProductCustomization::getProductId, productId);
-        customizationMapper.delete(wrapper);
+        // 如果没有传定制相关信息,不做任何操作
+        if (bo.getCustomizable() == null && bo.getCustomDetailsJson() == null) {
+            return;
+        }
 
-        // 如果可定制,则保存新的定制信息
-        if (bo.getCustomizable() != null && bo.getCustomizable()) {
-            saveProductCustomization(bo, productId);
+        // 只有明确传了定制详情JSON才更新定制信息
+        if (bo.getCustomDetailsJson() != null) {
+            // 先删除旧的定制信息
+            LambdaQueryWrapper<ProductCustomization> wrapper = Wrappers.lambdaQuery();
+            wrapper.eq(ProductCustomization::getProductId, productId);
+            customizationMapper.delete(wrapper);
+
+            // 如果可定制,则保存新的定制信息
+            if (Boolean.TRUE.equals(bo.getCustomizable())) {
+                saveProductCustomization(bo, productId);
+            }
         }
     }
 
@@ -680,4 +727,17 @@ public class ProductBaseServiceImpl  extends ServiceImpl<ProductBaseMapper, Prod
         );
         return productBase;
     }
+
+    /**
+     * 分页查询推荐商品列表(联表查询分类名称)
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 推荐商品分页列表
+     */
+    @Override
+    public TableDataInfo<RecommendProductVo> queryRecommendProductPageList(ProductBaseBo bo, PageQuery pageQuery) {
+        Page<RecommendProductVo> page = baseMapper.selectRecommendProductPage(pageQuery.build(), bo);
+        return TableDataInfo.build(page);
+    }
 }

+ 59 - 0
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductBaseMapper.xml

@@ -76,4 +76,63 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ORDER BY b.create_time DESC
     </select>
 
+    <!-- 推荐商品列表查询(联表查询分类名称) -->
+    <select id="selectRecommendProductPage" resultType="org.dromara.product.domain.vo.RecommendProductVo">
+        SELECT
+            b.id,
+            b.product_no AS productNo,
+            b.item_name AS itemName,
+            b.product_image AS productImage,
+            tc.category_name AS topCategoryName,
+            mc.category_name AS mediumCategoryName,
+            bc.category_name AS bottomCategoryName,
+            b.product_status AS productStatus,
+            b.home_recommended AS homeRecommended,
+            b.category_recommendation AS categoryRecommendation,
+            b.cart_recommendation AS cartRecommendation,
+            b.is_popular AS isPopular,
+            b.recommended_product_order AS recommendedProductOrder,
+            p.market_price AS marketPrice,
+            p.min_selling_price AS minSellingPrice
+        FROM product_base b
+        LEFT JOIN product_price_inventory p ON b.id = p.product_id AND p.del_flag = '0'
+        LEFT JOIN product_category tc ON b.top_category_id = tc.id AND tc.del_flag = '0'
+        LEFT JOIN product_category mc ON b.medium_category_id = mc.id AND mc.del_flag = '0'
+        LEFT JOIN product_category bc ON b.bottom_category_id = bc.id AND bc.del_flag = '0'
+        <where>
+            b.del_flag = '0'
+            <if test="bo.productNo != null and bo.productNo != ''">
+                AND b.product_no LIKE CONCAT('%', #{bo.productNo}, '%')
+            </if>
+            <if test="bo.itemName != null and bo.itemName != ''">
+                AND b.item_name LIKE CONCAT('%', #{bo.itemName}, '%')
+            </if>
+            <if test="bo.brandId != null">
+                AND b.brand_id = #{bo.brandId}
+            </if>
+            <if test="bo.productStatus != null and bo.productStatus != ''">
+                AND b.product_status = #{bo.productStatus}
+            </if>
+            <if test="bo.topCategoryId != null">
+                AND b.top_category_id = #{bo.topCategoryId}
+            </if>
+            <if test="bo.mediumCategoryId != null">
+                AND b.medium_category_id = #{bo.mediumCategoryId}
+            </if>
+            <if test="bo.bottomCategoryId != null">
+                AND b.bottom_category_id = #{bo.bottomCategoryId}
+            </if>
+            <if test="bo.homeRecommended != null and bo.homeRecommended != ''">
+                AND b.home_recommended = #{bo.homeRecommended}
+            </if>
+            <if test="bo.categoryRecommendation != null and bo.categoryRecommendation != ''">
+                AND b.category_recommendation = #{bo.categoryRecommendation}
+            </if>
+            <if test="bo.cartRecommendation != null and bo.cartRecommendation != ''">
+                AND b.cart_recommendation = #{bo.cartRecommendation}
+            </if>
+        </where>
+        ORDER BY b.recommended_product_order ASC, b.create_time DESC
+    </select>
+
 </mapper>

+ 55 - 3
ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysSmsController.java

@@ -3,6 +3,8 @@ package org.dromara.resource.controller;
 
 import cn.hutool.core.util.RandomUtil;
 import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.constant.Constants;
@@ -15,12 +17,11 @@ import org.dromara.sms4j.api.SmsBlend;
 import org.dromara.sms4j.api.entity.SmsResponse;
 import org.dromara.sms4j.core.factory.SmsFactory;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.time.Duration;
 import java.util.LinkedHashMap;
+import java.util.List;
 
 /**
  * 短信功能
@@ -58,4 +59,55 @@ public class SysSmsController extends BaseController {
         return R.ok();
     }
 
+    /**
+     * 群发短信
+     *
+     * @param request 群发短信请求
+     */
+    @PostMapping("/batch")
+    public R<Void> batchSend(@Validated @RequestBody SmsBatchRequest request) {
+        List<String> phones = request.getPhones();
+        String message = request.getMessage();
+        
+        if (phones.isEmpty()) {
+            return R.fail("手机号列表不能为空");
+        }
+        if (phones.size() > 1000) {
+            return R.fail("单次群发不能超过1000个手机号");
+        }
+        
+        log.info("群发短信 => 手机号数量: {}, 内容: {}", phones.size(), message);
+        
+        try {
+            SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
+            SmsResponse smsResponse = smsBlend.massTexting(phones, message);
+            if (!smsResponse.isSuccess()) {
+                log.error("群发短信失败 => {}", smsResponse);
+                return R.fail("发送失败: " + smsResponse.getData());
+            }
+            return R.ok();
+        } catch (Exception e) {
+            log.error("群发短信异常", e);
+            return R.fail("发送异常: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 群发短信请求
+     */
+    @Data
+    public static class SmsBatchRequest {
+        /**
+         * 手机号列表
+         */
+        @NotEmpty(message = "手机号列表不能为空")
+        private List<String> phones;
+
+        /**
+         * 短信内容
+         */
+        @NotBlank(message = "短信内容不能为空")
+        private String message;
+    }
+
 }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+ 57 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAdaptScene.java

@@ -0,0 +1,57 @@
+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;
+
+/**
+ * 适配场景对象 sys_adapt_scene
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_adapt_scene")
+public class SysAdaptScene extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 场景编号
+     */
+    private String sceneCode;
+
+    /**
+     * 场景名称
+     */
+    private String sceneName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 82 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAddressArea.java

@@ -0,0 +1,82 @@
+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;
+
+/**
+ * 地址区域对象 sys_address_area
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_address_area")
+public class SysAddressArea extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 区域编码
+     */
+    private String areaCode;
+
+    /**
+     * 区域名称
+     */
+    private String areaName;
+
+    /**
+     * 父级区域编码
+     */
+    private String parentCode;
+
+    /**
+     * 简称
+     */
+    private String simpleName;
+
+    /**
+     * 层级(1省 2市 3区县)
+     */
+    private Long level;
+
+    /**
+     * 拼音
+     */
+    private String pinYin;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java

@@ -92,6 +92,11 @@ public class SysDept extends TenantEntity {
 
     private String isCompanyFlag;
 
+    /**
+     * 客户ID
+     */
+    private Long customerId;
+
 
     /**
      * 子菜单

+ 99 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperationMessage.java

@@ -0,0 +1,99 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 运营消息对象 sys_operation_message
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_operation_message")
+public class SysOperationMessage extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 消息编号
+     */
+    private String messageNo;
+
+    /**
+     * 消息标题
+     */
+    private String messageTitle;
+
+    /**
+     * 消息内容
+     */
+    private String messageContent;
+
+    /**
+     * 消息描述
+     */
+    private String messageDesc;
+
+    /**
+     * 附件
+     */
+    private String messageFile;
+
+    /**
+     * 发布状态(0未发布 1已发布)
+     */
+    private Long postStatus;
+
+    /**
+     * 发布时间
+     */
+    private Date postTime;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    private Long isShow;
+
+    /**
+     * 是否全部用户(0否 1是)
+     */
+    private Long isAll;
+
+    /**
+     * 客户编号(指定用户时使用)
+     */
+    private String customerNo;
+
+    /**
+     * 阅读状态(0未读 1已读)
+     */
+    private Long readStatus;
+
+    /**
+     * 删除标志(0存在 2删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 62 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPriceRange.java

@@ -0,0 +1,62 @@
+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;
+
+/**
+ * 价格区间对象 sys_price_range
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_price_range")
+public class SysPriceRange extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 编号
+     */
+    private String priceCode;
+
+    /**
+     * 最小价
+     */
+    private Long minPrice;
+
+    /**
+     * 最大价
+     */
+    private Long maxPrice;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 57 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysProjectType.java

@@ -0,0 +1,57 @@
+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;
+
+/**
+ * 项目类型对象 sys_project_type
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_project_type")
+public class SysProjectType extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 类型编号
+     */
+    private String typeCode;
+
+    /**
+     * 类型名称
+     */
+    private String typeName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 72 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPurchaseCategory.java

@@ -0,0 +1,72 @@
+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;
+
+/**
+ * 采购分类对象 sys_purchase_category
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_purchase_category")
+public class SysPurchaseCategory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 分类编号
+     */
+    private String categoryCode;
+
+    /**
+     * 分类名称
+     */
+    private String categoryName;
+
+    /**
+     * 分类描述
+     */
+    private String categoryDesc;
+
+    /**
+     * 专题数量
+     */
+    private Long thematicQty;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 84 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRuleCategory.java

@@ -0,0 +1,84 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 规则分类管理对象 sys_rule_category
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_rule_category")
+public class SysRuleCategory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 分类编号
+     */
+    private String ruleCategoryNo;
+
+    /**
+     * 分类名称
+     */
+    private String ruleCategoryName;
+
+    /**
+     * 主题数量
+     */
+    private Long topicNum;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    private Long isShow;
+
+    /**
+     * 分类图片
+     */
+    private String ruleCategoryImage;
+
+    /**
+     * 排序
+     */
+    private Long ruleCategoryOrder;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    /**
+     * 上级分类编号
+     */
+    private String topCategoryNo;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 84 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRuleCenter.java

@@ -0,0 +1,84 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 规则中心对象 sys_rule_center
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_rule_center")
+public class SysRuleCenter extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 规则编号
+     */
+    private String ruleCenterNo;
+
+    /**
+     * 规则标题
+     */
+    private String ruleTitle;
+
+    /**
+     * 规则类型
+     */
+    private String ruleType;
+
+    /**
+     * 子类型
+     */
+    private String subType;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    private Long isShow;
+
+    /**
+     * 规则图片
+     */
+    private String ruleImage;
+
+    /**
+     * 规则内容
+     */
+    private String ruleContent;
+
+    /**
+     * 浏览人数
+     */
+    private Long seePeoples;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 62 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysServiceTime.java

@@ -0,0 +1,62 @@
+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;
+
+/**
+ * 服务时间对象 sys_service_time
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_service_time")
+public class SysServiceTime extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 区域编码(关联sys_address_area.area_code)
+     */
+    private String areaCode;
+
+    /**
+     * 服务日期(如:周一至周五)
+     */
+    private String serviceDate;
+
+    /**
+     * 服务时间(如:09:00-18:00)
+     */
+    private String serviceTime;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 53 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAdaptSceneBo.java

@@ -0,0 +1,53 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysAdaptScene;
+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.*;
+
+/**
+ * 适配场景业务对象 sys_adapt_scene
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysAdaptScene.class, reverseConvertGenerate = false)
+public class SysAdaptSceneBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 场景编号
+     */
+//    @NotBlank(message = "场景编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String sceneCode;
+
+    /**
+     * 场景名称
+     */
+//    @NotBlank(message = "场景名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String sceneName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 82 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAddressAreaBo.java

@@ -0,0 +1,82 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysAddressArea;
+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.*;
+
+/**
+ * 地址区域业务对象 sys_address_area
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysAddressArea.class, reverseConvertGenerate = false)
+public class SysAddressAreaBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 区域编码
+     */
+//    @NotBlank(message = "区域编码不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String areaCode;
+
+    /**
+     * 区域名称
+     */
+//    @NotBlank(message = "区域名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String areaName;
+
+    /**
+     * 父级区域编码
+     */
+//    @NotBlank(message = "父级区域编码不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String parentCode;
+
+    /**
+     * 简称
+     */
+//    @NotBlank(message = "简称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String simpleName;
+
+    /**
+     * 层级(1省 2市 3区县)
+     */
+    private Long level;
+
+    /**
+     * 拼音
+     */
+//    @NotBlank(message = "拼音不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String pinYin;
+
+    /**
+     * 数据来源
+     */
+//    @NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataSource;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java

@@ -87,4 +87,9 @@ public class SysDeptBo extends BaseEntity {
 
     private String isCompanyFlag;
 
+    /**
+     * 客户ID
+     */
+    private Long customerId;
+
 }

+ 99 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperationMessageBo.java

@@ -0,0 +1,99 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysOperationMessage;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 运营消息业务对象 sys_operation_message
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysOperationMessage.class, reverseConvertGenerate = false)
+public class SysOperationMessageBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 消息编号
+     */
+//    @NotBlank(message = "消息编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String messageNo;
+
+    /**
+     * 消息标题
+     */
+//    @NotBlank(message = "消息标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String messageTitle;
+
+    /**
+     * 消息内容
+     */
+//    @NotBlank(message = "消息内容不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String messageContent;
+
+    /**
+     * 消息描述
+     */
+//    @NotBlank(message = "消息描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String messageDesc;
+
+    /**
+     * 附件
+     */
+//    @NotBlank(message = "附件不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String messageFile;
+
+    /**
+     * 发布状态(0未发布 1已发布)
+     */
+    private Long postStatus;
+
+    /**
+     * 发布时间
+     */
+//    @NotNull(message = "发布时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date postTime;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    private Long isShow;
+
+    /**
+     * 是否全部用户(0否 1是)
+     */
+    private Long isAll;
+
+    /**
+     * 客户编号(指定用户时使用)
+     */
+//    @NotBlank(message = "客户编号(指定用户时使用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String customerNo;
+
+    /**
+     * 阅读状态(0未读 1已读)
+     */
+    private Long readStatus;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 59 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPriceRangeBo.java

@@ -0,0 +1,59 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysPriceRange;
+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.*;
+
+/**
+ * 价格区间业务对象 sys_price_range
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysPriceRange.class, reverseConvertGenerate = false)
+public class SysPriceRangeBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 编号
+     */
+//    @NotBlank(message = "编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String priceCode;
+
+    /**
+     * 最小价
+     */
+//    @NotNull(message = "最小价不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long minPrice;
+
+    /**
+     * 最大价
+     */
+//    @NotNull(message = "最大价不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long maxPrice;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 53 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysProjectTypeBo.java

@@ -0,0 +1,53 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysProjectType;
+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.*;
+
+/**
+ * 项目类型业务对象 sys_project_type
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysProjectType.class, reverseConvertGenerate = false)
+public class SysProjectTypeBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 类型编号
+     */
+//    @NotBlank(message = "类型编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String typeCode;
+
+    /**
+     * 类型名称
+     */
+//    @NotBlank(message = "类型名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String typeName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 71 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPurchaseCategoryBo.java

@@ -0,0 +1,71 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysPurchaseCategory;
+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.*;
+
+/**
+ * 采购分类业务对象 sys_purchase_category
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysPurchaseCategory.class, reverseConvertGenerate = false)
+public class SysPurchaseCategoryBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 分类编号
+     */
+//    @NotBlank(message = "分类编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String categoryCode;
+
+    /**
+     * 分类名称
+     */
+//    @NotBlank(message = "分类名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String categoryName;
+
+    /**
+     * 分类描述
+     */
+//    @NotBlank(message = "分类描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String categoryDesc;
+
+    /**
+     * 专题数量
+     */
+//    @NotNull(message = "专题数量不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long thematicQty;
+
+    /**
+     * 排序
+     */
+//    @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 83 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRuleCategoryBo.java

@@ -0,0 +1,83 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysRuleCategory;
+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 org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 规则分类管理业务对象 sys_rule_category
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysRuleCategory.class, reverseConvertGenerate = false)
+public class SysRuleCategoryBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 分类编号
+     */
+//    @NotBlank(message = "分类编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String ruleCategoryNo;
+
+    /**
+     * 分类名称
+     */
+//    @NotBlank(message = "分类名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String ruleCategoryName;
+
+    /**
+     * 主题数量
+     */
+    private Long topicNum;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    private Long isShow;
+
+    /**
+     * 分类图片
+     */
+//    @NotBlank(message = "分类图片不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String ruleCategoryImage;
+
+    /**
+     * 排序
+     */
+//    @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long ruleCategoryOrder;
+
+    /**
+     * 描述
+     */
+//    @NotBlank(message = "描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String description;
+
+    /**
+     * 上级分类编号
+     */
+//    @NotBlank(message = "上级分类编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String topCategoryNo;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 83 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRuleCenterBo.java

@@ -0,0 +1,83 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysRuleCenter;
+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 org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 规则中心业务对象 sys_rule_center
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysRuleCenter.class, reverseConvertGenerate = false)
+public class SysRuleCenterBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 规则编号
+     */
+//    @NotBlank(message = "规则编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String ruleCenterNo;
+
+    /**
+     * 规则标题
+     */
+//    @NotBlank(message = "规则标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String ruleTitle;
+
+    /**
+     * 规则类型
+     */
+//    @NotBlank(message = "规则类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String ruleType;
+
+    /**
+     * 子类型
+     */
+//    @NotBlank(message = "子类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String subType;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    private Long isShow;
+
+    /**
+     * 规则图片
+     */
+//    @NotBlank(message = "规则图片不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String ruleImage;
+
+    /**
+     * 规则内容
+     */
+//    @NotBlank(message = "规则内容不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String ruleContent;
+
+    /**
+     * 浏览人数
+     */
+    private Long seePeoples;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 57 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysServiceTimeBo.java

@@ -0,0 +1,57 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysServiceTime;
+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.*;
+
+/**
+ * 服务时间业务对象 sys_service_time
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysServiceTime.class, reverseConvertGenerate = false)
+public class SysServiceTimeBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 区域编码(关联sys_address_area.area_code)
+     */
+//    @NotBlank(message = "区域编码(关联sys_address_area.area_code)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String areaCode;
+
+    /**
+     * 服务日期(如:周一至周五)
+     */
+    private String serviceDate;
+
+    /**
+     * 服务时间(如:09:00-18:00)
+     */
+    private String serviceTime;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 63 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAdaptSceneVo.java

@@ -0,0 +1,63 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysAdaptScene;
+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;
+
+
+
+/**
+ * 适配场景视图对象 sys_adapt_scene
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysAdaptScene.class)
+public class SysAdaptSceneVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 场景编号
+     */
+    @ExcelProperty(value = "场景编号")
+    private String sceneCode;
+
+    /**
+     * 场景名称
+     */
+    @ExcelProperty(value = "场景名称")
+    private String sceneName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 94 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAddressAreaVo.java

@@ -0,0 +1,94 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysAddressArea;
+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;
+
+
+
+/**
+ * 地址区域视图对象 sys_address_area
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysAddressArea.class)
+public class SysAddressAreaVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 区域编码
+     */
+    @ExcelProperty(value = "区域编码")
+    private String areaCode;
+
+    /**
+     * 区域名称
+     */
+    @ExcelProperty(value = "区域名称")
+    private String areaName;
+
+    /**
+     * 父级区域编码
+     */
+    @ExcelProperty(value = "父级区域编码")
+    private String parentCode;
+
+    /**
+     * 简称
+     */
+    @ExcelProperty(value = "简称")
+    private String simpleName;
+
+    /**
+     * 层级(1省 2市 3区县)
+     */
+    @ExcelProperty(value = "层级", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "1=省,2=市,3=区县")
+    private Long level;
+
+    /**
+     * 拼音
+     */
+    @ExcelProperty(value = "拼音")
+    private String pinYin;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 123 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperationMessageVo.java

@@ -0,0 +1,123 @@
+package org.dromara.system.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.system.domain.SysOperationMessage;
+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;
+
+
+
+/**
+ * 运营消息视图对象 sys_operation_message
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysOperationMessage.class)
+public class SysOperationMessageVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 消息编号
+     */
+    @ExcelProperty(value = "消息编号")
+    private String messageNo;
+
+    /**
+     * 消息标题
+     */
+    @ExcelProperty(value = "消息标题")
+    private String messageTitle;
+
+    /**
+     * 消息内容
+     */
+    @ExcelProperty(value = "消息内容")
+    private String messageContent;
+
+    /**
+     * 消息描述
+     */
+    @ExcelProperty(value = "消息描述")
+    private String messageDesc;
+
+    /**
+     * 附件
+     */
+    @ExcelProperty(value = "附件")
+    private String messageFile;
+
+    /**
+     * 发布状态(0未发布 1已发布)
+     */
+    @ExcelProperty(value = "发布状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=未发布,1=已发布")
+    private Long postStatus;
+
+    /**
+     * 发布时间
+     */
+    @ExcelProperty(value = "发布时间")
+    private Date postTime;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    @ExcelProperty(value = "是否显示", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=否,1=是")
+    private Long isShow;
+
+    /**
+     * 是否全部用户(0否 1是)
+     */
+    @ExcelProperty(value = "是否全部用户", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=否,1=是")
+    private Long isAll;
+
+    /**
+     * 客户编号(指定用户时使用)
+     */
+    @ExcelProperty(value = "客户编号", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "指=定用户时使用")
+    private String customerNo;
+
+    /**
+     * 阅读状态(0未读 1已读)
+     */
+    @ExcelProperty(value = "阅读状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=未读,1=已读")
+    private Long readStatus;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+
+}

+ 69 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPriceRangeVo.java

@@ -0,0 +1,69 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysPriceRange;
+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;
+
+
+
+/**
+ * 价格区间视图对象 sys_price_range
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysPriceRange.class)
+public class SysPriceRangeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 编号
+     */
+    @ExcelProperty(value = "编号")
+    private String priceCode;
+
+    /**
+     * 最小价
+     */
+    @ExcelProperty(value = "最小价")
+    private Long minPrice;
+
+    /**
+     * 最大价
+     */
+    @ExcelProperty(value = "最大价")
+    private Long maxPrice;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 63 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysProjectTypeVo.java

@@ -0,0 +1,63 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysProjectType;
+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;
+
+
+
+/**
+ * 项目类型视图对象 sys_project_type
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysProjectType.class)
+public class SysProjectTypeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 类型编号
+     */
+    @ExcelProperty(value = "类型编号")
+    private String typeCode;
+
+    /**
+     * 类型名称
+     */
+    @ExcelProperty(value = "类型名称")
+    private String typeName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 81 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPurchaseCategoryVo.java

@@ -0,0 +1,81 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysPurchaseCategory;
+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;
+
+
+
+/**
+ * 采购分类视图对象 sys_purchase_category
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysPurchaseCategory.class)
+public class SysPurchaseCategoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 分类编号
+     */
+    @ExcelProperty(value = "分类编号")
+    private String categoryCode;
+
+    /**
+     * 分类名称
+     */
+    @ExcelProperty(value = "分类名称")
+    private String categoryName;
+
+    /**
+     * 分类描述
+     */
+    @ExcelProperty(value = "分类描述")
+    private String categoryDesc;
+
+    /**
+     * 专题数量
+     */
+    @ExcelProperty(value = "专题数量")
+    private Long thematicQty;
+
+    /**
+     * 排序
+     */
+    @ExcelProperty(value = "排序")
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 100 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRuleCategoryVo.java

@@ -0,0 +1,100 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.system.domain.SysRuleCategory;
+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;
+
+
+
+/**
+ * 规则分类管理视图对象 sys_rule_category
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysRuleCategory.class)
+public class SysRuleCategoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 分类编号
+     */
+    @ExcelProperty(value = "分类编号")
+    private String ruleCategoryNo;
+
+    /**
+     * 分类名称
+     */
+    @ExcelProperty(value = "分类名称")
+    private String ruleCategoryName;
+
+    /**
+     * 主题数量
+     */
+    @ExcelProperty(value = "主题数量")
+    private Long topicNum;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    @ExcelProperty(value = "是否显示", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=否,1=是")
+    private Long isShow;
+
+    /**
+     * 分类图片
+     */
+    @ExcelProperty(value = "分类图片")
+    private String ruleCategoryImage;
+
+    /**
+     * 分类图片Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "ruleCategoryImage")
+    private String ruleCategoryImageUrl;
+    /**
+     * 排序
+     */
+    @ExcelProperty(value = "排序")
+    private Long ruleCategoryOrder;
+
+    /**
+     * 描述
+     */
+    @ExcelProperty(value = "描述")
+    private String description;
+
+    /**
+     * 上级分类编号
+     */
+    @ExcelProperty(value = "上级分类编号")
+    private String topCategoryNo;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 112 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRuleCenterVo.java

@@ -0,0 +1,112 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.system.domain.SysRuleCenter;
+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;
+
+
+
+/**
+ * 规则中心视图对象 sys_rule_center
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysRuleCenter.class)
+public class SysRuleCenterVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 规则编号
+     */
+    @ExcelProperty(value = "规则编号")
+    private String ruleCenterNo;
+
+    /**
+     * 规则标题
+     */
+    @ExcelProperty(value = "规则标题")
+    private String ruleTitle;
+
+    /**
+     * 规则类型
+     */
+    @ExcelProperty(value = "规则类型")
+    private String ruleType;
+
+    /**
+     * 子类型
+     */
+    @ExcelProperty(value = "子类型")
+    private String subType;
+
+    /**
+     * 是否显示(0否 1是)
+     */
+    @ExcelProperty(value = "是否显示", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=否,1=是")
+    private Long isShow;
+
+    /**
+     * 规则图片
+     */
+    @ExcelProperty(value = "规则图片")
+    private String ruleImage;
+
+    /**
+     * 规则图片Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "ruleImage")
+    private String ruleImageUrl;
+    /**
+     * 规则内容
+     */
+    @ExcelProperty(value = "规则内容")
+    private String ruleContent;
+
+    /**
+     * 浏览人数
+     */
+    @ExcelProperty(value = "浏览人数")
+    private Long seePeoples;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+
+}

+ 78 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysServiceTimeVo.java

@@ -0,0 +1,78 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysServiceTime;
+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;
+
+
+
+/**
+ * 服务时间视图对象 sys_service_time
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysServiceTime.class)
+public class SysServiceTimeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 区域编码(关联sys_address_area.area_code)
+     */
+    @ExcelProperty(value = "区域编码", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "关=联sys_address_area.area_code")
+    private String areaCode;
+
+    /**
+     * 区域名称(关联查询)
+     */
+    @ExcelProperty(value = "区域名称")
+    private String areaName;
+
+    /**
+     * 服务日期(如:周一至周五)
+     */
+    @ExcelProperty(value = "服务日期", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:周一至周五")
+    private String serviceDate;
+
+    /**
+     * 服务时间(如:09:00-18:00)
+     */
+    @ExcelProperty(value = "服务时间", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:09:00-18:00")
+    private String serviceTime;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysAdaptScene;
+import org.dromara.system.domain.vo.SysAdaptSceneVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 适配场景Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+public interface SysAdaptSceneMapper extends BaseMapperPlus<SysAdaptScene, SysAdaptSceneVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysAddressArea;
+import org.dromara.system.domain.vo.SysAddressAreaVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 地址区域Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+public interface SysAddressAreaMapper extends BaseMapperPlus<SysAddressArea, SysAddressAreaVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysOperationMessage;
+import org.dromara.system.domain.vo.SysOperationMessageVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 运营消息Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+public interface SysOperationMessageMapper extends BaseMapperPlus<SysOperationMessage, SysOperationMessageVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysPriceRange;
+import org.dromara.system.domain.vo.SysPriceRangeVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 价格区间Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+public interface SysPriceRangeMapper extends BaseMapperPlus<SysPriceRange, SysPriceRangeVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysProjectType;
+import org.dromara.system.domain.vo.SysProjectTypeVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 项目类型Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+public interface SysProjectTypeMapper extends BaseMapperPlus<SysProjectType, SysProjectTypeVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysPurchaseCategory;
+import org.dromara.system.domain.vo.SysPurchaseCategoryVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 采购分类Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+public interface SysPurchaseCategoryMapper extends BaseMapperPlus<SysPurchaseCategory, SysPurchaseCategoryVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysRuleCategory;
+import org.dromara.system.domain.vo.SysRuleCategoryVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 规则分类管理Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+public interface SysRuleCategoryMapper extends BaseMapperPlus<SysRuleCategory, SysRuleCategoryVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysRuleCenter;
+import org.dromara.system.domain.vo.SysRuleCenterVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 规则中心Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+public interface SysRuleCenterMapper extends BaseMapperPlus<SysRuleCenter, SysRuleCenterVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysServiceTime;
+import org.dromara.system.domain.vo.SysServiceTimeVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 服务时间Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+public interface SysServiceTimeMapper extends BaseMapperPlus<SysServiceTime, SysServiceTimeVo> {
+
+}

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

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysAdaptScene;
+import org.dromara.system.domain.vo.SysAdaptSceneVo;
+import org.dromara.system.domain.bo.SysAdaptSceneBo;
+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 2026-01-05
+ */
+public interface ISysAdaptSceneService extends IService<SysAdaptScene>{
+
+    /**
+     * 查询适配场景
+     *
+     * @param id 主键
+     * @return 适配场景
+     */
+    SysAdaptSceneVo queryById(Long id);
+
+    /**
+     * 分页查询适配场景列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 适配场景分页列表
+     */
+    TableDataInfo<SysAdaptSceneVo> queryPageList(SysAdaptSceneBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的适配场景列表
+     *
+     * @param bo 查询条件
+     * @return 适配场景列表
+     */
+    List<SysAdaptSceneVo> queryList(SysAdaptSceneBo bo);
+
+    /**
+     * 新增适配场景
+     *
+     * @param bo 适配场景
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysAdaptSceneBo bo);
+
+    /**
+     * 修改适配场景
+     *
+     * @param bo 适配场景
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysAdaptSceneBo bo);
+
+    /**
+     * 校验并批量删除适配场景信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysAddressArea;
+import org.dromara.system.domain.vo.SysAddressAreaVo;
+import org.dromara.system.domain.bo.SysAddressAreaBo;
+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 2026-01-05
+ */
+public interface ISysAddressAreaService extends IService<SysAddressArea>{
+
+    /**
+     * 查询地址区域
+     *
+     * @param id 主键
+     * @return 地址区域
+     */
+    SysAddressAreaVo queryById(Long id);
+
+    /**
+     * 分页查询地址区域列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 地址区域分页列表
+     */
+    TableDataInfo<SysAddressAreaVo> queryPageList(SysAddressAreaBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的地址区域列表
+     *
+     * @param bo 查询条件
+     * @return 地址区域列表
+     */
+    List<SysAddressAreaVo> queryList(SysAddressAreaBo bo);
+
+    /**
+     * 新增地址区域
+     *
+     * @param bo 地址区域
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysAddressAreaBo bo);
+
+    /**
+     * 修改地址区域
+     *
+     * @param bo 地址区域
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysAddressAreaBo bo);
+
+    /**
+     * 校验并批量删除地址区域信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysOperationMessage;
+import org.dromara.system.domain.vo.SysOperationMessageVo;
+import org.dromara.system.domain.bo.SysOperationMessageBo;
+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 2026-01-06
+ */
+public interface ISysOperationMessageService extends IService<SysOperationMessage>{
+
+    /**
+     * 查询运营消息
+     *
+     * @param id 主键
+     * @return 运营消息
+     */
+    SysOperationMessageVo queryById(Long id);
+
+    /**
+     * 分页查询运营消息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 运营消息分页列表
+     */
+    TableDataInfo<SysOperationMessageVo> queryPageList(SysOperationMessageBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的运营消息列表
+     *
+     * @param bo 查询条件
+     * @return 运营消息列表
+     */
+    List<SysOperationMessageVo> queryList(SysOperationMessageBo bo);
+
+    /**
+     * 新增运营消息
+     *
+     * @param bo 运营消息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysOperationMessageBo bo);
+
+    /**
+     * 修改运营消息
+     *
+     * @param bo 运营消息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysOperationMessageBo bo);
+
+    /**
+     * 校验并批量删除运营消息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysPriceRange;
+import org.dromara.system.domain.vo.SysPriceRangeVo;
+import org.dromara.system.domain.bo.SysPriceRangeBo;
+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 2026-01-05
+ */
+public interface ISysPriceRangeService extends IService<SysPriceRange>{
+
+    /**
+     * 查询价格区间
+     *
+     * @param id 主键
+     * @return 价格区间
+     */
+    SysPriceRangeVo queryById(Long id);
+
+    /**
+     * 分页查询价格区间列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 价格区间分页列表
+     */
+    TableDataInfo<SysPriceRangeVo> queryPageList(SysPriceRangeBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的价格区间列表
+     *
+     * @param bo 查询条件
+     * @return 价格区间列表
+     */
+    List<SysPriceRangeVo> queryList(SysPriceRangeBo bo);
+
+    /**
+     * 新增价格区间
+     *
+     * @param bo 价格区间
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysPriceRangeBo bo);
+
+    /**
+     * 修改价格区间
+     *
+     * @param bo 价格区间
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysPriceRangeBo bo);
+
+    /**
+     * 校验并批量删除价格区间信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysProjectType;
+import org.dromara.system.domain.vo.SysProjectTypeVo;
+import org.dromara.system.domain.bo.SysProjectTypeBo;
+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 2026-01-05
+ */
+public interface ISysProjectTypeService extends IService<SysProjectType>{
+
+    /**
+     * 查询项目类型
+     *
+     * @param id 主键
+     * @return 项目类型
+     */
+    SysProjectTypeVo queryById(Long id);
+
+    /**
+     * 分页查询项目类型列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 项目类型分页列表
+     */
+    TableDataInfo<SysProjectTypeVo> queryPageList(SysProjectTypeBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的项目类型列表
+     *
+     * @param bo 查询条件
+     * @return 项目类型列表
+     */
+    List<SysProjectTypeVo> queryList(SysProjectTypeBo bo);
+
+    /**
+     * 新增项目类型
+     *
+     * @param bo 项目类型
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysProjectTypeBo bo);
+
+    /**
+     * 修改项目类型
+     *
+     * @param bo 项目类型
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysProjectTypeBo bo);
+
+    /**
+     * 校验并批量删除项目类型信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysPurchaseCategory;
+import org.dromara.system.domain.vo.SysPurchaseCategoryVo;
+import org.dromara.system.domain.bo.SysPurchaseCategoryBo;
+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 2026-01-05
+ */
+public interface ISysPurchaseCategoryService extends IService<SysPurchaseCategory>{
+
+    /**
+     * 查询采购分类
+     *
+     * @param id 主键
+     * @return 采购分类
+     */
+    SysPurchaseCategoryVo queryById(Long id);
+
+    /**
+     * 分页查询采购分类列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 采购分类分页列表
+     */
+    TableDataInfo<SysPurchaseCategoryVo> queryPageList(SysPurchaseCategoryBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的采购分类列表
+     *
+     * @param bo 查询条件
+     * @return 采购分类列表
+     */
+    List<SysPurchaseCategoryVo> queryList(SysPurchaseCategoryBo bo);
+
+    /**
+     * 新增采购分类
+     *
+     * @param bo 采购分类
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysPurchaseCategoryBo bo);
+
+    /**
+     * 修改采购分类
+     *
+     * @param bo 采购分类
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysPurchaseCategoryBo bo);
+
+    /**
+     * 校验并批量删除采购分类信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysRuleCategory;
+import org.dromara.system.domain.vo.SysRuleCategoryVo;
+import org.dromara.system.domain.bo.SysRuleCategoryBo;
+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 2026-01-06
+ */
+public interface ISysRuleCategoryService extends IService<SysRuleCategory>{
+
+    /**
+     * 查询规则分类管理
+     *
+     * @param id 主键
+     * @return 规则分类管理
+     */
+    SysRuleCategoryVo queryById(Long id);
+
+    /**
+     * 分页查询规则分类管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 规则分类管理分页列表
+     */
+    TableDataInfo<SysRuleCategoryVo> queryPageList(SysRuleCategoryBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的规则分类管理列表
+     *
+     * @param bo 查询条件
+     * @return 规则分类管理列表
+     */
+    List<SysRuleCategoryVo> queryList(SysRuleCategoryBo bo);
+
+    /**
+     * 新增规则分类管理
+     *
+     * @param bo 规则分类管理
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysRuleCategoryBo bo);
+
+    /**
+     * 修改规则分类管理
+     *
+     * @param bo 规则分类管理
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysRuleCategoryBo bo);
+
+    /**
+     * 校验并批量删除规则分类管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysRuleCenter;
+import org.dromara.system.domain.vo.SysRuleCenterVo;
+import org.dromara.system.domain.bo.SysRuleCenterBo;
+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 2026-01-06
+ */
+public interface ISysRuleCenterService extends IService<SysRuleCenter>{
+
+    /**
+     * 查询规则中心
+     *
+     * @param id 主键
+     * @return 规则中心
+     */
+    SysRuleCenterVo queryById(Long id);
+
+    /**
+     * 分页查询规则中心列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 规则中心分页列表
+     */
+    TableDataInfo<SysRuleCenterVo> queryPageList(SysRuleCenterBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的规则中心列表
+     *
+     * @param bo 查询条件
+     * @return 规则中心列表
+     */
+    List<SysRuleCenterVo> queryList(SysRuleCenterBo bo);
+
+    /**
+     * 新增规则中心
+     *
+     * @param bo 规则中心
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysRuleCenterBo bo);
+
+    /**
+     * 修改规则中心
+     *
+     * @param bo 规则中心
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysRuleCenterBo bo);
+
+    /**
+     * 校验并批量删除规则中心信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysServiceTime;
+import org.dromara.system.domain.vo.SysServiceTimeVo;
+import org.dromara.system.domain.bo.SysServiceTimeBo;
+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 2026-01-05
+ */
+public interface ISysServiceTimeService extends IService<SysServiceTime>{
+
+    /**
+     * 查询服务时间
+     *
+     * @param id 主键
+     * @return 服务时间
+     */
+    SysServiceTimeVo queryById(Long id);
+
+    /**
+     * 分页查询服务时间列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 服务时间分页列表
+     */
+    TableDataInfo<SysServiceTimeVo> queryPageList(SysServiceTimeBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的服务时间列表
+     *
+     * @param bo 查询条件
+     * @return 服务时间列表
+     */
+    List<SysServiceTimeVo> queryList(SysServiceTimeBo bo);
+
+    /**
+     * 新增服务时间
+     *
+     * @param bo 服务时间
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysServiceTimeBo bo);
+
+    /**
+     * 修改服务时间
+     *
+     * @param bo 服务时间
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysServiceTimeBo bo);
+
+    /**
+     * 校验并批量删除服务时间信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 161 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAdaptSceneServiceImpl.java

@@ -0,0 +1,161 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysAdaptSceneBo;
+import org.dromara.system.domain.vo.SysAdaptSceneVo;
+import org.dromara.system.domain.SysAdaptScene;
+import org.dromara.system.mapper.SysAdaptSceneMapper;
+import org.dromara.system.service.ISysAdaptSceneService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 适配场景Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysAdaptSceneServiceImpl  extends ServiceImpl<SysAdaptSceneMapper, SysAdaptScene> implements ISysAdaptSceneService {
+
+    private final SysAdaptSceneMapper baseMapper;
+
+    /**
+     * 查询适配场景
+     *
+     * @param id 主键
+     * @return 适配场景
+     */
+    @Override
+    public SysAdaptSceneVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询适配场景列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 适配场景分页列表
+     */
+    @Override
+    public TableDataInfo<SysAdaptSceneVo> queryPageList(SysAdaptSceneBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysAdaptScene> lqw = buildQueryWrapper(bo);
+        Page<SysAdaptSceneVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的适配场景列表
+     *
+     * @param bo 查询条件
+     * @return 适配场景列表
+     */
+    @Override
+    public List<SysAdaptSceneVo> queryList(SysAdaptSceneBo bo) {
+        LambdaQueryWrapper<SysAdaptScene> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysAdaptScene> buildQueryWrapper(SysAdaptSceneBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysAdaptScene> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysAdaptScene::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getSceneCode()), SysAdaptScene::getSceneCode, bo.getSceneCode());
+        lqw.like(StringUtils.isNotBlank(bo.getSceneName()), SysAdaptScene::getSceneName, bo.getSceneName());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysAdaptScene::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SysAdaptScene::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增适配场景
+     *
+     * @param bo 适配场景
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysAdaptSceneBo bo) {
+        SysAdaptScene add = MapstructUtils.convert(bo, SysAdaptScene.class);
+        // 自动生成编号
+        add.setSceneCode(generateSceneCode());
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 生成场景编号(格式:00001, 00002, ...)
+     */
+    private String generateSceneCode() {
+        // 查询当前最大编号
+        LambdaQueryWrapper<SysAdaptScene> lqw = Wrappers.lambdaQuery();
+        lqw.select(SysAdaptScene::getSceneCode);
+        lqw.orderByDesc(SysAdaptScene::getSceneCode);
+        lqw.last("LIMIT 1");
+        SysAdaptScene maxRecord = baseMapper.selectOne(lqw);
+
+        int nextNum = 1;
+        if (maxRecord != null && StringUtils.isNotBlank(maxRecord.getSceneCode())) {
+            try {
+                nextNum = Integer.parseInt(maxRecord.getSceneCode()) + 1;
+            } catch (NumberFormatException e) {
+                log.warn("解析场景编号失败: {}", maxRecord.getSceneCode());
+            }
+        }
+        // 格式化为5位数字,如 00001, 00002
+        return String.format("%05d", nextNum);
+    }
+
+    /**
+     * 修改适配场景
+     *
+     * @param bo 适配场景
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysAdaptSceneBo bo) {
+        SysAdaptScene update = MapstructUtils.convert(bo, SysAdaptScene.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysAdaptScene entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除适配场景信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 140 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAddressAreaServiceImpl.java

@@ -0,0 +1,140 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysAddressAreaBo;
+import org.dromara.system.domain.vo.SysAddressAreaVo;
+import org.dromara.system.domain.SysAddressArea;
+import org.dromara.system.mapper.SysAddressAreaMapper;
+import org.dromara.system.service.ISysAddressAreaService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 地址区域Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysAddressAreaServiceImpl  extends ServiceImpl<SysAddressAreaMapper, SysAddressArea> implements ISysAddressAreaService {
+
+    private final SysAddressAreaMapper baseMapper;
+
+    /**
+     * 查询地址区域
+     *
+     * @param id 主键
+     * @return 地址区域
+     */
+    @Override
+    public SysAddressAreaVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询地址区域列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 地址区域分页列表
+     */
+    @Override
+    public TableDataInfo<SysAddressAreaVo> queryPageList(SysAddressAreaBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysAddressArea> lqw = buildQueryWrapper(bo);
+        Page<SysAddressAreaVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的地址区域列表
+     *
+     * @param bo 查询条件
+     * @return 地址区域列表
+     */
+    @Override
+    public List<SysAddressAreaVo> queryList(SysAddressAreaBo bo) {
+        LambdaQueryWrapper<SysAddressArea> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysAddressArea> buildQueryWrapper(SysAddressAreaBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysAddressArea> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysAddressArea::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getAreaCode()), SysAddressArea::getAreaCode, bo.getAreaCode());
+        lqw.like(StringUtils.isNotBlank(bo.getAreaName()), SysAddressArea::getAreaName, bo.getAreaName());
+        lqw.eq(StringUtils.isNotBlank(bo.getParentCode()), SysAddressArea::getParentCode, bo.getParentCode());
+        lqw.like(StringUtils.isNotBlank(bo.getSimpleName()), SysAddressArea::getSimpleName, bo.getSimpleName());
+        lqw.eq(bo.getLevel() != null, SysAddressArea::getLevel, bo.getLevel());
+        lqw.eq(StringUtils.isNotBlank(bo.getPinYin()), SysAddressArea::getPinYin, bo.getPinYin());
+        lqw.eq(StringUtils.isNotBlank(bo.getDataSource()), SysAddressArea::getDataSource, bo.getDataSource());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysAddressArea::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增地址区域
+     *
+     * @param bo 地址区域
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysAddressAreaBo bo) {
+        SysAddressArea add = MapstructUtils.convert(bo, SysAddressArea.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改地址区域
+     *
+     * @param bo 地址区域
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysAddressAreaBo bo) {
+        SysAddressArea update = MapstructUtils.convert(bo, SysAddressArea.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysAddressArea entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除地址区域信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 166 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperationMessageServiceImpl.java

@@ -0,0 +1,166 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysOperationMessageBo;
+import org.dromara.system.domain.vo.SysOperationMessageVo;
+import org.dromara.system.domain.SysOperationMessage;
+import org.dromara.system.mapper.SysOperationMessageMapper;
+import org.dromara.system.service.ISysOperationMessageService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 运营消息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysOperationMessageServiceImpl  extends ServiceImpl<SysOperationMessageMapper, SysOperationMessage> implements ISysOperationMessageService {
+
+    private final SysOperationMessageMapper baseMapper;
+
+    /**
+     * 查询运营消息
+     *
+     * @param id 主键
+     * @return 运营消息
+     */
+    @Override
+    public SysOperationMessageVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询运营消息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 运营消息分页列表
+     */
+    @Override
+    public TableDataInfo<SysOperationMessageVo> queryPageList(SysOperationMessageBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysOperationMessage> lqw = buildQueryWrapper(bo);
+        Page<SysOperationMessageVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的运营消息列表
+     *
+     * @param bo 查询条件
+     * @return 运营消息列表
+     */
+    @Override
+    public List<SysOperationMessageVo> queryList(SysOperationMessageBo bo) {
+        LambdaQueryWrapper<SysOperationMessage> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysOperationMessage> buildQueryWrapper(SysOperationMessageBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysOperationMessage> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysOperationMessage::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getMessageNo()), SysOperationMessage::getMessageNo, bo.getMessageNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getMessageTitle()), SysOperationMessage::getMessageTitle, bo.getMessageTitle());
+        lqw.eq(StringUtils.isNotBlank(bo.getMessageContent()), SysOperationMessage::getMessageContent, bo.getMessageContent());
+        lqw.eq(StringUtils.isNotBlank(bo.getMessageDesc()), SysOperationMessage::getMessageDesc, bo.getMessageDesc());
+        lqw.eq(StringUtils.isNotBlank(bo.getMessageFile()), SysOperationMessage::getMessageFile, bo.getMessageFile());
+        lqw.eq(bo.getPostStatus() != null, SysOperationMessage::getPostStatus, bo.getPostStatus());
+        lqw.eq(bo.getPostTime() != null, SysOperationMessage::getPostTime, bo.getPostTime());
+        lqw.eq(bo.getIsShow() != null, SysOperationMessage::getIsShow, bo.getIsShow());
+        lqw.eq(bo.getIsAll() != null, SysOperationMessage::getIsAll, bo.getIsAll());
+        lqw.eq(StringUtils.isNotBlank(bo.getCustomerNo()), SysOperationMessage::getCustomerNo, bo.getCustomerNo());
+        lqw.eq(bo.getReadStatus() != null, SysOperationMessage::getReadStatus, bo.getReadStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增运营消息
+     *
+     * @param bo 运营消息
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysOperationMessageBo bo) {
+        SysOperationMessage add = MapstructUtils.convert(bo, SysOperationMessage.class);
+        // 自动生成消息编号
+        add.setMessageNo(generateMessageNo());
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 生成消息编号,格式:00001, 00002, ...
+     */
+    private String generateMessageNo() {
+        // 查询当前最大编号
+        LambdaQueryWrapper<SysOperationMessage> lqw = Wrappers.lambdaQuery();
+        lqw.select(SysOperationMessage::getMessageNo);
+        lqw.orderByDesc(SysOperationMessage::getId);
+        lqw.last("LIMIT 1");
+        SysOperationMessage last = baseMapper.selectOne(lqw);
+        int nextNo = 1;
+        if (last != null && StringUtils.isNotBlank(last.getMessageNo())) {
+            try {
+                nextNo = Integer.parseInt(last.getMessageNo()) + 1;
+            } catch (NumberFormatException e) {
+                // 如果解析失败,使用默认值
+            }
+        }
+        return String.format("%05d", nextNo);
+    }
+
+    /**
+     * 修改运营消息
+     *
+     * @param bo 运营消息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysOperationMessageBo bo) {
+        SysOperationMessage update = MapstructUtils.convert(bo, SysOperationMessage.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysOperationMessage entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除运营消息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 162 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPriceRangeServiceImpl.java

@@ -0,0 +1,162 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysPriceRangeBo;
+import org.dromara.system.domain.vo.SysPriceRangeVo;
+import org.dromara.system.domain.SysPriceRange;
+import org.dromara.system.mapper.SysPriceRangeMapper;
+import org.dromara.system.service.ISysPriceRangeService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 价格区间Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysPriceRangeServiceImpl  extends ServiceImpl<SysPriceRangeMapper, SysPriceRange> implements ISysPriceRangeService {
+
+    private final SysPriceRangeMapper baseMapper;
+
+    /**
+     * 查询价格区间
+     *
+     * @param id 主键
+     * @return 价格区间
+     */
+    @Override
+    public SysPriceRangeVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询价格区间列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 价格区间分页列表
+     */
+    @Override
+    public TableDataInfo<SysPriceRangeVo> queryPageList(SysPriceRangeBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysPriceRange> lqw = buildQueryWrapper(bo);
+        Page<SysPriceRangeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的价格区间列表
+     *
+     * @param bo 查询条件
+     * @return 价格区间列表
+     */
+    @Override
+    public List<SysPriceRangeVo> queryList(SysPriceRangeBo bo) {
+        LambdaQueryWrapper<SysPriceRange> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysPriceRange> buildQueryWrapper(SysPriceRangeBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysPriceRange> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysPriceRange::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getPriceCode()), SysPriceRange::getPriceCode, bo.getPriceCode());
+        lqw.eq(bo.getMinPrice() != null, SysPriceRange::getMinPrice, bo.getMinPrice());
+        lqw.eq(bo.getMaxPrice() != null, SysPriceRange::getMaxPrice, bo.getMaxPrice());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysPriceRange::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SysPriceRange::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增价格区间
+     *
+     * @param bo 价格区间
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysPriceRangeBo bo) {
+        SysPriceRange add = MapstructUtils.convert(bo, SysPriceRange.class);
+        // 自动生成编号
+        add.setPriceCode(generatePriceCode());
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 生成价格区间编号(格式:0001, 0002, ...)
+     */
+    private String generatePriceCode() {
+        // 查询当前最大编号
+        LambdaQueryWrapper<SysPriceRange> lqw = Wrappers.lambdaQuery();
+        lqw.select(SysPriceRange::getPriceCode);
+        lqw.orderByDesc(SysPriceRange::getPriceCode);
+        lqw.last("LIMIT 1");
+        SysPriceRange maxRecord = baseMapper.selectOne(lqw);
+
+        int nextNum = 1;
+        if (maxRecord != null && StringUtils.isNotBlank(maxRecord.getPriceCode())) {
+            try {
+                nextNum = Integer.parseInt(maxRecord.getPriceCode()) + 1;
+            } catch (NumberFormatException e) {
+                log.warn("解析价格区间编号失败: {}", maxRecord.getPriceCode());
+            }
+        }
+        // 格式化为4位数字,如 0001, 0002
+        return String.format("%04d", nextNum);
+    }
+
+    /**
+     * 修改价格区间
+     *
+     * @param bo 价格区间
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysPriceRangeBo bo) {
+        SysPriceRange update = MapstructUtils.convert(bo, SysPriceRange.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysPriceRange entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除价格区间信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 161 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysProjectTypeServiceImpl.java

@@ -0,0 +1,161 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysProjectTypeBo;
+import org.dromara.system.domain.vo.SysProjectTypeVo;
+import org.dromara.system.domain.SysProjectType;
+import org.dromara.system.mapper.SysProjectTypeMapper;
+import org.dromara.system.service.ISysProjectTypeService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 项目类型Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysProjectTypeServiceImpl  extends ServiceImpl<SysProjectTypeMapper, SysProjectType> implements ISysProjectTypeService {
+
+    private final SysProjectTypeMapper baseMapper;
+
+    /**
+     * 查询项目类型
+     *
+     * @param id 主键
+     * @return 项目类型
+     */
+    @Override
+    public SysProjectTypeVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询项目类型列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 项目类型分页列表
+     */
+    @Override
+    public TableDataInfo<SysProjectTypeVo> queryPageList(SysProjectTypeBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysProjectType> lqw = buildQueryWrapper(bo);
+        Page<SysProjectTypeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的项目类型列表
+     *
+     * @param bo 查询条件
+     * @return 项目类型列表
+     */
+    @Override
+    public List<SysProjectTypeVo> queryList(SysProjectTypeBo bo) {
+        LambdaQueryWrapper<SysProjectType> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysProjectType> buildQueryWrapper(SysProjectTypeBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysProjectType> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysProjectType::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getTypeCode()), SysProjectType::getTypeCode, bo.getTypeCode());
+        lqw.like(StringUtils.isNotBlank(bo.getTypeName()), SysProjectType::getTypeName, bo.getTypeName());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysProjectType::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SysProjectType::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增项目类型
+     *
+     * @param bo 项目类型
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysProjectTypeBo bo) {
+        SysProjectType add = MapstructUtils.convert(bo, SysProjectType.class);
+        // 自动生成编号
+        add.setTypeCode(generateTypeCode());
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 生成类型编号(格式:00001, 00002, ...)
+     */
+    private String generateTypeCode() {
+        // 查询当前最大编号
+        LambdaQueryWrapper<SysProjectType> lqw = Wrappers.lambdaQuery();
+        lqw.select(SysProjectType::getTypeCode);
+        lqw.orderByDesc(SysProjectType::getTypeCode);
+        lqw.last("LIMIT 1");
+        SysProjectType maxRecord = baseMapper.selectOne(lqw);
+
+        int nextNum = 1;
+        if (maxRecord != null && StringUtils.isNotBlank(maxRecord.getTypeCode())) {
+            try {
+                nextNum = Integer.parseInt(maxRecord.getTypeCode()) + 1;
+            } catch (NumberFormatException e) {
+                log.warn("解析类型编号失败: {}", maxRecord.getTypeCode());
+            }
+        }
+        // 格式化为5位数字,如 00001, 00002
+        return String.format("%05d", nextNum);
+    }
+
+    /**
+     * 修改项目类型
+     *
+     * @param bo 项目类型
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysProjectTypeBo bo) {
+        SysProjectType update = MapstructUtils.convert(bo, SysProjectType.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysProjectType entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除项目类型信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 164 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPurchaseCategoryServiceImpl.java

@@ -0,0 +1,164 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysPurchaseCategoryBo;
+import org.dromara.system.domain.vo.SysPurchaseCategoryVo;
+import org.dromara.system.domain.SysPurchaseCategory;
+import org.dromara.system.mapper.SysPurchaseCategoryMapper;
+import org.dromara.system.service.ISysPurchaseCategoryService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 采购分类Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysPurchaseCategoryServiceImpl  extends ServiceImpl<SysPurchaseCategoryMapper, SysPurchaseCategory> implements ISysPurchaseCategoryService {
+
+    private final SysPurchaseCategoryMapper baseMapper;
+
+    /**
+     * 查询采购分类
+     *
+     * @param id 主键
+     * @return 采购分类
+     */
+    @Override
+    public SysPurchaseCategoryVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询采购分类列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 采购分类分页列表
+     */
+    @Override
+    public TableDataInfo<SysPurchaseCategoryVo> queryPageList(SysPurchaseCategoryBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysPurchaseCategory> lqw = buildQueryWrapper(bo);
+        Page<SysPurchaseCategoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的采购分类列表
+     *
+     * @param bo 查询条件
+     * @return 采购分类列表
+     */
+    @Override
+    public List<SysPurchaseCategoryVo> queryList(SysPurchaseCategoryBo bo) {
+        LambdaQueryWrapper<SysPurchaseCategory> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysPurchaseCategory> buildQueryWrapper(SysPurchaseCategoryBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysPurchaseCategory> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysPurchaseCategory::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getCategoryCode()), SysPurchaseCategory::getCategoryCode, bo.getCategoryCode());
+        lqw.like(StringUtils.isNotBlank(bo.getCategoryName()), SysPurchaseCategory::getCategoryName, bo.getCategoryName());
+        lqw.eq(StringUtils.isNotBlank(bo.getCategoryDesc()), SysPurchaseCategory::getCategoryDesc, bo.getCategoryDesc());
+        lqw.eq(bo.getThematicQty() != null, SysPurchaseCategory::getThematicQty, bo.getThematicQty());
+        lqw.eq(bo.getSort() != null, SysPurchaseCategory::getSort, bo.getSort());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysPurchaseCategory::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SysPurchaseCategory::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增采购分类
+     *
+     * @param bo 采购分类
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysPurchaseCategoryBo bo) {
+        SysPurchaseCategory add = MapstructUtils.convert(bo, SysPurchaseCategory.class);
+        // 自动生成编号
+        add.setCategoryCode(generateCategoryCode());
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 生成分类编号(格式:00001, 00002, ...)
+     */
+    private String generateCategoryCode() {
+        // 查询当前最大编号
+        LambdaQueryWrapper<SysPurchaseCategory> lqw = Wrappers.lambdaQuery();
+        lqw.select(SysPurchaseCategory::getCategoryCode);
+        lqw.orderByDesc(SysPurchaseCategory::getCategoryCode);
+        lqw.last("LIMIT 1");
+        SysPurchaseCategory maxRecord = baseMapper.selectOne(lqw);
+
+        int nextNum = 1;
+        if (maxRecord != null && StringUtils.isNotBlank(maxRecord.getCategoryCode())) {
+            try {
+                nextNum = Integer.parseInt(maxRecord.getCategoryCode()) + 1;
+            } catch (NumberFormatException e) {
+                log.warn("解析分类编号失败: {}", maxRecord.getCategoryCode());
+            }
+        }
+        // 格式化为5位数字,如 00001, 00002
+        return String.format("%05d", nextNum);
+    }
+
+    /**
+     * 修改采购分类
+     *
+     * @param bo 采购分类
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysPurchaseCategoryBo bo) {
+        SysPurchaseCategory update = MapstructUtils.convert(bo, SysPurchaseCategory.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysPurchaseCategory entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除采购分类信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 187 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRuleCategoryServiceImpl.java

@@ -0,0 +1,187 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysRuleCategoryBo;
+import org.dromara.system.domain.vo.SysRuleCategoryVo;
+import org.dromara.system.domain.SysRuleCategory;
+import org.dromara.system.domain.SysRuleCenter;
+import org.dromara.system.mapper.SysRuleCategoryMapper;
+import org.dromara.system.mapper.SysRuleCenterMapper;
+import org.dromara.system.service.ISysRuleCategoryService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+/**
+ * 规则分类管理Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysRuleCategoryServiceImpl  extends ServiceImpl<SysRuleCategoryMapper, SysRuleCategory> implements ISysRuleCategoryService {
+
+    private final SysRuleCategoryMapper baseMapper;
+    private final SysRuleCenterMapper ruleCenterMapper;
+
+    /**
+     * 查询规则分类管理
+     *
+     * @param id 主键
+     * @return 规则分类管理
+     */
+    @Override
+    public SysRuleCategoryVo queryById(Long id){
+        SysRuleCategoryVo vo = baseMapper.selectVoById(id);
+        if (vo != null && StringUtils.isNotBlank(vo.getRuleCategoryNo())) {
+            // 统计该分类下的规则数量
+            LambdaQueryWrapper<SysRuleCenter> wrapper = Wrappers.lambdaQuery();
+            wrapper.eq(SysRuleCenter::getRuleType, vo.getRuleCategoryNo());
+            Long count = ruleCenterMapper.selectCount(wrapper);
+            vo.setTopicNum(count);
+        }
+        return vo;
+    }
+
+    /**
+     * 分页查询规则分类管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 规则分类管理分页列表
+     */
+    @Override
+    public TableDataInfo<SysRuleCategoryVo> queryPageList(SysRuleCategoryBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysRuleCategory> lqw = buildQueryWrapper(bo);
+        Page<SysRuleCategoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        // 统计每个分类下的规则数量
+        fillTopicNum(result.getRecords());
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的规则分类管理列表
+     *
+     * @param bo 查询条件
+     * @return 规则分类管理列表
+     */
+    @Override
+    public List<SysRuleCategoryVo> queryList(SysRuleCategoryBo bo) {
+        LambdaQueryWrapper<SysRuleCategory> lqw = buildQueryWrapper(bo);
+        List<SysRuleCategoryVo> list = baseMapper.selectVoList(lqw);
+        // 统计每个分类下的规则数量
+        fillTopicNum(list);
+        return list;
+    }
+
+    /**
+     * 填充分类下的规则数量
+     */
+    private void fillTopicNum(List<SysRuleCategoryVo> list) {
+        if (list == null || list.isEmpty()) {
+            return;
+        }
+        // 获取所有分类编号
+        List<String> categoryNos = list.stream()
+            .map(SysRuleCategoryVo::getRuleCategoryNo)
+            .filter(StringUtils::isNotBlank)
+            .collect(Collectors.toList());
+        if (categoryNos.isEmpty()) {
+            return;
+        }
+        // 查询所有规则,统计每个分类下的数量
+        LambdaQueryWrapper<SysRuleCenter> wrapper = Wrappers.lambdaQuery();
+        wrapper.in(SysRuleCenter::getRuleType, categoryNos);
+        List<SysRuleCenter> rules = ruleCenterMapper.selectList(wrapper);
+        // 按分类编号分组统计
+        Map<String, Long> countMap = rules.stream()
+            .collect(Collectors.groupingBy(SysRuleCenter::getRuleType, Collectors.counting()));
+        // 填充数量
+        for (SysRuleCategoryVo vo : list) {
+            Long count = countMap.getOrDefault(vo.getRuleCategoryNo(), 0L);
+            vo.setTopicNum(count);
+        }
+    }
+
+    private LambdaQueryWrapper<SysRuleCategory> buildQueryWrapper(SysRuleCategoryBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysRuleCategory> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysRuleCategory::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getRuleCategoryNo()), SysRuleCategory::getRuleCategoryNo, bo.getRuleCategoryNo());
+        lqw.like(StringUtils.isNotBlank(bo.getRuleCategoryName()), SysRuleCategory::getRuleCategoryName, bo.getRuleCategoryName());
+        lqw.eq(bo.getTopicNum() != null, SysRuleCategory::getTopicNum, bo.getTopicNum());
+        lqw.eq(bo.getIsShow() != null, SysRuleCategory::getIsShow, bo.getIsShow());
+        lqw.eq(StringUtils.isNotBlank(bo.getRuleCategoryImage()), SysRuleCategory::getRuleCategoryImage, bo.getRuleCategoryImage());
+        lqw.eq(bo.getRuleCategoryOrder() != null, SysRuleCategory::getRuleCategoryOrder, bo.getRuleCategoryOrder());
+        lqw.eq(StringUtils.isNotBlank(bo.getDescription()), SysRuleCategory::getDescription, bo.getDescription());
+        lqw.eq(StringUtils.isNotBlank(bo.getTopCategoryNo()), SysRuleCategory::getTopCategoryNo, bo.getTopCategoryNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SysRuleCategory::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增规则分类管理
+     *
+     * @param bo 规则分类管理
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysRuleCategoryBo bo) {
+        SysRuleCategory add = MapstructUtils.convert(bo, SysRuleCategory.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改规则分类管理
+     *
+     * @param bo 规则分类管理
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysRuleCategoryBo bo) {
+        SysRuleCategory update = MapstructUtils.convert(bo, SysRuleCategory.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysRuleCategory entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除规则分类管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 141 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRuleCenterServiceImpl.java

@@ -0,0 +1,141 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysRuleCenterBo;
+import org.dromara.system.domain.vo.SysRuleCenterVo;
+import org.dromara.system.domain.SysRuleCenter;
+import org.dromara.system.mapper.SysRuleCenterMapper;
+import org.dromara.system.service.ISysRuleCenterService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 规则中心Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-01-06
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysRuleCenterServiceImpl  extends ServiceImpl<SysRuleCenterMapper, SysRuleCenter> implements ISysRuleCenterService {
+
+    private final SysRuleCenterMapper baseMapper;
+
+    /**
+     * 查询规则中心
+     *
+     * @param id 主键
+     * @return 规则中心
+     */
+    @Override
+    public SysRuleCenterVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询规则中心列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 规则中心分页列表
+     */
+    @Override
+    public TableDataInfo<SysRuleCenterVo> queryPageList(SysRuleCenterBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysRuleCenter> lqw = buildQueryWrapper(bo);
+        Page<SysRuleCenterVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的规则中心列表
+     *
+     * @param bo 查询条件
+     * @return 规则中心列表
+     */
+    @Override
+    public List<SysRuleCenterVo> queryList(SysRuleCenterBo bo) {
+        LambdaQueryWrapper<SysRuleCenter> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysRuleCenter> buildQueryWrapper(SysRuleCenterBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysRuleCenter> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysRuleCenter::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getRuleCenterNo()), SysRuleCenter::getRuleCenterNo, bo.getRuleCenterNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getRuleTitle()), SysRuleCenter::getRuleTitle, bo.getRuleTitle());
+        lqw.eq(StringUtils.isNotBlank(bo.getRuleType()), SysRuleCenter::getRuleType, bo.getRuleType());
+        lqw.eq(StringUtils.isNotBlank(bo.getSubType()), SysRuleCenter::getSubType, bo.getSubType());
+        lqw.eq(bo.getIsShow() != null, SysRuleCenter::getIsShow, bo.getIsShow());
+        lqw.eq(StringUtils.isNotBlank(bo.getRuleImage()), SysRuleCenter::getRuleImage, bo.getRuleImage());
+        lqw.eq(StringUtils.isNotBlank(bo.getRuleContent()), SysRuleCenter::getRuleContent, bo.getRuleContent());
+        lqw.eq(bo.getSeePeoples() != null, SysRuleCenter::getSeePeoples, bo.getSeePeoples());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SysRuleCenter::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增规则中心
+     *
+     * @param bo 规则中心
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysRuleCenterBo bo) {
+        SysRuleCenter add = MapstructUtils.convert(bo, SysRuleCenter.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改规则中心
+     *
+     * @param bo 规则中心
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysRuleCenterBo bo) {
+        SysRuleCenter update = MapstructUtils.convert(bo, SysRuleCenter.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysRuleCenter entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除规则中心信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 174 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysServiceTimeServiceImpl.java

@@ -0,0 +1,174 @@
+package org.dromara.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysServiceTimeBo;
+import org.dromara.system.domain.vo.SysServiceTimeVo;
+import org.dromara.system.domain.SysServiceTime;
+import org.dromara.system.domain.SysAddressArea;
+import org.dromara.system.mapper.SysServiceTimeMapper;
+import org.dromara.system.mapper.SysAddressAreaMapper;
+import org.dromara.system.service.ISysServiceTimeService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+/**
+ * 服务时间Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysServiceTimeServiceImpl  extends ServiceImpl<SysServiceTimeMapper, SysServiceTime> implements ISysServiceTimeService {
+
+    private final SysServiceTimeMapper baseMapper;
+    private final SysAddressAreaMapper addressAreaMapper;
+
+    /**
+     * 查询服务时间
+     *
+     * @param id 主键
+     * @return 服务时间
+     */
+    @Override
+    public SysServiceTimeVo queryById(Long id){
+        SysServiceTimeVo vo = baseMapper.selectVoById(id);
+        if (vo != null && StringUtils.isNotBlank(vo.getAreaCode())) {
+            fillAreaName(List.of(vo));
+        }
+        return vo;
+    }
+
+    /**
+     * 分页查询服务时间列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 服务时间分页列表
+     */
+    @Override
+    public TableDataInfo<SysServiceTimeVo> queryPageList(SysServiceTimeBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysServiceTime> lqw = buildQueryWrapper(bo);
+        Page<SysServiceTimeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        // 填充区域名称
+        fillAreaName(result.getRecords());
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的服务时间列表
+     *
+     * @param bo 查询条件
+     * @return 服务时间列表
+     */
+    @Override
+    public List<SysServiceTimeVo> queryList(SysServiceTimeBo bo) {
+        LambdaQueryWrapper<SysServiceTime> lqw = buildQueryWrapper(bo);
+        List<SysServiceTimeVo> list = baseMapper.selectVoList(lqw);
+        fillAreaName(list);
+        return list;
+    }
+
+    /**
+     * 填充区域名称
+     */
+    private void fillAreaName(List<SysServiceTimeVo> list) {
+        if (list == null || list.isEmpty()) {
+            return;
+        }
+        List<String> areaCodes = list.stream()
+            .map(SysServiceTimeVo::getAreaCode)
+            .filter(StringUtils::isNotBlank)
+            .distinct()
+            .collect(Collectors.toList());
+        if (areaCodes.isEmpty()) {
+            return;
+        }
+        Map<String, String> areaMap = addressAreaMapper.selectList(
+            Wrappers.<SysAddressArea>lambdaQuery().in(SysAddressArea::getAreaCode, areaCodes)
+        ).stream().collect(Collectors.toMap(SysAddressArea::getAreaCode, SysAddressArea::getAreaName, (a, b) -> a));
+        
+        list.forEach(vo -> {
+            if (StringUtils.isNotBlank(vo.getAreaCode())) {
+                vo.setAreaName(areaMap.get(vo.getAreaCode()));
+            }
+        });
+    }
+
+    private LambdaQueryWrapper<SysServiceTime> buildQueryWrapper(SysServiceTimeBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysServiceTime> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysServiceTime::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getAreaCode()), SysServiceTime::getAreaCode, bo.getAreaCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getServiceDate()), SysServiceTime::getServiceDate, bo.getServiceDate());
+        lqw.eq(StringUtils.isNotBlank(bo.getServiceTime()), SysServiceTime::getServiceTime, bo.getServiceTime());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysServiceTime::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增服务时间
+     *
+     * @param bo 服务时间
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysServiceTimeBo bo) {
+        SysServiceTime add = MapstructUtils.convert(bo, SysServiceTime.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改服务时间
+     *
+     * @param bo 服务时间
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysServiceTimeBo bo) {
+        SysServiceTime update = MapstructUtils.convert(bo, SysServiceTime.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysServiceTime 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/SysAdaptSceneMapper.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.SysAdaptSceneMapper">
+
+</mapper>

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

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

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

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

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

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

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

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