Parcourir la source

加入小程序首页配置

Huanyi il y a 2 jours
Parent
commit
1a148365ae
23 fichiers modifiés avec 751 ajouts et 0 suppressions
  1. 10 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  2. 59 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAppletIndexCategoriesController.java
  3. 81 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAppletIndexSlideshowController.java
  4. 1 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysCustomerController.java
  5. 45 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAppletIndexCategories.java
  6. 35 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAppletIndexSlideshow.java
  7. 35 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAppletIndexCategoriesBo.java
  8. 27 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAppletIndexSlideshowBo.java
  9. 43 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAppletIndexCategoriesVo.java
  10. 39 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAppletIndexSlideshowVo.java
  11. 13 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAppletIndexCategoriesMapper.java
  12. 13 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAppletIndexSlideshowMapper.java
  13. 30 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAppletIndexCategoriesService.java
  14. 40 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAppletIndexSlideshowService.java
  15. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysCustomerService.java
  16. 47 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAppletIndexCategoriesServiceImpl.java
  17. 60 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAppletIndexSlideshowServiceImpl.java
  18. 51 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysCustomerServiceImpl.java
  19. 10 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/controller/ErpClientController.java
  20. 7 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/IErpClientService.java
  21. 8 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/impl/ErpClientServiceImpl.java
  22. 78 0
      script/sql/sqlserver/v1/HS_ERP_Order-create.sql
  23. 13 0
      script/sql/sqlserver/v1/HS_ERP_Order-update.sql

+ 10 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java

