记得上下班打卡 | git大法好,push需谨慎

Commit d177891c authored by zhangguobing's avatar zhangguobing

~api:券商品业务-发放券标记关联人信息;

parent d9d8b739
...@@ -38,4 +38,8 @@ public class CandyRedisConst { ...@@ -38,4 +38,8 @@ public class CandyRedisConst {
* </value> * </value>
*/ */
public static final String BASIC_COMMON_COUPON = PREFIX.concat("basic:common_coupon"); public static final String BASIC_COMMON_COUPON = PREFIX.concat("basic:common_coupon");
/**
* 发放券操作人-券类商品下单
*/
public static final String OPERATOR_MGT_COUPON_BY_SKU = "COUPON_SKU";
} }
...@@ -251,10 +251,10 @@ public class GoblinStoreMgtGoodsCouponAddParam implements Serializable { ...@@ -251,10 +251,10 @@ public class GoblinStoreMgtGoodsCouponAddParam implements Serializable {
GoblinGoodsSkuInfoVo skuInfoVo = GoblinGoodsSkuInfoVo.getNew(); GoblinGoodsSkuInfoVo skuInfoVo = GoblinGoodsSkuInfoVo.getNew();
GoblinStoreMgtGoodsCouponAddSkuParam addSkuParam = this.getSkuParam(); GoblinStoreMgtGoodsCouponAddSkuParam addSkuParam = this.getSkuParam();
{// 券信息设置 {// 券信息设置
skuInfoVo.setIsTrueName(null == addSkuParam.getIsTrueName() ? 1 : addSkuParam.getIsTrueName());// 券类商品默认需要实名登记 skuInfoVo.setIsTrueName(null == addSkuParam.getIsTrueName() ? 1 : Integer.valueOf(addSkuParam.getIsTrueName()));// 券类商品默认需要实名登记
skuInfoVo.setBusiType(1);// 业务类别暂时只支持演出 skuInfoVo.setBusiType(1);// 业务类别暂时只支持演出
skuInfoVo.setCouType(1);// 券类型暂时只支持代金券 skuInfoVo.setCouType(1);// 券类型暂时只支持代金券
skuInfoVo.setUseScope(addSkuParam.getUseScope()); skuInfoVo.setUseScope(Integer.valueOf(addSkuParam.getUseScope()));
skuInfoVo.setValFace(addSkuParam.getValFace()); skuInfoVo.setValFace(addSkuParam.getValFace());
skuInfoVo.setValidity(-1); skuInfoVo.setValidity(-1);
skuInfoVo.setEffectAt(DateUtil.Formatter.yyyyMMddHHmmss.parse(addSkuParam.getEffectTime())); skuInfoVo.setEffectAt(DateUtil.Formatter.yyyyMMddHHmmss.parse(addSkuParam.getEffectTime()));
......
...@@ -78,10 +78,10 @@ public class GoblinStoreMgtGoodsCouponAddSkuParam implements Serializable { ...@@ -78,10 +78,10 @@ public class GoblinStoreMgtGoodsCouponAddSkuParam implements Serializable {
@ApiModelProperty(position = 28, required = true, value = "是否实名[0-否|1-是,表示该商品需要实名关联]", allowableValues = "0,1", example = "1") @ApiModelProperty(position = 28, required = true, value = "是否实名[0-否|1-是,表示该商品需要实名关联]", allowableValues = "0,1", example = "1")
@Pattern(regexp = "\\b(0|1)\\b", message = "参数'是否实名'无效") @Pattern(regexp = "\\b(0|1)\\b", message = "参数'是否实名'无效")
private Integer isTrueName; private String isTrueName;
@ApiModelProperty(position = 29, required = true, value = "适用范围[101-音乐节|102-小型演出(livehouse演出)|103-巡演]", allowableValues = "101,102,103", example = "101") @ApiModelProperty(position = 29, required = true, value = "适用范围[101-音乐节|102-小型演出(livehouse演出)|103-巡演]", allowableValues = "101,102,103", example = "101")
@Pattern(regexp = "\\b(101|102|103)\\b", message = "参数'适用范围'无效") @Pattern(regexp = "\\b(101|102|103)\\b", message = "参数'适用范围'无效")
private Integer useScope; private String useScope;
@ApiModelProperty(position = 30, required = true, value = "面值", example = "99.00") @ApiModelProperty(position = 30, required = true, value = "面值", example = "99.00")
@Digits(integer = 3, fraction = 2, message = "参数'面值'无效") @Digits(integer = 3, fraction = 2, message = "参数'面值'无效")
@DecimalMin(value = "0.01", message = "参数'面值'必须为大于0") @DecimalMin(value = "0.01", message = "参数'面值'必须为大于0")
......
...@@ -30,6 +30,7 @@ public class CandyUserCouponBasicDto implements Serializable, Cloneable { ...@@ -30,6 +30,7 @@ public class CandyUserCouponBasicDto implements Serializable, Cloneable {
private Integer overlay; private Integer overlay;
private Integer overlayLevel; private Integer overlayLevel;
private Integer validity; private Integer validity;
private Integer isTrueName;
private Integer redeemValidity; private Integer redeemValidity;
private LocalDateTime redeemStart; private LocalDateTime redeemStart;
private LocalDateTime redeemStop; private LocalDateTime redeemStop;
...@@ -60,6 +61,9 @@ public class CandyUserCouponBasicDto implements Serializable, Cloneable { ...@@ -60,6 +61,9 @@ public class CandyUserCouponBasicDto implements Serializable, Cloneable {
/* com.liquidnet.service.candy.entity.CandyCommonCoupon */ /* com.liquidnet.service.candy.entity.CandyCommonCoupon */
private String ccouponId; private String ccouponId;
private Integer idType;
private String idName;
private String idNo;
private static final CandyUserCouponBasicDto obj = new CandyUserCouponBasicDto(); private static final CandyUserCouponBasicDto obj = new CandyUserCouponBasicDto();
...@@ -89,6 +93,7 @@ public class CandyUserCouponBasicDto implements Serializable, Cloneable { ...@@ -89,6 +93,7 @@ public class CandyUserCouponBasicDto implements Serializable, Cloneable {
this.setOverlay(coupon.getOverlay()); this.setOverlay(coupon.getOverlay());
this.setOverlayLevel(coupon.getOverlayLevel()); this.setOverlayLevel(coupon.getOverlayLevel());
this.setValidity(coupon.getValidity()); this.setValidity(coupon.getValidity());
this.setIsTrueName(coupon.getIsTrueName());
this.setRedeemValidity(coupon.getRedeemValidity()); this.setRedeemValidity(coupon.getRedeemValidity());
this.setRedeemStart(coupon.getRedeemStart()); this.setRedeemStart(coupon.getRedeemStart());
this.setRedeemStop(coupon.getRedeemStop()); this.setRedeemStop(coupon.getRedeemStop());
......
package com.liquidnet.service.candy.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 券关联适用人信息
* </p>
*
* @author liquidnet
* @since 2024-01-26
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class CandyUserCouponAssoc implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* ~candy_user_coupon.ucoupon_id
*/
private String ucouponId;
/**
* 关联人证件类型:1-大陆身份证,2-港澳通行证,3-台胞证,4-护照,5-军官证
*/
private Integer idType;
/**
* 关联人姓名
*/
private String idName;
/**
* 关联人证件号码
*/
private String idNo;
private String comment;
}
package com.liquidnet.service.candy.mapper;
import com.liquidnet.service.candy.entity.CandyUserCouponAssoc;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 券关联适用人信息 Mapper 接口
* </p>
*
* @author liquidnet
* @since 2024-01-26
*/
public interface CandyUserCouponAssocMapper extends BaseMapper<CandyUserCouponAssoc> {
}
<?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="com.liquidnet.service.candy.mapper.CandyUserCouponAssocMapper">
</mapper>
...@@ -13,6 +13,7 @@ import com.liquidnet.service.base.ResponseDto; ...@@ -13,6 +13,7 @@ import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping; import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.UserPathDto; import com.liquidnet.service.base.UserPathDto;
import com.liquidnet.service.base.constant.MQConst; import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.candy.constant.CandyRedisConst;
import com.liquidnet.service.dragon.constant.DragonConstant; import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto; import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto; import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
...@@ -290,6 +291,8 @@ public class GoblinOrderServiceImpl implements IGoblinOrderService { ...@@ -290,6 +291,8 @@ public class GoblinOrderServiceImpl implements IGoblinOrderService {
throw new LiquidnetServiceException("-1", "军官证号不合规"); throw new LiquidnetServiceException("-1", "军官证号不合规");
} }
break; break;
default:
throw new LiquidnetServiceException("-1", "无效证件类型,请重新选择");
} }
orderSkuParamMap.put(skuParam.getSkuId(), skuParam); orderSkuParamMap.put(skuParam.getSkuId(), skuParam);
} }
...@@ -931,7 +934,8 @@ public class GoblinOrderServiceImpl implements IGoblinOrderService { ...@@ -931,7 +934,8 @@ public class GoblinOrderServiceImpl implements IGoblinOrderService {
storeOrder.setStatus(GoblinStatusConst.Status.ORDER_STATUS_4.getValue()); storeOrder.setStatus(GoblinStatusConst.Status.ORDER_STATUS_4.getValue());
orderSkuVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_4.getValue()); orderSkuVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_4.getValue());
// 券类商品创建发放券任务 // 券类商品创建发放券任务
initCandyMgtCouponObjs.add(new Object[]{IDGenerator.nextMilliId(), orderSkuVo.getSkuId(), orderVo.getUserMobile(), now, "COUPON_SKU", now}); initCandyMgtCouponObjs.add(new Object[]{orderSkuVo.getOrderSkuId(), orderSkuVo.getSkuId(),
orderVo.getUserMobile(), now, CandyRedisConst.OPERATOR_MGT_COUPON_BY_SKU, now});
} else { } else {
orderSkuVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_2.getValue()); orderSkuVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_2.getValue());
} }
......
...@@ -17,6 +17,8 @@ import com.liquidnet.service.candy.dto.CandyCouponRuleDto; ...@@ -17,6 +17,8 @@ import com.liquidnet.service.candy.dto.CandyCouponRuleDto;
import com.liquidnet.service.candy.dto.CandyUserCouponBasicDto; import com.liquidnet.service.candy.dto.CandyUserCouponBasicDto;
import com.liquidnet.service.candy.entity.*; import com.liquidnet.service.candy.entity.*;
import com.liquidnet.service.candy.mapper.CandyCouponMapper; import com.liquidnet.service.candy.mapper.CandyCouponMapper;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.dto.vo.GoblinOrderSkuVo;
import com.liquidnet.service.platform.service.impl.adam.PlatformAdamUserMemberService; import com.liquidnet.service.platform.service.impl.adam.PlatformAdamUserMemberService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
...@@ -27,9 +29,8 @@ import org.springframework.util.CollectionUtils; ...@@ -27,9 +29,8 @@ import org.springframework.util.CollectionUtils;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.*;
import java.util.Base64; import java.util.stream.Collectors;
import java.util.List;
@Slf4j @Slf4j
@Service @Service
...@@ -41,6 +42,8 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C ...@@ -41,6 +42,8 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
@Autowired @Autowired
private PlatformCandyUserCouponService platformCandyUserCouponService; private PlatformCandyUserCouponService platformCandyUserCouponService;
@Autowired @Autowired
private PlatformCandyUserCouponAssocService platformCandyUserCouponAssocService;
@Autowired
private PlatformCandyCommonCouponService platformCandyCommonCouponService; private PlatformCandyCommonCouponService platformCandyCommonCouponService;
@Autowired @Autowired
private PlatformAdamUserMemberService platformAdamUserMemberService; private PlatformAdamUserMemberService platformAdamUserMemberService;
...@@ -300,7 +303,6 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C ...@@ -300,7 +303,6 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
* @param couponRuleDtoList List<CandyCouponRuleDto> * @param couponRuleDtoList List<CandyCouponRuleDto>
*/ */
private void processForUserCoupon(CandyMgtCoupon mgtCoupon, CandyCoupon coupon, List<CandyCouponRuleDto> couponRuleDtoList) { private void processForUserCoupon(CandyMgtCoupon mgtCoupon, CandyCoupon coupon, List<CandyCouponRuleDto> couponRuleDtoList) {
List<CandyUserCoupon> initUserCouponList = new ArrayList<>();
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
String eventLimit = mgtCoupon.getEventLimit(); String eventLimit = mgtCoupon.getEventLimit();
...@@ -309,6 +311,7 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C ...@@ -309,6 +311,7 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
log.info("发放券处理中:{}-目标指定手机号[总数:{},发放量:{}]", mgtCoupon.getMcouponId(), limitSize, eventAmt); log.info("发放券处理中:{}-目标指定手机号[总数:{},发放量:{}]", mgtCoupon.getMcouponId(), limitSize, eventAmt);
AbstractRedisUtil redisAdamUtil = redisDataSourceUtil.getRedisAdamUtil(); AbstractRedisUtil redisAdamUtil = redisDataSourceUtil.getRedisAdamUtil();
AbstractRedisUtil redisGoblinUtil = redisDataSourceUtil.getRedisGoblinUtil();
if (coupon.getBindType() == 2) {// 券领取方式[2-积分商品],实际发放至用户时计算有效期 if (coupon.getBindType() == 2) {// 券领取方式[2-积分商品],实际发放至用户时计算有效期
coupon.setEffectAt(now); coupon.setEffectAt(now);
...@@ -324,6 +327,9 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C ...@@ -324,6 +327,9 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
// 指定手机号发放券中,会员权益券失效时间duedAt需要同步会员到期时间expiryAt // 指定手机号发放券中,会员权益券失效时间duedAt需要同步会员到期时间expiryAt
Integer exclusively = mgtCoupon.getExclusively(); Integer exclusively = mgtCoupon.getExclusively();
boolean isMemberRightsCoupon = exclusively == 1; boolean isMemberRightsCoupon = exclusively == 1;
List<CandyUserCoupon> initUserCouponList = new ArrayList<>();
List<CandyUserCouponAssoc> initUserCouponAssocList = new ArrayList<>();
for (int i = 0; i < eventAmt; i++) { for (int i = 0; i < eventAmt; i++) {
for (String r : eventLimitArr) { for (String r : eventLimitArr) {
String uid = (String) redisAdamUtil.get(AdamRedisConst.IDENTITY_MOBILE.concat(r)); String uid = (String) redisAdamUtil.get(AdamRedisConst.IDENTITY_MOBILE.concat(r));
...@@ -353,6 +359,23 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C ...@@ -353,6 +359,23 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
log.warn("发放券处理中:{}-目标指定手机号,该券生效日期或失效日期无效[couponId:{},effectAt:{},expireAt:{}]", mcouponId, couponId, couponEffectAt, couponExpireAt); log.warn("发放券处理中:{}-目标指定手机号,该券生效日期或失效日期无效[couponId:{},effectAt:{},expireAt:{}]", mcouponId, couponId, couponEffectAt, couponExpireAt);
continue; continue;
} }
// 判定为券类商品支付后发放券业务&&需要关联实名人时,提取关联人信息绑定到用户券信息中
if (Objects.equals(mgtCoupon.getEventDriven(), 0)
&& Objects.equals(operator, CandyRedisConst.OPERATOR_MGT_COUPON_BY_SKU)
&& Objects.equals(coupon.getIsTrueName(), 1)) {
GoblinOrderSkuVo goblinOrderSkuVo = (GoblinOrderSkuVo) redisGoblinUtil.get(GoblinRedisConst.REDIS_GOBLIN_ORDER_SKU.concat(mgtCoupon.getMcouponId()));
if (!Objects.isNull(goblinOrderSkuVo)) {
CandyUserCouponAssoc userCouponAssoc = new CandyUserCouponAssoc();
userCouponAssoc.setUcouponId(userCoupon.getUcouponId());
userCouponAssoc.setIdType(goblinOrderSkuVo.getIdType());
userCouponAssoc.setIdName(goblinOrderSkuVo.getIdName());
userCouponAssoc.setIdNo(goblinOrderSkuVo.getIdNo());
initUserCouponAssocList.add(userCouponAssoc);
} else {
log.warn("");
}
}
userCoupon.setOperator(operator); userCoupon.setOperator(operator);
userCoupon.setCreatedAt(now); userCoupon.setCreatedAt(now);
...@@ -366,6 +389,13 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C ...@@ -366,6 +389,13 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
AbstractRedisUtil redisCandyUtil = redisDataSourceUtil.getRedisCandyUtil(); AbstractRedisUtil redisCandyUtil = redisDataSourceUtil.getRedisCandyUtil();
if (!initUserCouponList.isEmpty()) { if (!initUserCouponList.isEmpty()) {
if (platformCandyUserCouponService.saveBatch(initUserCouponList)) { if (platformCandyUserCouponService.saveBatch(initUserCouponList)) {
Map<String, CandyUserCouponAssoc> userCouponAssocMap;
if (!initUserCouponAssocList.isEmpty()) {
platformCandyUserCouponAssocService.saveBatch(initUserCouponAssocList);
userCouponAssocMap = initUserCouponAssocList.stream().collect(Collectors.toMap(CandyUserCouponAssoc::getUcouponId, t -> t));
} else {
userCouponAssocMap = null;
}
initUserCouponList.forEach(r -> { initUserCouponList.forEach(r -> {
String uckey = CandyRedisConst.BASIC_USER_COUPON.concat(r.getUid()); String uckey = CandyRedisConst.BASIC_USER_COUPON.concat(r.getUid());
...@@ -374,7 +404,17 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C ...@@ -374,7 +404,17 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
if (CollectionUtils.isEmpty(vos)) { if (CollectionUtils.isEmpty(vos)) {
vos = new ArrayList<>(); vos = new ArrayList<>();
} }
vos.add(CandyUserCouponBasicDto.getNew().copy(r, coupon, couponRuleDtoList)); CandyUserCouponBasicDto userCouponBasicDto = CandyUserCouponBasicDto.getNew().copy(r, coupon, couponRuleDtoList);
if (Objects.equals(userCouponBasicDto.getIsTrueName(), 1) && !Objects.isNull(userCouponAssocMap)) {
CandyUserCouponAssoc userCouponAssoc = userCouponAssocMap.get(r.getUcouponId());
if (!Objects.isNull(userCouponAssoc)) {
userCouponBasicDto.setIdType(userCouponAssoc.getIdType());
userCouponBasicDto.setIdName(userCouponAssoc.getIdName());
userCouponBasicDto.setIdNo(userCouponAssoc.getIdNo());
}
}
vos.add(userCouponBasicDto);
redisCandyUtil.set(uckey, vos); redisCandyUtil.set(uckey, vos);
}); });
......
package com.liquidnet.service.platform.service.impl.candy;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.service.candy.entity.CandyUserCouponAssoc;
import com.liquidnet.service.candy.mapper.CandyUserCouponAssocMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class PlatformCandyUserCouponAssocService extends ServiceImpl<CandyUserCouponAssocMapper, CandyUserCouponAssoc> {
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment