Bladeren bron

1、增加企业权益相关修改

rayson 6 maanden geleden
bovenliggende
commit
1fea9c85aa
20 gewijzigde bestanden met toevoegingen van 470 en 92 verwijderingen
  1. 5 5
      citu-framework/citu-spring-boot-starter-protection/src/main/java/com/citu/framework/signature/config/CituApiSignatureAutoConfiguration.java
  2. 10 11
      citu-framework/citu-spring-boot-starter-protection/src/main/java/com/citu/framework/signature/core/aop/ApiSignatureAspect.java
  3. 10 0
      citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/controller/admin/luck/vo/prize/LuckPrizeDetailRespVO.java
  4. 40 0
      citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/controller/app/luck/AppLuckPrizeController.java
  5. 8 0
      citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/convert/luck/LuckPrizeConvert.java
  6. 10 0
      citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/dal/mysql/luck/LuckPrizeExtendMapper.java
  7. 3 1
      citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/dal/mysql/luck/LuckPrizeMapper.java
  8. 123 0
      citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/service/luck/LuckPrizeService.java
  9. 77 1
      citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/service/luck/LuckPrizeServiceImpl.java
  10. 2 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  11. 7 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/aop/VipEntitlementCheckAspect.java
  12. 34 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterpriseEntitlementSimpleReqVO.java
  13. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterprisePackageRespVO.java
  14. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterprisePackageSaveReqVO.java
  15. 7 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterpriseVipReqVO.java
  16. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterprisePackageDO.java
  17. 17 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseService.java
  18. 28 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseServiceImpl.java
  19. 8 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/vip/EnterpriseEntitlementService.java
  20. 70 71
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/vip/EnterpriseEntitlementServiceImpl.java

+ 5 - 5
citu-framework/citu-spring-boot-starter-protection/src/main/java/com/citu/framework/signature/config/CituApiSignatureAutoConfiguration.java