@@ -96,6 +96,16 @@ public interface CacheNames {
      */
     String SYS_PHONE = GlobalConstants.GLOBAL_REDIS_KEY + "sys_phone";
 
+    /**
+     * 小程序首页轮播图
+     */
+    String SYS_APPLET_SLIDESHOW = GlobalConstants.GLOBAL_REDIS_KEY + "sys_applet_slideshow";
+
+    /**
+     * 小程序首页精选分类
+     */
+    String SYS_APPLET_CATEGORIES = GlobalConstants.GLOBAL_REDIS_KEY + "sys_applet_categories";
+
     /**
      * 在线用户
      */

+ 59 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAppletIndexCategoriesController.java

@@ -0,0 +1,59 @@
+package org.dromara.system.controller.system;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.domain.bo.SysAppletIndexCategoriesBo;
+import org.dromara.system.domain.vo.SysAppletIndexCategoriesVo;
+import org.dromara.system.service.ISysAppletIndexCategoriesService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 小程序首页精选分类管理
+ *
+ * @Author: Trae
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/applet/categories")
+public class SysAppletIndexCategoriesController extends BaseController {
+
+    private final ISysAppletIndexCategoriesService categoriesService;
+
+    /**
+     * 查询全部精选分类
+     */
+    @SaIgnore
+    @GetMapping("/list")
+    public R<List<SysAppletIndexCategoriesVo>> list() {
+        return R.ok(categoriesService.queryAll());
+    }
+
+    /**
+     * 根据ID查询分类
+     */
+    @SaIgnore
+    @GetMapping("/{id}")
+    public R<SysAppletIndexCategoriesVo> getById(@PathVariable Long id) {
+        return R.ok(categoriesService.queryById(id));
+    }
+
+    /**
+     * 修改分类
+     */
+    @Log(title = "精选分类管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysAppletIndexCategoriesBo bo) {
+        categoriesService.updateByBo(bo);
+        return R.ok();
+    }
+
+}

+ 81 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAppletIndexSlideshowController.java

@@ -0,0 +1,81 @@
+package org.dromara.system.controller.system;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.domain.bo.SysAppletIndexSlideshowBo;
+import org.dromara.system.domain.vo.SysAppletIndexSlideshowVo;
+import org.dromara.system.service.ISysAppletIndexSlideshowService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 小程序首页轮播图管理
+ *
+ * @Author: Trae
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/applet/slideshow")
+public class SysAppletIndexSlideshowController extends BaseController {
+
+    private final ISysAppletIndexSlideshowService slideshowService;
+
+    /**
+     * 查询全部轮播图
+     */
+    @SaIgnore
+    @GetMapping("/list")
+    public R<List<SysAppletIndexSlideshowVo>> list() {
+        return R.ok(slideshowService.queryAll());
+    }
+
+    /**
+     * 根据ID查询轮播图
+     */
+    @SaIgnore
+    @GetMapping("/{id}")
+    public R<SysAppletIndexSlideshowVo> getById(@PathVariable Long id) {
+        return R.ok(slideshowService.queryById(id));
+    }
+
+    /**
+     * 新增轮播图
+     */
+    @Log(title = "轮播图管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysAppletIndexSlideshowBo bo) {
+        slideshowService.insertByBo(bo);
+        return R.ok();
+    }
+
+    /**
+     * 修改轮播图
+     */
+    @Log(title = "轮播图管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysAppletIndexSlideshowBo bo) {
+        slideshowService.updateByBo(bo);
+        return R.ok();
+    }
+
+    /**
+     * 删除轮播图
+     */
+    @Log(title = "轮播图管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+        slideshowService.deleteByIds(List.of(ids));
+        return R.ok();
+    }
+
+}

+ 1 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysCustomerController.java

@@ -99,6 +99,7 @@ public class SysCustomerController extends BaseController {
     @PutMapping("/auth")
     public R<Void> auth(@NotNull(message = "客户ID不能为空") Long id,
                         @NotEmpty(message = "授权客户 RowID 不能为空") String authClientFRowIDs) {
+        sysCustomerService.checkAuthClientConflict(id, authClientFRowIDs);
         SysCustomerBo bo = new SysCustomerBo();
         bo.setId(id);
         bo.setAuthClientFRowID(authClientFRowIDs);

+ 45 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAppletIndexCategories.java

@@ -0,0 +1,45 @@
+package org.dromara.system.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+
+/**
+ * 小程序首页精选分类表 sys_applet_index_categories
+ *
+ * @Author: Trae
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_applet_index_categories")
+public class SysAppletIndexCategories extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 分类ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 分类标题
+     */
+    private String title;
+
+    /**
+     * 备注说明
+     */
+    private String remark;
+
+    /**
+     * 背景图OSS ID
+     */
+    private Long background;
+
+}

+ 35 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAppletIndexSlideshow.java

@@ -0,0 +1,35 @@
+package org.dromara.system.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.io.Serial;
+
+/**
+ * 小程序首页轮播图表 sys_applet_index_slideshow
+ *
+ * @Author: Trae
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_applet_index_slideshow")
+public class SysAppletIndexSlideshow extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 轮播图ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * OSS资源ID
+     */
+    private Long ossId;
+
+}

+ 35 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAppletIndexCategoriesBo.java

@@ -0,0 +1,35 @@
+package org.dromara.system.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.system.domain.SysAppletIndexCategories;
+
+/**
+ * 小程序首页精选分类 BO
+ *
+ * @Author: Trae
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysAppletIndexCategories.class, reverseConvertGenerate = false)
+public class SysAppletIndexCategoriesBo extends BaseEntity {
+
+    @NotNull(message = "分类ID不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    @NotBlank(message = "分类标题不能为空")
+    @Size(min = 1, max = 50, message = "分类标题长度不能超过{max}个字符")
+    private String title;
+
+    @Size(max = 200, message = "备注长度不能超过{max}个字符")
+    private String remark;
+
+    private Long background;
+
+}

+ 27 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAppletIndexSlideshowBo.java

@@ -0,0 +1,27 @@
+package org.dromara.system.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.system.domain.SysAppletIndexSlideshow;
+
+/**
+ * 小程序首页轮播图 BO
+ *
+ * @Author: Trae
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysAppletIndexSlideshow.class, reverseConvertGenerate = false)
+public class SysAppletIndexSlideshowBo extends BaseEntity {
+
+    @NotNull(message = "轮播图ID不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    @NotNull(message = "OSS资源ID不能为空")
+    private Long ossId;
+
+}

+ 43 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAppletIndexCategoriesVo.java

@@ -0,0 +1,43 @@
+package org.dromara.system.domain.vo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.system.domain.SysAppletIndexCategories;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 小程序首页精选分类 VO
+ *
+ * @Author: Trae
+ */
+@Data
+@AutoMapper(target = SysAppletIndexCategories.class)
+public class SysAppletIndexCategoriesVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String title;
+
+    private String remark;
+
+    private Long background;
+
+    /**
+     * 背景图URL(通过OSS ID翻译)
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "background")
+    private String backgroundUrl;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+}

+ 39 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAppletIndexSlideshowVo.java

@@ -0,0 +1,39 @@
+package org.dromara.system.domain.vo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.system.domain.SysAppletIndexSlideshow;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 小程序首页轮播图 VO
+ *
+ * @Author: Trae
+ */
+@Data
+@AutoMapper(target = SysAppletIndexSlideshow.class)
+public class SysAppletIndexSlideshowVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private Long ossId;
+
+    /**
+     * 轮播图URL(通过OSS ID翻译)
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "ossId")
+    private String ossUrl;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+}

+ 13 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAppletIndexCategoriesMapper.java

@@ -0,0 +1,13 @@
+package org.dromara.system.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.system.domain.SysAppletIndexCategories;
+import org.dromara.system.domain.vo.SysAppletIndexCategoriesVo;
+
+/**
+ * 小程序首页精选分类 Mapper
+ *
+ * @Author: Trae
+ */
+public interface SysAppletIndexCategoriesMapper extends BaseMapperPlus<SysAppletIndexCategories, SysAppletIndexCategoriesVo> {
+}

+ 13 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAppletIndexSlideshowMapper.java

@@ -0,0 +1,13 @@
+package org.dromara.system.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.system.domain.SysAppletIndexSlideshow;
+import org.dromara.system.domain.vo.SysAppletIndexSlideshowVo;
+
+/**
+ * 小程序首页轮播图 Mapper
+ *
+ * @Author: Trae
+ */
+public interface SysAppletIndexSlideshowMapper extends BaseMapperPlus<SysAppletIndexSlideshow, SysAppletIndexSlideshowVo> {
+}

+ 30 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAppletIndexCategoriesService.java

@@ -0,0 +1,30 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.bo.SysAppletIndexCategoriesBo;
+import org.dromara.system.domain.vo.SysAppletIndexCategoriesVo;
+
+import java.util.List;
+
+/**
+ * 小程序首页精选分类 Service 接口
+ *
+ * @Author: Trae
+ */
+public interface ISysAppletIndexCategoriesService {
+
+    /**
+     * 查询全部精选分类
+     */
+    List<SysAppletIndexCategoriesVo> queryAll();
+
+    /**
+     * 根据ID查询
+     */
+    SysAppletIndexCategoriesVo queryById(Long id);
+
+    /**
+     * 修改分类
+     */
+    Boolean updateByBo(SysAppletIndexCategoriesBo bo);
+
+}

+ 40 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAppletIndexSlideshowService.java

@@ -0,0 +1,40 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.bo.SysAppletIndexSlideshowBo;
+import org.dromara.system.domain.vo.SysAppletIndexSlideshowVo;
+
+import java.util.List;
+
+/**
+ * 小程序首页轮播图 Service 接口
+ *
+ * @Author: Trae
+ */
+public interface ISysAppletIndexSlideshowService {
+
+    /**
+     * 查询全部轮播图
+     */
+    List<SysAppletIndexSlideshowVo> queryAll();
+
+    /**
+     * 根据ID查询
+     */
+    SysAppletIndexSlideshowVo queryById(Long id);
+
+    /**
+     * 新增轮播图
+     */
+    Boolean insertByBo(SysAppletIndexSlideshowBo bo);
+
+    /**
+     * 修改轮播图
+     */
+    Boolean updateByBo(SysAppletIndexSlideshowBo bo);
+
+    /**
+     * 删除轮播图
+     */
+    Boolean deleteByIds(List<Long> ids);
+
+}

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysCustomerService.java

@@ -35,6 +35,12 @@ public interface ISysCustomerService {
      */
     Boolean updateByBo(SysCustomerBo bo);
 
+    /**
+     * 校验授权客户是否已被其他客户占用
+     * @Author: Trae
+     */
+    void checkAuthClientConflict(Long customerId, String authClientFRowIDs);
+
     /**
      * 校验并批量删除客户信息
      */

+ 47 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAppletIndexCategoriesServiceImpl.java

@@ -0,0 +1,47 @@
+package org.dromara.system.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.system.domain.SysAppletIndexCategories;
+import org.dromara.system.domain.bo.SysAppletIndexCategoriesBo;
+import org.dromara.system.domain.vo.SysAppletIndexCategoriesVo;
+import org.dromara.system.mapper.SysAppletIndexCategoriesMapper;
+import org.dromara.system.service.ISysAppletIndexCategoriesService;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 小程序首页精选分类 Service
+ *
+ * @Author: Trae
+ */
+@RequiredArgsConstructor
+@Service
+public class SysAppletIndexCategoriesServiceImpl implements ISysAppletIndexCategoriesService {
+
+    private final SysAppletIndexCategoriesMapper baseMapper;
+
+    @Cacheable(cacheNames = CacheNames.SYS_APPLET_CATEGORIES, key = "'all'")
+    @Override
+    public List<SysAppletIndexCategoriesVo> queryAll() {
+        return baseMapper.selectVoList();
+    }
+
+    @Cacheable(cacheNames = CacheNames.SYS_APPLET_CATEGORIES, key = "#id")
+    @Override
+    public SysAppletIndexCategoriesVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    @CacheEvict(cacheNames = CacheNames.SYS_APPLET_CATEGORIES, allEntries = true)
+    @Override
+    public Boolean updateByBo(SysAppletIndexCategoriesBo bo) {
+        SysAppletIndexCategories entity = MapstructUtils.convert(bo, SysAppletIndexCategories.class);
+        return baseMapper.updateById(entity) > 0;
+    }
+
+}

+ 60 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAppletIndexSlideshowServiceImpl.java

@@ -0,0 +1,60 @@
+package org.dromara.system.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.system.domain.SysAppletIndexSlideshow;
+import org.dromara.system.domain.bo.SysAppletIndexSlideshowBo;
+import org.dromara.system.domain.vo.SysAppletIndexSlideshowVo;
+import org.dromara.system.mapper.SysAppletIndexSlideshowMapper;
+import org.dromara.system.service.ISysAppletIndexSlideshowService;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 小程序首页轮播图 Service
+ *
+ * @Author: Trae
+ */
+@RequiredArgsConstructor
+@Service
+public class SysAppletIndexSlideshowServiceImpl implements ISysAppletIndexSlideshowService {
+
+    private final SysAppletIndexSlideshowMapper baseMapper;
+
+    @Cacheable(cacheNames = CacheNames.SYS_APPLET_SLIDESHOW, key = "'all'")
+    @Override
+    public List<SysAppletIndexSlideshowVo> queryAll() {
+        return baseMapper.selectVoList();
+    }
+
+    @Cacheable(cacheNames = CacheNames.SYS_APPLET_SLIDESHOW, key = "#id")
+    @Override
+    public SysAppletIndexSlideshowVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    @CacheEvict(cacheNames = CacheNames.SYS_APPLET_SLIDESHOW, allEntries = true)
+    @Override
+    public Boolean insertByBo(SysAppletIndexSlideshowBo bo) {
+        SysAppletIndexSlideshow entity = MapstructUtils.convert(bo, SysAppletIndexSlideshow.class);
+        return baseMapper.insert(entity) > 0;
+    }
+
+    @CacheEvict(cacheNames = CacheNames.SYS_APPLET_SLIDESHOW, allEntries = true)
+    @Override
+    public Boolean updateByBo(SysAppletIndexSlideshowBo bo) {
+        SysAppletIndexSlideshow entity = MapstructUtils.convert(bo, SysAppletIndexSlideshow.class);
+        return baseMapper.updateById(entity) > 0;
+    }
+
+    @CacheEvict(cacheNames = CacheNames.SYS_APPLET_SLIDESHOW, allEntries = true)
+    @Override
+    public Boolean deleteByIds(List<Long> ids) {
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+}

+ 51 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysCustomerServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.service.CustomerService;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -22,11 +23,14 @@ import org.springframework.stereotype.Service;
 
 import org.dromara.yingpaipay.api.erp.CommonErpClientService;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -173,6 +177,53 @@ public class SysCustomerServiceImpl implements ISysCustomerService, CustomerServ
         return result;
     }
 
+    /**
+     * 校验授权客户是否已被其他客户占用
+     * @param customerId       当前操作的客户ID
+     * @param authClientFRowIDs 待授权的客户RowID(逗号分隔)
+     * @Author: Trae
+     */
+    @Override
+    public void checkAuthClientConflict(Long customerId, String authClientFRowIDs) {
+        Set<String> newRowIds = Arrays.stream(authClientFRowIDs.split(","))
+            .map(String::trim)
+            .filter(StringUtils::isNotBlank)
+            .collect(Collectors.toSet());
+        if (newRowIds.isEmpty()) {
+            return;
+        }
+        List<SysCustomer> otherCustomers = baseMapper.selectList(
+            Wrappers.lambdaQuery(SysCustomer.class)
+                .select(SysCustomer::getId, SysCustomer::getAuthClientFRowID)
+                .ne(SysCustomer::getId, customerId)
+                .isNotNull(SysCustomer::getAuthClientFRowID)
+                .ne(SysCustomer::getAuthClientFRowID, "")
+        );
+        Set<String> conflictRowIds = new HashSet<>();
+        for (SysCustomer other : otherCustomers) {
+            if (StringUtils.isBlank(other.getAuthClientFRowID())) {
+                continue;
+            }
+            for (String id : other.getAuthClientFRowID().split(",")) {
+                String trimmed = id.trim();
+                if (newRowIds.contains(trimmed)) {
+                    conflictRowIds.add(trimmed);
+                }
+            }
+        }
+        if (conflictRowIds.isEmpty()) {
+            return;
+        }
+        Map<String, CommonErpClientVo> infoMap = commonErpClientService.selectInfoByFRowIDs(new ArrayList<>(conflictRowIds));
+        String conflictNames = conflictRowIds.stream()
+            .map(id -> {
+                CommonErpClientVo vo = infoMap.get(id);
+                return vo != null ? vo.getName() : id;
+            })
+            .collect(Collectors.joining("、"));
+        throw new ServiceException("以下客户已被其他账号授权,请先取消后再操作:" + conflictNames);
+    }
+
     /**
      * 批量删除客户
      */

+ 10 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/controller/ErpClientController.java

@@ -13,6 +13,8 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * ERP 客户档案控制器
  *
@@ -34,6 +36,14 @@ public class ErpClientController {
         return erpClientService.queryPageList(query, pageQuery);
     }
 
+    /**
+     * 根据名称模糊检索客户(全量,不分页)
+     */
+    @GetMapping("/search")
+    public R<List<ErpClientVo>> search(String name) {
+        return R.ok(erpClientService.searchByName(name));
+    }
+
     /**
      * 获取客户详情
      */

+ 7 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/IErpClientService.java

@@ -5,6 +5,8 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.erp.domain.query.ErpClientQuery;
 import org.dromara.erp.domain.vo.ErpClientVo;
 
+import java.util.List;
+
 /**
  * HTSail_CS 客户档案 Service 接口
  *
@@ -17,6 +19,11 @@ public interface IErpClientService {
      */
     TableDataInfo<ErpClientVo> queryPageList(ErpClientQuery query, PageQuery pageQuery);
 
+    /**
+     * 根据名称模糊检索客户(全量,不分页)
+     */
+    List<ErpClientVo> searchByName(String name);
+
     /**
      * 根据ID查询客户详情
      */

+ 8 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/impl/ErpClientServiceImpl.java

@@ -63,6 +63,14 @@ public class ErpClientServiceImpl implements IErpClientService, CommonErpClientS
         return baseMapper.selectVoById(rowId);
     }
 
+    @Override
+    public List<ErpClientVo> searchByName(String name) {
+        LambdaQueryWrapper<ErpClient> lqw = Wrappers.lambdaQuery();
+        lqw.like(ErpClient::getName, name);
+        lqw.orderByAsc(ErpClient::getNum);
+        return baseMapper.selectVoList(lqw);
+    }
+
     private LambdaQueryWrapper<ErpClient> buildQueryWrapper(ErpClientQuery query) {
         LambdaQueryWrapper<ErpClient> lqw = Wrappers.lambdaQuery();
         lqw.like(StringUtils.isNotBlank(query.getName()), ErpClient::getName, query.getName());

+ 78 - 0
script/sql/sqlserver/v1/HS_ERP_Order-create.sql

@@ -188,3 +188,81 @@ EXEC sys.sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', N'd
 GO
 EXEC sys.sp_addextendedproperty 'MS_Description', N'协议信息表', 'SCHEMA', N'dbo', 'TABLE', N'sys_agreement'
 GO
+
+-- ----------------------------
+-- 小程序首页轮播图表
+-- ----------------------------
+create table sys_applet_index_slideshow
+(
+    id              bigint            NOT NULL,
+    oss_id          bigint            NULL,
+    create_dept     bigint,
+    create_by       bigint,
+    create_time     datetime2(7),
+    update_by       bigint,
+    update_time     datetime2(7),
+    CONSTRAINT PK__sys_applet_index_slideshow__id PRIMARY KEY CLUSTERED (id)
+    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+    ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty 'MS_Description', N'轮播图ID', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_slideshow', 'COLUMN', N'id'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'OSS资源ID', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_slideshow', 'COLUMN', N'oss_id'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_slideshow', 'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_slideshow', 'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_slideshow', 'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_slideshow', 'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_slideshow', 'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'小程序首页轮播图表', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_slideshow'
+GO
+
+-- ----------------------------
+-- 小程序首页精选分类表
+-- ----------------------------
+create table sys_applet_index_categories
+(
+    id              bigint            NOT NULL,
+    title           nvarchar(50)      DEFAULT ('') NULL,
+    remark          nvarchar(200)     DEFAULT ('') NULL,
+    background      bigint            NULL,
+    create_dept     bigint,
+    create_by       bigint,
+    create_time     datetime2(7),
+    update_by       bigint,
+    update_time     datetime2(7),
+    CONSTRAINT PK__sys_applet_index_categories__id PRIMARY KEY CLUSTERED (id)
+    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+    ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+EXEC sys.sp_addextendedproperty 'MS_Description', N'分类ID', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_categories', 'COLUMN', N'id'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'分类标题', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_categories', 'COLUMN', N'title'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'备注说明', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_categories', 'COLUMN', N'remark'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'背景图OSS ID', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_categories', 'COLUMN', N'background'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_categories', 'COLUMN', N'create_dept'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_categories', 'COLUMN', N'create_by'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_categories', 'COLUMN', N'create_time'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_categories', 'COLUMN', N'update_by'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_categories', 'COLUMN', N'update_time'
+GO
+EXEC sys.sp_addextendedproperty 'MS_Description', N'小程序首页精选分类表', 'SCHEMA', N'dbo', 'TABLE', N'sys_applet_index_categories'
+GO

+ 13 - 0
script/sql/sqlserver/v1/HS_ERP_Order-update.sql

@@ -13,3 +13,16 @@ GO
 INSERT INTO [dbo].[sys_phone] ([id], [expert_phone], [service_phone], [sales_phone], [create_by], [create_time], [update_by], [update_time])
 VALUES (1, N'13888888888', N'13888888888', N'13888888888', 1, GETDATE(), 1, GETDATE());
 GO
+
+-- ----------------------------
+-- sys_applet_index_categories 初始数据(精选分类)
+-- ----------------------------
+INSERT INTO [dbo].[sys_applet_index_categories] ([id], [title], [remark], [background], [create_by], [create_time], [update_by], [update_time])
+VALUES (1, N'型材下单', N'快速选购心仪型材', NULL, 1, GETDATE(), 1, GETDATE());
+INSERT INTO [dbo].[sys_applet_index_categories] ([id], [title], [remark], [background], [create_by], [create_time], [update_by], [update_time])
+VALUES (2, N'订单查询', N'实时追踪订单状态', NULL, 1, GETDATE(), 1, GETDATE());
+INSERT INTO [dbo].[sys_applet_index_categories] ([id], [title], [remark], [background], [create_by], [create_time], [update_by], [update_time])
+VALUES (3, N'投诉建议', N'您的意见是我们进步的动力', NULL, 1, GETDATE(), 1, GETDATE());
+INSERT INTO [dbo].[sys_applet_index_categories] ([id], [title], [remark], [background], [create_by], [create_time], [update_by], [update_time])
+VALUES (4, N'联系我们', N'专业团队竭诚为您服务', NULL, 1, GETDATE(), 1, GETDATE());
+GO