فهرست منبع

20241213 付费码管理

lrj 9 ماه پیش
والد
کامیت
671b22c549
79فایلهای تغییر یافته به همراه3012 افزوده شده و 403 حذف شده
  1. 4 4
      PCS/src/main/java/cn/cslg/permission/common/config/WebSocketConfig.java
  2. 13 0
      PCS/src/main/java/cn/cslg/permission/common/core/business/LoginCacheKeyUtil.java
  3. 8 0
      PCS/src/main/java/cn/cslg/permission/common/model/common/SystemDictDTO.java
  4. 36 0
      PCS/src/main/java/cn/cslg/permission/common/model/common/SystemFile.java
  5. 6 23
      PCS/src/main/java/cn/cslg/permission/common/model/dto/AppVipTypeDTO.java
  6. 14 5
      PCS/src/main/java/cn/cslg/permission/common/model/dto/AssoFunctionCodeDTO.java
  7. 4 5
      PCS/src/main/java/cn/cslg/permission/common/model/dto/QueryVersionListDTO.java
  8. 7 7
      PCS/src/main/java/cn/cslg/permission/common/model/dto/QueryVipDTO.java
  9. 1 0
      PCS/src/main/java/cn/cslg/permission/common/model/dto/SendCodeDTO.java
  10. 1 0
      PCS/src/main/java/cn/cslg/permission/common/model/dto/TenantVipTypeFunctionAddNewDTO.java
  11. 2 2
      PCS/src/main/java/cn/cslg/permission/common/model/dto/VersionDTO.java
  12. 18 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/AddTenantByPaidCodeDTO.java
  13. 9 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/CheckPaidCodePhoneCodeDTO.java
  14. 20 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/PaidCodeAddDTO.java
  15. 14 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/PaidCodeQueryDTO.java
  16. 26 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/PaidCodeQueryVO.java
  17. 20 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/PaidCodeReInfoVO.java
  18. 9 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/PaidCodeStatusDTO.java
  19. 10 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/VipTypeNumDTO.java
  20. 11 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/VipTypeNumVO.java
  21. 13 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/version/AddFunctionDTO.java
  22. 41 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/version/QiaoBiVersionVO.java
  23. 8 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/version/QueryFunctionCodeTreeVO.java
  24. 9 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/version/VersionStatusDTO.java
  25. 11 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/vipType/QueryVipFunctionDTO.java
  26. 5 13
      PCS/src/main/java/cn/cslg/permission/common/model/vo/AppVipTypeVO.java
  27. 50 0
      PCS/src/main/java/cn/cslg/permission/common/model/vo/FunctionCodeTreeVO.java
  28. 4 0
      PCS/src/main/java/cn/cslg/permission/common/utils/RandomUtil.java
  29. 32 0
      PCS/src/main/java/cn/cslg/permission/common/utils/web/RequestUtils.java
  30. 8 1
      PCS/src/main/java/cn/cslg/permission/controller/SystemController.java
  31. 1 4
      PCS/src/main/java/cn/cslg/permission/controller/qiaobi/AssoFunctionModuleController.java
  32. 84 0
      PCS/src/main/java/cn/cslg/permission/controller/qiaobi/PaidCodeController.java
  33. 14 1
      PCS/src/main/java/cn/cslg/permission/controller/qiaobi/QiaoApplitionController.java
  34. 7 0
      PCS/src/main/java/cn/cslg/permission/controller/qiaobi/QiaoBiPersonController.java
  35. 58 24
      PCS/src/main/java/cn/cslg/permission/controller/qiaobi/VersionController.java
  36. 23 9
      PCS/src/main/java/cn/cslg/permission/controller/qiaobi/VipTypeController.java
  37. 11 3
      PCS/src/main/java/cn/cslg/permission/domain/TenantVipType.java
  38. 12 1
      PCS/src/main/java/cn/cslg/permission/domain/Version.java
  39. 6 2
      PCS/src/main/java/cn/cslg/permission/domain/associate/AssoFunctionModule.java
  40. 24 0
      PCS/src/main/java/cn/cslg/permission/domain/qiaobi/AssoPaidCodeRegistInfo.java
  41. 25 0
      PCS/src/main/java/cn/cslg/permission/domain/qiaobi/AssoPaidCodeVipType.java
  42. 26 0
      PCS/src/main/java/cn/cslg/permission/domain/qiaobi/AssoVersionFunction.java
  43. 28 0
      PCS/src/main/java/cn/cslg/permission/domain/qiaobi/PaidCode.java
  44. 37 0
      PCS/src/main/java/cn/cslg/permission/domain/qiaobi/RegistInformation.java
  45. 3 1
      PCS/src/main/java/cn/cslg/permission/mapper/AssoTenantVipTypeFunctionMapper.java
  46. 0 1
      PCS/src/main/java/cn/cslg/permission/mapper/TenantVipTypeMapper.java
  47. 2 0
      PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/AppVipTypeMapper.java
  48. 18 0
      PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/AssoPaidCodeRegistInfoMapper.java
  49. 22 0
      PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/AssoPaidCodeVipTypeMapper.java
  50. 18 0
      PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/AssoVersionFunctionMapper.java
  51. 25 0
      PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/PaidCodeMapper.java
  52. 18 0
      PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/RegistInformationMapper.java
  53. 7 0
      PCS/src/main/java/cn/cslg/permission/service/ApplicationService.java
  54. 99 0
      PCS/src/main/java/cn/cslg/permission/service/AssoTenantVipTypeFunctionService.java
  55. 156 4
      PCS/src/main/java/cn/cslg/permission/service/FunctionService.java
  56. 32 0
      PCS/src/main/java/cn/cslg/permission/service/LoginService.java
  57. 27 1
      PCS/src/main/java/cn/cslg/permission/service/PersonnelService.java
  58. 30 7
      PCS/src/main/java/cn/cslg/permission/service/SystemService.java
  59. 251 104
      PCS/src/main/java/cn/cslg/permission/service/VersionService.java
  60. 0 74
      PCS/src/main/java/cn/cslg/permission/service/associate/AssoFunctionModuleService.java
  61. 45 27
      PCS/src/main/java/cn/cslg/permission/service/impl/TenantVipTypeService.java
  62. 51 0
      PCS/src/main/java/cn/cslg/permission/service/outSideApi/FileManagerService.java
  63. 120 61
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/AppVipTypeService.java
  64. 279 0
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoFunctionModuleService.java
  65. 32 0
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoPaidCodeRegistInfoService.java
  66. 97 0
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoPaidCodeVipTypeService.java
  67. 1 0
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoPersonVipTypeService.java
  68. 114 0
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoVersionFunctionService.java
  69. 303 0
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/PaidCodeService.java
  70. 54 0
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/RegistInformationService.java
  71. 3 1
      PCS/src/main/resources/application-dev.yml
  72. 2 1
      PCS/src/main/resources/application-testNetIn.yml
  73. 63 17
      PCS/src/main/resources/mapper/AppVipTypeMapper.xml
  74. 6 0
      PCS/src/main/resources/mapper/AssoPaidCodeRegistInfoMapper.xml
  75. 26 0
      PCS/src/main/resources/mapper/AssoPaidCodeVipTypeMapper.xml
  76. 98 0
      PCS/src/main/resources/mapper/PaidCodeMapper.xml
  77. 24 0
      PCS/src/main/resources/mapper/RegistInformationMapper.xml
  78. 41 0
      PCS/src/test/java/cn/cslg/permission/FunctionTest.java
  79. 175 0
      PCS/src/test/java/cn/cslg/permission/VersionTest.java

+ 4 - 4
PCS/src/main/java/cn/cslg/permission/common/config/WebSocketConfig.java

@@ -6,8 +6,8 @@ import org.springframework.web.socket.server.standard.ServerEndpointExporter;
 
 @Configuration
 public class WebSocketConfig {
-    @Bean
-    public ServerEndpointExporter serverEndpointExporter() {
-        return new ServerEndpointExporter();
-    }
+//    @Bean
+//    public ServerEndpointExporter serverEndpointExporter() {
+//        return new ServerEndpointExporter();
+//    }
 }

+ 13 - 0
PCS/src/main/java/cn/cslg/permission/common/core/business/LoginCacheKeyUtil.java