@@ -16,14 +16,14 @@ import org.springframework.data.redis.core.StringRedisTemplate;
 @AutoConfiguration(after = CituRedisAutoConfiguration.class)
 public class CituApiSignatureAutoConfiguration {
 
-//    @Bean
-//    public ApiSignatureAspect signatureAspect(ApiSignatureRedisDAO signatureRedisDAO, ErrorRecordApi errorRecordApi) {
-//        return new ApiSignatureAspect(signatureRedisDAO,errorRecordApi);
-//    }
+    @Bean
+    public ApiSignatureAspect signatureAspect(ApiSignatureRedisDAO signatureRedisDAO, ErrorRecordApi errorRecordApi) {
+        return new ApiSignatureAspect(signatureRedisDAO,errorRecordApi);
+    }
 
     @Bean
     public ApiSignatureAspect signatureAspect(ApiSignatureRedisDAO signatureRedisDAO) {
-        return new ApiSignatureAspect(signatureRedisDAO);
+        return new ApiSignatureAspect(signatureRedisDAO,null);
     }
 
     @Bean

+ 10 - 11
citu-framework/citu-spring-boot-starter-protection/src/main/java/com/citu/framework/signature/core/aop/ApiSignatureAspect.java

@@ -35,12 +35,9 @@ import static com.citu.framework.common.exception.enums.GlobalErrorCodeConstants
 @AllArgsConstructor
 public class ApiSignatureAspect {
 
+    private static final ThreadLocal<Map<String, Object>> recordThreadLocal = new ThreadLocal<>();
     private final ApiSignatureRedisDAO signatureRedisDAO;
-
-//    private final ErrorRecordApi errorRecordApi;
-
-    private static final ThreadLocal<Map<String,Object>> recordThreadLocal = new ThreadLocal<>();
-
+    private final ErrorRecordApi errorRecordApi;
 
     /**
      * 获取请求头加签参数 Map
@@ -87,11 +84,13 @@ public class ApiSignatureAspect {
             recordThreadLocal.remove();
             return;
         }
-//        errorRecordApi.create(ErrorRecordReqDTO.builder()
-//                .mark(ServletUtils.getRequest().getHeader(signature.timestamp()))
-//                .content(JSON.toJSONString(recordThreadLocal.get()))
-//                .build());
-        recordThreadLocal.remove();
+        if (null != errorRecordApi) {
+            errorRecordApi.create(ErrorRecordReqDTO.builder()
+                    .mark(ServletUtils.getRequest().getHeader(signature.timestamp()))
+                    .content(JSON.toJSONString(recordThreadLocal.get()))
+                    .build());
+            recordThreadLocal.remove();
+        }
 
         // 2. 验证不通过,抛出异常
         log.error("[beforePointCut][方法{} 参数({}) 签名失败]", joinPoint.getSignature().toString(),
@@ -182,7 +181,7 @@ public class ApiSignatureAspect {
 
         // 3. 检查 nonce 是否存在,有且仅能使用一次
         boolean result = signatureRedisDAO.getNonce(appId, nonce) == null;
-        if(!result) {
+        if (!result) {
             recordThreadLocal.get().put("reason", "signatureRedisDAO.getNonce(appId, nonce) != null");
         }
         return result;

+ 10 - 0
citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/controller/admin/luck/vo/prize/LuckPrizeDetailRespVO.java

@@ -3,9 +3,13 @@ package com.citu.module.promotion.controller.admin.luck.vo.prize;
 
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.citu.module.product.api.spu.dto.ProductSpuRespDTO;
+import com.citu.module.promotion.dal.dataobject.luck.LuckPrizeExtend;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.util.List;
+import java.util.Map;
+
 @Schema(description = "管理后台 - 幸运抽奖-奖品详情 Response VO")
 @Data
 @ExcelIgnoreUnannotated
@@ -14,7 +18,13 @@ public class LuckPrizeDetailRespVO extends LuckPrizeRespVO {
     @Schema(description = "商品信息", example = "30925")
     private ProductSpuRespDTO spu;
 
+    @Schema(description = "奖品扩展")
+    private LuckPrizeExtend extend;
+
     @Schema(description = "概率")
     private double probability;
 
+    @Schema(description = "子奖品")
+    private Map<String, List<LuckPrizeDetailRespVO>> children;
+
 }

+ 40 - 0
citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/controller/app/luck/AppLuckPrizeController.java

@@ -0,0 +1,40 @@
+package com.citu.module.promotion.controller.app.luck;
+
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.module.promotion.controller.admin.luck.vo.prize.LuckPrizeDetailRespVO;
+import com.citu.module.promotion.service.luck.LuckPrizeService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "用户 APP - 幸运抽奖-奖品")
+@RestController
+@RequestMapping("/promotion/luck-prize")
+@Validated
+public class AppLuckPrizeController {
+
+    @Resource
+    private LuckPrizeService luckPrizeService;
+
+
+    @GetMapping("/get/extend/area")
+    @Operation(summary = "根据活动id获取奖品区域信息")
+    public CommonResult<Map<String, List<LuckPrizeDetailRespVO>>>
+    getLuckPrizeExtendAreaMap(@RequestParam("lotteryId") Long lotteryId,
+                              @RequestParam(value = "type", required = false) String type,
+                              @RequestParam(value = "parentAreaId", required = false) Long parentAreaId) {
+        return success(luckPrizeService.getLuckPrizeExtendAreaMap(lotteryId, type, parentAreaId));
+    }
+
+}

+ 8 - 0
citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/convert/luck/LuckPrizeConvert.java

@@ -4,9 +4,13 @@ import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.promotion.controller.admin.luck.vo.prize.LuckPrizeDetailRespVO;
 import com.citu.module.promotion.controller.admin.luck.vo.prize.LuckPrizeRespVO;
 import com.citu.module.promotion.dal.dataobject.luck.LuckPrizeDO;
+import com.citu.module.promotion.dal.dataobject.luck.LuckPrizeExtend;
+import com.citu.module.promotion.dal.dataobject.luck.LuckPrizeExtendDO;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 
+import java.util.List;
+
 /**
  * 抽奖奖品 Convert
  *
@@ -22,4 +26,8 @@ public interface LuckPrizeConvert {
     LuckPrizeDetailRespVO convert2(LuckPrizeDO bean);
 
     PageResult<LuckPrizeDetailRespVO> convertPage(PageResult<LuckPrizeDO> page);
+
+    List<LuckPrizeDetailRespVO> convertList(List<LuckPrizeDO> list);
+
+    LuckPrizeExtend convertExtend(LuckPrizeExtendDO bean);
 }

+ 10 - 0
citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/dal/mysql/luck/LuckPrizeExtendMapper.java

@@ -1,9 +1,12 @@
 package com.citu.module.promotion.dal.mysql.luck;
 
 import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.citu.module.promotion.dal.dataobject.luck.LuckPrizeExtendDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * 幸运抽奖-奖品扩展 Mapper
  *
@@ -19,4 +22,11 @@ public interface LuckPrizeExtendMapper extends BaseMapperX<LuckPrizeExtendDO> {
     default int deleteByLuckPrizeId(Long luckPrizeId) {
         return delete(LuckPrizeExtendDO::getLuckPrizeId, luckPrizeId);
     }
+
+    default List<LuckPrizeExtendDO> selectByLuckPrizeIdList(List<Long> luckPrizeIdList) {
+        return selectList(new LambdaQueryWrapperX<LuckPrizeExtendDO>()
+                .in(LuckPrizeExtendDO::getLuckPrizeId, luckPrizeIdList)
+        );
+    }
+
 }

+ 3 - 1
citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/dal/mysql/luck/LuckPrizeMapper.java

@@ -37,10 +37,12 @@ public interface LuckPrizeMapper extends BaseMapperX<LuckPrizeDO> {
                 .orderByDesc(LuckPrizeDO::getSort)
         );
     }
-    default LuckPrizeDO selectByName(String name){
+
+    default LuckPrizeDO selectByName(String name) {
         return selectOne(new LambdaQueryWrapperX<LuckPrizeDO>()
                 .eq(LuckPrizeDO::getName, name)
         );
     }
 
+
 }

+ 123 - 0
citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/service/luck/LuckPrizeService.java

@@ -0,0 +1,123 @@
+package com.citu.module.promotion.service.luck;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.promotion.controller.admin.luck.vo.prize.LuckPrizeDetailRespVO;
+import com.citu.module.promotion.controller.admin.luck.vo.prize.LuckPrizeImportExcelVO;
+import com.citu.module.promotion.controller.admin.luck.vo.prize.LuckPrizePageReqVO;
+import com.citu.module.promotion.controller.admin.luck.vo.prize.LuckPrizeSaveReqVO;
+import com.citu.module.promotion.dal.dataobject.luck.LuckPrizeDO;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 幸运抽奖-奖品 Service 接口
+ *
+ * @author Rayson
+ */
+public interface LuckPrizeService {
+
+    /**
+     * 创建幸运抽奖-奖品
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createLuckPrize(@Valid LuckPrizeSaveReqVO createReqVO);
+
+    /**
+     * 更新幸运抽奖-奖品
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateLuckPrize(@Valid LuckPrizeSaveReqVO updateReqVO);
+
+    /**
+     * 删除幸运抽奖-奖品
+     *
+     * @param id 编号
+     */
+    void deleteLuckPrize(Long id);
+
+    /**
+     * 获得幸运抽奖-奖品
+     *
+     * @param id 编号
+     * @return 幸运抽奖-奖品
+     */
+    LuckPrizeDO getLuckPrize(Long id);
+
+    /**
+     * 获得幸运抽奖-奖品详情
+     *
+     * @param id 编号
+     * @return 幸运抽奖-奖品详情
+     */
+    LuckPrizeDetailRespVO detail(Long id);
+
+    /**
+     * 获得幸运抽奖-奖品分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 幸运抽奖-奖品分页
+     */
+    PageResult<LuckPrizeDO> getLuckPrizePage(LuckPrizePageReqVO pageReqVO);
+
+    /**
+     * 获得奖品列表
+     *
+     * @param lotteryId 抽奖活动id
+     * @return 奖品列表
+     */
+    List<LuckPrizeDO> getListByLotteryId(Long lotteryId);
+
+    /**
+     * 导入抽奖奖品数据
+     **/
+    void importData(List<LuckPrizeImportExcelVO> list);
+
+    /**
+     * 根据id对象更新
+     *
+     * @param luckPrizeDO 更新对象
+     */
+    void updateById(LuckPrizeDO luckPrizeDO);
+
+    /**
+     * 根据权重随机抽奖
+     *
+     * @param randomNumber 随机数
+     * @param luckPrizeList 奖品列表
+     * @return 奖品对象
+     */
+    LuckPrizeDO selectPrizeByWeight(int randomNumber, List<LuckPrizeDO> luckPrizeList);
+
+    /**
+     * 分页查询
+     *
+     * @param pageReqVO 分页查询
+     * @return 分页结果
+     */
+    PageResult<LuckPrizeDetailRespVO> page(LuckPrizePageReqVO pageReqVO);
+
+    /**
+     * 根据抽奖活动id查询
+     *
+     * @param lotteryId 抽奖活动id
+     * @return 分页结果
+     */
+    List<LuckPrizeDetailRespVO> getByLotteryId(Long lotteryId);
+
+    /**
+     * 获取奖品扩展区域分组
+     *
+     * @param lotteryId 活动id
+     * @param type 类型(province|city|district)
+     * @param areaId 区域id
+     * @return 奖品扩展区域
+     */
+    Map<String, List<LuckPrizeDetailRespVO>> getLuckPrizeExtendAreaMap(Long lotteryId, String type, Long areaId);
+
+}

+ 77 - 1
citu-module-mall/citu-module-promotion-biz/src/main/java/com/citu/module/promotion/service/luck/LuckPrizeServiceImpl.java

@@ -2,7 +2,6 @@ package com.citu.module.promotion.service.luck;
 
 
 import cn.hutool.core.collection.CollUtil;
-import com.alibaba.fastjson.JSON;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
@@ -28,7 +27,10 @@ import org.springframework.validation.annotation.Validated;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.module.promotion.enums.ErrorCodeConstants.*;
@@ -299,4 +301,78 @@ public class LuckPrizeServiceImpl implements LuckPrizeService {
         }
         return pageResult;
     }
+
+    @Override
+    public List<LuckPrizeDetailRespVO> getByLotteryId(Long lotteryId) {
+        // 获取奖品列表
+        List<LuckPrizeDetailRespVO> list =
+                LuckPrizeConvert.INSTANCE.convertList(luckPrizeMapper.getListByLotteryId(lotteryId));
+        if (CollUtil.isEmpty(list)) {
+            return list;
+        }
+
+        List<Long> luckPrizesId = list.stream().filter(item -> LuckPrizeTypeEnum.CUSTOM.getType().equals(item.getType()))
+                .map(LuckPrizeDetailRespVO::getId).collect(Collectors.toList());
+        if (CollUtil.isEmpty(luckPrizesId)) {
+            return list;
+        }
+        // 查询奖品扩展
+        List<LuckPrizeExtendDO> extendList = prizeExtendMapper.selectByLuckPrizeIdList(luckPrizesId);
+        for (LuckPrizeDetailRespVO resp : list) {
+            if (LuckPrizeTypeEnum.CUSTOM.getType().equals(resp.getType())) {
+                // 放入奖品扩展
+                extendList.stream().filter(item -> item.getLuckPrizeId().equals(resp.getId()))
+                        .findFirst().ifPresent(extend -> resp.setExtend(LuckPrizeConvert.INSTANCE.convertExtend(extend)));
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public Map<String, List<LuckPrizeDetailRespVO>> getLuckPrizeExtendAreaMap(Long lotteryId, String type, Long parentAreaId) {
+        List<LuckPrizeDetailRespVO> list = getByLotteryId(lotteryId);
+        Map<String, List<LuckPrizeDetailRespVO>> map = new LinkedHashMap<>();
+
+        if (null == type || "province".equals(type)) {
+            map.putAll(list.stream()
+                    .filter(luckPrizeDetailRespVO -> luckPrizeDetailRespVO.getExtend() != null)
+                    .filter(luckPrizeDetailRespVO -> luckPrizeDetailRespVO.getExtend().getProvinceName() != null)
+                    .collect(Collectors.groupingBy(k -> k.getExtend().getProvinceName())));
+        }
+
+        if ("city".equals(type)) {
+            if (null == parentAreaId) {
+                map.putAll(list.stream()
+                        .filter(luckPrizeDetailRespVO -> luckPrizeDetailRespVO.getExtend() != null)
+                        .filter(luckPrizeDetailRespVO -> luckPrizeDetailRespVO.getExtend().getCityName() != null)
+                        .collect(Collectors.groupingBy(k -> k.getExtend().getCityName())));
+            } else {
+                map.putAll(list.stream()
+                        .filter(luckPrizeDetailRespVO -> luckPrizeDetailRespVO.getExtend() != null)
+                        .filter(luckPrizeDetailRespVO -> parentAreaId.equals(luckPrizeDetailRespVO.getExtend().getProvinceId()))
+                        .filter(luckPrizeDetailRespVO -> luckPrizeDetailRespVO.getExtend().getCityName() != null)
+                        .collect(Collectors.groupingBy(k -> k.getExtend().getCityName())));
+            }
+        }
+
+        if ("district".equals(type)) {
+            if (null == parentAreaId) {
+                map.putAll(list.stream()
+                        .filter(luckPrizeDetailRespVO -> luckPrizeDetailRespVO.getExtend() != null)
+                        .filter(luckPrizeDetailRespVO -> luckPrizeDetailRespVO.getExtend().getDistrictName() != null)
+                        .collect(Collectors.groupingBy(k -> k.getExtend().getDistrictName())));
+            } else {
+                map.putAll(list.stream()
+                        .filter(luckPrizeDetailRespVO -> luckPrizeDetailRespVO.getExtend() != null)
+                        .filter(luckPrizeDetailRespVO -> parentAreaId.equals(luckPrizeDetailRespVO.getExtend().getCityId()))
+                        .filter(luckPrizeDetailRespVO -> luckPrizeDetailRespVO.getExtend().getDistrictName() != null)
+                        .collect(Collectors.groupingBy(k -> k.getExtend().getDistrictName())));
+            }
+        }
+
+        return map;
+
+
+    }
+
 }

+ 2 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java

@@ -214,6 +214,8 @@ public interface ErrorCodeConstants {
     ErrorCode MDE_ENTERPRISE_SCALE_NOT_NULL = new ErrorCode(1_100_019_008, "未选择人员规模");
     ErrorCode MDE_ENTERPRISE_WORK_TIME_NOT_NULL = new ErrorCode(1_100_019_009, "未填写上班时间");
 
+    ErrorCode MDE_ENTERPRISE_VIP_EXPIRED = new ErrorCode(1_100_019_010, "企业会员已过期,无法使用权益,请续期");
+
     // ========== 企业工商信息  1_100_020_001 ==========
     ErrorCode MDE_ENTERPRISE_BUSINESS_NOT_EXISTS = new ErrorCode(1_100_020_001, "企业工商信息不存在");
 

+ 7 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/aop/VipEntitlementCheckAspect.java

@@ -38,6 +38,7 @@ public class VipEntitlementCheckAspect {
     @Lazy
     private EnterpriseEntitlementService enterpriseEntitlementService;
 
+
     @DSTransactional
     @Around("@annotation(vipEntitlementCheck)")
     public Object around(ProceedingJoinPoint joinPoint, VipEntitlementCheck vipEntitlementCheck) {
@@ -82,9 +83,15 @@ public class VipEntitlementCheckAspect {
         }
         // 企业
         enterpriseId = LoginUserContext.getEnterpriseId();
+        // ========== start 如果会员过期则无法使用权益,不是会员可以使用权益(兼容购买套餐+单独购买次数的逻辑)  =========
+        // 获取权益
         EnterpriseEntitlementRespVO entitlementRespVO =
                 enterpriseEntitlementService.getByEnterpriseIdAndUserId(enterpriseId, userId);
 
+        // 过期会抛出异常,不过期则为false,不是vip也是false
+        enterpriseEntitlementService.checkVipExpired(enterpriseId);
+        // ========== end =========
+
         // 效验权限
         if (!StringUtils.hasText(type)) {
             // 没有权限

+ 34 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterpriseEntitlementSimpleReqVO.java

@@ -0,0 +1,34 @@
+package com.citu.module.menduner.system.controller.base.enterprise.vip;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 企业套餐简易信息 Request VO")
+@Data
+public class EnterpriseEntitlementSimpleReqVO {
+
+    @Schema(description = "是否激活vip  true=(增加vip标识和过期时间)", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    private Boolean activateVip = false;
+
+    // activateVip=true:套餐day天数+当前时间?null
+    @Schema(description = "vip过期时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    private LocalDateTime vipExpireDate;
+
+    @Schema(description = "发布职位数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "28736")
+    private Integer publishJobCount;
+
+    @Schema(description = "搜索人才的数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10204")
+    private Integer searchCount;
+
+    @Schema(description = "查看简历数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10204")
+    private Integer lookCvCount;
+
+    @Schema(description = "是否开启人才地图", requiredMode = Schema.RequiredMode.REQUIRED, example = "10204")
+    private Boolean personMap;
+
+    @Schema(description = "是否允许发布众聘职位", requiredMode = Schema.RequiredMode.REQUIRED, example = "10204")
+    private Boolean hireJob;
+
+}

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterprisePackageRespVO.java

@@ -25,6 +25,10 @@ public class EnterprisePackageRespVO {
     @ExcelProperty("套餐名称")
     private String name;
 
+    @Schema(description = "是否激活vip  true=(增加vip标识和过期时间)", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @ExcelProperty("是否激活vip  true=(增加vip标识和过期时间)")
+    private Boolean activateVip;
+
     @Schema(description = "套餐原价", requiredMode = Schema.RequiredMode.REQUIRED, example = "26254")
     @ExcelProperty("套餐原价")
     private Long originalPrice;

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterprisePackageSaveReqVO.java

@@ -21,6 +21,9 @@ public class EnterprisePackageSaveReqVO {
     @NotEmpty(message = "{1_100_053_002}")
     private String name;
 
+    @Schema(description = "是否激活vip  true=(增加vip标识和过期时间)", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    private Boolean activateVip = false;
+
     @Schema(description = "套餐原价", requiredMode = Schema.RequiredMode.REQUIRED, example = "26254")
     private Long originalPrice;
 

+ 7 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterpriseVipReqVO.java

@@ -10,7 +10,14 @@ public class EnterpriseVipReqVO {
     @Schema(description = "企业id")
     private Long enterpriseId;
 
+    // 不选套餐可以不填packageId
+    // 选择套餐则赋值给entitlement
     @Schema(description = "企业套餐")
     private Long packageId;
 
+    // 无论选不选套餐都要填entitlement
+    @Schema(description = "企业权益")
+    private EnterpriseEntitlementSimpleReqVO entitlement;
+
+
 }

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterprisePackageDO.java

@@ -35,6 +35,10 @@ public class EnterprisePackageDO extends TenantBaseDO {
      * 套餐名称
      */
     private String name;
+    /**
+     * 是否激活vip  true=(增加vip标识和过期时间)
+     */
+    private Boolean activateVip;
     /**
      * 套餐原价
      */

+ 17 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseService.java

@@ -7,7 +7,6 @@ import com.citu.module.menduner.system.controller.app.jobhunt.enterprise.vo.AppE
 import com.citu.module.menduner.system.controller.app.jobhunt.enterprise.vo.AppEnterpriseDetailRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.enterprise.vo.*;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
-import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseVipReqVO;
 import com.citu.module.menduner.system.controller.base.enterprise.vo.*;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
 
@@ -147,7 +146,9 @@ public interface EnterpriseService {
      **/
     Map<String, Object[]> getEnterpriseCount(TimeRangeBaseReqVO reqVO);
 
-    /** 获取没有开通vip的企业列表 **/
+    /**
+     * 获取没有开通vip的企业列表
+     **/
     List<EnterpriseDO> getNoVipEnterpriseList();
 
     // ========== 求职端 ==========
@@ -198,6 +199,20 @@ public interface EnterpriseService {
      * 修改vip
      **/
     void updateVip(Long id, String vipFlag, LocalDateTime vipExpireDate);
+
+    /**
+     * 检查是否vip
+     *  不过期则为false,不是vip也是false
+     * @param id 企业id
+     **/
+    boolean checkVip(Long id);
+
+    /**
+     * 检查vip是否过期
+     * 过期会抛出异常,不过期则为false,不是vip也是false
+     * @param id 企业id
+     **/
+    void checkVipExpired(Long id);
     // ========== 招聘端 ==========
 
     /**

+ 28 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseServiceImpl.java

@@ -3,6 +3,7 @@ package com.citu.module.menduner.system.service.enterprise;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
@@ -51,6 +52,7 @@ import static com.citu.framework.common.util.collection.CollectionUtils.convertS
 import static com.citu.module.menduner.common.util.TimeUtils.generateDateTimeRange;
 import static com.citu.module.menduner.system.enums.DictTypeConstants.*;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_ENTERPRISE_NOT_EXISTS;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_ENTERPRISE_VIP_EXPIRED;
 import static com.citu.module.menduner.system.util.RecruitAnalysisUtils.packBarCount;
 
 /**
@@ -389,7 +391,32 @@ public class EnterpriseServiceImpl implements EnterpriseService {
     @Override
     public void updateVip(Long id, String vipFlag, LocalDateTime vipExpireDate) {
         EnterpriseDO enterprise = validateEnterpriseExists(id);
-        enterpriseMapper.updateById(EnterpriseDO.builder().id(id).vipFlag(vipFlag).vipExpireDate(vipExpireDate).build());
+        // 解决 @TableField(strategy=FieldStrategy)不设置也能将字段设置为null的场景
+        enterpriseMapper.update(enterprise, new LambdaUpdateWrapper<EnterpriseDO>()
+                .set(EnterpriseDO::getVipFlag, vipFlag)
+                .set(EnterpriseDO::getVipExpireDate, vipExpireDate)
+                .eq(EnterpriseDO::getId, id)
+        );
+    }
+
+    @Override
+    public boolean checkVip(Long id) {
+        EnterpriseDO enterprise = validateEnterpriseExists(id);
+        if (null == enterprise.getVipExpireDate()) {
+            return false;
+        }
+        return enterprise.getVipExpireDate().isBefore(LocalDateTime.now());
+    }
+
+    @Override
+    public void checkVipExpired(Long id) {
+        EnterpriseDO enterprise = validateEnterpriseExists(id);
+        if (null == enterprise.getVipExpireDate()) {
+            return;
+        }
+        if (enterprise.getVipExpireDate().isBefore(LocalDateTime.now())) {
+            throw exception(MDE_ENTERPRISE_VIP_EXPIRED);
+        }
     }
 
     @Override

+ 8 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/vip/EnterpriseEntitlementService.java

@@ -80,4 +80,12 @@ public interface EnterpriseEntitlementService {
      * @return 企业权益记录
      */
     List<EnterpriseEntitlementRespVO>  getListByEnterpriseId(Long enterpriseId);
+
+    /**
+     * 验证企业vip是否过期
+     * 过期会抛出异常,不过期则为false,不是vip也是false
+     * @param enterpriseId 企业编号
+     * @return 是否过期
+     */
+    void checkVipExpired(Long enterpriseId);
 }

+ 70 - 71
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/vip/EnterpriseEntitlementServiceImpl.java

@@ -12,7 +12,6 @@ import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseEntitlemen
 import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
 import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
 import org.springframework.stereotype.Service;
-import org.springframework.util.StringUtils;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
@@ -161,89 +160,89 @@ public class EnterpriseEntitlementServiceImpl implements EnterpriseEntitlementSe
     @Override
     @DSTransactional
     public void activateVip(EnterpriseVipReqVO reqVO) {
+        if (null == reqVO.getEntitlement()) {
+            throw exception(ENTERPRISE_ENTITLEMENT_NOT_EXISTS);
+        }
         EnterpriseDO enterprise = enterpriseService.getEnterprise(reqVO.getEnterpriseId());
-        EnterprisePackageDO packageDO = enterprisePackageService.getEnterprisePackage(reqVO.getPackageId());
-        // 不算今天
-        long day = packageDO.getDay() + 1;
-
-        if (!StringUtils.hasText(enterprise.getVipFlag())) {
-            // 没有开过会员
-            enterprise.setVipFlag(String.valueOf(packageDO.getId()));
-            enterprise.setVipExpireDate(LocalDateTime.now().plusDays(day));
-        } else {
-            // 开过会员
-            if (isExpired(enterprise.getVipExpireDate())) {
-                // 过期值覆盖
-                enterprise.setVipFlag(String.valueOf(packageDO.getId()));
-                // 不算今天
-                enterprise.setVipExpireDate(LocalDateTime.now().plusDays(day));
-            } else {
-                // 没有过期
-                //  累加时间,如果当前权益大于user.getVipFlag()则覆盖,并且累加时间
-                // TODO 不允许小于当前权益
-                Long currentVipFlag = Long.parseLong(enterprise.getVipFlag());
-                Long newVipFlag = packageDO.getId();
-
-                if (currentVipFlag == Long.parseLong(enterprise.getVipFlag())) {
-                    // 买一样的,加天数
-                    enterprise.setVipExpireDate(enterprise.getVipExpireDate().plusDays(day));
-                } else if (newVipFlag > currentVipFlag) {
-                    // 新套餐大于套餐
-                    enterprise.setVipFlag(String.valueOf(packageDO.getId()));
-                    enterprise.setVipExpireDate(enterprise.getVipExpireDate().plusDays(day));
-                } else {
-                    // 新套餐小于套餐
-                    return;
-                }
-            }
+        EnterprisePackageDO packageDO = null;
+        if (null != reqVO.getPackageId()) {
+            packageDO = enterprisePackageService.getEnterprisePackage(reqVO.getPackageId());
         }
-        // 修改会员
-        enterpriseService.updateVip(enterprise.getId(), enterprise.getVipFlag(), enterprise.getVipExpireDate());
-
+        // 更新vip标识
+        updateVipFlag(packageDO, enterprise, reqVO.getEntitlement());
         // 找出管理员
         EnterpriseUserBindDO userBind = enterpriseBindService.getByEnterpriseAdmin(enterprise.getId());
-        if (enterpriseBindService.checkIsAdmin(userBind)) {
-            // 管理员
+        // 是否管理员
+        if (!enterpriseBindService.checkIsAdmin(userBind)) {
+            // 没有管理员的企业
+            throw exception(ENTERPRISE_ENTITLEMENT_NOT_EXISTS);
+        }
 
-            // 查询权益
-            EnterpriseEntitlementDO enterpriseEntitlement = mapper.selectOne(EnterpriseEntitlementDO::getEnterpriseId,
-                    userBind.getEnterpriseId(), EnterpriseEntitlementDO::getUserId, userBind.getUserId());
-            if (null == enterpriseEntitlement) {
-                // 新增
-                EnterpriseEntitlementDO insert = EnterpriseEntitlementDO.builder()
-                        .enterpriseId(userBind.getEnterpriseId())
-                        .userId(userBind.getUserId())
-                        .publishJobCount(packageDO.getPublishJobCount())
-                        .searchCount(packageDO.getSearchCount())
-                        .lookCvCount(packageDO.getLookCvCount())
-                        .personMap(packageDO.getPersonMap())
-                        .hireJob(packageDO.getHireJob())
-                        .build();
-
-                mapper.insert(insert);
-            } else {
-                // 修改
-                EnterpriseEntitlementDO update = EnterpriseEntitlementDO.builder()
-                        .id(enterpriseEntitlement.getId())
-                        .enterpriseId(userBind.getEnterpriseId())
-                        .userId(userBind.getUserId())
-                        .publishJobCount(enterpriseEntitlement.getPublishJobCount() + packageDO.getPublishJobCount())
-                        .searchCount(enterpriseEntitlement.getSearchCount() + packageDO.getSearchCount())
-                        .lookCvCount(enterpriseEntitlement.getLookCvCount() + packageDO.getLookCvCount())
-                        // 覆盖
-                        .personMap(packageDO.getPersonMap())
-                        .hireJob(packageDO.getHireJob())
-                        .build();
-                mapper.updateById(update);
-            }
+        // 查询权益
+        EnterpriseEntitlementDO enterpriseEntitlement = mapper.selectOne(EnterpriseEntitlementDO::getEnterpriseId,
+                userBind.getEnterpriseId(), EnterpriseEntitlementDO::getUserId, userBind.getUserId());
+        if (null == enterpriseEntitlement) {
+            // 新增权益
+            EnterpriseEntitlementDO insert = EnterpriseEntitlementDO.builder()
+                    .enterpriseId(userBind.getEnterpriseId())
+                    .userId(userBind.getUserId())
+                    .publishJobCount(reqVO.getEntitlement().getPublishJobCount())
+                    .searchCount(reqVO.getEntitlement().getSearchCount())
+                    .lookCvCount(reqVO.getEntitlement().getLookCvCount())
+                    .personMap(reqVO.getEntitlement().getPersonMap())
+                    .hireJob(reqVO.getEntitlement().getHireJob())
+                    .build();
 
+            mapper.insert(insert);
+        } else {
+            // 修改权益
+            EnterpriseEntitlementDO update = EnterpriseEntitlementDO.builder()
+                    .id(enterpriseEntitlement.getId())
+                    .enterpriseId(userBind.getEnterpriseId())
+                    .userId(userBind.getUserId())
+//                    .publishJobCount(enterpriseEntitlement.getPublishJobCount() + reqVO.getEntitlement().getPublishJobCount())
+//                    .searchCount(enterpriseEntitlement.getSearchCount() + reqVO.getEntitlement().getSearchCount())
+//                    .lookCvCount(enterpriseEntitlement.getLookCvCount() + reqVO.getEntitlement().getLookCvCount())
+                    .publishJobCount(reqVO.getEntitlement().getPublishJobCount())
+                    .searchCount(reqVO.getEntitlement().getSearchCount())
+                    .lookCvCount(reqVO.getEntitlement().getLookCvCount())
+                    // 覆盖
+                    .personMap(reqVO.getEntitlement().getPersonMap())
+                    .hireJob(reqVO.getEntitlement().getHireJob())
+                    .build();
+            mapper.updateById(update);
         }
 
+    }
+
+    /**
+     * 更新vip标识
+     **/
+    public void updateVipFlag(EnterprisePackageDO packageDO,
+                              EnterpriseDO enterprise,
+                              EnterpriseEntitlementSimpleReqVO entitlement) {
+        if (!entitlement.getActivateVip()) {
+            // 不更新标识
+            // 移除覆盖
+            enterpriseService.updateVip(enterprise.getId(), null, null);
+            return;
+        }
+        // 自定义的权益标识
+        String vipFlag = "99999";
+        enterprise.setVipFlag(null != packageDO ? String.valueOf(packageDO.getId()) : vipFlag);
+        enterprise.setVipExpireDate(entitlement.getVipExpireDate());
 
+        // 修改会员
+        enterpriseService.updateVip(enterprise.getId(), enterprise.getVipFlag(), enterprise.getVipExpireDate());
     }
 
     @Override
     public List<EnterpriseEntitlementRespVO> getListByEnterpriseId(Long enterpriseId) {
         return BeanUtils.toBean(mapper.selectListByEnterpriseId(enterpriseId), EnterpriseEntitlementRespVO.class);
     }
+
+    @Override
+    public void checkVipExpired(Long enterpriseId) {
+        enterpriseService.checkVipExpired(enterpriseId);
+    }
 }