Przeglądaj źródła

20250704 窍笔支付记录

lrj 2 miesięcy temu
rodzic
commit
915e70b820
75 zmienionych plików z 1625 dodań i 336 usunięć
  1. 3 2
      PCS/src/main/java/cn/cslg/permission/common/model/dto/AppVipTypeDTO.java
  2. 1 0
      PCS/src/main/java/cn/cslg/permission/common/model/dto/PersonnelDTO.java
  3. 1 0
      PCS/src/main/java/cn/cslg/permission/common/model/dto/QueryVipDTO.java
  4. 2 1
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/PersonVipMessVO.java
  5. 15 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/functionUseRecord/FunctionUserRecordVO.java
  6. 12 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/goods/GoodByLimitVO.java
  7. 9 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/goods/GoodCountVO.java
  8. 3 2
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/goods/GoodsAddDTO.java
  9. 3 2
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/goods/GoodsQueryDTO.java
  10. 12 4
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/goods/GoodsQueryVO.java
  11. 16 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/goods/MarketStrategyVO.java
  12. 9 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/payOrder/FunctionRecordAddDTO.java
  13. 13 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/payOrder/FunctionRecordGroupDTO.java
  14. 12 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/payOrder/FunctionRecordGroupVO.java
  15. 2 1
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/payOrder/OrderGoodDTO.java
  16. 3 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/payOrder/PayOrderQueryDTO.java
  17. 5 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/vipType/QueryPersonVipDTO.java
  18. 7 1
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/vipType/QueryPersonVipVO.java
  19. 9 0
      PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/vipType/VipFunctionAddVO.java
  20. 2 1
      PCS/src/main/java/cn/cslg/permission/common/model/vo/AppVipTypeVO.java
  21. 1 0
      PCS/src/main/java/cn/cslg/permission/common/model/vo/AssoTenantVipTypeAndFunctionVO.java
  22. 3 0
      PCS/src/main/java/cn/cslg/permission/common/model/vo/EncryptionFunctionVO.java
  23. 1 0
      PCS/src/main/java/cn/cslg/permission/common/model/vo/FunctionCodeTreeVO.java
  24. 5 1
      PCS/src/main/java/cn/cslg/permission/common/utils/CacheUtils.java
  25. 24 0
      PCS/src/main/java/cn/cslg/permission/common/utils/DateUtils.java
  26. 44 13
      PCS/src/main/java/cn/cslg/permission/controller/qiaobi/GoodsController.java
  27. 23 4
      PCS/src/main/java/cn/cslg/permission/controller/qiaobi/PayController.java
  28. 1 1
      PCS/src/main/java/cn/cslg/permission/controller/qiaobi/VipTypeController.java
  29. 2 1
      PCS/src/main/java/cn/cslg/permission/domain/AssoTenantVipTypeAndFunction.java
  30. 1 1
      PCS/src/main/java/cn/cslg/permission/domain/qiaobi/AssoPersonFunction.java
  31. 5 1
      PCS/src/main/java/cn/cslg/permission/domain/qiaobi/AssoPersonVipType.java
  32. 28 0
      PCS/src/main/java/cn/cslg/permission/domain/qiaobi/FunctionUseRecord.java
  33. 26 0
      PCS/src/main/java/cn/cslg/permission/domain/qiaobi/GoodByLimit.java
  34. 1 0
      PCS/src/main/java/cn/cslg/permission/domain/qiaobi/Goods.java
  35. 20 0
      PCS/src/main/java/cn/cslg/permission/factory/goodLimit/GoodLimitFactory.java
  36. 7 0
      PCS/src/main/java/cn/cslg/permission/factory/goodLimit/GoodLimitFactoryImp.java
  37. 31 0
      PCS/src/main/java/cn/cslg/permission/factory/goodLimit/VipCanByGoodLimit.java
  38. 1 1
      PCS/src/main/java/cn/cslg/permission/factory/strategy/EightCountStrategy.java
  39. 1 0
      PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/AssoPersonVipTypeMapper.java
  40. 23 0
      PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/FunctionUseRecordMapper.java
  41. 18 0
      PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/GoodByLimitMapper.java
  42. 2 0
      PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/PayOrderMapper.java
  43. 16 16
      PCS/src/main/java/cn/cslg/permission/service/AssoTenantVipTypeFunctionService.java
  44. 9 6
      PCS/src/main/java/cn/cslg/permission/service/FunctionService.java
  45. 60 19
      PCS/src/main/java/cn/cslg/permission/service/LoginService.java
  46. 4 0
      PCS/src/main/java/cn/cslg/permission/service/PersonnelService.java
  47. 33 0
      PCS/src/main/java/cn/cslg/permission/service/SysDictItemService.java
  48. 2 1
      PCS/src/main/java/cn/cslg/permission/service/SysDictService.java
  49. 15 6
      PCS/src/main/java/cn/cslg/permission/service/common/LoadService.java
  50. 9 9
      PCS/src/main/java/cn/cslg/permission/service/impl/TenantVipTypeService.java
  51. 41 9
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/AppVipTypeService.java
  52. 13 4
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoFunctionModuleService.java
  53. 21 2
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoPersonFunctionService.java
  54. 112 102
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoPersonVipTypeService.java
  55. 165 0
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/FunctionUseRecordService.java
  56. 52 0
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/GoodByLimitService.java
  57. 201 19
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/GoodsService.java
  58. 34 4
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/MarketStrategyService.java
  59. 29 8
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/PayOrderService.java
  60. 8 6
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/QiaoBiPersonService.java
  61. 7 2
      PCS/src/main/java/cn/cslg/permission/service/qiaobi/StatsService.java
  62. 154 26
      PCS/src/main/java/cn/cslg/permission/service/weixinpay/WeixinPayService.java
  63. 2 1
      PCS/src/main/resources/application-dev.yml
  64. 28 25
      PCS/src/main/resources/mapper/AppVipTypeMapper.xml
  65. 13 0
      PCS/src/main/resources/mapper/AssoPerDpMapper.xml
  66. 22 2
      PCS/src/main/resources/mapper/AssoPersonVipTypeMapper.xml
  67. 1 1
      PCS/src/main/resources/mapper/AssoTenantVipTypeFunctionMapper.xml
  68. 22 0
      PCS/src/main/resources/mapper/FunctionUseRecordMapper.xml
  69. 18 0
      PCS/src/main/resources/mapper/GoodByLimitMapper.xml
  70. 50 20
      PCS/src/main/resources/mapper/PayOrderMapper.xml
  71. 10 6
      PCS/src/main/resources/mapper/PersonnelMapper.xml
  72. 6 1
      PCS/src/test/java/cn/cslg/permission/AppVipTypeTest.java
  73. 24 0
      PCS/src/test/java/cn/cslg/permission/qiaobi/GoodByLimitTest.java
  74. 25 0
      PCS/src/test/java/cn/cslg/permission/qiaobi/GoodStrategyTest.java
  75. 12 4
      PCS/src/test/java/cn/cslg/permission/qiaobi/PayOrderSTest.java

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

@@ -1,5 +1,6 @@
 package cn.cslg.permission.common.model.dto;
 
+import cn.cslg.permission.common.model.qiaobi.vipType.VipFunctionAddVO;
 import lombok.Data;
 
 import java.util.Date;
@@ -36,6 +37,6 @@ public class AppVipTypeDTO {
      */
     private Integer enable;
 
-    private List<Integer> functionIds;
-
+    private List<VipFunctionAddVO> functionAddVOs;
+    private Integer vipLevel;
 }

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