@@ -19,6 +19,8 @@ public class LoginCacheKeyUtil {
     public final static String PHONE_LOGIN = "PHONELOGIN";
 
     public final static String LOGIN_CAPTCHA  = "LOGIN_CAPTCHA";
+     public  final static  String PAID_CODE= "PAID_CODE";
+    private final  static String PHONE_CODE_TOKEN="PAID_CODE_TOKEN";
 
     /*
      * 获取用户手机号缓存key
@@ -32,4 +34,15 @@ public class LoginCacheKeyUtil {
         return builder.toString();
     }
 
+    public static String getPaidCodeCaptcha(String phoneNo) {
+        StringBuilder builder = new StringBuilder(prefix + SEPARATOR + PAID_CODE + SEPARATOR)
+                .append(phoneNo);
+        return builder.toString();
+    }
+
+    public static  String getPhoneCodeTokenPrefix(String paidCode){
+        StringBuilder builder = new StringBuilder(prefix + SEPARATOR + PHONE_CODE_TOKEN + SEPARATOR)
+                .append(paidCode);
+        return builder.toString();
+    }
 }

+ 8 - 0
PCS/src/main/java/cn/cslg/permission/common/model/common/SystemDictDTO.java

@@ -0,0 +1,8 @@
+package cn.cslg.permission.common.model.common;
+
+import lombok.Data;
+
+@Data
+public class SystemDictDTO {
+    private String type;
+}

+ 36 - 0
PCS/src/main/java/cn/cslg/permission/common/model/common/SystemFile.java

@@ -0,0 +1,36 @@
+package cn.cslg.permission.common.model.common;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 系统文件实体类
+ *
+ * @Author xiexiang
+ * @Date 2023/6/1
+ */
+@Data
+
+public class SystemFile  {
+    /**
+     * 文件guid
+     */
+    private String guid;
+
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+    /**
+     * 原始名称
+     */
+    private String originalName;
+
+    /**
+     * 文件类型
+     */
+    private String type;
+}

+ 6 - 23
PCS/src/main/java/cn/cslg/permission/common/model/dto/AppVipTypeDTO.java

@@ -3,6 +3,7 @@ package cn.cslg.permission.common.model.dto;
 import lombok.Data;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * @Author xiexiang
@@ -18,19 +19,14 @@ public class AppVipTypeDTO {
     private String applicationCode;
 
     /**
-     * 会员类型id
-     */
-    private Integer tenantVipTypeId;
-
-    /**
      * 持续时长 月
      */
     private Integer lastTime;
 
     /**
-     * 租户会员类型名称
+     * 会员类型名称
      */
-    private String tenantVipName;
+    private String vipTypeName;
     /**
      * 备注
      */
@@ -39,20 +35,7 @@ public class AppVipTypeDTO {
      * 是否启用
      */
     private Integer enable;
-    /**
-     * 创建时间
-     */
-    private Date createTime;
-    /**
-     * 创建人ID
-     */
-    private Integer createPersonId;
-    /**
-     * 创建人姓名
-     */
-    private String createPersonName;
-    /**
-     * 应用会员设置为1
-     */
-    private Integer useType;
+
+    private List<Integer> functionIds;
+
 }

+ 14 - 5
PCS/src/main/java/cn/cslg/permission/common/model/dto/AssoFunctionCodeDTO.java

@@ -2,6 +2,8 @@ package cn.cslg.permission.common.model.dto;
 
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @Author xiexiang
  * @Date 2024/11/27
@@ -9,9 +11,16 @@ import lombok.Data;
 @Data
 public class AssoFunctionCodeDTO {
     private Integer functionId;
-    private String code;
-    /**
-     * 是否授权(1未授权 2授权)
-     */
-    private Integer authType;
+    private List<FunctionCode> functionCodes;
+    private  Integer operateType;
+    @Data
+    public static class FunctionCode {
+
+        private String code;
+        /**
+         * 是否授权(1未授权 2授权)
+         */
+        private Integer authType;
+
+    }
 }

+ 4 - 5
PCS/src/main/java/cn/cslg/permission/common/model/dto/QueryVersionListDTO.java

@@ -2,6 +2,8 @@ package cn.cslg.permission.common.model.dto;
 
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @Author xiexiang
  * @Date 2024/11/20
@@ -11,13 +13,14 @@ public class QueryVersionListDTO {
     /**
      * 版本号
      */
+    private List<Integer> ids;
     private String versionNum;
 
     /**
      * 版本名称
      */
     private String versionName;
-
+    private Integer status;
     /**
      * 每页条数
      */
@@ -28,8 +31,4 @@ public class QueryVersionListDTO {
      */
     private Long size;
 
-    /**
-     * 数据总数
-     */
-    private Integer total;
 }

+ 7 - 7
PCS/src/main/java/cn/cslg/permission/common/model/dto/QueryVipDTO.java

@@ -2,6 +2,8 @@ package cn.cslg.permission.common.model.dto;
 
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @Author xiexiang
  * @Date 2024/11/20
@@ -11,19 +13,17 @@ public class QueryVipDTO {
     /**
      * 模糊查询检索条件
      */
-    private String vipName;
+    private List<Integer> ids;
+    private String vipTypeName;
+    private Integer enable;
     /**
      * 每页条数
      */
-    private Long pageSize;
+    private Long current;
 
     /**
      * 当前页数
      */
-    private Long pageNum;
+    private Long size;
 
-    /**
-     * 数据总数
-     */
-    private Integer total;
 }

+ 1 - 0
PCS/src/main/java/cn/cslg/permission/common/model/dto/SendCodeDTO.java

@@ -9,4 +9,5 @@ public class SendCodeDTO {
     //手机号
     @NotBlank
     private String phoneNum;
+    private String paidCode;
 }

+ 1 - 0
PCS/src/main/java/cn/cslg/permission/common/model/dto/TenantVipTypeFunctionAddNewDTO.java

@@ -15,6 +15,7 @@ import java.util.List;
 @Accessors(chain = true)
 @Data
 public class TenantVipTypeFunctionAddNewDTO implements Serializable {
+    private Integer id;
     /**
      * 会员名称
      */

+ 2 - 2
PCS/src/main/java/cn/cslg/permission/common/model/dto/VersionDTO.java

@@ -44,7 +44,7 @@ public class VersionDTO {
     private List<AssoFunctionCodeDTO> assoFunctionCodeDTOS;
 
     /**
-     * 创建人id
+     * 版本状态,1已保存,2调试,3已发布
      */
-    private Integer createUser;
+    private Integer status;
 }

+ 18 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/AddTenantByPaidCodeDTO.java

@@ -0,0 +1,18 @@
+package cn.cslg.permission.common.model.qiaobi.paidCode;
+
+import lombok.Data;
+
+@Data
+public class AddTenantByPaidCodeDTO {
+    private String tenantName;
+    private Integer tenantType;
+    private String tenantAddress;
+    private String personnelName;
+    private String personnelPhone;
+    private String personnelEmail;
+    private String personnelUserName;
+    private String personnelPassword;
+    private Integer id;
+    private String remark;
+    private String token;
+}

+ 9 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/CheckPaidCodePhoneCodeDTO.java

@@ -0,0 +1,9 @@
+package cn.cslg.permission.common.model.qiaobi.paidCode;
+
+import lombok.Data;
+
+@Data
+public class CheckPaidCodePhoneCodeDTO {
+    private String paidCode;
+    private String phoneCode;
+}

+ 20 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/PaidCodeAddDTO.java

@@ -0,0 +1,20 @@
+package cn.cslg.permission.common.model.qiaobi.paidCode;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PaidCodeAddDTO {
+    private List<VipTypeNumDTO> vipTypes;
+    private String tenantName;
+    private Integer tenantType;
+    private String tenantAddress;
+    private String personnelName;
+    private String personnelPhone;
+    private String personnelEmail;
+    private String personnelUserName;
+    private String personnelPassword;
+    private Integer id;
+    private String remark;
+}

+ 14 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/PaidCodeQueryDTO.java

@@ -0,0 +1,14 @@
+package cn.cslg.permission.common.model.qiaobi.paidCode;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PaidCodeQueryDTO {
+private List<Integer> ids;
+private Long current;
+private Long size;
+private String personnelPhone;
+private Integer status;
+}

+ 26 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/PaidCodeQueryVO.java

@@ -0,0 +1,26 @@
+package cn.cslg.permission.common.model.qiaobi.paidCode;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class PaidCodeQueryVO {
+    private List<VipTypeNumVO> vipTypes;
+    private String tenantName;
+    private Integer tenantType;
+    private String tenantAddress;
+    private String personnelName;
+    private String personnelPhone;
+    private String personnelEmail;
+    private String personnelUserName;
+    private String personnelPassword;
+    private String createName;
+    private Integer createId;
+    private Date createTime;
+    private Integer id;
+    private String code;
+    private Integer status;
+    private String remark;
+}

+ 20 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/PaidCodeReInfoVO.java

@@ -0,0 +1,20 @@
+package cn.cslg.permission.common.model.qiaobi.paidCode;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PaidCodeReInfoVO {
+    private String tenantName;
+    private Integer tenantType;
+    private String tenantAddress;
+    private String personnelName;
+    private String personnelPhone;
+    private String personnelEmail;
+    private String personnelUserName;
+    private String personnelPassword;
+    private Integer id;
+    private String remark;
+    private String token;
+}

+ 9 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/PaidCodeStatusDTO.java

@@ -0,0 +1,9 @@
+package cn.cslg.permission.common.model.qiaobi.paidCode;
+
+import lombok.Data;
+
+@Data
+public class PaidCodeStatusDTO {
+    private Integer id;
+    private Integer status;
+}

+ 10 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/VipTypeNumDTO.java

@@ -0,0 +1,10 @@
+package cn.cslg.permission.common.model.qiaobi.paidCode;
+
+import lombok.Data;
+
+@Data
+public class VipTypeNumDTO {
+    private Integer vipTypeId;
+    private Integer vipTypeNum;
+
+}

+ 11 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/paidCode/VipTypeNumVO.java

@@ -0,0 +1,11 @@
+package cn.cslg.permission.common.model.qiaobi.paidCode;
+
+import lombok.Data;
+
+@Data
+public class VipTypeNumVO {
+    private Integer vipTypeId;
+    private Integer paidCodeId;
+    private Integer vipTypeNum;
+    private String vipTypeName;
+}

+ 13 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/version/AddFunctionDTO.java

@@ -0,0 +1,13 @@
+package cn.cslg.permission.common.model.qiaobi.version;
+
+import lombok.Data;
+
+@Data
+public class AddFunctionDTO {
+    private String name;
+    private Integer function;
+    private String applicationCode;
+    private String sign;
+    private String path;
+    private String describe;
+}

+ 41 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/version/QiaoBiVersionVO.java

@@ -0,0 +1,41 @@
+package cn.cslg.permission.common.model.qiaobi.version;
+
+import cn.cslg.permission.common.model.common.SystemFile;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class QiaoBiVersionVO {
+    private Integer id;
+
+    /**
+     * 版本名称
+     */
+    private String versionName;
+
+    /**
+     * 版本号
+     */
+    private String versionNum;
+
+    /**
+     * /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 应用唯一标识符
+     */
+    private Integer status;
+    /**
+     * 创建人
+     */
+    private Integer createId;
+
+    private Date createTime;
+    private Date publishTime;
+    private String createName;
+    private SystemFile systemFile;
+}

+ 8 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/version/QueryFunctionCodeTreeVO.java

@@ -0,0 +1,8 @@
+package cn.cslg.permission.common.model.qiaobi.version;
+
+import lombok.Data;
+
+@Data
+public class QueryFunctionCodeTreeVO {
+    private Integer versionId;
+}

+ 9 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/version/VersionStatusDTO.java

@@ -0,0 +1,9 @@
+package cn.cslg.permission.common.model.qiaobi.version;
+
+import lombok.Data;
+
+@Data
+public class VersionStatusDTO {
+    private Integer id;
+    private Integer status;
+}

+ 11 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/vipType/QueryVipFunctionDTO.java

@@ -0,0 +1,11 @@
+package cn.cslg.permission.common.model.qiaobi.vipType;
+
+import lombok.Data;
+
+@Data
+public class QueryVipFunctionDTO {
+    private String applicationCode;
+    private Integer vipTypeId;
+    private Boolean ifAll;
+
+}

+ 5 - 13
PCS/src/main/java/cn/cslg/permission/common/model/vo/AppVipTypeVO.java

@@ -16,16 +16,6 @@ public class AppVipTypeVO {
     private Integer id;
 
     /**
-     * 应用代码
-     */
-    private String applicationCode;
-
-    /**
-     * 会员类型id
-     */
-    private Integer tenantVipTypeId;
-
-    /**
      * 持续时长 月
      */
     private Integer lastTime;
@@ -33,7 +23,7 @@ public class AppVipTypeVO {
     /**
      * 租户会员类型名称
      */
-    private String tenantVipName;
+    private String vipTypeName;
     /**
      * 备注
      */
@@ -41,11 +31,13 @@ public class AppVipTypeVO {
     /**
      * 创建人ID
      */
-    private Integer createPersonId;
+    private Integer createId;
+
+    private Integer enable;
     /**
      * 创建人姓名
      */
-    private String createPersonName;
+    private String createName;
     /**
      * 创建时间
      */

+ 50 - 0
PCS/src/main/java/cn/cslg/permission/common/model/vo/FunctionCodeTreeVO.java

@@ -0,0 +1,50 @@
+package cn.cslg.permission.common.model.vo;
+
+
+import cn.cslg.permission.domain.associate.AssoFunctionModule;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FunctionCodeTreeVO {
+    /**
+     * ID
+     */
+    private Integer id;
+
+    /**
+     * Front:功能名称
+     * Back:功能权限名称
+     */
+    private String name;
+
+    /**
+     * Front:功能描述
+     * Back:功能权限描述
+     */
+    private String describe;
+
+    /**
+     * Front:所属功能
+     * Back:功能权限(上级)
+     */
+    private Integer function;
+
+
+    /**
+     * Front:功能标识
+     * Back:功能权限对应功能
+     */
+    private String sign;
+
+    /**
+     * 功能树路径
+     */
+    private String path;
+
+    private List<AssoFunctionModule> functionCodes;
+
+    private List<FunctionCodeTreeVO> children;
+    private Integer isSelect;
+}

+ 4 - 0
PCS/src/main/java/cn/cslg/permission/common/utils/RandomUtil.java

@@ -2,6 +2,7 @@ package cn.cslg.permission.common.utils;
 
 import java.security.SecureRandom;
 import java.util.Random;
+import java.util.UUID;
 
 public class RandomUtil {
 
@@ -55,4 +56,7 @@ public class RandomUtil {
 
         return codeBuilder.toString();
     }
+    public static  String getOnlyCode(){
+      return   UUID.randomUUID().toString().replace("-","");
+    }
 }

+ 32 - 0
PCS/src/main/java/cn/cslg/permission/common/utils/web/RequestUtils.java

@@ -0,0 +1,32 @@
+package cn.cslg.permission.common.utils.web;
+
+import cn.cslg.permission.common.core.base.RedisConf;
+import cn.cslg.permission.common.model.vo.PersonnelVO;
+import cn.cslg.permission.exception.ExceptionEnum;
+import cn.cslg.permission.exception.XiaoShiException;
+import cn.dev33.satoken.exception.NotLoginException;
+import com.alibaba.fastjson2.JSONObject;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+@Component
+public class RequestUtils {
+
+
+    public static String getHeader(String header) {
+        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
+        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
+        HttpServletRequest httpRequest = sra.getRequest();
+        String tem = httpRequest.getHeader(header);
+        return tem;
+    }
+
+    public static String getApplicationHeader() {
+        return RequestUtils.getHeader("applicationCode");
+    }
+}

+ 8 - 1
PCS/src/main/java/cn/cslg/permission/controller/SystemController.java

@@ -2,6 +2,7 @@ package cn.cslg.permission.controller;
 
 import cn.cslg.permission.common.config.MailConstants;
 import cn.cslg.permission.common.core.base.Constants;
+import cn.cslg.permission.common.model.common.SystemDictDTO;
 import cn.cslg.permission.common.model.dto.PasUserDTO;
 import cn.cslg.permission.common.model.vo.DepartmentVO;
 import cn.cslg.permission.common.model.vo.EntrustVO;
@@ -43,10 +44,16 @@ public class SystemController {
 
     @GetMapping("/getDict")
     @Operation(summary = "获取字典项")
-    public String getDict() {
+    public String getDict( ) {
         return systemService.getDict();
     }
 
+
+    @PostMapping("/getSysDict")
+    @Operation(summary = "获取字典项")
+    public String getSysDict(@RequestBody SystemDictDTO systemDictDTO) {
+        return systemService.getSysDict(systemDictDTO);
+    }
     @GetMapping("/getPermissionList")
     @Operation(summary = "获取用户权限")
     public String getPermissionList(String code) {

+ 1 - 4
PCS/src/main/java/cn/cslg/permission/controller/qiaobi/AssoFunctionModuleController.java

@@ -2,12 +2,9 @@ package cn.cslg.permission.controller.qiaobi;
 
 import cn.cslg.permission.common.core.base.Constants;
 import cn.cslg.permission.common.model.Records;
-import cn.cslg.permission.common.model.dto.AppVipTypeDTO;
-import cn.cslg.permission.common.model.dto.AssoFunctionModuleDTO;
 import cn.cslg.permission.common.model.dto.AssoFunctionModuleUpdateDTO;
-import cn.cslg.permission.common.model.dto.QueryVipDTO;
 import cn.cslg.permission.common.utils.Response;
-import cn.cslg.permission.service.associate.AssoFunctionModuleService;
+import cn.cslg.permission.service.qiaobi.AssoFunctionModuleService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;

+ 84 - 0
PCS/src/main/java/cn/cslg/permission/controller/qiaobi/PaidCodeController.java

@@ -0,0 +1,84 @@
+package cn.cslg.permission.controller.qiaobi;
+
+import cn.cslg.permission.common.core.base.Constants;
+import cn.cslg.permission.common.model.Records;
+import cn.cslg.permission.common.model.dto.QueryVersionListDTO;
+import cn.cslg.permission.common.model.dto.SendCodeDTO;
+import cn.cslg.permission.common.model.dto.VersionDTO;
+import cn.cslg.permission.common.model.qiaobi.paidCode.PaidCodeAddDTO;
+import cn.cslg.permission.common.model.qiaobi.paidCode.PaidCodeQueryDTO;
+import cn.cslg.permission.common.model.qiaobi.paidCode.PaidCodeStatusDTO;
+import cn.cslg.permission.common.model.qiaobi.version.AddFunctionDTO;
+import cn.cslg.permission.common.model.qiaobi.version.QiaoBiVersionVO;
+import cn.cslg.permission.common.model.qiaobi.version.QueryFunctionCodeTreeVO;
+import cn.cslg.permission.common.model.qiaobi.version.VersionStatusDTO;
+import cn.cslg.permission.common.model.vo.FunctionCodeTreeVO;
+import cn.cslg.permission.common.model.vo.FunctionVO;
+import cn.cslg.permission.common.utils.Response;
+import cn.cslg.permission.common.utils.web.RequestUtils;
+import cn.cslg.permission.service.VersionService;
+import cn.cslg.permission.service.qiaobi.AssoFunctionModuleService;
+import cn.cslg.permission.service.qiaobi.PaidCodeService;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @Author lrj
+ * @Date 2024/12/09
+ */
+@Slf4j
+@RestController
+@RequestMapping(Constants.PERMISSION_API + "/paidCode")
+public class PaidCodeController {
+    @Autowired
+    private VersionService versionService;
+    @Autowired
+    private PaidCodeService paidCodeService;
+
+    @Operation(summary = "添加付款码")
+    @PostMapping("/add")
+    public String add(@RequestBody PaidCodeAddDTO paidCodeAddDTO) {
+       String code=   paidCodeService.addPaidCode(paidCodeAddDTO);
+        return Response.success(code);
+    }
+    @Operation(summary = "修改付款码")
+    @PostMapping("/update")
+    public String update(@RequestBody PaidCodeAddDTO paidCodeAddDTO) {
+        String code = paidCodeService.updatePaidCode(paidCodeAddDTO);
+        return Response.success(code);
+    }
+
+    @Operation(summary = "修改付款码状态")
+    @PostMapping("/updateStatus")
+    public String updateStatus(@RequestBody PaidCodeStatusDTO paidCodeStatusDTO) {
+        String code = paidCodeService.updatePaidCodeStatus(paidCodeStatusDTO);
+        return Response.success(code);
+    }
+
+    @Operation(summary = "查询付款码列表")
+    @PostMapping("/queryList")
+    public String queryList(@RequestBody PaidCodeQueryDTO paidCodeQueryDTO) {
+        Records records = paidCodeService.queryPaidCodeList(paidCodeQueryDTO);
+        return Response.success(records);
+    }
+    @Operation(summary = "根据付费码发送手机验证码")
+    @PostMapping("/sendPhoneCode")
+    public String sendPhoneCode(@RequestBody SendCodeDTO sendCodeDTO) {
+        String result = paidCodeService.sendPhoneCode(sendCodeDTO);
+        return Response.success(result);
+    }
+
+    @Operation(summary = "验证付费码")
+    @PostMapping("/checkPhoneCode")
+    public String checkPhoneCode(@RequestBody SendCodeDTO sendCodeDTO) {
+        String result = paidCodeService.sendPhoneCode(sendCodeDTO);
+        return Response.success(result);
+    }
+}

+ 14 - 1
PCS/src/main/java/cn/cslg/permission/controller/qiaobi/QiaoApplitionController.java

@@ -3,10 +3,14 @@ package cn.cslg.permission.controller.qiaobi;
 import cn.cslg.permission.common.core.base.Constants;
 import cn.cslg.permission.common.model.dto.PhoneLoginDTO;
 import cn.cslg.permission.common.model.qiaobi.QiaoBiPersonSignUpDTO;
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryVipFunctionDTO;
 import cn.cslg.permission.common.model.vo.ApplicationVO;
+import cn.cslg.permission.common.model.vo.FunctionCodeTreeVO;
 import cn.cslg.permission.common.model.vo.LoginVO;
 import cn.cslg.permission.common.model.vo.PersonnelVO;
 import cn.cslg.permission.common.utils.Response;
+import cn.cslg.permission.common.utils.web.RequestUtils;
+import cn.cslg.permission.service.FunctionService;
 import cn.cslg.permission.service.qiaobi.QiaoBiApplicationService;
 import cn.cslg.permission.service.qiaobi.QiaoBiPersonService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -20,6 +24,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 import java.util.Arrays;
+import java.util.List;
 
 /**
  * @author 沈永艺
@@ -32,12 +37,20 @@ import java.util.Arrays;
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class QiaoApplitionController {
     private final QiaoBiApplicationService qiaoBiApplicationService;
+    private final FunctionService functionService;
     @PostMapping("/queryApplication")
     @Operation(summary = "查询窍笔应用")
     public String personnelSignUp(@RequestBody ApplicationVO applicationVO) {
         applicationVO.setApplicationCodes(Arrays.asList("4e95e3d926a2a4befa5d913acc0aa9f5"));
         return  qiaoBiApplicationService.queryQiaoBiApplication(applicationVO);
-
     }
 
+    @PostMapping("/queryFunction")
+    @Operation(summary = "查询窍笔应用")
+    public String queryFunction(@RequestBody QueryVipFunctionDTO queryVipFunctionDTO) {
+        queryVipFunctionDTO.setApplicationCode(RequestUtils.getApplicationHeader());
+        queryVipFunctionDTO.setIfAll(true);
+        List<FunctionCodeTreeVO> vos= functionService.queryVipFunctionTree(queryVipFunctionDTO);
+        return Response.success(vos);
+    }
 }

+ 7 - 0
PCS/src/main/java/cn/cslg/permission/controller/qiaobi/QiaoBiPersonController.java

@@ -61,4 +61,11 @@ public class QiaoBiPersonController {
         qiaoBiPersonService.personSignUp(qiaoBiPersonSignUpDTO);
         return Response.success();
     }
+
+    @PostMapping("/companyPersonSignUp")
+    @Operation(summary = "企业用户注册")
+    public String companyPersonSignUp(@RequestBody QiaoBiPersonSignUpDTO qiaoBiPersonSignUpDTO) {
+        qiaoBiPersonService.personSignUp(qiaoBiPersonSignUpDTO);
+        return Response.success();
+    }
 }

+ 58 - 24
PCS/src/main/java/cn/cslg/permission/controller/qiaobi/VersionController.java

@@ -2,13 +2,24 @@ package cn.cslg.permission.controller.qiaobi;
 
 import cn.cslg.permission.common.core.base.Constants;
 import cn.cslg.permission.common.model.Records;
+import cn.cslg.permission.common.model.dto.QueryAssoFunctionModuleDTO;
 import cn.cslg.permission.common.model.dto.QueryVersionInfoDTO;
 import cn.cslg.permission.common.model.dto.QueryVersionListDTO;
 import cn.cslg.permission.common.model.dto.VersionDTO;
+import cn.cslg.permission.common.model.qiaobi.version.AddFunctionDTO;
+import cn.cslg.permission.common.model.qiaobi.version.QiaoBiVersionVO;
+import cn.cslg.permission.common.model.qiaobi.version.QueryFunctionCodeTreeVO;
+import cn.cslg.permission.common.model.qiaobi.version.VersionStatusDTO;
+import cn.cslg.permission.common.model.vo.FunctionCodeTreeVO;
+import cn.cslg.permission.common.model.vo.FunctionVO;
 import cn.cslg.permission.common.utils.Response;
+import cn.cslg.permission.common.utils.web.RequestUtils;
+import cn.cslg.permission.domain.Function;
 import cn.cslg.permission.service.VersionService;
+import cn.cslg.permission.service.qiaobi.AssoFunctionModuleService;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.http.RequestUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -25,43 +36,30 @@ import java.util.List;
 public class VersionController {
     @Autowired
     private VersionService versionService;
+    @Autowired
+    private AssoFunctionModuleService assoFunctionModuleService;
 
     @Operation(summary = "添加版本")
     @PostMapping("/add")
     public String add(@RequestBody VersionDTO versionDTO) {
-        Records records = versionService.add(versionDTO);
-        return Response.success(records);
+        versionDTO.setApplicationCode(RequestUtils.getApplicationHeader());
+        Integer id = versionService.add(versionDTO);
+        return Response.success(id);
     }
 
     @Operation(summary = "修改版本")
     @PostMapping("/update")
     public String update(@RequestBody VersionDTO versionDTO) {
-        Records records = versionService.update(versionDTO);
-        return Response.success(records);
+        versionDTO.setApplicationCode(RequestUtils.getApplicationHeader());
+        Integer id = versionService.update(versionDTO);
+        return Response.success(id);
     }
 
     @Operation(summary = "分页查询版本列表")
     @PostMapping("/queryVersionList")
-    public String queryVersionList(@RequestBody QueryVersionListDTO queryVersionListDTO){
-        Records records = versionService.queryVersionList(queryVersionListDTO);
-        return Response.success(records);
-    }
-
-    @Operation(summary = "查询版本详情")
-    @PostMapping("/queryVersionInfo")
-    public String queryVersionInfo(@RequestBody QueryVersionInfoDTO queryVersionInfoDTO){
-        Records records = versionService.queryVersionInfo(queryVersionInfoDTO);
-        return Response.success(records);
-    }
-
-    @Operation(summary = "根据id查询版本信息")
-    @GetMapping("/queryById")
-    public String queryById(Integer id) throws IOException {
-        Records records = new Records();
-        if (id != null) {
-            records = versionService.queryById(id);
-        }
-        return Response.success(records);
+    public String queryVersionList(@RequestBody QueryVersionListDTO queryVersionListDTO) {
+        Records record1 = versionService.queryVersionList(queryVersionListDTO);
+        return Response.success(record1);
     }
 
     @Operation(summary = "根据ids删除")
@@ -73,4 +71,40 @@ public class VersionController {
         }
         return Response.error("请求参数为null");
     }
+
+    @Operation(summary = "添加功能")
+    @PostMapping("/addFunction")
+    public String addFunction(@RequestBody AddFunctionDTO addFunctionDTO) {
+        addFunctionDTO.setApplicationCode(RequestUtils.getApplicationHeader());
+        FunctionVO function = versionService.addFunction(addFunctionDTO);
+        return Response.success(function);
+    }
+
+    @Operation(summary = "获取版本功能以及代码")
+    @PostMapping("/queryFunctionCode")
+    public String queryFunctionCode(@RequestBody QueryFunctionCodeTreeVO queryFunctionCodeTreeVO) {
+        List<FunctionCodeTreeVO> vos = assoFunctionModuleService.getFunctionCodeTree(queryFunctionCodeTreeVO);
+        return Response.success(vos);
+    }
+
+    @Operation(summary = "更新版本状态")
+    @PostMapping("/updateStatus")
+    public String updateStatus(@RequestBody VersionStatusDTO versionStatusDTO) {
+        Integer id = versionService.updateVersionStatus(versionStatusDTO);
+        return Response.success(id);
+    }
+
+    @Operation(summary = "分页查询版本列表")
+    @PostMapping("/queryPublicVersionList")
+    public String queryPublicVersionList(@RequestBody QueryVersionListDTO queryVersionListDTO) {
+        queryVersionListDTO.setStatus(3);
+        Records record11 = versionService.queryVersionList(queryVersionListDTO);
+        return Response.success(record11);
+    }
+    @Operation(summary = "查询最新公开版本")
+    @PostMapping("/queryPublicVersionLast")
+    public String queryPublicVersionLast() {
+        QiaoBiVersionVO qiaoBiVersionVO = versionService.queryVersionLast();
+        return Response.success(qiaoBiVersionVO);
+    }
 }

+ 23 - 9
PCS/src/main/java/cn/cslg/permission/controller/qiaobi/VipTypeController.java

@@ -6,9 +6,13 @@ import cn.cslg.permission.common.model.dto.AppVipTypeDTO;
 import cn.cslg.permission.common.model.dto.QueryVipDTO;
 import cn.cslg.permission.common.model.qiaobi.QiaoBiVIPTypeVO;
 import cn.cslg.permission.common.model.qiaobi.QiaoBiVipTypeDTO;
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryVipFunctionDTO;
+import cn.cslg.permission.common.model.vo.FunctionCodeTreeVO;
 import cn.cslg.permission.common.utils.Response;
+import cn.cslg.permission.common.utils.web.RequestUtils;
 import cn.cslg.permission.domain.qiaobi.AppVipType;
 import cn.cslg.permission.service.ApplicationService;
+import cn.cslg.permission.service.FunctionService;
 import cn.cslg.permission.service.qiaobi.AppVipTypeService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -29,37 +33,39 @@ import java.util.List;
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class VipTypeController {
     private final AppVipTypeService appVipTypeService;
+    private final FunctionService functionService;
 
     @PostMapping("/queryQiaoBiVipType")
-    public String queryQiaoBiVipType(@RequestBody QiaoBiVipTypeDTO qiaoBiVipTypeDTO){
-      List<QiaoBiVIPTypeVO> qiaoBiVIPTypeVOList=  appVipTypeService.qiaoBiVIPTypeVOList(qiaoBiVipTypeDTO);
-      return Response.success(qiaoBiVIPTypeVOList);
+    public String queryQiaoBiVipType(@RequestBody QiaoBiVipTypeDTO qiaoBiVipTypeDTO) {
+        List<QiaoBiVIPTypeVO> qiaoBiVIPTypeVOList = appVipTypeService.qiaoBiVIPTypeVOList(qiaoBiVipTypeDTO);
+        return Response.success(qiaoBiVIPTypeVOList);
     }
 
     @Operation(summary = "添加会员")
     @PostMapping("/add")
     public String add(@RequestBody AppVipTypeDTO appVipTypeDTO) {
-        Records records = appVipTypeService.add(appVipTypeDTO);
-        return Response.success(records);
+        appVipTypeDTO.setApplicationCode(RequestUtils.getApplicationHeader());
+        Integer id = appVipTypeService.add(appVipTypeDTO);
+        return Response.success(id);
     }
 
     @Operation(summary = "修改会员")
     @PostMapping("/update")
     public String update(@RequestBody AppVipTypeDTO appVipTypeDTO) {
-        Records records = appVipTypeService.update(appVipTypeDTO);
-        return Response.success(records);
+        Integer id = appVipTypeService.update(appVipTypeDTO);
+        return Response.success(id);
     }
 
     @Operation(summary = "分页查询会员列表")
     @PostMapping("/query")
-    public String query(@RequestBody QueryVipDTO queryVipDTO){
+    public String query(@RequestBody QueryVipDTO queryVipDTO) {
         Records records = appVipTypeService.queryAppVipType(queryVipDTO);
         return Response.success(records);
     }
 
     @Operation(summary = "根据id查询会员信息")
     @GetMapping("/queryById")
-    public String queryById(Integer id){
+    public String queryById(Integer id) {
         Records records = new Records();
         if (id != null) {
             records = appVipTypeService.getVipById(id);
@@ -77,4 +83,12 @@ public class VipTypeController {
         return Response.error("删除失败");
     }
 
+    @PostMapping("/queryFunction")
+    @Operation(summary = "查询窍笔应用")
+    public String queryFunction(@RequestBody QueryVipFunctionDTO queryVipFunctionDTO) {
+        queryVipFunctionDTO.setApplicationCode(RequestUtils.getApplicationHeader());
+        queryVipFunctionDTO.setIfAll(false);
+        List<FunctionCodeTreeVO> vos = functionService.queryVipFunctionTree(queryVipFunctionDTO);
+        return Response.success(vos);
+    }
 }

+ 11 - 3
PCS/src/main/java/cn/cslg/permission/domain/TenantVipType.java

@@ -1,9 +1,12 @@
 package cn.cslg.permission.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
@@ -17,40 +20,45 @@ import java.util.Date;
  * @Data 2023/2/15
  */
 @TableName(value = "TENANT_VIP_TYPE")
-@Accessors(chain = true)
 @Data
-public class TenantVipType implements Serializable {
+public class TenantVipType extends Model {
     /**
      * 主键ID
      */
-    @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
     /**
      * 租户会员类型名称
      */
+    @TableField(value = "TENANT_VIP_NAME")
     private String tenantVipName;
     /**
      * 备注
      */
+    @TableField(value = "REMARK")
     private String remark;
     /**
      * 是否启用
      */
+    @TableField(value = "ENABLE")
     private Integer enable;
     /**
      * 创建时间
      */
+    @TableField(value = "CREATE_TIME")
     private Date createTime;
     /**
      * 创建人ID
      */
+    @TableField(value = "CREATE_PERSON_ID")
     private Integer createPersonId;
     /**
      * 创建人姓名
      */
+    @TableField(value = "CREATE_PERSON_NAME")
     private String createPersonName;
     /**
      * 应用会员设置为1
      */
+    @TableField(value = "USE_TYPE")
     private Integer useType;
 }

+ 12 - 1
PCS/src/main/java/cn/cslg/permission/domain/Version.java

@@ -1,6 +1,8 @@
 package cn.cslg.permission.domain;
 
 import cn.cslg.permission.common.model.BaseEntity;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.Data;
@@ -10,6 +12,7 @@ import java.util.Date;
 
 /**
  * 版本
+ *
  * @Author xiexiang
  * @Date 2024/11/19
  */
@@ -43,4 +46,12 @@ public class Version extends Model {
      * 应用唯一标识符
      */
     private String applicationCode;
-}
+    private Integer status;
+    /**
+     * 创建人
+     */
+    private Integer createId;
+
+    private Date createTime;
+    private Date publishTime;
+}

+ 6 - 2
PCS/src/main/java/cn/cslg/permission/domain/associate/AssoFunctionModule.java

@@ -3,6 +3,8 @@ package cn.cslg.permission.domain.associate;
 import cn.cslg.permission.common.model.BaseEntity;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.models.security.SecurityScheme;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -17,8 +19,8 @@ import lombok.experimental.Accessors;
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = true)
 @TableName(value = "ASSO_FUNCTION_MODULE")
-public class AssoFunctionModule extends BaseEntity<AssoFunctionModule> {
-
+public class AssoFunctionModule extends Model<AssoFunctionModule> {
+    private Integer id;
     /**
      * 关联功能id
      */
@@ -48,5 +50,7 @@ public class AssoFunctionModule extends BaseEntity<AssoFunctionModule> {
      */
     @TableField(value = "VERSION_ID")
     private Integer versionId;
+    private Integer CreateUser;
+
 
 }

+ 24 - 0
PCS/src/main/java/cn/cslg/permission/domain/qiaobi/AssoPaidCodeRegistInfo.java

@@ -0,0 +1,24 @@
+package cn.cslg.permission.domain.qiaobi;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+/**
+ * @TableName ASSO_PAID_CODE_REGIST_INFO
+ */
+@TableName(value ="ASSO_PAID_CODE_REGIST_INFO")
+@Data
+public class AssoPaidCodeRegistInfo extends Model<AssoPaidCodeRegistInfo> {
+    private Integer id;
+
+    private Integer paidCodeId;
+
+    private Integer registInfoId;
+
+}

+ 25 - 0
PCS/src/main/java/cn/cslg/permission/domain/qiaobi/AssoPaidCodeVipType.java

@@ -0,0 +1,25 @@
+package cn.cslg.permission.domain.qiaobi;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+/**
+ * @TableName ASSO_PAID_CODE_VIP_TYPE
+ */
+@TableName(value ="ASSO_PAID_CODE_VIP_TYPE")
+@Data
+public class AssoPaidCodeVipType extends Model {
+    private Integer id;
+
+    private Integer paidCodeId;
+
+    private Integer vipTypeId;
+
+    private Integer vipTypeNum;
+}

+ 26 - 0
PCS/src/main/java/cn/cslg/permission/domain/qiaobi/AssoVersionFunction.java

@@ -0,0 +1,26 @@
+package cn.cslg.permission.domain.qiaobi;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+/**
+ * @TableName ASSO_VERSION_FUNCTION
+ */
+@TableName(value ="ASSO_VERSION_FUNCTION")
+@Data
+public class AssoVersionFunction extends Model {
+    private Integer id;
+
+    private Integer versionId;
+
+    private Integer functionId;
+
+    private String functionModifyPath;
+
+}

+ 28 - 0
PCS/src/main/java/cn/cslg/permission/domain/qiaobi/PaidCode.java

@@ -0,0 +1,28 @@
+package cn.cslg.permission.domain.qiaobi;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+/**
+ * @TableName PAID_CODE
+ */
+@TableName(value = "PAID_CODE")
+@Data
+public class PaidCode extends Model {
+    private Integer id;
+    private String code;
+    private Integer status;
+
+    private Date createTime;
+
+    private Integer createId;
+    private String remark;
+}

+ 37 - 0
PCS/src/main/java/cn/cslg/permission/domain/qiaobi/RegistInformation.java

@@ -0,0 +1,37 @@
+package cn.cslg.permission.domain.qiaobi;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+/**
+ * @TableName REGIST_INFORMATION
+ */
+@TableName(value ="REGIST_INFORMATION")
+@Data
+public class RegistInformation extends Model {
+    private Integer id;
+
+    private String tenantName;
+
+    private Integer tenantType;
+
+    private String tenantAddress;
+
+    private String personnelName;
+
+    private String personnelPhone;
+
+    private String personnelEmail;
+
+    private String personnelUsername;
+
+    private String personnelPassword;
+
+    private static final long serialVersionUID = 1L;
+}

+ 3 - 1
PCS/src/main/java/cn/cslg/permission/mapper/AssoTenantVipTypeFunctionMapper.java

@@ -1,7 +1,9 @@
 package cn.cslg.permission.mapper;
 
 import cn.cslg.permission.common.model.vo.AssoTenantVipTypeAndFunctionVO;
+import cn.cslg.permission.domain.Application;
 import cn.cslg.permission.domain.AssoTenantVipTypeAndFunction;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -13,7 +15,7 @@ import java.util.List;
  * @Data 2023/2/15
  */
 @Repository
-public interface AssoTenantVipTypeFunctionMapper {
+public interface AssoTenantVipTypeFunctionMapper extends BaseMapper<AssoTenantVipTypeAndFunction> {
     /**
      * 批量插入数据
      *

+ 0 - 1
PCS/src/main/java/cn/cslg/permission/mapper/TenantVipTypeMapper.java

@@ -17,7 +17,6 @@ import java.util.List;
  * @Author chenyu
  * @Data 2023/2/15
  */
-@Repository
 public interface TenantVipTypeMapper extends BaseMapper<TenantVipType> {
     /**
      * 插入数据

+ 2 - 0
PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/AppVipTypeMapper.java

@@ -19,6 +19,8 @@ import java.util.List;
 public interface AppVipTypeMapper extends BaseMapper<AppVipType> {
     public List<QiaoBiVIPTypeVO> queryQiaobiVipTypeVOs(QiaoBiVipTypeDTO qiaoBiVipTypeDTO);
     List<AppVipTypeVO> queryAppVipType(QueryVipDTO queryVipDTO);
+    Long queryAppVipTypeTotal(QueryVipDTO queryVipDTO);
+
 }
 
 

+ 18 - 0
PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/AssoPaidCodeRegistInfoMapper.java

@@ -0,0 +1,18 @@
+package cn.cslg.permission.mapper.qiaobi;
+
+import cn.cslg.permission.domain.qiaobi.AssoPaidCodeRegistInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author admin
+* @description 针对表【ASSO_PAID_CODE_REGIST_INFO(付费码和注册信息关联表)】的数据库操作Mapper
+* @createDate 2024-12-09 15:33:14
+* @Entity generator.domain.AssoPaidCodeRegistInfo
+*/
+public interface AssoPaidCodeRegistInfoMapper extends BaseMapper<AssoPaidCodeRegistInfo> {
+
+}
+
+
+
+

+ 22 - 0
PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/AssoPaidCodeVipTypeMapper.java

@@ -0,0 +1,22 @@
+package cn.cslg.permission.mapper.qiaobi;
+
+import cn.cslg.permission.common.model.qiaobi.paidCode.VipTypeNumVO;
+import cn.cslg.permission.domain.qiaobi.AssoPaidCodeVipType;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+* @author admin
+* @description 针对表【ASSO_PAID_CODE_VIP_TYPE】的数据库操作Mapper
+* @createDate 2024-12-09 15:16:30
+* @Entity generator.domain.AssoPaidCodeVipType
+*/
+public interface AssoPaidCodeVipTypeMapper extends BaseMapper<AssoPaidCodeVipType> {
+   List<VipTypeNumVO> queryVipNumList(List<Integer> paidCodeIds);
+
+}
+
+
+
+

+ 18 - 0
PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/AssoVersionFunctionMapper.java

@@ -0,0 +1,18 @@
+package cn.cslg.permission.mapper.qiaobi;
+
+import cn.cslg.permission.domain.qiaobi.AssoVersionFunction;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author admin
+* @description 针对表【ASSO_VERSION_FUNCTION(租户会员类型和功能关联表)】的数据库操作Mapper
+* @createDate 2024-12-03 18:11:52
+* @Entity generator.domain.AssoVersionFunction
+*/
+public interface AssoVersionFunctionMapper extends BaseMapper<AssoVersionFunction> {
+
+}
+
+
+
+

+ 25 - 0
PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/PaidCodeMapper.java

@@ -0,0 +1,25 @@
+package cn.cslg.permission.mapper.qiaobi;
+
+import cn.cslg.permission.common.model.qiaobi.paidCode.PaidCodeQueryDTO;
+import cn.cslg.permission.common.model.qiaobi.paidCode.PaidCodeQueryVO;
+import cn.cslg.permission.domain.qiaobi.PaidCode;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ * @author admin
+ * @description 针对表【PAID_CODE(付费码)】的数据库操作Mapper
+ * @createDate 2024-12-09 15:13:38
+ * @Entity generator.domain.PaidCode
+ */
+public interface PaidCodeMapper extends BaseMapper<PaidCode> {
+
+    List<PaidCodeQueryVO> queryPaidCodeList(PaidCodeQueryDTO paidCodeQueryDTO);
+
+    Long queryPaidCodeListTotal(PaidCodeQueryDTO paidCodeQueryDTO);
+}
+
+
+
+

+ 18 - 0
PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/RegistInformationMapper.java

@@ -0,0 +1,18 @@
+package cn.cslg.permission.mapper.qiaobi;
+
+import cn.cslg.permission.domain.qiaobi.RegistInformation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author admin
+* @description 针对表【REGIST_INFORMATION(注册信息表)】的数据库操作Mapper
+* @createDate 2024-12-09 15:16:11
+* @Entity generator.domain.RegistInformation
+*/
+public interface RegistInformationMapper extends BaseMapper<RegistInformation> {
+
+}
+
+
+
+

+ 7 - 0
PCS/src/main/java/cn/cslg/permission/service/ApplicationService.java

@@ -253,4 +253,11 @@ public class ApplicationService extends ServiceImpl<ApplicationMapper, Applicati
         return Response.success(setApplicationToVO(applicationList), DataUtils.setPageColumn(applicationVO.getSize(), applicationVO.getCurrent(), Math.toIntExact(this.count(queryWrapper))));
     }
 
+    public Application getByCode(String applicationCode) {
+        LambdaQueryWrapper<Application> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Application::getApplicationCode, applicationCode);
+        Application application = this.getOne(queryWrapper, false);
+        return application;
+    }
+
 }

+ 99 - 0
PCS/src/main/java/cn/cslg/permission/service/AssoTenantVipTypeFunctionService.java

@@ -0,0 +1,99 @@
+package cn.cslg.permission.service;
+
+import cn.cslg.permission.common.model.dto.AssoFunctionCodeDTO;
+import cn.cslg.permission.domain.AssoTenantVipTypeAndFunction;
+import cn.cslg.permission.domain.Client;
+import cn.cslg.permission.domain.associate.AssoFunctionModule;
+import cn.cslg.permission.mapper.AssoTenantVipTypeFunctionMapper;
+import cn.cslg.permission.mapper.ClientMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.swagger.v3.oas.models.security.SecurityScheme;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class AssoTenantVipTypeFunctionService extends ServiceImpl<AssoTenantVipTypeFunctionMapper, AssoTenantVipTypeAndFunction> {
+
+    @Transactional(rollbackFor = Exception.class)
+    public void saveFunctionModuleBatch(List<Integer> functionIds, Integer tenantVipTypeId) {
+        if (functionIds == null || functionIds.size() == 0) {
+            return;
+        }
+
+        LambdaQueryWrapper<AssoTenantVipTypeAndFunction> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoTenantVipTypeAndFunction::getTenantVipTypeId, tenantVipTypeId);
+        List<AssoTenantVipTypeAndFunction> assoFunctionCodeDTOS = this.list(queryWrapper);
+        List<Integer> orgFunctionIds = new ArrayList<>();
+        if (assoFunctionCodeDTOS != null && assoFunctionCodeDTOS.size() > 0) {
+            orgFunctionIds = assoFunctionCodeDTOS.stream().map(AssoTenantVipTypeAndFunction::getFunctionId).collect(Collectors.toList());
+        }
+
+        Iterator<Integer> assoIterator = functionIds.iterator();
+        while (assoIterator.hasNext()) {
+            Integer item = assoIterator.next();
+            if (orgFunctionIds.size() > 0) {
+                Iterator<Integer> orgIterator = orgFunctionIds.iterator();
+                while (orgIterator.hasNext()) {
+                    Integer tem = orgIterator.next();
+                    if (item == tem) {
+                        assoIterator.remove();
+                        orgIterator.remove();
+                    }
+                }
+
+            }
+        }
+
+        //删除版本代码
+        if (orgFunctionIds != null && orgFunctionIds.size() > 0) {
+            LambdaQueryWrapper<AssoTenantVipTypeAndFunction> queryWrapper1 = new LambdaQueryWrapper<>();
+            queryWrapper1.in(AssoTenantVipTypeAndFunction::getFunctionId, orgFunctionIds)
+                    .eq(AssoTenantVipTypeAndFunction::getTenantVipTypeId, tenantVipTypeId);
+            this.remove(queryWrapper1);
+        }
+        //添加版本代码
+        this.saveAssoBatch(functionIds, tenantVipTypeId);
+
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void saveAssoBatch(List<Integer> functionIds, Integer tenantVipTypeId) {
+        if (functionIds == null || functionIds.size() == 0) {
+            return;
+        }
+        List<AssoTenantVipTypeAndFunction> assoTenantVipTypeAndFunctions = new ArrayList<>();
+        functionIds.forEach(item -> {
+            AssoTenantVipTypeAndFunction assoTenantVipTypeAndFunction = new AssoTenantVipTypeAndFunction();
+            assoTenantVipTypeAndFunction.setFunctionId(item);
+            assoTenantVipTypeAndFunction.setTenantVipTypeId(tenantVipTypeId);
+            assoTenantVipTypeAndFunctions.add(assoTenantVipTypeAndFunction);
+        });
+        this.saveBatch(assoTenantVipTypeAndFunctions);
+
+    }
+
+    public void deleteByVipIds(List<Integer> ids) {
+        LambdaQueryWrapper<AssoTenantVipTypeAndFunction> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(AssoTenantVipTypeAndFunction::getTenantVipTypeId, ids);
+        this.remove(queryWrapper);
+    }
+
+    public List<Integer> getFunctionIds(Integer vipId) {
+        List<Integer> functionIds = new ArrayList<>();
+        LambdaQueryWrapper<AssoTenantVipTypeAndFunction> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoTenantVipTypeAndFunction::getTenantVipTypeId, vipId);
+        List<AssoTenantVipTypeAndFunction> assoTenantVipTypeAndFunctions = this.list(queryWrapper);
+        if (assoTenantVipTypeAndFunctions != null) {
+            functionIds = assoTenantVipTypeAndFunctions.stream().map(AssoTenantVipTypeAndFunction::getFunctionId).collect(Collectors.toList());
+
+        }
+        return functionIds;
+
+    }
+}

+ 156 - 4
PCS/src/main/java/cn/cslg/permission/service/FunctionService.java

@@ -1,17 +1,20 @@
 package cn.cslg.permission.service;
 
-import cn.cslg.permission.common.model.vo.AssoTenantVipTypeAndFunctionVO;
-import cn.cslg.permission.common.model.vo.FunctionVO;
-import cn.cslg.permission.common.model.vo.PersonnelVO;
-import cn.cslg.permission.common.model.vo.TenantVO;
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryVipFunctionDTO;
+import cn.cslg.permission.common.model.vo.*;
 import cn.cslg.permission.common.utils.*;
 import cn.cslg.permission.domain.Application;
 import cn.cslg.permission.domain.Function;
+import cn.cslg.permission.domain.Version;
+import cn.cslg.permission.domain.associate.AssoFunctionModule;
+import cn.cslg.permission.domain.qiaobi.AssoVersionFunction;
+import cn.cslg.permission.exception.ExceptionEnum;
 import cn.cslg.permission.exception.XiaoShiException;
 import cn.cslg.permission.mapper.AssoTenantVipTypeFunctionMapper;
 import cn.cslg.permission.mapper.FunctionMapper;
 import cn.cslg.permission.mapper.TenantMapper;
 import cn.cslg.permission.service.associate.RoleFunctionDataService;
+import cn.cslg.permission.service.qiaobi.AssoFunctionModuleService;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.tree.Tree;
@@ -22,6 +25,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -47,6 +51,7 @@ public class FunctionService extends ServiceImpl<FunctionMapper, Function> {
     private final TenantMapper tenantMapper;
     private final CacheUtils cacheUtils;
     private final LoginUtils loginUtils;
+    private final AssoTenantVipTypeFunctionService assoTenantVipTypeFunctionService;
 
     @Transactional(rollbackFor = Exception.class)
     public String addFunction(FunctionVO functionVO) {
@@ -400,4 +405,151 @@ public class FunctionService extends ServiceImpl<FunctionMapper, Function> {
 
         return functionList;
     }
+
+    /**
+     * 添加单个功能
+     *
+     * @param functionVO
+     * @return
+     */
+    public Function addFunctionByVo(FunctionVO functionVO) {
+
+        Integer personId =loginUtils.getId();
+        String modifyPath = functionVO.getSign();
+        List<Function> functionList = this.list(new LambdaQueryWrapper<Function>().eq(Function::getFunctionPath, modifyPath).eq(Function::getApplicationId, functionVO.getApply()));
+        if (functionList.size() > 0) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "新增失败,该功能标识已被使用");
+        }
+        Function function = new Function();
+        function
+                .setFunctionUp(functionVO.getFunction())
+                .setFunctionName(functionVO.getName())
+                .setFunctionPath(functionVO.getSign())
+                .setApplicationId(functionVO.getApply())
+                .setFunctionType(functionVO.getFunctionType())
+                .setFunctionDescription(functionVO.getDescribe())
+                .setCreateUser(personId);
+        if (functionVO.getFunction() == 0) {
+            function.setPath("0");
+        } else {
+            Function lastFunction = this.getById(functionVO.getFunction());
+            String path = lastFunction.getPath() + ',' + lastFunction.getId();
+            function.setPath(path);
+        }
+        function.insert();
+        return function;
+    }
+
+    /**
+     * 根据功能名称查询功能
+     *
+     * @param functionVO
+     * @return
+     */
+    public Function getFunctionByName(FunctionVO functionVO) {
+        Integer lastId = functionVO.getFunction();
+        String name = functionVO.getName();
+        Integer applyId = functionVO.getApply();
+        if (name == null || name.trim().equals("")) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "功能名称不可为空");
+        }
+        LambdaQueryWrapper<Function> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Function::getFunctionUp, lastId);
+        queryWrapper.eq(Function::getFunctionName, name);
+        queryWrapper.eq(Function::getApplicationId, applyId);
+        Function function = this.getOne(queryWrapper);
+        return function;
+    }
+
+
+    public static FunctionVO transformToVo(Function function) {
+        FunctionVO functionVO = new FunctionVO();
+        functionVO.setDescribe(function.getFunctionDescription());
+        functionVO.setPath(function.getPath());
+        functionVO.setFunction(function.getFunctionUp());
+        functionVO.setId(function.getId());
+        functionVO.setApply(function.getApplicationId());
+        functionVO.setType(function.getFunctionType());
+        functionVO.setSign(function.getFunctionPath());
+        functionVO.setName(function.getFunctionName());
+        return functionVO;
+    }
+
+    /**
+     * 根据应用id查询功能
+     *
+     * @param appId
+     * @return
+     */
+    public List<Function> getFunctionByAppId(Integer appId) {
+        LambdaQueryWrapper<Function> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Function::getApplicationId, appId);
+        List<Function> functionList = this.list(queryWrapper);
+        return functionList;
+
+
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public List<FunctionCodeTreeVO> queryVipFunctionTree(QueryVipFunctionDTO queryVipFunctionDTO) {
+        Boolean ifAll = queryVipFunctionDTO.getIfAll();
+        Integer versionId = queryVipFunctionDTO.getVipTypeId();
+        List<Integer> functionIds = assoTenantVipTypeFunctionService.getFunctionIds(versionId);
+        String applicationCode = queryVipFunctionDTO.getApplicationCode();
+        Application application = applicationService.getByCode(applicationCode);
+        if (application == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "应用不存在");
+        }
+
+        List<FunctionCodeTreeVO> functionCodeTreeVOS = new ArrayList<>();
+        //根据versionId查询功能
+        List<Function> functionList  =new ArrayList<>();
+        if (ifAll!=null&&ifAll) {
+            functionList = this.getFunctionByAppId(application.getId());
+        }
+        else {
+            functionList = this.getFuncListByIds(functionIds);
+
+        }
+        if (functionList == null || functionList.size() == 0) {
+            return functionCodeTreeVOS;
+        }
+        List<Function> rootFunctionList = functionList.stream().filter(item -> item.getFunctionUp() != null && item.getFunctionUp().equals(0)).collect(Collectors.toList());
+
+        List<FunctionCodeTreeVO> functionCodeTreeVOS1 = new ArrayList<>();
+        rootFunctionList.forEach(item -> {
+            FunctionCodeTreeVO functionCodeTreeVO = AssoFunctionModuleService.loadFunctionCodeTreeVO(item, null);
+            if (functionIds.contains(functionCodeTreeVO.getId())) {
+                functionCodeTreeVO.setIsSelect(1);
+            } else {
+                functionCodeTreeVO.setIsSelect(2);
+
+            }
+            functionCodeTreeVOS1.add(functionCodeTreeVO);
+        });
+        List<FunctionCodeTreeVO> functionCodeTreeVOS2 = new ArrayList<>();
+        functionCodeTreeVOS2.addAll(functionCodeTreeVOS1);
+        while (functionCodeTreeVOS1.size() > 0) {
+            FunctionCodeTreeVO functionCodeTreeVO = functionCodeTreeVOS1.remove(0);
+            List<Function> childFunctions = functionList.stream().filter(item -> item.getFunctionUp().equals(functionCodeTreeVO.getId())).collect(Collectors.toList());
+            List<FunctionCodeTreeVO> childVos = new ArrayList<>();
+            if (childFunctions != null & childFunctions.size() > 0) {
+                childFunctions.forEach(item -> {
+                    FunctionCodeTreeVO childVo = AssoFunctionModuleService.loadFunctionCodeTreeVO(item, null);
+                    if (functionIds.contains(childVo.getId())) {
+                        childVo.setIsSelect(1);
+                    } else {
+                        childVo.setIsSelect(2);
+
+                    }
+                    childVos.add(childVo);
+                });
+            }
+            functionCodeTreeVOS1.addAll(childVos);
+            functionCodeTreeVO.setChildren(childVos);
+        }
+        return functionCodeTreeVOS2;
+    }
+
+
 }

+ 32 - 0
PCS/src/main/java/cn/cslg/permission/service/LoginService.java

@@ -737,4 +737,36 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
             return Response.success(inviteSignInLink);
         }
     }
+
+
+    /**
+     * 发送验证码
+     *
+     * @param vo
+     * @return
+     */
+    public String getPaidCodePhoneCode(SendCodeDTO vo) {
+        String res = "发送验证码失败";
+        if (Boolean.TRUE.equals(StringUtils.isEmpty(vo.getPhoneNum()))) {
+            throw new XiaoShiException(ExceptionEnum.THE_PHONE_IS_NOT_EMPTY);
+        }
+        if (!RegexUtil.isPhoneLegal(vo.getPhoneNum())) {
+            throw new XiaoShiException(ExceptionEnum.THE_PHONE_FORMAT_ERROR);
+        }
+        if (StringUtils.isNotEmpty(vo.getPhoneNum())) {
+            String code = redisUtil.get(LoginCacheKeyUtil.getPaidCodeCaptcha(vo.getPaidCode()));
+            if (org.apache.commons.lang3.StringUtils.isNotEmpty(code)) {
+                redisUtil.delete(LoginCacheKeyUtil.getPaidCodeCaptcha(vo.getPaidCode()));
+            }
+            //生成验证码
+            String random = RandomUtil.getSixRandom();
+            //手机号和验证码放进缓存 设置过期时间60s
+            redisUtil.set(LoginCacheKeyUtil.getPaidCodeCaptcha(vo.getPaidCode()), random);
+            redisUtil.expire(LoginCacheKeyUtil.getPaidCodeCaptcha(vo.getPaidCode()), 300L, TimeUnit.SECONDS);
+            //发送短信
+            smsService.sendMessage(vo.getPhoneNum(), random);
+            res = "发送验证码成功";
+        }
+        return res;
+    }
 }

+ 27 - 1
PCS/src/main/java/cn/cslg/permission/service/PersonnelService.java

@@ -32,6 +32,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.swagger.v3.oas.models.security.SecurityScheme;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Lazy;
@@ -767,7 +768,7 @@ public class PersonnelService extends ServiceImpl<PersonnelMapper, Personnel> {
      * @param phoneLoginDTO
      * @return
      */
-    public Personnel loginPhoneCheck(PhoneLoginDTO phoneLoginDTO,Integer systemId) {
+    public Personnel loginPhoneCheck(PhoneLoginDTO phoneLoginDTO, Integer systemId) {
         //查询用户
         LambdaQueryWrapper<Personnel> queryWrapper = new LambdaQueryWrapper<>();
         if (org.apache.commons.lang3.StringUtils.isNotEmpty(phoneLoginDTO.getPhoneNum())) {
@@ -796,4 +797,29 @@ public class PersonnelService extends ServiceImpl<PersonnelMapper, Personnel> {
         redisUtil.delete(LoginCacheKeyUtil.getLoginCaptcha(phoneLoginDTO.getPhoneNum()));
         return person;
     }
+
+    public List<Personnel> getPersonByIds(List<Integer> ids) {
+        List<Personnel> personnelList = new ArrayList<>();
+        if (ids == null || ids.size() == 0) {
+            return personnelList;
+        }
+
+        LambdaQueryWrapper<Personnel> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(Personnel::getId, ids);
+        personnelList = this.list(queryWrapper);
+        return personnelList;
+    }
+
+    /**
+     * 校验手机号是否存在
+     */
+    public  void checkPhone(String phone){
+        LambdaQueryWrapper<Personnel> queryWrapper =new LambdaQueryWrapper<>();
+        queryWrapper.eq(Personnel::getPersonnelPhone,phone)
+                .eq(Personnel::getIsDelete,0);
+        Personnel personnel =this.getOne(queryWrapper,false);
+        if(personnel!=null){
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR,"该手机号已被使用");
+        }
+    }
 }

+ 30 - 7
PCS/src/main/java/cn/cslg/permission/service/SystemService.java

@@ -1,5 +1,6 @@
 package cn.cslg.permission.service;
 
+import cn.cslg.permission.common.model.common.SystemDictDTO;
 import cn.cslg.permission.common.model.dto.PasUserDTO;
 import cn.cslg.permission.common.model.vo.EntrustVO;
 import cn.cslg.permission.common.model.vo.PasUserVO;
@@ -107,6 +108,8 @@ public class SystemService {
         Map<String, Object> lst = new HashMap<>();
         //查询所有字典
         List<SysDict> sysDictList = sysDictService.list();
+
+
         for (SysDict sysDict : sysDictList) {
             //用字典的KEY值去字典项表内查询对应字典项
             LambdaQueryWrapper<SysDictItem> lambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -115,7 +118,6 @@ public class SystemService {
             //字典格式 KEY:KEY值对应的字典项
             lst.put(sysDict.getDictKey(), sysDictItemMapper.selectList(lambdaQueryWrapper));
         }
-        //数据字典格式 dataDict:查询的所有数据字典数据
         lst.put("dataDict", dataSourceService.list());
         return Response.success(lst);
     }
@@ -281,7 +283,7 @@ public class SystemService {
             ids.add(id);
         });
         LambdaQueryWrapper<Department> queryWrapper1 = new LambdaQueryWrapper<>();
-        queryWrapper1.in(Department::getId,ids);
+        queryWrapper1.in(Department::getId, ids);
         List<Map<String, Object>> mapList = new ArrayList<>();
         List<Department> departmentList = departmentService.list(queryWrapper1);
         departmentList.forEach(item -> {
@@ -406,7 +408,6 @@ public class SystemService {
     }
 
 
-
     /**
      * 获得部门排序
      *
@@ -434,7 +435,7 @@ public class SystemService {
      * @return
      */
     public List<EntrustVO> getEntrustsOrder(Integer orderType) {
-     List<EntrustVO>  entrustVOS=  departmentService.getBaseMapper().getEntrustsOrder(orderType);
+        List<EntrustVO> entrustVOS = departmentService.getBaseMapper().getEntrustsOrder(orderType);
         return entrustVOS;
     }
 
@@ -445,7 +446,7 @@ public class SystemService {
      * @return
      */
     public List<EntrustVO> getEntrustsByIdAndType(List<EntrustVO> entrustVOS) {
-        List<EntrustVO>  entrustVOList=  departmentService.getBaseMapper().getEntrustsByIdAndType(entrustVOS);
+        List<EntrustVO> entrustVOList = departmentService.getBaseMapper().getEntrustsByIdAndType(entrustVOS);
         return entrustVOList;
     }
 
@@ -455,8 +456,8 @@ public class SystemService {
      * @param
      * @return
      */
-    public List<EntrustVO> getEntrustsByName(String name,Integer type) {
-        List<EntrustVO>  entrustVOList=  departmentService.getBaseMapper().getEntrustsByName(name,type);
+    public List<EntrustVO> getEntrustsByName(String name, Integer type) {
+        List<EntrustVO> entrustVOList = departmentService.getBaseMapper().getEntrustsByName(name, type);
         return entrustVOList;
     }
 
@@ -478,4 +479,26 @@ public class SystemService {
         return ids;
     }
 
+
+    public String getSysDict(SystemDictDTO systemDictDTO) {
+        Map<String, Object> lst = new HashMap<>();
+        //查询所有字典
+
+        LambdaQueryWrapper<SysDict> queryWrapper = new LambdaQueryWrapper<>();
+        if (systemDictDTO.getType() != null) {
+            queryWrapper.eq(SysDict::getDictKey, systemDictDTO.getType());
+        }
+        List<SysDict> sysDictList = sysDictService.list(queryWrapper);
+
+
+        for (SysDict sysDict : sysDictList) {
+            //用字典的KEY值去字典项表内查询对应字典项
+            LambdaQueryWrapper<SysDictItem> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+            lambdaQueryWrapper.eq(SysDictItem::getDictParentKey, sysDict.getDictKey());
+            //装填数据
+            //字典格式 KEY:KEY值对应的字典项
+            lst.put(sysDict.getDictKey(), sysDictItemMapper.selectList(lambdaQueryWrapper));
+        }
+        return Response.success(lst);
+    }
 }

+ 251 - 104
PCS/src/main/java/cn/cslg/permission/service/VersionService.java

@@ -1,24 +1,45 @@
 package cn.cslg.permission.service;
 
 import cn.cslg.permission.common.model.Records;
+import cn.cslg.permission.common.model.common.SystemFile;
 import cn.cslg.permission.common.model.dto.*;
+import cn.cslg.permission.common.model.qiaobi.version.AddFunctionDTO;
+import cn.cslg.permission.common.model.qiaobi.version.QiaoBiVersionVO;
+import cn.cslg.permission.common.model.qiaobi.version.VersionStatusDTO;
+import cn.cslg.permission.common.model.vo.FunctionVO;
 import cn.cslg.permission.common.model.vo.VersionVO;
+import cn.cslg.permission.common.utils.LoginUtils;
+import cn.cslg.permission.domain.Application;
+import cn.cslg.permission.domain.Function;
+import cn.cslg.permission.domain.Personnel;
 import cn.cslg.permission.domain.Version;
 import cn.cslg.permission.domain.associate.AssoFunctionModule;
+import cn.cslg.permission.exception.ExceptionEnum;
+import cn.cslg.permission.exception.XiaoShiException;
 import cn.cslg.permission.mapper.VersionMapper;
-import cn.cslg.permission.service.associate.AssoFunctionModuleService;
+import cn.cslg.permission.service.outSideApi.FileManagerService;
+import cn.cslg.permission.service.qiaobi.AssoFunctionModuleService;
+import cn.cslg.permission.service.qiaobi.AssoVersionFunctionService;
+import cn.dev33.satoken.stp.StpUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.swagger.v3.oas.models.security.SecurityScheme;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @Author xiexiang
@@ -26,153 +47,279 @@ import java.util.List;
  */
 @Slf4j
 @Service
-@RequiredArgsConstructor
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class VersionService extends ServiceImpl<VersionMapper, Version> {
+
     private final AssoFunctionModuleService assoFunctionModuleService;
-//    private final FileManagerService fileManagerService;
+    //    private final FileManagerService fileManagerService;
+    private final FunctionService functionService;
+    private final AssoVersionFunctionService assoVersionFunctionService;
+    private final LoginUtils loginUtils;
+    private final PersonnelService personnelService;
+    private final FileManagerService fileManagerService;
+    private final ApplicationService applicationService;
 
     /**
      * 新增
      */
-    public Records add(VersionDTO versionDTO) {
-        Records records = new Records();
+    @Transactional(rollbackFor = Exception.class)
+    public Integer add(VersionDTO versionDTO) {
         Version version = new Version();
+        List<AssoFunctionCodeDTO> codeDTOS = versionDTO.getAssoFunctionCodeDTOS();
+        if (codeDTOS == null) {
+            return null;
+        }
+        String versionNum = versionDTO.getVersionNum();
         BeanUtils.copyProperties(versionDTO, version);
+        if (version.getStatus() != null && version.getStatus().equals(3)) {
+            version.setPublishTime(new Date());
+        }
+        version.setCreateId(loginUtils.getId());
         version.insert();
         Integer id = version.getId();
-        String versionNum = version.getVersionNum();
-        List<AssoFunctionModuleDTO> assoFunctionModuleDTOS = new ArrayList<>();
-        List<AssoFunctionCodeDTO> codeDTOS = versionDTO.getAssoFunctionCodeDTOS();
-        if (codeDTOS != null && !codeDTOS.isEmpty()) {
-            for (AssoFunctionCodeDTO codeDTO : codeDTOS) {
-                AssoFunctionModuleDTO assoFunctionModuleDTO = new AssoFunctionModuleDTO();
-                // 代码和功能赋值
-                assoFunctionModuleDTO.setFunctionId(codeDTO.getFunctionId());
-                assoFunctionModuleDTO.setCode(codeDTO.getCode());
-                // 版本id
-                assoFunctionModuleDTO.setVersionId(id);
-                // 版本号
-                assoFunctionModuleDTO.setVersion(versionNum);
-                // 字段配置
-                assoFunctionModuleDTO.setAuthType(codeDTO.getAuthType());
-                assoFunctionModuleDTO.setCreateUser(versionDTO.getCreateUser());
-                assoFunctionModuleDTO.setIsDelete(false);
-                assoFunctionModuleDTOS.add(assoFunctionModuleDTO);
-            }
-            assoFunctionModuleService.add(assoFunctionModuleDTOS);
-        }
-        records.setRecords(version.getId());
-        return records;
+        //保存版本和功能关联
+        List<Integer> functionIds = codeDTOS.stream().map(AssoFunctionCodeDTO::getFunctionId).collect(Collectors.toList());
+        assoVersionFunctionService.addAssoVersionFunctions(functionIds, version.getId());
+
+        assoFunctionModuleService.saveFunctionModuleBatch(codeDTOS, id, versionNum);
+        return id;
     }
 
     /**
-     *
+     * 更新版本
      */
-    public Records update(VersionDTO versionDTO) {
+    @Transactional(rollbackFor = Exception.class)
+    public Integer update(VersionDTO versionDTO) {
+//        Integer personId =loginUtils.getId();
+        Integer personId = 1;
         Records records = new Records();
         Integer id = versionDTO.getId();
+        this.checkVersionStatus(id);
+
         Version version = this.getById(id);
         BeanUtils.copyProperties(versionDTO, version);
+        if (versionDTO.getStatus() != null && versionDTO.getStatus().equals(3)) {
+            version.setPublishTime(new Date());
+        }
+        version.setCreateId(personId);
         version.updateById();
-        records.setRecords(id);
-        return records;
+        List<AssoFunctionCodeDTO> codeDTOS = versionDTO.getAssoFunctionCodeDTOS();
+        List<Integer> functionIds = new ArrayList<>();
+        if (codeDTOS != null && codeDTOS.size() > 0) {
+            functionIds = codeDTOS.stream().map(AssoFunctionCodeDTO::getFunctionId).collect(Collectors.toList());
+        }
+        assoVersionFunctionService.addAssoVersionFunctions(functionIds, version.getId());
+        String versionNum = version.getVersionNum();
+        assoFunctionModuleService.saveFunctionModuleBatch(codeDTOS, id, versionNum);
+        return id;
     }
 
-    public Records queryVersionList(QueryVersionListDTO queryVersionListDTO){
+    public Records queryVersionList(QueryVersionListDTO queryVersionListDTO) {
         Records records = new Records();
         Long current = queryVersionListDTO.getCurrent();
         Long size = queryVersionListDTO.getSize();
         String versionName = queryVersionListDTO.getVersionName();
         String versionNum = queryVersionListDTO.getVersionNum();
-
+        Integer status = queryVersionListDTO.getStatus();
+        List<Integer> ids = queryVersionListDTO.getIds();
         LambdaQueryWrapper<Version> queryWrapper = new LambdaQueryWrapper<>();
+        if (status != null) {
+            queryWrapper.eq(Version::getStatus, status);
+        }
         if (versionName != null) {
             queryWrapper.like(Version::getVersionName, versionName);
         }
         if (versionNum != null) {
             queryWrapper.like(Version::getVersionNum, versionNum);
         }
-        IPage<Version> versions = this.page(new Page<>(current, size), queryWrapper);
-        List<Version> versionList = versions.getRecords();
+        if (ids != null && ids.size() > 0) {
+            queryWrapper.in(Version::getId, ids);
+        }
+        queryWrapper.orderByDesc(Version::getCreateTime);
+        List<Version> versionList = new ArrayList<>();
+        if (current != null && size != null) {
+            IPage<Version> versions = this.page(new Page<>(current, size), queryWrapper);
+            versionList = versions.getRecords();
+            records.setCurrent(current);
+            records.setSize(size);
+            records.setTotal(versions.getTotal());
+        } else {
+            versionList = this.list(queryWrapper);
+        }
+        List<QiaoBiVersionVO> qiaoBiVersionVOS = this.loadQiaoBiVersionVO(versionList);
 
-        records.setCurrent(current);
-        records.setSize(current);
-        records.setTotal(versions.getTotal());
-        records.setRecords(versionList);
+        records.setRecords(qiaoBiVersionVOS);
         return records;
     }
 
-    public Records queryVersionInfo(QueryVersionInfoDTO queryVersionInfoDTO){
-        Records records = new Records();
-        VersionVO versionVO = new VersionVO();
-        Integer versionId = queryVersionInfoDTO.getId();
-        Version version = this.getById(versionId);
-        if (version != null) {
-            versionVO.setVersionNum(version.getVersionNum());
-            versionVO.setId(version.getId());
-            versionVO.setVersionName(version.getVersionName());
-            versionVO.setRemark(version.getRemark());
-            versionVO.setFileGuid(version.getFileGuid());
-            LambdaQueryWrapper<AssoFunctionModule> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AssoFunctionModule::getVersionId, versionId);
-            AssoFunctionModule assoFunctionModule = assoFunctionModuleService.getOne(queryWrapper, false);
-            if (assoFunctionModule != null) {
-                versionVO.setAuthType(assoFunctionModule.getAuthType());
-                versionVO.setFunctionId(assoFunctionModule.getFunctionId());
-                versionVO.setCode(assoFunctionModule.getCode());
-                versionVO.setCreateUser(assoFunctionModule.getCreateUser());
-                versionVO.setCreateTime(assoFunctionModule.getCreateTime());
-            }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void delete(List<Integer> ids) {
+        if (ids == null || ids.size() == 0) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "请选择版本");
         }
-        records.setRecords(versionVO);
-        return records;
+        //删除版本
+        this.deleteByIds(ids);
+        //删除版本和功能关联
+        assoVersionFunctionService.deleteByVersionIds(ids);
+        //删除版本和模块代码关联
+        assoFunctionModuleService.deleteByVersionIds(ids);
     }
 
-    public Records queryById(Integer id) throws IOException {
-        Records records = new Records();
-        VersionVO versionVO = new VersionVO();
+    /**
+     * 根据id删除版本
+     *
+     * @param ids
+     */
+    public void deleteByIds(List<Integer> ids) {
+        if (ids != null && ids.size() > 0) {
+            this.removeByIds(ids);
+        }
+    }
+
+    /**
+     * 窍笔应用添加功能
+     *
+     * @param addFunctionDTO
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public FunctionVO addFunction(AddFunctionDTO addFunctionDTO) {
+        String code = addFunctionDTO.getApplicationCode();
+        //根据功能名称以及上级id查询功能;
+        FunctionVO functionVO = new FunctionVO();
+        BeanUtils.copyProperties(addFunctionDTO, functionVO);
+        Application application = applicationService.getByCode(code);
+        if (application == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "应用不存在");
+        }
+        functionVO.setApply(application.getId());
+        Function function = functionService.getFunctionByName(functionVO);
+        if (function == null) {
+            functionVO.setFunctionType(1);
+            function = functionService.addFunctionByVo(functionVO);
+        }
+        FunctionVO functionVO1 = FunctionService.transformToVo(function);
+
+        return functionVO1;
+    }
+
+    /**
+     * 更新校验版本状态信息
+     *
+     * @param id
+     */
+    public void checkVersionStatus(Integer id) {
         Version version = this.getById(id);
-        if (version != null) {
-            versionVO.setVersionNum(version.getVersionNum());
-            versionVO.setId(version.getId());
-            versionVO.setVersionName(version.getVersionName());
-            versionVO.setRemark(version.getRemark());
-            versionVO.setFileGuid(version.getFileGuid());
-//            List<String> fileGuids = new ArrayList<>();
-//            fileGuids.add(version.getFileGuid());
-//            List<SystemFile> systemFiles = new ArrayList<>();
-//            if (fileGuids.size() != 0) {
-//                String res = fileManagerService.getSystemFileFromFMS(fileGuids);
-//                systemFiles = JSONObject.parseArray(res, SystemFile.class);
-//            }
-//            if (!systemFiles.isEmpty()) {
-//                versionVO.setSystemFileList(systemFiles);
-//            }
-
-            LambdaQueryWrapper<AssoFunctionModule> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AssoFunctionModule::getVersionId, id);
-            AssoFunctionModule assoFunctionModule = assoFunctionModuleService.getOne(queryWrapper, false);
-            if (assoFunctionModule != null) {
-                versionVO.setAuthType(assoFunctionModule.getAuthType());
-                versionVO.setFunctionId(assoFunctionModule.getFunctionId());
-                versionVO.setCode(assoFunctionModule.getCode());
-                versionVO.setCreateUser(assoFunctionModule.getCreateUser());
-                versionVO.setCreateTime(assoFunctionModule.getCreateTime());
-            }
+        if (version == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "版本不存在");
+        }
+        if (version.getStatus().equals(3)) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "版本已发布,不允许修改");
+
         }
-        records.setRecords(versionVO);
-        return records;
     }
 
-    public void delete(List<Integer> ids){
-       for (Integer id : ids) {
-            Version version = this.getById(id);
-            if (version != null) {
-                LambdaQueryWrapper<AssoFunctionModule> queryWrapper = new LambdaQueryWrapper<>();
-                queryWrapper.eq(AssoFunctionModule::getVersionId, id);
-                assoFunctionModuleService.remove(queryWrapper);
-                this.removeById(id);
+    /**
+     * 装载窍笔vo类
+     *
+     * @param versions
+     * @return
+     */
+    public List<QiaoBiVersionVO> loadQiaoBiVersionVO(List<Version> versions) {
+        List<QiaoBiVersionVO> qiaoBiVersionVOS = new ArrayList<>();
+        if (versions == null || versions.size() == 0) {
+            return qiaoBiVersionVOS;
+        }
+
+        List<Integer> createIds = versions.stream().map(Version::getCreateId).collect(Collectors.toList());
+        List<Personnel> personnelList = new ArrayList<>();
+        if (createIds != null && createIds.size() > 0) {
+            personnelList = personnelService.getPersonByIds(createIds);
+        }
+
+
+        List<SystemFile> systemFiles = new ArrayList<>();
+        List<String> guids = versions.stream().filter(item -> item.getFileGuid() != null).map(Version::getFileGuid).collect(Collectors.toList());
+        if (guids.size() != 0) {
+            try {
+                if (guids != null && guids.size() != 0) {
+                    String res = fileManagerService.getSystemFileFromFMS(guids);
+                    systemFiles = JSONObject.parseArray(res, SystemFile.class);
+                    System.out.println("before" + systemFiles);
+                    if (systemFiles == null) {
+                        systemFiles = new ArrayList<>();
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace(
+                );
+                throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "获取文件信息错误");
             }
-       }
+        }
+
+
+        //装载数据
+        for (Version item : versions) {
+            QiaoBiVersionVO qiaoBiVersionVO = new QiaoBiVersionVO();
+            BeanUtils.copyProperties(item, qiaoBiVersionVO);
+            Personnel personnel = personnelList.stream().filter(tem -> tem.getId().equals(item.getCreateId())).findFirst().orElse(null);
+            if (personnel != null) {
+                qiaoBiVersionVO.setCreateName(personnel.getPersonnelName());
+            }
+            SystemFile systemFile = systemFiles.stream().filter(tem -> tem.getGuid().equals(item.getFileGuid())).findFirst().orElse(null);
+            qiaoBiVersionVO.setSystemFile(systemFile);
+            qiaoBiVersionVOS.add(qiaoBiVersionVO);
+        }
+
+        return qiaoBiVersionVOS;
+    }
+
+    public Version getLastVersion() {
+        LambdaQueryWrapper<Version> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Version::getStatus, 3).orderByDesc(Version::getPublishTime).orderByDesc(Version::getCreateTime);
+        Version version = this.getOne(queryWrapper, false);
+        return version;
+    }
+
+    public Integer updateVersionStatus(VersionStatusDTO versionStatusDTO) {
+        Integer versionId = versionStatusDTO.getId();
+        Integer status = versionStatusDTO.getStatus();
+        if (versionId == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "请选择版本");
+        }
+        Version version = this.getById(versionId);
+        if (version == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "版本不存在");
+        }
+        if (version.getStatus() == 3) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "已发布版本不允许修改");
+
+        }
+        if (status == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "非法传参");
+
+        }
+        if (status.equals(3)) {
+            version.setPublishTime(new Date());
+        }
+        version.setStatus(status);
+        version.updateById();
+        return version.getId();
+    }
+
+    public QiaoBiVersionVO queryVersionLast() {
+        QiaoBiVersionVO qiaoBiVersionVO = new QiaoBiVersionVO();
+        LambdaQueryWrapper<Version> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Version::getStatus, 3);
+        queryWrapper.orderByDesc(Version::getPublishTime);
+        Version version = this.getOne(queryWrapper, false);
+        if (version == null) {
+            return qiaoBiVersionVO;
+        }
+        List<QiaoBiVersionVO> qiaoBiVersionVOS = this.loadQiaoBiVersionVO(Arrays.asList(version));
+        if (qiaoBiVersionVOS != null && qiaoBiVersionVOS.size() > 0) {
+            qiaoBiVersionVO = qiaoBiVersionVOS.get(0);
+        }
+        return qiaoBiVersionVO;
     }
 }

+ 0 - 74
PCS/src/main/java/cn/cslg/permission/service/associate/AssoFunctionModuleService.java

@@ -1,74 +0,0 @@
-package cn.cslg.permission.service.associate;
-
-import cn.cslg.permission.common.model.Records;
-import cn.cslg.permission.common.model.dto.*;
-import cn.cslg.permission.common.model.vo.AppVipTypeVO;
-import cn.cslg.permission.domain.TenantVipType;
-import cn.cslg.permission.domain.associate.AssoFunctionModule;
-import cn.cslg.permission.domain.qiaobi.AppVipType;
-import cn.cslg.permission.mapper.associate.AssoFunctionModuleMapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.BeanUtils;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @Author xiexiang
- * @Date 2024/11/28
- */
-@Service
-@RequiredArgsConstructor
-public class AssoFunctionModuleService extends ServiceImpl<AssoFunctionModuleMapper, AssoFunctionModule> {
-
-    /**
-     * 新增
-     */
-    public Records add(List<AssoFunctionModuleDTO> assoFunctionModuleDTOS) {
-        Records records = new Records();
-        List<Integer> ids = new ArrayList<>();
-        List<AssoFunctionModule> assoFunctionModules = new ArrayList<>();
-        for (AssoFunctionModuleDTO assoFunctionModuleDTO : assoFunctionModuleDTOS) {
-            AssoFunctionModule assoFunctionModule = new AssoFunctionModule();
-            BeanUtils.copyProperties(assoFunctionModuleDTO, assoFunctionModule);
-            assoFunctionModules.add(assoFunctionModule);
-        }
-        if (!assoFunctionModules.isEmpty()) {
-            this.saveBatch(assoFunctionModules);
-            ids = assoFunctionModules.stream().map(AssoFunctionModule::getId).collect(Collectors.toList());
-        }
-        records.setRecords(ids);
-        return records;
-    }
-
-    /**
-     * 更新
-     */
-    public Records update(AssoFunctionModuleUpdateDTO updateDTO) {
-        Records records = new Records();
-        AssoFunctionModule assoFunctionModule = this.getById(updateDTO.getId());
-        BeanUtils.copyProperties(updateDTO, assoFunctionModule);
-        assoFunctionModule.updateById();
-        records.setRecords(assoFunctionModule.getId());
-        return records;
-    }
-
-    public Records queryAssoFunctionModules(QueryAssoFunctionModuleDTO queryDTO) {
-        Records records = new Records();
-        Long current = queryDTO.getPageNum();
-        Long size = queryDTO.getPageSize();
-        records.setCurrent(current);
-        records.setSize(size);
-        return records;
-    }
-
-
-
-    public void delete(List<Integer> ids){
-        this.removeByIds(ids);
-    }
-
-}

+ 45 - 27
PCS/src/main/java/cn/cslg/permission/service/impl/TenantVipTypeService.java

@@ -65,7 +65,7 @@ public class TenantVipTypeService extends ServiceImpl<TenantVipTypeMapper, Tenan
         TenantVipType tenantVipType = new TenantVipType();
         BeanUtils.copyProperties(tenantVipTypeFunctionAddNewDTO, tenantVipType);
         //是否启用属性暂时默认都设置为启用(禁用0 启用1),若以后有需求再调整
-        tenantVipType.setCreateTime(new Date()).setEnable(1);
+        tenantVipType.setCreateTime(new Date());tenantVipType.setEnable(1);
 
         //数据入会员表
         log.info("数据入会员表");
@@ -90,19 +90,19 @@ public class TenantVipTypeService extends ServiceImpl<TenantVipTypeMapper, Tenan
                         .setFunctionId(functionId)
                         .setFunctionModifyPath(functionModifyPath);
                 assoTenantVipTypeAndFunctions.add(assoTenantVipTypeAndFunction);
-    //            //根据当前功能id查询其下未展示的子级功能
-    //            List<FunctionVO2> functionVO2s = functionMapper.selectNotShowChildrenById(functionId);
-    //            for (FunctionVO2 functionVO2 : functionVO2s) {
-    //                String path = functionVO2.getPath();
-    //                Integer notShowChidlrenFunctionId = functionVO2.getId();
-    //                Integer applicationId = functionVO2.getApplicationId();
-    //                String notShowChildrenFunctionModifyPath = applicationId + "," + path.substring(path.indexOf(",") + 1) + "," + notShowChidlrenFunctionId;
-    //                AssoTenantVipTypeAndFunction assoTenantVipTypeAndFunction2 = new AssoTenantVipTypeAndFunction()
-    //                        .setTenantVipTypeId(tenantVipTypeId)
-    //                        .setFunctionId(notShowChidlrenFunctionId)
-    //                        .setFunctionModifyPath(notShowChildrenFunctionModifyPath);
-    //                assoTenantVipTypeAndFunctions.add(assoTenantVipTypeAndFunction2);
-    //            }
+                //            //根据当前功能id查询其下未展示的子级功能
+                //            List<FunctionVO2> functionVO2s = functionMapper.selectNotShowChildrenById(functionId);
+                //            for (FunctionVO2 functionVO2 : functionVO2s) {
+                //                String path = functionVO2.getPath();
+                //                Integer notShowChidlrenFunctionId = functionVO2.getId();
+                //                Integer applicationId = functionVO2.getApplicationId();
+                //                String notShowChildrenFunctionModifyPath = applicationId + "," + path.substring(path.indexOf(",") + 1) + "," + notShowChidlrenFunctionId;
+                //                AssoTenantVipTypeAndFunction assoTenantVipTypeAndFunction2 = new AssoTenantVipTypeAndFunction()
+                //                        .setTenantVipTypeId(tenantVipTypeId)
+                //                        .setFunctionId(notShowChidlrenFunctionId)
+                //                        .setFunctionModifyPath(notShowChildrenFunctionModifyPath);
+                //                assoTenantVipTypeAndFunctions.add(assoTenantVipTypeAndFunction2);
+                //            }
             }
             //数据入会员和功能关联表
             log.info("数据插入租户会员类型和功能关联表");
@@ -222,19 +222,19 @@ public class TenantVipTypeService extends ServiceImpl<TenantVipTypeMapper, Tenan
                         .setFunctionId(functionId)
                         .setFunctionModifyPath(functionModifyPath);
                 assoTenantVipTypeAndFunctions.add(assoTenantVipTypeAndFunction);
-    //            //根据当前功能id查询其下未展示的子级功能
-    //            List<FunctionVO2> functionVO2s = functionMapper.selectNotShowChildrenById(functionId);
-    //            for (FunctionVO2 functionVO2 : functionVO2s) {
-    //                String path = functionVO2.getPath();
-    //                Integer notShowChidlrenFunctionId = functionVO2.getId();
-    //                Integer applicationId = functionVO2.getApplicationId();
-    //                String notShowChildrenFunctionModifyPath = applicationId + "," + path.substring(path.indexOf(",") + 1) + "," + notShowChidlrenFunctionId;
-    //                AssoTenantVipTypeAndFunction assoTenantVipTypeAndFunction2 = new AssoTenantVipTypeAndFunction()
-    //                        .setTenantVipTypeId(tenantVipTypeId)
-    //                        .setFunctionId(notShowChidlrenFunctionId)
-    //                        .setFunctionModifyPath(notShowChildrenFunctionModifyPath);
-    //                assoTenantVipTypeAndFunctions.add(assoTenantVipTypeAndFunction2);
-    //            }
+                //            //根据当前功能id查询其下未展示的子级功能
+                //            List<FunctionVO2> functionVO2s = functionMapper.selectNotShowChildrenById(functionId);
+                //            for (FunctionVO2 functionVO2 : functionVO2s) {
+                //                String path = functionVO2.getPath();
+                //                Integer notShowChidlrenFunctionId = functionVO2.getId();
+                //                Integer applicationId = functionVO2.getApplicationId();
+                //                String notShowChildrenFunctionModifyPath = applicationId + "," + path.substring(path.indexOf(",") + 1) + "," + notShowChidlrenFunctionId;
+                //                AssoTenantVipTypeAndFunction assoTenantVipTypeAndFunction2 = new AssoTenantVipTypeAndFunction()
+                //                        .setTenantVipTypeId(tenantVipTypeId)
+                //                        .setFunctionId(notShowChidlrenFunctionId)
+                //                        .setFunctionModifyPath(notShowChildrenFunctionModifyPath);
+                //                assoTenantVipTypeAndFunctions.add(assoTenantVipTypeAndFunction2);
+                //            }
             }
             log.info("新数据入会员和功能关联表");
             rows = assoTenantVipTypeFunctionMapper.insertBatch(assoTenantVipTypeAndFunctions);
@@ -282,5 +282,23 @@ public class TenantVipTypeService extends ServiceImpl<TenantVipTypeMapper, Tenan
 
     }
 
+    public TenantVipType saveTenantVipType(TenantVipTypeFunctionAddNewDTO tenantVipTypeFunctionAddNewDTO) {
+        TenantVipType tenantVipType = new TenantVipType();
+        BeanUtils.copyProperties(tenantVipTypeFunctionAddNewDTO, tenantVipType);
+        tenantVipType.insert();
+        return tenantVipType;
+    }
+
+    public TenantVipType updateTenantVipType(TenantVipTypeFunctionAddNewDTO addNewDTO) {
+        Integer id = addNewDTO.getId();
+        TenantVipType tenantVipType = this.getById(id);
+        tenantVipType.setTenantVipName(addNewDTO.getTenantVipName());
+        tenantVipType.setEnable(addNewDTO.getEnable());
+        tenantVipType.setRemark(addNewDTO.getRemark());
+        tenantVipTypeMapper.updateById(tenantVipType);
+        return tenantVipType;
+
+
+    }
 
 }

+ 51 - 0
PCS/src/main/java/cn/cslg/permission/service/outSideApi/FileManagerService.java

@@ -0,0 +1,51 @@
+package cn.cslg.permission.service.outSideApi;
+
+
+import com.google.gson.Gson;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * Okhttp调用FMS上传文件接口
+ *
+ * @Author xiexiang
+ * @Date 2023/8/10
+ */
+@RequiredArgsConstructor
+@Slf4j
+@Service
+public class FileManagerService {
+    @Value("${FMSUrl}")
+    private String FMSUrl;
+
+    /**
+     * 调用文件系统获取文件信息接口
+     *
+     * @param fileIds 文件ids
+     */
+    public String getSystemFileFromFMS(List<String> fileIds) throws IOException {
+        String param = new Gson().toJson(fileIds);
+        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(FMSUrl + "/fileManager/getFileData")
+                .post(requestBody)
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
+
+}

+ 120 - 61
PCS/src/main/java/cn/cslg/permission/service/qiaobi/AppVipTypeService.java

@@ -8,18 +8,28 @@ import cn.cslg.permission.common.model.dto.TenantVipTypeFunctionUpdateDTO;
 import cn.cslg.permission.common.model.qiaobi.QiaoBiVIPTypeVO;
 import cn.cslg.permission.common.model.qiaobi.QiaoBiVipTypeDTO;
 import cn.cslg.permission.common.model.vo.AppVipTypeVO;
+import cn.cslg.permission.common.utils.LoginUtils;
+import cn.cslg.permission.domain.Personnel;
 import cn.cslg.permission.domain.TenantVipType;
 import cn.cslg.permission.domain.qiaobi.AppVipType;
+import cn.cslg.permission.exception.ExceptionEnum;
+import cn.cslg.permission.exception.XiaoShiException;
 import cn.cslg.permission.mapper.qiaobi.AppVipTypeMapper;
+import cn.cslg.permission.service.AssoTenantVipTypeFunctionService;
+import cn.cslg.permission.service.PersonnelService;
 import cn.cslg.permission.service.impl.TenantVipTypeService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import io.swagger.v3.oas.models.security.SecurityScheme;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author admin
@@ -31,86 +41,84 @@ import java.util.List;
 public class AppVipTypeService extends ServiceImpl<AppVipTypeMapper, AppVipType> {
     private final TenantVipTypeService tenantVipTypeService;
     private final AppVipTypeMapper appVipTypeMapper;
+    private final AssoTenantVipTypeFunctionService assoTenantVipTypeFunctionService;
+    private final PersonnelService personnelService;
+    private final LoginUtils loginUtils;
 
     public List<QiaoBiVIPTypeVO> qiaoBiVIPTypeVOList(QiaoBiVipTypeDTO qiaoBiVipTypeDTO) {
         qiaoBiVipTypeDTO.setAppCode("4e95e3d926a2a4befa5d913acc0aa9f5");
         List<QiaoBiVIPTypeVO> qiaoBiVIPTypeVOList = this.getBaseMapper().queryQiaobiVipTypeVOs(qiaoBiVipTypeDTO);
         return qiaoBiVIPTypeVOList;
     }
+
+    /**
+     *
+     * @param id
+     * @return
+     */
     public AppVipType queryById(Integer id) {
-        LambdaQueryWrapper<AppVipType> queryWrapper =new LambdaQueryWrapper<>();
-        queryWrapper.eq(AppVipType::getTenantVipTypeId,id);
-        AppVipType appVipType =this.getOne(queryWrapper);
+        LambdaQueryWrapper<AppVipType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AppVipType::getTenantVipTypeId, id);
+        AppVipType appVipType = this.getOne(queryWrapper);
         return appVipType;
     }
 
     /**
      * 新增
      */
-    public Records add(AppVipTypeDTO appVipTypeDTO) {
-        Records records = new Records();
-        Integer id = null;
-        try {
-            TenantVipTypeFunctionAddNewDTO addNewDTO = new TenantVipTypeFunctionAddNewDTO();
-            addNewDTO.setTenantVipName(appVipTypeDTO.getTenantVipName());
-            addNewDTO.setRemark(appVipTypeDTO.getRemark());
-            addNewDTO.setEnable(appVipTypeDTO.getEnable());
-            addNewDTO.setCreatePersonId(1);
-            addNewDTO.setCreatePersonName("管理员");
-            addNewDTO.setUseType(1);
-            Integer tenantVipTypeId = tenantVipTypeService.addNew(addNewDTO);
-            if (tenantVipTypeId != null) {
-                AppVipType appVipType = new AppVipType();
-                appVipType.setTenantVipTypeId(tenantVipTypeId);
-                appVipType.setLastTime(appVipTypeDTO.getLastTime());
-                appVipType.setApplicationCode("4e95e3d926a2a4befa5d913acc0aa9f5");
-                appVipType.insert();
-                id = appVipType.getId();
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
+    @Transactional(rollbackFor = Exception.class)
+    public Integer add(AppVipTypeDTO appVipTypeDTO) {
+        List<Integer> functionIds = appVipTypeDTO.getFunctionIds();
+        TenantVipTypeFunctionAddNewDTO addNewDTO = this.getTenantTypeAddDTO(appVipTypeDTO);
+        Integer tenantVipTypeId = tenantVipTypeService.addNew(addNewDTO);
+        if (tenantVipTypeId != null) {
+            AppVipType appVipType = new AppVipType();
+            appVipType.setTenantVipTypeId(tenantVipTypeId);
+            appVipType.setLastTime(appVipTypeDTO.getLastTime());
+            appVipType.setApplicationCode(appVipTypeDTO.getApplicationCode());
+            appVipType.insert();
         }
-        records.setRecords(id);
-        return records;
+        assoTenantVipTypeFunctionService.saveAssoBatch(functionIds, tenantVipTypeId);
+        return tenantVipTypeId;
     }
 
     /**
      * 更新
      */
-    public Records update(AppVipTypeDTO appVipTypeDTO) {
-        Records records = new Records();
-        Integer id = appVipTypeDTO.getId();
-        try {
-            if (id != null) {
-                AppVipType appVipType = this.getById(id);
-                Integer tenantVipTypeId = appVipType.getTenantVipTypeId();
-                appVipType.setLastTime(appVipTypeDTO.getLastTime());
-                appVipType.updateById();
-                TenantVipTypeFunctionUpdateDTO updateDTO = new TenantVipTypeFunctionUpdateDTO();
-                BeanUtils.copyProperties(appVipTypeDTO, updateDTO);
-                updateDTO.setId(tenantVipTypeId);
-                tenantVipTypeService.update(updateDTO);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        records.setRecords(id);
-        return records;
+    @Transactional(rollbackFor = Exception.class)
+    public Integer update(AppVipTypeDTO appVipTypeDTO) {
+        Integer tenantVipId = appVipTypeDTO.getId();
+        Integer lastTime = appVipTypeDTO.getLastTime();
+        List<Integer> functionIds = appVipTypeDTO.getFunctionIds();
+        AppVipType appVipType = this.getByTenantVipId(tenantVipId);
+        appVipType.setLastTime(lastTime);
+        appVipType.updateById();
+        TenantVipTypeFunctionAddNewDTO addNewDTO = this.getTenantTypeAddDTO(appVipTypeDTO);
+        tenantVipTypeService.updateTenantVipType(addNewDTO);
+        assoTenantVipTypeFunctionService.saveFunctionModuleBatch(functionIds, tenantVipId);
+
+        return tenantVipId;
     }
 
     public Records queryAppVipType(QueryVipDTO queryVipDTO) {
         Records records = new Records();
-        Long current = queryVipDTO.getPageNum();
-        Long size = queryVipDTO.getPageSize();
+        Long current = queryVipDTO.getCurrent();
+        Long size = queryVipDTO.getSize();
+        if (current != null && size != null) {
+            queryVipDTO.setCurrent(((current - 1) * size));
+        }
         List<AppVipTypeVO> appVipTypeVOS = appVipTypeMapper.queryAppVipType(queryVipDTO);
+
+        Long total = appVipTypeMapper.queryAppVipTypeTotal(queryVipDTO);
+        this.loadAppVipTypeVO(appVipTypeVOS);
         records.setRecords(appVipTypeVOS);
         records.setCurrent(current);
         records.setSize(size);
-        records.setTotal((long) appVipTypeVOS.size());
+        records.setTotal(total);
         return records;
     }
 
-    public Records getVipById(Integer id){
+    public Records getVipById(Integer id) {
         Records records = new Records();
         AppVipTypeVO appVipTypeVO = new AppVipTypeVO();
         AppVipType appVipType = this.getById(id);
@@ -118,9 +126,9 @@ public class AppVipTypeService extends ServiceImpl<AppVipTypeMapper, AppVipType>
             Integer tenantVipTypeId = appVipType.getTenantVipTypeId();
             TenantVipType tenantVipType = tenantVipTypeService.getById(tenantVipTypeId);
             BeanUtils.copyProperties(appVipType, appVipTypeVO);
-            appVipTypeVO.setTenantVipName(tenantVipType.getTenantVipName());
-            appVipTypeVO.setCreatePersonId(tenantVipType.getCreatePersonId());
-            appVipTypeVO.setCreatePersonName(tenantVipType.getCreatePersonName());
+            appVipTypeVO.setVipTypeName(tenantVipType.getTenantVipName());
+            appVipTypeVO.setCreateId(tenantVipType.getCreatePersonId());
+            appVipTypeVO.setCreateName(tenantVipType.getCreatePersonName());
             appVipTypeVO.setCreateTime(tenantVipType.getCreateTime());
             appVipTypeVO.setRemark(tenantVipType.getRemark());
         }
@@ -128,16 +136,67 @@ public class AppVipTypeService extends ServiceImpl<AppVipTypeMapper, AppVipType>
         return records;
     }
 
-    public void delete(List<Integer> ids){
-        //首先,删除关联的tenantVipType
-        for (Integer id : ids) {
-            AppVipType appVipType = this.getById(id);
-            Integer tenantTypeId = appVipType.getTenantVipTypeId();
-            if (tenantTypeId != null) {
-                tenantVipTypeService.delete(tenantTypeId);
-                this.removeById(id);
+    @Transactional
+    public void delete(List<Integer> ids) {
+        if (ids == null || ids.size() == 0) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "请选择会员版本");
+        }
+        //删除会员类型
+        this.deleteByVipIds(ids);
+        tenantVipTypeService.removeByIds(ids);
+        assoTenantVipTypeFunctionService.deleteByVipIds(ids);
+    }
+
+    public void saveVipTye(AppVipTypeDTO appVipTypeDTO) {
+
+    }
+
+    public TenantVipTypeFunctionAddNewDTO getTenantTypeAddDTO(AppVipTypeDTO appVipTypeDTO) {
+        Integer personId = loginUtils.getId();
+        TenantVipTypeFunctionAddNewDTO addNewDTO = new TenantVipTypeFunctionAddNewDTO();
+        addNewDTO.setTenantVipName(appVipTypeDTO.getVipTypeName());
+        addNewDTO.setRemark(appVipTypeDTO.getRemark());
+        addNewDTO.setId(appVipTypeDTO.getId());
+        addNewDTO.setEnable(appVipTypeDTO.getEnable());
+        addNewDTO.setCreatePersonId(personId);
+        addNewDTO.setUseType(1);
+        return addNewDTO;
+    }
+
+    public AppVipType getByTenantVipId(Integer tenantVipId) {
+        LambdaQueryWrapper<AppVipType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AppVipType::getTenantVipTypeId, tenantVipId);
+        AppVipType appVipType = this.getOne(queryWrapper, false);
+        return appVipType;
+    }
+
+    public List<AppVipTypeVO> loadAppVipTypeVO(List<AppVipTypeVO> appVipTypeVOS) {
+        if (appVipTypeVOS == null || appVipTypeVOS.size() == 0) {
+            return appVipTypeVOS;
+        }
+        List<Integer> createIds = appVipTypeVOS.stream().map(AppVipTypeVO::getCreateId).collect(Collectors.toList());
+        List<Personnel> personnelList = new ArrayList<>();
+        if (createIds != null && createIds.size() > 0) {
+            personnelList = personnelService.getPersonByIds(createIds);
+        }
+        for (AppVipTypeVO appVipTypeVO : appVipTypeVOS) {
+            Personnel personnel = personnelList.stream().filter(tem -> tem.getId().equals(appVipTypeVO.getCreateId())).findFirst().orElse(null);
+            if (personnel != null) {
+                appVipTypeVO.setCreateName(personnel.getPersonnelName());
+
             }
         }
+        return appVipTypeVOS;
+    }
+
+    /**
+     *
+     * @param ids
+     */
+    public void deleteByVipIds(List<Integer> ids) {
+        LambdaQueryWrapper<AppVipType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(AppVipType::getTenantVipTypeId, ids);
+         this.remove(queryWrapper);
 
     }
 }

+ 279 - 0
PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoFunctionModuleService.java

@@ -0,0 +1,279 @@
+package cn.cslg.permission.service.qiaobi;
+
+import cn.cslg.permission.common.model.Records;
+import cn.cslg.permission.common.model.dto.*;
+import cn.cslg.permission.common.model.qiaobi.version.QueryFunctionCodeTreeVO;
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryVipFunctionDTO;
+import cn.cslg.permission.common.model.vo.AppVipTypeVO;
+import cn.cslg.permission.common.model.vo.FunctionCodeTreeVO;
+import cn.cslg.permission.common.model.vo.FunctionVO;
+import cn.cslg.permission.common.utils.LoginUtils;
+import cn.cslg.permission.domain.Application;
+import cn.cslg.permission.domain.Function;
+import cn.cslg.permission.domain.TenantVipType;
+import cn.cslg.permission.domain.Version;
+import cn.cslg.permission.domain.associate.AssoFunctionModule;
+import cn.cslg.permission.domain.qiaobi.AppVipType;
+import cn.cslg.permission.domain.qiaobi.AssoVersionFunction;
+import cn.cslg.permission.mapper.associate.AssoFunctionModuleMapper;
+import cn.cslg.permission.service.FunctionService;
+import cn.cslg.permission.service.VersionService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.swagger.v3.oas.models.security.SecurityScheme;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @Author xiexiang
+ * @Date 2024/11/28
+ */
+@Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+public class AssoFunctionModuleService extends ServiceImpl<AssoFunctionModuleMapper, AssoFunctionModule> {
+    private final AssoVersionFunctionService assoVersionFunctionService;
+    private final FunctionService functionService;
+    private final LoginUtils loginUtils;
+    @Lazy
+    private final VersionService versionService;
+
+    /**
+     * 新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Records add(List<AssoFunctionModuleDTO> assoFunctionModuleDTOS) {
+        Records records = new Records();
+        List<Integer> ids = new ArrayList<>();
+        List<AssoFunctionModule> assoFunctionModules = new ArrayList<>();
+        for (AssoFunctionModuleDTO assoFunctionModuleDTO : assoFunctionModuleDTOS) {
+            AssoFunctionModule assoFunctionModule = new AssoFunctionModule();
+            BeanUtils.copyProperties(assoFunctionModuleDTO, assoFunctionModule);
+            assoFunctionModules.add(assoFunctionModule);
+        }
+        if (!assoFunctionModules.isEmpty()) {
+            this.saveBatch(assoFunctionModules);
+            ids = assoFunctionModules.stream().map(AssoFunctionModule::getId).collect(Collectors.toList());
+        }
+        records.setRecords(ids);
+        return records;
+    }
+
+    /**
+     * 更新
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Records update(AssoFunctionModuleUpdateDTO updateDTO) {
+        Records records = new Records();
+        AssoFunctionModule assoFunctionModule = this.getById(updateDTO.getId());
+        BeanUtils.copyProperties(updateDTO, assoFunctionModule);
+        assoFunctionModule.updateById();
+        records.setRecords(assoFunctionModule.getId());
+        return records;
+    }
+
+    public Records queryAssoFunctionModules(QueryAssoFunctionModuleDTO queryDTO) {
+        Records records = new Records();
+        Long current = queryDTO.getPageNum();
+        Long size = queryDTO.getPageSize();
+        records.setCurrent(current);
+        records.setSize(size);
+        return records;
+    }
+
+
+    public void delete(List<Integer> ids) {
+        this.removeByIds(ids);
+    }
+
+    /**
+     * 将输入数据格式化成assoFunctionModules
+     *
+     * @param assoFunctionCodeDTOS
+     * @param versionId
+     * @param versionNum
+     * @return
+     */
+
+    public List<AssoFunctionModule> transDtoToAssoFunctionModules(List<AssoFunctionCodeDTO> assoFunctionCodeDTOS, Integer versionId, String versionNum) {
+        List<AssoFunctionModule> assoFunctionModules = new ArrayList<>();
+        Integer personId = loginUtils.getId();
+
+        assoFunctionCodeDTOS.forEach(item -> {
+            List<AssoFunctionCodeDTO.FunctionCode> functionCodes = item.getFunctionCodes();
+            if (functionCodes != null && functionCodes.size() > 0) {
+                functionCodes.forEach(tem -> {
+                    AssoFunctionModule assoFunctionModule = assoFunctionModules.stream().filter(t -> t.getFunctionId().equals(item.getFunctionId()) && t.getAuthType().equals(tem.getAuthType())).findFirst().orElse(null);
+                    if (assoFunctionModule == null) {
+                        assoFunctionModule = new AssoFunctionModule();
+                        assoFunctionModule.setFunctionId(item.getFunctionId());
+                        assoFunctionModule.setVersionId(versionId);
+                        assoFunctionModule.setVersion(versionNum);
+                        assoFunctionModule.setCode(tem.getCode());
+                        assoFunctionModule.setCreateUser(personId);
+                        assoFunctionModule.setAuthType(tem.getAuthType());
+                        assoFunctionModules.add(assoFunctionModule);
+                    }
+                });
+            }
+        });
+        return assoFunctionModules;
+    }
+
+    public void saveModules(List<AssoFunctionModule> assoFunctionModules) {
+        if (assoFunctionModules != null && assoFunctionModules.size() > 0) {
+            this.saveBatch(assoFunctionModules);
+        }
+
+
+    }
+
+    public void updateModules(List<AssoFunctionModule> assoFunctionModules) {
+        if (assoFunctionModules != null && assoFunctionModules.size() > 0) {
+            this.updateBatchById(assoFunctionModules);
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void saveFunctionModuleBatch(List<AssoFunctionCodeDTO> assoFunctionCodeDTOS, Integer versionId, String versionNum) {
+        if (assoFunctionCodeDTOS == null || assoFunctionCodeDTOS.size() == 0) {
+            return;
+        }
+        //将输入数据格式化成assoFunctionModules
+        List<AssoFunctionModule> assoFunctionModules = this.transDtoToAssoFunctionModules(assoFunctionCodeDTOS, versionId, versionNum);
+
+        //查询当前的版本代码
+        LambdaQueryWrapper<AssoFunctionModule> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoFunctionModule::getVersionId, versionId);
+        List<AssoFunctionModule> orgAssoFunctionModules = this.list(queryWrapper);
+
+        List<AssoFunctionModule> updateAssoFunctionModules = new ArrayList<>();
+
+        Iterator<AssoFunctionModule> assoIterator = assoFunctionModules.iterator();
+        while (assoIterator.hasNext()) {
+            AssoFunctionModule item = assoIterator.next();
+            if (orgAssoFunctionModules != null) {
+                Iterator<AssoFunctionModule> orgIterator = orgAssoFunctionModules.iterator();
+                while (orgIterator.hasNext()) {
+                    AssoFunctionModule tem = orgIterator.next();
+                    if (item.getFunctionId().equals(tem.getFunctionId()) && item.getAuthType().equals(tem.getAuthType())) {
+                        tem.setCode(item.getCode());
+                        updateAssoFunctionModules.add(tem);
+                        assoIterator.remove();
+                        orgIterator.remove();
+                    }
+                }
+
+            }
+        }
+
+
+        //删除版本代码
+        if (orgAssoFunctionModules != null && orgAssoFunctionModules.size() > 0) {
+            List<Integer> deleteIds = orgAssoFunctionModules.stream().map(AssoFunctionModule::getId).collect(Collectors.toList());
+            if (deleteIds != null && deleteIds.size() > 0) {
+                this.removeByIds(deleteIds);
+            }
+        }
+        //添加版本代码
+        this.saveModules(assoFunctionModules);
+        //更新版本代码
+        this.updateModules(updateAssoFunctionModules);
+    }
+
+    /**
+     * 根据版本id删除模块代码
+     *
+     * @param versionIds
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteByVersionIds(List<Integer> versionIds) {
+        if (versionIds == null || versionIds.size() == 0) {
+            return;
+        }
+        LambdaQueryWrapper<AssoFunctionModule> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(AssoFunctionModule::getVersionId, versionIds);
+        this.remove(queryWrapper);
+
+    }
+
+    public List<AssoFunctionModule> getByVersionId(Integer versionId) {
+        List<AssoFunctionModule> assoFunctionModules = new ArrayList<>();
+        if (versionId == null) {
+            return assoFunctionModules;
+        }
+        LambdaQueryWrapper<AssoFunctionModule> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoFunctionModule::getVersionId, versionId);
+        assoFunctionModules = this.list(queryWrapper);
+        return assoFunctionModules;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public List<FunctionCodeTreeVO> getFunctionCodeTree(QueryFunctionCodeTreeVO queryFunctionCodeTreeVO) {
+        Integer versionId = queryFunctionCodeTreeVO.getVersionId();
+        //当未传版本时
+        if (versionId == null) {
+            Version version = versionService.getLastVersion();
+            if (version != null) {
+                versionId = version.getId();
+            }
+        }
+        List<FunctionCodeTreeVO> functionCodeTreeVOS = new ArrayList<>();
+        //根据versionId查询功能
+        List<AssoVersionFunction> assoVersionFunctions = assoVersionFunctionService.getByVersionId(versionId);
+        if (assoVersionFunctions == null || assoVersionFunctions.size() == 0) {
+            return functionCodeTreeVOS;
+        }
+        //根据versionId 查询功能代码
+        List<AssoFunctionModule> assoFunctionModules = this.getByVersionId(versionId);
+
+        List<Integer> functionIds = assoVersionFunctions.stream().map(AssoVersionFunction::getFunctionId).collect(Collectors.toList());
+
+        List<Function> functionList = functionService.getFuncListByIds(functionIds);
+        List<Function> rootFunctionList = functionList.stream().filter(item -> item.getFunctionUp() != null && item.getFunctionUp().equals(0)).collect(Collectors.toList());
+
+        List<FunctionCodeTreeVO> functionCodeTreeVOS1 = new ArrayList<>();
+        rootFunctionList.forEach(item -> {
+            List<AssoFunctionModule> assoFunctionModules1 = assoFunctionModules.stream().filter(tem -> tem.getFunctionId().equals(item.getId())).collect(Collectors.toList());
+            FunctionCodeTreeVO functionCodeTreeVO = this.loadFunctionCodeTreeVO(item, assoFunctionModules1);
+            functionCodeTreeVOS1.add(functionCodeTreeVO);
+        });
+        List<FunctionCodeTreeVO> functionCodeTreeVOS2 = new ArrayList<>();
+        functionCodeTreeVOS2.addAll(functionCodeTreeVOS1);
+        while (functionCodeTreeVOS1.size() > 0) {
+            FunctionCodeTreeVO functionCodeTreeVO = functionCodeTreeVOS1.remove(0);
+            List<Function> childFunctions = functionList.stream().filter(item -> item.getFunctionUp().equals(functionCodeTreeVO.getId())).collect(Collectors.toList());
+            List<FunctionCodeTreeVO> childVos = new ArrayList<>();
+            if (childFunctions != null & childFunctions.size() > 0) {
+                childFunctions.forEach(item -> {
+                    List<AssoFunctionModule> assoFunctionModules1 = assoFunctionModules.stream().filter(tem -> tem.getFunctionId().equals(item.getId())).collect(Collectors.toList());
+                    FunctionCodeTreeVO childVo = this.loadFunctionCodeTreeVO(item, assoFunctionModules1);
+                    childVos.add(childVo);
+                });
+            }
+            functionCodeTreeVOS1.addAll(childVos);
+            functionCodeTreeVO.setChildren(childVos);
+        }
+        return functionCodeTreeVOS2;
+    }
+
+    public static FunctionCodeTreeVO loadFunctionCodeTreeVO(Function function, List<AssoFunctionModule> assoFunctionModules) {
+        FunctionCodeTreeVO functionCodeTreeVO = new FunctionCodeTreeVO();
+        FunctionVO functionVO = FunctionService.transformToVo(function);
+        BeanUtils.copyProperties(functionVO, functionCodeTreeVO);
+        functionCodeTreeVO.setFunctionCodes(assoFunctionModules);
+        return functionCodeTreeVO;
+    }
+
+
+
+
+
+}

+ 32 - 0
PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoPaidCodeRegistInfoService.java

@@ -0,0 +1,32 @@
+package cn.cslg.permission.service.qiaobi;
+
+import cn.cslg.permission.common.model.qiaobi.paidCode.PaidCodeAddDTO;
+import cn.cslg.permission.domain.qiaobi.PaidCode;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.cslg.permission.domain.qiaobi.AssoPaidCodeRegistInfo;
+import cn.cslg.permission.mapper.qiaobi.AssoPaidCodeRegistInfoMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author admin
+ * @description 针对表【ASSO_PAID_CODE_REGIST_INFO(付费码和注册信息关联表)】的数据库操作Service实现
+ * @createDate 2024-12-09 15:33:14
+ */
+
+@Service
+public class AssoPaidCodeRegistInfoService extends ServiceImpl<AssoPaidCodeRegistInfoMapper, AssoPaidCodeRegistInfo> {
+
+    public AssoPaidCodeRegistInfo AddAssoPaidCodeRegistInfo(Integer paidCodeId, Integer registId) {
+        AssoPaidCodeRegistInfo assoPaidCodeRegistInfo = new AssoPaidCodeRegistInfo();
+        assoPaidCodeRegistInfo.setPaidCodeId(paidCodeId);
+        assoPaidCodeRegistInfo.setRegistInfoId(registId);
+        assoPaidCodeRegistInfo.insert();
+        return  assoPaidCodeRegistInfo;
+    }
+
+}
+
+
+
+

+ 97 - 0
PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoPaidCodeVipTypeService.java

@@ -0,0 +1,97 @@
+package cn.cslg.permission.service.qiaobi;
+
+import cn.cslg.permission.common.model.qiaobi.paidCode.PaidCodeAddDTO;
+import cn.cslg.permission.common.model.qiaobi.paidCode.VipTypeNumDTO;
+import cn.cslg.permission.domain.associate.AssoFunctionModule;
+import cn.cslg.permission.domain.qiaobi.PaidCode;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.cslg.permission.domain.qiaobi.AssoPaidCodeVipType;
+import cn.cslg.permission.mapper.qiaobi.AssoPaidCodeVipTypeMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author admin
+ * @description 针对表【ASSO_PAID_CODE_VIP_TYPE】的数据库操作Service实现
+ * @createDate 2024-12-09 15:16:30
+ */
+@Service
+public class AssoPaidCodeVipTypeService extends ServiceImpl<AssoPaidCodeVipTypeMapper, AssoPaidCodeVipType> {
+
+    /**
+     *
+     */
+    public void add(PaidCodeAddDTO paidCodeAddDTO, Integer paidCodeId) {
+        List<VipTypeNumDTO> vipTypes = paidCodeAddDTO.getVipTypes();
+        List<AssoPaidCodeVipType> updateVipTypes = new ArrayList<>();
+        List<AssoPaidCodeVipType> assoPaidCodeVipTypes = this.getByPaidCode(paidCodeId);
+        Iterator<VipTypeNumDTO> assoIterator = vipTypes.iterator();
+        while (assoIterator.hasNext()) {
+            VipTypeNumDTO item = assoIterator.next();
+            if (assoPaidCodeVipTypes != null) {
+                Iterator<AssoPaidCodeVipType> orgIterator = assoPaidCodeVipTypes.iterator();
+                while (orgIterator.hasNext()) {
+                    AssoPaidCodeVipType tem = orgIterator.next();
+                    if (item.getVipTypeId().equals(tem.getVipTypeId())) {
+                        BeanUtils.copyProperties(item, tem);
+                        updateVipTypes.add(tem);
+                        orgIterator.remove();
+                        assoIterator.remove();
+
+                    }
+                }
+            }
+        }
+
+        //删除
+        if (assoPaidCodeVipTypes != null && assoPaidCodeVipTypes.size() != 0) {
+            List<Integer> ids = assoPaidCodeVipTypes.stream().map(AssoPaidCodeVipType::getId).collect(Collectors.toList());
+            this.removeByIds(ids);
+        }
+        //添加
+        if (vipTypes != null && vipTypes.size() != 0) {
+            this.addAssoPaidCode(vipTypes,paidCodeId);
+        }
+        //更新
+        this.updateBatchById(updateVipTypes);
+        return;
+    }
+
+    public List<AssoPaidCodeVipType> getByPaidCode(Integer paidCodeId) {
+        LambdaQueryWrapper<AssoPaidCodeVipType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoPaidCodeVipType::getPaidCodeId, paidCodeId);
+        List<AssoPaidCodeVipType> assoPaidCodeVipTypes = this.list(queryWrapper);
+        return assoPaidCodeVipTypes;
+    }
+
+
+    /**
+     * @param vipTypes
+     * @return
+     */
+    public List<AssoPaidCodeVipType> addAssoPaidCode(List<VipTypeNumDTO> vipTypes,Integer paidCodeId) {
+        List<AssoPaidCodeVipType> vipTypeList = new ArrayList<>();
+        if (vipTypes.size() == 0) {
+            return vipTypeList;
+        }
+        vipTypes.forEach(item -> {
+            AssoPaidCodeVipType assoPaidCodeVipType = new AssoPaidCodeVipType();
+
+            BeanUtils.copyProperties(item, assoPaidCodeVipType);
+            assoPaidCodeVipType.setPaidCodeId(paidCodeId);
+            vipTypeList.add(assoPaidCodeVipType);
+        });
+        this.saveBatch(vipTypeList);
+        return vipTypeList;
+    }
+}
+
+
+
+

+ 1 - 0
PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoPersonVipTypeService.java

@@ -136,6 +136,7 @@ public class AssoPersonVipTypeService extends ServiceImpl<AssoPersonVipTypeMappe
         }
         return  personVipMessVO;
     }
+
 }
 
 

+ 114 - 0
PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoVersionFunctionService.java

@@ -0,0 +1,114 @@
+package cn.cslg.permission.service.qiaobi;
+
+import cn.cslg.permission.domain.Function;
+import cn.cslg.permission.service.FunctionService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.cslg.permission.domain.qiaobi.AssoVersionFunction;
+import cn.cslg.permission.mapper.qiaobi.AssoVersionFunctionMapper;
+import io.swagger.v3.oas.models.security.SecurityScheme;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author admin
+ * @description 针对表【ASSO_VERSION_FUNCTION(租户会员类型和功能关联表)】的数据库操作Service实现
+ * @createDate 2024-12-03 18:11:52
+ */
+@Service
+@RequiredArgsConstructor
+public class AssoVersionFunctionService extends ServiceImpl<AssoVersionFunctionMapper, AssoVersionFunction> {
+    private final FunctionService functionService;
+
+    /**
+     * 添加版本和功能关联
+     *
+     * @param functionIds
+     * @param versionId
+     */
+    public void addAssoVersionFunctions(List<Integer> functionIds, Integer versionId) {
+        if (functionIds == null || functionIds.size() == 0) {
+            return;
+        }
+        //比较添加的功能和数据库中已经保存的功能,获取添加的功能和删除的功能
+        LambdaQueryWrapper<AssoVersionFunction> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoVersionFunction::getVersionId, versionId);
+        List<AssoVersionFunction> assoVersionFunctions = this.list(queryWrapper);
+        List<Integer> addFunctionIds = functionIds;
+        if (assoVersionFunctions != null && assoVersionFunctions.size() != 0) {
+            List<Integer> orgFunctionIds = assoVersionFunctions.stream().map(AssoVersionFunction::getFunctionId).collect(Collectors.toList());
+            List<Integer> deleteFunctionIds = orgFunctionIds;
+            deleteFunctionIds.removeAll(functionIds);
+            if (deleteFunctionIds != null && deleteFunctionIds.size() > 0) {
+                this.removeByIds(deleteFunctionIds);
+            }
+            addFunctionIds.removeAll(orgFunctionIds);
+        }
+
+        //批量保存
+        this.saveAssoFunctionBatch(addFunctionIds, versionId);
+
+
+    }
+
+    /**
+     * 批量保存
+     *
+     * @param functionIds
+     * @param versionId
+     */
+    public void saveAssoFunctionBatch(List<Integer> functionIds, Integer versionId) {
+
+        if (functionIds == null || functionIds.size() == 0) {
+            return;
+        }
+        //保存新的版本功能
+        if (functionIds != null && functionIds.size() > 0) {
+            LambdaQueryWrapper<Function> queryWrapper1 = new LambdaQueryWrapper<Function>();
+            queryWrapper1.in(Function::getId, functionIds);
+            List<Function> functionList = functionService.list(queryWrapper1);
+            if (functionList != null && functionList.size() > 0) {
+                List<AssoVersionFunction> assoVersionFunctions1 = new ArrayList<>();
+                functionList.forEach(item ->
+                        {
+                            AssoVersionFunction assoVersionFunction = new AssoVersionFunction();
+                            assoVersionFunction.setVersionId(versionId);
+                            assoVersionFunction.setFunctionModifyPath(item.getPath());
+                            assoVersionFunction.setFunctionId(item.getId());
+                            assoVersionFunctions1.add(assoVersionFunction);
+                        }
+                );
+                if (assoVersionFunctions1.size() > 0) {
+                    this.saveBatch(assoVersionFunctions1);
+                }
+            }
+        }
+    }
+
+    public void deleteByVersionIds(List<Integer> versionIds) {
+
+        LambdaQueryWrapper<AssoVersionFunction> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(AssoVersionFunction::getVersionId, versionIds);
+        this.remove(queryWrapper);
+
+    }
+
+    public List<AssoVersionFunction> getByVersionId(Integer versionId) {
+        List<AssoVersionFunction> assoVersionFunctions = new ArrayList<>();
+        if (versionId == null) {
+            return assoVersionFunctions;
+        }
+        LambdaQueryWrapper<AssoVersionFunction> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoVersionFunction::getVersionId, versionId);
+        assoVersionFunctions = this.list(queryWrapper);
+        return assoVersionFunctions;
+    }
+}
+
+
+
+

+ 303 - 0
PCS/src/main/java/cn/cslg/permission/service/qiaobi/PaidCodeService.java

@@ -0,0 +1,303 @@
+package cn.cslg.permission.service.qiaobi;
+
+import cn.cslg.permission.common.core.business.LoginCacheKeyUtil;
+import cn.cslg.permission.common.model.Records;
+import cn.cslg.permission.common.model.dto.SendCodeDTO;
+import cn.cslg.permission.common.model.qiaobi.paidCode.*;
+import cn.cslg.permission.common.model.vo.AppVipTypeVO;
+import cn.cslg.permission.common.model.vo.TenantVO;
+import cn.cslg.permission.common.utils.LoginUtils;
+import cn.cslg.permission.common.utils.RandomUtil;
+import cn.cslg.permission.common.utils.RedisUtil;
+import cn.cslg.permission.domain.Personnel;
+import cn.cslg.permission.domain.qiaobi.AssoPaidCodeRegistInfo;
+import cn.cslg.permission.domain.qiaobi.RegistInformation;
+import cn.cslg.permission.exception.ExceptionEnum;
+import cn.cslg.permission.exception.XiaoShiException;
+import cn.cslg.permission.mapper.qiaobi.PaidCodeMapper;
+import cn.cslg.permission.service.LoginService;
+import cn.cslg.permission.service.PersonnelService;
+import cn.hutool.core.img.LabColor;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.cslg.permission.domain.qiaobi.PaidCode;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * @author admin
+ * @description 针对表【PAID_CODE(付费码)】的数据库操作Service实现
+ * @createDate 2024-12-09 15:13:38
+ */
+@Service
+@RequiredArgsConstructor
+public class PaidCodeService extends ServiceImpl<PaidCodeMapper, PaidCode> {
+    private final LoginUtils loginUtils;
+    private final AssoPaidCodeRegistInfoService assoPaidCodeRegistInfoService;
+    private final PersonnelService personnelService;
+    private final AssoPaidCodeVipTypeService assoPaidCodeVipTypeService;
+    private final RegistInformationService registInformationService;
+    private final LoginService loginService;
+    private final RedisUtil redisUtil;
+
+    /**
+     * 添加付费码
+     *
+     * @param paidCodeAddDTO
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public String addPaidCode(PaidCodeAddDTO paidCodeAddDTO) {
+        //添加付费码
+        PaidCode paidCode = this.savePaidCode(paidCodeAddDTO);
+        //添加注册信息
+        RegistInformation registInformation = registInformationService.addRegistInformation(paidCodeAddDTO);
+        //添加付费码和注册信息关联
+        assoPaidCodeRegistInfoService.AddAssoPaidCodeRegistInfo(paidCode.getId(), registInformation.getId());
+        //添加付费码和会员关系;
+        assoPaidCodeVipTypeService.add(paidCodeAddDTO, paidCode.getId());
+        return paidCode.getCode();
+
+    }
+
+    public PaidCode savePaidCode(PaidCodeAddDTO paidCodeAddDTO) {
+        Integer personId = loginUtils.getId();
+        String code = RandomUtil.getOnlyCode();
+        this.checkPaidCode(code);
+        PaidCode paidCode = new PaidCode();
+        paidCode.setCode(code);
+        paidCode.setCreateId(personId);
+        paidCode.setRemark(paidCodeAddDTO.getRemark());
+        paidCode.insert();
+        return paidCode;
+    }
+
+    public void checkPaidCode(String code) {
+        LambdaQueryWrapper<PaidCode> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PaidCode::getCode, code);
+        PaidCode paidCode = this.getOne(queryWrapper);
+        if (paidCode != null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "网络错误,请稍后再试");
+        }
+    }
+
+    public void checkMessage(PaidCodeAddDTO paidCodeAddDTO) {
+        String phone = paidCodeAddDTO.getPersonnelPhone();
+        if (phone == null || phone.trim().equals("")) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "请输入手机号");
+        }
+    }
+
+    public Records queryPaidCodeList(PaidCodeQueryDTO paidCodeQueryDTO) {
+        Records records = new Records();
+        Long size = paidCodeQueryDTO.getSize();
+        Long current = paidCodeQueryDTO.getCurrent();
+        if (size != null && current != null) {
+            current = (current - 1) * size;
+            paidCodeQueryDTO.setCurrent(current);
+        }
+        List<PaidCodeQueryVO> queryVOList = this.getBaseMapper().queryPaidCodeList(paidCodeQueryDTO);
+        this.loadPaidCodeQueryVO(queryVOList);
+        Long total = this.getBaseMapper().queryPaidCodeListTotal(paidCodeQueryDTO);
+        records.setTotal(total);
+        records.setSize(size);
+        records.setCurrent(current);
+        records.setRecords(queryVOList);
+        return records;
+    }
+
+
+    /**
+     * @param queryVOList
+     * @return
+     */
+    private List<PaidCodeQueryVO> loadPaidCodeQueryVO(List<PaidCodeQueryVO> queryVOList) {
+
+        if (queryVOList == null || queryVOList.size() == 0) {
+            return queryVOList;
+        }
+
+        List<Integer> createIds = queryVOList.stream().map(PaidCodeQueryVO::getCreateId).collect(Collectors.toList());
+        List<Personnel> personnelList = new ArrayList<>();
+        if (createIds != null && createIds.size() > 0) {
+            personnelList = personnelService.getPersonByIds(createIds);
+        }
+
+        List<Integer> ids = queryVOList.stream().map(PaidCodeQueryVO::getId).collect(Collectors.toList());
+        List<VipTypeNumVO> vipTypeNumVOS = assoPaidCodeVipTypeService.getBaseMapper().queryVipNumList(ids);
+
+
+        for (PaidCodeQueryVO paidCodeQueryVO : queryVOList) {
+            Integer paidCodeId = paidCodeQueryVO.getId();
+            Integer personId = paidCodeQueryVO.getCreateId();
+            List<VipTypeNumVO> temTypeNumVos = vipTypeNumVOS.stream().filter(item -> item.getPaidCodeId().equals(paidCodeId)).collect(Collectors.toList());
+            paidCodeQueryVO.setVipTypes(temTypeNumVos);
+            Personnel personnel = personnelList.stream().filter(item -> item.getId().equals(personId)).findFirst().orElse(null);
+            if (personnel != null) {
+                paidCodeQueryVO.setCreateName(personnel.getPersonnelName());
+            }
+        }
+
+        return queryVOList;
+    }
+
+
+    public String updatePaidCode(PaidCodeAddDTO paidCodeAddDTO) {
+        //添加付费码
+        PaidCode paidCode = this.updatePaidCodeToDB(paidCodeAddDTO);
+        //添加注册信息
+        RegistInformation registInformation = registInformationService.updateRegistInformation(paidCodeAddDTO);
+        //添加付费码和会员关系;
+        assoPaidCodeVipTypeService.add(paidCodeAddDTO, paidCode.getId());
+        return paidCode.getCode();
+    }
+
+    public String updatePaidCodeStatus(PaidCodeStatusDTO paidCodeStatusDTO) {
+        PaidCode paidCode = this.getById(paidCodeStatusDTO.getId());
+        if (paidCode == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "付费码不存在");
+        }
+        paidCode.setStatus(paidCodeStatusDTO.getStatus());
+        paidCode.updateById();
+        return paidCode.getCode();
+    }
+
+    public PaidCode updatePaidCodeToDB(PaidCodeAddDTO paidCodeAddDTO) {
+        PaidCode paidCode = this.getById(paidCodeAddDTO.getId());
+        if (paidCode == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "付费码不存在");
+        }
+        paidCode.setRemark(paidCodeAddDTO.getRemark());
+        paidCode.updateById();
+        return paidCode;
+    }
+
+
+    /**
+     * 根据付费码发送验证码
+     *
+     * @param sendCodeDTO
+     * @return
+     */
+    public String sendPhoneCode(SendCodeDTO sendCodeDTO) {
+        String paidCodeStr = sendCodeDTO.getPaidCode();
+
+        LambdaQueryWrapper<PaidCode> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PaidCode::getCode, paidCodeStr);
+        PaidCode paidCode = this.getOne(queryWrapper, false);
+        if (paidCode == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "付费码不存在");
+        }
+        //查询预留手机号
+        LambdaQueryWrapper<AssoPaidCodeRegistInfo> queryWrapper1 = new LambdaQueryWrapper<>();
+        queryWrapper1.eq(AssoPaidCodeRegistInfo::getPaidCodeId, paidCode.getId());
+        AssoPaidCodeRegistInfo assoPaidCodeRegistInfo = assoPaidCodeRegistInfoService.getOne(queryWrapper1);
+        if (assoPaidCodeRegistInfo == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "未预留手机号,请通知管理员处理");
+        }
+        RegistInformation registInformation = registInformationService.getById(assoPaidCodeRegistInfo.getRegistInfoId());
+        if (registInformation == null || registInformation.getPersonnelPhone() == null || registInformation.getPersonnelPhone().trim().equals("")) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "未预留手机号,请通知管理员处理");
+        }
+        sendCodeDTO.setPhoneNum(registInformation.getPersonnelPhone());
+        String result = loginService.getPaidCodePhoneCode(sendCodeDTO);
+        return result;
+    }
+
+
+    public String setPaidCodeToken(String paidCode) {
+        String code = RandomUtil.getOnlyCode();
+        String key = LoginCacheKeyUtil.getPhoneCodeTokenPrefix(code);
+        redisUtil.set(key, paidCode);
+        redisUtil.expire(key, 600L, TimeUnit.SECONDS);
+        return code;
+    }
+
+    public String getPaidCodeToken(String token) {
+        String key = LoginCacheKeyUtil.getPhoneCodeTokenPrefix(token);
+        return redisUtil.get(key);
+    }
+
+    public PaidCodeReInfoVO getRegistInformationByPaidCode(Integer paidCodeId) {
+        PaidCodeReInfoVO paidCodeReInfoVO = new PaidCodeReInfoVO();
+
+        LambdaQueryWrapper<AssoPaidCodeRegistInfo> queryWrapper1 = new LambdaQueryWrapper<>();
+        queryWrapper1.eq(AssoPaidCodeRegistInfo::getPaidCodeId, paidCodeId);
+        AssoPaidCodeRegistInfo assoPaidCodeRegistInfo = assoPaidCodeRegistInfoService.getOne(queryWrapper1, false);
+        Integer registInfoId = assoPaidCodeRegistInfo.getRegistInfoId();
+        RegistInformation registInformation = registInformationService.getById(registInfoId);
+        BeanUtils.copyProperties(registInformation, paidCodeReInfoVO);
+
+        return paidCodeReInfoVO;
+    }
+
+
+    /**
+     * 根据付费码发送验证码
+     *
+     * @param
+     * @return
+     */
+    public PaidCodeReInfoVO checkPhoneCode(CheckPaidCodePhoneCodeDTO checkPaidCodePhoneCodeDTO) {
+        String phoneCode = checkPaidCodePhoneCodeDTO.getPhoneCode();
+        String paidCode = checkPaidCodePhoneCodeDTO.getPaidCode();
+
+        //验证码是否存在
+        LambdaQueryWrapper<PaidCode> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PaidCode::getCode, paidCode);
+        PaidCode paidCodeEn = this.getOne(queryWrapper, false);
+        if (paidCodeEn == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "付费码不存在");
+        }
+
+        String code = redisUtil.get(LoginCacheKeyUtil.getPaidCodeCaptcha(paidCode));
+        if (phoneCode == null || phoneCode.trim().equals("")) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "请输入验证码");
+        }
+        if (code == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "验证码已过期");
+        }
+        if (!code.equals(phoneCode)) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "验证码错误");
+        }
+        String token = this.setPaidCodeToken(paidCode);
+        //查询注册信息
+        PaidCodeReInfoVO paidCodeReInfoVO = this.getRegistInformationByPaidCode(paidCodeEn.getId());
+        paidCodeReInfoVO.setToken(token);
+        return paidCodeReInfoVO;
+    }
+
+
+    @Transactional
+    public void addTenantByPaidCode(AddTenantByPaidCodeDTO addTenantByPaidCodeDTO) {
+        String token = addTenantByPaidCodeDTO.getToken();
+        //根据token获得付费码
+        String code = this.getPaidCodeToken(token);
+        if (code == null || code.trim().equals("")) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "未通过验证");
+        }
+
+    }
+
+    public TenantVO transToTenantVO(AddTenantByPaidCodeDTO addTenantByPaidCodeDTO) {
+        TenantVO tenantVO = new TenantVO();
+        tenantVO.setUsername(addTenantByPaidCodeDTO.getPersonnelUserName());
+        tenantVO.setName(addTenantByPaidCodeDTO.getPersonnelName());
+        tenantVO.setAddress(addTenantByPaidCodeDTO.getTenantAddress());
+        tenantVO.setType(addTenantByPaidCodeDTO.getTenantType().toString());
+        tenantVO.setPassword(addTenantByPaidCodeDTO.getPersonnelPassword());
+        tenantVO.setCompanyName(addTenantByPaidCodeDTO.getTenantName());
+        return tenantVO;
+    }
+}
+
+
+
+