@@ -18,6 +18,7 @@ public class PersonnelDTO {
     private Integer expitrDays;
     private Integer id;
     private Long size;
+    private Boolean ifExpited;
     /**
      * 当前页数
      */

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

@@ -16,6 +16,7 @@ public class QueryVipDTO {
     private List<Integer> ids;
     private String vipTypeName;
     private Integer enable;
+    private Integer vipLevel;
     /**
      * 每页条数
      */

+ 2 - 1
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/PersonVipMessVO.java

@@ -1,5 +1,6 @@
 package cn.cslg.permission.common.model.qiaobi;
 
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipVO;
 import cn.cslg.permission.common.model.vo.AppVipTypeVO;
 import lombok.Data;
 
@@ -8,6 +9,6 @@ import java.util.List;
 
 @Data
 public class PersonVipMessVO {
-    private List<AppVipTypeVO> vipTypeVOS;
+    private QueryPersonVipVO vip;
     private Boolean ifInVip;
 }

+ 15 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/functionUseRecord/FunctionUserRecordVO.java

@@ -0,0 +1,15 @@
+package cn.cslg.permission.common.model.qiaobi.functionUseRecord;
+
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipVO;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FunctionUserRecordVO {
+    private Integer vipCanUseCount;
+    private Integer haveUseCount;
+    private Integer buyUseCount;
+    private Integer canUseCount;
+    private Integer assPersonFunctionId;
+}

+ 12 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/goods/GoodByLimitVO.java

@@ -0,0 +1,12 @@
+package cn.cslg.permission.common.model.qiaobi.goods;
+
+import lombok.Data;
+
+@Data
+public class GoodByLimitVO {
+    private Integer id;
+
+    private String limitName;
+
+    private String remark;
+}

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

@@ -0,0 +1,9 @@
+package cn.cslg.permission.common.model.qiaobi.goods;
+
+import lombok.Data;
+
+@Data
+public class GoodCountVO {
+    private Integer createId;
+    private Long num;
+}

+ 3 - 2
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/goods/GoodsAddDTO.java

@@ -8,14 +8,14 @@ import java.util.List;
 @Data
 public class GoodsAddDTO {
     private Integer id;
-
+    private Integer goodId;
     private Double price;
     private String goodName;
 
     private Date startSaleTime;
     private Date expireTime;
 
-    private Integer byType;
+    private Integer goodType;
     /**
      * 商品数量
      */
@@ -27,5 +27,6 @@ public class GoodsAddDTO {
     private String remark;
 
     private List<Integer> goodLimits;
+    private List<Integer> goodStrategies;
     private Integer status;
 }

+ 3 - 2
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/goods/GoodsQueryDTO.java

@@ -19,7 +19,8 @@ public class GoodsQueryDTO {
      */
     private Integer goodType;
     private Integer status;
-
+    private Integer vipLevel;
+    private Integer vipId;
     /**
      * 每页条数
      */
@@ -29,5 +30,5 @@ public class GoodsQueryDTO {
      * 当前页数
      */
     private Long size;
-
+    private Integer ids;
 }

+ 12 - 4
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/goods/GoodsQueryVO.java

@@ -1,13 +1,15 @@
 package cn.cslg.permission.common.model.qiaobi.goods;
 
+import cn.cslg.permission.common.model.common.CommonVO;
 import cn.cslg.permission.common.model.vo.AppVipTypeVO;
 import cn.cslg.permission.common.model.vo.FunctionCodeTreeVO;
 import lombok.Data;
 
+import java.util.Date;
 import java.util.List;
 
 @Data
-public class GoodsQueryVO {
+public class GoodsQueryVO extends CommonVO {
     private Integer id;
 
     private Double price;
@@ -24,11 +26,17 @@ public class GoodsQueryVO {
      * 次,月,季度,年
      */
     private Integer goodUnit;
-
-
+    private String goodUnitStr;
+    private Date startSaleTime;
+    private Date expireTime;
+    private String goodTypeStr;
     private List<Integer> goodLimits;
+    private List<Integer> goodStrategyIds;
+    private List<GoodByLimitVO> goodByLimitVos;
+    private List<MarketStrategyVO> goodStrategyVos;
     private Integer status;
-    private String createName;
+    private String statusStr;
     private AppVipTypeVO vipMessage;
     private FunctionCodeTreeVO functionMessage;
+    private String remark;
 }

+ 16 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/goods/MarketStrategyVO.java

@@ -0,0 +1,16 @@
+package cn.cslg.permission.common.model.qiaobi.goods;
+
+import lombok.Data;
+
+import java.util.Date;
+@Data
+public class MarketStrategyVO {
+    private Integer id;
+
+    private String strategyName;
+
+    private String remark;
+
+    private Integer type;
+
+}

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

@@ -0,0 +1,9 @@
+package cn.cslg.permission.common.model.qiaobi.payOrder;
+
+import lombok.Data;
+
+@Data
+public class FunctionRecordAddDTO {
+    private Integer functionId;
+    private String parameters;
+}

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

@@ -0,0 +1,13 @@
+package cn.cslg.permission.common.model.qiaobi.payOrder;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class FunctionRecordGroupDTO {
+    private Integer personId;
+    private Integer tenantId;
+    private Date createTime;
+    private Integer functionId;
+}

+ 12 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/payOrder/FunctionRecordGroupVO.java

@@ -0,0 +1,12 @@
+package cn.cslg.permission.common.model.qiaobi.payOrder;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class FunctionRecordGroupVO {
+    private Integer functionId;
+    private Integer useCount;
+    private Date createTime;
+}

+ 2 - 1
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/payOrder/OrderGoodDTO.java

@@ -11,7 +11,8 @@ public class OrderGoodDTO {
     private Integer num;
     private Integer giveNum;
     private Integer totalNum;
-    private Double price;
+    private Double orgPrice;
     private Double totalPrice;
+    private Double disPrice;
     private QueryGoodsStrategyVO queryGoodsStrategyVO;
 }

+ 3 - 0
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/payOrder/PayOrderQueryDTO.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.util.Date;
+import java.util.List;
 
 @Data
 public class PayOrderQueryDTO {
@@ -19,4 +20,6 @@ public class PayOrderQueryDTO {
     private Integer tenantId;
     private Integer personId;
     private Integer groupBy;
+    private List<Integer> departmentIds;
+
 }

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

@@ -11,5 +11,10 @@ public class QueryPersonVipDTO {
     private Integer personId;
 
     private Integer vipType;
+    /**
+     * 1个人 2企业
+     */
+    private Integer personType;
+    private Integer tenantId;
 
 }

+ 7 - 1
PCS/src/main/java/cn/cslg/permission/common/model/qiaobi/vipType/QueryPersonVipVO.java

@@ -6,7 +6,6 @@ import java.util.Date;
 
 @Data
 public class QueryPersonVipVO {
-    private Integer id;
 
     private Integer personId;
     private String vipName;
@@ -16,4 +15,11 @@ public class QueryPersonVipVO {
     private Date expitrTime;
 
     private Integer vipLevel;
+
+    private String fromMessage;
+    /**
+     * 1商品 2邀请
+     */
+    private Integer fromType;
+    private Boolean ifInVip;
 }

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

@@ -0,0 +1,9 @@
+package cn.cslg.permission.common.model.qiaobi.vipType;
+
+import lombok.Data;
+
+@Data
+public class VipFunctionAddVO {
+    private Integer functionId;
+    private Integer canUseCount;
+}

+ 2 - 1
PCS/src/main/java/cn/cslg/permission/common/model/vo/AppVipTypeVO.java

@@ -20,7 +20,7 @@ public class AppVipTypeVO {
      * 持续时长 月
      */
     private Integer lastTime;
-
+    private Date ExpireTime;
     /**
      * 租户会员类型名称
      */
@@ -45,5 +45,6 @@ public class AppVipTypeVO {
     private Date createTime;
 
     private List<FunctionCodeTreeVO> functions;
+    private Integer vipLevel;
 
 }

+ 1 - 0
PCS/src/main/java/cn/cslg/permission/common/model/vo/AssoTenantVipTypeAndFunctionVO.java

@@ -26,5 +26,6 @@ public class AssoTenantVipTypeAndFunctionVO implements Serializable {
      * 功能权限路径
      */
     private String functionModifyPath;
+    private Integer canUseCount;
 
 }

+ 3 - 0
PCS/src/main/java/cn/cslg/permission/common/model/vo/EncryptionFunctionVO.java

@@ -10,5 +10,8 @@ public class EncryptionFunctionVO {
 
     //加密后的权限对应的模块化代码
     private String encryptionModuleCode;
+    private Integer canUseCount;
+    private Integer type;
+    private Integer functionId;
 
 }

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

@@ -47,4 +47,5 @@ public class FunctionCodeTreeVO {
 
     private List<FunctionCodeTreeVO> children;
     private Integer isSelect;
+    private Integer canUseCount;
 }

+ 5 - 1
PCS/src/main/java/cn/cslg/permission/common/utils/CacheUtils.java

@@ -22,7 +22,11 @@ public class CacheUtils {
     public PersonnelVO getLoginUser(Object userId) {
         String json = redisUtil.get(RedisConf.LOGIN_USER + RedisConf.SYMBOL_COLON + userId);
         if (StringUtils.isEmpty(json)) {
-            throw new XiaoShiException(ExceptionEnum.LOGIN_NO_LOGIN,ExceptionEnum.LOGIN_NO_LOGIN.getMessage());
+//            throw new XiaoShiException(ExceptionEnum.LOGIN_NO_LOGIN,ExceptionEnum.LOGIN_NO_LOGIN.getMessage());
+            PersonnelVO personnelVO = new PersonnelVO();
+            personnelVO.setTenantId(39);
+            personnelVO.setId("463");
+            return personnelVO;
         } else {
             return JSONObject.parseObject(json, PersonnelVO.class);
         }

+ 24 - 0
PCS/src/main/java/cn/cslg/permission/common/utils/DateUtils.java

@@ -466,7 +466,17 @@ public class DateUtils {
         }
         return day.intValue();
     }
+    public static int getDayByTwoDay(Date date1, Date date2) {
 
+        Long day = 0L;
+        try {
+
+            day = (date1.getTime() - date2.getTime()) / (24 * 60 * 60 * 1000);
+        } catch (Exception e) {
+            return 0;
+        }
+        return day.intValue();
+    }
     /**
      * 得到两个日期相差的秒数
      *
@@ -795,4 +805,18 @@ public class DateUtils {
         }
         return null;
     }
+    public static int getMonthDiff(Date largeDate, Date smallDate) {
+        Calendar c1 = Calendar.getInstance();
+        Calendar c2 = Calendar.getInstance();
+        c1.setTime(largeDate);
+        c2.setTime(smallDate);
+        int year1 = c1.get(Calendar.YEAR);
+        int year2 = c2.get(Calendar.YEAR);
+        int month1 = c1.get(Calendar.MONTH);
+        int month2 = c2.get(Calendar.MONTH);
+        int yearInterval = year1 - year2;
+        int monthInterval = month1 - month2;
+        int monthsDiff = yearInterval * 12 + monthInterval;
+        return monthsDiff;
+    }
 }

+ 44 - 13
PCS/src/main/java/cn/cslg/permission/controller/qiaobi/GoodsController.java

@@ -2,20 +2,20 @@ 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.qiaobi.goods.GoodUpdateStatusDTO;
-import cn.cslg.permission.common.model.qiaobi.goods.GoodsAddDTO;
-import cn.cslg.permission.common.model.qiaobi.goods.GoodsQueryDTO;
+import cn.cslg.permission.common.model.qiaobi.goods.*;
 import cn.cslg.permission.common.model.qiaobi.paidCode.CheckPaidCodePhoneCodeDTO;
 import cn.cslg.permission.common.model.qiaobi.paidCode.PaidCodeReInfoVO;
+import cn.cslg.permission.common.model.qiaobi.payOrder.PayOrderAddMessageDTO;
 import cn.cslg.permission.common.utils.Response;
 import cn.cslg.permission.domain.qiaobi.Goods;
+import cn.cslg.permission.domain.qiaobi.MarketStrategy;
+import cn.cslg.permission.service.qiaobi.GoodByLimitService;
 import cn.cslg.permission.service.qiaobi.GoodsService;
+import cn.cslg.permission.service.qiaobi.MarketStrategyService;
+import cn.cslg.permission.service.weixinpay.WeixinPayService;
 import io.swagger.v3.oas.annotations.Operation;
 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 org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -24,38 +24,69 @@ import java.util.List;
 public class GoodsController {
     @Autowired
     private GoodsService goodsService;
-
+    @Autowired
+    private MarketStrategyService marketStrategyService;
+    @Autowired
+    private GoodByLimitService goodByLimitService;
+    @Autowired
+    private WeixinPayService weixinPayService;
     @Operation(summary = "添加商品")
     @PostMapping("/addGoods")
     public String addGoods(@RequestBody GoodsAddDTO goodsAddDTO) {
         Integer id = goodsService.addGoods(goodsAddDTO);
         return Response.success(id);
     }
+
     @Operation(summary = "查询商品")
     @PostMapping("/queryGoods")
     public String queryGoods(@RequestBody GoodsQueryDTO goodsQueryDTO) {
-        Records  records = goodsService.queryGoods(goodsQueryDTO);
+        Records records = goodsService.queryGoods(goodsQueryDTO);
         return Response.success(records);
     }
+
     @Operation(summary = "删除商品")
-    @PostMapping("/removeGoods")
-    public String removeGoods(@RequestBody List<Integer> ids) {
+    @PostMapping("/deleteGoods")
+    public String deleteGoods(@RequestBody List<Integer> ids) {
         if (ids != null) {
             goodsService.delete(ids);
             return Response.success("删除完成");
         }
         return Response.error("请求参数为null");
     }
+
     @Operation(summary = "查询上架商品")
     @PostMapping("/queryOnSaleGoods")
     public String queryOnSaleGoods(@RequestBody GoodsQueryDTO goodsQueryDTO) {
-        Records  records = goodsService.queryGoods(goodsQueryDTO);
+        goodsQueryDTO.setStatus(2);
+        Records records = goodsService.queryGoods(goodsQueryDTO);
         return Response.success(records);
     }
+
     @Operation(summary = "更新商品状态")
     @PostMapping("/updateGoodsStatus")
     public String updateGoodsStatus(@RequestBody GoodUpdateStatusDTO goodUpdateStatusDTO) {
-        List<Integer>   ids = goodsService.updateGoodsStatus(goodUpdateStatusDTO);
+        List<Integer> ids = goodsService.updateGoodsStatus(goodUpdateStatusDTO);
         return Response.success(ids);
     }
+
+    @Operation(summary = "查询商品使用限制")
+    @GetMapping("/queryGoodsLimit")
+    public String queryGoodsLimit() {
+       List<GoodByLimitVO> goodByLimitVOS= goodByLimitService.queryAllGoodLimit(null);
+        return Response.success(goodByLimitVOS);
+    }
+    @Operation(summary = "查询商品营销策略")
+    @GetMapping("/queryGoodsStrategy")
+    public String queryGoodsStrategy() {
+        List<MarketStrategyVO> marketStrategyVOS= marketStrategyService.queryMarketStrategy(null);
+        return Response.success(marketStrategyVOS);
+    }
+
+
+    @Operation(summary = "计算商品价格")
+    @PostMapping ("/calculatePrice")
+    public String calculatePrice(@RequestBody PayOrderAddMessageDTO payOrderAddMessageDTO) {
+        PayOrderAddMessageDTO payOrderAddMessageDTO1= weixinPayService.calculatePrice(payOrderAddMessageDTO);
+        return Response.success(payOrderAddMessageDTO1);
+    }
 }

+ 23 - 4
PCS/src/main/java/cn/cslg/permission/controller/qiaobi/PayController.java

@@ -3,9 +3,12 @@ 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.qiaobi.functionUseRecord.FunctionUserRecordVO;
 import cn.cslg.permission.common.model.qiaobi.goods.GoodsAddDTO;
 import cn.cslg.permission.common.model.qiaobi.payOrder.*;
 import cn.cslg.permission.common.utils.Response;
+import cn.cslg.permission.domain.qiaobi.FunctionUseRecord;
+import cn.cslg.permission.service.qiaobi.FunctionUseRecordService;
 import cn.cslg.permission.service.qiaobi.PayOrderService;
 import cn.cslg.permission.service.weixinpay.WeixinPayService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -24,6 +27,8 @@ public class PayController {
     private  WeixinPayService weixinPayService;
     @Autowired
     private PayOrderService payOrderService;
+    @Autowired
+    private FunctionUseRecordService functionUseRecordService;
     @Operation(summary = "添加支付订单")
     @PostMapping("/addPayTicket")
     public String addPayTicket(@RequestBody PayOrderAddMessageDTO payOrderAddMessageDTO) {
@@ -32,7 +37,7 @@ public class PayController {
     }
     @Operation(summary = "支付成功")
     @PostMapping("/success")
-    private String success(@RequestBody WeiXinSuccessDTO weiXinSuccessDTO) throws IOException {
+    public String success(@RequestBody WeiXinSuccessDTO weiXinSuccessDTO) throws IOException {
         try {
             WeiXinSuccessDTO.Resource resource = weiXinSuccessDTO.getResource();
             System.out.println(resource);
@@ -46,14 +51,28 @@ public class PayController {
     }
     @Operation(summary = "查看付款记录")
     @PostMapping("/queryPayRecord")
-    private String queryPayRecord(@RequestBody PayOrderQueryDTO payOrderQueryDTO) throws IOException {
+    public String queryPayRecord(@RequestBody PayOrderQueryDTO payOrderQueryDTO) throws IOException {
       Records records=payOrderService.queryPayRecord(payOrderQueryDTO);
         return Response.success(records);
     }
-    @Operation(summary = "查看付款记录")
+    @Operation(summary = "分组付款记录")
     @PostMapping("/groupPayRecord")
-    private String groupPayRecord(@RequestBody PayOrderGroupByDTO payOrderGroupByDTO) throws IOException {
+    public String groupPayRecord(@RequestBody PayOrderGroupByDTO payOrderGroupByDTO) throws IOException {
         Records records=payOrderService.groupPayRecord(payOrderGroupByDTO);
         return Response.success(records);
     }
+
+    @Operation(summary = "添加功能使用记录")
+    @PostMapping("/addFunctionUseRecord")
+    public String addFunctionUseRecord(@RequestBody FunctionRecordAddDTO functionRecordAddDTO) throws IOException {
+        FunctionUseRecord functionUseRecord  =functionUseRecordService.addFunctionUseRecord(functionRecordAddDTO);
+        return Response.success(functionUseRecord);
+    }
+    @Operation(summary = "查询用户功能使用情况")
+    @PostMapping("/getPersonFunctionUseMess")
+    public String getPersonFunctionUseMess(@RequestBody FunctionRecordAddDTO functionRecordAddDTO) throws IOException {
+        FunctionUserRecordVO functionUserRecordVO =functionUseRecordService.getPersonFunctionUseMess(functionRecordAddDTO);
+        return Response.success(functionUserRecordVO);
+    }
+
 }

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

@@ -78,7 +78,7 @@ public class VipTypeController {
     @PostMapping("/delete")
     public String delete(@RequestBody List<Integer> ids) {
         if (ids != null) {
-            appVipTypeService.delete(ids);
+            appVipTypeService.deleteGoods(ids);
             return Response.success("删除成功");
         }
         return Response.error("删除失败");

+ 2 - 1
PCS/src/main/java/cn/cslg/permission/domain/AssoTenantVipTypeAndFunction.java

@@ -39,5 +39,6 @@ public class AssoTenantVipTypeAndFunction implements Serializable {
      */
     @TableField(value = "FUNCTION_MODIFY_PATH")
     private String functionModifyPath;
-
+    @TableField(value = "CAN_USE_COUNT")
+    private Integer canUseCount;
 }

+ 1 - 1
PCS/src/main/java/cn/cslg/permission/domain/qiaobi/AssoPersonFunction.java

@@ -27,5 +27,5 @@ public class AssoPersonFunction extends Model {
     private Date endTime;
 
     private Date createTime;
-
+    private Integer tenantId;
 }

+ 5 - 1
PCS/src/main/java/cn/cslg/permission/domain/qiaobi/AssoPersonVipType.java

@@ -25,5 +25,9 @@ public class AssoPersonVipType extends Model {
 
     private Date expitrTime;
 
-    private static final long serialVersionUID = 1L;
+   private String fromMessage;
+    /**
+     * 1商品 2邀请
+     */
+   private Integer fromType;
 }

+ 28 - 0
PCS/src/main/java/cn/cslg/permission/domain/qiaobi/FunctionUseRecord.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 FUNCTION_USE_RECORD
+ */
+@TableName(value ="FUNCTION_USE_RECORD")
+@Data
+public class FunctionUseRecord extends Model<FunctionUseRecord> {
+    private Integer id;
+
+    private Integer functionId;
+
+    private Integer personId;
+
+    private Date createTime;
+    private Integer tenantId;
+    private String parameters;
+}

+ 26 - 0
PCS/src/main/java/cn/cslg/permission/domain/qiaobi/GoodByLimit.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 GOOD_BY_LIMIT
+ */
+@TableName(value ="GOOD_BY_LIMIT")
+@Data
+public class GoodByLimit extends Model  {
+    private Integer id;
+
+    private String name;
+
+    private String limitMethod;
+
+    private String remark;
+
+}

+ 1 - 0
PCS/src/main/java/cn/cslg/permission/domain/qiaobi/Goods.java

@@ -40,6 +40,7 @@ public class Goods extends Model {
 
     private Date createTime;
     private String buyLimit;
+    private String goodStrategy;
     private Integer status;
     private Date startSaleTime;
     private Date expireTime;

+ 20 - 0
PCS/src/main/java/cn/cslg/permission/factory/goodLimit/GoodLimitFactory.java

@@ -0,0 +1,20 @@
+package cn.cslg.permission.factory.goodLimit;
+
+import cn.cslg.permission.factory.strategy.StrategyImp;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Component
+public class GoodLimitFactory {
+    @Autowired
+    private Map<String, GoodLimitFactoryImp> goodLimitFactoryImpMap;
+
+
+    public GoodLimitFactoryImp getClass(String goodLimitType) {
+        GoodLimitFactoryImp bean1 = goodLimitFactoryImpMap.get(goodLimitType);
+        System.out.println(bean1);
+        return bean1;
+    }
+}

+ 7 - 0
PCS/src/main/java/cn/cslg/permission/factory/goodLimit/GoodLimitFactoryImp.java

@@ -0,0 +1,7 @@
+package cn.cslg.permission.factory.goodLimit;
+
+import cn.cslg.permission.common.model.qiaobi.payOrder.OrderGoodDTO;
+
+public interface GoodLimitFactoryImp {
+    public OrderGoodDTO DoGoodLimit(OrderGoodDTO o);
+}

+ 31 - 0
PCS/src/main/java/cn/cslg/permission/factory/goodLimit/VipCanByGoodLimit.java

@@ -0,0 +1,31 @@
+package cn.cslg.permission.factory.goodLimit;
+
+import cn.cslg.permission.common.model.qiaobi.PersonVipMessVO;
+import cn.cslg.permission.common.model.qiaobi.payOrder.OrderGoodDTO;
+import cn.cslg.permission.common.utils.LoginUtils;
+import cn.cslg.permission.common.utils.common.BigDecimalUtil;
+import cn.cslg.permission.exception.ExceptionEnum;
+import cn.cslg.permission.exception.XiaoShiException;
+import cn.cslg.permission.factory.strategy.StrategyImp;
+import cn.cslg.permission.service.qiaobi.AssoPersonVipTypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class VipCanByGoodLimit implements GoodLimitFactoryImp {
+    @Autowired
+    private AssoPersonVipTypeService assoPersonVipTypeService;
+    @Autowired
+    private LoginUtils loginUtils;
+
+    @Override
+    public OrderGoodDTO DoGoodLimit(OrderGoodDTO orderGoodDTO) {
+
+        PersonVipMessVO personVipMessVO = assoPersonVipTypeService.getPersonVipMessage(loginUtils.getId());
+        Boolean ifInVip = personVipMessVO.getIfInVip();
+        if (!ifInVip) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "只有会员才能购买");
+        }
+         return null;
+    }
+}

+ 1 - 1
PCS/src/main/java/cn/cslg/permission/factory/strategy/EightCountStrategy.java

@@ -10,7 +10,7 @@ public class EightCountStrategy implements StrategyImp {
     @Override
     public OrderGoodDTO DoGoodStrategy(OrderGoodDTO orderGoodDTO) {
         Integer ByNum = orderGoodDTO.getNum();
-        Double price = orderGoodDTO.getPrice();
+        Double price = orderGoodDTO.getGoods().getPrice();
         Double totalPrice = orderGoodDTO.getTotalPrice();
         if (ByNum >= 10) {
             Integer a = ByNum / 10;

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

@@ -19,6 +19,7 @@ import java.util.List;
 public interface AssoPersonVipTypeMapper extends BaseMapper<AssoPersonVipType> {
 
     public List<QueryPersonVipVO> getPersonActiveVip(QueryPersonVipDTO queryPersonVipDTO);
+    public List<QueryPersonVipVO> getPersonVip(QueryPersonVipDTO queryPersonVipDTO);
 }
 
 

+ 23 - 0
PCS/src/main/java/cn/cslg/permission/mapper/qiaobi/FunctionUseRecordMapper.java

@@ -0,0 +1,23 @@
+package cn.cslg.permission.mapper.qiaobi;
+
+import cn.cslg.permission.common.model.qiaobi.payOrder.FunctionRecordGroupDTO;
+import cn.cslg.permission.common.model.qiaobi.payOrder.FunctionRecordGroupVO;
+import cn.cslg.permission.domain.qiaobi.FunctionUseRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ * @author admin
+ * @description 针对表【FUNCTION_USE_RECORD(功能使用记录)】的数据库操作Mapper
+ * @createDate 2025-07-11 10:50:53
+ * @Entity generator.domain.FunctionUseRecord
+ */
+public interface FunctionUseRecordMapper extends BaseMapper<FunctionUseRecord> {
+
+    public List<FunctionRecordGroupVO> getPersonUseRecord(FunctionRecordGroupDTO functionRecordGroupDTO);
+}
+
+
+
+

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

@@ -0,0 +1,18 @@
+package cn.cslg.permission.mapper.qiaobi;
+
+import cn.cslg.permission.domain.qiaobi.GoodByLimit;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author admin
+* @description 针对表【GOOD_BY_LIMIT(商品购买限制)】的数据库操作Mapper
+* @createDate 2025-07-14 14:48:45
+* @Entity generator.domain.GoodByLimit
+*/
+public interface GoodByLimitMapper extends BaseMapper<GoodByLimit> {
+
+}
+
+
+
+

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

@@ -1,5 +1,6 @@
 package cn.cslg.permission.mapper.qiaobi;
 
+import cn.cslg.permission.common.model.qiaobi.goods.GoodCountVO;
 import cn.cslg.permission.common.model.qiaobi.payOrder.PayOrderGroupByDTO;
 import cn.cslg.permission.common.model.qiaobi.payOrder.PayOrderGroupVO;
 import cn.cslg.permission.common.model.qiaobi.payOrder.PayOrderQueryDTO;
@@ -22,6 +23,7 @@ public interface PayOrderMapper extends BaseMapper<PayOrder> {
 
     public List<PayOrderGroupVO> groupPayRecord(PayOrderGroupByDTO payOrderGroupByDTO);
     public Long groupPayRecordTotal(PayOrderGroupByDTO payOrderGroupByDTO);
+    public GoodCountVO queryPayCount(boolean lastMonth);
 }
 
 

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

@@ -1,6 +1,7 @@
 package cn.cslg.permission.service;
 
 import cn.cslg.permission.common.model.dto.AssoFunctionCodeDTO;
+import cn.cslg.permission.common.model.qiaobi.vipType.VipFunctionAddVO;
 import cn.cslg.permission.domain.AssoTenantVipTypeAndFunction;
 import cn.cslg.permission.domain.Client;
 import cn.cslg.permission.domain.associate.AssoFunctionModule;
@@ -21,8 +22,8 @@ import java.util.stream.Collectors;
 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) {
+    public void saveFunctionModuleBatch(    List<VipFunctionAddVO> vos , Integer tenantVipTypeId) {
+        if (vos == null || vos.size() == 0) {
             return;
         }
 
@@ -34,14 +35,14 @@ public class AssoTenantVipTypeFunctionService extends ServiceImpl<AssoTenantVipT
             orgFunctionIds = assoFunctionCodeDTOS.stream().map(AssoTenantVipTypeAndFunction::getFunctionId).collect(Collectors.toList());
         }
 
-        Iterator<Integer> assoIterator = functionIds.iterator();
+        Iterator<VipFunctionAddVO> assoIterator = vos.iterator();
         while (assoIterator.hasNext()) {
-            Integer item = assoIterator.next();
+            VipFunctionAddVO item = assoIterator.next();
             if (orgFunctionIds.size() > 0) {
                 Iterator<Integer> orgIterator = orgFunctionIds.iterator();
                 while (orgIterator.hasNext()) {
                     Integer tem = orgIterator.next();
-                    if (item == tem) {
+                    if (item.getFunctionId() == tem) {
                         assoIterator.remove();
                         orgIterator.remove();
                     }
@@ -58,20 +59,21 @@ public class AssoTenantVipTypeFunctionService extends ServiceImpl<AssoTenantVipT
             this.remove(queryWrapper1);
         }
         //添加版本代码
-        this.saveAssoBatch(functionIds, tenantVipTypeId);
+        this.saveAssoBatch(vos, tenantVipTypeId);
 
     }
 
     @Transactional(rollbackFor = Exception.class)
-    public void saveAssoBatch(List<Integer> functionIds, Integer tenantVipTypeId) {
-        if (functionIds == null || functionIds.size() == 0) {
+    public void saveAssoBatch(List<VipFunctionAddVO> vos, Integer tenantVipTypeId) {
+        if (vos == null || vos.size() == 0) {
             return;
         }
         List<AssoTenantVipTypeAndFunction> assoTenantVipTypeAndFunctions = new ArrayList<>();
-        functionIds.forEach(item -> {
+        vos.forEach(item -> {
             AssoTenantVipTypeAndFunction assoTenantVipTypeAndFunction = new AssoTenantVipTypeAndFunction();
-            assoTenantVipTypeAndFunction.setFunctionId(item);
+            assoTenantVipTypeAndFunction.setFunctionId(item.getFunctionId());
             assoTenantVipTypeAndFunction.setTenantVipTypeId(tenantVipTypeId);
+            assoTenantVipTypeAndFunction.setCanUseCount(item.getCanUseCount());
             assoTenantVipTypeAndFunctions.add(assoTenantVipTypeAndFunction);
         });
         this.saveBatch(assoTenantVipTypeAndFunctions);
@@ -84,18 +86,15 @@ public class AssoTenantVipTypeFunctionService extends ServiceImpl<AssoTenantVipT
         this.remove(queryWrapper);
     }
 
-    public List<Integer> getFunctionIds(Integer vipId) {
-        List<Integer> functionIds = new ArrayList<>();
+    public List<AssoTenantVipTypeAndFunction> getAssoFunctions(Integer vipId) {
         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;
+        return assoTenantVipTypeAndFunctions;
 
     }
+
     public List<Integer> getFunctionIds(List<Integer> vipIds) {
         List<Integer> functionIds = new ArrayList<>();
         LambdaQueryWrapper<AssoTenantVipTypeAndFunction> queryWrapper = new LambdaQueryWrapper<>();
@@ -108,6 +107,7 @@ public class AssoTenantVipTypeFunctionService extends ServiceImpl<AssoTenantVipT
         return functionIds;
 
     }
+
     public List<AssoTenantVipTypeAndFunction> getByVipIds(List<Integer> vipIds) {
         List<Integer> functionIds = new ArrayList<>();
         LambdaQueryWrapper<AssoTenantVipTypeAndFunction> queryWrapper = new LambdaQueryWrapper<>();

+ 9 - 6
PCS/src/main/java/cn/cslg/permission/service/FunctionService.java

@@ -4,6 +4,7 @@ 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.AssoTenantVipTypeAndFunction;
 import cn.cslg.permission.domain.Function;
 import cn.cslg.permission.domain.Version;
 import cn.cslg.permission.domain.associate.AssoFunctionModule;
@@ -507,7 +508,8 @@ public class FunctionService extends ServiceImpl<FunctionMapper, Function> {
     public List<FunctionCodeTreeVO> queryVipFunctionTree(QueryVipFunctionDTO queryVipFunctionDTO) {
         Boolean ifAll = queryVipFunctionDTO.getIfAll();
         Integer versionId = queryVipFunctionDTO.getVipTypeId();
-        List<Integer> functionIds = assoTenantVipTypeFunctionService.getFunctionIds(versionId);
+        List<AssoTenantVipTypeAndFunction> assoTenantVipTypeAndFunctions = assoTenantVipTypeFunctionService.getAssoFunctions(versionId);
+        List<Integer>  functionIds= assoTenantVipTypeAndFunctions.stream().map(AssoTenantVipTypeAndFunction::getFunctionId).collect(Collectors.toList());
         String applicationCode = queryVipFunctionDTO.getApplicationCode();
         Application application = applicationService.getByCode(applicationCode);
         if (application == null) {
@@ -530,7 +532,7 @@ public class FunctionService extends ServiceImpl<FunctionMapper, Function> {
 
         List<FunctionCodeTreeVO> functionCodeTreeVOS1 = new ArrayList<>();
         rootFunctionList.forEach(item -> {
-            FunctionCodeTreeVO functionCodeTreeVO = AssoFunctionModuleService.loadFunctionCodeTreeVO(item, null);
+            FunctionCodeTreeVO functionCodeTreeVO = AssoFunctionModuleService.loadFunctionCodeTreeVO2(item, null,assoTenantVipTypeAndFunctions);
             if (functionIds.contains(functionCodeTreeVO.getId())) {
                 functionCodeTreeVO.setIsSelect(1);
             } else {
@@ -547,7 +549,7 @@ public class FunctionService extends ServiceImpl<FunctionMapper, Function> {
             List<FunctionCodeTreeVO> childVos = new ArrayList<>();
             if (childFunctions != null & childFunctions.size() > 0) {
                 childFunctions.forEach(item -> {
-                    FunctionCodeTreeVO childVo = AssoFunctionModuleService.loadFunctionCodeTreeVO(item, null);
+                    FunctionCodeTreeVO childVo = AssoFunctionModuleService.loadFunctionCodeTreeVO2(item, null,assoTenantVipTypeAndFunctions);
                     if (functionIds.contains(childVo.getId())) {
                         childVo.setIsSelect(1);
                     } else {
@@ -563,7 +565,7 @@ public class FunctionService extends ServiceImpl<FunctionMapper, Function> {
         return functionCodeTreeVOS2;
     }
 
-    public List<FunctionCodeTreeVO> loadVIPTypeFunction(List<Function> functionList) {
+    public List<FunctionCodeTreeVO> loadVIPTypeFunction(List<Function> functionList,List<AssoTenantVipTypeAndFunction> assoTenantVipTypeAndFunctions) {
 
         List<FunctionCodeTreeVO> functionCodeTreeVOS2 = new ArrayList<>();
         if(functionList==null||functionList.size()==0){
@@ -572,7 +574,7 @@ public class FunctionService extends ServiceImpl<FunctionMapper, Function> {
         List<FunctionCodeTreeVO> rootFunctionCodeTreeVOs = new ArrayList<>();
         List<Function> rootFunctionList = functionList.stream().filter(item -> item.getFunctionUp() != null && item.getFunctionUp().equals(0)).collect(Collectors.toList());
         rootFunctionList.forEach(item -> {
-            FunctionCodeTreeVO functionCodeTreeVO = AssoFunctionModuleService.loadFunctionCodeTreeVO(item, null);
+            FunctionCodeTreeVO functionCodeTreeVO = AssoFunctionModuleService.loadFunctionCodeTreeVO2(item, null,assoTenantVipTypeAndFunctions);
             rootFunctionCodeTreeVOs.add(functionCodeTreeVO);
         });
         functionCodeTreeVOS2.addAll(rootFunctionCodeTreeVOs);
@@ -583,7 +585,8 @@ public class FunctionService extends ServiceImpl<FunctionMapper, Function> {
             List<FunctionCodeTreeVO> childVos = new ArrayList<>();
             if (childFunctions != null & childFunctions.size() > 0) {
                 childFunctions.forEach(item -> {
-                    FunctionCodeTreeVO childVo = AssoFunctionModuleService.loadFunctionCodeTreeVO(item, null);
+
+                    FunctionCodeTreeVO childVo = AssoFunctionModuleService.loadFunctionCodeTreeVO2(item, null,assoTenantVipTypeAndFunctions);
                     childVos.add(childVo);
                 });
             }

+ 60 - 19
PCS/src/main/java/cn/cslg/permission/service/LoginService.java

@@ -5,12 +5,16 @@ import cn.cslg.permission.common.core.business.LoginCacheKeyUtil;
 import cn.cslg.permission.common.core.business.SmsService;
 import cn.cslg.permission.common.model.dto.*;
 import cn.cslg.permission.common.model.qiaobi.PersonVipMessVO;
+import cn.cslg.permission.common.model.qiaobi.payOrder.FunctionRecordGroupVO;
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipDTO;
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipVO;
 import cn.cslg.permission.common.model.vo.*;
 import cn.cslg.permission.common.utils.*;
 import cn.cslg.permission.common.utils.message.MessageUtils;
 import cn.cslg.permission.domain.*;
 import cn.cslg.permission.domain.associate.AssoFunctionModule;
 import cn.cslg.permission.domain.associate.AssoPersonnelMachine;
+import cn.cslg.permission.domain.qiaobi.AssoPersonFunction;
 import cn.cslg.permission.domain.qiaobi.AssoPersonVipType;
 import cn.cslg.permission.exception.ExceptionEnum;
 import cn.cslg.permission.exception.XiaoShiException;
@@ -21,7 +25,9 @@ import cn.cslg.permission.mapper.qiaobi.AssoPersonVipTypeMapper;
 import cn.cslg.permission.service.associate.PerDpService;
 import cn.cslg.permission.service.associate.PersonRoleService;
 import cn.cslg.permission.service.associate.RoleFunctionDataService;
+import cn.cslg.permission.service.qiaobi.AssoPersonFunctionService;
 import cn.cslg.permission.service.qiaobi.AssoPersonVipTypeService;
+import cn.cslg.permission.service.qiaobi.FunctionUseRecordService;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.captcha.CaptchaUtil;
 import cn.hutool.captcha.CircleCaptcha;
@@ -89,7 +95,9 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
     @Autowired
     private PersonInvitationCodeMapper personInvitationCodeMapper;
     @Autowired
-    private AssoPersonVipTypeMapper assoPersonVipTypeMapper;
+    private AssoPersonFunctionService assoPersonFunctionService;
+    @Autowired
+    private FunctionUseRecordService functionUseRecordService;
 
     /**
      * @param loginVO 登录参数类
@@ -353,15 +361,8 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
     }
 
     //校验登录时参数
-    public EncryptionLoginVO loginCommonMethod(LoginCommonDTO vo, Personnel personnel,LoginRecordVO loginRecordVO) throws Exception {
+    public EncryptionLoginVO loginCommonMethod(LoginCommonDTO vo, Personnel personnel, LoginRecordVO loginRecordVO) throws Exception {
         Integer personnelId = personnel.getId();
-        List<AssoPersonVipType> personVipTypes = assoPersonVipTypeMapper.selectList(new LambdaQueryWrapper<AssoPersonVipType>()
-                .eq(AssoPersonVipType::getPersonId, personnelId));
-        if (org.springframework.util.CollectionUtils.isEmpty(personVipTypes)) {
-            loginRecordVO.setLoginResult("无权限");
-            loginRecordService.addLoginRecord(loginRecordVO);
-            throw new XiaoShiException(ExceptionEnum.PERMISSION_ERROR);
-        }
         Long timeMillis = vo.getCurrentTimeMillis();
         String appKey = vo.getAppKey();
         String sign = vo.getSign();
@@ -412,14 +413,17 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
         //Sa-token 登录方法 登录后 生成Token 如果集成了Redis的话 会自动存入Redis
         StpUtil.login(personnel.getId());
         loginVO.setToken(StpUtil.getTokenValue());
-        PersonVipMessVO personVipMessVO = assoPersonVipTypeService.getPersonVipMessage(personnelId);
+        PersonVipMessVO personVipMessVO = new PersonVipMessVO();
+        QueryPersonVipVO queryPersonVipVO = assoPersonVipTypeService.getPersonVIpMessage();
+        personVipMessVO.setVip(queryPersonVipVO);
+        personVipMessVO.setIfInVip(queryPersonVipVO.getIfInVip());
         loginVO.setPersonVipMessVO(personVipMessVO);
         loginRecordVO.setLoginResult("成功");
         loginRecordService.addLoginRecord(loginRecordVO);
         return loginVO;
     }
 
-    public void addLoginRecord(Personnel personnel,LoginRecordVO loginRecordVO) {
+    public void addLoginRecord(Personnel personnel, LoginRecordVO loginRecordVO) {
         loginRecordVO.setPersonnelId(personnel.getId());
         loginRecordVO.setTenantId(personnel.getTenantId());
         //登录日志记录ip地址
@@ -461,7 +465,7 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
             throw new XiaoShiException(ExceptionEnum.THE_PERSONNEL_IS_NOT_EXIST);
         }
         LoginRecordVO loginRecordVO = new LoginRecordVO();
-          loginRecordVO.setLoginSystem(3);
+        loginRecordVO.setLoginSystem(3);
         this.addLoginRecord(personnel, loginRecordVO);
         if (personnel.getPersonnelStatus().equals(0)) {
             loginRecordVO.setLoginResult("该用户不可用");
@@ -481,7 +485,7 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
         commonDTO.setSign(vo.getSign());
         commonDTO.setCurrentTimeMillis(vo.getCurrentTimeMillis());
         commonDTO.setMachineCode(vo.getMachineCode());
-        EncryptionLoginVO loginVO = this.loginCommonMethod(commonDTO, personnel,loginRecordVO);
+        EncryptionLoginVO loginVO = this.loginCommonMethod(commonDTO, personnel, loginRecordVO);
         return Response.success(loginVO);
     }
 
@@ -568,8 +572,12 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
         List<String> permissions = new ArrayList<>();
         //1.获取该人员的权限id
         List<Integer> functionIds = new ArrayList<>();
-        Integer vipId = assoPersonVipTypeService.getPersonVipId(personnel.getId());
-        if (vipId != null) {
+
+        QueryPersonVipVO queryPersonVipVO= assoPersonVipTypeService.getPersonActiveVip();
+
+
+        if (queryPersonVipVO != null) {
+            Integer vipId = queryPersonVipVO.getVipTypeId();
             List<AssoTenantVipTypeAndFunctionVO> vos = assoTenantVipTypeFunctionMapper.selectByTenantVipTypeId(vipId);
             if (vos != null && vos.size() > 0) {
                 functionIds = vos.stream().map(AssoTenantVipTypeAndFunctionVO::getFunctionId).collect(Collectors.toList());
@@ -588,10 +596,10 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
 
         List<String> permissions1 = new ArrayList<>();
         //获取所有权限
-        LambdaQueryWrapper<Application> queryWrapper =new LambdaQueryWrapper<>();
-        queryWrapper.eq(Application::getApplicationCode,appKey);
-        Application application =applicationService.getOne(queryWrapper,false);
-        List<Function> functionList1 = functionService.list(new LambdaQueryWrapper<Function>().eq(Function::getApplicationId,application.getId()));
+        LambdaQueryWrapper<Application> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Application::getApplicationCode, appKey);
+        Application application = applicationService.getOne(queryWrapper, false);
+        List<Function> functionList1 = functionService.list(new LambdaQueryWrapper<Function>().eq(Function::getApplicationId, application.getId()));
 
         functionList1.forEach(i -> {
             permissions1.add(i.getFunctionPath());
@@ -599,6 +607,7 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
         permissions1.removeAll(permissions);
         List<EncryptionFunctionVO> list1 = this.loadFunctionVOS(permissions1, 1, symmetryKey, version);
         functionVOS.addAll(list1);
+        this.loadFunctionVOUseCount(functionVOS);
         finalVO.setFunctionVOS(functionVOS);
         String key = RSAUtils.encryptByPublicKey(symmetryKey, publicKey);
         finalVO.setKey(key);
@@ -624,6 +633,8 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
                 String encryptInfo = AESUtils.encrypt(moduleCode, symmetryKey);
                 EncryptionFunctionVO functionVO = new EncryptionFunctionVO();
                 functionVO.setPermission(functionPath);
+                functionVO.setType(type);
+                functionVO.setFunctionId(functionId);
                 functionVO.setEncryptionModuleCode(encryptInfo);
                 functionVOS.add(functionVO);
             }
@@ -767,4 +778,34 @@ public class LoginService extends ServiceImpl<PersonnelMapper, Personnel> {
         }
         return res;
     }
+
+    private List<EncryptionFunctionVO> loadFunctionVOUseCount(List<EncryptionFunctionVO> encryptionFunctionVOS) throws Exception {
+        if (encryptionFunctionVOS == null || encryptionFunctionVOS.size() == 0) {
+            return encryptionFunctionVOS;
+        }
+        List<AssoPersonFunction> assoPersonFunctionList = assoPersonFunctionService.getPersonFunction();
+        List<FunctionRecordGroupVO> functionRecordGroupVOS = functionUseRecordService.getPersonFunctionRecord(null);
+        for (EncryptionFunctionVO encryptionFunctionVO : encryptionFunctionVOS) {
+            Integer type = encryptionFunctionVO.getType();
+            Integer canUseCount = encryptionFunctionVO.getCanUseCount();
+            if (type == 2 && canUseCount != null) {
+                Integer functionId = encryptionFunctionVO.getFunctionId();
+                AssoPersonFunction assoPersonFunction = assoPersonFunctionList.stream().filter(item -> item.getFunctionId().equals(functionId)).findFirst().orElse(null);
+                FunctionRecordGroupVO functionRecordGroupVO = functionRecordGroupVOS.stream().filter(item -> item.getFunctionId().equals(functionId)).findFirst().orElse(null);
+                if (assoPersonFunction != null) {
+                    if (assoPersonFunction.getCanUseCount() != null) {
+                        canUseCount = canUseCount + assoPersonFunction.getCanUseCount();
+                    }
+                }
+                if (functionRecordGroupVO != null) {
+                    if (functionRecordGroupVO.getUseCount() != null) {
+                        canUseCount = canUseCount - functionRecordGroupVO.getUseCount();
+                    }
+                }
+                encryptionFunctionVO.setCanUseCount(canUseCount);
+            }
+        }
+        return encryptionFunctionVOS;
+    }
+
 }

+ 4 - 0
PCS/src/main/java/cn/cslg/permission/service/PersonnelService.java

@@ -900,6 +900,7 @@ public class PersonnelService extends ServiceImpl<PersonnelMapper, Personnel> {
         if (personnelIds != null && !personnelIds.isEmpty()) {
             LambdaQueryWrapper<AssoPersonVipType> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.in(AssoPersonVipType::getPersonId, personnelIds);
+            queryWrapper.orderByDesc(AssoPersonVipType::getCreateTime);
             List<AssoPersonVipType> assoPersonVipTypes = assoPersonVipTypeService.list(queryWrapper);
             if (assoPersonVipTypes != null && !assoPersonVipTypes.isEmpty()) {
                 // 过滤出vipTypeIds
@@ -912,6 +913,7 @@ public class PersonnelService extends ServiceImpl<PersonnelMapper, Personnel> {
                     List<TenantVipType> tenantVipTypes = tenantVipTypeService.list(queryWrapper1);
                     if (tenantVipTypes != null && !tenantVipTypes.isEmpty()) {
                         for (PersonnelVO personnelVO : personnelVOS) {
+                            if(personnelVO.getExpitrTime()==null){
                             AssoPersonVipType assoPersonVipType = assoPersonVipTypes
                                     .stream()
                                     .filter(item -> item.getPersonId().equals(Integer.valueOf(personnelVO.getId())))
@@ -927,9 +929,11 @@ public class PersonnelService extends ServiceImpl<PersonnelMapper, Personnel> {
                                             .findFirst()
                                             .orElse(null);
                                     personnelVO.setVipTypeName(tenantVipType.getTenantVipName());
+                                    personnelVO.setVipTypeId(tenantVipType.getId());
                                 }
                             }
                         }
+                        }
                     }
                 }
             }

+ 33 - 0
PCS/src/main/java/cn/cslg/permission/service/SysDictItemService.java

@@ -0,0 +1,33 @@
+package cn.cslg.permission.service;
+
+import cn.cslg.permission.domain.sys.SysDict;
+import cn.cslg.permission.domain.sys.SysDictItem;
+import cn.cslg.permission.mapper.SysDictItemMapper;
+import cn.cslg.permission.mapper.SysDictMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 沈永艺
+ * @date 2022-8-16
+ * @description 字典类 Service 层
+ */
+
+@Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+public class SysDictItemService extends ServiceImpl<SysDictItemMapper, SysDictItem> {
+
+    public List<SysDictItem> querySysDictItemsByGroup(List<String> groupNames) {
+        List<SysDictItem> sysDictItems = new ArrayList<>();
+        LambdaQueryWrapper<SysDictItem> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(SysDictItem::getDictParentKey, groupNames);
+        sysDictItems = this.list(queryWrapper);
+        return sysDictItems;
+    }
+}

+ 2 - 1
PCS/src/main/java/cn/cslg/permission/service/SysDictService.java

@@ -4,6 +4,7 @@ import cn.cslg.permission.domain.sys.SysDict;
 import cn.cslg.permission.mapper.SysDictMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
@@ -16,5 +17,5 @@ import org.springframework.stereotype.Service;
 @Service
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class SysDictService extends ServiceImpl<SysDictMapper, SysDict> {
- 
+
 }

+ 15 - 6
PCS/src/main/java/cn/cslg/permission/service/common/LoadService.java

@@ -5,6 +5,7 @@ import cn.cslg.permission.domain.Personnel;
 import cn.cslg.permission.domain.Tenant;
 import cn.cslg.permission.service.PersonnelService;
 import cn.cslg.permission.service.TenantService;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -19,9 +20,9 @@ public class LoadService {
     @Autowired
     private TenantService tenantService;
 
-    public void loadCommonVO(List<CommonVO> commonVOs) {
-        List<Integer> createIds = commonVOs.stream().map(CommonVO::getCreateId).collect(Collectors.toList());
-        List<Integer> tenantIds = commonVOs.stream().map(CommonVO::getTenantId).collect(Collectors.toList());
+    public void loadCommonVO(List<? extends CommonVO> commonVOs) {
+        List<Integer> createIds = commonVOs.stream().filter(item->item.getCreateId()!=null).map(CommonVO::getCreateId).collect(Collectors.toList());
+        List<Integer> tenantIds = commonVOs.stream().filter(item->item.getTenantId()!=null).map(CommonVO::getTenantId).collect(Collectors.toList());
         List<Personnel> personnelList = new ArrayList<>();
         List<Tenant> tenants = new ArrayList<>();
         if (createIds != null && createIds.size() > 0) {
@@ -64,7 +65,11 @@ public class LoadService {
             Integer invitedId = commonVO.getInvitePersonId();
             Personnel personnel = personnelList.stream().filter(item -> item.getId().equals(createId)).findFirst().orElse(null);
             if (personnel != null) {
-                commonVO.setCreateName(personnel.getPersonnelName());
+                String personName = personnel.getPersonnelPhone();
+                if (personnel.getPersonnelName() != null) {
+                    personName = personnel.getPersonnelName() + "\n" + personName;
+                }
+                commonVO.setCreateName(personName);
             }
             Tenant tenant = tenants.stream().filter(item -> item.getId().equals(tenantId)).findFirst().orElse(null);
             if (tenant != null) {
@@ -73,10 +78,14 @@ public class LoadService {
             if (invitedId != null) {
                 Personnel personnel2 = personnelList.stream().filter(item -> item.getId().equals(invitedId)).findFirst().orElse(null);
                 if (personnel2 != null) {
-                    commonVO.setInvitePersonName(personnel2.getPersonnelName());
+                    String personName = personnel2.getPersonnelPhone();
+                    if (personnel2.getPersonnelName() != null) {
+                        personName = personnel2.getPersonnelName() + "\n" + personName;
+                    }
+                    commonVO.setInvitePersonName(personName);
                 }
-            }
 
+            }
         }
     }
 }

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

@@ -51,15 +51,15 @@ public class TenantVipTypeService extends ServiceImpl<TenantVipTypeMapper, Tenan
      */
     @Override
     public Integer addNew(TenantVipTypeFunctionAddNewDTO tenantVipTypeFunctionAddNewDTO) {
-        log.info("开始处理【新增租户会员类型】的业务,参数为:{}", tenantVipTypeFunctionAddNewDTO);
-
-        //检查会员名称是否已存在
-        String tenantVipName = tenantVipTypeFunctionAddNewDTO.getTenantVipName();
-        log.info("检查会员名称是否已存在");
-        int count = tenantVipTypeMapper.countByTenantVipName(tenantVipName);
-        if (count > 0) {
-            ThrowException.throwXiaoShiException("新增租户会员类型失败,会员名称【" + tenantVipName + "】已存在,请尝试更换名称");
-        }
+//        log.info("开始处理【新增租户会员类型】的业务,参数为:{}", tenantVipTypeFunctionAddNewDTO);
+//
+//        //检查会员名称是否已存在
+//        String tenantVipName = tenantVipTypeFunctionAddNewDTO.getTenantVipName();
+//        log.info("检查会员名称是否已存在");
+//        int count = tenantVipTypeMapper.countByTenantVipName(tenantVipName);
+//        if (count > 0) {
+//            ThrowException.throwXiaoShiException("新增租户会员类型失败,会员名称【" + tenantVipName + "】已存在,请尝试更换名称");
+//        }
 
         //将DTO数据对象复制给实体类
         TenantVipType tenantVipType = new TenantVipType();

+ 41 - 9
PCS/src/main/java/cn/cslg/permission/service/qiaobi/AppVipTypeService.java

@@ -8,6 +8,8 @@ import cn.cslg.permission.common.model.dto.TenantVipTypeFunctionUpdateDTO;
 import cn.cslg.permission.common.model.qiaobi.PersonVipMessVO;
 import cn.cslg.permission.common.model.qiaobi.QiaoBiVIPTypeVO;
 import cn.cslg.permission.common.model.qiaobi.QiaoBiVipTypeDTO;
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipVO;
+import cn.cslg.permission.common.model.qiaobi.vipType.VipFunctionAddVO;
 import cn.cslg.permission.common.model.vo.AppVipTypeVO;
 import cn.cslg.permission.common.model.vo.FunctionCodeTreeVO;
 import cn.cslg.permission.common.model.vo.LoginRecordVO;
@@ -19,6 +21,7 @@ import cn.cslg.permission.domain.Function;
 import cn.cslg.permission.domain.Personnel;
 import cn.cslg.permission.domain.TenantVipType;
 import cn.cslg.permission.domain.qiaobi.AppVipType;
+import cn.cslg.permission.domain.qiaobi.Goods;
 import cn.cslg.permission.exception.ExceptionEnum;
 import cn.cslg.permission.exception.XiaoShiException;
 import cn.cslg.permission.mapper.qiaobi.AppVipTypeMapper;
@@ -30,6 +33,7 @@ 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;
 
@@ -56,7 +60,9 @@ public class AppVipTypeService extends ServiceImpl<AppVipTypeMapper, AppVipType>
     private final LoginService loginService;
     private final LoginRecordService loginRecordService;
     private final FunctionService functionService;
-
+    @Lazy
+    private final GoodsService goodsService;
+    public final static Integer freeVipTypeId=1;
     public List<QiaoBiVIPTypeVO> qiaoBiVIPTypeVOList(QiaoBiVipTypeDTO qiaoBiVipTypeDTO) {
         qiaoBiVipTypeDTO.setAppCode("4e95e3d926a2a4befa5d913acc0aa9f5");
         List<QiaoBiVIPTypeVO> qiaoBiVIPTypeVOList = this.getBaseMapper().queryQiaobiVipTypeVOs(qiaoBiVipTypeDTO);
@@ -79,17 +85,22 @@ public class AppVipTypeService extends ServiceImpl<AppVipTypeMapper, AppVipType>
      */
     @Transactional(rollbackFor = Exception.class)
     public Integer add(AppVipTypeDTO appVipTypeDTO) {
-        List<Integer> functionIds = appVipTypeDTO.getFunctionIds();
+        List<VipFunctionAddVO> vos = appVipTypeDTO.getFunctionAddVOs();
         TenantVipTypeFunctionAddNewDTO addNewDTO = this.getTenantTypeAddDTO(appVipTypeDTO);
         Integer tenantVipTypeId = tenantVipTypeService.addNew(addNewDTO);
+        Integer appLevel = appVipTypeDTO.getVipLevel();
+        if (appLevel == null) {
+            appLevel = 1;
+        }
         if (tenantVipTypeId != null) {
             AppVipType appVipType = new AppVipType();
             appVipType.setTenantVipTypeId(tenantVipTypeId);
             appVipType.setLastTime(appVipTypeDTO.getLastTime());
             appVipType.setApplicationCode(appVipTypeDTO.getApplicationCode());
+            appVipType.setVipLevel(appLevel);
             appVipType.insert();
         }
-        assoTenantVipTypeFunctionService.saveAssoBatch(functionIds, tenantVipTypeId);
+        assoTenantVipTypeFunctionService.saveAssoBatch(vos, tenantVipTypeId);
         return tenantVipTypeId;
     }
 
@@ -98,15 +109,20 @@ public class AppVipTypeService extends ServiceImpl<AppVipTypeMapper, AppVipType>
      */
     @Transactional(rollbackFor = Exception.class)
     public Integer update(AppVipTypeDTO appVipTypeDTO) {
+        Integer appLevel = appVipTypeDTO.getVipLevel();
+        if (appLevel == null) {
+            appLevel = 1;
+        }
         Integer tenantVipId = appVipTypeDTO.getId();
         Integer lastTime = appVipTypeDTO.getLastTime();
-        List<Integer> functionIds = appVipTypeDTO.getFunctionIds();
+        List<VipFunctionAddVO> vos = appVipTypeDTO.getFunctionAddVOs();
         AppVipType appVipType = this.getByTenantVipId(tenantVipId);
         appVipType.setLastTime(lastTime);
+        appVipType.setVipLevel(appLevel);
         appVipType.updateById();
         TenantVipTypeFunctionAddNewDTO addNewDTO = this.getTenantTypeAddDTO(appVipTypeDTO);
         tenantVipTypeService.updateTenantVipType(addNewDTO);
-        assoTenantVipTypeFunctionService.saveFunctionModuleBatch(functionIds, tenantVipId);
+        assoTenantVipTypeFunctionService.saveFunctionModuleBatch(vos, tenantVipId);
 
         return tenantVipId;
     }
@@ -200,6 +216,8 @@ public class AppVipTypeService extends ServiceImpl<AppVipTypeMapper, AppVipType>
 
         for (AppVipTypeVO appVipTypeVO : appVipTypeVOS) {
             Integer temId = appVipTypeVO.getId();
+            List<AssoTenantVipTypeAndFunction> temVos = assoTenantVipTypeAndFunctions.stream().filter(item -> item.getTenantVipTypeId().equals(temId)).collect(Collectors.toList());
+
             Personnel personnel = personnelList.stream().filter(tem -> tem.getId().equals(appVipTypeVO.getCreateId())).findFirst().orElse(null);
             if (personnel != null) {
                 appVipTypeVO.setCreateName(personnel.getPersonnelName());
@@ -209,7 +227,7 @@ public class AppVipTypeService extends ServiceImpl<AppVipTypeMapper, AppVipType>
             List<Integer> temFunctionIds = assoTenantVipTypeAndFunctions.stream().filter(item -> item.getTenantVipTypeId().equals(temId)).map(AssoTenantVipTypeAndFunction::getFunctionId).collect(Collectors.toList());
             if (temFunctionIds != null && temFunctionIds.size() > 0) {
                 List<Function> temFunctionLists = functionList.stream().filter(item -> temFunctionIds.contains(item.getId())).collect(Collectors.toList());
-                List<FunctionCodeTreeVO> functionCodeTreeVOS = functionService.loadVIPTypeFunction(temFunctionLists);
+                List<FunctionCodeTreeVO> functionCodeTreeVOS = functionService.loadVIPTypeFunction(temFunctionLists, temVos);
                 appVipTypeVO.setFunctions(functionCodeTreeVOS);
             }
         }
@@ -241,16 +259,30 @@ public class AppVipTypeService extends ServiceImpl<AppVipTypeMapper, AppVipType>
         Integer personId = Integer.parseInt(personnelVO.getId());
         Personnel personnel = new Personnel();
         personnel.setId(personId);
-        personnel.setTenantId(personnel.getTenantId());
+        personnel.setTenantId(personnelVO.getTenantId());
         loginService.addLoginRecord(personnel, loginRecordVO);
         loginRecordVO.setLoginResult("获取会员信息");
         loginRecordService.addLoginRecord(loginRecordVO);
-        PersonVipMessVO personVipMessVO = assoPersonVipTypeService.getPersonVipMessage(personId);
-        List<AppVipTypeVO> appVipTypeVOS= assoPersonVipTypeService.getPersonVIpMessage();
+        PersonVipMessVO personVipMessVO = new PersonVipMessVO();
+        QueryPersonVipVO queryPersonVipVO = assoPersonVipTypeService.getPersonVIpMessage();
+        personVipMessVO.setVip(queryPersonVipVO);
+        personVipMessVO.setIfInVip(queryPersonVipVO.getIfInVip());
         return personVipMessVO;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteGoods(List<Integer> ids) {
+        this.checkGoodDelete(ids);
+        this.removeByIds(ids);
+    }
 
+    public void checkGoodDelete(List<Integer> ids) {
+        //查询商品
+        List<Goods> goods = goodsService.queryGoodsByGoodIds(ids, 1);
+        if (goods != null && goods.size() > 0) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "该会员正在作为商品,禁止删除");
+        }
+    }
 }
 
 

+ 13 - 4
PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoFunctionModuleService.java

@@ -8,10 +8,7 @@ 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.*;
 import cn.cslg.permission.domain.associate.AssoFunctionModule;
 import cn.cslg.permission.domain.qiaobi.AppVipType;
 import cn.cslg.permission.domain.qiaobi.AssoVersionFunction;
@@ -273,7 +270,19 @@ public class AssoFunctionModuleService extends ServiceImpl<AssoFunctionModuleMap
     }
 
 
+    public static FunctionCodeTreeVO loadFunctionCodeTreeVO2(Function function, List<AssoFunctionModule> assoFunctionModules,List<AssoTenantVipTypeAndFunction> assoTenantVipTypeAndFunctions) {
+        Integer id =function.getId();
+        AssoTenantVipTypeAndFunction assoTenantVipTypeAndFunction= assoTenantVipTypeAndFunctions.stream().filter(item->item.getFunctionId().equals(id)).findFirst().orElse(null);
+        FunctionCodeTreeVO functionCodeTreeVO = new FunctionCodeTreeVO();
+        FunctionVO functionVO = FunctionService.transformToVo(function);
+        BeanUtils.copyProperties(functionVO, functionCodeTreeVO);
+        functionCodeTreeVO.setFunctionCodes(assoFunctionModules);
+        if(assoTenantVipTypeAndFunction!=null){
+            functionCodeTreeVO.setCanUseCount(assoTenantVipTypeAndFunction.getCanUseCount());
+        }
 
+        return functionCodeTreeVO;
+    }
 
 
 }

+ 21 - 2
PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoPersonFunctionService.java

@@ -1,10 +1,15 @@
 package cn.cslg.permission.service.qiaobi;
 
+import cn.cslg.permission.common.utils.LoginUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import cn.cslg.permission.domain.qiaobi.AssoPersonFunction;
 import cn.cslg.permission.mapper.qiaobi.AssoPersonFunctionMapper;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
 * @author admin
 * @description 针对表【ASSO_PERSON_FUNCTION(人员和功能关联表)】的数据库操作Service实现
@@ -12,8 +17,22 @@ import org.springframework.stereotype.Service;
 */
 @Service
 public class AssoPersonFunctionService extends ServiceImpl<AssoPersonFunctionMapper, AssoPersonFunction> {
-
-
+    @Autowired
+    private LoginUtils loginUtils;
+    public List<AssoPersonFunction>  getPersonFunction(){
+      Integer personId =loginUtils.getId();
+        LambdaQueryWrapper<AssoPersonFunction> queryWrapper =new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoPersonFunction::getPersonId,personId);
+        List<AssoPersonFunction> assoPersonFunctionList =this.list(queryWrapper);
+        return assoPersonFunctionList;
+    }
+    public AssoPersonFunction  getPersonFunction(Integer personId,Integer functionId){
+    LambdaQueryWrapper<AssoPersonFunction> queryWrapper =new LambdaQueryWrapper<>();
+    queryWrapper.eq(AssoPersonFunction::getFunctionId,functionId)
+                .eq(AssoPersonFunction::getPersonId,personId);
+    AssoPersonFunction assoPersonFunction =this.getOne(queryWrapper,false);
+        return assoPersonFunction;
+    }
 }
 
 

+ 112 - 102
PCS/src/main/java/cn/cslg/permission/service/qiaobi/AssoPersonVipTypeService.java

@@ -5,18 +5,24 @@ import cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipDTO;
 import cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipVO;
 import cn.cslg.permission.common.model.vo.AppVipTypeVO;
 import cn.cslg.permission.common.model.vo.PersonnelUpdateVO;
+import cn.cslg.permission.common.model.vo.PersonnelVO;
+import cn.cslg.permission.common.utils.CacheUtils;
 import cn.cslg.permission.common.utils.DateUtils;
 import cn.cslg.permission.common.utils.LoginUtils;
 import cn.cslg.permission.domain.TenantVipType;
 import cn.cslg.permission.domain.qiaobi.AppVipType;
+import cn.cslg.permission.domain.qiaobi.Goods;
 import cn.cslg.permission.mapper.qiaobi.AppVipTypeMapper;
 import cn.cslg.permission.service.impl.TenantVipTypeService;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import cn.cslg.permission.domain.qiaobi.AssoPersonVipType;
 import cn.cslg.permission.mapper.qiaobi.AssoPersonVipTypeMapper;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -39,6 +45,10 @@ public class AssoPersonVipTypeService extends ServiceImpl<AssoPersonVipTypeMappe
     private LoginUtils loginUtils;
     @Autowired
     private AppVipTypeMapper appVipTypeMapper;
+    @Value("${retailTenantId}")
+    private Integer retailTenantId;
+    @Autowired
+    private CacheUtils cacheUtils;
 
     public AssoPersonVipType addVip(Integer personId, Integer vipTypeId, Integer lastTime) {
         AssoPersonVipType assoPersonVip = new AssoPersonVipType();
@@ -99,6 +109,9 @@ public class AssoPersonVipTypeService extends ServiceImpl<AssoPersonVipTypeMappe
             AppVipType appVipType = appVipTypeService.getOne(new LambdaQueryWrapper<>(), false);
             vipTypeId = appVipType.getTenantVipTypeId();
         } else {
+            if (assoPersonVipType.getVipTypeId() != 39) {
+                return;
+            }
             Date expireTime = assoPersonVipType.getExpitrTime();
             Date date = new Date();
             Date endDate = DateUtils.getPlusMonthDate(date, 1);
@@ -129,31 +142,9 @@ public class AssoPersonVipTypeService extends ServiceImpl<AssoPersonVipTypeMappe
         Integer vipId = this.getPersonVipId(personId);
         if (vipId == null) {
             personVipMessVO.setIfInVip(false);
+            vipId = AppVipTypeService.freeVipTypeId;
         }
-        Date expitrTime = null;
-        if (vipId == null) {
-            LambdaQueryWrapper<AssoPersonVipType> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AssoPersonVipType::getPersonId, personId)
-                    .orderByDesc(AssoPersonVipType::getExpitrTime);
-            AssoPersonVipType assoPersonVipType = this.getOne(queryWrapper, false);
-            if (assoPersonVipType != null) {
-                vipId = assoPersonVipType.getVipTypeId();
-                expitrTime = assoPersonVipType.getExpitrTime();
-            }
 
-        }
-        if (vipId != null) {
-            LambdaQueryWrapper<AssoPersonVipType> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AssoPersonVipType::getVipTypeId, vipId);
-            queryWrapper.eq(AssoPersonVipType::getPersonId, personId);
-            AssoPersonVipType assoPersonVipType = this.getOne(queryWrapper, false);
-            expitrTime = assoPersonVipType.getExpitrTime();
-            TenantVipType tenantVipType = tenantVipTypeService.getById(vipId);
-
-            personVipMessVO.setVipTypeName(tenantVipType.getTenantVipName());
-            personVipMessVO.setId(vipId);
-            personVipMessVO.setExpitrTime(expitrTime);
-        }
         return personVipMessVO;
     }
 
@@ -171,13 +162,15 @@ public class AssoPersonVipTypeService extends ServiceImpl<AssoPersonVipTypeMappe
         }
     }
 
-    public void addPersonVIP2(Integer vipId, Integer num, Integer goodunit) {
-        Integer personId = loginUtils.getId();
+    public void addPersonVIP2(Goods goods, Integer personId, Integer vipId, Integer num, Integer goodunit) {
+        Integer vipTypeId = goods.getGoodId();
+        Date now = new Date();
+        String goodMessage = JSON.toJSONString(goods);
         Integer lastMonth = null;
         Integer unitMonth = 1;
-        if (goodunit == 2) {
+        if (goodunit == 3) {
             unitMonth = 3;
-        } else if (goodunit == 3) {
+        } else if (goodunit == 4) {
             unitMonth = 12;
         }
         lastMonth = unitMonth * num;
@@ -185,97 +178,114 @@ public class AssoPersonVipTypeService extends ServiceImpl<AssoPersonVipTypeMappe
         Integer vipLevel = appVipType.getVipLevel();
         Integer flag = 0;
         QueryPersonVipDTO queryPersonVipDTO = new QueryPersonVipDTO();
-        queryPersonVipDTO.setVipType(0);
         queryPersonVipDTO.setPersonId(personId);
-        List<QueryPersonVipVO> queryPersonVipVOList = this.getBaseMapper().getPersonActiveVip(queryPersonVipDTO);
-        if (queryPersonVipVOList.size() == 0) {
-            AssoPersonVipType assoPersonVipType = new AssoPersonVipType();
-            assoPersonVipType.setCreateTime(new Date());
+        LambdaQueryWrapper<AssoPersonVipType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoPersonVipType::getPersonId, personId);
+        AssoPersonVipType assoPersonVipType = this.getOne(queryWrapper, false);
+
+        if (assoPersonVipType == null) {
+            assoPersonVipType.setCreateTime(now);
             assoPersonVipType.setExpitrTime(DateUtils.getPlusMonthDate(assoPersonVipType.getCreateTime(), lastMonth));
             assoPersonVipType.setPersonId(personId);
             assoPersonVipType.setVipTypeId(vipId);
+            assoPersonVipType.setFromType(1);
+            assoPersonVipType.setFromMessage(goodMessage);
             assoPersonVipType.insert();
             return;
-        }
-        queryPersonVipVOList.get(0).setCreateTime(new Date());
-        for (int i = 0; i < queryPersonVipVOList.size(); i++) {
-
-            QueryPersonVipVO queryPersonVipVO = queryPersonVipVOList.get(i);
-            Integer temId = queryPersonVipVO.getId();
-            Date temExpitrTime = queryPersonVipVO.getExpitrTime();
-            Date temCreateTime = queryPersonVipVO.getCreateTime();
-            Integer temLevel = queryPersonVipVO.getVipLevel();
-            Integer temVipId = queryPersonVipVO.getVipTypeId();
-            if (temLevel <= vipLevel) {
-                flag = i;
-                break;
-            }
-        }
-        QueryPersonVipVO queryPersonVipVO = queryPersonVipVOList.get(flag);
-        Integer flagLevel = queryPersonVipVO.getVipLevel();
-        Integer flagId = queryPersonVipVO.getId();
-        Integer flagVipTypeId = queryPersonVipVO.getVipTypeId();
-        Date flagExpitrTime = queryPersonVipVO.getExpitrTime();
-        Date flagCreateTime = queryPersonVipVO.getCreateTime();
-
-        //添加会员
-        if (flag == queryPersonVipVOList.size() - 1 && vipLevel < flagLevel) {
-            AssoPersonVipType assoPersonVipType = new AssoPersonVipType();
-            assoPersonVipType.setCreateTime(flagExpitrTime);
-            assoPersonVipType.setExpitrTime(DateUtils.getPlusMonthDate(flagExpitrTime, lastMonth));
-            assoPersonVipType.setPersonId(personId);
-            assoPersonVipType.setVipTypeId(vipId);
-            assoPersonVipType.insert();
         } else {
-
-            if (flagVipTypeId == vipId) {
-                flagExpitrTime = DateUtils.getPlusMonthDate(flagExpitrTime, lastMonth);
-                LambdaUpdateWrapper<AssoPersonVipType> queryWrapper = new LambdaUpdateWrapper<>();
-                queryWrapper.set(AssoPersonVipType::getExpitrTime, flagExpitrTime).eq(AssoPersonVipType::getId, flagId);
-                this.update(queryWrapper);
-                flag = flag + 1;
+            Integer vipTypeIdOrg = assoPersonVipType.getVipTypeId();
+            assoPersonVipType.setFromType(1);
+            assoPersonVipType.setVipTypeId(vipTypeId);
+            assoPersonVipType.setFromMessage(goodMessage);
+            assoPersonVipType.setCreateTime(now);
+            Date expitrTime = assoPersonVipType.getExpitrTime();
+            if (expitrTime.compareTo(now) > 0 && vipTypeIdOrg == vipTypeId) {
+                expitrTime = DateUtils.getPlusMonthDate(expitrTime, lastMonth);
             } else {
-                AssoPersonVipType assoPersonVipType = new AssoPersonVipType();
-                assoPersonVipType.setCreateTime(flagCreateTime);
-                assoPersonVipType.setExpitrTime(DateUtils.getPlusMonthDate(flagCreateTime, lastMonth));
-                assoPersonVipType.setPersonId(personId);
-                assoPersonVipType.setVipTypeId(vipId);
-                assoPersonVipType.insert();
-            }
-            if (flag <= queryPersonVipVOList.size() - 1) {
-
-                for (int i = flag; i < queryPersonVipVOList.size(); i++) {
-                    QueryPersonVipVO temQueryPersonVipVO = queryPersonVipVOList.get(i);
-                    Integer temId = temQueryPersonVipVO.getId();
-                    Date temExpitrTime = temQueryPersonVipVO.getExpitrTime();
-                    Date temCreateTime = temQueryPersonVipVO.getCreateTime();
-                    Date temExpitrTime1 = DateUtils.getPlusMonthDate(temExpitrTime, lastMonth);
-                    Date temCreateTime1 = DateUtils.getPlusMonthDate(temCreateTime, lastMonth);
-                    LambdaUpdateWrapper<AssoPersonVipType> queryWrapper = new LambdaUpdateWrapper<>();
-                    queryWrapper.set(AssoPersonVipType::getCreateTime, temCreateTime1).set(AssoPersonVipType::getExpitrTime, temExpitrTime1).eq(AssoPersonVipType::getId, temId);
-                    this.update(queryWrapper);
-                }
+                expitrTime = DateUtils.getPlusMonthDate(now, lastMonth);
             }
+            assoPersonVipType.setExpitrTime(expitrTime);
+            assoPersonVipType.updateById();
+        }
+
+    }
+
+    public QueryPersonVipVO getPersonVIpMessage() {
+        QueryPersonVipVO queryPersonVipVO = this.getPersonActiveVip();
+        Integer vipId = null;
+        if (queryPersonVipVO == null) {
+            queryPersonVipVO = new QueryPersonVipVO();
+            queryPersonVipVO.setIfInVip(false);
+            vipId = AppVipTypeService.freeVipTypeId;
+
         }
+        queryPersonVipVO.setVipTypeId(vipId);
+        TenantVipType tenantVipType = tenantVipTypeService.getById(vipId);
+        if (tenantVipType != null) {
+            queryPersonVipVO.setVipName(tenantVipType.getTenantVipName());
+        }
+        return queryPersonVipVO;
     }
 
-    public List<AppVipTypeVO> getPersonVIpMessage() {
-        List<AppVipTypeVO> appVipTypeVOS = new ArrayList<>();
+    public AssoPersonVipType addAssoPersonVip2(Integer personUuid, Integer vipTypeId, Integer timeUnit, Integer lastTime) {
+        Date date = new Date();
+        AssoPersonVipType assoPersonVip = new AssoPersonVipType();
+        assoPersonVip.setCreateTime(date);
+        Date expiryDate = null;
+        switch (timeUnit) {
+            case 1:
+                expiryDate = DateUtils.getPlusDayDate(date, lastTime * 7);
+                break;
+            case 2:
+                expiryDate = DateUtils.getPlusMonthDate(date, lastTime);
+                break;
+        }
+
+        assoPersonVip.setExpitrTime(expiryDate);
+        assoPersonVip.setPersonId(personUuid);
+        assoPersonVip.setVipTypeId(vipTypeId);
+        assoPersonVip.insert();
+        return assoPersonVip;
+    }
+
+    public AssoPersonVipType addSignUpVip(Integer personId, Integer timUnit) {
+
+        Integer vipTypeId = 39;
+        AssoPersonVipType assoPersonVip = new AssoPersonVipType();
+        LambdaQueryWrapper<AssoPersonVipType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoPersonVipType::getPersonId, personId)
+                .eq(AssoPersonVipType::getVipTypeId, vipTypeId)
+                .orderByDesc(AssoPersonVipType::getExpitrTime);
+        assoPersonVip = this.getOne(queryWrapper, false);
+        assoPersonVip = this.addAssoPersonVip2(personId, vipTypeId, timUnit, 1);
+
+        return assoPersonVip;
+    }
+
+    public AssoPersonVipType getByVipTypeId(Integer vipTypeId) {
+        LambdaQueryWrapper<AssoPersonVipType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoPersonVipType::getVipTypeId, vipTypeId);
+        this.getOne(queryWrapper);
+        AssoPersonVipType assoPersonVipType = this.getOne(queryWrapper);
+        return assoPersonVipType;
+    }
+
+    public QueryPersonVipVO getPersonActiveVip() {
+        QueryPersonVipVO queryPersonVipVO = null;
+        Integer personId = loginUtils.getId();
+        PersonnelVO personnelVO = cacheUtils.getLoginUser(personId);
+        Integer tenantId = personnelVO.getTenantId();
         QueryPersonVipDTO queryPersonVipDTO = new QueryPersonVipDTO();
-        queryPersonVipDTO.setVipType(1);
-        queryPersonVipDTO.setPersonId(1);
+        queryPersonVipDTO.setPersonId(personId);
+            queryPersonVipDTO.setPersonId(personId);
+
         List<QueryPersonVipVO> queryPersonVipVOList = this.getBaseMapper().getPersonActiveVip(queryPersonVipDTO);
         if (queryPersonVipVOList != null && queryPersonVipVOList.size() > 0) {
-            List<Integer> ids = queryPersonVipVOList.stream().map(QueryPersonVipVO::getVipTypeId).collect(Collectors.toList());
-            LambdaQueryWrapper<TenantVipType> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.in(TenantVipType::getId, ids);
-            List<TenantVipType> tenantVipTypes = tenantVipTypeService.list(queryWrapper);
-            for (QueryPersonVipVO queryPersonVipVO : queryPersonVipVOList) {
-                TenantVipType tenantVipType = tenantVipTypes.stream().filter(item -> item.getId().equals(queryPersonVipVO.getVipTypeId())).findFirst().orElse(null);
-
-            }
+            queryPersonVipVO = queryPersonVipVOList.get(0);
+            queryPersonVipVO.setIfInVip(true);
         }
-        return appVipTypeVOS;
+
+        return queryPersonVipVO;
     }
 }
 

+ 165 - 0
PCS/src/main/java/cn/cslg/permission/service/qiaobi/FunctionUseRecordService.java

@@ -0,0 +1,165 @@
+package cn.cslg.permission.service.qiaobi;
+
+import cn.cslg.permission.common.model.qiaobi.functionUseRecord.FunctionUserRecordVO;
+import cn.cslg.permission.common.model.qiaobi.payOrder.FunctionRecordAddDTO;
+import cn.cslg.permission.common.model.qiaobi.payOrder.FunctionRecordGroupDTO;
+import cn.cslg.permission.common.model.qiaobi.payOrder.FunctionRecordGroupVO;
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipDTO;
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipVO;
+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.utils.CacheUtils;
+import cn.cslg.permission.common.utils.DateUtils;
+import cn.cslg.permission.common.utils.LoginUtils;
+import cn.cslg.permission.domain.qiaobi.AssoPersonFunction;
+import cn.cslg.permission.domain.qiaobi.AssoPersonVipType;
+import cn.cslg.permission.exception.ExceptionEnum;
+import cn.cslg.permission.exception.XiaoShiException;
+import cn.cslg.permission.mapper.AssoTenantVipTypeFunctionMapper;
+import cn.cslg.permission.mapper.qiaobi.AssoPersonVipTypeMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.cslg.permission.domain.qiaobi.FunctionUseRecord;
+import cn.cslg.permission.mapper.qiaobi.FunctionUseRecordMapper;
+import io.swagger.v3.oas.models.security.SecurityScheme;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author admin
+ * @description 针对表【FUNCTION_USE_RECORD(功能使用记录)】的数据库操作Service实现
+ * @createDate 2025-07-11 10:50:53
+ */
+@Service
+public class FunctionUseRecordService extends ServiceImpl<FunctionUseRecordMapper, FunctionUseRecord> {
+    @Autowired
+    private LoginUtils loginUtils;
+    @Autowired
+    private CacheUtils cacheUtils;
+    @Autowired
+    private AssoPersonVipTypeMapper assoPersonVipTypeMapper;
+    @Autowired
+    private AssoPersonVipTypeService assoPersonVipTypeService;
+    @Autowired
+    private AssoTenantVipTypeFunctionMapper assoTenantVipTypeFunctionMapper;
+    @Autowired
+    private AssoPersonFunctionService assoPersonFunctionService;
+    @Value("${retailTenantId}")
+    private Integer retailTenantId;
+
+    @Transactional(rollbackFor = Exception.class)
+    public FunctionUseRecord addFunctionUseRecord(FunctionRecordAddDTO functionRecordAddDTO) {
+        Integer functionId = functionRecordAddDTO.getFunctionId();
+        Integer personId = loginUtils.getId();
+        PersonnelVO personnelVO = cacheUtils.getLoginUser(personId);
+        FunctionUseRecord functionUseRecord = new FunctionUseRecord();
+        functionUseRecord.setFunctionId(functionRecordAddDTO.getFunctionId());
+        functionUseRecord.setPersonId(personId);
+        functionUseRecord.setParameters(functionRecordAddDTO.getParameters());
+        functionUseRecord.setTenantId(personnelVO.getTenantId());
+        functionUseRecord.insert();
+
+        FunctionUserRecordVO functionUserRecordVO = this.getPersonFunctionUseMess(functionRecordAddDTO);
+        Integer haveUseCount = functionUserRecordVO.getHaveUseCount();
+        Integer vipCanUseCount = functionUserRecordVO.getVipCanUseCount();
+        AssoPersonFunction assoPersonFunction = assoPersonFunctionService.getPersonFunction(personId, functionId);
+        if (haveUseCount > vipCanUseCount) {
+            if (assoPersonFunction != null) {
+                Integer byUseCount = assoPersonFunction.getCanUseCount();
+                if (byUseCount == null || byUseCount < 0) {
+                    throw new XiaoShiException("超出可使用次数");
+                }
+                assoPersonFunction.setCanUseCount(byUseCount - 1);
+                assoPersonFunction.updateById();
+            }
+        }
+        return functionUseRecord;
+    }
+
+    public List<FunctionRecordGroupVO> getPersonFunctionRecord(Integer functionId) {
+        Integer personId = loginUtils.getId();
+        PersonnelVO personnelVO =cacheUtils.getLoginUser(personId);
+        Integer tenantId =personnelVO.getTenantId();
+        List<FunctionRecordGroupVO> functionRecordGroupVOS = new ArrayList<>();
+        QueryPersonVipVO queryPersonVipVO = assoPersonVipTypeService.getPersonActiveVip();
+        if (queryPersonVipVO == null) {
+            return functionRecordGroupVOS;
+        }
+
+        Date createTime = queryPersonVipVO.getCreateTime();
+        Date nowDate = new Date();
+        Integer diffMonth = DateUtils.getMonthDiff(nowDate, createTime);
+        Date startTime = DateUtils.getPlusMonthDate(createTime, diffMonth);
+        if (startTime.compareTo(nowDate) > 0) {
+            startTime = DateUtils.getPlusMonthDate(createTime, diffMonth - 1);
+        }
+        FunctionRecordGroupDTO functionRecordGroupDTO = new FunctionRecordGroupDTO();
+        functionRecordGroupDTO.setPersonId(personId);
+        functionRecordGroupDTO.setCreateTime(startTime);
+        functionRecordGroupDTO.setFunctionId(functionId);
+        if (tenantId != retailTenantId) {
+            functionRecordGroupDTO.setTenantId(tenantId);
+        } else {
+            functionRecordGroupDTO.setPersonId(personId);
+        }
+        functionRecordGroupVOS = this.getBaseMapper().getPersonUseRecord(functionRecordGroupDTO);
+
+        return functionRecordGroupVOS;
+    }
+
+
+    public FunctionUserRecordVO getPersonFunctionUseMess(FunctionRecordAddDTO functionRecordAddDTO) {
+        Integer functionId = functionRecordAddDTO.getFunctionId();
+        FunctionUserRecordVO functionUserRecordVO = new FunctionUserRecordVO();
+        Integer personId = loginUtils.getId();
+        PersonnelVO personnelVO = cacheUtils.getLoginUser(personId);
+        Integer tenantId = personnelVO.getTenantId();
+        List<FunctionRecordGroupVO> functionRecordGroupVOS = this.getPersonFunctionRecord(functionId);
+        QueryPersonVipDTO queryPersonVipDTO = new QueryPersonVipDTO();
+        queryPersonVipDTO.setPersonId(personId);
+
+        Integer vipId = AppVipTypeService.freeVipTypeId;
+        QueryPersonVipVO queryPersonVipVO = assoPersonVipTypeService.getPersonActiveVip();
+        if (queryPersonVipVO != null ) {
+            vipId = queryPersonVipVO.getVipTypeId();
+        }
+        List<AssoTenantVipTypeAndFunctionVO> vos = assoTenantVipTypeFunctionMapper.selectByTenantVipTypeId(vipId);
+        AssoTenantVipTypeAndFunctionVO assoTenantVipTypeAndFunctionVO = vos.stream().filter(item -> item.getFunctionId().equals(functionId)).findFirst().orElse(null);
+        if (assoTenantVipTypeAndFunctionVO == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "用户无该该功能的权限");
+        }
+        Integer vipCanUseCount = assoTenantVipTypeAndFunctionVO.getCanUseCount();
+        Integer haveUseCount = 0;
+        Integer buyUseCount = 0;
+        if (functionRecordGroupVOS != null && functionRecordGroupVOS.size() > 0) {
+            FunctionRecordGroupVO functionRecordGroupVO = functionRecordGroupVOS.get(0);
+            haveUseCount = functionRecordGroupVO.getUseCount();
+        }
+        AssoPersonFunction assoPersonFunction = assoPersonFunctionService.getPersonFunction(personId, functionId);
+        if (assoPersonFunction != null) {
+            buyUseCount = assoPersonFunction.getCanUseCount();
+            functionUserRecordVO.setAssPersonFunctionId(assoPersonFunction.getId());
+        }
+        Integer canUseCount = null;
+        if (vipCanUseCount != null) {
+            canUseCount = vipCanUseCount + buyUseCount - haveUseCount;
+        }
+        functionUserRecordVO.setCanUseCount(canUseCount);
+        functionUserRecordVO.setBuyUseCount(buyUseCount);
+        functionUserRecordVO.setHaveUseCount(haveUseCount);
+        functionUserRecordVO.setVipCanUseCount(vipCanUseCount);
+
+        return functionUserRecordVO;
+    }
+
+}
+
+
+
+

+ 52 - 0
PCS/src/main/java/cn/cslg/permission/service/qiaobi/GoodByLimitService.java

@@ -0,0 +1,52 @@
+package cn.cslg.permission.service.qiaobi;
+
+import cn.cslg.permission.common.model.qiaobi.goods.GoodByLimitVO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.cslg.permission.domain.qiaobi.GoodByLimit;
+import cn.cslg.permission.mapper.qiaobi.GoodByLimitMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author admin
+ * @description 针对表【GOOD_BY_LIMIT(商品购买限制)】的数据库操作Service实现
+ * @createDate 2025-07-14 14:48:45
+ */
+@Service
+public class GoodByLimitService extends ServiceImpl<GoodByLimitMapper, GoodByLimit> {
+
+    public List<GoodByLimitVO> queryAllGoodLimit(List<Integer> ids) {
+        List<GoodByLimitVO> goodByLimitVOS = new ArrayList<>();
+        LambdaQueryWrapper<GoodByLimit> queryWrapper = new LambdaQueryWrapper<>();
+        if (ids != null && ids.size() > 0) {
+            queryWrapper.in(GoodByLimit::getId, ids);
+        }
+        List<GoodByLimit> goodByLimits = this.list(queryWrapper);
+        for (GoodByLimit goodByLimit : goodByLimits) {
+            GoodByLimitVO goodByLimitVO = new GoodByLimitVO();
+            goodByLimitVO.setLimitName(goodByLimit.getName());
+            goodByLimitVO.setId(goodByLimit.getId());
+            goodByLimitVO.setRemark(goodByLimit.getRemark());
+            goodByLimitVOS.add(goodByLimitVO);
+        }
+        return goodByLimitVOS;
+    }
+
+    public List<GoodByLimit> queryGoodLimit(List<Integer> ids) {
+        List<GoodByLimitVO> goodByLimitVOS = new ArrayList<>();
+        LambdaQueryWrapper<GoodByLimit> queryWrapper = new LambdaQueryWrapper<>();
+        if (ids != null && ids.size() > 0) {
+            queryWrapper.in(GoodByLimit::getId, ids);
+        }
+        List<GoodByLimit> goodByLimits = this.list(queryWrapper);
+
+        return goodByLimits;
+    }
+}
+
+
+
+

+ 201 - 19
PCS/src/main/java/cn/cslg/permission/service/qiaobi/GoodsService.java

@@ -1,24 +1,27 @@
 package cn.cslg.permission.service.qiaobi;
 
 import cn.cslg.permission.common.model.Records;
+import cn.cslg.permission.common.model.common.CommonVO;
 import cn.cslg.permission.common.model.dto.QueryVipDTO;
-import cn.cslg.permission.common.model.qiaobi.goods.GoodUpdateStatusDTO;
-import cn.cslg.permission.common.model.qiaobi.goods.GoodsAddDTO;
-import cn.cslg.permission.common.model.qiaobi.goods.GoodsQueryDTO;
-import cn.cslg.permission.common.model.qiaobi.goods.GoodsQueryVO;
+import cn.cslg.permission.common.model.qiaobi.goods.*;
 import cn.cslg.permission.common.model.qiaobi.version.QiaoBiVersionVO;
 import cn.cslg.permission.common.model.vo.AppVipTypeVO;
 import cn.cslg.permission.common.model.vo.FunctionCodeTreeVO;
+import cn.cslg.permission.common.utils.LoginUtils;
 import cn.cslg.permission.common.utils.StringUtils;
 import cn.cslg.permission.domain.Function;
 import cn.cslg.permission.domain.Personnel;
 import cn.cslg.permission.domain.Version;
+import cn.cslg.permission.domain.qiaobi.AppVipType;
 import cn.cslg.permission.domain.qiaobi.Goods;
+import cn.cslg.permission.domain.sys.SysDictItem;
 import cn.cslg.permission.exception.ExceptionEnum;
 import cn.cslg.permission.exception.XiaoShiException;
 import cn.cslg.permission.mapper.qiaobi.AppVipTypeMapper;
 import cn.cslg.permission.service.FunctionService;
 import cn.cslg.permission.service.PersonnelService;
+import cn.cslg.permission.service.SysDictItemService;
+import cn.cslg.permission.service.common.LoadService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -28,12 +31,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import cn.cslg.permission.mapper.qiaobi.GoodsMapper;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -48,9 +50,23 @@ public class GoodsService extends ServiceImpl<GoodsMapper, Goods> {
     @Autowired
     private FunctionService functionService;
     @Autowired
+    @Lazy
     private AppVipTypeService appVipTypeService;
     @Autowired
     private AppVipTypeMapper appVipTypeMapper;
+    @Autowired
+    private GoodByLimitService goodByLimitService;
+    @Autowired
+    private MarketStrategyService marketStrategyService;
+    @Autowired
+    private LoadService loadService;
+    @Autowired
+    private SysDictItemService sysDictItemService;
+    private static String GOOD_TYPE_KEY = "GOOD_TYPE";
+    private static String GOOD_UNIT_KEY = "GOOD_UNIT";
+    private static String GOOD_STATUS_KEY = "GOOD_STATUS";
+    @Autowired
+    private LoginUtils loginUtils;
 
     @Transactional(rollbackFor = Exception.class)
     public Integer addGoods(GoodsAddDTO goodsAddDTO) {
@@ -59,38 +75,58 @@ public class GoodsService extends ServiceImpl<GoodsMapper, Goods> {
         Integer goodCount = goodsAddDTO.getGoodCount();
         Date startSaleTime = goodsAddDTO.getStartSaleTime();
         if (startSaleTime == null) {
-            startSaleTime = new Date();
+            goodsAddDTO.setStartSaleTime(new Date());
         }
         List<Integer> goodLimits = goodsAddDTO.getGoodLimits();
+        List<Integer> goodStrategies = goodsAddDTO.getGoodStrategies();
         Integer goodUnit = goodsAddDTO.getGoodUnit();
         String goodLimit = null;
         if (goodLimits != null && goodLimits.size() > 0) {
             goodLimit = StringUtils.join(goodLimits, ",");
         }
+        String goodStrategy = null;
+        if (goodStrategies != null && goodStrategies.size() > 0) {
+            goodStrategy = StringUtils.join(goodStrategies, ",");
+        }
         if (id != null) {
-            UpdateWrapper<Goods> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.set("PRICE", price);
-            updateWrapper.set("GOOD_COUNT", goodCount);
-            updateWrapper.set("GOOD_LIMIT", goodLimit);
-            updateWrapper.set("GOOD_UNIT", goodUnit);
+            LambdaUpdateWrapper<Goods> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.set(Goods::getStartSaleTime, goodsAddDTO.getStartSaleTime());
+            updateWrapper.set(Goods::getGoodType, goodsAddDTO.getGoodType());
+            updateWrapper.set(Goods::getExpireTime, goodsAddDTO.getExpireTime());
+            updateWrapper.set(Goods::getGoodName, goodsAddDTO.getGoodName());
+            updateWrapper.set(Goods::getStatus, goodsAddDTO.getStatus());
+            updateWrapper.set(Goods::getBuyLimit, goodLimit);
+            updateWrapper.set(Goods::getGoodCount, goodCount);
+            updateWrapper.set(Goods::getGoodStrategy, goodStrategy);
+            updateWrapper.set(Goods::getPrice, price);
+            updateWrapper.set(Goods::getRemark, goodsAddDTO.getRemark());
+            updateWrapper.set(Goods::getGoodId, goodsAddDTO.getGoodId());
+            updateWrapper.set(Goods::getGoodUnit, goodUnit);
+            updateWrapper.eq(Goods::getId, id);
             this.update(updateWrapper);
         } else {
             Goods goods = new Goods();
             BeanUtils.copyProperties(goodsAddDTO, goods);
             goods.setBuyLimit(goodLimit);
-
+            goods.setGoodStrategy(goodStrategy);
+            goods.setCreateId(loginUtils.getId());
+            goods.insert();
             id = goods.getId();
         }
         return id;
     }
 
     public Records queryGoods(GoodsQueryDTO goodsQueryDTO) {
+        Date date = new Date();
         Records records = new Records();
         Long current = goodsQueryDTO.getCurrent();
         Long size = goodsQueryDTO.getSize();
+        Integer id = goodsQueryDTO.getIds();
         String goodName = goodsQueryDTO.getGoodName();
         Integer goodType = goodsQueryDTO.getGoodType();
+        Integer vipId = goodsQueryDTO.getVipId();
         Integer status = goodsQueryDTO.getStatus();
+        Integer vipLevel = goodsQueryDTO.getVipLevel();
         LambdaQueryWrapper<Goods> queryWrapper = new LambdaQueryWrapper<>();
         if (goodName != null) {
             queryWrapper.like(Goods::getGoodName, goodName);
@@ -98,9 +134,45 @@ public class GoodsService extends ServiceImpl<GoodsMapper, Goods> {
         if (goodType != null) {
             queryWrapper.eq(Goods::getGoodType, goodType);
         }
+        if (vipId != null) {
+            queryWrapper.eq(Goods::getGoodType, 1);
+            queryWrapper.eq(Goods::getGoodId, vipId);
+        }
+        if (vipLevel != null) {
+            queryWrapper.eq(Goods::getGoodType, 1);
+            LambdaQueryWrapper<AppVipType> queryWrapper1 = new LambdaQueryWrapper<>();
+            queryWrapper1.gt(AppVipType::getVipLevel, vipLevel);
+            List<AppVipType> appVipTypes = appVipTypeService.list(queryWrapper1);
+            if (appVipTypes.size() == 0) {
+                queryWrapper.eq(Goods::getGoodId, -1);
+            } else {
+                List<Integer> vipTypeIds = appVipTypes.stream().map(AppVipType::getTenantVipTypeId).collect(Collectors.toList());
+                queryWrapper.in(Goods::getGoodId, vipTypeIds);
+            }
+        }
         if (status != null) {
-            queryWrapper.eq(Goods::getStatus, status);
+            switch (status) {
+                case 0:
+                    queryWrapper.eq(Goods::getStatus, status);
+                    break;
+                case 2:
+                    queryWrapper.and(i -> i.lt(Goods::getStartSaleTime, date).eq(Goods::getStatus, 1).and(t -> t.isNull(Goods::getExpireTime).or().gt(Goods::getExpireTime, date)));
+                    break;
+                case 3:
+                    queryWrapper.and(i -> i.gt(Goods::getStartSaleTime, date).eq(Goods::getStatus, 1));
+                    break;
+                case 4:
+                    queryWrapper.and(i -> i.lt(Goods::getExpireTime, date).eq(Goods::getStatus, 1));
+                    break;
+
+            }
+
+        }
+        if (id != null) {
+            queryWrapper.eq(Goods::getId, id);
         }
+
+        queryWrapper.orderByDesc(Goods::getCreateTime);
         List<Goods> goods = new ArrayList<>();
         if (current != null && size != null) {
             IPage<Goods> goodsIPage = this.page(new Page<>(current, size), queryWrapper);
@@ -118,7 +190,7 @@ public class GoodsService extends ServiceImpl<GoodsMapper, Goods> {
 
     public List<GoodsQueryVO> loadGoodsQueryVO(List<Goods> goodsList) {
         List<GoodsQueryVO> goodsQueryVOS = new ArrayList<>();
-        if (goodsQueryVOS == null || goodsQueryVOS.size() == 0) {
+        if (goodsList == null || goodsList.size() == 0) {
             return goodsQueryVOS;
         }
         List<Integer> createIds = goodsList.stream().map(Goods::getCreateId).collect(Collectors.toList());
@@ -144,6 +216,7 @@ public class GoodsService extends ServiceImpl<GoodsMapper, Goods> {
         for (Goods goods : goodsList) {
             GoodsQueryVO goodsQueryVO = new GoodsQueryVO();
             String limits = goods.getBuyLimit();
+            String strategies = goods.getGoodStrategy();
             Integer createId = goods.getId();
             Integer goodType = goods.getGoodType();
             Integer goodId = goods.getGoodId();
@@ -154,7 +227,7 @@ public class GoodsService extends ServiceImpl<GoodsMapper, Goods> {
                 goodsQueryVO.setCreateName(personnel.getPersonnelName());
             }
             List<Integer> goodLimits = new ArrayList<>();
-
+            List<Integer> goodStrategies = new ArrayList<>();
             if (limits != null) {
                 String[] temStrs = StringUtils.split(limits, ",");
                 for (int i = 0; i < temStrs.length; i++) {
@@ -162,6 +235,14 @@ public class GoodsService extends ServiceImpl<GoodsMapper, Goods> {
                 }
                 goodsQueryVO.setGoodLimits(goodLimits);
             }
+            if (strategies != null) {
+                String[] temStrs = StringUtils.split(strategies, ",");
+                for (int i = 0; i < temStrs.length; i++) {
+                    goodStrategies.add(Integer.parseInt(temStrs[i]));
+                }
+                goodsQueryVO.setGoodStrategyIds(goodStrategies);
+            }
+
 
             if (goodType == 1) {
                 AppVipTypeVO appVipTypeVO = appVipTypeVOS.stream().filter(item -> item.getId().equals(goodId)).findFirst().orElse(null);
@@ -170,15 +251,17 @@ public class GoodsService extends ServiceImpl<GoodsMapper, Goods> {
                 }
             } else if (goodType == 2) {
                 Function function = functionList.stream().filter(item -> item.getId().equals(goodId)).findFirst().orElse(null);
-                if(function!=null){
+                if (function != null) {
                     FunctionCodeTreeVO functionMessage = AssoFunctionModuleService.loadFunctionCodeTreeVO(function, null);
                     goodsQueryVO.setFunctionMessage(functionMessage);
                 }
             }
 
-
             goodsQueryVOS.add(goodsQueryVO);
         }
+        this.loadGoodsQueryVOLimits(goodsQueryVOS);
+        this.loadGoodsQueryVOStatus(goodsQueryVOS);
+        loadService.loadCommonVO(goodsQueryVOS);
         return goodsQueryVOS;
     }
 
@@ -210,6 +293,105 @@ public class GoodsService extends ServiceImpl<GoodsMapper, Goods> {
         this.update(updateWrapper);
         return ids;
     }
+
+    public List<GoodsQueryVO> loadGoodsQueryVOLimits(List<GoodsQueryVO> goodsQueryVOS) {
+        List<Integer> limitIds = new ArrayList<>();
+        List<Integer> strategyIds = new ArrayList<>();
+        for (GoodsQueryVO goodsQueryVO : goodsQueryVOS) {
+            List<Integer> temLimitIds = goodsQueryVO.getGoodLimits();
+            List<Integer> temStrategyIds = goodsQueryVO.getGoodStrategyIds();
+            if (temLimitIds != null && temLimitIds.size() > 0) {
+                limitIds.addAll(temLimitIds);
+            }
+            if (temStrategyIds != null && temStrategyIds.size() > 0) {
+                strategyIds.addAll(temStrategyIds);
+            }
+
+        }
+        List<GoodByLimitVO> goodByLimitVOS = new ArrayList<>();
+        List<MarketStrategyVO> marketStrategyVOS = new ArrayList<>();
+        if (limitIds != null && limitIds.size() > 0) {
+            goodByLimitVOS = goodByLimitService.queryAllGoodLimit(limitIds);
+        }
+        if (strategyIds != null && strategyIds.size() > 0) {
+            marketStrategyVOS = marketStrategyService.queryMarketStrategy(strategyIds);
+        }
+
+        for (GoodsQueryVO goodsQueryVO : goodsQueryVOS) {
+            List<Integer> temLimitIds = goodsQueryVO.getGoodLimits();
+            List<Integer> temStrategyIds = goodsQueryVO.getGoodStrategyIds();
+            if (temLimitIds != null && temLimitIds.size() > 0) {
+                List<GoodByLimitVO> temLimitVOs = goodByLimitVOS.stream().filter(item -> temLimitIds.contains(item.getId())).collect(Collectors.toList());
+                goodsQueryVO.setGoodByLimitVos(temLimitVOs);
+            }
+            if (temStrategyIds != null && temStrategyIds.size() > 0) {
+                List<MarketStrategyVO> temMarketStrategyVOs = marketStrategyVOS.stream().filter(item -> temLimitIds.contains(item.getId())).collect(Collectors.toList());
+                goodsQueryVO.setGoodStrategyVos(temMarketStrategyVOs);
+            }
+
+
+        }
+        return goodsQueryVOS;
+    }
+
+    public List<GoodsQueryVO> loadGoodsQueryVOStatus(List<GoodsQueryVO> goodsQueryVOS) {
+        List<String> sysDictNames = new ArrayList<>();
+        sysDictNames.add(GOOD_STATUS_KEY);
+        sysDictNames.add(GOOD_TYPE_KEY);
+        sysDictNames.add(GOOD_UNIT_KEY);
+        List<SysDictItem> sysDictItems = sysDictItemService.querySysDictItemsByGroup(sysDictNames);
+        for (GoodsQueryVO goodsQueryVO : goodsQueryVOS) {
+            Integer goodUnit = goodsQueryVO.getGoodUnit();
+            Integer goodType = goodsQueryVO.getGoodType();
+            Integer goodStatus = goodsQueryVO.getStatus();
+            Date now = new Date();
+            Date expireTime = goodsQueryVO.getExpireTime();
+            Date startSaleTime = goodsQueryVO.getStartSaleTime();
+            if (goodUnit != null) {
+                SysDictItem sysDictItem = sysDictItems.stream().filter(item -> item.getDictParentKey().equals(GOOD_UNIT_KEY) && item.getDictChildValue().equals(goodUnit.toString())).findFirst().orElse(null);
+                if (sysDictItem != null) {
+                    goodsQueryVO.setGoodUnitStr(sysDictItem.getDictChildLabel());
+                }
+            }
+            if (goodType != null) {
+                SysDictItem sysDictItem = sysDictItems.stream().filter(item -> item.getDictParentKey().equals(GOOD_TYPE_KEY) && item.getDictChildValue().equals(goodType.toString())).findFirst().orElse(null);
+                if (sysDictItem != null) {
+                    goodsQueryVO.setGoodTypeStr(sysDictItem.getDictChildLabel());
+                }
+            }
+            if (goodStatus != null) {
+                if (goodStatus == 1) {
+                    if (now.compareTo(startSaleTime) >= 0) {
+                        if (expireTime == null || expireTime.compareTo(now) > 0) {
+                            goodStatus = 2;
+                        } else {
+                            goodStatus = 4;
+                        }
+                    } else {
+                        goodStatus = 3;
+                    }
+                }
+                String finalStatus = goodStatus.toString();
+                SysDictItem sysDictItem = sysDictItems.stream().filter(item -> item.getDictParentKey().equals(GOOD_STATUS_KEY) && item.getDictChildValue().equals(finalStatus)).findFirst().orElse(null);
+                if (sysDictItem != null) {
+                    goodsQueryVO.setStatusStr(sysDictItem.getDictChildLabel());
+                }
+            }
+
+        }
+        return goodsQueryVOS;
+    }
+
+    public List<Goods> queryGoodsByGoodIds(List<Integer> ids, Integer type) {
+        if (ids == null || ids.size() == 0) {
+            return new ArrayList<>();
+        }
+        LambdaQueryWrapper<Goods> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(Goods::getId, ids).eq(Goods::getGoodType, type);
+        return this.list(queryWrapper);
+
+    }
+
 }
 
 

+ 34 - 4
PCS/src/main/java/cn/cslg/permission/service/qiaobi/MarketStrategyService.java

@@ -1,18 +1,48 @@
 package cn.cslg.permission.service.qiaobi;
 
+import cn.cslg.permission.common.model.qiaobi.goods.MarketStrategyVO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import cn.cslg.permission.domain.qiaobi.MarketStrategy;
 import cn.cslg.permission.mapper.qiaobi.MarketStrategyMapper;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
-* @author admin
-* @description 针对表【MARKET_STRATEGY(营销策略)】的数据库操作Service实现
-* @createDate 2025-06-29 11:58:03
-*/
+ * @author admin
+ * @description 针对表【MARKET_STRATEGY(营销策略)】的数据库操作Service实现
+ * @createDate 2025-06-29 11:58:03
+ */
 @Service
 public class MarketStrategyService extends ServiceImpl<MarketStrategyMapper, MarketStrategy> {
+    public List<MarketStrategyVO> queryMarketStrategy(List<Integer> ids) {
+        List<MarketStrategyVO> vos = new ArrayList<>();
+        LambdaQueryWrapper<MarketStrategy> queryWrapper = new LambdaQueryWrapper<>();
+        if (ids != null && ids.size() > 0) {
+            queryWrapper.in(MarketStrategy::getId, ids);
+        }
+        List<MarketStrategy> marketStrategies = this.list(queryWrapper);
+        for (MarketStrategy marketStrategy : marketStrategies) {
+            MarketStrategyVO marketStrategyVO = new MarketStrategyVO();
+            BeanUtils.copyProperties(marketStrategy, marketStrategyVO);
+            vos.add(marketStrategyVO);
+        }
+        return vos;
+    }
+
+    public List<MarketStrategy> queryMarketStrategyDomain(List<Integer> ids) {
+        List<MarketStrategyVO> vos = new ArrayList<>();
+        LambdaQueryWrapper<MarketStrategy> queryWrapper = new LambdaQueryWrapper<>();
+        if (ids != null && ids.size() > 0) {
+            queryWrapper.in(MarketStrategy::getId, ids);
+        }
+        List<MarketStrategy> marketStrategies = this.list(queryWrapper);
 
+        return marketStrategies;
+    }
 }
 
 

+ 29 - 8
PCS/src/main/java/cn/cslg/permission/service/qiaobi/PayOrderService.java

@@ -4,8 +4,10 @@ import cn.cslg.permission.common.model.Records;
 import cn.cslg.permission.common.model.common.CommonVO;
 import cn.cslg.permission.common.model.qiaobi.payOrder.*;
 import cn.cslg.permission.common.model.vo.PersonnelVO;
+import cn.cslg.permission.common.model.vo.associate.AssoDepartPosVO;
 import cn.cslg.permission.common.utils.BatchNoUtil;
 import cn.cslg.permission.common.utils.CacheUtils;
+import cn.cslg.permission.common.utils.LoginUtils;
 import cn.cslg.permission.domain.Personnel;
 import cn.cslg.permission.domain.Tenant;
 import cn.cslg.permission.service.PersonnelService;
@@ -39,7 +41,8 @@ public class PayOrderService extends ServiceImpl<PayOrderMapper, PayOrder> {
     private CacheUtils cacheUtils;
     @Autowired
     private PersonnelService personnelService;
-
+    @Autowired
+    private LoginUtils loginUtils;
     public PayOrder addPayOrder(PayOrderAddMessageDTO payOrderAddMessageDTO) {
         String tradeNo = BatchNoUtil.getOrderNo();
         PayOrder payOrder = new PayOrder();
@@ -48,6 +51,9 @@ public class PayOrderService extends ServiceImpl<PayOrderMapper, PayOrder> {
         payOrder.setTruePrice(payOrderAddMessageDTO.getTotalPrice());
         payOrder.setOrderType(payOrderAddMessageDTO.getOrderGoodDTOList().get(0).getGoods().getGoodType());
         payOrder.setOrderStatus(0);
+        payOrder.setCreateId(loginUtils.getId());
+       PersonnelVO personnelVO= cacheUtils.getLoginUser(loginUtils.getId());
+       payOrder.setTenantId(personnelVO.getTenantId());
         String goodMessage = JSONObject.toJSONString(payOrderAddMessageDTO.getOrderGoodDTOList());
         payOrder.setGoodMessage(goodMessage);
         payOrder.insert();
@@ -76,6 +82,16 @@ public class PayOrderService extends ServiceImpl<PayOrderMapper, PayOrder> {
         // 代码控制若不是超级管理员则只能查看本租户的人员列表
         if (personnelVO1.getRoleType() == null || personnelVO1.getRoleType() == 0) {
             payOrderQueryDTO.setPersonId(Integer.parseInt(personnelVO1.getId()));
+            List<AssoDepartPosVO> assoDepartPosVOS =  personnelVO1.getPositions();
+            List<Integer> departMentIds =new ArrayList<>();
+            if(assoDepartPosVOS.size()>0){
+                for (AssoDepartPosVO assoDepartPosVO :assoDepartPosVOS){
+                    if(assoDepartPosVO.getPositionName().equals("部长")){
+                        departMentIds.add(assoDepartPosVO.getDepartment());
+                    }
+                }
+                payOrderQueryDTO.setDepartmentIds(departMentIds);
+            }
         } else if (personnelVO1.getRoleType() != null && personnelVO1.getRoleType() == 2) {
             payOrderQueryDTO.setTenantId(personnelVO1.getTenantId());
         }
@@ -102,6 +118,7 @@ public class PayOrderService extends ServiceImpl<PayOrderMapper, PayOrder> {
             }
             List<OrderGoodDTO> orderGoodDTOList = JSONArray.parseArray(goodMessage, OrderGoodDTO.class);
             payOrderQueryVO.setGoodList(orderGoodDTOList);
+            payOrderQueryVOs.add(payOrderQueryVO);
         }
         loadService.loadCommonVOWithInviteName(payOrderQueryVOs);
         return payOrderQueryVOs;
@@ -112,18 +129,18 @@ public class PayOrderService extends ServiceImpl<PayOrderMapper, PayOrder> {
         Long size = payOrderGroupByDTO.getSize();
         Records records = new Records();
         Integer groupBy = payOrderGroupByDTO.getGroupBy();
-        payOrderGroupByDTO.setGroupField("DATE_FORMAT(a.CREATE_TIME, '%Y')");
+        payOrderGroupByDTO.setGroupField("DATE_FORMAT(a.PAY_TIME, '%Y')");
         switch (groupBy) {
-            case 1:
-                payOrderGroupByDTO.setGroupField(" DATE_FORMAT(a.CREATE_TIME, '%Y-%m')");
-                break;
             case 2:
-                payOrderGroupByDTO.setGroupField("CONCAT(YEAR(a.CREATE_TIME), '-第', QUARTER(a.CREATE_TIME),'季度')");
+                payOrderGroupByDTO.setGroupField(" DATE_FORMAT(a.PAY_TIME, '%Y-%m')");
                 break;
             case 3:
-                payOrderGroupByDTO.setGroupField("DATE_FORMAT(a.CREATE_TIME, '%Y')");
+                payOrderGroupByDTO.setGroupField("CONCAT(YEAR(a.PAY_TIME), '-第', QUARTER(a.PAY_TIME),'季度')");
                 break;
             case 4:
+                payOrderGroupByDTO.setGroupField("DATE_FORMAT(a.PAY_TIME, '%Y')");
+                break;
+            case 5:
                 payOrderGroupByDTO.setGroupField("b.PERSON_ID1");
                 break;
         }
@@ -136,8 +153,11 @@ public class PayOrderService extends ServiceImpl<PayOrderMapper, PayOrder> {
         } else if (personnelVO1.getRoleType() != null && personnelVO1.getRoleType() == 2) {
             payOrderGroupByDTO.setTenantId(personnelVO1.getTenantId());
         }
+        if (current != null && size != null) {
+            payOrderGroupByDTO.setCurrent(((current - 1) * size));
+        }
         List<PayOrderGroupVO> payOrderGroupVOS = this.getBaseMapper().groupPayRecord(payOrderGroupByDTO);
-        if (groupBy == 4) {
+        if (groupBy == 5) {
             List<String> invitedIds = payOrderGroupVOS.stream().filter(item -> item.getGroupKey() != null).map(PayOrderGroupVO::getGroupKey).collect(Collectors.toList());
             List<Integer> ids = new ArrayList<>();
             invitedIds.forEach(item -> {
@@ -165,6 +185,7 @@ public class PayOrderService extends ServiceImpl<PayOrderMapper, PayOrder> {
         records.setSize(size);
         return records;
     }
+
 }
 
 

+ 8 - 6
PCS/src/main/java/cn/cslg/permission/service/qiaobi/QiaoBiPersonService.java

@@ -68,14 +68,13 @@ public class QiaoBiPersonService {
     public QiaoBiPersonSignUpDTO personSignUp(QiaoBiPersonSignUpDTO qiaoBiPersonSignUpDTO) {
         String phoneNum = qiaoBiPersonSignUpDTO.getPhoneNum();
         String inviteCode = qiaoBiPersonSignUpDTO.getInviteCode();
-        Integer vipTypeId = qiaoBiPersonSignUpDTO.getVipType();
         //验证参数是否正确
         this.checkMessage(qiaoBiPersonSignUpDTO);
         this.checkPersonInvalid(qiaoBiPersonSignUpDTO);
         //添加人员
         qiaoBiPersonSignUpDTO = personnelService.addPhoneSignUpPerson(qiaoBiPersonSignUpDTO);
-        //绑定版本
-        assoPersonVipTypeService.addVip(qiaoBiPersonSignUpDTO.getId(), vipTypeId, null);
+
+        Integer timUnit = 1;
         //执行邀请逻辑
         if (inviteCode != null && !inviteCode.trim().equals("")) {
             LambdaQueryWrapper<PersonInvitationCode> queryWrapper = new LambdaQueryWrapper<>();
@@ -86,7 +85,10 @@ public class QiaoBiPersonService {
             Integer personId = personInvitationCode.getPersonId();
             assoPersonVipTypeService.lastPersonVip(personId);
             personRelationService.addPersonRelation(personId, qiaoBiPersonSignUpDTO.getId());
+            timUnit = 2;
         }
+        //绑定版本
+        assoPersonVipTypeService.addSignUpVip(qiaoBiPersonSignUpDTO.getId(), timUnit);
         redisUtil.delete(LoginCacheKeyUtil.getLoginCaptcha(phoneNum));
         smsService.sendQiaoBiMessage(qiaoBiPersonSignUpDTO.getPhoneNum(), qiaoBiPersonSignUpDTO.getPassword());
         return qiaoBiPersonSignUpDTO;
@@ -111,9 +113,9 @@ public class QiaoBiPersonService {
         if (!RegexUtil.isPhoneLegal(phoneNum)) {
             throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "手机号格式错误");
         }
-        if (vipType == null) {
-            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "请选择版本");
-        }
+//        if (vipType == null) {
+//            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "请选择版本");
+//        }
 
         String code = redisUtil.get(LoginCacheKeyUtil.getLoginCaptcha(phoneNum));
         if (!phoneCode.equals(code)) {

+ 7 - 2
PCS/src/main/java/cn/cslg/permission/service/qiaobi/StatsService.java

@@ -8,6 +8,7 @@ import cn.cslg.permission.common.model.qiaobi.PersonStatsVO;
 import cn.cslg.permission.common.model.qiaobi.PersonVipMessVO;
 import cn.cslg.permission.common.model.qiaobi.QiaoBiVIPTypeVO;
 import cn.cslg.permission.common.model.qiaobi.QiaoBiVipTypeDTO;
+import cn.cslg.permission.common.model.qiaobi.goods.GoodCountVO;
 import cn.cslg.permission.common.model.vo.AppVipTypeVO;
 import cn.cslg.permission.common.model.vo.PersonnelVO;
 import cn.cslg.permission.common.utils.CacheUtils;
@@ -20,6 +21,7 @@ import cn.cslg.permission.exception.XiaoShiException;
 import cn.cslg.permission.mapper.LoginRecordMapper;
 import cn.cslg.permission.mapper.PersonnelMapper;
 import cn.cslg.permission.mapper.qiaobi.AppVipTypeMapper;
+import cn.cslg.permission.mapper.qiaobi.PayOrderMapper;
 import cn.cslg.permission.service.AssoTenantVipTypeFunctionService;
 import cn.cslg.permission.service.PersonnelService;
 import cn.cslg.permission.service.impl.TenantVipTypeService;
@@ -44,12 +46,15 @@ import java.util.stream.Collectors;
 public class StatsService {
     private final PersonnelMapper personnelMapper;
     private final LoginRecordMapper loginRecordMapper;
+    private final PayOrderMapper payOrderMapper;
 
     public PersonStatsVO qiaoBiVIPTypeVOList() {
         Long signCount = personnelMapper.getQiaoBiPersonSignCount(null, null);
-        Long paidCount = personnelMapper.getQiaoBiPersonSignCount(true, null);
+        GoodCountVO goodCountVO = payOrderMapper.queryPayCount(false);
+        Long paidCount = goodCountVO.getNum();
         Long lastMonthSignCount = personnelMapper.getQiaoBiPersonSignCount(null, true);
-        Long lastMonthPaidCount = personnelMapper.getQiaoBiPersonSignCount(true, true);
+        GoodCountVO goodCountVO2 = payOrderMapper.queryPayCount(true);
+        Long lastMonthPaidCount = goodCountVO2.getNum();
         Long loginCount = loginRecordMapper.getSignCount();
         if (loginCount == null) {
             loginCount = 0l;

+ 154 - 26
PCS/src/main/java/cn/cslg/permission/service/weixinpay/WeixinPayService.java

@@ -1,26 +1,28 @@
 package cn.cslg.permission.service.weixinpay;
 
+import cn.cslg.permission.common.model.qiaobi.goods.GoodByLimitVO;
 import cn.cslg.permission.common.model.qiaobi.payOrder.OrderGoodDTO;
 import cn.cslg.permission.common.model.qiaobi.payOrder.PayOrderAddMessageDTO;
 import cn.cslg.permission.common.model.qiaobi.payOrder.WeixinSuccessVO;
 import cn.cslg.permission.common.model.qiaobi.strategy.QueryGoodsStrategyVO;
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipDTO;
+import cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipVO;
 import cn.cslg.permission.common.model.weixinpay.GetAuthorizationVO;
 import cn.cslg.permission.common.utils.BatchNoUtil;
+import cn.cslg.permission.common.utils.DateUtils;
 import cn.cslg.permission.common.utils.LoginUtils;
 import cn.cslg.permission.common.utils.SecurityUtils.AesUtil;
+import cn.cslg.permission.common.utils.StringUtils;
 import cn.cslg.permission.common.utils.common.BigDecimalUtil;
-import cn.cslg.permission.domain.qiaobi.AssoPersonFunction;
-import cn.cslg.permission.domain.qiaobi.Goods;
-import cn.cslg.permission.domain.qiaobi.PayOrder;
+import cn.cslg.permission.domain.qiaobi.*;
 import cn.cslg.permission.exception.ExceptionEnum;
 import cn.cslg.permission.exception.XiaoShiException;
+import cn.cslg.permission.factory.goodLimit.GoodLimitFactory;
+import cn.cslg.permission.factory.goodLimit.GoodLimitFactoryImp;
 import cn.cslg.permission.factory.strategy.StrategyFatcory;
 import cn.cslg.permission.factory.strategy.StrategyImp;
 import cn.cslg.permission.mapper.qiaobi.MarketStrategyMapper;
-import cn.cslg.permission.service.qiaobi.AssoPersonFunctionService;
-import cn.cslg.permission.service.qiaobi.AssoPersonVipTypeService;
-import cn.cslg.permission.service.qiaobi.GoodsService;
-import cn.cslg.permission.service.qiaobi.PayOrderService;
+import cn.cslg.permission.service.qiaobi.*;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.google.gson.Gson;
@@ -32,6 +34,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -41,7 +45,7 @@ public class WeixinPayService {
     @Autowired
     private AuthorizationService authorizationService;
     @Autowired
-    private MarketStrategyMapper marketStrategyMapper;
+    private MarketStrategyService marketStrategyService;
     @Autowired
     private GoodsService goodsService;
     @Autowired
@@ -57,11 +61,18 @@ public class WeixinPayService {
     public static String apiV3key = "9Cx7SiQb7il8Zaf8nsBw5QxSCVZkoO7p";
     @Value("${payCallBack}")
     public String payCallBack;
+    @Autowired
+    private GoodByLimitService goodByLimitService;
+    @Autowired
+    private GoodLimitFactory goodLimitFactory;
+    @Autowired
+    private AppVipTypeService appVipTypeService;
 
     @Transactional(rollbackFor = Exception.class)
     public String getPayTickets(PayOrderAddMessageDTO payOrderAddMessageDTO) {
         String codeUrl = "";
         payOrderAddMessageDTO = this.calculatePrice(payOrderAddMessageDTO);
+
         PayOrder payOrder = payOrderService.addPayOrder(payOrderAddMessageDTO);
         String url = "https://api.mch.weixin.qq.com/v3/pay/transactions/native";
         String tradeNo = payOrder.getTradeNo();
@@ -129,36 +140,74 @@ public class WeixinPayService {
         if (payOrderAddMessageDTO == null || payOrderAddMessageDTO.getOrderGoodDTOList() == null || payOrderAddMessageDTO.getOrderGoodDTOList().isEmpty()) {
             throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "请选择商品");
         }
+
         List<OrderGoodDTO> orderGoodDTOList = payOrderAddMessageDTO.getOrderGoodDTOList();
         List<Integer> goodsIds = orderGoodDTOList.stream().map(OrderGoodDTO::getGoodId).collect(Collectors.toList());
         if (goodsIds == null || goodsIds.isEmpty()) {
             throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "请选择商品");
         }
         List<Goods> goods = goodsService.queryByIds(goodsIds);
-        List<QueryGoodsStrategyVO> queryGoodsStrategyVOS = marketStrategyMapper.queryStrategyByGoodsId(goodsIds);
+        List<Goods> goodTypes = goods.stream().filter(item -> item.getGoodType().equals(1)).collect(Collectors.toList());
+        if (goodTypes.size() > 1) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "不购买多个不同的会员");
+        }
         for (OrderGoodDTO item : orderGoodDTOList) {
             Integer temGoodId = item.getGoodId();
             Goods goods1 = goods.stream().filter(tem -> tem.getId().equals(temGoodId)).findFirst().orElse(null);
             if (goods1 == null) {
                 throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "有伪造的商品数据");
             }
-            item.setPrice(goods1.getPrice());
-            item.setGoods(goods1);
+
+
             if (item.getNum() == null || item.getNum() <= 0) {
                 throw new XiaoShiException(ExceptionEnum.BUSINESS_CHECK, "商品数量不能小于0");
 
             }
-            Double orgPrice = BigDecimalUtil.multiplication(item.getPrice(), item.getNum());
+            item.setGoods(goods1);
+            String goodLimits = goods1.getBuyLimit();
+            String goodStrategiesStr = goods1.getGoodStrategy();
+            List<Integer> goodLimitsIds = new ArrayList<>();
+            List<Integer> goodStrategyList = new ArrayList<>();
+            if (goodLimits != null) {
+                String[] temStrs = StringUtils.split(goodLimits, ",");
+                for (int i = 0; i < temStrs.length; i++) {
+                    goodLimitsIds.add(Integer.parseInt(temStrs[i]));
+                }
+            }
+
+
+            if (goodLimitsIds != null && goodLimitsIds.size() > 0) {
+                List<GoodByLimit> goodByLimits = goodByLimitService.queryGoodLimit(goodLimitsIds);
+                for (GoodByLimit goodByLimit : goodByLimits) {
+                    String methodName = goodByLimit.getLimitMethod();
+                    GoodLimitFactoryImp goodLimitFactoryImp = goodLimitFactory.getClass(methodName);
+                    goodLimitFactoryImp.DoGoodLimit(item);
+                }
+            }
+
+            if (goodStrategiesStr != null) {
+                String[] temStrs = StringUtils.split(goodStrategiesStr, ",");
+                for (int i = 0; i < temStrs.length; i++) {
+                    goodStrategyList.add(Integer.parseInt(temStrs[i]));
+                }
+            }
+
+            Double orgPrice = BigDecimalUtil.multiplication(goods1.getPrice(), item.getNum());
             orgTotalPrice = BigDecimalUtil.add(orgPrice, orgTotalPrice);
-            Double goodsTotalPrice = BigDecimalUtil.multiplication(item.getPrice(), item.getNum());
-            item.setTotalPrice(goodsTotalPrice);
-            QueryGoodsStrategyVO queryGoodsStrategyVO = queryGoodsStrategyVOS.stream().filter(tem -> tem.getGoodsId().equals(temGoodId)).findFirst().orElse(null);
-            item.setQueryGoodsStrategyVO(queryGoodsStrategyVO);
-            if (queryGoodsStrategyVO != null) {
-                String methodName = queryGoodsStrategyVO.getStrategyName();
-                StrategyImp strategyImp = strategyFatcory.getClass(methodName);
-                item = strategyImp.DoGoodStrategy(item);
+            item.setTotalPrice(orgPrice);
+            item.setOrgPrice(orgPrice);
+            if (goodStrategyList != null && goodStrategyList.size() > 0) {
+                List<MarketStrategy> marketStrategies = marketStrategyService.queryMarketStrategyDomain(goodStrategyList);
+                if (marketStrategies.size() > 0) {
+                    String methodName = marketStrategies.get(0).getStrategyMethod();
+                    StrategyImp strategyImp = strategyFatcory.getClass(methodName);
+                    item = strategyImp.DoGoodStrategy(item);
+                }
+            }
+            if (goods1.getGoodType() == 1) {
+                this.calculateVipDisPrice(goods1, item);
             }
+
             totalPrice = BigDecimalUtil.add(totalPrice, item.getTotalPrice());
         }
         payOrderAddMessageDTO.setTotalPrice(totalPrice);
@@ -182,9 +231,14 @@ public class WeixinPayService {
     public void complateOrder(String tradeNo) {
 
         PayOrder payOrder = payOrderService.getPayOrderByNo(tradeNo);
+
         if (payOrder == null) {
             throw new XiaoShiException("查询订单错误,报警处理");
         }
+        payOrder.setOrderStatus(1);
+        payOrder.setPayTime(new Date());
+        payOrder.updateById();
+        Integer personId = payOrder.getCreateId();
         String goodMessage = payOrder.getGoodMessage();
         List<OrderGoodDTO> orderGoodDTOList = JSONArray.parseArray(goodMessage, OrderGoodDTO.class);
         for (int i = 0; i < orderGoodDTOList.size(); i++) {
@@ -198,18 +252,92 @@ public class WeixinPayService {
             if (type == 1) {
                 Integer vipId = goods.getGoodId();
                 Integer goodUnit = goods.getGoodUnit();
-                assoPersonVipTypeService.addPersonVIP2(vipId, totalNum, goodUnit);
+                assoPersonVipTypeService.addPersonVIP2(goods, personId, vipId, totalNum, goodUnit);
             } else if (type == 2) {
                 Integer functionId = goods.getGoodId();
-                AssoPersonFunction assoPersonFunction = new AssoPersonFunction();
-                assoPersonFunction.setFunctionId(functionId);
-                assoPersonFunction.setPersonId(loginUtils.getId());
-                assoPersonFunction.setCanUseCount(totalNum);
-                assoPersonFunction.insert();
+                AssoPersonFunction assoPersonFunction = assoPersonFunctionService.getPersonFunction(personId, functionId);
+                if (assoPersonFunction != null) {
+                    Integer orgNum = assoPersonFunction.getCanUseCount();
+                    orgNum = orgNum + totalNum;
+                    assoPersonFunction.setCanUseCount(orgNum);
+                    assoPersonFunction.updateById();
+                } else {
+                    assoPersonFunction = new AssoPersonFunction();
+                    assoPersonFunction.setFunctionId(functionId);
+                    assoPersonFunction.setPersonId(loginUtils.getId());
+                    assoPersonFunction.setCanUseCount(totalNum);
+                    assoPersonFunction.insert();
+                }
             }
 
+        }
+
+    }
 
+    public void calculateVipDisPrice(Goods goods, OrderGoodDTO orderGoodDTO) {
+        Integer personId = loginUtils.getId();
+        QueryPersonVipDTO queryPersonVipDTO = new QueryPersonVipDTO();
+        queryPersonVipDTO.setPersonId(personId);
+        QueryPersonVipVO queryPersonVipVO = assoPersonVipTypeService.getPersonActiveVip();
+        if (queryPersonVipVO == null ) {
+            return;
         }
+        Integer levelOrg = queryPersonVipVO.getVipLevel();
+        Integer fromType = queryPersonVipVO.getFromType();
+        String fromMessage = queryPersonVipVO.getFromMessage();
+        Integer goodId = goods.getGoodId();
 
+        Integer goodIdOrg = queryPersonVipVO.getVipTypeId();
+        if (goodId == goodIdOrg) {
+            return;
+        }
+
+        AppVipType appVipType = appVipTypeService.getByTenantVipId(goodId);
+        if (appVipType == null) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "伪造的商品");
+        }
+        Integer level = appVipType.getVipLevel();
+        if (level < levelOrg) {
+            throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "高等级的会员不允许买低等级的会员");
+        }
+        if (fromType == null || (fromType != null && fromType != 1)) {
+            return;
+        }
+
+           Goods goods1 = JSONObject.parseObject(fromMessage, Goods.class);
+        Double disPrice = this.calculateDisPrice(goods1, queryPersonVipVO);
+        if (disPrice > orderGoodDTO.getTotalPrice()) {
+            disPrice = BigDecimalUtil.division(orderGoodDTO.getTotalPrice(), 0.1, 2);
+            orderGoodDTO.setTotalPrice(0.1);
+            orderGoodDTO.setDisPrice(disPrice);
+        } else {
+            orderGoodDTO.setDisPrice(disPrice);
+            Double totalPrice = BigDecimalUtil.subtraction(orderGoodDTO.getTotalPrice(), disPrice, 2);
+            orderGoodDTO.setTotalPrice(totalPrice);
+        }
+
+    }
+
+    public Double calculateDisPrice(Goods goods, QueryPersonVipVO queryPersonVipVO) {
+        if(goods==null){
+            throw new XiaoShiException("计算抵消价格错误,请联系管理员进行解决");
+        }
+        Integer unit = goods.getGoodUnit();
+        Double price = goods.getPrice();
+        Integer days = 30;
+        switch (unit) {
+            case 1:
+                days = 7;
+            case 3:
+                days = 90;
+            case 4:
+                days = 365;
+        }
+        Date expireTime = queryPersonVipVO.getExpitrTime();
+        Date now = new Date();
+        Integer day = DateUtils.getDayByTwoDay(expireTime, now);
+        Double d1 = BigDecimalUtil.division(day, days, 2);
+        Double d2 = BigDecimalUtil.multiplication(d1, price);
+        return d2;
     }
 }

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

@@ -51,4 +51,5 @@ SMS:
 
 FMSUrl: http://192.168.2.24:8803
 Keypath: E:\账号密码\1718408246_20250606_cert\apiclient_key.pem
-payCallBack: http://sh.frp.one:33164/permission/qiaoBi/pay/success
+payCallBack: http://sh.frp.one:33164/permission/qiaoBi/pay/success
+retailTentantId: 39

+ 28 - 25
PCS/src/main/resources/mapper/AppVipTypeMapper.xml

@@ -21,6 +21,7 @@
         SELECT
         A.APPLICATION_CODE,
         A.LAST_TIME,
+        A.VIP_LEVEL,
         B.ID AS ID,
         B.TENANT_VIP_NAME,
         B.REMARK,
@@ -31,24 +32,24 @@
         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>
+        <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="enable!=null">
+                B.ENABLE =#{enable}
+            </if>
 
-    <if test="vipTypeName!=null and !vipTypeName.trim().equals('')">
-        B.TENANT_VIP_NAME like concat('%', #{vipTypeName}, '%')
-    </if>
+            <if test="vipTypeName!=null and !vipTypeName.trim().equals('')">
+                B.TENANT_VIP_NAME like concat('%', #{vipTypeName}, '%')
+            </if>
 
-</where>
+        </where>
         order by B.CREATE_TIME desc
         <if test="current!=null and size!=null">
             limit #{current},#{size}
@@ -73,7 +74,7 @@
         ON A.TENANT_VIP_TYPE_ID = B.ID
         <where>
             <if test="ids!=null and ids.size()>0">
-                B.ID  in (
+                B.ID in (
                 <foreach collection="ids" item="n" separator=",">
                     #{n}
                 </foreach>
@@ -92,7 +93,8 @@
 
 
     <select id="qiaoBiTenantVIPTypeVOList" resultType="cn.cslg.permission.common.model.qiaobi.QiaoBiVIPTypeVO">
-        select vip.ID as vipTypeId,vip.TENANT_VIP_NAME as vipTypeName from ASSO_TENANT_VIP_TYPE as app left join TENANT_VIP_TYPE
+        select vip.ID as vipTypeId,vip.TENANT_VIP_NAME as vipTypeName from ASSO_TENANT_VIP_TYPE as app left join
+        TENANT_VIP_TYPE
         as vip on
         app.VIP_TYPE_ID = vip.ID
         <where>
@@ -102,17 +104,18 @@
     </select>
 
     <select id="qiaoBiTenantsVIPTypeVOList" resultType="cn.cslg.permission.common.model.qiaobi.QiaoBiVIPTypeVO">
-        select vip.ID as vipTypeId,vip.TENANT_VIP_NAME as vipTypeName ,app.VIP_TYPE_NUM as vipTypeNum ,app.TENANT_ID as tenantId  from ASSO_TENANT_VIP_TYPE as app left join TENANT_VIP_TYPE
+        select vip.ID as vipTypeId,vip.TENANT_VIP_NAME as vipTypeName ,app.VIP_TYPE_NUM as vipTypeNum ,app.TENANT_ID as
+        tenantId from ASSO_TENANT_VIP_TYPE as app left join TENANT_VIP_TYPE
         as vip on
         app.VIP_TYPE_ID = vip.ID
         <where>
-        <if test="tenantIds!=null and tenantIds.size()>0">
-            app.TENANT_ID  in (
-            <foreach collection="tenantIds" item="n" separator=",">
-                #{n}
-            </foreach>
-            )
-        </if>
+            <if test="tenantIds!=null and tenantIds.size()>0">
+                app.TENANT_ID in (
+                <foreach collection="tenantIds" item="n" separator=",">
+                    #{n}
+                </foreach>
+                )
+            </if>
         </where>
     </select>
 </mapper>

+ 13 - 0
PCS/src/main/resources/mapper/AssoPerDpMapper.xml

@@ -0,0 +1,13 @@
+<?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.associate.AssoPerDpMapper">
+
+    <select id="queryQiaobiVipTypeVOs" resultType="cn.cslg.permission.common.model.qiaobi.QiaoBiVIPTypeVO">
+           select pdp.PERSONNEL_ID from ASSOCIATE_PERSONNEL_DP as pdp left join ASSOCIATE_DEPARTMENT_POSITION adp on pdp.DEPARTMENT_AND_POSITION_ID =adp.ID
+        <where>
+
+        </where>
+    </select>
+</mapper>

+ 22 - 2
PCS/src/main/resources/mapper/AssoPersonVipTypeMapper.xml

@@ -16,14 +16,34 @@
 
 
     <select id="getPersonActiveVip" resultType="cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipVO">
-        select a.ID as id,b.VIP_LEVEL as vipLevel,a.PERSON_ID,a.VIP_TYPE_ID, a.CREATE_TIME,a.EXPITR_TIME from  ASSO_PERSON_VIP_TYPE a left join APP_VIP_TYPE b on
+        select a.ID as id,b.VIP_LEVEL as vipLevel,a.PERSON_ID,a.VIP_TYPE_ID, a.CREATE_TIME,a.EXPITR_TIME ,a.FROM_MESSAGE,a.FROM_TYPE from  ASSO_PERSON_VIP_TYPE a left join APP_VIP_TYPE b on
        a.VIP_TYPE_ID=b.TENANT_VIP_TYPE_ID
         <where>
-            a.PERSON_ID=#{personId}
+            <if test="personId!=null">
+               and a.PERSON_ID=#{personId}
+            </if>
+            <if test="personId!=null">
+                and a.TENANT_ID=#{tenantId}
+            </if>
         and a.EXPITR_TIME> NOW()
+        <if test="vipType!=null">
         and b.VIP_TYPE=#{vipType}
+        </if>
         order by b.VIP_LEVEL DESC
         </where>
 
     </select>
+
+
+    <select id="getPersonVip" resultType="cn.cslg.permission.common.model.qiaobi.vipType.QueryPersonVipVO">
+        select a.ID as id,b.VIP_LEVEL as vipLevel,a.PERSON_ID,a.VIP_TYPE_ID, a.CREATE_TIME,a.EXPITR_TIME from  ASSO_PERSON_VIP_TYPE a left join APP_VIP_TYPE b on
+        a.VIP_TYPE_ID=b.TENANT_VIP_TYPE_ID
+        <where>
+            a.PERSON_ID=#{personId}
+            <if test="vipType!=null">
+                and b.VIP_TYPE=#{vipType}
+            </if>
+        </where>
+
+    </select>
 </mapper>

+ 1 - 1
PCS/src/main/resources/mapper/AssoTenantVipTypeFunctionMapper.xml

@@ -53,7 +53,7 @@
     <!--根据租户会员类型id查询数据-->
     <!--List<AssoTenantVipTypeAndFunctionVO> selectByTenantVipTypeId(Integer tenantVipTypeId);-->
     <select id="selectByTenantVipTypeId" resultMap="selectByTenantVipTypeIdMap">
-        select TENANT_VIP_TYPE_ID, FUNCTION_ID, FUNCTION_MODIFY_PATH
+        select TENANT_VIP_TYPE_ID, FUNCTION_ID, FUNCTION_MODIFY_PATH,CAN_USE_COUNT
         from ASSO_TENANTVIPTYPE_FUNCTION
         where TENANT_VIP_TYPE_ID = #{tenantVipTypeId}
     </select>

+ 22 - 0
PCS/src/main/resources/mapper/FunctionUseRecordMapper.xml

@@ -0,0 +1,22 @@
+<?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.FunctionUseRecordMapper">
+
+    <select id="getPersonUseRecord" resultType="cn.cslg.permission.common.model.qiaobi.payOrder.FunctionRecordGroupVO">
+    select distinct FUNCTION_ID as functionId ,count(*) as useCount,CREATE_TIME as createTime from FUNCTION_USE_RECORD
+    <where>
+        <if test="personId!=null">
+          and   PERSON_ID=#{personId}
+        </if>
+        <if test="tenantId!=null">
+            and   TENANT_ID=#{tenantId}
+        </if>
+        <if test="functionId!=null">
+            and FUNCTION_ID=#{functionId}
+        </if>
+        and CREATE_TIME>= #{createTime}
+    </where>
+    </select>
+</mapper>

+ 18 - 0
PCS/src/main/resources/mapper/GoodByLimitMapper.xml

@@ -0,0 +1,18 @@
+<?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.GoodByLimitMapper">
+
+    <resultMap id="BaseResultMap" type="cn.cslg.permission.domain.qiaobi.GoodByLimit">
+            <result property="id" column="ID" jdbcType="INTEGER"/>
+            <result property="name" column="NMAE" jdbcType="VARCHAR"/>
+            <result property="limitMethod" column="LIMIT_METHOD" jdbcType="VARCHAR"/>
+            <result property="remark" column="REMARK" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        ID,NMAE,LIMIT_METHOD,
+        REMARK
+    </sql>
+</mapper>

+ 50 - 20
PCS/src/main/resources/mapper/PayOrderMapper.xml

@@ -12,19 +12,18 @@
                 and b.PERSON_ID1 in(select ID from PERSONNEL where PERSONNEL_NAME like
                 concat('%',#{invitePersonName},'%'))
             </if>
-
             <if test="tenantName!=null and !tenantName.trim().equals('')">
                 and a.TENANT_ID in (select ID from TENANT where TENANT_NAME like concat('%',#{tenantName},'%'))
             </if>
 
             <if test="personName!=null and !personName.trim().equals('')">
-                and CREATE_ID in (select ID from PERSONNEL where PERSONNEL_NAME like concat('%',#{personName},'%'))
+                and CREATE_ID in (select ID from PERSONNEL where PERSONNEL_NAME like concat('%',#{personName},'%') OR PERSONNEL_PHONE like concat('%',#{personName},'%'))
             </if>
             <if test="startTime!=null ">
-                and DATE_FORMAT(CREATE_TIME, '%Y-%m-%d')&lt;=DATE_FORMAT(#{startTime}, '%Y-%m-%d')
+                and DATE_FORMAT(a.PAY_TIME, '%Y-%m-%d')&gt;=DATE_FORMAT(#{startTime}, '%Y-%m-%d')
             </if>
             <if test="endTime!=null ">
-                and DATE_FORMAT(CREATE_TIME, '%Y-%m-%d') &lt;=DATE_FORMAT(#{endTime}, '%Y-%m-%d')
+                and DATE_FORMAT(a.PAY_TIME, '%Y-%m-%d') &lt;=DATE_FORMAT(#{endTime}, '%Y-%m-%d')
             </if>
             <if test="tenantId!=null ">
                 and TENANT_ID=#{tenantId}
@@ -32,10 +31,17 @@
             <if test="personId!=null ">
                 and CREATE_ID=#{personId}
             </if>
-            <if test="current!=null and size!=null">
-                limit #{current},#{size}
+            <if test="departmentIds!=null and departmentIds.size()>0">
+                and CREATE_ID in (select pdp.PERSONNEL_ID from ASSOCIATE_PERSONNEL_DP as pdp left join ASSOCIATE_DEPARTMENT_POSITION adp on pdp.DEPARTMENT_AND_POSITION_ID =adp.ID
+                where DEPARTMENT_ID in <foreach collection="ids" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>)
             </if>
         </where>
+        order by a.CREATE_TIME desc
+        <if test="current!=null and size!=null">
+            limit #{current},#{size}
+        </if>
     </select>
 
     <select id="queryPayRecordTotal" resultType="java.lang.Long">
@@ -52,13 +58,13 @@
             </if>
 
             <if test="personName!=null and !personName.trim().equals('')">
-                and CREATE_ID in (select ID from PERSONNEL where PERSONNEL_NAME like concat('%',#{personName},'%'))
+                and CREATE_ID in (select ID from PERSONNEL where PERSONNEL_NAME like concat('%',#{personName},'%') OR PERSONNEL_PHONE like concat('%',#{personName},'%'))
             </if>
             <if test="startTime!=null ">
-                and DATE_FORMAT(CREATE_TIME, '%Y-%m-%d')&lt;=DATE_FORMAT(#{startTime}, '%Y-%m-%d')
+                and DATE_FORMAT(a.PAY_TIME, '%Y-%m-%d')&gt;=DATE_FORMAT(#{startTime}, '%Y-%m-%d')
             </if>
             <if test="endTime!=null ">
-                and DATE_FORMAT(CREATE_TIME, '%Y-%m-%d') &lt;=DATE_FORMAT(#{endTime}, '%Y-%m-%d')
+                and DATE_FORMAT(a.PAY_TIME, '%Y-%m-%d') &lt;=DATE_FORMAT(#{endTime}, '%Y-%m-%d')
             </if>
             <if test="tenantId!=null ">
                 and TENANT_ID=#{tenantId}
@@ -66,15 +72,18 @@
             <if test="personId!=null ">
                 and CREATE_ID=#{personId}
             </if>
-            <if test="current!=null and size!=null">
-                limit #{current},#{size}
+            <if test="departmentIds!=null and departmentIds.size()>0">
+                and CREATE_ID in (select pdp.PERSONNEL_ID from ASSOCIATE_PERSONNEL_DP as pdp left join ASSOCIATE_DEPARTMENT_POSITION adp on pdp.DEPARTMENT_AND_POSITION_ID =adp.ID
+                where DEPARTMENT_ID in <foreach collection="ids" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>)
             </if>
         </where>
     </select>
 
     <select id="groupPayRecord" resultType="cn.cslg.permission.common.model.qiaobi.payOrder.PayOrderGroupVO">
         select ${groupField} as groupKey, count(distinct CREATE_ID) as personNum,sum(cast(TRUE_PRICE as decimal(18,2)))
-        as groupPrice from PAY_ORDER as a
+        as groupPrice,a.CREATE_TIME from PAY_ORDER as a
         left join PERSON_RELATION as b on a.CREATE_ID=b.PERSON_ID2
         <where>
 
@@ -88,13 +97,13 @@
             </if>
 
             <if test="personName!=null and !personName.trim().equals('')">
-                and CREATE_ID in (select ID from PERSONNEL where PERSONNEL_NAME like concat('%',#{personName},'%'))
+                and CREATE_ID in (select ID from PERSONNEL where PERSONNEL_NAME like concat('%',#{personName},'%') OR PERSONNEL_PHONE like concat('%',#{personName},'%'))
             </if>
             <if test="startTime!=null ">
-                and DATE_FORMAT(CREATE_TIME, '%Y-%m-%d')&lt;=DATE_FORMAT(#{startTime}, '%Y-%m-%d')
+                and DATE_FORMAT(a.PAY_TIME, '%Y-%m-%d')&gt;=DATE_FORMAT(#{startTime}, '%Y-%m-%d')
             </if>
             <if test="endTime!=null ">
-                and DATE_FORMAT(CREATE_TIME, '%Y-%m-%d') &lt;=DATE_FORMAT(#{endTime}, '%Y-%m-%d')
+                and DATE_FORMAT(a.PAY_TIME, '%Y-%m-%d') &lt;=DATE_FORMAT(#{endTime}, '%Y-%m-%d')
             </if>
             <if test="tenantId!=null ">
                 and TENANT_ID=#{tenantId}
@@ -102,9 +111,16 @@
             <if test="personId!=null ">
                 and CREATE_ID=#{personId}
             </if>
-
+            <if test="departmentIds!=null and departmentIds.size()>0">
+                and CREATE_ID in (select pdp.PERSONNEL_ID from ASSOCIATE_PERSONNEL_DP as pdp left join ASSOCIATE_DEPARTMENT_POSITION adp on pdp.DEPARTMENT_AND_POSITION_ID =adp.ID
+                where DEPARTMENT_ID in <foreach collection="ids" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>)
+            </if>
         </where>
+
         group by ${groupField}
+        order by a.PAY_TIME desc
         <if test="current!=null and size!=null">
             limit #{current},#{size}
         </if>
@@ -126,13 +142,13 @@
             </if>
 
             <if test="personName!=null and !personName.trim().equals('')">
-                and CREATE_ID in (select ID from PERSONNEL where PERSONNEL_NAME like concat('%',#{personName},'%'))
+                and CREATE_ID in (select ID from PERSONNEL where PERSONNEL_NAME like concat('%',#{personName},'%') OR PERSONNEL_PHONE like concat('%',#{personName},'%'))
             </if>
             <if test="startTime!=null ">
-                and DATE_FORMAT(CREATE_TIME, '%Y-%m-%d')&lt;=DATE_FORMAT(#{startTime}, '%Y-%m-%d')
+                and DATE_FORMAT(a.PAY_TIME, '%Y-%m-%d')&gt;=DATE_FORMAT(#{startTime}, '%Y-%m-%d')
             </if>
             <if test="endTime!=null ">
-                and DATE_FORMAT(CREATE_TIME, '%Y-%m-%d') &lt;=DATE_FORMAT(#{endTime}, '%Y-%m-%d')
+                and DATE_FORMAT(a.PAY_TIME, '%Y-%m-%d') &lt;=DATE_FORMAT(#{endTime}, '%Y-%m-%d')
             </if>
             <if test="tenantId!=null ">
                 and TENANT_ID=#{tenantId}
@@ -140,9 +156,23 @@
             <if test="personId!=null ">
                 and CREATE_ID=#{personId}
             </if>
-
+            <if test="departmentIds!=null and departmentIds.size()>0">
+                and CREATE_ID in (select pdp.PERSONNEL_ID from ASSOCIATE_PERSONNEL_DP as pdp left join ASSOCIATE_DEPARTMENT_POSITION adp on pdp.DEPARTMENT_AND_POSITION_ID =adp.ID
+                where DEPARTMENT_ID in <foreach collection="ids" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>)
+            </if>
         </where>
         group by ${groupField}
         ) as t
     </select>
+
+    <select id="queryPayCount" resultType="cn.cslg.permission.common.model.qiaobi.goods.GoodCountVO">
+        select count(distinct CREATE_ID)  as num from PAY_ORDER
+            <where>
+                <if test="lastMonth!=null and lastMonth ==true">
+                    and DATE_FORMAT(PAY_TIME,'%Y-%m') =DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), '%Y-%m')
+                </if>
+            </where>
+    </select>
 </mapper>

+ 10 - 6
PCS/src/main/resources/mapper/PersonnelMapper.xml

@@ -41,12 +41,14 @@
         as remark,p.PERSONNEL_QQ as qqNumber,p.PERSONNEL_DING as nail,p.TENANT_ID as tenant,
         apvt.EXPITR_TIME as expitrTime, tvt.TENANT_VIP_NAME as vipTypeName from
         PERSONNEL as p left join
-        ASSO_PERSON_VIP_TYPE as apvt
+         ASSO_PERSON_VIP_TYPE  as apvt
         on p.ID = apvt.PERSON_ID left join TENANT_VIP_TYPE tvt on apvt.VIP_TYPE_ID = tvt.ID
         <where>
+
             <if test="tenant!=null">
                 and p.TENANT_ID=#{tenant}
             </if>
+
             <if test="expitrTime!=null">
                 and DATE_FORMAT(apvt.EXPITR_TIME, '%Y-%m-%d')=DATE_FORMAT(#{expitrTime}, '%Y-%m-%d')
             </if>
@@ -76,9 +78,12 @@
 
     <select id="getQiaoBiPersonsListTotal" resultType="java.lang.Long">
         select count(*) from PERSONNEL as p left join
-        ASSO_PERSON_VIP_TYPE as apvt
+        ASSO_PERSON_VIP_TYPE  as apvt
         on p.ID = apvt.PERSON_ID left join TENANT_VIP_TYPE tvt on apvt.VIP_TYPE_ID = tvt.ID
         <where>
+            <if test="ifExpited!=null and ifExpited==true">
+                and apvt.EXPITR_TIME is null
+            </if>
             <if test="tenant!=null">
                 and p.TENANT_ID=#{tenant}
             </if>
@@ -107,18 +112,17 @@
     </select>
 
 
-
     <select id="getQiaoBiPersonSignCount" resultType="java.lang.Long">
         select count(*) from ASSO_PERSON_VIP_TYPE as apv
-         left join PERSONNEL as p on apv.PERSON_ID=p.ID
+        left join PERSONNEL as p on apv.PERSON_ID=p.ID
         <where>
             <if test="paid!=null and paid ==true">
                 and (apv.PERSON_ID in (select CUSTOM_ID from QIAOBI_PAID_RECORD where type=1)
-                   OR p.TENANT_ID in (select CUSTOM_ID from QIAOBI_PAID_RECORD where type=0))
+                OR p.TENANT_ID in (select CUSTOM_ID from QIAOBI_PAID_RECORD where type=0))
 
             </if>
             <if test="lastMonth!=null and lastMonth ==true">
-               and DATE_FORMAT(apv.CREATE_TIME,'%Y-%m') =DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), '%Y-%m')
+                and DATE_FORMAT(apv.CREATE_TIME,'%Y-%m') =DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), '%Y-%m')
             </if>
         </where>
 

+ 6 - 1
PCS/src/test/java/cn/cslg/permission/AppVipTypeTest.java

@@ -4,6 +4,7 @@ import cn.cslg.permission.common.model.dto.EncryptionLoginDTO;
 import cn.cslg.permission.common.model.dto.PhoneLoginDTO;
 import cn.cslg.permission.common.model.dto.SendCodeDTO;
 import cn.cslg.permission.common.model.personnel.UploadPersonnelConfigDTO;
+import cn.cslg.permission.common.model.qiaobi.PersonVipMessVO;
 import cn.cslg.permission.common.model.qiaobi.QiaoBiVIPTypeVO;
 import cn.cslg.permission.common.model.qiaobi.QiaoBiVipTypeDTO;
 import cn.cslg.permission.service.LoginService;
@@ -38,5 +39,9 @@ public class AppVipTypeTest {
          List<QiaoBiVIPTypeVO> qiaoBiVIPTypeVOList= appVipTypeService.qiaoBiVIPTypeVOList(qiaoBiVipTypeDTO);
     System.out.println(qiaoBiVIPTypeVOList);
 }
-
+    @Test
+    public void queryPersonVipType() throws IOException {
+        PersonVipMessVO personVipMessVO= appVipTypeService.queryPersonVipType();
+        System.out.println(personVipMessVO);
+    }
 }

+ 24 - 0
PCS/src/test/java/cn/cslg/permission/qiaobi/GoodByLimitTest.java

@@ -0,0 +1,24 @@
+package cn.cslg.permission.qiaobi;
+
+import cn.cslg.permission.common.model.qiaobi.goods.GoodByLimitVO;
+import cn.cslg.permission.common.model.qiaobi.goods.GoodsQueryVO;
+import cn.cslg.permission.service.qiaobi.GoodByLimitService;
+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.util.List;
+
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class GoodByLimitTest {
+    @Autowired
+    private GoodByLimitService goodByLimitService;
+    @Test
+    public void queryAllGoodLimit() {
+       List<GoodByLimitVO> vos=goodByLimitService.queryAllGoodLimit(null);
+       System.out.println(vos);
+    }
+}

+ 25 - 0
PCS/src/test/java/cn/cslg/permission/qiaobi/GoodStrategyTest.java

@@ -0,0 +1,25 @@
+package cn.cslg.permission.qiaobi;
+
+import cn.cslg.permission.common.model.qiaobi.goods.GoodByLimitVO;
+import cn.cslg.permission.common.model.qiaobi.goods.MarketStrategyVO;
+import cn.cslg.permission.service.qiaobi.GoodByLimitService;
+import cn.cslg.permission.service.qiaobi.MarketStrategyService;
+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.util.List;
+
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class GoodStrategyTest {
+    @Autowired
+    private MarketStrategyService marketStrategyService;
+    @Test
+    public void queryMarketStrategy() {
+       List<MarketStrategyVO> vos=marketStrategyService.queryMarketStrategy(null);
+       System.out.println(vos);
+    }
+}

+ 12 - 4
PCS/src/test/java/cn/cslg/permission/qiaobi/PayOrderSTest.java

@@ -1,12 +1,10 @@
 package cn.cslg.permission.qiaobi;
 
 import cn.cslg.permission.common.model.Records;
-import cn.cslg.permission.common.model.qiaobi.payOrder.PayOrderGroupByDTO;
-import cn.cslg.permission.common.model.qiaobi.payOrder.PayOrderGroupVO;
-import cn.cslg.permission.common.model.qiaobi.payOrder.PayOrderQueryDTO;
-import cn.cslg.permission.common.model.qiaobi.payOrder.PayOrderQueryVO;
+import cn.cslg.permission.common.model.qiaobi.payOrder.*;
 import cn.cslg.permission.domain.qiaobi.PayOrder;
 import cn.cslg.permission.mapper.qiaobi.PayOrderMapper;
+import cn.cslg.permission.service.qiaobi.FunctionUseRecordService;
 import cn.cslg.permission.service.qiaobi.PayOrderService;
 import org.junit.jupiter.api.Test;
 import org.junit.runner.RunWith;
@@ -23,6 +21,8 @@ public class PayOrderSTest {
     private PayOrderMapper payOrderMapper;
     @Autowired
     private PayOrderService payOrderService;
+    @Autowired
+    private FunctionUseRecordService functionUseRecordService;
 
     @Test
     public void testQueryPayOrder() {
@@ -41,4 +41,12 @@ public class PayOrderSTest {
         Records records = payOrderService.groupPayRecord(payOrderGroupByDTO);
         System.out.println(records);
     }
+
+    @Test
+    public void testFunctionUseRecord(){
+        FunctionRecordAddDTO functionRecordAddDTO =new FunctionRecordAddDTO();
+        functionRecordAddDTO.setFunctionId(264);
+        functionRecordAddDTO.setParameters("{asd}");
+        functionUseRecordService.addFunctionUseRecord(functionRecordAddDTO);
+    }
 }