+ 54 - 0
PCS/src/main/java/cn/cslg/permission/service/qiaobi/RegistInformationService.java

@@ -0,0 +1,54 @@
+package cn.cslg.permission.service.qiaobi;
+
+import cn.cslg.permission.common.model.qiaobi.paidCode.AddTenantByPaidCodeDTO;
+import cn.cslg.permission.common.model.qiaobi.paidCode.PaidCodeAddDTO;
+import cn.cslg.permission.domain.qiaobi.AssoPaidCodeRegistInfo;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.cslg.permission.domain.qiaobi.RegistInformation;
+import cn.cslg.permission.mapper.qiaobi.RegistInformationMapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+/**
+* @author admin
+* @description 针对表【REGIST_INFORMATION(注册信息表)】的数据库操作Service实现
+* @createDate 2024-12-09 15:16:11
+*/
+@Service
+@RequiredArgsConstructor
+public class RegistInformationService extends ServiceImpl<RegistInformationMapper, RegistInformation> {
+private final  AssoPaidCodeRegistInfoService assoPaidCodeRegistInfoService;
+    public  RegistInformation addRegistInformation(PaidCodeAddDTO paidCodeAddDTO){
+        RegistInformation registInformation =new RegistInformation();
+        BeanUtils.copyProperties(paidCodeAddDTO,registInformation);
+        registInformation.insert();
+        return  registInformation;
+    }
+
+
+
+    public  RegistInformation updateRegistInformation(PaidCodeAddDTO paidCodeAddDTO){
+        //根据paidCodeId 查询注册信息id
+        Integer paidCodeId =paidCodeAddDTO.getId();
+        LambdaQueryWrapper<AssoPaidCodeRegistInfo> queryWrapper =new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoPaidCodeRegistInfo::getPaidCodeId,paidCodeId);
+        AssoPaidCodeRegistInfo assoPaidCodeRegistInfo =assoPaidCodeRegistInfoService.getOne(queryWrapper,false);
+
+        //获取注册信息id
+        Integer registInfoId =assoPaidCodeRegistInfo.getRegistInfoId();
+
+        RegistInformation registInformation =this.getById(registInfoId);
+        BeanUtils.copyProperties(paidCodeAddDTO,registInformation);
+        registInformation.setId(registInfoId);
+        registInformation.updateById();
+        return  registInformation;
+    }
+
+
+}
+
+
+
+

+ 3 - 1
PCS/src/main/resources/application-dev.yml

@@ -47,4 +47,6 @@ inviteSignInLink: http://47.116.194.135:8078/register
 SMS:
   regionId: cn-shanghai
   accessKeyId: LTAI5tGyG1Q7fKprgg1nWhXj
-  secret: Y6Erboh5lEFiRPR4XK8oCPMvUzYGLN
+  secret: Y6Erboh5lEFiRPR4XK8oCPMvUzYGLN
+
+FMSUrl: http://192.168.2.24:8803

+ 2 - 1
PCS/src/main/resources/application-testNetIn.yml

@@ -47,4 +47,5 @@ inviteSignInLink: http://47.116.194.135:8078/register
 SMS:
   regionId: cn-shanghai
   accessKeyId: LTAI5tGyG1Q7fKprgg1nWhXj
-  secret: Y6Erboh5lEFiRPR4XK8oCPMvUzYGLN
+  secret: Y6Erboh5lEFiRPR4XK8oCPMvUzYGLN
+FMSUrl: http://localhost:8803

+ 63 - 17
PCS/src/main/resources/mapper/AppVipTypeMapper.xml

@@ -6,41 +6,87 @@
 
 
     <select id="queryQiaobiVipTypeVOs" resultType="cn.cslg.permission.common.model.qiaobi.QiaoBiVIPTypeVO">
-        select vip.ID as vipTypeId,vip.TENANT_VIP_NAME as vipTypeName from APP_VIP_TYPE as app left join TENANT_VIP_TYPE as vip on
+        select vip.ID as vipTypeId,vip.TENANT_VIP_NAME as vipTypeName from APP_VIP_TYPE as app left join TENANT_VIP_TYPE
+        as vip on
         app.TENANT_VIP_TYPE_ID = vip.ID
         <where>
             app.APPLICATION_CODE =#{appCode}
             <if test="vipTypeName!=null">
-              and  vip.TENANT_VIP_NAME like concat('%', #{vipTypeName}, '%')
+                and vip.TENANT_VIP_NAME like concat('%', #{vipTypeName}, '%')
             </if>
         </where>
     </select>
 
     <select id="queryAppVipType" resultMap="queryAppVipTypeMap">
-        SELECT A.ID as APP_ID,
-               A.APPLICATION_CODE,
-               A.LAST_TIME,
-               B.ID AS TENANT_VIP_TYPE_ID,
-               B.TENANT_VIP_NAME,
-               B.REMARK,
-               B.CREATE_PERSON_ID,
-               B.CREATE_PERSON_NAME,
-               B.CREATE_TIME
+        SELECT
+        A.APPLICATION_CODE,
+        A.LAST_TIME,
+        B.ID AS ID,
+        B.TENANT_VIP_NAME,
+        B.REMARK,
+        B.CREATE_PERSON_ID,
+        B.CREATE_TIME,
+        B.ENABLE
         FROM APP_VIP_TYPE A
         LEFT JOIN TENANT_VIP_TYPE B
         ON A.TENANT_VIP_TYPE_ID = B.ID
-        LIMIT #{pageSize}
+
+<where>
+    <if test="ids!=null and ids.size()>0">
+      B.ID  in (
+        <foreach collection="ids" item="n" separator=",">
+            #{n}
+        </foreach>
+        )
+    </if>
+
+    <if test="enable!=null">
+        B.ENABLE =#{enable}
+    </if>
+
+    <if test="vipTypeName!=null and !vipTypeName.trim().equals('')">
+        B.TENANT_VIP_NAME like concat('%', #{vipTypeName}, '%')
+    </if>
+
+</where>
+        order by B.CREATE_TIME desc
+        <if test="current!=null and size!=null">
+            limit #{current},#{size}
+        </if>
+
     </select>
 
     <resultMap id="queryAppVipTypeMap" type="cn.cslg.permission.common.model.vo.AppVipTypeVO">
         <id column="APP_ID" property="id"/>
-        <result column="APPLICATION_CODE" property="applicationCode"/>
+        <result column="TENANT_VIP_NAME" property="vipTypeName"/>
+        <result column="ID" property="id"/>
+        <result column="ENABLE" property="enable"/>
         <result column="LAST_TIME" property="lastTime"/>
-        <result column="TENANT_VIP_TYPE_ID" property="tenantVipTypeId"/>
-        <result column="REMARK" property="remark"/>
-        <result column="CREATE_PERSON_ID" property="createPersonId"/>
-        <result column="CREATE_PERSON_NAME" property="createPersonName"/>
+        <result column="CREATE_PERSON_ID" property="createId"/>
         <result column="CREATE_TIME" property="createTime"/>
     </resultMap>
 
+    <select id="queryAppVipTypeTotal" resultType="java.lang.Long">
+        SELECT count(*)
+        FROM APP_VIP_TYPE A
+        LEFT JOIN TENANT_VIP_TYPE B
+        ON A.TENANT_VIP_TYPE_ID = B.ID
+        <where>
+            <if test="ids!=null and ids.size()>0">
+                B.ID  in (
+                <foreach collection="ids" item="n" separator=",">
+                    #{n}
+                </foreach>
+                )
+            </if>
+
+            <if test="enable!=null">
+                B.ENABLE =#{enable}
+            </if>
+
+            <if test="vipTypeName!=null and !vipTypeName.trim().equals('')">
+                B.TENANT_VIP_NAME like concat('%', #{vipTypeName}, '%')
+            </if>
+        </where>
+    </select>
 </mapper>

+ 6 - 0
PCS/src/main/resources/mapper/AssoPaidCodeRegistInfoMapper.xml

@@ -0,0 +1,6 @@
+<?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="cn.cslg.permission.mapper.qiaobi.AssoPaidCodeRegistInfoMapper">
+</mapper>

+ 26 - 0
PCS/src/main/resources/mapper/AssoPaidCodeVipTypeMapper.xml

@@ -0,0 +1,26 @@
+<?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="cn.cslg.permission.mapper.qiaobi.AssoPaidCodeVipTypeMapper">
+    <select id="queryVipNumList" resultType="cn.cslg.permission.common.model.qiaobi.paidCode.VipTypeNumVO">
+        SELECT
+        apc.VIP_TYPE_ID as vipTypeId,
+               vt.TENANT_VIP_NAME as vipTypeName,
+        apc.VIP_TYPE_NUM as vipTypeNum,apc.PAID_CODE_ID as paidCodeId
+        FROM ASSO_PAID_CODE_VIP_TYPE apc
+        LEFT JOIN TENANT_VIP_TYPE vt
+        on apc.VIP_TYPE_ID = vt.ID
+
+        <where>
+            <if test="paidCodeIds!=null and paidCodeIds.size()>0">
+                apc.PAID_CODE_ID in (
+                <foreach collection="paidCodeIds" item="n" separator=",">
+                    #{n}
+                </foreach>
+                )
+            </if>
+        </where>
+
+    </select>
+</mapper>

+ 98 - 0
PCS/src/main/resources/mapper/PaidCodeMapper.xml

@@ -0,0 +1,98 @@
+<?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="cn.cslg.permission.mapper.qiaobi.PaidCodeMapper">
+
+    <resultMap id="BaseResultMap" type="cn.cslg.permission.domain.qiaobi.PaidCode">
+        <id property="id" column="ID" jdbcType="INTEGER"/>
+        <result property="status" column="STATUS" jdbcType="INTEGER"/>
+        <result property="createTime" column="CREATE_TIME" jdbcType="TIMESTAMP"/>
+        <result property="createId" column="CREATE_ID" jdbcType="INTEGER"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        ID,STATUS,CREATE_TIME,
+        CREATE_ID
+    </sql>
+
+    <select id="queryPaidCodeList" resultType="cn.cslg.permission.common.model.qiaobi.paidCode.PaidCodeQueryVO">
+        SELECT
+               pc.ID as id,
+        pc.CODE as code,
+               pc.CREATE_TIME as createTime,
+               pc.CREATE_ID as createId,
+             pc.REMARK as remark,
+        pc.STATUS as status,
+        ri.TENANT_NAME as tenantName,
+        ri.TENANT_ADDRESS as tenantAddress,
+        ri.TENANT_TYPE as tenantType,
+        ri.PERSONNEL_EMAIL as personnelEmail,
+        ri.PERSONNEL_NAME as personnelName,
+        ri.PERSONNEL_USERNAME as personnelUserName,
+        ri.PERSONNEL_PHONE as personnelPhone,
+        ri.PERSONNEL_PASSWORD as personnelPassword
+        FROM PAID_CODE pc
+        LEFT JOIN ASSO_PAID_CODE_REGIST_INFO apc
+        on pc.ID = apc.PAID_CODE_ID
+        left join REGIST_INFORMATION ri
+        on apc.REGIST_INFO_ID=ri.ID
+
+        <where>
+            <if test="ids!=null and ids.size()>0">
+                pc.ID in (
+                <foreach collection="ids" item="n" separator=",">
+                    #{n}
+                </foreach>
+                )
+            </if>
+
+            <if test="status!=null">
+                pc.STATUS =#{status}
+            </if>
+
+            <if test="personnelPhone!=null">
+                ri.PERSONNEL_PHONE =#{personnelPhone}
+            </if>
+
+        </where>
+        order by pc.CREATE_TIME desc
+        <if test="current!=null and size!=null">
+            limit #{current},#{size}
+        </if>
+
+    </select>
+
+
+    <select id="queryPaidCodeListTotal" resultType="java.lang.Long">
+        SELECT
+        count(*)
+        FROM PAID_CODE pc
+        LEFT JOIN ASSO_PAID_CODE_REGIST_INFO apc
+        on pc.ID = apc.PAID_CODE_ID
+        left join REGIST_INFORMATION ri
+        on apc.REGIST_INFO_ID=ri.ID
+
+        <where>
+            <if test="ids!=null and ids.size()>0">
+                pc.ID in (
+                <foreach collection="ids" item="n" separator=",">
+                    #{n}
+                </foreach>
+                )
+            </if>
+
+            <if test="status!=null">
+                pc.STATUS =#{status}
+            </if>
+
+            <if test="personnelPhone!=null">
+                ri.PERSONNEL_PHONE =#{personnelPhone}
+            </if>
+
+        </where>
+        order by pc.CREATE_TIME desc
+
+
+    </select>
+</mapper>

+ 24 - 0
PCS/src/main/resources/mapper/RegistInformationMapper.xml

@@ -0,0 +1,24 @@
+<?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="cn.cslg.permission.mapper.qiaobi.RegistInformationMapper">
+
+    <resultMap id="BaseResultMap" type="cn.cslg.permission.domain.qiaobi.RegistInformation">
+            <result property="id" column="ID" jdbcType="INTEGER"/>
+            <result property="tenantName" column="TENANT_NAME" jdbcType="VARCHAR"/>
+            <result property="tenantType" column="TENANT_TYPE" jdbcType="INTEGER"/>
+            <result property="tenantAddress" column="TENANT_ADDRESS" jdbcType="VARCHAR"/>
+            <result property="personnelName" column="PERSONNEL_NAME" jdbcType="VARCHAR"/>
+            <result property="personnelPhone" column="PERSONNEL_PHONE" jdbcType="VARCHAR"/>
+            <result property="personnelEmail" column="PERSONNEL_EMAIL" jdbcType="VARCHAR"/>
+            <result property="personnelUsername" column="PERSONNEL_USERNAME" jdbcType="VARCHAR"/>
+            <result property="personnelPassword" column="PERSONNEL_PASSWORD" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        ID,TENANT_NAME,TENANT_TYPE,
+        TENANT_ADDRESS,PERSONNEL_NAME,PERSONNEL_PHONE,
+        PERSONNEL_EMAIL,PERSONNEL_USERNAME,PERSONNEL_PASSWORD
+    </sql>
+</mapper>

+ 41 - 0
PCS/src/test/java/cn/cslg/permission/FunctionTest.java

@@ -0,0 +1,41 @@
+package cn.cslg.permission;
+
+import cn.cslg.permission.common.core.business.LoginCacheKeyUtil;
+import cn.cslg.permission.common.model.qiaobi.QiaoBiPersonSignUpDTO;
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryVipFunctionDTO;
+import cn.cslg.permission.common.model.vo.FunctionCodeTreeVO;
+import cn.cslg.permission.common.utils.RandomUtil;
+import cn.cslg.permission.common.utils.RedisUtil;
+import cn.cslg.permission.domain.Personnel;
+import cn.cslg.permission.service.FunctionService;
+import cn.cslg.permission.service.PersonnelService;
+import cn.cslg.permission.service.qiaobi.AppVipTypeService;
+import cn.cslg.permission.service.qiaobi.QiaoBiPersonService;
+import cn.hutool.crypto.SecureUtil;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.IOException;
+import java.util.List;
+
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class FunctionTest {
+    @Autowired
+    private FunctionService functionService;
+
+    @Test
+    public void PersonTest () throws IOException {
+        QueryVipFunctionDTO queryVipFunctionDTO=new QueryVipFunctionDTO();
+        queryVipFunctionDTO.setApplicationCode("4e95e3d926a2a4befa5d913acc0aa9f5");
+
+        List<FunctionCodeTreeVO> vos= functionService.queryVipFunctionTree(queryVipFunctionDTO);
+        System.out.println(vos);
+    }
+
+
+}

+ 175 - 0
PCS/src/test/java/cn/cslg/permission/VersionTest.java

@@ -0,0 +1,175 @@
+package cn.cslg.permission;
+
+import cn.cslg.permission.common.core.business.LoginCacheKeyUtil;
+import cn.cslg.permission.common.model.Records;
+import cn.cslg.permission.common.model.dto.AssoFunctionCodeDTO;
+import cn.cslg.permission.common.model.dto.QueryVersionListDTO;
+import cn.cslg.permission.common.model.dto.VersionDTO;
+import cn.cslg.permission.common.model.qiaobi.QiaoBiPersonSignUpDTO;
+import cn.cslg.permission.common.model.qiaobi.version.AddFunctionDTO;
+import cn.cslg.permission.common.model.qiaobi.version.QueryFunctionCodeTreeVO;
+import cn.cslg.permission.common.model.vo.FunctionCodeTreeVO;
+import cn.cslg.permission.common.utils.RandomUtil;
+import cn.cslg.permission.common.utils.RedisUtil;
+import cn.cslg.permission.domain.Personnel;
+import cn.cslg.permission.domain.TenantVipType;
+import cn.cslg.permission.domain.Version;
+import cn.cslg.permission.service.PersonnelService;
+import cn.cslg.permission.service.VersionService;
+import cn.cslg.permission.service.impl.TenantVipTypeService;
+import cn.cslg.permission.service.qiaobi.AppVipTypeService;
+import cn.cslg.permission.service.qiaobi.AssoFunctionModuleService;
+import cn.cslg.permission.service.qiaobi.QiaoBiPersonService;
+import cn.hutool.crypto.SecureUtil;
+import lombok.RequiredArgsConstructor;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class VersionTest {
+    @Autowired
+    private VersionService versionService;
+    @Autowired
+    private AssoFunctionModuleService assoFunctionModuleService;
+    @Autowired
+    private TenantVipTypeService tenantVipTypeService;
+
+    public List<AssoFunctionCodeDTO> getAssoFunctionCodeDTO3() {
+        List<AssoFunctionCodeDTO> assoFunctionCodeDTOS = new ArrayList<>();
+
+        AssoFunctionCodeDTO assoFunctionCodeDTO = new AssoFunctionCodeDTO();
+        assoFunctionCodeDTO.setFunctionId(223);
+        AssoFunctionCodeDTO assoFunctionCodeDTO2 = new AssoFunctionCodeDTO();
+        assoFunctionCodeDTO2.setFunctionId(248);
+        AssoFunctionCodeDTO.FunctionCode functionCode1 = new AssoFunctionCodeDTO.FunctionCode();
+        functionCode1.setCode("1");
+        functionCode1.setAuthType(1);
+        AssoFunctionCodeDTO.FunctionCode functionCode2 = new AssoFunctionCodeDTO.FunctionCode();
+        functionCode2.setCode("2");
+        functionCode2.setAuthType(2);
+        assoFunctionCodeDTO2.setFunctionCodes(Arrays.asList(functionCode1, functionCode2));
+        assoFunctionCodeDTOS.addAll(Arrays.asList(assoFunctionCodeDTO,assoFunctionCodeDTO2));
+        return assoFunctionCodeDTOS;
+    }
+
+    public List<AssoFunctionCodeDTO> getAssoFunctionCodeDTO() {
+        List<AssoFunctionCodeDTO> assoFunctionCodeDTOS = new ArrayList<>();
+
+        AssoFunctionCodeDTO assoFunctionCodeDTO = new AssoFunctionCodeDTO();
+        assoFunctionCodeDTO.setFunctionId(243);
+        AssoFunctionCodeDTO.FunctionCode functionCode1 = new AssoFunctionCodeDTO.FunctionCode();
+        functionCode1.setCode("1");
+        functionCode1.setAuthType(1);
+        AssoFunctionCodeDTO.FunctionCode functionCode2 = new AssoFunctionCodeDTO.FunctionCode();
+        functionCode2.setCode("2");
+        functionCode2.setAuthType(2);
+        assoFunctionCodeDTO.setFunctionCodes(Arrays.asList(functionCode1, functionCode2));
+        assoFunctionCodeDTOS.add(assoFunctionCodeDTO);
+        return assoFunctionCodeDTOS;
+    }
+
+
+    public List<AssoFunctionCodeDTO> getAssoFunctionCodeDTO2() {
+        List<AssoFunctionCodeDTO> assoFunctionCodeDTOS = new ArrayList<>();
+
+        AssoFunctionCodeDTO assoFunctionCodeDTO = new AssoFunctionCodeDTO();
+        assoFunctionCodeDTO.setFunctionId(242);
+        AssoFunctionCodeDTO.FunctionCode functionCode1 = new AssoFunctionCodeDTO.FunctionCode();
+        functionCode1.setCode("3");
+        functionCode1.setAuthType(1);
+        AssoFunctionCodeDTO.FunctionCode functionCode2 = new AssoFunctionCodeDTO.FunctionCode();
+        functionCode2.setCode("4");
+        functionCode2.setAuthType(2);
+        assoFunctionCodeDTO.setFunctionCodes(Arrays.asList(functionCode1, functionCode2));
+        assoFunctionCodeDTOS.add(assoFunctionCodeDTO);
+        return assoFunctionCodeDTOS;
+    }
+
+    @Test
+    public void addVersion() {
+        VersionDTO versionDTO = new VersionDTO();
+        versionDTO.setVersionNum("1.0.4");
+        versionDTO.setVersionName("测试版本2");
+        versionDTO.setRemark("测试备注2");
+        versionDTO.setFileGuid("90ad707f64504553807e7f64146ef7af");
+        versionDTO.setApplicationCode("4e95e3d926a2a4befa5d913acc0aa9f5");
+        List<AssoFunctionCodeDTO> dtos = getAssoFunctionCodeDTO3();
+        versionDTO.setAssoFunctionCodeDTOS(dtos);
+        versionService.add(versionDTO);
+
+    }
+
+    @Test
+    public void deleteVersion() {
+        versionService.delete(Arrays.asList(18, 19, 20, 21));
+    }
+
+    @Test
+    public void updateVersion() {
+        VersionDTO versionDTO = new VersionDTO();
+        versionDTO.setId(22);
+        versionDTO.setVersionNum("1.0.2");
+        versionDTO.setVersionName("测试版本2");
+        versionDTO.setRemark("测试备注2");
+        versionDTO.setFileGuid("90ad707f64504553807e7f64146ef7af1");
+        versionDTO.setApplicationCode("4e95e3d926a2a4befa5d913acc0aa9f5");
+        List<AssoFunctionCodeDTO> dtos = getAssoFunctionCodeDTO2();
+        versionDTO.setAssoFunctionCodeDTOS(dtos);
+        versionService.update(versionDTO);
+    }
+
+    @Test
+    public void queryVersion() {
+        QueryVersionListDTO queryVersionListDTO = new QueryVersionListDTO();
+        queryVersionListDTO.setCurrent(1l);
+        queryVersionListDTO.setSize(10l);
+        Records records = versionService.queryVersionList(queryVersionListDTO);
+        System.out.println(records);
+    }
+
+    @Test
+    public void queryVersion2() {
+        QueryVersionListDTO queryVersionListDTO = new QueryVersionListDTO();
+        queryVersionListDTO.setIds(Arrays.asList(22));
+        Records records = versionService.queryVersionList(queryVersionListDTO);
+        System.out.println(records);
+    }
+
+    @Test
+    public void getFunctionCodeTree() {
+        QueryFunctionCodeTreeVO queryFunctionCodeTreeVO =new QueryFunctionCodeTreeVO();
+        queryFunctionCodeTreeVO.setVersionId(23);
+        List<FunctionCodeTreeVO> treeVOS = assoFunctionModuleService.getFunctionCodeTree(queryFunctionCodeTreeVO);
+        System.out.println(treeVOS);
+    }
+
+    @Test
+    public void addFunction() {
+        AddFunctionDTO addFunctionDTO = new AddFunctionDTO();
+        addFunctionDTO.setFunction(223);
+        addFunctionDTO.setName("测试功能");
+        addFunctionDTO.setSign("test2");
+        addFunctionDTO.setApplicationCode("4e95e3d926a2a4befa5d913acc0aa9f5");
+        versionService.addFunction(addFunctionDTO);
+        System.out.println("treeVOS");
+    }
+    @Test
+    public void update(){
+        Version version =versionService.getById(23);
+        version.setRemark("123124");
+        version.updateById();
+        TenantVipType tenantVipType =tenantVipTypeService.getById(29);
+        tenantVipType.setTenantVipName("12314");
+        tenantVipType.updateById();
+    }
+}