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

Commit 6c7fe5c6 authored by jiangxiulong's avatar jiangxiulong

Merge remote-tracking branch 'origin/jxl_1201_jifenDraw' into pre

parents 7e6a3ade 9530a0a7
......@@ -174,7 +174,7 @@ create table candy_mgt_coupon
coupon_id varchar(64) not null comment '~candy_coupon.coupon_id',
state tinyint comment '发放状态[0-未发放|1-已发放|2-无效|3-已取消|9-发放中|10-会员礼包初始模版]',
# bind_type smallint comment '领取方式[0-用户输入兑换|1-发放至用户|2-积分兑换]',
# bind_type smallint comment '领取方式[0-用户输入兑换|1-发放至用户|2-积分商品]',
event_amt int comment '发放量',
event_type tinyint comment '发放类型[0-保留|1-会员|2-手机号|10-全体用户]',
event_limit text comment '`发放类型`为2-手机号时发放手机号以,分隔',
......@@ -203,7 +203,7 @@ create table candy_coupon
exclusive smallint comment '专享标识[0-常规|1-会员礼包]',
busi_type smallint comment '业务类别[0-全场|1-演出|2-商品|3-优先购]',
cou_type smallint comment '券类型[1-代金券|2-满减券|3-兑换券|4-折扣券|101-优先券]',
bind_type smallint comment '领取方式[0-用户输入兑换|1-发放至用户|2-积分兑换]',
bind_type smallint comment '领取方式[0-用户输入兑换|1-发放至用户|2-积分商品]',
discount decimal(8, 2) comment '折扣[8折即0.8]',
val_face decimal(8, 2) comment '面值',
......
......@@ -54,7 +54,7 @@ public class AdamRedisConst {
public static final String INCR_MEMBER_NO = PREFIX.concat("incr:member_no");
public static final String INCR_MEMBER_LIMITATION = PREFIX.concat("incr:member_limitation");
public static final String SWITCH_BUY_MEMBER = PREFIX.concat("switch:buy:member");
// public static final String SWITCH_BUY_MEMBER = PREFIX.concat("switch:buy:member");
public static final String SERIAL_NUMBER_MEMBER = PREFIX.concat("serial_no:");
......
......@@ -41,7 +41,7 @@ public class CandyMemberCouponBuildParam {
@ApiModelProperty(required = true, value = "券类型[1-代金券|2-满减券|101-优先券]", allowableValues = "1,2,101")
private Integer couType;
// @NotNull(message = "券领取方式不能为空")
// @ApiModelProperty(required = true, value = "领取方式[0-用户输入兑换|1-发放至用户|2-积分兑换|3-发放需领取|4-会员专属]", allowableValues = "0,1,2,3,4")
// @ApiModelProperty(required = true, value = "领取方式[0-用户输入兑换|1-发放至用户|2-积分商品|3-发放需领取|4-会员专属]", allowableValues = "0,1,2,3,4")
// private Integer bindType;
// @ApiModelProperty(required = false, value = "折扣[8折即0.8]", example = "0.8")
// private BigDecimal discount;
......
......@@ -23,7 +23,7 @@ public class CandyCouponBasicVo implements Serializable, Cloneable {
private Integer busiType;
@ApiModelProperty(value = "券类型[1-代金券|2-满减券|3-兑换券|4-折扣券 | 101-优先券]")
private Integer couType;
@ApiModelProperty(value = "[0-用户输入兑换|1-发放至用户|2-积分兑换|3-发放需领取|4-会员专属]")
@ApiModelProperty(value = "[0-用户输入兑换|1-发放至用户|2-积分商品|3-发放需领取|4-会员专属]")
private Integer bindType;
@ApiModelProperty(value = "折扣")
private BigDecimal discount;
......
package com.liquidnet.service.candy.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel
public class CandyCouponPreviewVo implements Serializable, Cloneable {
/* --- --- --- CandyCoupon */
private String couponId;
@ApiModelProperty(value = "标题")
private String title;
@ApiModelProperty(value = "标注")
private String label;
@ApiModelProperty(value = "须知")
private String notice;
@ApiModelProperty(value = "业务类别[0-全场|1-演出|2-商品|3-优先购]")
private Integer busiType;
@ApiModelProperty(value = "券类型[1-代金券|2-满减券|3-兑换券|4-折扣券 | 101-优先券]")
private Integer couType;
@ApiModelProperty(value = "[0-用户输入兑换|1-发放至用户|2-积分商品|3-发放需领取|4-会员专属]")
private Integer bindType;
@ApiModelProperty(value = "折扣")
private BigDecimal discount;
@ApiModelProperty(value = "面值")
private BigDecimal valFace;
@ApiModelProperty(value = "满减~满")
private BigDecimal valOver;
@ApiModelProperty(value = "满减~减")
private BigDecimal valMinus;
@ApiModelProperty(value = "有效天数")
private Integer validity;
@ApiModelProperty(value = "兑换有效天数")
private Integer redeemValidity;
/* --- --- --- CandyCouponRule */
private List<CandyCouponRulesVo> useRules;
private static final CandyCouponPreviewVo obj = new CandyCouponPreviewVo();
public static CandyCouponPreviewVo getNew() {
try {
return (CandyCouponPreviewVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new CandyCouponPreviewVo();
}
}
}
......@@ -29,7 +29,7 @@ public class CandyCouponVo implements Serializable, Cloneable {
private Integer busiType;
@ApiModelProperty(value = "券类型[1-代金券|2-满减券|3-兑换券|4-折扣券 | 101-优先券]",example = "1")
private Integer couType;
@ApiModelProperty(value = "[0-用户输入兑换|1-发放至用户|2-积分兑换|3-发放需领取|4-会员专属]",example = "1")
@ApiModelProperty(value = "[0-用户输入兑换|1-发放至用户|2-积分商品|3-发放需领取|4-会员专属]",example = "1")
private Integer bindType;
@ApiModelProperty(value = "折扣 可null",example = "0.5")
private BigDecimal discount;
......
......@@ -35,6 +35,11 @@
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-service-candy-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
package com.liquidnet.service.sweet.constant;
/**
* <p>
* sweet表状态常量定义
* </p>
*
* @author jiangxiulong
* @since 2021-12-03
*/
public class StatusConst {
// 积分抽奖 奖品类型 1积分 2优惠券 3实物 4登登登VIP 5优先购买券
public static final Integer PRIZE_TYPE1 = 1;
public static final Integer PRIZE_TYPE2 = 2;
public static final Integer PRIZE_TYPE3 = 3;
public static final Integer PRIZE_TYPE4 = 4;
public static final Integer PRIZE_TYPE5 = 5;
}
......@@ -30,14 +30,15 @@ public class SweetConstant {
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_LIST = "sweet:integralActivity:list";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_INFO = "sweet:integralActivity:activityId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_NUM = "sweet:integralActivity:prizeNum:activityId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_WINNERS_NUM = "sweet:integralActivity:prizeWinnersNum:activityId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_ID = ":prizeId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_ALL_LIST = "sweet:integralActivity:Draw:activityId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER = "sweet:integralActivity:Draw:activityId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_IN_USER = "sweet:integralActivity:DrawIn:activityId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER_KEY = ":userId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_INFO = "sweet:integralActivity:DrawInfo:drawId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_LOCK = "sweet:integralActivity:lock:userId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM = "sweet:integralActivity:estimatedNum:activityId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_TOTAL_PRIZE_NUM = "sweet:integralActivity:totalPrizeNum:activityId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_BLACK = "sweet:integralActivity:drawBlack";
// 答题活动
public final static String REDIS_KEY_SWEET_ANSWER_PHONE = "sweet:answer:phone:";
// 城市投票活动
......
......@@ -50,6 +50,10 @@ public class SweetIntegralActivityFromParam implements Serializable, Cloneable {
@NotNull(message = "activityNum不能为空")
private Integer activityNum;
@ApiModelProperty(required = true, value = "预估玩此活动的总人数", example = "1")
@NotNull(message = "estimatedNum不能为空")
private Integer estimatedNum;
@ApiModelProperty(required = true, value = "活动时间类型 1长期 2开始结束时间", example = "1")
@NotNull(message = "timeType不能为空") @Min(value = 1, message = "timeType无效") @Max(value = 2, message = "timeType无效")
private Integer timeType;
......@@ -68,6 +72,10 @@ public class SweetIntegralActivityFromParam implements Serializable, Cloneable {
@NotBlank(message = "activityTitle不能为空")
private String activityRules;
@ApiModelProperty(required = true, value = "概率公示", example = "这里是概率公示")
@NotBlank(message = "probabilityPublicity不能为空")
private String probabilityPublicity;
@ApiModelProperty(required = true, value = "是否上线 1未上线 2已上线", example = "2")
@NotNull(message = "isOnline不能为空") @Min(value = 1, message = "isOnline无效") @Max(value = 2, message = "isOnline无效")
private Integer isOnline;
......@@ -95,6 +103,7 @@ public class SweetIntegralActivityFromParam implements Serializable, Cloneable {
sweetIntegralActivity.setActivityImg(source.getActivityImg());
sweetIntegralActivity.setActivityType(source.getActivityType());
sweetIntegralActivity.setActivityNum(source.getActivityNum());
sweetIntegralActivity.setEstimatedNum(source.getEstimatedNum());
sweetIntegralActivity.setTimeType(source.getTimeType());
if (null != source.getStartTime() && !source.getStartTime().isEmpty()) {
LocalDateTime startTime = DateUtil.Formatter.yyyyMMddHHmmss.parse(source.getStartTime());
......@@ -106,6 +115,7 @@ public class SweetIntegralActivityFromParam implements Serializable, Cloneable {
}
sweetIntegralActivity.setExpressFeeType(source.getExpressFeeType());
sweetIntegralActivity.setActivityRules(source.getActivityRules());
sweetIntegralActivity.setProbabilityPublicity(source.getProbabilityPublicity());
sweetIntegralActivity.setIsOnline(source.getIsOnline());
return sweetIntegralActivity;
}
......
......@@ -35,6 +35,9 @@ public class SweetIntegralActivityPrizeFormParam implements Serializable,Cloneab
@NotBlank(message = "prizeTitle不能为空")
private String prizeTitle;
@ApiModelProperty(required = false, value = "奖品描述", example = "奖品描述")
private String prizeDescribe;
@ApiModelProperty(required = true, value = "初始展示奖品图片", example = "test.png")
@NotBlank(message = "prizeImgInit不能为空")
private String prizeImgInit;
......@@ -43,23 +46,20 @@ public class SweetIntegralActivityPrizeFormParam implements Serializable,Cloneab
@NotBlank(message = "prizeImgSelect不能为空")
private String prizeImgSelect;
@ApiModelProperty(required = true, value = "奖品类型 1谢谢惠顾 2积分 3代金券 4满减券 5优先购买券 6实物", example = "1")
@ApiModelProperty(required = true, value = "奖品类型 1积分 2优惠券 3实物 4登登登VIP 5优先购买券", example = "1")
@NotNull(message = "prizeType不能为空")
private Integer prizeType;
@ApiModelProperty(required = false, value = "单次奖励数量如积分 中奖给多少物", example = "1")
private Integer prizeTypeNum;
@ApiModelProperty(value = "关联id 如商品id 券id 选择奖品的时候必传", example = "429803743878963206506461")
private String relationId;
@ApiModelProperty(required = true, value = "奖品数量", example = "100")
@NotNull(message = "prizeNum不能为空")
private Integer prizeNum;
@ApiModelProperty(required = true, value = "限制的中奖人数", example = "10")
@NotNull(message = "winnersNum不能为空")
private Integer winnersNum;
@ApiModelProperty(required = true, value = "是否是无限库存 1有限库存 2无限库存", example = "1")
@NotNull(message = "isInfinite不能为空")
private Integer isInfinite;
@ApiModelProperty(required = true, value = "中奖概率", example = "1")
@NotNull(message = "winningProbability不能为空")
......@@ -81,13 +81,13 @@ public class SweetIntegralActivityPrizeFormParam implements Serializable,Cloneab
sweetIntegralActivityPrize.setIntegralActivityId(source.getIntegralActivityId());
sweetIntegralActivityPrize.setPrizeId(source.getPrizeId());
sweetIntegralActivityPrize.setPrizeTitle(source.getPrizeTitle());
sweetIntegralActivityPrize.setPrizeDescribe(source.getPrizeDescribe());
sweetIntegralActivityPrize.setPrizeImgInit(source.getPrizeImgInit());
sweetIntegralActivityPrize.setPrizeImgSelect(source.getPrizeImgSelect());
sweetIntegralActivityPrize.setPrizeType(source.getPrizeType());
sweetIntegralActivityPrize.setPrizeTypeNum(source.getPrizeTypeNum());
sweetIntegralActivityPrize.setRelationId(source.getRelationId());
sweetIntegralActivityPrize.setPrizeNum(source.getPrizeNum());
sweetIntegralActivityPrize.setWinnersNum(source.getWinnersNum());
sweetIntegralActivityPrize.setIsInfinite(source.getIsInfinite());
sweetIntegralActivityPrize.setWinningProbability(source.getWinningProbability());
return sweetIntegralActivityPrize;
}
......
package com.liquidnet.service.sweet.dto.param.admin;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrizeRelation;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* <p>
* SweetIntegralActivityPrizeRelationFormParam
* </p>
*
* @author jiangxiulong
* @since 2021-12-02
*/
@Data
@ApiModel(value = "SweetIntegralActivityPrizeRelationFormParam", description = "积分活动创建奖品入参")
public class SweetIntegralActivityPrizeRelationFormParam implements Serializable, Cloneable {
private static final long serialVersionUID = -4381851476183020667L;
@ApiModelProperty(value = "活动主键id", example = "429803743878963206506461")
@NotBlank(message = "integralActivityId不能为空")
private String integralActivityId;
@ApiModelProperty(value = "奖品主键id", example = "429803743878963206506461")
@NotBlank(message = "prizeId不能为空")
private String prizeId;
@ApiModelProperty(value = "券id", example = "429803743878963206506461")
@NotBlank(message = "couponId不能为空")
private String couponId;
@ApiModelProperty(value = "券名称", example = "优惠券")
@NotBlank(message = "couponTitle不能为空")
private String couponTitle;
private static final SweetIntegralActivityPrizeRelationFormParam obj = new SweetIntegralActivityPrizeRelationFormParam();
public static SweetIntegralActivityPrizeRelationFormParam getNew() {
try {
return (SweetIntegralActivityPrizeRelationFormParam) obj.clone();
} catch (CloneNotSupportedException e) {
return new SweetIntegralActivityPrizeRelationFormParam();
}
}
public SweetIntegralActivityPrizeRelation copy(SweetIntegralActivityPrizeRelationFormParam source) {
SweetIntegralActivityPrizeRelation activityPrizeRelation = SweetIntegralActivityPrizeRelation.getNew();
if (null == source) return null;
activityPrizeRelation.setPrizeId(source.getPrizeId());
activityPrizeRelation.setCouponId(source.getCouponId());
activityPrizeRelation.setCouponTitle(source.getCouponTitle());
return activityPrizeRelation;
}
}
\ No newline at end of file
......@@ -29,7 +29,7 @@ public class IntegralActivityDrawVo implements Serializable, Cloneable {
@ApiModelProperty(value = "奖品名称")
private String prizeTitle;
@ApiModelProperty(value = "奖品类型 1谢谢惠顾 2积分 3代金券 4满减券 5优先购买券 6实物")
@ApiModelProperty(value = "奖品类型 1积分 2优惠券 3实物 4登登登VIP 5优先购买券惠顾 2积分 3代金券 4满减券 5优先购买券 6实物")
private Integer prizeType;
@ApiModelProperty(value = "关联id 如商品id 券id")
......@@ -65,15 +65,15 @@ public class IntegralActivityDrawVo implements Serializable, Cloneable {
@ApiModelProperty(value = "adam收货人详细地址")
private String receivingAddress;
@ApiModelProperty(value = "发放状态 1未发放 2已发放 3无需发放")
@ApiModelProperty(value = "发放状态 1未发放 2已发放")
private Integer receivingStatus;
@ApiModelProperty(value = "创建时间")
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
// @JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime createdAt;
@ApiModelProperty(value = "更新时间")
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
// @JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime updatedAt;
@ApiModelProperty(value = "快递费用类型 1包邮 2到付")
......
package com.liquidnet.service.sweet.dto.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class IntegralActivityPrizeApiVo implements Serializable, Cloneable {
private static final long serialVersionUID = -303399210433737206L;
@ApiModelProperty(value = "奖品id")
private String prizeId;
@ApiModelProperty(value = "关联活动id")
private String integralActivityId;
@ApiModelProperty(value = "抽奖id")
private String drawId;
@ApiModelProperty(value = "奖品名称")
private String prizeTitle;
@ApiModelProperty(value = "奖品描述")
private String prizeDescribe;
@ApiModelProperty(value = "初始展示奖品图片")
private String prizeImgInit;
@ApiModelProperty(value = "中奖选中奖品图片")
private String prizeImgSelect;
@ApiModelProperty(value = "奖品类型 1积分 2优惠券 3实物 4登登登VIP 5优先购买券")
private Integer prizeType;
@ApiModelProperty(value = "单次奖励数量如积分 中奖给多少物")
private Integer prizeTypeNum;
private static final IntegralActivityPrizeApiVo obj = new IntegralActivityPrizeApiVo();
public static IntegralActivityPrizeApiVo getNew() {
try {
return (IntegralActivityPrizeApiVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new IntegralActivityPrizeApiVo();
}
}
public IntegralActivityPrizeApiVo copy(IntegralActivityPrizeVo source) {
if (null == this) return this;
this.setIntegralActivityId(source.getIntegralActivityId());
this.setPrizeId(source.getPrizeId());
this.setIntegralActivityId(source.getIntegralActivityId());
this.setPrizeTitle(source.getPrizeTitle());
this.setPrizeDescribe(source.getPrizeDescribe());
this.setPrizeImgInit(source.getPrizeImgInit());
this.setPrizeImgSelect(source.getPrizeImgSelect());
this.setPrizeType(source.getPrizeType());
this.setPrizeTypeNum(source.getPrizeTypeNum());
return this;
}
}
package com.liquidnet.service.sweet.dto.vo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrizeRelation;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class IntegralActivityPrizeRelationVo implements Serializable, Cloneable {
private static final long serialVersionUID = -303399210433737206L;
@ApiModelProperty(value = "prize_relation_id")
private String prizeRelationId;
@ApiModelProperty(value = "prize_id")
private String prizeId;
@ApiModelProperty(value = "券id")
private String couponId;
@ApiModelProperty(value = "券名称")
private String couponTitle;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createdAt;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updatedAt;
private static final IntegralActivityPrizeRelationVo obj = new IntegralActivityPrizeRelationVo();
public static IntegralActivityPrizeRelationVo getNew() {
try {
return (IntegralActivityPrizeRelationVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new IntegralActivityPrizeRelationVo();
}
}
public IntegralActivityPrizeRelationVo copy(SweetIntegralActivityPrizeRelation source) {
if (null == this) return this;
this.setPrizeRelationId(source.getPrizeRelationId());
this.setPrizeId(source.getPrizeId());
this.setCouponId(source.getCouponId());
this.setCouponTitle(source.getCouponTitle());
this.setCreatedAt(source.getCreatedAt());
this.setUpdatedAt(source.getUpdatedAt());
return this;
}
}
package com.liquidnet.service.sweet.dto.vo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrize;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class IntegralActivityPrizeVo implements Serializable, Cloneable {
private static final long serialVersionUID = -303399210433737206L;
@ApiModelProperty(value = "奖品id")
private String prizeId;
@ApiModelProperty(value = "关联活动id")
private String integralActivityId;
@ApiModelProperty(value = "奖品名称")
private String prizeTitle;
@ApiModelProperty(value = "奖品描述")
private String prizeDescribe;
@ApiModelProperty(value = "初始展示奖品图片")
private String prizeImgInit;
@ApiModelProperty(value = "中奖选中奖品图片")
private String prizeImgSelect;
@ApiModelProperty(value = "奖品类型 1积分 2优惠券 3实物 4登登登VIP 5优先购买券")
private Integer prizeType;
@ApiModelProperty(value = "单次奖励数量如积分 中奖给多少物")
private Integer prizeTypeNum;
@ApiModelProperty(value = "奖品数量")
private Integer prizeNum;
@ApiModelProperty(value = "是否是无限库存 1有限库存 2无限")
private Integer isInfinite;
@ApiModelProperty(value = "中奖概率")
private BigDecimal winningProbability;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createdAt;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updatedAt;
@ApiModelProperty(value = "券列表")
private List<IntegralActivityPrizeRelationVo> prizeRelationList;
private static final IntegralActivityPrizeVo obj = new IntegralActivityPrizeVo();
public static IntegralActivityPrizeVo getNew() {
try {
return (IntegralActivityPrizeVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new IntegralActivityPrizeVo();
}
}
public IntegralActivityPrizeVo copy(SweetIntegralActivityPrize source) {
if (null == this) return this;
this.setIntegralActivityId(source.getIntegralActivityId());
this.setPrizeId(source.getPrizeId());
this.setIntegralActivityId(source.getIntegralActivityId());
this.setPrizeTitle(source.getPrizeTitle());
this.setPrizeDescribe(source.getPrizeDescribe());
this.setPrizeImgInit(source.getPrizeImgInit());
this.setPrizeImgSelect(source.getPrizeImgSelect());
this.setPrizeType(source.getPrizeType());
this.setPrizeTypeNum(source.getPrizeTypeNum());
this.setPrizeNum(source.getPrizeNum());
this.setIsInfinite(source.getIsInfinite());
this.setWinningProbability(source.getWinningProbability());
this.setCreatedAt(source.getCreatedAt());
this.setUpdatedAt(source.getUpdatedAt());
return this;
}
}
package com.liquidnet.service.sweet.dto.vo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivity;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrize;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -29,6 +28,9 @@ public class IntegralActivityVo implements Serializable, Cloneable {
@ApiModelProperty(value = "活动玩一次所需积分")
private Integer activityNum;
@ApiModelProperty(value = "预估玩此活动的总人数")
private Integer estimatedNum;
@ApiModelProperty(value = "活动时间类型 1长期 2开始结束时间")
private Integer timeType;
......@@ -44,6 +46,9 @@ public class IntegralActivityVo implements Serializable, Cloneable {
@ApiModelProperty(value = "活动规则")
private String activityRules;
@ApiModelProperty(value = "概率公示")
private String probabilityPublicity;
@ApiModelProperty(value = "是否上线 1未上线 2已上线")
private Integer isOnline;
......@@ -54,7 +59,13 @@ public class IntegralActivityVo implements Serializable, Cloneable {
private LocalDateTime updatedAt;
@ApiModelProperty(value = "奖品列表")
private List<SweetIntegralActivityPrize> prizeList;
private List<IntegralActivityPrizeVo> prizeList;
@ApiModelProperty(value = "奖品列表 积分、券")
private List<IntegralActivityPrizeVo> prizeList1;
@ApiModelProperty(value = "奖品列表 实物、会员、优先购买券")
private List<IntegralActivityPrizeVo> prizeList2;
private static final IntegralActivityVo obj = new IntegralActivityVo();
public static IntegralActivityVo getNew() {
......@@ -72,11 +83,13 @@ public class IntegralActivityVo implements Serializable, Cloneable {
this.setActivityImg(source.getActivityImg());
this.setActivityType(source.getActivityType());
this.setActivityNum(source.getActivityNum());
this.setEstimatedNum(source.getEstimatedNum());
this.setTimeType(source.getTimeType());
this.setStartTime(source.getStartTime());
this.setEndTime(source.getEndTime());
this.setExpressFeeType(source.getExpressFeeType());
this.setActivityRules(source.getActivityRules());
this.setProbabilityPublicity(source.getProbabilityPublicity());
this.setIsOnline(source.getIsOnline());
this.setCreatedAt(source.getCreatedAt());
this.setUpdatedAt(source.getUpdatedAt());
......
......@@ -35,26 +35,26 @@ public class SweetIntegralActivityPrizeVo implements Serializable, Cloneable {
@ApiModelProperty(value = "奖品名称")
private String prizeTitle;
@ApiModelProperty(value = "奖品描述")
private String prizeDescribe;
@ApiModelProperty(required = true, value = "初始展示奖品图片")
private String prizeImgInit;
@ApiModelProperty(required = true, value = "中奖选中奖品图片")
private String prizeImgSelect;
@ApiModelProperty(value = "奖品类型 1谢谢惠顾 2积分 3代金券 4满减券 5优先购买券 6实物")
@ApiModelProperty(value = "奖品类型 1积分 2优惠券 3实物 4登登登VIP 5优先购买券")
private Integer prizeType;
@ApiModelProperty(value = "单次奖励数量如积分 中奖给多少物")
private Integer prizeTypeNum;
@ApiModelProperty(value = "关联id 如商品id 券id")
private String relationId;
@ApiModelProperty(value = "奖品数量")
private Integer prizeNum;
@ApiModelProperty(value = "限制的中奖人数")
private Integer winnersNum;
@ApiModelProperty(value = "是否是无限库存 1有限库存 2无限")
private Integer isInfinite;
@ApiModelProperty(value = "中奖概率")
private BigDecimal winningProbability;
......@@ -85,13 +85,13 @@ public class SweetIntegralActivityPrizeVo implements Serializable, Cloneable {
this.setPrizeId(source.getPrizeId());
this.setIntegralActivityId(source.getIntegralActivityId());
this.setPrizeTitle(source.getPrizeTitle());
this.setPrizeDescribe(source.getPrizeDescribe());
this.setPrizeImgInit(source.getPrizeImgInit());
this.setPrizeImgSelect(source.getPrizeImgSelect());
this.setPrizeType(source.getPrizeType());
this.setPrizeTypeNum(source.getPrizeTypeNum());
this.setRelationId(source.getRelationId());
this.setPrizeNum(source.getPrizeNum());
this.setWinnersNum(source.getWinnersNum());
this.setIsInfinite(source.getIsInfinite());
this.setWinningProbability(source.getWinningProbability());
this.setCreatedAt(source.getCreatedAt());
this.setUpdatedAt(source.getUpdatedAt());
......
......@@ -41,6 +41,9 @@ public class SweetIntegralActivityVo implements Serializable, Cloneable {
@ApiModelProperty(value = "活动玩一次所需积分")
private Integer activityNum;
@ApiModelProperty(value = "预估玩此活动的总人数")
private Integer estimatedNum;
@ApiModelProperty(value = "活动时间类型 1长期 2开始结束时间")
private Integer timeType;
......@@ -56,6 +59,9 @@ public class SweetIntegralActivityVo implements Serializable, Cloneable {
@ApiModelProperty(value = "活动规则")
private String activityRules;
@ApiModelProperty(value = "概率公示")
private String probabilityPublicity;
@ApiModelProperty(value = "是否上线 1未上线 2已上线")
private Integer isOnline;
......@@ -87,11 +93,13 @@ public class SweetIntegralActivityVo implements Serializable, Cloneable {
this.setActivityImg(source.getActivityImg());
this.setActivityType(source.getActivityType());
this.setActivityNum(source.getActivityNum());
this.setEstimatedNum(source.getEstimatedNum());
this.setTimeType(source.getTimeType());
this.setStartTime(DateUtil.Formatter.yyyyMMddHHmmss.format(source.getStartTime()));
this.setEndTime(DateUtil.Formatter.yyyyMMddHHmmss.format(source.getEndTime()));
this.setExpressFeeType(source.getExpressFeeType());
this.setActivityRules(source.getActivityRules());
this.setProbabilityPublicity(source.getProbabilityPublicity());
this.setIsOnline(source.getIsOnline());
this.setCreatedAt(source.getCreatedAt());
this.setUpdatedAt(source.getUpdatedAt());
......
package com.liquidnet.service.sweet.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@ApiModel(value = "SweetStoneIntegralParam", description = "添加减少积分入参")
@Data
public class SweetStoneIntegralParam implements Serializable {
private static final long serialVersionUID = 561985919908406636L;
@ApiModelProperty(required = true, value = "用户id", example = "34657843445")
private String uid;
@ApiModelProperty(required = true, value = "积分数量", example = "100")
private Integer score;
@ApiModelProperty(required = true, value = "描述", example = "抽奖加积分")
private String content;
@ApiModelProperty(required = true, value = "增减积分", example = "1增积分 2减积分")
private Integer type;
private static final SweetStoneIntegralParam obj = new SweetStoneIntegralParam();
public static SweetStoneIntegralParam getNew() {
try {
return (SweetStoneIntegralParam) obj.clone();
} catch (CloneNotSupportedException e) {
return new SweetStoneIntegralParam();
}
}
}
package com.liquidnet.service.sweet.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.candy.vo.CandyCouponPreviewVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityDrawVo;
import com.liquidnet.service.sweet.dto.vo.admin.SweetIntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeApiVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
......@@ -19,13 +20,17 @@ import java.util.List;
*/
public interface ISweetIntegralActivityDrawService extends IService<SweetIntegralActivityDraw> {
ResponseDto<SweetIntegralActivityPrizeVo> create(String integralActivityId);
ResponseDto<IntegralActivityPrizeApiVo> create(String integralActivityId);
ResponseDto<PagedResult<IntegralActivityDrawVo>> drawList(Integer type, String integralActivityId, Integer pageNum);
ResponseDto<PagedResult<IntegralActivityDrawVo>> drawList(String integralActivityId, Integer pageNum);
ResponseDto<List<IntegralActivityDrawVo>> winPrizeUser(String integralActivityId);
ResponseDto perfectAddress(String drawId, String receivingAddressesId);
ResponseDto<IntegralActivityDrawVo> detail(String drawId);
ResponseDto collectCoupon(String couponId, String drawId);
ResponseDto<List<CandyCouponPreviewVo>> couponList(String prizeId, String integralActivityId);
}
......@@ -20,4 +20,8 @@ public interface ISweetIntegralActivityService extends IService<SweetIntegralAct
ResponseDto<List<IntegralActivityVo>> getList();
ResponseDto<IntegralActivityVo> detail(String integralActivityId);
ResponseDto setDrawAllList(String integralActivityId);
ResponseDto drawBlack(String uidS);
}
......@@ -2,8 +2,8 @@ package com.liquidnet.service.sweet.utils;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityDrawVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.admin.SweetIntegralActivityPrizeVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrize;
import java.util.ArrayList;
......@@ -11,6 +11,7 @@ import java.util.LinkedList;
public class SweetNewObjectUtil {
private static final ArrayList<SweetIntegralActivityPrizeVo> sweetIntegralActivityPrizeVoArrayList = new ArrayList<>();
private static final ArrayList<IntegralActivityPrizeVo> integralActivityPrizeVoArrayList = new ArrayList<>();
private static final ArrayList<SweetIntegralActivityPrize> sweetIntegralActivityPrizeArrayList = new ArrayList<>();
private static final LinkedList<IntegralActivityDrawVo> sweetIntegralActivityDrawVoLinkedList = new LinkedList<>();
private static final PagedResult<IntegralActivityDrawVo> sweetIntegralActivityDrawVoPagedResult = new PagedResult<>();
......@@ -31,4 +32,8 @@ public class SweetNewObjectUtil {
return (ArrayList<SweetIntegralActivityPrize>) sweetIntegralActivityPrizeArrayList.clone();
}
public static ArrayList<IntegralActivityPrizeVo> getIntegralActivityPrizeVoArrayList() {
return (ArrayList<IntegralActivityPrizeVo>) integralActivityPrizeVoArrayList.clone();
}
}
......@@ -56,13 +56,23 @@ public class BaseController
PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
{
// if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
// {
// String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
PageHelper.startPage(pageNum, pageSize, orderBy);
// PageHelper.startPage(pageNum, pageSize, orderBy);
// }
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
} else {
PageHelper.startPage(1, 10, orderBy);
pageNum = 1;
pageSize = 10;
}
if (StringUtils.isEmpty(orderBy)) {
PageHelper.startPage(pageNum, pageSize);
} else {
PageHelper.startPage(pageNum, pageSize, orderBy);
}
}
......
......@@ -3,12 +3,16 @@ package com.liquidnet.client.admin.web.controller.zhengzai.candy;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.liquidnet.client.admin.common.core.controller.BaseController;
import com.liquidnet.client.admin.common.core.domain.AjaxResult;
import com.liquidnet.client.admin.common.core.page.PageDomain;
import com.liquidnet.client.admin.common.core.page.TableDataInfo;
import com.liquidnet.client.admin.common.core.page.TableSupport;
import com.liquidnet.client.admin.common.utils.StringUtils;
import com.liquidnet.client.admin.common.utils.sql.SqlUtil;
import com.liquidnet.client.admin.zhengzai.candy.service.ICandyCouponAdminService;
import com.liquidnet.client.admin.zhengzai.candy.service.ICandyCouponRuleAdminService;
import com.liquidnet.service.candy.dto.admin.CandyCouponFilterDto;
import com.liquidnet.service.candy.dto.admin.CandyCouponListParam;
import com.liquidnet.service.candy.dto.admin.CandyCouponTemplateDto;
import com.liquidnet.service.candy.entity.CandyCoupon;
......@@ -17,7 +21,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
......@@ -25,8 +28,6 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
......@@ -44,47 +45,32 @@ public class CandyCouponAdminController extends BaseController {
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = false, dataType = "Integer", name = "busiType", value = "业务类别[0-全场|1-演出|2-商品|3-优先购]"),
@ApiImplicitParam(type = "form", required = false, dataType = "Integer", name = "couType", value = "券类型[1-代金券|2-满减券|3-兑换券|4-折扣券|101-优先券]"),
@ApiImplicitParam(type = "form", required = false, dataType = "String", name = "bindType", value = "领取方式[0-用户输入兑换|1-发放至用户|2-积分兑换|3-发放需领取|4-会员专属],多种方式则以,分隔入参"),
@ApiImplicitParam(type = "form", required = false, dataType = "String", name = "keyword", value = "搜索关键字"),
@ApiImplicitParam(type = "form", required = false, dataType = "String", name = "bindType", value = "领取方式[0-用户输入兑换|1-发放至用户|2-积分商品|3-发放需领取|4-会员专属],多种方式则以,分隔入参"),
@ApiImplicitParam(type = "form", required = false, dataType = "String", name = "keyword", value = "搜索关键字[支持检索标题title、描述notice、适用描述busiName]"),
})
@PostMapping("list")
@ResponseBody
public TableDataInfo list(CandyCouponListParam listParam) {
LambdaQueryWrapper<CandyCoupon> queryWrapper = Wrappers.lambdaQuery(CandyCoupon.class);
queryWrapper.eq(CandyCoupon::getState, 1);
queryWrapper.select(CandyCoupon::getCouponId, CandyCoupon::getTitle);
queryWrapper.orderByDesc(CandyCoupon::getCreatedAt);
if (null != listParam) {
if (StringUtils.isNotBlank(listParam.getKeyword())) {
queryWrapper.like(CandyCoupon::getTitle, listParam.getKeyword());
}
if (null != listParam.getBusiType()) {
queryWrapper.eq(CandyCoupon::getBusiType, listParam.getBusiType());
}
if (null != listParam.getCouType()) {
queryWrapper.eq(CandyCoupon::getCouType, listParam.getCouType());
}
// if (null != listParam.getBindType()) {
// queryWrapper.eq(CandyCoupon::getBindType, listParam.getBindType());
// }
if (null != listParam.getBindType() && Pattern.matches("^[\\d,]*$", listParam.getBindType())) {
String[] bindTypeArr = listParam.getBindType().split(",");
if (bindTypeArr.length > 0) {
queryWrapper.in(CandyCoupon::getBindType, Arrays.stream(bindTypeArr).toArray());
String bindType = listParam.getBindType();
if (StringUtils.isNotEmpty(bindType) && !Pattern.matches("^[\\d,]*$", bindType)) {
listParam.setBindType(null);
}
PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
if (com.liquidnet.client.admin.common.utils.StringUtils.isNotNull(pageNum) && com.liquidnet.client.admin.common.utils.StringUtils.isNotNull(pageSize)) {
} else {
pageNum = 1;
pageSize = 10;
}
if (StringUtils.isEmpty(orderBy)) {
PageHelper.startPage(pageNum, pageSize, "cc.created_at desc");
} else {
PageHelper.startPage(pageNum, pageSize, orderBy);
}
startPage();
List<CandyCoupon> list = candyCouponAdminService.list(queryWrapper);
TableDataInfo dataTable = getDataTable(list);
List<CandyCouponFilterDto> dtoList = new ArrayList<>();
list.forEach(r -> {
dtoList.add(CandyCouponFilterDto.getNew().copy(r));
});
dataTable.setRows(dtoList);
return dataTable;
return getDataTable(candyCouponAdminService.listForCouponFilterDto(listParam));
}
@ApiOperation(value = "券详情")
......
......@@ -287,7 +287,7 @@ public class CandyMgtCouponAdminController extends BaseController {
// }
// }
switch (buildParam.getBindType()) {// 领取方式[0-用户输入兑换|1-发放至用户|2-积分兑换|3-发放需领取|4-会员专属]
switch (buildParam.getBindType()) {// 领取方式[0-用户输入兑换|1-发放至用户|2-积分商品|3-发放需领取|4-会员专属]
case 0:
buildParam.setEventType(0);
buildParam.setEventLimit(null);
......@@ -303,8 +303,8 @@ public class CandyMgtCouponAdminController extends BaseController {
}
}
break;
case 4:// 新增券领取类型(4-会员专属)处理逻辑同(2-积分兑换
case 2:// TODO: 2021/11/9 PM上线前临时加的券领取类型(2-积分兑换
case 4:// 新增券领取类型(4-会员专属)处理逻辑同(2-积分商品
case 2:// TODO: 2021/11/9 PM上线前临时加的券领取类型(2-积分商品
buildParam.setEventType(0);
buildParam.setEventLimit(null);
break;
......
......@@ -44,7 +44,7 @@ public class SweetIntegralActivityDrawController extends BaseController {
@Autowired
private ISweetIntegralActivityDrawService iSweetIntegralActivityDrawService;
@Log(title = "积分活动奖列表数据", businessType = BusinessType.LIST)
@Log(title = "积分活动奖列表数据", businessType = BusinessType.LIST)
@RequiresPermissions("sweet:integralActivityDraw:list")
@ApiOperation(value = "积分活动中奖列表数据")
@PostMapping("list")
......@@ -54,8 +54,8 @@ public class SweetIntegralActivityDrawController extends BaseController {
return getDataTable(result.getList());
}
@Log(title = "积分活动导出奖列表数据", businessType = BusinessType.EXPORT)
@RequiresPermissions("kylin:integralActivityDraw:exportExcel")
@Log(title = "积分活动导出奖列表数据", businessType = BusinessType.EXPORT)
@RequiresPermissions("sweet:integralActivityDraw:exportExcel")
@PostMapping("/export")
@ResponseBody
public AjaxResult export(@RequestParam("ids") String integralActivityId) {
......
package com.liquidnet.client.admin.web.controller.zhengzai.sweet;
import com.liquidnet.client.admin.common.annotation.Log;
import com.liquidnet.client.admin.common.core.controller.BaseController;
import com.liquidnet.client.admin.common.core.domain.AjaxResult;
import com.liquidnet.client.admin.common.enums.BusinessType;
import com.liquidnet.client.admin.zhengzai.sweet.service.ISweetIntegralActivityPrizeRelationService;
import com.liquidnet.service.sweet.dto.param.admin.SweetIntegralActivityPrizeRelationFormParam;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrizeRelation;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
/**
* <p>
* 积分活动表 前端控制器
* </p>
*
* @author jiangxiulong
* @since 2021-10-20
*/
@Api(tags = "积分活动管理")
@Validated
@Controller
@RequestMapping("/sweet/integralActivityPrizeRelation")
public class SweetIntegralActivityPrizeRelationController extends BaseController {
@Autowired
private ISweetIntegralActivityPrizeRelationService activityPrizeRelationService;
@Log(title = "积分活动奖品内部关联券等添加", businessType = BusinessType.INSERT)
@RequiresPermissions("sweet:integralActivityPrizeRelation:create")
@PostMapping("create")
@ApiOperation(value = "积分活动奖品内部关联券等添加")
@ResponseBody
public AjaxResult create(@Valid @RequestBody SweetIntegralActivityPrizeRelationFormParam param) {
Integer result = activityPrizeRelationService.createForm(param);
if (result > 0) {
return success("操作成功");
} else {
return error("操作失败");
}
}
@Log(title = "积分活动奖品内部关联券等删除", businessType = BusinessType.DELETE)
@RequiresPermissions("sweet:integralActivityPrizeRelation:delete")
@PutMapping("delete")
@ApiOperation(value = "积分活动奖品内部关联券等删除")
@ResponseBody
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "String", name = "prizeRelationId", value = "主键id", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "integralActivityId", value = "活动主键id", required = true),
})
public AjaxResult delete(@RequestParam() String prizeRelationId, @RequestParam() String integralActivityId) {
Integer result = activityPrizeRelationService.delete(prizeRelationId, integralActivityId);
if (result > 0) {
return success("操作成功");
} else {
return error("操作失败");
}
}
@Log(title = "积分活动奖品内部关联券等列表", businessType = BusinessType.LIST)
@RequiresPermissions("sweet:integralActivityPrizeRelation:list")
@GetMapping("list")
@ApiOperation(value = "积分活动奖品内部关联券等列表")
@ResponseBody
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "String", name = "prizeId", value = "奖品主键id", required = true)
})
public List<SweetIntegralActivityPrizeRelation> list(@RequestParam() String prizeId) {
List<SweetIntegralActivityPrizeRelation> result = activityPrizeRelationService.list(prizeId);
return result;
}
}
;(function ($) {
//这里放入插件代码
var RemoteSearchPerformance = function (element, options) {
this.$element = $(element);
this.options = $.extend(true, {}, $.fn.remoteSearchPerformance.defaults, options);
this.id = $(element).attr('id');
this.ulID = '#' + this.id + '_ul';
this.ulFoucus = false;
// Method overrides
this.render = this.options.render || this.render;
this.select = this.options.select || this.select;
this.ajax = $.extend({}, $.fn.remoteSearchPerformance.defaults.ajax, this.options.ajax);
this.listen();
}
RemoteSearchPerformance.prototype = {
listen: function () {
this.$element.on('blur', $.proxy(this.blur, this))
.on('keyup', $.proxy(this.keyup, this));
this.$element.parent('div.remote_wrapper').on('click',this.ulID, $.proxy(this.click, this));
},
blur: function (e) {
var that = this;
e.stopPropagation();
e.preventDefault();
setTimeout(function () {
if (!that.ulFoucus) {
that.$element.val(that.$element.attr('data-name'));
that.hide();
}
}, 150)
},
keyup: function (e) {
e.stopPropagation();
e.preventDefault();
switch (e.keyCode) {
case 40:
// down arrow
case 38:
// up arrow
break;
case 9:
// tab
case 13:
// enter
this.ajaxer();
case 27:
// escape
break;
default:
this.ajaxer();
}
},
hide: function () {
$(this.ulID).remove();
return this;
},
ajaxer: function () {
var that = this,
keyword = that.$element.val();
busiType = window.typeRadio;
couType = window.typeCoupe;
// Query changed
that.keyword = keyword;
// Cancel last timer if set
if (that.ajax.timerId) {
clearTimeout(that.ajax.timerId);
that.ajax.timerId = null;
}
// Query is good to send, set a timer
that.ajax.timerId = setTimeout(function() {
var params = {
keyword : keyword,
busiType: busiType,
couType: couType,
bindType: '1,4'
};
var jAjax = $.post;
jAjax(that.ajax.url, params, function(data){
return that.render(data.rows);
});
that.ajax.timerId = null;
}, that.ajax.timeout);
return that;
},
render: function (data) {
this.ulFoucus = false;
var liList = data || [];
var num = this._getNum();
//添加 ul
if($(this.ulID).length == 0) {
this.$element.after("<ul id='" + this.id + "_ul' class='remote_search remote_search_top'></ul>");
};
//添加li
var str = "";
if(num) {
if(liList.length) {
for(var i = 0; i < liList.length; i++) {
str += "<li data-id='"+liList[i].couponId+"' data-name='"+liList[i].title+"' title='"+liList[i].title+"' value='"+liList[i].couponId+"'>" + liList[i].title + "</li>";
}
} else {
str = "<li data-id='' data-name=''>搜索无数据</li>"
}
} else {
this.$element.attr('data-name',"");
this.$element.attr('data-id',"");
}
$(this.ulID).html(str);
var bodyHeight = $(document.body).height();
var offsetTop = this.$element.offset().top;
var height = $(this.ulID).outerHeight(true);
if(offsetTop + height > bodyHeight){
$(this.ulID).addClass('remote_search_bottom').removeClass('remote_search_top');
}else{
$(this.ulID).addClass('remote_search_top').removeClass('remote_search_bottom');
}
return this;
},
click: function (e) {
e.stopPropagation();
e.preventDefault();
var dataName = $(e.target).attr('data-name');
var dataID = $(e.target).attr('data-id');
this.$element.val(dataName);
this.$element.attr('data-name',dataName);
this.$element.attr('data-id',dataID);
this.options.chose(dataName,dataID);
this.ulFoucus = true;
return this.hide();
},
_getNum: function(){
return this.$element.val().length;
}
}
$.fn.remoteSearchPerformance = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('remoteSearchPerformance'),
options = typeof option === 'object' && option;
if (!data) {
$this.data('remoteSearchPerformance', (data = new RemoteSearchPerformance(this, options)));
}
if (typeof option === 'string') {
data[option]();
}
});
}
$.fn.remoteSearchPerformance.defaults = {
hiddenVal: '',
chose: function () { },
ajax: {
url: null,
timeout: 300,
method: 'get',
timerId: null
},
success: function(res){
}
}
$.fn.remoteSearchPerformance.Constructor = RemoteSearchPerformance;
})(jQuery);
\ No newline at end of file
......@@ -43,6 +43,8 @@
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.6.1}"></script>
<!--远程搜索下拉框-->
<script th:src="@{/js/remote-search-performance.js}"></script>
<!--远程搜索下拉框:积分抽奖配置使用-->
<script th:src="@{/js/remote-search-coupon-list.js}"></script>
<script th:src="@{/js/remote-search-coupon.js}"></script>
</div>
......
......@@ -25,7 +25,7 @@
}
.interests_item {
width: 500px;
height: 700px;
height: 950px;
float: left;
margin-left: 126px !important;
}
......@@ -92,6 +92,10 @@
background: #0d8ddb;
color: #fff;
}
.member-coupes-item {
max-height: 300px;
overflow-y: auto;
}
.member-coupes-item ul{
padding-left: 0;
text-align: left;
......@@ -138,6 +142,9 @@
.remote_search {
padding-left: 0;
}
.interestsDesc_inner {
height: 300px;
}
</style>
<body class="gray-bg" style="font: 14px Helvetica Neue, Helvetica, PingFang SC, 微软雅黑, Tahoma, Arial, sans-serif !important;">
<section class="section-content">
......@@ -290,7 +297,7 @@
</p>
<input type="text" class="form-control" id="interestsTitle" name="interestsTitle" placeholder="请输入标题"/>
<input type="text" class="form-control" id="interestsSubTitle" name="interestsSubTitle" placeholder="请输入副标题"/>
<textarea class="form-control" id="interestsDesc" name="interestsDesc" placeholder="详情内容"></textarea>
<textarea class="form-control interestsDesc_inner" id="interestsDesc" name="interestsDesc" placeholder="详情内容"></textarea>
<div class="member-coupes-item">
<ul>
<div class="member-coupes-inner">
......
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<head>
<th:block th:include="include :: header('添加活动')"/>
<th:block th:include="include :: bootstrap-fileinput-css" />
<style>
.layui-form {
padding: 20px;
}
.main_type, .money, .scope_application, .sendType,.phoneNumber,.playMethod {
margin-bottom: 20px;
}
</head>
.phoneNumber,.playMethod {
display: none;
}
.labelName {
display: inline-block;
width: 100px;
text-align: right;
}
input {
border: 1px solid #ddd;
border-radius: 4px;
background: transparent;
outline: none;
padding-left: 5px;
height: 30px;
}
.main_type .form-control.kv-fileinput-caption {
height: 42px !important;
}
.prompt {
margin-left: 100px !important;
}
.main_type input, .sendType input,.playMethod input {
margin-top: -2px;
margin-right: 5px;
}
.main_type span, .sendType span, .playMethod span {
margin-right: 12px;
line-height: 28px;
}
.layui-form .money input {
width: 60px;
}
.main_bottom .describe, .main_bottom .sendTime {
margin-bottom: 20px;
}
.describe,.main_type {
display: flex;
}
.sendTime {
display: flex;
}
.sendTime input {
margin-top: -6px;
margin-right: 5px;
}
.bottom_btn {
width: 25%;
text-align: center;
}
select {
border: 1px solid #ddd;
border-radius: 4px;
background: transparent;
outline: none;
height: 30px;
width: 200px;
}
.required {
font-style: normal;
color: red;
}
.ibox-content {
border-style: none;
border-width: 0px;
}
.main_type .file-footer-buttons .kv-file-remove {
display: none !important;
}
.selectScore {
display: flex;
align-items: center;
}
.selectScore p {
margin: 0;
}
.selectScore button {
margin: 0 12px;
}
.selectScore span {
color: #ccc;
}
.scoreTable {
margin-bottom: 12px;
}
</style>
</head>
<body class="white-bg">
<form id="form-user-add" class="layui-form">
<body class="white-bg">
<!--奖品项配置表单-->
<form id="form-user-add" class="layui-form">
<div>
基础信息
</div>
......@@ -167,12 +74,24 @@
</div>
</div>
<div class="main_bottom">
<div class="main_type">
<span class="labelName"><i class="required">*</i>预估玩此活动的总人数:</span>
<div class="layui-input-block" style="display: flex">
<input type="text" id="estimatedNum" autocomplete="off" class="layui-input" placeholder="预估玩此活动的总人数">
</div>
</div>
<div class="describe">
<span class="labelName">
<i class="required">*</i>活动规则:
</span>
<textarea id="activityRule" class="form-control" style="min-height: 160px;"></textarea>
</div>
<div class="describe">
<span class="labelName">
<i class="required">*</i>概率公示:
</span>
<textarea id="probabilityPublicity" class="form-control" style="min-height: 160px;"></textarea>
</div>
<div class="sendTime">
<span class="labelName"><i class="required">*</i>是否上线:</span>
<div class="layui-input-block" style="display: flex">
......@@ -194,14 +113,58 @@
<button type="button" class="btn btn-primary" onclick="create()">确 定</button>
</div>
</div>
</form>
<div id="detailsFormList" class="details-form-list" style="display: none">
<!--奖品详情-->
<div class="details-pop-inner">
<button type="button" class="btn btn-primary" onclick="addCouponShow()">添加优惠券</button>
<button type="button" class="btn btn-warning" onclick="closeCouponShow()">关闭窗口</button>
<hr>
<div class="coupon-select" style="display: none">
<div class="scope_application">
<span class="labelName"><i class="required">*</i>选择类别:</span>
<div class="radio-box">
<input type="radio" name="coupeAdd_type" value="2" checked="checked"/>商品
</div>
<div class="radio-box">
<input type="radio" name="coupeAdd_type" value="3"/>优先购买
</div>
</div>
<!--选择优惠券-->
<div class="scope_application" id="scope_application">
<span class="labelName"><i class="required">*</i>选择优惠券:</span>
<div class="search_ipt" style="position: relative;display: inline;">
<input type="text" id="searchIpt" autocomplete="off" class="layui-input" placeholder="全部">
<ul id="dataList" style="position: absolute;"></ul>
</div>
<button type="button" class="btn btn-primary" onclick="addCouponFun()">确认添加当前优惠券</button>
</div>
</div>
<hr>
<div class="scoreTable">
<div class="row">
<div class="col-sm-12">
<div class="col-sm-12 select-table table-striped">
<table id="details-table"></table>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<th:block th:include="include :: footer"/>
<script th:src="@{/js/jquery.tmpl.js}"></script>
<th:block th:include="include :: bootstrap-fileinput-js" />
<script type="text/javascript">
let platformUrl = `[[${platformUrl}]]`
let prefix = ctx + "sweet/sweetIntegralActivity";
let candyfix = ctx + "candy/coupon";
</form>
<th:block th:include="include :: footer"/>
<script th:src="@{/js/jquery.tmpl.js}"></script>
<th:block th:include="include :: bootstrap-fileinput-js" />
<script type="text/javascript">
var platformUrl = `[[${platformUrl}]]`
var prefix = ctx + "sweet/sweetIntegralActivity";
let showIndex = null;
// 初始化数据, 可以由后台传过来
var data = []; // 表格内数据集合
......@@ -217,7 +180,8 @@
let online = '1'; // 是否上线
let itemId = '';
let activitySize = false;
var options = {
let options = {
id: "bootstrap-table",
data: data,
pagination: false,
showSearch: false,
......@@ -284,7 +248,7 @@
align: 'center',
title: '奖品类型',
formatter: function(value, row, index) {
let arr = ['谢谢惠顾', '积分', '代金券', '满减券', '优先购买', '实物'];
let arr = ['积分', '优惠券', '实物', '登登登VIP', '优先购买券'];
let str = '';
arr.forEach((item,i)=> {
i++
......@@ -294,19 +258,34 @@
str += `<option value="${i}">${item}</option>`
}
})
let dom = `<select id='prizeType${index}' class='form-control' name=''>
let dom = `<select id='prizeType${index}' class='form-control' name='' onchange="changePrizeType(this, ${index})">
${str}
</select>`
return dom;
}
},
{
field: 'prizeTypeNum',
align: 'center',
title: '奖励积分数量',
formatter: function(value, row, index) {
let str = '';
if (data[index].prizeType === 1) {
str = `<input id='prizeTypeNum${index}' class='form-control' type='text' name='' value='${data[index].prizeTypeNum}' style="display: block">`
} else {
str = `<input id='prizeTypeNum${index}' class='form-control' type='text' name='' value='${data[index].prizeTypeNum}' style="display: none">`
}
var html = $.common.sprintf(str, index, value);
return html;
}
},
{
field: 'winningProbability',
align: 'center',
title: '概率',
formatter: function(value, row, index) {
let str = '';
if (data[index].winningProbability) {
if (data[index].winningProbability !== '') {
str = `<input id='winningProbability${index}' class='form-control' type='text' name='' value='${data[index].winningProbability}'>`
} else {
str = `<input id='winningProbability${index}' class='form-control' type='text' name='' value=''>`
......@@ -315,36 +294,70 @@
return html;
}
},
{
field: 'isInfinite',
align: 'center',
title: '奖品库存',
formatter: function(value, row, index) {
let str = '';
if (data[index].isInfinite === 1) {
str = `<div class="radio-box"><input type="radio" name="isInfinite${index}" value="1" checked onclick="changeInfinite(this, ${index})"/>有限库存</div>
<div class="radio-box"><input type="radio" name="isInfinite${index}" value="2" onclick="changeInfinite(this, ${index})"/>无限库存</div>`
} else {
str = `<div class="radio-box"><input type="radio" name="isInfinite${index}" value="1" onclick="changeInfinite(this, ${index})"/>有限库存</div>
<div class="radio-box"><input type="radio" name="isInfinite${index}" value="2" checked onclick="changeInfinite(this, ${index})"/>无限库存</div>`
}
var html = $.common.sprintf(str, index, value);
return html;
}
},
{
field: 'prizeNum',
align: 'center',
title: '数量',
formatter: function(value, row, index) {
let str = '';
if (data[index].prizeNum) {
if (data[index].prizeNum !== '') {
if (data[index].isInfinite === 1) {
str = `<input id='prizeNum${index}' class='form-control' type='text' name='' value='${data[index].prizeNum}'>`
} else {
str = `<input id='prizeNum${index}' class='form-control' type='text' name='' value=''>`
str = `<input id='prizeNum${index}' class='form-control' type='text' name='' value='${data[index].prizeNum}' style="display: none">`
}
}
var html = $.common.sprintf(str, index, value);
return html;
}
},
{
field: 'winnersNum',
field: 'prizeDescribe',
align: 'center',
title: '中奖人数',
title: '奖品描述',
formatter: function(value, row, index) {
let str = '';
if (data[index].winnersNum) {
str = `<input id='winnersNum${index}' class='form-control' type='text' name='' value='${data[index].winnersNum}'>`
if (data[index].prizeDescribe !== '') {
str = `<input id='prizeDescribe${index}' class='form-control' type='text' name='' value='${data[index].prizeDescribe}'>`
} else {
str = `<input id='winnersNum${index}' class='form-control' type='text' name='' value=''>`
str = `<input id='prizeDescribe${index}' class='form-control' type='text' name='' value=''>`
}
var html = $.common.sprintf(str, index, value);
return html;
}
},
// {
// field: 'winnersNum',
// align: 'center',
// title: '中奖人数',
// formatter: function(value, row, index) {
// let str = '';
// if (data[index].winnersNum) {
// str = `<input id='winnersNum${index}' class='form-control' type='text' name='' value='${data[index].winnersNum}'>`
// } else {
// str = `<input id='winnersNum${index}' class='form-control' type='text' name='' value=''>`
// }
// var html = $.common.sprintf(str, index, value);
// return html;
// }
// },
{
field: 'winPrizeNum',
align: 'center',
......@@ -361,30 +374,76 @@
return '0'
}
}
},
{
field: '',
align: 'center',
title: '操作',
formatter: function(value, row, index) {
let str = '';
if (data[index].prizeType === 2) {
str = `<button type="button" class="btn btn-primary" onclick="showList(` + index + `)">查看列表</button>`
}
var html = $.common.sprintf(str, index, value);
return html;
}
}
]
};
layui.use('laydate', function(){
var laydate = layui.laydate;
//执行一个laydate实例
laydate.render({
elem: '#startTime', //指定元素
type: 'datetime'
});
laydate.render({
elem: '#endTime', //指定元素
type: 'datetime'
});
});
$("#ActivityName").blur(function(e) {
if (e.target.value.length > 20) {
activitySize = true;
layer.msg('活动名称限制在20个字符以内!')
return
} else {
activitySize = false;
let nowList = []; // 当前编辑的奖品详情列表
let nowShowData = {}; // 当前编辑的奖品信息
let searchVal = ''; // 优惠券输入框内数据
let searchData = []; // 优惠券搜索总数据
let nowCouponSelect = {}; // 当前选择的优惠券
let detailsOptions = {
id: "details-table",
data: nowList,
pagination: false,
showSearch: false,
showRefresh: false,
showToggle: false,
showColumns: false,
sidePagination: "client",
columns: [
{
field: 'index',
align: 'center',
title: "序号",
formatter: function (value, row, index) {
return index+1;
}
})
},
{
field: 'couponId',
align: 'center',
title: "优惠券ID",
formatter: function (value, row, index) {
return nowList[index].couponId;
}
},
{
field: 'couponTitle',
align: 'center',
title: "优惠券名称",
formatter: function (value, row, index) {
return nowList[index].couponTitle;
}
},
{
field: '',
align: 'center',
title: '操作',
formatter: function(value, row, index) {
let str = '';
str = `<button type="button" class="btn btn-primary" onclick="deleteCoupon(` + index + `)">删除</button>`
var html = $.common.sprintf(str, index, value);
return html;
}
}
]
};
$(function() {
itemId = getUrlParms('id')
function getUrlParms(name){
......@@ -407,6 +466,8 @@
$("#integral").val(res.activityNum);
$("#activityRule").val(res.activityRules);
$("#ActivityName").val(res.activityTitle);
$("#estimatedNum").val(res.estimatedNum);
$("#probabilityPublicity").val(res.probabilityPublicity);
// activityType: 1,
courierType = res.expressFeeType;
if (courierType == 2) {
......@@ -417,7 +478,6 @@
if (online == 2) {
$("input[name='online'][value='2']").attr('checked', true).siblings().removeAttr('checked');
}
// prizeList: data,
timeType = res.timeType;
if (timeType == 2) {
......@@ -438,24 +498,46 @@
})
} else {
let obj = {
prizeId: "",
prizeTitle: "",
prizeImgInit: "",
prizeImgSelect: "",
winnersNum: "",
winPrizeNum: "",
prizeType: "",
prizeType: 1,
prizeTypeNum: 0,
isInfinite: 1,
prizeNum: 0,
winningProbability: "",
residue: "",
prizeNum: ""
prizeDescribe: "",
residue: ""
};
for( var i = 0; i < 12; i++) {
for( var i = 0; i < 20; i++) {
data.push(obj)
}
$.table.init(options);
}
});
layui.use('laydate', function(){
var laydate = layui.laydate;
//执行一个laydate实例
laydate.render({
elem: '#startTime', //指定元素
type: 'datetime'
});
laydate.render({
elem: '#endTime', //指定元素
type: 'datetime'
});
});
$("#ActivityName").blur(function(e) {
if (e.target.value.length > 20) {
activitySize = true;
layer.msg('活动名称限制在20个字符以内!')
return
} else {
activitySize = false;
}
})
$("input[name=sendType]").change((e)=>{
timeType = e.target.value;
if (timeType == 1) {
......@@ -544,8 +626,16 @@
$("#viewImg").attr('src', showPicture)
})
function create() {
if (!$("#ActivityName").val() || !$("#ActivityType").val() || !showPicture || !$("#integral").val() || !$("#activityRule").val() || !$("#viewImg").attr('src')) {
return layer.msg('请将必填信息填写完整!')
if (!$("#ActivityName").val()
|| !$("#ActivityType").val()
|| !showPicture
|| !$("#integral").val()
|| !$("#activityRule").val()
|| !$("#viewImg").attr('src')
|| !$("#estimatedNum").val()
|| !$("#probabilityPublicity").val()
) {
return layer.msg('请将活动必填信息填写完整!')
}
if (timeType == 2) {
if (!$("#startTime").val() || !$("#endTime").val()) {
......@@ -560,22 +650,34 @@
return
}
let flag = false;
data = data.map((item,index)=>{
if (!$("#prizeTitle"+index).val()||!$("#showPic"+index).attr('src')||!$("#showPicSelect"+index).attr('src')||!$("#winnersNum"+index).val()||!$("#prizeType"+index).val()||!$("#winningProbability"+index).val()||!$("#prizeNum"+index).val()) {
let prizeListArr = []
data.forEach((item, index) => {
let temp = {};
if (!$("#prizeTitle"+index).val()
|| !$("#showPic"+index).attr('src')
|| !$("#showPicSelect"+index).attr('src')
|| !$("#prizeType"+index).val()
|| !$("#winningProbability"+index).val()
|| !$("input[name=isInfinite"+index+"]:checked").val()
|| !$("#prizeNum"+index).val()
) {
flag = true
} else {
item.prizeTitle = $("#prizeTitle"+index).val();
item.prizeImgInit = $("#showPic"+index).attr('src');
item.prizeImgSelect = $("#showPicSelect"+index).attr('src');
item.winnersNum = $("#winnersNum"+index).val();
item.prizeType = $("#prizeType"+index).val();
item.winningProbability = $("#winningProbability"+index).val();
item.prizeNum = $("#prizeNum"+index).val();
}
return {...item};
})
temp.prizeId = data[index].prizeId ? data[index].prizeId : '';
temp.prizeTitle = $("#prizeTitle"+index).val();
temp.prizeImgInit = $("#showPic"+index).attr('src');
temp.prizeImgSelect = $("#showPicSelect"+index).attr('src');
temp.prizeType = $("#prizeType"+index).val();
temp.prizeTypeNum = temp.prizeType == '1' ? $("#prizeTypeNum"+index).val() : 0;
temp.isInfinite = $("input[name=isInfinite"+index+"]:checked").val();
temp.prizeNum = temp.isInfinite === '1' ? $("#prizeNum"+index).val() : 0;
temp.winningProbability = $("#winningProbability"+index).val();
temp.prizeDescribe = $("#prizeDescribe"+index).val();
}
prizeListArr.push(temp);
});
if (flag) {
return layer.msg('请将表格内容填写完整!')
return layer.msg('请将奖品表格内容填写完整!')
}
let datas = {
activityImg: showPicture,
......@@ -587,9 +689,11 @@
integralActivityId: itemId || '',
endTime: $.common.dateFormat($("#endTime").val(), 'yyyy-MM-dd HH:mm:ss') , //
isOnline: online,
prizeList: data,
prizeList: prizeListArr,
startTime: $.common.dateFormat($("#startTime").val(), 'yyyy-MM-dd HH:mm:ss'),
timeType: timeType
timeType: timeType,
estimatedNum: $("#estimatedNum").val(),
probabilityPublicity: $("#probabilityPublicity").val()
}
let url = '/sweet/integralActivity/create';
let type = 'post';
......@@ -606,7 +710,7 @@
layer.msg('' + res);
if (res.code != undefined && res.code != web_status.SUCCESS) {
$.modal.alertWarning(res.msg);
return [];
return;
} else if (res.code == web_status.SUCCESS) {
$.operate.successTabCallback(res);
closeItem();
......@@ -614,7 +718,313 @@
}
})
}
// 奖品类型切换
function changePrizeType (item, index) {
if (item.value === '1') {
$('#prizeTypeNum' + index).show(); // 填积分数量
} else {
$('#prizeTypeNum' + index).val(0);
$('#prizeTypeNum' + index).hide(); // 不填数量
}
}
// 库存切换
function changeInfinite(item, index) {
if (item.value === '1') {
$('#prizeNum' + index).show(); // 填数量
} else if (item.value === '2') {
$('#prizeNum' + index).val(0);
$('#prizeNum' + index).hide(); // 无限库存,不填数量
}
}
// 展示已配置的优惠券列表
function showList (index) {
nowShowData = data[index];
nowShowData.index = index;
nowList = [];
detailsOptions.data = [];
$.table.destroy("details-table");
$.ajax({
type: 'get',
url: '/sweet/integralActivityPrizeRelation/list',
data: { prizeId: nowShowData['prizeId'] },
success: function (res) {
nowList = res;
detailsOptions.data = res;
setTimeout(()=>{
$.table.init(detailsOptions);
}, 500)
$("#detailsFormList").show();
}
});
}
function addCouponShow () {
$(".coupon-select").show();
}
function closeCouponShow () {
$("#detailsFormList").hide();
}
// 类别
function changeRadioType (val) {
console.log('changeRadioType', val);
}
// 添加优惠券
function addCouponFun () {
if (!nowCouponSelect.couponId) {
this.alert('请先选择优惠券');
return;
}
let postData = {
"couponId": nowCouponSelect.couponId,
"couponTitle": nowCouponSelect.title,
"integralActivityId": nowShowData['integralActivityId'],
"prizeId": nowShowData['prizeId']
};
$.ajax({
type: 'post',
url: '/sweet/integralActivityPrizeRelation/create',
data: JSON.stringify(postData),
contentType: 'application/json',
success: function (e) {
if (e.code == 0) {
showList(nowShowData.index);
alert('添加成功!');
}
}
});
}
// 删除优惠券
function deleteCoupon(index) {
let postData = {
"integralActivityId": nowShowData['integralActivityId'],
"prizeRelationId": nowList[index]['prizeRelationId']
};
$.ajax({
type: 'put',
url: '/sweet/integralActivityPrizeRelation/delete',
data: postData,
success: function (e) {
if (e.code == 0) {
showList(nowShowData.index);
alert('删除成功!');
}
}
});
}
// 远程搜索券
function getMallList() {
let data = {
keyword: searchVal,
busiType: parseInt($('input[type=radio][name=coupeAdd_type]:checked').val()),
pageSize: 20,
pageNum: 1,
bindType: 2
}
let str = '';
promiseMethods(candyfix + "/list",'post',data,'application/x-www-form-urlencoded').then(res=>{
if (res.rows.length>0) {
searchData = res.rows;
searchData.forEach((item,index)=>{
str+= `<li class="selectData" onclick="selectOne('${item.couponId}', 'couponId')">${item.title}</li>`
})
$('#dataList').html(str);
} else {
$('#dataList').html('<li style="width:100%;text-align:center;color:#ccc;">--- 暂无数据 ---</li>');
}
})
}
function promiseMethods(url,type,data,contentType) {
return new Promise((resolve,reject)=>{
$.ajax({
url,
type,
data,
contentType,
success:function(res) {
resolve(res);
}
})
})
}
// 选择优惠券
function selectOne(id, name) {
searchData.some( (item, index) => {
if (item[name] == id) {
nowCouponSelect = item;
return $("#searchIpt").val(item.title);
}
} )
}
$("#searchIpt").focus(function(){
getMallList()
$('#dataList').show()
});
$("#searchIpt").blur(function(){
setTimeout(() => {
$('#dataList').hide()
}, 500);
});
$("#searchIpt").keyup(function(){
searchVal = $("#searchIpt").val()
getMallList()
});
</script>
<style>
.layui-form {
padding: 20px;
}
.main_type, .money, .scope_application, .sendType,.phoneNumber,.playMethod {
margin-bottom: 20px;
}
.phoneNumber,.playMethod {
display: none;
}
.labelName {
display: inline-block;
width: 100px;
text-align: right;
}
input {
border: 1px solid #ddd;
border-radius: 4px;
background: transparent;
outline: none;
padding-left: 5px;
height: 30px;
}
.main_type .form-control.kv-fileinput-caption {
height: 42px !important;
}
.prompt {
margin-left: 100px !important;
}
.main_type input, .sendType input,.playMethod input {
margin-top: -2px;
margin-right: 5px;
}
.main_type span, .sendType span, .playMethod span {
margin-right: 12px;
line-height: 28px;
}
.layui-form .money input {
width: 60px;
}
.main_bottom .describe, .main_bottom .sendTime {
margin-bottom: 20px;
}
.describe,.main_type {
display: flex;
}
.sendTime {
display: flex;
}
.sendTime input {
margin-top: -6px;
margin-right: 5px;
}
.bottom_btn {
width: 25%;
text-align: center;
}
select {
border: 1px solid #ddd;
border-radius: 4px;
background: transparent;
outline: none;
height: 30px;
width: 200px;
}
.required {
font-style: normal;
color: red;
}
.ibox-content {
border-style: none;
border-width: 0px;
}
.main_type .file-footer-buttons .kv-file-remove {
display: none !important;
}
.selectScore {
display: flex;
align-items: center;
}
.selectScore p {
margin: 0;
}
.selectScore button {
margin: 0 12px;
}
.selectScore span {
color: #ccc;
}
.scoreTable {
margin-bottom: 12px;
overflow-y: scroll;
max-height: 600px;
}
.details-form-list {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, .5);
display: flex;
justify-content: center;
align-items: center;
}
.details-pop-inner {
width: 800px;
height: 820px;
padding: 10px;
background: #fff;
}
.search_ipt ul,.search_ipt li{
padding: 0;
margin: 0;
font-style: normal;
list-style: none;
}
.search_ipt ul {
display: none;
position: absolute;
left: 0;
top: 26px;
padding: 5px 0;
z-index: 899;
min-width: 200px;
border: 1px solid #eee;
max-height: 300px;
overflow-y: auto;
background-color: #fff;
border-radius: 2px;
box-sizing: border-box;
box-shadow: 1px 1px 4px rgb(0 0 0 / 8%);
}
.search_ipt li {
background-color: #fff;
cursor: pointer;
padding-left: 10px!important;
color: #999;
padding: 0 10px;
line-height: 36px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.search_ipt li:hover {
background: #F6F6F6;
}
.search_ipt .layui-input {
width: 200px;
}
.radio-box input[type=radio]{
vertical-align: middle;
}
</style>
</script>
</body>
</html>
\ No newline at end of file
......@@ -40,7 +40,7 @@
var updateFlag = [[${@permission.hasPermi('sweet:integralActivity:create')}]];
var isOnlineFlag = [[${@permission.hasPermi('sweet:integralActivity:isOnline')}]];
var drawListFlag = [[${@permission.hasPermi('sweet:integralActivityDraw:list')}]];
var exportExcelFlag = [[${@permission.hasPermi('sweet:integralActivityDraw:export')}]];
var exportExcelFlag = [[${@permission.hasPermi('sweet:integralActivityDraw:exportExcel')}]];
var prefix = ctx + "sweet/integralActivity";
......@@ -85,20 +85,31 @@
}
},
{
field: 'prizeNum',
title: '奖品数量'
field: '',
title: '实物数量',
formatter: function (value, row) {
var sureTotalPrizeNum = row.sureTotalPrizeNum;
var sureOutPrizeNum = row.sureOutPrizeNum;
return '实物总库存:'+sureTotalPrizeNum+'<br>'+'实物已发放数量:'+sureOutPrizeNum;
}
},
{
field: 'drawNum',
title: '已发出'
field: '',
title: '非实物数量',
formatter: function (value, row) {
var otherTotalPrizeNum = row.otherTotalPrizeNum;
var otherOutPrizeNum = row.otherOutPrizeNum;
return '非实物总库存:'+otherTotalPrizeNum+'<br>'+'非实物已发放数量:'+otherOutPrizeNum;
}
},
{
field: '',
title: '奖品剩余',
title: '抽奖次数',
formatter: function (value, row) {
var prizeNum = row.prizeNum;
var drawNum = row.drawNum;
return prizeNum - drawNum;
var estimatedNum = row.estimatedNum;
var totalDrawNum = row.totalDrawNum;
var notBlackDrawNum = row.notBlackDrawNum;
return '预计参与人数:'+estimatedNum+'<br>'+'已抽奖次数:'+totalDrawNum+'<br>'+'去除黑名单已抽奖次数:'+notBlackDrawNum;
}
},
{
......
......@@ -38,15 +38,6 @@
<option value="">全部</option>
<option value="1">未发放</option>
<option value="2">已发放</option>
<option value="3">无需发放</option>
</select>
</li>
<li>
<label>是否中奖:</label>
<select name="isWin">
<option value="">全部</option>
<option value="1">未中奖</option>
<option value="2">已中奖</option>
</select>
</li>
<li>
......@@ -129,9 +120,6 @@
case 2:
receivingStatus = "已发放";
break;
case 3:
receivingStatus = "无需发放";
break;
}
return receivingStatus;
}
......
package com.liquidnet.client.admin.zhengzai.candy.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.candy.dto.admin.CandyCouponFilterDto;
import com.liquidnet.service.candy.dto.admin.CandyCouponListParam;
import com.liquidnet.service.candy.entity.CandyCoupon;
import java.util.List;
public interface ICandyCouponAdminService extends IService<CandyCoupon> {
List<CandyCouponFilterDto> listForCouponFilterDto(CandyCouponListParam listParam);
}
......@@ -2,11 +2,22 @@ package com.liquidnet.client.admin.zhengzai.candy.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.client.admin.zhengzai.candy.service.ICandyCouponAdminService;
import com.liquidnet.service.candy.dto.admin.CandyCouponFilterDto;
import com.liquidnet.service.candy.dto.admin.CandyCouponListParam;
import com.liquidnet.service.candy.entity.CandyCoupon;
import com.liquidnet.service.candy.mapper.CandyCouponMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CandyCouponAdminServiceImpl extends ServiceImpl<CandyCouponMapper, CandyCoupon> implements ICandyCouponAdminService {
@Autowired
private CandyCouponMapper candyCouponMapper;
@Override
public List<CandyCouponFilterDto> listForCouponFilterDto(CandyCouponListParam listParam) {
return candyCouponMapper.selectMultiForCouponFilterDto(listParam);
}
}
......@@ -17,6 +17,9 @@ import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.vo.AdamMemberRightsCouponRuleVo;
import com.liquidnet.service.adam.dto.vo.AdamMemberRightsCouponVo;
import com.liquidnet.service.candy.constant.CandyRedisConst;
import com.liquidnet.service.candy.dto.CandyCouponInfoDto;
import com.liquidnet.service.candy.dto.CandyCouponRuleDto;
import com.liquidnet.service.candy.dto.admin.*;
import com.liquidnet.service.candy.entity.CandyCoupon;
import com.liquidnet.service.candy.entity.CandyCouponRule;
......@@ -25,6 +28,7 @@ import com.liquidnet.service.candy.mapper.CandyCouponMapper;
import com.liquidnet.service.candy.mapper.CandyMgtCouponMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -74,7 +78,7 @@ public class CandyMgtCouponAdminServiceImpl extends ServiceImpl<CandyMgtCouponMa
// initCoupon.setExclusive(1);
// initCoupon.setBusiType(parameter.getBusiType());
// initCoupon.setCouType(parameter.getCouType());
// initCoupon.setBindType(1);// 领取方式[0-用户输入兑换|1-发放至用户|2-积分兑换|3-发放需领取|4-会员专属]
// initCoupon.setBindType(1);// 领取方式[0-用户输入兑换|1-发放至用户|2-积分商品|3-发放需领取|4-会员专属]
// //initCoupon.setDiscount();
// initCoupon.setValFace(parameter.getValFace());
// initCoupon.setValOver(parameter.getValOver());
......@@ -383,8 +387,10 @@ public class CandyMgtCouponAdminServiceImpl extends ServiceImpl<CandyMgtCouponMa
initCoupon.setRedeemStart(eventAt);
initCoupon.setRedeemStop(initCoupon.getRedeemStart().plusDays(redeemValidity).withHour(23).withMinute(59).withSecond(59));
}
if (parameter.getBindType() != 2 && parameter.getBindType() != 4) {// 券领取方式[2-积分商品|4-会员专属],实际发放至用户时计算有效期
initCoupon.setEffectAt(eventAt);
initCoupon.setExpireAt(initCoupon.getEffectAt().plusDays(parameter.getValidity()).withHour(23).withMinute(59).withSecond(59));
}
initCoupon.setOperator(ShiroUtils.getLoginName());
initCoupon.setCreatedAt(nowTime);
......@@ -409,12 +415,13 @@ public class CandyMgtCouponAdminServiceImpl extends ServiceImpl<CandyMgtCouponMa
initMgtCoupon.setMcouponId(IDGenerator.nextMilliId());
initMgtCoupon.setCouponId(initCoupon.getCouponId());
// initMgtCoupon.setState(0);
// initMgtCoupon.setState(initCoupon.getBindType() == 2 ? 1 : 0);// TODO: 2021/11/9 PM上线前临时加的券领取类型(2-积分兑换),这里根据发放类型设置该记录不执行发放
// initMgtCoupon.setState(initCoupon.getBindType() == 2 ? 1 : 0);// TODO: 2021/11/9 PM上线前临时加的券领取类型(2-积分商品),这里根据发放类型设置该记录不执行发放
initMgtCoupon.setState(Arrays.asList(2, 4).contains(initCoupon.getBindType()) ? 1 : 0);
initMgtCoupon.setEventAmt(parameter.getEventAmt());
initMgtCoupon.setEventType(parameter.getEventType());
initMgtCoupon.setEventLimit(parameter.getEventLimit());
initMgtCoupon.setEventAt(eventAt);
initMgtCoupon.setEventDriven(1);
initMgtCoupon.setOperator(initCoupon.getOperator());
initMgtCoupon.setCreatedAt(nowTime);
......@@ -442,6 +449,18 @@ public class CandyMgtCouponAdminServiceImpl extends ServiceImpl<CandyMgtCouponMa
throw new LiquidnetServiceException();
}
List<CandyCouponRuleDto> couponRuleDtoList = new ArrayList<>();
initCouponRuleList.forEach(r -> {
couponRuleDtoList.add(CandyCouponRuleDto.getNew().copy(r));
});
CandyCouponInfoDto couponInfoDto = new CandyCouponInfoDto();
BeanUtils.copyProperties(initCoupon, couponInfoDto);
couponInfoDto.setUseRules(couponRuleDtoList);
String couponInfoDtoKey = CandyRedisConst.BASIC_COUPON_INFO.concat(couponInfoDto.getCouponId());
redisDataSourceUtil.getRedisCandyUtil().set(couponInfoDtoKey, couponInfoDto);
// switch (initCoupon.getExclusive()) {
// case 0:
// break;
......
package com.liquidnet.client.admin.zhengzai.sweet.dto;
import com.liquidnet.client.admin.common.annotation.Excel;
import com.liquidnet.client.admin.common.utils.DictUtils;
import com.liquidnet.service.sweet.dto.SweetActivityDrawListDao;
import lombok.Data;
......@@ -54,31 +55,7 @@ public class SweetActivityDrawExcelListDao implements Serializable, Cloneable {
public SweetActivityDrawExcelListDao copy(SweetActivityDrawListDao source) {
if (null == source) return this;
this.setPrizeTitle(source.getPrizeTitle());
String prizeName = "";
switch (source.getPrizeType()) {
case 1:
prizeName = "谢谢惠顾";
break;
case 2:
prizeName = "积分";
break;
case 3:
prizeName = "代金券";
break;
case 4:
prizeName = "满减券";
break;
case 5:
prizeName = "优先购买券";
break;
case 6:
prizeName = "实物";
break;
default:
prizeName = "-";
break;
}
this.setPrizeName(prizeName);
this.setPrizeName(DictUtils.getDictLabel("zhengzai_sweet_draw_prize_type", String.valueOf(source.getPrizeType())));
this.setPrizeTypeNum(source.getPrizeTypeNum());
this.setNickname(source.getNickname());
this.setReceivingName(source.getReceivingName());
......
package com.liquidnet.client.admin.zhengzai.sweet.service;
import com.liquidnet.service.sweet.dto.param.admin.SweetIntegralActivityPrizeRelationFormParam;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrizeRelation;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 积分活动奖品里关联多奖品表 服务类
* </p>
*
* @author jiangxiulong
* @since 2021-12-02
*/
public interface ISweetIntegralActivityPrizeRelationService extends IService<SweetIntegralActivityPrizeRelation> {
Integer createForm(SweetIntegralActivityPrizeRelationFormParam param);
Integer delete(String prizeRelationId, String integralActivityId);
List<SweetIntegralActivityPrizeRelation> list(String prizeId);
}
......@@ -103,27 +103,14 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
);
// 更新缓存
List<SweetIntegralActivityDraw> sweetIntegralActivityDrawInList = sweetIntegralActivityDrawMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityDraw.class)
.eq(SweetIntegralActivityDraw::getIntegralActivityId, sweetIntegralActivityDrawNew.getIntegralActivityId())
.eq(SweetIntegralActivityDraw::getUserId, sweetIntegralActivityDrawNew.getUserId())
.gt(SweetIntegralActivityDraw::getPrizeType, 1)
.orderByDesc(SweetIntegralActivityDraw::getMid)
.last(" limit 20 ")
);
LinkedList<IntegralActivityDrawVo> activityDrawArrayList = SweetNewObjectUtil.getSweetIntegralActivityDrawVoLinkedList();
for (SweetIntegralActivityDraw draw : sweetIntegralActivityDrawInList) {
IntegralActivityDrawVo integralActivityDrawVo = IntegralActivityDrawVo.getNew().copy(draw);
activityDrawArrayList.add(integralActivityDrawVo);
}
sweetRedisAdminUtils.setIntegralActivityDraw(activityDrawArrayList, sweetIntegralActivityDrawNew.getIntegralActivityId(), sweetIntegralActivityDrawNew.getUserId());
sweetRedisAdminUtils.delIntegralActivityDrawList(sweetIntegralActivityDrawNew.getIntegralActivityId(), sweetIntegralActivityDrawNew.getUserId());
sweetRedisAdminUtils.setIntegralActivityDrawInfo(drawId);
mongoTemplate.getCollection(IntegralActivityDrawVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("drawId").is(drawId)).getQueryObject(),
new Document("$set", new Document("receivingStatus", 2)
.append("updatedAt", DateUtil.Formatter.yyyyMMddHHmmss.format(LocalDateTime.now())))
.append("updatedAt", LocalDateTime.now()))
);
return update;
......
package com.liquidnet.client.admin.zhengzai.sweet.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.liquidnet.client.admin.zhengzai.sweet.service.ISweetIntegralActivityPrizeRelationService;
import com.liquidnet.client.admin.zhengzai.sweet.utils.SweetObjectAdminUtil;
import com.liquidnet.client.admin.zhengzai.sweet.utils.SweetRedisAdminUtils;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.sweet.constant.StatusConst;
import com.liquidnet.service.sweet.dto.param.admin.SweetIntegralActivityPrizeRelationFormParam;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeRelationVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivity;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrize;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrizeRelation;
import com.liquidnet.service.sweet.mapper.SweetIntegralActivityMapper;
import com.liquidnet.service.sweet.mapper.SweetIntegralActivityPrizeMapper;
import com.liquidnet.service.sweet.mapper.SweetIntegralActivityPrizeRelationMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* <p>
* 积分活动奖品里关联多奖品表 服务实现类
* </p>
*
* @author jiangxiulong
* @since 2021-12-02
*/
@Service
public class SweetIntegralActivityPrizeRelationServiceImpl extends ServiceImpl<SweetIntegralActivityPrizeRelationMapper, SweetIntegralActivityPrizeRelation> implements ISweetIntegralActivityPrizeRelationService {
@Autowired
private SweetIntegralActivityMapper sweetIntegralActivityMapper;
@Autowired
private SweetIntegralActivityPrizeMapper sweetIntegralActivityPrizeMapper;
@Autowired
private SweetIntegralActivityPrizeRelationMapper relationMapper;
@Autowired
private SweetRedisAdminUtils sweetRedisAdminUtils;
@Override
public Integer createForm(SweetIntegralActivityPrizeRelationFormParam param) {
try {
SweetIntegralActivityPrizeRelation prizeRelation = SweetIntegralActivityPrizeRelationFormParam.getNew().copy(param);
String relationId = IDGenerator.nextSnowId();
prizeRelation.setPrizeRelationId(relationId);
int insert = relationMapper.insert(prizeRelation);
// 活动redis处理
this.integralActivityList(param.getIntegralActivityId());
return insert;
} catch (Exception e) {
log.error("添加失败 [e:{}]", e);
return 0;
}
}
@Override
public Integer delete(String prizeRelationId, String integralActivityId) {
try {
int delete = relationMapper.delete(
Wrappers.lambdaUpdate(SweetIntegralActivityPrizeRelation.class).eq(SweetIntegralActivityPrizeRelation::getPrizeRelationId, prizeRelationId)
);
// 活动redis处理
this.integralActivityList(integralActivityId);
return delete;
} catch (Exception e) {
log.error("删除失败 [e:{}]", e);
return 0;
}
}
@Override
public List<SweetIntegralActivityPrizeRelation> list(String prizeId) {
List<SweetIntegralActivityPrizeRelation> prizeRelations = relationMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityPrizeRelation.class).eq(SweetIntegralActivityPrizeRelation::getPrizeId, prizeId)
);
return prizeRelations;
}
private void integralActivityList(String integralActivityId) {
// 活动列表
LambdaQueryWrapper<SweetIntegralActivity> queryWrapper = Wrappers.lambdaQuery(SweetIntegralActivity.class).eq(SweetIntegralActivity::getIsOnline, 2);
LocalDateTime now = LocalDateTime.now();
queryWrapper.eq(SweetIntegralActivity::getTimeType, 1).or().eq(SweetIntegralActivity::getIsOnline, 2).eq(SweetIntegralActivity::getTimeType, 2).gt(SweetIntegralActivity::getEndTime, now).lt(SweetIntegralActivity::getStartTime, now);
List<SweetIntegralActivity> sweetIntegralActivities = sweetIntegralActivityMapper.selectList(queryWrapper);
List<IntegralActivityVo> voList = SweetObjectAdminUtil.getSweetIntegralActivityVoList();
sweetIntegralActivities.forEach(r -> {
IntegralActivityVo copy = IntegralActivityVo.getNew().copy(r);
voList.add(copy);
});
sweetRedisAdminUtils.setIntegralActivityList(voList);
// 活动详情
SweetIntegralActivity sweetIntegralActivity = sweetIntegralActivityMapper.selectOne(
Wrappers.lambdaQuery(SweetIntegralActivity.class).eq(SweetIntegralActivity::getIntegralActivityId, integralActivityId)
);
IntegralActivityVo integralActivityVo = IntegralActivityVo.getNew().copy(sweetIntegralActivity);
// 详情奖品 全部
List<SweetIntegralActivityPrize> activityPrizes = sweetIntegralActivityPrizeMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityPrize.class).eq(SweetIntegralActivityPrize::getIntegralActivityId, integralActivityId)
);
List<IntegralActivityPrizeVo> prizeList = SweetObjectAdminUtil.getSweetIntegralActivityPrizeVoList();
activityPrizes.forEach(r -> {
IntegralActivityPrizeVo copy = IntegralActivityPrizeVo.getNew().copy(r);
// 奖品券列表
List<SweetIntegralActivityPrizeRelation> prizeRelations = relationMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityPrizeRelation.class).eq(SweetIntegralActivityPrizeRelation::getPrizeId, copy.getPrizeId())
);
ArrayList<IntegralActivityPrizeRelationVo> prizeRelationVoList = SweetObjectAdminUtil.getSweetIntegralActivityPrizeRelationVoList();
if (!CollectionUtils.isEmpty(prizeRelations)) {
prizeRelations.forEach(rr -> {
IntegralActivityPrizeRelationVo copyR = IntegralActivityPrizeRelationVo.getNew().copy(rr);
prizeRelationVoList.add(copyR);
});
}
copy.setPrizeRelationList(prizeRelationVoList);
prizeList.add(copy);
});
integralActivityVo.setPrizeList(prizeList);
// 详情奖品 积分和券
List<SweetIntegralActivityPrize> activityPrizes1 = sweetIntegralActivityPrizeMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityPrize.class).eq(SweetIntegralActivityPrize::getIntegralActivityId, integralActivityId)
.in(SweetIntegralActivityPrize::getPrizeType, Arrays.asList(StatusConst.PRIZE_TYPE1, StatusConst.PRIZE_TYPE2))
);
List<IntegralActivityPrizeVo> prizeList1 = SweetObjectAdminUtil.getSweetIntegralActivityPrizeVoList();
activityPrizes1.forEach(r -> {
IntegralActivityPrizeVo copy = IntegralActivityPrizeVo.getNew().copy(r);
// 奖品券列表
List<SweetIntegralActivityPrizeRelation> prizeRelations = relationMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityPrizeRelation.class).eq(SweetIntegralActivityPrizeRelation::getPrizeId, copy.getPrizeId())
);
ArrayList<IntegralActivityPrizeRelationVo> prizeRelationVoList = SweetObjectAdminUtil.getSweetIntegralActivityPrizeRelationVoList();
if (!CollectionUtils.isEmpty(prizeRelations)) {
prizeRelations.forEach(rr -> {
IntegralActivityPrizeRelationVo copyR = IntegralActivityPrizeRelationVo.getNew().copy(rr);
prizeRelationVoList.add(copyR);
});
}
copy.setPrizeRelationList(prizeRelationVoList);
prizeList1.add(copy);
});
integralActivityVo.setPrizeList1(prizeList1);
// 详情奖品 实物等
List<SweetIntegralActivityPrize> activityPrizes2 = sweetIntegralActivityPrizeMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityPrize.class).eq(SweetIntegralActivityPrize::getIntegralActivityId, integralActivityId)
.in(SweetIntegralActivityPrize::getPrizeType, Arrays.asList(StatusConst.PRIZE_TYPE3, StatusConst.PRIZE_TYPE4, StatusConst.PRIZE_TYPE5))
);
List<IntegralActivityPrizeVo> prizeList2 = SweetObjectAdminUtil.getSweetIntegralActivityPrizeVoList();
int totalPrizeNum = 0;
for (SweetIntegralActivityPrize prize : activityPrizes2) {
IntegralActivityPrizeVo copy = IntegralActivityPrizeVo.getNew().copy(prize);
prizeList2.add(copy);
int prizeNum = sweetRedisAdminUtils.getIntegralActivityPrizeNum(integralActivityId, prize.getPrizeId());
totalPrizeNum += prizeNum;
}
sweetRedisAdminUtils.setIntegralActivityTotalPrizeNum(integralActivityId, totalPrizeNum);
sweetRedisAdminUtils.setIntegralActivityInfo(integralActivityVo);
}
}
......@@ -8,26 +8,33 @@ import com.liquidnet.client.admin.zhengzai.sweet.service.ISweetIntegralActivityS
import com.liquidnet.client.admin.zhengzai.sweet.utils.SweetObjectAdminUtil;
import com.liquidnet.client.admin.zhengzai.sweet.utils.SweetRedisAdminUtils;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.sweet.constant.StatusConst;
import com.liquidnet.service.sweet.dto.SweetIntegralActivityDto;
import com.liquidnet.service.sweet.dto.param.admin.SweetIntegralActivityFromParam;
import com.liquidnet.service.sweet.dto.param.admin.SweetIntegralActivityListSearchParam;
import com.liquidnet.service.sweet.dto.param.admin.SweetIntegralActivityPrizeFormParam;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeRelationVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityVo;
import com.liquidnet.service.sweet.dto.vo.admin.SweetIntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.admin.SweetIntegralActivityVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivity;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrize;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrizeRelation;
import com.liquidnet.service.sweet.mapper.SweetIntegralActivityDrawMapper;
import com.liquidnet.service.sweet.mapper.SweetIntegralActivityMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.service.sweet.mapper.SweetIntegralActivityPrizeMapper;
import com.liquidnet.service.sweet.mapper.SweetIntegralActivityPrizeRelationMapper;
import com.liquidnet.service.sweet.utils.SweetNewObjectUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
......@@ -42,11 +49,13 @@ import java.util.List;
public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralActivityMapper, SweetIntegralActivity> implements ISweetIntegralActivityService {
@Autowired
SweetIntegralActivityMapper sweetIntegralActivityMapper;
private SweetIntegralActivityMapper sweetIntegralActivityMapper;
@Autowired
SweetIntegralActivityPrizeMapper sweetIntegralActivityPrizeMapper;
private SweetIntegralActivityPrizeMapper sweetIntegralActivityPrizeMapper;
@Autowired
SweetIntegralActivityDrawMapper sweetIntegralActivityDrawMapper;
private SweetIntegralActivityDrawMapper sweetIntegralActivityDrawMapper;
@Autowired
private SweetIntegralActivityPrizeRelationMapper relationMapper;
@Autowired
private SweetRedisAdminUtils sweetRedisAdminUtils;
......@@ -61,20 +70,21 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
List<SweetIntegralActivityPrizeFormParam> prizeList = param.getPrizeList();
if (!CollectionUtils.isEmpty(prizeList)) {
for (SweetIntegralActivityPrizeFormParam prize : prizeList) {
if (prize.getPrizeType() == 2) {
prize.setPrizeTypeNum(100);
} else {
prize.setPrizeTypeNum(1);
}
SweetIntegralActivityPrize sweetIntegralActivityPrize = SweetIntegralActivityPrizeFormParam.getNew().copy(prize);
sweetIntegralActivityPrize.setPrizeId(IDGenerator.nextSnowId());
String prizeId = IDGenerator.nextSnowId();
sweetIntegralActivityPrize.setPrizeId(prizeId);
sweetIntegralActivityPrize.setIntegralActivityId(integralActivityId);
sweetIntegralActivityPrizeMapper.insert(sweetIntegralActivityPrize);
// 奖品库存和中奖人数redis
if (prize.getIsInfinite() == 2) {
sweetIntegralActivityPrize.setPrizeNum(0);
} else {
// 奖品库存
sweetRedisAdminUtils.incrIntegralActivityPrizeNum(integralActivityId, sweetIntegralActivityPrize.getPrizeId(), sweetIntegralActivityPrize.getPrizeNum());
sweetRedisAdminUtils.incrIntegralActivityPrizeWinnersNum(integralActivityId, sweetIntegralActivityPrize.getPrizeId(), sweetIntegralActivityPrize.getWinnersNum());
}
sweetIntegralActivityPrizeMapper.insert(sweetIntegralActivityPrize);
}
}
// 预估人数
sweetRedisAdminUtils.incrIntegralActivityEstimatedNum(integralActivityId, sweetIntegralActivity.getEstimatedNum());
// 活动redis处理
this.integralActivityList(integralActivityId);
return insert;
......@@ -87,49 +97,54 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
@Override
public Integer updateForm(SweetIntegralActivityFromParam param) {
try {
LocalDateTime nowTime = LocalDateTime.now();
SweetIntegralActivity sweetIntegralActivity = SweetIntegralActivityFromParam.getNew().copy(param);
sweetIntegralActivity.setUpdatedAt(LocalDateTime.now());
sweetIntegralActivity.setUpdatedAt(nowTime);
String integralActivityId = param.getIntegralActivityId();
SweetIntegralActivity sweetIntegralActivityOld = sweetIntegralActivityMapper.selectOne(
Wrappers.lambdaQuery(SweetIntegralActivity.class).eq(SweetIntegralActivity::getIntegralActivityId, integralActivityId)
);
int update = sweetIntegralActivityMapper.update(
sweetIntegralActivity,
Wrappers.lambdaUpdate(SweetIntegralActivity.class).eq(SweetIntegralActivity::getIntegralActivityId, integralActivityId)
);
Integer estimatedNum = sweetIntegralActivityOld.getEstimatedNum();
Integer estimatedNumNew = sweetIntegralActivity.getEstimatedNum();
int estimatedNumDiff = estimatedNumNew - estimatedNum;
if (estimatedNumDiff > 0) {//增加
sweetRedisAdminUtils.incrIntegralActivityEstimatedNum(integralActivityId, estimatedNumDiff);
} else if(estimatedNumDiff < 0) {// 减少
sweetRedisAdminUtils.decrIntegralActivityEstimatedNum(integralActivityId, Math.abs(estimatedNumDiff));
}
List<SweetIntegralActivityPrizeFormParam> prizeList = param.getPrizeList();
if (!CollectionUtils.isEmpty(prizeList)) {
for (SweetIntegralActivityPrizeFormParam prize : prizeList) {
SweetIntegralActivityPrize sweetIntegralActivityPrize = SweetIntegralActivityPrizeFormParam.getNew().copy(prize);
sweetIntegralActivityPrize.setUpdatedAt(LocalDateTime.now());
sweetIntegralActivityPrize.setIntegralActivityId(integralActivityId);
sweetIntegralActivityPrize.setUpdatedAt(nowTime);
String prizeId = prize.getPrizeId();
if (prize.getPrizeType() == 2) {
sweetIntegralActivityPrize.setPrizeTypeNum(100);
if (prize.getIsInfinite() == 2) {
sweetIntegralActivityPrize.setPrizeNum(0);
sweetRedisAdminUtils.delIntegralActivityPrizeNum(integralActivityId, prizeId);
} else {
sweetIntegralActivityPrize.setPrizeTypeNum(1);
}
// 处理奖品库存
SweetIntegralActivityPrize sweetIntegralActivityPrizeOld = sweetIntegralActivityPrizeMapper.selectOne(
Wrappers.lambdaQuery(SweetIntegralActivityPrize.class).eq(SweetIntegralActivityPrize::getPrizeId, prizeId)
);
sweetIntegralActivityPrizeMapper.update(
sweetIntegralActivityPrize,
Wrappers.lambdaUpdate(SweetIntegralActivityPrize.class).eq(SweetIntegralActivityPrize::getPrizeId, prizeId)
);
Integer prizeNum = sweetIntegralActivityPrizeOld.getPrizeNum();
Integer winnersNum = sweetIntegralActivityPrizeOld.getWinnersNum();
Integer prizeNumNew = sweetIntegralActivityPrize.getPrizeNum();
Integer winnersNumNew = sweetIntegralActivityPrize.getWinnersNum();
int prizeNumDiff = prizeNumNew - prizeNum;
int winnersNumDiff = winnersNumNew - winnersNum;
if (prizeNumDiff > 0) {//增加库存
sweetRedisAdminUtils.incrIntegralActivityPrizeNum(integralActivityId, prizeId, prizeNumDiff);
} else if(prizeNumDiff < 0) {// 减少库存
sweetRedisAdminUtils.decrIntegralActivityPrizeNum(integralActivityId, prizeId, Math.abs(prizeNumDiff));
}
if (winnersNumDiff > 0) {//增加中奖人数
sweetRedisAdminUtils.incrIntegralActivityPrizeWinnersNum(integralActivityId, prizeId, winnersNumDiff);
} else if(winnersNumDiff < 0) {// 减少中奖人数
sweetRedisAdminUtils.decrIntegralActivityPrizeWinnersNum(integralActivityId, prizeId, Math.abs(winnersNumDiff));
}
sweetIntegralActivityPrizeMapper.update(
sweetIntegralActivityPrize,
Wrappers.lambdaUpdate(SweetIntegralActivityPrize.class).eq(SweetIntegralActivityPrize::getPrizeId, prizeId)
);
}
}
// 活动redis处理
......@@ -184,6 +199,31 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
public PageInfo<SweetIntegralActivityDto> list(SweetIntegralActivityListSearchParam listParam) {
PageHelper.startPage(listParam.getPageNum(), listParam.getPageSize());
List<SweetIntegralActivityDto> voList = sweetIntegralActivityMapper.searchActivityList(listParam.getActivityTitle());
for (SweetIntegralActivityDto activityDto : voList) {
String activityId = activityDto.getIntegralActivityId();
// 实物总库存、实物已发放数量
int sureTotalPrizeNum = sweetIntegralActivityPrizeMapper.sureTotalPrizeNum(activityId);
int sureOutPrizeNum = sweetIntegralActivityDrawMapper.sureOutPrizeNum(activityId);
// 总抽奖次数、redis去除黑名单抽奖次数
int totalDrawNum = sweetIntegralActivityDrawMapper.totalDrawNum(activityId);
int diffEstimatedNum = sweetRedisAdminUtils.getIntegralActivityEstimatedNum(activityId);
int notBlackDrawNum = 0;
if (diffEstimatedNum > 0) {
notBlackDrawNum = activityDto.getEstimatedNum() - diffEstimatedNum;
} else {
notBlackDrawNum = activityDto.getEstimatedNum() + Math.abs(diffEstimatedNum);
}
// 积分和券的总库存、已发放的数量
int otherTotalPrizeNum = sweetIntegralActivityPrizeMapper.otherTotalPrizeNum(activityId);
int otherOutPrizeNum = sweetIntegralActivityDrawMapper.otherOutPrizeNum(activityId);
activityDto.setSureTotalPrizeNum(sureTotalPrizeNum);
activityDto.setSureOutPrizeNum(sureOutPrizeNum);
activityDto.setTotalDrawNum(totalDrawNum);
activityDto.setNotBlackDrawNum(notBlackDrawNum);
activityDto.setOtherTotalPrizeNum(otherTotalPrizeNum);
activityDto.setOtherOutPrizeNum(otherOutPrizeNum);
}
return new PageInfo(voList);
}
......@@ -199,15 +239,76 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
voList.add(copy);
});
sweetRedisAdminUtils.setIntegralActivityList(voList);
// 活动详情
SweetIntegralActivity sweetIntegralActivity = sweetIntegralActivityMapper.selectOne(
Wrappers.lambdaQuery(SweetIntegralActivity.class).eq(SweetIntegralActivity::getIntegralActivityId, integralActivityId)
);
IntegralActivityVo integralActivityVo = IntegralActivityVo.getNew().copy(sweetIntegralActivity);
List<SweetIntegralActivityPrize> sweetIntegralActivityPrizes = sweetIntegralActivityPrizeMapper.selectList(
// 详情奖品 全部
List<SweetIntegralActivityPrize> activityPrizes = sweetIntegralActivityPrizeMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityPrize.class).eq(SweetIntegralActivityPrize::getIntegralActivityId, integralActivityId)
);
integralActivityVo.setPrizeList(sweetIntegralActivityPrizes);
List<IntegralActivityPrizeVo> prizeList = SweetObjectAdminUtil.getSweetIntegralActivityPrizeVoList();
activityPrizes.forEach(r -> {
IntegralActivityPrizeVo copy = IntegralActivityPrizeVo.getNew().copy(r);
// 奖品券列表
List<SweetIntegralActivityPrizeRelation> prizeRelations = relationMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityPrizeRelation.class).eq(SweetIntegralActivityPrizeRelation::getPrizeId, copy.getPrizeId())
);
ArrayList<IntegralActivityPrizeRelationVo> prizeRelationVoList = SweetObjectAdminUtil.getSweetIntegralActivityPrizeRelationVoList();
if (!CollectionUtils.isEmpty(prizeRelations)) {
prizeRelations.forEach(rr -> {
IntegralActivityPrizeRelationVo copyR = IntegralActivityPrizeRelationVo.getNew().copy(rr);
prizeRelationVoList.add(copyR);
});
}
copy.setPrizeRelationList(prizeRelationVoList);
prizeList.add(copy);
});
integralActivityVo.setPrizeList(prizeList);
// 详情奖品 积分和券
List<SweetIntegralActivityPrize> activityPrizes1 = sweetIntegralActivityPrizeMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityPrize.class).eq(SweetIntegralActivityPrize::getIntegralActivityId, integralActivityId)
.in(SweetIntegralActivityPrize::getPrizeType, Arrays.asList(StatusConst.PRIZE_TYPE1, StatusConst.PRIZE_TYPE2))
);
List<IntegralActivityPrizeVo> prizeList1 = SweetObjectAdminUtil.getSweetIntegralActivityPrizeVoList();
activityPrizes1.forEach(r -> {
IntegralActivityPrizeVo copy = IntegralActivityPrizeVo.getNew().copy(r);
// 奖品券列表
List<SweetIntegralActivityPrizeRelation> prizeRelations = relationMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityPrizeRelation.class).eq(SweetIntegralActivityPrizeRelation::getPrizeId, copy.getPrizeId())
);
ArrayList<IntegralActivityPrizeRelationVo> prizeRelationVoList = SweetObjectAdminUtil.getSweetIntegralActivityPrizeRelationVoList();
if (!CollectionUtils.isEmpty(prizeRelations)) {
prizeRelations.forEach(rr -> {
IntegralActivityPrizeRelationVo copyR = IntegralActivityPrizeRelationVo.getNew().copy(rr);
prizeRelationVoList.add(copyR);
});
}
copy.setPrizeRelationList(prizeRelationVoList);
prizeList1.add(copy);
});
integralActivityVo.setPrizeList1(prizeList1);
// 详情奖品 实物等
List<SweetIntegralActivityPrize> activityPrizes2 = sweetIntegralActivityPrizeMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityPrize.class).eq(SweetIntegralActivityPrize::getIntegralActivityId, integralActivityId)
.in(SweetIntegralActivityPrize::getPrizeType, Arrays.asList(StatusConst.PRIZE_TYPE3, StatusConst.PRIZE_TYPE4, StatusConst.PRIZE_TYPE5))
);
List<IntegralActivityPrizeVo> prizeList2 = SweetObjectAdminUtil.getSweetIntegralActivityPrizeVoList();
int totalPrizeNum = 0;
for (SweetIntegralActivityPrize prize : activityPrizes2) {
IntegralActivityPrizeVo copy = IntegralActivityPrizeVo.getNew().copy(prize);
prizeList2.add(copy);
int prizeNum = sweetRedisAdminUtils.getIntegralActivityPrizeNum(integralActivityId, prize.getPrizeId());
totalPrizeNum += prizeNum;
}
sweetRedisAdminUtils.setIntegralActivityTotalPrizeNum(integralActivityId, totalPrizeNum);
integralActivityVo.setPrizeList2(prizeList2);
sweetRedisAdminUtils.setIntegralActivityInfo(integralActivityVo);
}
......
package com.liquidnet.client.admin.zhengzai.sweet.utils;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeRelationVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityVo;
import java.util.ArrayList;
public class SweetObjectAdminUtil {
private static final ArrayList<IntegralActivityVo> sweetIntegralActivityVoList = new ArrayList<>();
private static final ArrayList<IntegralActivityPrizeVo> sweetIntegralActivityPrizeVoList = new ArrayList<>();
private static final ArrayList<IntegralActivityPrizeVo> sweetIntegralActivityPrizeRelationVoList = new ArrayList<>();
public static ArrayList<IntegralActivityVo> getSweetIntegralActivityVoList() {
return (ArrayList<IntegralActivityVo>)sweetIntegralActivityVoList.clone();
}
public static ArrayList<IntegralActivityPrizeVo> getSweetIntegralActivityPrizeVoList() {
return (ArrayList<IntegralActivityPrizeVo>)sweetIntegralActivityPrizeVoList.clone();
}
public static ArrayList<IntegralActivityPrizeRelationVo> getSweetIntegralActivityPrizeRelationVoList() {
return (ArrayList<IntegralActivityPrizeRelationVo>)sweetIntegralActivityPrizeRelationVoList.clone();
}
}
......@@ -5,7 +5,6 @@ import com.liquidnet.service.sweet.constant.SweetConstant;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityDrawVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import java.util.LinkedList;
......@@ -14,8 +13,6 @@ import java.util.List;
@Component
public class SweetRedisAdminUtils {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private RedisDataSourceUtil redisDataSourceUtil;
......@@ -29,6 +26,9 @@ public class SweetRedisAdminUtils {
boolean set = redisDataSourceUtil.getRedisSweetUtil().set(redisKey, integralActivityVo);
}
/**
* 奖品库存
*/
public void incrIntegralActivityPrizeNum(String integralActivityId, String prizeId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_NUM
.concat(integralActivityId)
......@@ -36,37 +36,46 @@ public class SweetRedisAdminUtils {
.concat(prizeId);
redisDataSourceUtil.getRedisSweetUtil().incr(redisKey, num);
}
public void incrIntegralActivityPrizeWinnersNum(String integralActivityId, String prizeId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_WINNERS_NUM
public void decrIntegralActivityPrizeNum(String integralActivityId, String prizeId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_NUM
.concat(integralActivityId)
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_ID)
.concat(prizeId);
redisDataSourceUtil.getRedisSweetUtil().incr(redisKey, num);
redisDataSourceUtil.getRedisSweetUtil().decr(redisKey, num);
}
public void decrIntegralActivityPrizeNum(String integralActivityId, String prizeId, Integer num) {
public void delIntegralActivityPrizeNum(String integralActivityId, String prizeId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_NUM
.concat(integralActivityId)
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_ID)
.concat(prizeId);
redisDataSourceUtil.getRedisSweetUtil().decr(redisKey, num);
redisDataSourceUtil.getRedisSweetUtil().del(redisKey);
}
public void decrIntegralActivityPrizeWinnersNum(String integralActivityId, String prizeId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_WINNERS_NUM
public int getIntegralActivityPrizeNum(String integralActivityId, String prizeId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_NUM
.concat(integralActivityId)
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_ID)
.concat(prizeId);
redisDataSourceUtil.getRedisSweetUtil().decr(redisKey, num);
Object obj = redisDataSourceUtil.getRedisSweetUtil().get(redisKey);
if (null == obj) {
return 0;
} else {
return (int) obj;
}
}
public void setIntegralActivityDraw(LinkedList<IntegralActivityDrawVo> sweetIntegralActivityDraws, String integralActivityId, String userId) {
public void setIntegralActivityTotalPrizeNum(String integralActivityId, int totalPrizeNum) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_TOTAL_PRIZE_NUM
.concat(integralActivityId);
redisDataSourceUtil.getRedisSweetUtil().set(redisKey, totalPrizeNum);
}
public void delIntegralActivityDrawList(String uid, String integralActivityId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_IN_USER
.concat(integralActivityId)
.concat(":userId:")
.concat(userId);
redisDataSourceUtil.getRedisSweetUtil().set(redisKey, sweetIntegralActivityDraws);
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER_KEY)
.concat(uid);
redisDataSourceUtil.getRedisSweetUtil().del(redisKey);
}
public void setIntegralActivityDrawInfo(String drawId) {
......@@ -76,4 +85,30 @@ public class SweetRedisAdminUtils {
info.setReceivingStatus(2);
redisDataSourceUtil.getRedisSweetUtil().set(redisKeyDraw, info);
}
/**
* 预估人数
*/
public void incrIntegralActivityEstimatedNum(String integralActivityId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM
.concat(integralActivityId);
redisDataSourceUtil.getRedisSweetUtil().incr(redisKey, num);
}
public void decrIntegralActivityEstimatedNum(String integralActivityId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM
.concat(integralActivityId);
redisDataSourceUtil.getRedisSweetUtil().decr(redisKey, num);
}
public int getIntegralActivityEstimatedNum(String integralActivityId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM
.concat(integralActivityId);
Object obj = redisDataSourceUtil.getRedisSweetUtil().get(redisKey);
if (null == obj) {
return 0;
} else {
return (int) obj;
}
}
}
......@@ -84,10 +84,11 @@ public class MQConst {
SWEET_TEMPLATE_MSG("sweet:stream:rk.sweetTemplateMsg", "group.sweetTemplateMsg", "发送模版消息"),
SWEET_CITY_VOTE("sweet:stream:rk.cityVote", "group.cityVote", "用户投票记录"),
SWEET_ANTIGENIC_QUESTION("sweet:stream:rk.antigenicQuestion", "group.antigenicQuestion", "防疫答题"),
SWEET_INTEGRAL_ACTIVITY_DRAW("sweet:stream:rk.integralActivityDraw", "group.integralActivityDraw", "积分抽奖"),
SWEET_POSTER("sweet:stream:rk.userLikeMusician", "group.userLikeMusician", "用户喜欢的音乐人"),
SWEET_WECHAT_MAODENG_TEXT_INSERT("sweet:stream:rk.textAndImgInsert", "group.sweetMaoDengInsert", "猫登天空"),
SWEET_INTEGRAL_ACTIVITY_DRAW("sweet:stream:rk.integralActivityDraw", "group.integralActivityDraw", "积分抽奖"),
SWEET_STONE_INTEGRAL("sweet:stream:rk.stoneIntegral", "group.stoneIntegral", "stone积分处理"),
;
private final String key;
......
......@@ -48,7 +48,7 @@ liquidnet:
database: 15
host: 39.107.71.112
port: 6379
password: PO@B!Iud32
password: 3Xa%8p
adam:
dbs: 0,16
database: 15
......
......@@ -112,6 +112,8 @@ global-auth:
- ${liquidnet.info.context}/integralActivityDraw/detail/*
- ${liquidnet.info.context}/integralActivityDraw/drawList
- ${liquidnet.info.context}/integralActivityDraw/perfectAddress
- ${liquidnet.info.context}/integralActivityDraw/collectCoupon
- ${liquidnet.info.context}/integralActivityDraw/couponList
# 手机号获取是否关注
- ${liquidnet.info.context}/wechatTemplate/followStatusPhone
# 做积分任务
......
package com.liquidnet.service.candy.dto;
import com.liquidnet.service.candy.entity.CandyCouponRule;
import lombok.Data;
import java.io.Serializable;
......@@ -25,4 +26,14 @@ public class CandyCouponRuleDto implements Serializable, Cloneable {
return new CandyCouponRuleDto();
}
}
public CandyCouponRuleDto copy(CandyCouponRule source) {
if (null == source) return this;
this.setCruleId(source.getCruleId());
this.setCouponId(source.getCouponId());
this.setUseScope(source.getUseScope());
this.setBusiName(source.getBusiName());
this.setBusiId(source.getBusiId());
return this;
}
}
package com.liquidnet.service.candy.dto.admin;
import com.liquidnet.service.candy.entity.CandyCoupon;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class CandyCouponFilterDto implements Serializable, Cloneable {
private static final long serialVersionUID = -3287018184399499549L;
private String couponId;
private String title;
private String notice;
private Integer busiType;
private Integer couType;
private Integer bindType;
private BigDecimal discount;
private BigDecimal valFace;
private BigDecimal valOver;
private BigDecimal valMinus;
private String busiName;
private static final CandyCouponFilterDto obj = new CandyCouponFilterDto();
......@@ -20,11 +30,4 @@ public class CandyCouponFilterDto implements Serializable, Cloneable {
return new CandyCouponFilterDto();
}
}
public CandyCouponFilterDto copy(CandyCoupon source) {
if (null == source) return this;
this.setCouponId(source.getCouponId());
this.setTitle(source.getTitle());
return this;
}
}
......@@ -10,7 +10,7 @@ public class CandyCouponListParam {
*/
private String keyword;
/**
* 领取方式[0-用户输入兑换|1-发放至用户|2-积分兑换|3-发放需领取|4-会员专属]
* 领取方式[0-用户输入兑换|1-发放至用户|2-积分商品|3-发放需领取|4-会员专属]
* <p>
* 多种方式则以,分隔入参
* </p>
......
......@@ -12,7 +12,7 @@ public class CandyMgtCouponListParam {
*/
private String keyword;
/**
* 领取方式[0-用户输入兑换|1-发放至用户|2-积分兑换|3-发放需领取|4-会员专属]
* 领取方式[0-用户输入兑换|1-发放至用户|2-积分商品|3-发放需领取|4-会员专属]
*/
private Integer bindType;
/**
......
......@@ -65,7 +65,7 @@ public class CandyCoupon implements Serializable {
private Integer couType;
/**
* 领取方式[0-用户输入兑换|1-发放至用户|2-积分兑换|3-发放需领取|4-会员专属]
* 领取方式[0-用户输入兑换|1-发放至用户|2-积分商品|3-发放需领取|4-会员专属]
*/
private Integer bindType;
......
......@@ -57,6 +57,11 @@ public class CandyMgtCoupon implements Serializable {
*/
private LocalDateTime eventAt;
/**
* 任务驱动[0-系统自动,1-人为创建]
*/
private Integer eventDriven;
/**
* 专享标识[0-常规|1-会员专属]
* <p>
......
package com.liquidnet.service.candy.mapper;
import com.liquidnet.service.candy.dto.admin.CandyCouponFilterDto;
import com.liquidnet.service.candy.dto.admin.CandyCouponListParam;
import com.liquidnet.service.candy.entity.CandyCoupon;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
* <p>
* 券基础信息 Mapper 接口
......@@ -13,4 +17,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface CandyCouponMapper extends BaseMapper<CandyCoupon> {
List<CandyCouponFilterDto> selectMultiForCouponFilterDto(CandyCouponListParam listParam);
}
......@@ -2,4 +2,37 @@
<!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.CandyCouponMapper">
<select id="selectMultiForCouponFilterDto" parameterType="com.liquidnet.service.candy.dto.admin.CandyCouponListParam"
resultType="com.liquidnet.service.candy.dto.admin.CandyCouponFilterDto">
SELECT DISTINCT cc.coupon_id couponId,
cc.title,
cc.notice,
cc.cou_type couType,
cc.busi_type busiType,
cc.bind_type bindType,
cc.val_face valFace,
cc.val_over valOver,
cc.val_minus valMinus,
cc.discount,
ccr.busi_name busiName
FROM candy_coupon cc
LEFT JOIN candy_coupon_rule ccr ON cc.coupon_id = ccr.coupon_id
<where>
cc.state = 1 AND ccr.state = 1
<if test="couType != null">
AND cc.cou_type=#{couType,jdbcType=SMALLINT}
</if>
<if test="bindType != null">
AND cc.bind_type in (${bindType})
</if>
<if test="busiType != null">
AND cc.busi_type = #{busiType,jdbcType=SMALLINT}
</if>
<if test="keyword != null and keyword != ''">
AND INSTR(CONCAT(cc.title, cc.notice, ccr.busi_name), #{keyword,jdbcType=VARCHAR})
</if>
</where>
</select>
</mapper>
......@@ -119,7 +119,7 @@
FROM candy_mgt_coupon cmc
LEFT JOIN candy_coupon cc ON cmc.coupon_id = cc.coupon_id
WHERE cmc.state <![CDATA[<>]]> 2
AND cc.`exclusive` = 0
AND cmc.event_driven=1
<if test="mcouponId != null and mcouponId != ''">
AND cmc.mcoupon_id = #{mcouponId,jdbcType=VARCHAR}
</if>
......
......@@ -38,7 +38,7 @@ public class SweetActivityDrawListDao implements Serializable {
private String prizeTitle;
/**
* 奖品类型 1谢谢惠顾 2积分 3代金券 4满减券 5优先购买券 6实物
* 奖品类型 1积分 2优惠券 3实物 4登登登VIP 5优先购买券惠顾 2积分 3代金券 4满减券 5优先购买券 6实物
*/
private Integer prizeType;
......@@ -104,7 +104,7 @@ public class SweetActivityDrawListDao implements Serializable {
private String receivingAddressAll;
/**
* 发放状态 1未发放 2已发放 3无需发放
* 发放状态 1未发放 2已发放
*/
private Integer receivingStatus;
......
......@@ -34,6 +34,11 @@ public class SweetIntegralActivityDto {
*/
private Integer activityNum;
/**
* 预估玩此活动的总人数
*/
private Integer estimatedNum;
/**
* 活动时间类型 1长期 2开始结束时间
*/
......@@ -54,11 +59,6 @@ public class SweetIntegralActivityDto {
*/
private Integer expressFeeType;
/**
* 活动规则
*/
private String activityRules;
/**
* 是否上线 1未上线 2已上线
*/
......@@ -76,6 +76,32 @@ public class SweetIntegralActivityDto {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private LocalDateTime updatedAt;
private Integer prizeNum;
private Integer drawNum;
// private Integer prizeNum;
// private Integer drawNum;
/**
* 实物总库存
*/
private Integer sureTotalPrizeNum;
/**
* 实物已发放数量
*/
private Integer sureOutPrizeNum;
/**
* 已抽奖次数
*/
private Integer totalDrawNum;
/**
* 去除黑名单已抽奖次数
*/
private Integer notBlackDrawNum;
/**
* 非实物总库存
*/
private Integer otherTotalPrizeNum;
/**
* 非实物已发放数量
*/
private Integer otherOutPrizeNum;
}
......@@ -39,9 +39,6 @@ public class SweetIntegralActivityDrawListSearchParam implements Serializable {
@ApiModelProperty(value = "发放状态")
private Integer receivingStatus;
@ApiModelProperty(value = "是否中奖")
private Integer isWin;
@ApiModelProperty(value = "页数", example = "0")
private Integer pageSize;
......
......@@ -51,6 +51,11 @@ public class SweetIntegralActivity implements Serializable, Cloneable {
*/
private Integer activityNum;
/**
* 预估玩此活动的总人数
*/
private Integer estimatedNum;
/**
* 活动时间类型 1长期 2开始结束时间
*/
......@@ -76,6 +81,11 @@ public class SweetIntegralActivity implements Serializable, Cloneable {
*/
private String activityRules;
/**
* 概率公示
*/
private String probabilityPublicity;
/**
* 是否上线 1未上线 2已上线
*/
......
......@@ -54,7 +54,7 @@ public class SweetIntegralActivityDraw implements Serializable, Cloneable {
private String prizeTitle;
/**
* 奖品类型 1谢谢惠顾 2积分 3代金券 4满减券 5优先购买券 6实物
* 奖品类型 1积分 2优惠券 3实物 4登登登VIP 5优先购买券惠顾 2积分 3代金券 4满减券 5优先购买券 6实物
*/
private Integer prizeType;
......@@ -114,7 +114,7 @@ public class SweetIntegralActivityDraw implements Serializable, Cloneable {
private String receivingAddress;
/**
* 发放状态 1未发放 2已发放 3无需发放
* 发放状态 1未发放 2已发放
*/
private Integer receivingStatus;
......
package com.liquidnet.service.sweet.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* <p>
* 积分活动奖品表
......@@ -43,6 +41,11 @@ public class SweetIntegralActivityPrize implements Serializable, Cloneable {
*/
private String prizeTitle;
/**
* 奖品描述
*/
private String prizeDescribe;
/**
* 初始展示奖品图片
*/
......@@ -54,7 +57,7 @@ public class SweetIntegralActivityPrize implements Serializable, Cloneable {
private String prizeImgSelect;
/**
* 奖品类型 1谢谢惠顾 2积分 3代金券 4满减券 5优先购买券 6实物
* 奖品类型 1积分 2优惠券 3实物 4登登登VIP
*/
private Integer prizeType;
......@@ -63,20 +66,15 @@ public class SweetIntegralActivityPrize implements Serializable, Cloneable {
*/
private Integer prizeTypeNum;
/**
* 关联id 如商品id 券id
*/
private String relationId;
/**
* 奖品数量
*/
private Integer prizeNum;
/**
* 限制的中奖人数
* 是否是无限库存 1有限库存 2无限
*/
private Integer winnersNum;
private Integer isInfinite;
/**
* 中奖概率
......
package com.liquidnet.service.sweet.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 积分活动奖品里关联多奖品表
* </p>
*
* @author jiangxiulong
* @since 2021-12-02
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class SweetIntegralActivityPrizeRelation implements Serializable, Cloneable {
private static final long serialVersionUID = 3400664786004300429L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* prize_relation_id
*/
private String prizeRelationId;
/**
* prize_id
*/
private String prizeId;
/**
* 券id
*/
private String couponId;
/**
* 券名称
*/
private String couponTitle;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 更新时间
*/
private LocalDateTime updatedAt;
private static final SweetIntegralActivityPrizeRelation obj = new SweetIntegralActivityPrizeRelation();
public static SweetIntegralActivityPrizeRelation getNew() {
try {
return (SweetIntegralActivityPrizeRelation) obj.clone();
} catch (CloneNotSupportedException e) {
return new SweetIntegralActivityPrizeRelation();
}
}
}
......@@ -21,4 +21,10 @@ public interface SweetIntegralActivityDrawMapper extends BaseMapper<SweetIntegra
List<SweetActivityDrawListDao> selectExcelList(@Param("integralActivityId") String integralActivityId);
List<SweetActivityDrawListDao> searchLists(SweetIntegralActivityDrawListSearchParam listParam);
int sureOutPrizeNum(String activityId);
int totalDrawNum(String activityId);
int otherOutPrizeNum(String activityId);
}
......@@ -13,4 +13,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface SweetIntegralActivityPrizeMapper extends BaseMapper<SweetIntegralActivityPrize> {
int sureTotalPrizeNum(String activityId);
int otherTotalPrizeNum(String activityId);
}
package com.liquidnet.service.sweet.mapper;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrizeRelation;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 积分活动奖品里关联多奖品表 Mapper 接口
* </p>
*
* @author jiangxiulong
* @since 2021-12-02
*/
public interface SweetIntegralActivityPrizeRelationMapper extends BaseMapper<SweetIntegralActivityPrizeRelation> {
}
......@@ -43,13 +43,36 @@
<if test="receivingStatus != null and receivingStatus != ''">
and a.receiving_status = #{prizeTyreceivingStatuspe}
</if>
<if test="isWin == 1">
and a.prize_type = 1
</where>
ORDER BY a.mid DESC
</select>
<select id="sureOutPrizeNum" resultType="java.lang.Integer">
select COUNT(*)
from sweet_integral_activity_draw
<where>
<if test="integralActivityId != null and integralActivityId != ''">
and integral_activity_id = #{integralActivityId}
</if>
<if test="isWin == 2">
and a.prize_type != 1
and prize_type in (3, 4, 5)
</where>
</select>
<select id="totalDrawNum" resultType="java.lang.Integer">
select COUNT(*)
from sweet_integral_activity_draw
<where>
<if test="integralActivityId != null and integralActivityId != ''">
and integral_activity_id = #{integralActivityId}
</if>
</where>
ORDER BY a.mid DESC
</select>
<select id="otherOutPrizeNum" resultType="java.lang.Integer">
select COUNT(*)
from sweet_integral_activity_draw
<where>
<if test="integralActivityId != null and integralActivityId != ''">
and integral_activity_id = #{integralActivityId}
</if>
and prize_type in (1, 2)
</where>
</select>
</mapper>
......@@ -3,7 +3,7 @@
<mapper namespace="com.liquidnet.service.sweet.mapper.SweetIntegralActivityMapper">
<select id="searchActivityList" resultType="com.liquidnet.service.sweet.dto.SweetIntegralActivityDto">
SELECT
<!--SELECT
d.*, sum(b.prize_num) AS prize_num
FROM (
SELECT a.*, count(c.prize_id) AS draw_num
......@@ -18,6 +18,15 @@
ORDER BY a.integral_activity_id DESC
) d
LEFT JOIN sweet_integral_activity_prize AS b ON d.integral_activity_id = b.integral_activity_id
GROUP BY d.integral_activity_id
GROUP BY d.integral_activity_id-->
SELECT
*
FROM sweet_integral_activity
<where>
<if test="activityTitle != null and activityTitle != ''">
and activity_title like concat('%', #{activityTitle}, '%')
</if>
</where>
ORDER BY mid DESC
</select>
</mapper>
......@@ -2,4 +2,24 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.service.sweet.mapper.SweetIntegralActivityPrizeMapper">
<select id="sureTotalPrizeNum" resultType="java.lang.Integer">
select ifnull(SUM(prize_num), 0)
from sweet_integral_activity_prize
<where>
<if test="integralActivityId != null and integralActivityId != ''">
and integral_activity_id = #{integralActivityId}
</if>
and prize_type in (3, 4, 5)
</where>
</select>
<select id="otherTotalPrizeNum" resultType="java.lang.Integer">
select ifnull(SUM(prize_num), 0)
from sweet_integral_activity_prize
<where>
<if test="integralActivityId != null and integralActivityId != ''">
and integral_activity_id = #{integralActivityId}
</if>
and prize_type in (1, 2)
</where>
</select>
</mapper>
......@@ -49,4 +49,7 @@ public interface FeignAdamBaseClient {
@RequestParam(value = "mobile") String mobile,
@NotBlank(message = "临时票据不能为空")
@RequestParam(value = "otp") String otp);
@GetMapping(value = "member/check/depth", headers = {"Inner-Required=1"})
ResponseDto<Boolean> isMember(@NotBlank(message = "用户ID不能为空") @RequestParam(value = "uid") String uid);
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>liquidnet-bus-feign</artifactId>
<groupId>com.liquidnet</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>liquidnet-api-feign-candy</artifactId>
<dependencies>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-service-candy-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
\ No newline at end of file
package com.liquidnet.service.feign.candy.api;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.candy.vo.CandyCouponPreviewVo;
import feign.hystrix.FallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
@Component
@FeignClient(name = "liquidnet-service-candy",
contextId = "FeignCandyBaseClient", path = "",
url = "${liquidnet.service.candy.url}",
fallback = FallbackFactory.Default.class)
public interface FeignCandyBaseClient {
@PostMapping(value = "rsc/couinfo", headers = {"Inner-Required=1"})
ResponseDto<List<CandyCouponPreviewVo>> couponListById(
@RequestParam("couponIds") @NotNull @NotBlank String couponIds
);
}
\ No newline at end of file
......@@ -4,17 +4,20 @@ import com.liquidnet.service.base.ResponseDto;
import feign.hystrix.FallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Component
@FeignClient(name = "liquidnet-service-sweet",
contextId = "FeignSweetTaskClient", path = "",
contextId = "FeignSweetTaskClient", path = "sweet",
url = "${liquidnet.service.sweet.url}",
// url = "",
fallback = FallbackFactory.Default.class)
public interface FeignSweetTaskClient {
@PostMapping("sweet/sweetData/drawLuck/add")
@PostMapping("sweetData/drawLuck/add")
ResponseDto<Boolean> drawLuckAdd();
@GetMapping("integralActivity/setDrawAllList")
ResponseDto<Boolean> setDrawAllList(@RequestParam("integralActivityId") String integralActivityId);
}
......@@ -19,6 +19,7 @@
<module>liquidnet-api-feign-sweet</module>
<module>liquidnet-api-feign-chime</module>
<module>liquidnet-api-feign-stone</module>
<module>liquidnet-api-feign-candy</module>
<!-- <module>liquidnet-api-feign-sequence</module>-->
<!-- <module>liquidnet-api-feign-example</module>-->
<!-- <module>liquidnet-api-feign-account</module>-->
......
......@@ -10,7 +10,7 @@ create table candy_mgt_coupon
coupon_id varchar(64) not null comment '~candy_coupon.coupon_id',
state tinyint comment '发放状态[0-未发放|1-已发放|2-无效|3-已取消|9-发放中|10-会员礼包初始模版]',
# bind_type smallint comment '领取方式[0-用户输入兑换|1-发放至用户|2-积分兑换]',
# bind_type smallint comment '领取方式[0-用户输入兑换|1-发放至用户|2-积分商品]',
event_amt int comment '发放量',
event_type tinyint comment '发放类型[0-保留|1-会员|2-手机号|10-全体用户]',
event_limit text comment '`发放类型`为2-手机号时发放手机号以,分隔',
......@@ -39,7 +39,7 @@ create table candy_coupon
exclusive smallint comment '专享标识[0-常规|1-会员礼包]',
busi_type smallint comment '业务类别[0-全场|1-演出|2-商品|3-优先购]',
cou_type smallint comment '券类型[1-代金券|2-满减券|3-兑换券|4-折扣券|101-优先券]',
bind_type smallint comment '领取方式[0-用户输入兑换|1-发放至用户|2-积分兑换|3-发放需领取|4-会员专属]',
bind_type smallint comment '领取方式[0-用户输入兑换|1-发放至用户|2-积分商品|3-发放需领取|4-会员专属]',
discount decimal(8, 2) comment '折扣[8折即0.8]',
val_face decimal(8, 2) comment '面值',
......@@ -162,7 +162,8 @@ alter table candy_mgt_coupon add exclusively smallint default 0 null comment '
alter table candy_user_coupon add exclusive smallint null comment '专享标识[0-常规|1-会员礼包]' after coupon_id;
alter table candy_common_coupon add exclusive smallint null comment '专享标识[0-常规|1-会员礼包]' after coupon_id;
-- >>------------------------------------------------------------------------------------
-- >>------------------------------------------------------------------------------------|20211208券发放任务表+区分后台人为创建与系统创建标识字段
alter table candy_mgt_coupon add event_driven tinyint default 0 null comment '任务驱动[0-系统自动,1-人为创建]' after event_at;
-- >>------------------------------------------------------------------------------------
-- >>------------------------------------------------------------------------------------
-- >>------------------------------------------------------------------------------------
......
......@@ -2,8 +2,10 @@ package com.liquidnet.service.candy.controller;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.candy.dto.CandyCouponInfoDto;
import com.liquidnet.service.candy.util.ObjectUtil;
import com.liquidnet.service.candy.util.RedisDataUtils;
import com.liquidnet.service.candy.vo.CandyCouponBasicVo;
import com.liquidnet.service.candy.vo.CandyCouponPreviewVo;
import com.liquidnet.service.candy.vo.CandyCouponVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
......@@ -19,6 +21,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
@Api(tags = "@API:RSC")
......@@ -32,12 +35,21 @@ public class CandyRscController {
@PostMapping("couinfo")
@ApiOperation("券基础详情")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "String", name = "couponId", value = "券ID", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "couponIds", value = "券ID,多个以,分割", required = true),
})
public ResponseDto<CandyCouponBasicVo> couponListById(@RequestParam("couponId") @NotNull @NotBlank String couponId) {
CandyCouponBasicVo couponBasicVo = CandyCouponBasicVo.getNew();
public ResponseDto<List<CandyCouponPreviewVo>> couponListById(@RequestParam("couponIds") @NotNull @NotBlank String couponIds) {
String[] couponIdArr = couponIds.split(",");
ArrayList<CandyCouponPreviewVo> vos = ObjectUtil.getCandyCouponPreviewVoArrayList();
for (String couponId : couponIdArr) {
CandyCouponPreviewVo couponBasicVo = CandyCouponPreviewVo.getNew();
CandyCouponInfoDto couponInfoDto = redisDataUtils.getCouponInfo(couponId);
if (null == couponInfoDto) continue;
BeanUtils.copyProperties(couponInfoDto, couponBasicVo);
return ResponseDto.success(couponBasicVo);
vos.add(couponBasicVo);
}
return ResponseDto.success(vos);
}
}
......@@ -2,11 +2,10 @@ package com.liquidnet.service.candy.util;
import com.liquidnet.service.candy.dto.CandyCommonCouponBasicDto;
import com.liquidnet.service.candy.dto.CandyUserCouponBasicDto;
import com.liquidnet.service.candy.vo.CandyCouponPreVo;
import com.liquidnet.service.candy.vo.CandyCouponRulesVo;
import com.liquidnet.service.candy.vo.CandyCouponVo;
import com.liquidnet.service.candy.vo.*;
import java.util.ArrayList;
import java.util.List;
public class ObjectUtil {
private static final ArrayList<CandyUserCouponBasicDto> candyUserCouponBasicDtoArrayList = new ArrayList<>();
......@@ -14,6 +13,8 @@ public class ObjectUtil {
private static final ArrayList<CandyCouponVo> candyCouponVoArrayList = new ArrayList<>();
private static final ArrayList<CandyCouponPreVo> candyCouponPreVoArrayList = new ArrayList<>();
private static final ArrayList<CandyCouponRulesVo> candyCouponRulesVos = new ArrayList<>();
private static final ArrayList<CandyCouponBasicVo> candyCouponBasicVoArrayList = new ArrayList<>();
private static final ArrayList<CandyCouponPreviewVo> candyCouponPreviewVoArrayList = new ArrayList<>();
public static ArrayList<CandyUserCouponBasicDto> getCandyUserCouponBasicDtoArrayList() {
return (ArrayList<CandyUserCouponBasicDto>) candyUserCouponBasicDtoArrayList.clone();
......@@ -34,4 +35,12 @@ public class ObjectUtil {
public static ArrayList<CandyCouponRulesVo> getCandyCouponRulesVos() {
return (ArrayList<CandyCouponRulesVo>) candyCouponRulesVos.clone();
}
public static ArrayList<CandyCouponBasicVo> getCandyCouponBasicVoArrayList() {
return (ArrayList<CandyCouponBasicVo>) candyCouponBasicVoArrayList.clone();
}
public static ArrayList<CandyCouponPreviewVo> getCandyCouponPreviewVoArrayList() {
return (ArrayList<CandyCouponPreviewVo>) candyCouponPreviewVoArrayList.clone();
}
}
......@@ -36,6 +36,11 @@
<artifactId>liquidnet-service-sweet-do</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-api-feign-stone</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
......
......@@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.core.env.Environment;
import java.net.InetAddress;
......@@ -15,6 +16,7 @@ import java.util.Arrays;
@Slf4j
@SpringBootApplication(scanBasePackages = {"com.liquidnet"})
@MapperScan(basePackages = {"com.liquidnet.service.sweet.mapper"})
@EnableFeignClients
public class ServiceConsumerSweetApplication implements CommandLineRunner {
@Autowired
private Environment environment;
......
package com.liquidnet.service.consumer.sweet.config;
import com.liquidnet.service.consumer.sweet.receiver.ConsumerSweetStoneIntegralReceiver;
import com.liquidnet.service.consumer.sweet.receiver.ConsumerSweetTemplateMsgReceiver;
import lombok.var;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -16,11 +17,14 @@ import org.springframework.data.redis.stream.Subscription;
import java.time.Duration;
import static com.liquidnet.service.base.constant.MQConst.SweetQueue.SWEET_TEMPLATE_MSG;
import static com.liquidnet.service.base.constant.MQConst.SweetQueue.SWEET_STONE_INTEGRAL;
@Configuration
public class ConsumerSweetTemplateMsgStreamConfig {
public class ConsumerSweetOtherApiStreamConfig {
@Autowired
ConsumerSweetTemplateMsgReceiver consumerSweetTemplateMsgReceiver;
@Autowired
ConsumerSweetStoneIntegralReceiver consumerSweetStoneIntegralReceiver;
private StreamMessageListenerContainer<String, MapRecord<String, String, String>> buildStreamMessageListenerContainer(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
......@@ -32,46 +36,73 @@ public class ConsumerSweetTemplateMsgStreamConfig {
}
/**
* 缺票登记
*
* @param listenerContainer
* @param t
* @return
* 模版消息
*/
private Subscription receiveSqlTemplateMsg(StreamMessageListenerContainer<String, MapRecord<String, String, String>> listenerContainer, int t) {
private Subscription receiveApiTemplateMsg(StreamMessageListenerContainer<String, MapRecord<String, String, String>> listenerContainer, int t) {
return listenerContainer.receiveAutoAck(
Consumer.from(SWEET_TEMPLATE_MSG.getGroup(), SWEET_TEMPLATE_MSG.name() + t),
StreamOffset.create(SWEET_TEMPLATE_MSG.getKey(), ReadOffset.lastConsumed()), consumerSweetTemplateMsgReceiver
);
}
/**
* 增减积分
*/
private Subscription receiveApiStoneIntgral(StreamMessageListenerContainer<String, MapRecord<String, String, String>> listenerContainer, int t) {
return listenerContainer.receiveAutoAck(
Consumer.from(SWEET_STONE_INTEGRAL.getGroup(), SWEET_STONE_INTEGRAL.name() + t),
StreamOffset.create(SWEET_STONE_INTEGRAL.getKey(), ReadOffset.lastConsumed()), consumerSweetStoneIntegralReceiver
);
}
/* —————————————————————————— | —————————————————————————— | —————————————————————————— */
/*----------------------------------------------------------------------------------------------------------------*/
/*------------------模版消息------------------*/
@Bean
public Subscription subscriptionApiTemplateMsg(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveApiTemplateMsg(listenerContainer, 1);
listenerContainer.start();
return subscription;
}
/* -------------------------------------------------------- | 缺票登记 */
@Bean
public Subscription subscriptionApiTemplateMsg2(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveApiTemplateMsg(listenerContainer, 1);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionSqlTemplateMsg(RedisConnectionFactory factory) {
public Subscription subscriptionApiTemplateMsg3(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveSqlTemplateMsg(listenerContainer, 1);
var subscription = receiveApiTemplateMsg(listenerContainer, 1);
listenerContainer.start();
return subscription;
}
/*------------------增减积分------------------*/
@Bean
public Subscription subscriptionSqlTemplateMsg2(RedisConnectionFactory factory) {
public Subscription subscriptionApiStoneIntgral(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveSqlTemplateMsg(listenerContainer, 1);
var subscription = receiveApiStoneIntgral(listenerContainer, 1);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionSqlTemplateMsg3(RedisConnectionFactory factory) {
public Subscription subscriptionApiStoneIntgral2(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveSqlTemplateMsg(listenerContainer, 1);
var subscription = receiveApiStoneIntgral(listenerContainer, 1);
listenerContainer.start();
return subscription;
}
/* -------------------------------------------------------- | */
@Bean
public Subscription subscriptionApiStoneIntgral3(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveApiStoneIntgral(listenerContainer, 1);
listenerContainer.start();
return subscription;
}
}
package com.liquidnet.service.consumer.sweet.receiver;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.feign.stone.api.FeignStoneIntegralClient;
import com.liquidnet.service.sweet.param.SweetStoneIntegralParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.connection.stream.StreamRecords;
import org.springframework.stereotype.Component;
import java.util.HashMap;
@Slf4j
@Component
public class ConsumerSweetStoneIntegralReceiver extends AbstractSqlRedisReceiver {
@Autowired
private FeignStoneIntegralClient feignStoneIntegralClient;
@Override
protected String getRedisStreamKey() {
return MQConst.SweetQueue.SWEET_STONE_INTEGRAL.getKey();
}
@Override
protected String getRedisStreamGroup() {
return MQConst.SweetQueue.SWEET_STONE_INTEGRAL.getGroup();
}
@Override
public void onMessage(MapRecord<String, String, String> message) {
log.debug("CONSUMER SQL[streamKey:{},messageId:{},stream:{},body:{}]",
this.getRedisStreamKey(), message.getId(), message.getStream(), message.getValue());
boolean result = this.consumerSqlDaoHandler(message.getValue().get("message"));
log.info("CONSUMER SQL RESULT:{} ==> MESSAGE_ID:{}", result, message.getId());
try {
stringRedisTemplate.opsForStream().acknowledge(getRedisStreamGroup(), message);
stringRedisTemplate.opsForStream().delete(this.getRedisStreamKey(), message.getId());
} catch (Exception e) {
log.error("#CONSUMER SQL RESULT:{} ==> DEL_REDIS_QUEUE_MSG_EXCEPTION[MESSAGE_ID:{},MSG:{}]", result, message.getId(), JsonUtils.toJson(message), e);
} finally {
try {
stringRedisTemplate.opsForStream().acknowledge(getRedisStreamGroup(), message);
stringRedisTemplate.opsForStream().delete(this.getRedisStreamKey(), message.getId());
} catch (Exception ignored) {
}
}
}
private boolean consumerSqlDaoHandler(String msg) {
Boolean aBoolean = false;
try {
SweetStoneIntegralParam param = JsonUtils.fromJson(msg, SweetStoneIntegralParam.class);
if (param == null) {
aBoolean = true;
} else {
ResponseDto<String> res = null;
if (null == param.getType()) {
aBoolean = true;
return true;
}
if (param.getType() == 1) {
res = feignStoneIntegralClient.in2111(
param.getUid(),
param.getScore(),
param.getContent()
);
} else if (param.getType() == 2) {
res = feignStoneIntegralClient.de2111(
param.getUid(),
param.getScore(),
param.getContent()
);
}
if (null != res && res.getCode().equals("0")) {
aBoolean = true;
}
}
} catch (Exception e) {
log.error("CONSUMER SQL FAIL ==> {}", e.getMessage(), e);
} finally {
if (!aBoolean) {
HashMap<String, String> map = CollectionUtil.mapStringString();
map.put("message", msg);
stringRedisTemplate.opsForStream().add(StreamRecords.mapBacked(map).withStreamKey(this.getRedisStreamKey()));
}
}
return aBoolean;
}
}
......@@ -2,6 +2,7 @@ package com.liquidnet.service.executor.main.handler;
import com.liquidnet.service.feign.sweet.task.FeignSweetTaskClient;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -33,4 +34,29 @@ public class SweetTaskHandler {
return ReturnT.FAIL;
}
}
@XxlJob(value = "sev-sweet:setDrawAllList")
public ReturnT<String> setDrawAllListHandler() {
try {
String jobParam = XxlJobHelper.getJobParam();//执行参数
log.info("jobParam = " + jobParam);
String[] paramArray = jobParam.split(",");
ReturnT<String> success = ReturnT.SUCCESS;
for (String id : paramArray) {
log.info("id = " + id);
Boolean data = feignSweetTaskClient.setDrawAllList(id).getData();
log.info("setDrawAllListHandler:结果:{}", data);
success.setMsg(String.valueOf(data));
}
return success;
} catch (Exception e) {
log.error("exception of handler:{}", e.getMessage(), e);
ReturnT<String> fail = ReturnT.FAIL;
fail.setMsg(e.getLocalizedMessage());
return fail;
}
}
}
......@@ -266,7 +266,6 @@ public class KylinPerformancesServiceImpl implements IKylinPerformancesService {
info.put("field_name", performancesInfo.getFieldName());
info.put("title", performancesInfo.getTitle());
info.put("appStatus", performancesInfo.getAppStatus());
info.put("buySwitch", dataUtils.getSwitch());
HashMap<String, Object> result = CollectionUtil.mapStringObject();
result.put("performancesInfo", info);
......
......@@ -572,11 +572,6 @@ public class DataUtils {
}
}
public Integer getSwitch() {
Integer i = (Integer) redisUtil.get(AdamRedisConst.SWITCH_BUY_MEMBER);
return null == i ? 1 : i;
}
/**
* 演出订单快递路由
*/
......
......@@ -11,14 +11,16 @@ import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.vo.AdamUserMemberVo;
import com.liquidnet.service.adam.entity.AdamUserMember;
import com.liquidnet.service.candy.constant.CandyRedisConst;
import com.liquidnet.service.candy.dto.*;
import com.liquidnet.service.candy.dto.CandyCommonCouponBasicDto;
import com.liquidnet.service.candy.dto.CandyCouponCodeDto;
import com.liquidnet.service.candy.dto.CandyCouponRuleDto;
import com.liquidnet.service.candy.dto.CandyUserCouponBasicDto;
import com.liquidnet.service.candy.entity.*;
import com.liquidnet.service.candy.mapper.CandyCouponMapper;
import com.liquidnet.service.platform.service.impl.adam.PlatformAdamUserMemberService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
......@@ -48,14 +50,15 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
private void issueCouponProcessing(final CandyMgtCoupon mgtCoupon, final CandyCoupon coupon) {
List<CandyCouponRuleDto> couponRuleDtoList = platformCandyCouponRuleService.listForCouponRuleDto(coupon.getCouponId());
CandyCouponInfoDto couponInfoDto = new CandyCouponInfoDto();
BeanUtils.copyProperties(coupon, couponInfoDto);
couponInfoDto.setUseRules(couponRuleDtoList);
// 后台创建券时,同步至REDIS,这里不再同步
// CandyCouponInfoDto couponInfoDto = new CandyCouponInfoDto();
// BeanUtils.copyProperties(coupon, couponInfoDto);
// couponInfoDto.setUseRules(couponRuleDtoList);
//
// String couponInfoDtoKey = CandyRedisConst.BASIC_COUPON_INFO.concat(couponInfoDto.getCouponId());
// redisDataSourceUtil.getRedisCandyUtil().set(couponInfoDtoKey, couponInfoDto);
String couponInfoDtoKey = CandyRedisConst.BASIC_COUPON_INFO.concat(couponInfoDto.getCouponId());
redisDataSourceUtil.getRedisCandyUtil().set(couponInfoDtoKey, couponInfoDto);
switch (coupon.getBindType()) {// 领取方式[0-用户输入兑换|1-发放至用户|2-积分兑换|3-发放需领取|4-会员专属]
switch (coupon.getBindType()) {// 领取方式[0-用户输入兑换|1-发放至用户|2-积分商品|3-发放需领取|4-会员专属]
case 0:
this.processingCouponCode(mgtCoupon, coupon);
break;
......@@ -75,9 +78,9 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
// break;
// }
// break;
case 3:// 新增券领取类型(3-发放需领取)处理逻辑同(1-发放至用户|2-积分兑换
case 4:// 新增券领取类型(4-会员专属)处理逻辑同(1-发放至用户|2-积分兑换
case 2:// TODO: 2021/11/9 PM上线前临时加的券领取类型(2-积分兑换),这里`1-发放至用户|2-积分兑换`做同逻辑处理
case 3:// 新增券领取类型(3-发放需领取)处理逻辑同(1-发放至用户|2-积分商品
case 4:// 新增券领取类型(4-会员专属)处理逻辑同(1-发放至用户|2-积分商品
case 2:// TODO: 2021/11/9 PM上线前临时加的券领取类型(2-积分商品),这里`1-发放至用户|2-积分商品`做同逻辑处理
switch (mgtCoupon.getEventType()) {// 发放类型[1-会员|2-手机号|10-全体用户]
case 1:
this.processForAllMember(mgtCoupon, coupon, couponRuleDtoList);
......@@ -154,18 +157,19 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
List<CandyCommonCoupon> initCommonCouponList = new ArrayList<>();
LocalDateTime now = LocalDateTime.now();
String mcouponId = mgtCoupon.getMcouponId();
Integer eventAmt = mgtCoupon.getEventAmt();
log.info("发放券处理中:目标全体用户[发放量:{}]", eventAmt);
log.info("发放券处理中:{}-目标全体用户[发放量:{}]", mcouponId, eventAmt);
for (int i = 0; i < eventAmt; i++) {
CandyCommonCoupon commonCoupon = new CandyCommonCoupon();
commonCoupon.setCcouponId(IDGenerator.nextTimeId2());
commonCoupon.setMcouponId(mgtCoupon.getMcouponId());
commonCoupon.setMcouponId(mcouponId);
commonCoupon.setCouponId(coupon.getCouponId());
commonCoupon.setExclusive(mgtCoupon.getExclusively());
commonCoupon.setState(1);
commonCoupon.setRanged(mgtCoupon.getEventType());
commonCoupon.setOperator("system");
commonCoupon.setOperator(mgtCoupon.getOperator());
commonCoupon.setCreatedAt(now);
initCommonCouponList.add(commonCoupon);
......@@ -186,10 +190,10 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
redisCandyUtil.set(ccKey, vos);
});
} else {
throw new LiquidnetServiceException("-1", String.format("券发放失败[mcouponId=%s]", mgtCoupon.getMcouponId()));
throw new LiquidnetServiceException("-1", String.format("券发放失败[mcouponId=%s]", mcouponId));
}
}
log.info("发放券处理中:目标全体用户[发放量:{},实际发放:{}]", eventAmt, initCommonCouponList.size());
log.info("发放券处理中:{}-目标全体用户[发放量:{},实际发放:{}]", mcouponId, eventAmt, initCommonCouponList.size());
}
/**
......@@ -204,13 +208,19 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
private void processForAllMember(CandyMgtCoupon mgtCoupon, CandyCoupon coupon, List<CandyCouponRuleDto> couponRuleDtoList) {
List<CandyUserCoupon> initUserCouponList = new ArrayList<>();
LocalDateTime now = LocalDateTime.now();
LocalDateTime nowEndTime = now.withHour(23).withMinute(59).withSecond(59);
LocalDateTime nowEndTime = now.withHour(23).withMinute(59).withSecond(58);
LambdaQueryWrapper<AdamUserMember> queryWrapper = Wrappers.lambdaQuery(AdamUserMember.class).eq(AdamUserMember::getState, 1)
.gt(AdamUserMember::getExpiryAt, nowEndTime);
int userMemberCount = platformAdamUserMemberService.count(queryWrapper), num = 0, pSize = 1000;
int totalCount = userMemberCount, eventAmt = mgtCoupon.getEventAmt();
log.info("发放券处理中:目标全体会员[总数:{},发放量:{}]", userMemberCount, eventAmt);
log.info("发放券处理中:{}-目标全体会员[总数:{},发放量:{}]", mgtCoupon.getMcouponId(), userMemberCount, eventAmt);
String mcouponId = mgtCoupon.getMcouponId();
String operator = mgtCoupon.getOperator();
String couponId = coupon.getCouponId();
LocalDateTime couponEffectAt = coupon.getEffectAt();
LocalDateTime couponExpireAt = coupon.getExpireAt();
// 会员权益券失效时间duedAt需要同步会员到期时间expiryAt
Integer exclusively = mgtCoupon.getExclusively();
......@@ -231,18 +241,23 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
CandyUserCoupon userCoupon = new CandyUserCoupon();
userCoupon.setUcouponId(IDGenerator.get32UUID());
userCoupon.setMcouponId(mgtCoupon.getMcouponId());
userCoupon.setMcouponId(mcouponId);
userCoupon.setUid(userMember.getUid());
userCoupon.setCouponId(coupon.getCouponId());
userCoupon.setCouponId(couponId);
userCoupon.setExclusive(exclusively);
userCoupon.setState(1);
userCoupon.setBindAt(coupon.getEffectAt());
// userCoupon.setDuedAt(coupon.getExpireAt());
// userCoupon.setBindAt(couponEffectAt);
// userCoupon.setDuedAt(couponExpireAt);
userCoupon.setBindAt(null == couponEffectAt ? now : couponEffectAt);
if (isMemberRightsCoupon) {
userCoupon.setDuedAt(userMember.getExpiryAt());
} else if (null != couponExpireAt && couponExpireAt.isAfter(now)) {
userCoupon.setDuedAt(couponExpireAt);
} else {
userCoupon.setDuedAt(coupon.getExpireAt());
log.warn("发放券处理中:{}-目标全体会员,该券生效日期或失效日期无效[couponId:{},effectAt:{},expireAt:{}]", mcouponId, couponId, couponEffectAt, couponExpireAt);
continue;
}
userCoupon.setOperator(operator);
userCoupon.setCreatedAt(now);
initUserCouponList.add(userCoupon);
......@@ -271,7 +286,7 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
num++;
totalCount -= pSize;
log.info("发放券处理中:目标全体会员[总数:{},发放量:{},单次处理:{},剩余:{}]", userMemberCount, eventAmt, lastLimitSql, totalCount);
log.info("发放券处理中:{}-目标全体会员[总数:{},发放量:{},单次处理:{},剩余:{}]", mcouponId, userMemberCount, eventAmt, lastLimitSql, totalCount);
}
}
......@@ -291,10 +306,21 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
String eventLimit = mgtCoupon.getEventLimit();
String[] eventLimitArr = eventLimit.split(",");
int eventAmt = mgtCoupon.getEventAmt(), pl = 0, limitSize = eventLimitArr.length;
log.info("发放券处理中:目标指定手机号[总数:{},发放量:{}]", limitSize, eventAmt);
log.info("发放券处理中:{}-目标指定手机号[总数:{},发放量:{}]", mgtCoupon.getMcouponId(), limitSize, eventAmt);
AbstractRedisUtil redisAdamUtil = redisDataSourceUtil.getRedisAdamUtil();
if (coupon.getBindType() == 2) {// 券领取方式[2-积分商品],实际发放至用户时计算有效期
coupon.setEffectAt(now);
coupon.setExpireAt(coupon.getEffectAt().plusDays(coupon.getValidity()).withHour(23).withMinute(59).withSecond(59));
}
String mcouponId = mgtCoupon.getMcouponId();
String operator = mgtCoupon.getOperator();
String couponId = coupon.getCouponId();
LocalDateTime couponEffectAt = coupon.getEffectAt();
LocalDateTime couponExpireAt = coupon.getExpireAt();
// 指定手机号发放券中,会员权益券失效时间duedAt需要同步会员到期时间expiryAt
Integer exclusively = mgtCoupon.getExclusively();
boolean isMemberRightsCoupon = exclusively == 1;
......@@ -305,19 +331,29 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
if (StringUtils.isNotEmpty(uid)) {
CandyUserCoupon userCoupon = new CandyUserCoupon();
userCoupon.setUcouponId(IDGenerator.get32UUID());
userCoupon.setMcouponId(mgtCoupon.getMcouponId());
userCoupon.setMcouponId(mcouponId);
userCoupon.setUid(uid);
userCoupon.setCouponId(coupon.getCouponId());
userCoupon.setCouponId(couponId);
userCoupon.setExclusive(exclusively);
userCoupon.setState(1);
userCoupon.setBindAt(coupon.getEffectAt());
// userCoupon.setBindAt(couponEffectAt);
userCoupon.setBindAt(null == couponEffectAt ? now : couponEffectAt);
if (isMemberRightsCoupon) {
AdamUserMemberVo vo = (AdamUserMemberVo) redisAdamUtil.get(AdamRedisConst.INFO_USER_MEMBER.concat(uid));
if (null != vo && vo.isActive()) {
userCoupon.setDuedAt(vo.getExpiryAt());
} else {// 非会员(或无效会员)跳过
log.warn("发放券处理中:{}-目标指定手机号,该用户非会员或会员已过期[couponId:{},uid:{}]", mcouponId, couponId, uid);
continue;
}
} else if (null != couponExpireAt && couponExpireAt.isAfter(now)) {
userCoupon.setDuedAt(couponExpireAt);
} else {
userCoupon.setDuedAt(coupon.getExpireAt());
log.warn("发放券处理中:{}-目标指定手机号,该券生效日期或失效日期无效[couponId:{},effectAt:{},expireAt:{}]", mcouponId, couponId, couponEffectAt, couponExpireAt);
continue;
}
userCoupon.setOperator(operator);
userCoupon.setCreatedAt(now);
initUserCouponList.add(userCoupon);
......@@ -343,10 +379,10 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
redisCandyUtil.set(uckey, vos);
});
} else {
throw new LiquidnetServiceException("-1", String.format("券发放失败[mcouponId=%s]", mgtCoupon.getMcouponId()));
throw new LiquidnetServiceException("-1", String.format("券发放失败[mcouponId=%s]", mcouponId));
}
}
log.info("发放券处理中:目标指定手机号[总数:{},发放量:{},实际处理:{}]", limitSize, eventAmt, pl);
log.info("发放券处理中:{}-目标指定手机号[总数:{},发放量:{},实际处理:{}]", mcouponId, limitSize, eventAmt, pl);
}
/**
......
......@@ -8,11 +8,13 @@ CREATE TABLE `sweet_integral_activity`
`activity_img` varchar(255) NOT NULL DEFAULT '' COMMENT '活动图片',
`activity_type` tinyint NOT NULL DEFAULT 0 COMMENT '活动类型 1转盘',
`activity_num` int NOT NULL DEFAULT 0 COMMENT '活动玩一次所需积分',
`estimated_num` int NOT NULL DEFAULT 0 COMMENT '预估玩此活动的总人数',
`time_type` tinyint NOT NULL DEFAULT 0 COMMENT '活动时间类型 1长期 2开始结束时间',
`start_time` datetime NULL DEFAULT NULL COMMENT '如果活动有时间限制 开始时间',
`end_time` datetime NULL DEFAULT NULL COMMENT '如果活动有时间限制 结束时间',
`express_fee_type` tinyint NOT NULL DEFAULT 0 COMMENT '快递费用类型 1包邮 2到付',
`activity_rules` text NULL DEFAULT NULL COMMENT '活动规则',
`probability_publicity` text NULL DEFAULT NULL COMMENT '概率公示',
`is_online` tinyint NOT NULL DEFAULT 0 COMMENT '是否上线 1未上线 2已上线',
`created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
......@@ -32,13 +34,13 @@ CREATE TABLE `sweet_integral_activity_prize`
`prize_id` varchar(255) NOT NULL DEFAULT '' COMMENT '奖品id',
`integral_activity_id` varchar(255) NOT NULL DEFAULT '' COMMENT '关联活动id',
`prize_title` varchar(255) NOT NULL DEFAULT '' COMMENT '奖品名称',
`prize_describe` varchar(255) NOT NULL DEFAULT '' COMMENT '奖品描述',
`prize_img_init` varchar(255) NOT NULL DEFAULT '' COMMENT '初始展示奖品图片',
`prize_img_select` varchar(255) NOT NULL DEFAULT '' COMMENT '中奖选中奖品图片',
`prize_type` tinyint NOT NULL DEFAULT 0 COMMENT '奖品类型 1谢谢惠顾 2积分 3代金券 4满减券 5优先购买券 6实物',
`relation_id` varchar(255) NOT NULL DEFAULT '' COMMENT '关联id 如商品id 券id',
`prize_type` tinyint NOT NULL DEFAULT 0 COMMENT '奖品类型 1积分 2优惠券 3实物 4登登登VIP',
`prize_type_num` int NOT NULL DEFAULT 0 COMMENT '单次奖励数量如积分 中奖给多少',
`prize_num` int NOT NULL DEFAULT 0 COMMENT '奖品数量',
`winners_num` int NOT NULL DEFAULT 0 COMMENT '限制的中奖人数',
`prize_num` int NOT NULL DEFAULT 0 COMMENT '奖品数量库存',
`is_infinite` tinyint NOT NULL DEFAULT 1 COMMENT '是否是无限库存 1有限库存 2无限库存',
`winning_probability` decimal(10, 2) NOT NULL DEFAULT 0 COMMENT '中奖概率',
`created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
......@@ -50,6 +52,25 @@ CREATE TABLE `sweet_integral_activity_prize`
COLLATE utf8mb4_unicode_ci
ROW_FORMAT = DYNAMIC COMMENT '积分活动奖品表';
-- 积分活动奖品里关联多奖品表
drop TABLE if exists `sweet_integral_activity_prize_relation`;
CREATE TABLE `sweet_integral_activity_prize_relation`
(
`mid` bigint unsigned NOT NULL AUTO_INCREMENT,
`prize_relation_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'prize_relation_id',
`prize_id` varchar(255) NOT NULL DEFAULT '' COMMENT 'prize_id',
`coupon_id` varchar(255) NOT NULL DEFAULT '' COMMENT '券id',
`coupon_title` varchar(255) NOT NULL DEFAULT '' COMMENT '券名称',
`created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`mid`),
KEY `sweet_prize_relation_id` (`prize_relation_id`),
KEY `sweet_prize_id` (`prize_id`)
) ENGINE = InnoDB
DEFAULT CHARSET utf8mb4
COLLATE utf8mb4_unicode_ci
ROW_FORMAT = DYNAMIC COMMENT '积分活动奖品里关联多奖品表';
-- 积分活动抽奖记录表
drop TABLE if exists `sweet_integral_activity_draw`;
CREATE TABLE `sweet_integral_activity_draw`
......@@ -60,7 +81,7 @@ CREATE TABLE `sweet_integral_activity_draw`
`activity_num` int NOT NULL DEFAULT 0 COMMENT '活动玩一次所需积分',
`prize_id` varchar(255) NOT NULL DEFAULT '' COMMENT '关联奖品id',
`prize_title` varchar(255) NOT NULL DEFAULT '' COMMENT '奖品名称',
`prize_type` tinyint NOT NULL DEFAULT 0 COMMENT '奖品类型 1谢谢惠顾 2积分 3代金券 4满减券 5优先购买券 6实物',
`prize_type` tinyint NOT NULL DEFAULT 0 COMMENT '奖品类型 1积分 2优惠券 3实物 4登登登VIP 5优先购买券惠顾 2积分 3代金券 4满减券 5优先购买券 6实物',
`prize_type_num` int NOT NULL DEFAULT 0 COMMENT '单次奖励数量如积分 中奖给多少',
`relation_id` varchar(255) NOT NULL DEFAULT '' COMMENT '关联id 如商品id 券id',
`user_id` varchar(255) NOT NULL DEFAULT '' COMMENT '关联用户id',
......@@ -72,7 +93,7 @@ CREATE TABLE `sweet_integral_activity_draw`
`receiving_city` varchar(255) NOT NULL DEFAULT '' COMMENT 'adam收货人城市',
`receiving_county` varchar(255) NOT NULL DEFAULT '' COMMENT 'adam收货人区县',
`receiving_address` varchar(255) NOT NULL DEFAULT '' COMMENT 'adam收货人详细地址',
`receiving_status` smallint NOT NULL DEFAULT 1 COMMENT '发放状态 1未发放 2已发放 3无需发放',
`receiving_status` smallint NOT NULL DEFAULT 1 COMMENT '发放状态 1未发放 2已发放',
`created_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`mid`),
......
......@@ -36,6 +36,9 @@ XGROUP CREATE sweet:stream:rk.antigenicQuestion group.antigenicQuestion 0
-- 积分抽奖 --
XADD sweet:stream:rk.integralActivityDraw * 0 0
XGROUP CREATE sweet:stream:rk.integralActivityDraw group.integralActivityDraw 0
-- 积分抽奖积分处理 --
XADD sweet:stream:rk.stoneIntegral * 0 0
XGROUP CREATE sweet:stream:rk.stoneIntegral group.stoneIntegral 0
-- 2021草莓海报活动 --
XADD sweet:stream:rk.userLikeMusician * 0 0
......
......@@ -106,6 +106,11 @@
<artifactId>liquidnet-common-third-shumei</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-api-feign-candy</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
......
package com.liquidnet.service;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.ArrayList;
import java.util.List;
public class MybatisPlusCodeGenerator {
/**
* @param moduleRootPath 项目模块根路径 到 /src 之前 ex:E:\projects\trlabs-bus-v1\trlabs-bus-service\trlabs-common\trlabs-mybatis
* @param dsc 数据源
* @param parentName 相当于业务模块名 com.liquidnet.service.adam 全限定类名
* @param tableNames 表名
*/
public static void doGenerator(String moduleRootPath,
DataSourceConfig dsc,
String parentName,
String[] tableNames) {
AutoGenerator mpg = new AutoGenerator();
// 全局配置BankMybatisPlusCodeGenerator
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir(moduleRootPath + "/src/main/java");
gc.setAuthor("liquidnet");
gc.setOpen(false);
// gc.setSwagger2(true); 实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
// 数据源配置
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent(parentName);
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return moduleRootPath + "/src/main/resources/com/liquidnet/service/sweet/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setInclude(tableNames);
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
public static void main(String[] args) {
DataSourceConfig dsc = new DataSourceConfig();
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUrl("jdbc:mysql://39.106.122.201:3308/dev_ln_scene?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=CST");
dsc.setUsername("testmall");
dsc.setPassword("zhengzai!mYT");
String resourcePath = "/Users/hujiachen/Downloads/tmp";
String directory = "com.liquidnet.service.stone";
String[] dbTableArray = new String[]{"stone_score_logs", "stone_score_items", "stone_score_user","stone_score_order"};
doGenerator(resourcePath, dsc, directory, dbTableArray);
}
}
......@@ -13,7 +13,7 @@ import lombok.extern.slf4j.Slf4j;
* @date 2021/8/10 18:03
*/
@Slf4j
public class JxlMathUtil {
public class SweetMathUtil {
public static int getIndex(String key){
log.debug("MathUtil.getIndex key:{} hashcode:{}",key,key.hashCode());
int defaultDb = 0;
......@@ -42,7 +42,7 @@ public class JxlMathUtil {
/*RedisConfig redisConfig = new RedisConfig();
redisConfig.getRedisTemplateByDb(MathUtil.getIndex("1"));*/
// getIndex("kylin:performances:id:296290722991104003684701");
getIndex("sweet:integralActivity:prizeNum:activityId:499142611246284803622253:prizeId:499142823268352009440982");
// getIndex("sweet:integralActivity:prizeNum:activityId:499142611246284803622253:prizeId:499142823268352009440982");
// getIndex("kylin:order:coupon:id:397983761946132487870836");
// getIndex("sweet:integralActivity:list");
// getIndex("kylin:order:id:325244198036357120519956");
......@@ -50,7 +50,11 @@ public class JxlMathUtil {
// getIndex("kylin:performances:roadShowId:570");
// getIndex("kylin:order:refund:address");
// getIndex("basicServices:upushList:IOS");
getIndex("jxl-lock-test");
// getIndex("jxl-lock-test");
// getIndex("kylin:performances:id:499112736168099840841262");
// getIndex("kylin:performances:id:549875278160650249766815");
// getIndex("sweet:user:applet:mobile:18548596019");
getIndex("sweet:user:service:unionId:oSpYSs_6THPGafL3HqgGQA1uuEoE:type:1");
// getIndex("basicServices:upushList:Android");
// getIndex("basicServices:zhengzaiAppVersionsAndroid");
// getIndex("basicServices:zhengzaiAppVersionsIos");
......
......@@ -11,7 +11,7 @@ import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.ArrayList;
import java.util.List;
public class JxlMybatisPlusCodeGenerator {
public class SweetMybatisPlusCodeGenerator {
/**
* @param moduleRootPath 项目模块根路径 到 /src 之前 ex:E:\projects\trlabs-bus-v1\trlabs-bus-service\trlabs-common\trlabs-mybatis
* @param dsc 数据源
......@@ -95,7 +95,7 @@ public class JxlMybatisPlusCodeGenerator {
String resourcePath = "/Users/jiangxiulong/Downloads/tmp";
String directory = "com.liquidnet.service.sweet";
String[] dbTableArray = new String[]{"sweet_strawberry_poster","sweet_strawberry_poster_lineup"};
String[] dbTableArray = new String[]{"sweet_integral_activity_prize_relation"};
doGenerator(resourcePath, dsc, directory, dbTableArray);
......
......@@ -7,11 +7,7 @@ import com.liquidnet.service.sweet.service.ISweetIntegralActivityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;
......@@ -41,4 +37,16 @@ public class SweetIntegralActivityController {
public ResponseDto<IntegralActivityVo> detail(@PathVariable("integralActivityId") String integralActivityId) {
return activityService.detail(integralActivityId);
}
@GetMapping("setDrawAllList")
@ApiOperation("统计最新40条中奖记录")
public ResponseDto setDrawAllList(@RequestParam String integralActivityId) {
return activityService.setDrawAllList(integralActivityId);
}
@PostMapping("drawBlack")
@ApiOperation("抽奖黑名单")
public ResponseDto drawBlack(@RequestParam String uidS) {
return activityService.drawBlack(uidS);
}
}
......@@ -3,8 +3,9 @@ package com.liquidnet.service.sweet.controller;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.candy.vo.CandyCouponPreviewVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityDrawVo;
import com.liquidnet.service.sweet.dto.vo.admin.SweetIntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeApiVo;
import com.liquidnet.service.sweet.service.ISweetIntegralActivityDrawService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
......@@ -35,25 +36,23 @@ public class SweetIntegralActivityDrawController {
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "integralActivityId", value = "活动id", required = true)
})
public ResponseDto<SweetIntegralActivityPrizeVo> create(
public ResponseDto<IntegralActivityPrizeApiVo> create(
@RequestParam("integralActivityId") String integralActivityId
) {
return activityDrawService.create(integralActivityId);
}
@GetMapping("drawList")
@ApiOperation("用户(中奖、抽奖)记录列表")
@ApiOperation("用户抽奖记录列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "Integer", name = "type", value = "1中奖记录 2抽奖记录", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "integralActivityId", value = "活动id", required = true),
@ApiImplicitParam(type = "query", dataType = "Integer", name = "pageNum", value = "分页", required = true)
})
public ResponseDto<PagedResult<IntegralActivityDrawVo>> drawList(
@RequestParam("type") Integer type,
@RequestParam("integralActivityId") String integralActivityId,
@RequestParam("pageNum") Integer pageNum
) {
return activityDrawService.drawList(type, integralActivityId, pageNum);
return activityDrawService.drawList(integralActivityId, pageNum);
}
@GetMapping("winPrizeUser")
......@@ -91,4 +90,32 @@ public class SweetIntegralActivityDrawController {
return activityDrawService.perfectAddress(drawId, receivingAddressesId);
}
@PostMapping("collectCoupon")
@ApiOperation("领取券")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "couponId", value = "券id", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "drawId", value = "抽奖id", required = true)
})
public ResponseDto collectCoupon(
@RequestParam("couponId") String couponId,
@RequestParam("drawId") String drawId
) {
return activityDrawService.collectCoupon(couponId, drawId);
}
@PostMapping("couponList")
@ApiOperation("奖品对应的券列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "prizeId", value = "奖品id", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "integralActivityId", value = "活动id", required = true),
@ApiImplicitParam(type = "query", dataType = "int", name = "pageNum", value = "分页")
})
public ResponseDto<List<CandyCouponPreviewVo>> couponList(
@RequestParam("prizeId") String prizeId,
@RequestParam("integralActivityId") String integralActivityId,
@RequestParam(value = "pageNum", defaultValue = "1") int pageNum
) {
return activityDrawService.couponList(prizeId, integralActivityId);
}
}
package com.liquidnet.service.sweet.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.adam.dto.vo.AdamAddressesVo;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.candy.vo.CandyCouponPreviewVo;
import com.liquidnet.service.feign.adam.api.FeignAdamBaseClient;
import com.liquidnet.service.feign.candy.api.FeignCandyBaseClient;
import com.liquidnet.service.feign.stone.api.FeignStoneIntegralClient;
import com.liquidnet.service.stone.dto.StoneScoreListDto;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityDrawVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityVo;
import com.liquidnet.service.sweet.dto.vo.admin.SweetIntegralActivityPrizeVo;
import com.liquidnet.service.sweet.constant.StatusConst;
import com.liquidnet.service.sweet.dto.vo.*;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrize;
import com.liquidnet.service.sweet.mapper.SweetIntegralActivityDrawMapper;
import com.liquidnet.service.sweet.param.SweetStoneIntegralParam;
import com.liquidnet.service.sweet.service.ISweetIntegralActivityDrawService;
import com.liquidnet.service.sweet.utils.QueueUtils;
import com.liquidnet.service.sweet.utils.RedisDataUtils;
......@@ -39,6 +38,7 @@ import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>
......@@ -65,12 +65,13 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
private FeignStoneIntegralClient feignStoneIntegralClient;
@Autowired
private FeignAdamBaseClient feignAdamBaseClient;
@Autowired
private FeignCandyBaseClient feignCandyBaseClient;
@Override
public ResponseDto<SweetIntegralActivityPrizeVo> create(String integralActivityId) {
public ResponseDto<IntegralActivityPrizeApiVo> create(String integralActivityId) {
Map tokenClaims = CurrentUtil.getTokenClaims();
String userId = StringUtils.defaultString((String.valueOf(tokenClaims.get(CurrentUtil.TOKEN_SUB))), "");
String mobile = StringUtils.defaultString((String.valueOf(tokenClaims.get(CurrentUtil.TOKEN_MOBILE))), "");
// 加锁
boolean isLock = redisDataUtils.setIntegralDrawLock(userId);
if (!isLock) {
......@@ -107,108 +108,125 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
} else {
BigDecimal scoreRest = userInfoData.getScoreRest();
if (scoreRest.compareTo(BigDecimal.valueOf(integralActivity.getActivityNum())) == -1) {
return ResponseDto.failure("您的积分账户余额不足!");
return ResponseDto.failure(ErrorMapping.get("90082"));
}
}
}
// 如果库存没了 限制的中奖人数到了就从列表剔出 列表为空就都没有库存了
List<SweetIntegralActivityPrize> prizeList = integralActivity.getPrizeList();
ArrayList<SweetIntegralActivityPrize> sweetIntegralActivityPrizeArrayList = SweetNewObjectUtil.getSweetIntegralActivityPrizeArrayList();
for (SweetIntegralActivityPrize info : prizeList) {
// 如果库存没了就从列表剔出 列表为空就都没有库存了
ArrayList<IntegralActivityPrizeVo> activityPrizeVoArrayList = SweetNewObjectUtil.getIntegralActivityPrizeVoArrayList();
// 黑名单只中券 不记录次数
List<String> drawBlack = redisDataUtils.getIntegralActivityDrawBlack();
boolean isBlack = false;
if (drawBlack.contains(userId)) {
isBlack = true;
}
// 概率计算
boolean lotteryDraw = this.lotteryDraw(integralActivityId, userId);
if (lotteryDraw && !isBlack) { // 实物
List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList2();
for (IntegralActivityPrizeVo info : prizeList) {
int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, info.getPrizeId());
int integralActivityPrizeWinnersNum = redisDataUtils.getIntegralActivityPrizeWinnersNum(integralActivityId, info.getPrizeId());
if (integralActivityPrizeNum > 0 && integralActivityPrizeWinnersNum > 0) {
sweetIntegralActivityPrizeArrayList.add(info);
if (integralActivityPrizeNum > 0) {
activityPrizeVoArrayList.add(info);
}
}
if (CollectionUtils.isEmpty(sweetIntegralActivityPrizeArrayList)) {
}
if (isBlack || !lotteryDraw || CollectionUtils.isEmpty(activityPrizeVoArrayList)) {// 没中实物、实物库存没了、是黑名单中用户 中券
List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList1();
for (IntegralActivityPrizeVo info : prizeList) {
if (info.getIsInfinite() == 1) {
int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, info.getPrizeId());
if (integralActivityPrizeNum == -1 || integralActivityPrizeNum > 0) {
activityPrizeVoArrayList.add(info);
}
} else {
activityPrizeVoArrayList.add(info);
}
}
if (CollectionUtils.isEmpty(activityPrizeVoArrayList)) {
return ResponseDto.failure("活动太火爆了,奖品已经没有库存啦~");
}
SweetIntegralActivityPrize sweetIntegralActivityPrize = this.lotteryDraw(sweetIntegralActivityPrizeArrayList);
}
SweetIntegralActivityPrizeVo sweetIntegralActivityPrizeVo = SweetIntegralActivityPrizeVo.getNew().copy(sweetIntegralActivityPrize);
IntegralActivityPrizeVo integralActivityPrizeVo = this.lotteryDraw1(activityPrizeVoArrayList);
// 减库存 顺便判断库存是否够 -1的时候回滚回去
long activityPrizeNum = redisDataUtils.decrIntegralActivityPrizeNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1);
long activityPrizeWinnersNum = redisDataUtils.decrIntegralActivityPrizeWinnersNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1);
// 减库存 顺便判断库存是否够 无限库存不判断
if (integralActivityPrizeVo.getIsInfinite() == 1) {
long activityPrizeNum = redisDataUtils.decrIntegralActivityPrizeNum(integralActivityId, integralActivityPrizeVo.getPrizeId(), 1);
log.info("奖品库存情况 activityPrizeNum:{}", activityPrizeNum);
log.info("奖品库存情况 activityPrizeWinnersNum:{}", activityPrizeWinnersNum);
if (activityPrizeNum < 0) {// 库存不够了
long prizeNum = redisDataUtils.incrIntegralActivityPrizeNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1);
long prizeNum = redisDataUtils.incrIntegralActivityPrizeNum(integralActivityId, integralActivityPrizeVo.getPrizeId(), 1);
log.info("奖品库存情况回滚后 prizeNum:{}", prizeNum);
return ResponseDto.failure("活动太火爆了,奖品已经没有库存了!");
}
if (activityPrizeWinnersNum < 0) {// 库存不够了
long winnersNum = redisDataUtils.incrIntegralActivityPrizeWinnersNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1);
log.info("奖品库存情况回滚后 winnersNum:{}", winnersNum);
return ResponseDto.failure("活动太火爆了,奖品已经没有库存了~");
}
// 减积分
ResponseDto<String> de2111 = feignStoneIntegralClient.de2111(userId, integralActivity.getActivityNum(), integralActivity.getActivityTitle());
log.info("减积分返回值情况 de2111:{}", de2111);
SweetStoneIntegralParam integralParamDe = SweetStoneIntegralParam.getNew();
integralParamDe.setType(2);
integralParamDe.setUid(userId);
integralParamDe.setScore(integralActivity.getActivityNum());
integralParamDe.setContent(integralActivity.getActivityTitle());
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_STONE_INTEGRAL.getKey(),
JsonUtils.toJson(integralParamDe));
// 抽奖入库
String drawId = IDGenerator.nextSnowId();
IntegralActivityDrawVo integralActivityDrawVo = IntegralActivityDrawVo.getNew();
integralActivityDrawVo.setDrawId(drawId);
integralActivityDrawVo.setIntegralActivityId(integralActivityId);
integralActivityDrawVo.setActivityNum(integralActivity.getActivityNum());
integralActivityDrawVo.setPrizeId(sweetIntegralActivityPrize.getPrizeId());
integralActivityDrawVo.setPrizeTitle(sweetIntegralActivityPrize.getPrizeTitle());
integralActivityDrawVo.setPrizeType(sweetIntegralActivityPrize.getPrizeType());
integralActivityDrawVo.setPrizeTypeNum(sweetIntegralActivityPrize.getPrizeTypeNum());
integralActivityDrawVo.setRelationId(sweetIntegralActivityPrize.getRelationId());
integralActivityDrawVo.setPrizeId(integralActivityPrizeVo.getPrizeId());
integralActivityDrawVo.setPrizeTitle(integralActivityPrizeVo.getPrizeTitle());
integralActivityDrawVo.setPrizeType(integralActivityPrizeVo.getPrizeType());
integralActivityDrawVo.setPrizeTypeNum(integralActivityPrizeVo.getPrizeTypeNum());
integralActivityDrawVo.setUserId(userId);
integralActivityDrawVo.setNickname(nickname);
LocalDateTime nowTime = LocalDateTime.now();
integralActivityDrawVo.setCreatedAt(nowTime);
Integer receivingStatus = 1;
Integer prizeType = sweetIntegralActivityPrize.getPrizeType();
if (prizeType == 2) {// 中奖积分
// 增加积分
ResponseDto<String> in2111 = feignStoneIntegralClient.in2112(userId, sweetIntegralActivityPrize.getPrizeTypeNum(), integralActivity.getActivityTitle());
log.info("中奖加积分返回值情况 in2111:{}", in2111);
// 发放状态
Integer prizeType = integralActivityPrizeVo.getPrizeType();
if (prizeType == StatusConst.PRIZE_TYPE1) {// 中奖积分
SweetStoneIntegralParam integralParamIn = SweetStoneIntegralParam.getNew();
integralParamIn.setType(1);
integralParamIn.setUid(userId);
integralParamIn.setScore(integralActivityPrizeVo.getPrizeTypeNum());
integralParamIn.setContent(integralActivity.getActivityTitle());
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_STONE_INTEGRAL.getKey(),
JsonUtils.toJson(integralParamIn));
receivingStatus = 2;
}
/*if (prizeType == 3 || prizeType == 4 || prizeType == 5) {// 优惠券
// 发放优惠券
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("stone_candy_mgt_coupon.add_for_member"));
sqlsDataA.add(new Object[]{
IDGenerator.nextTimeId2(), sweetIntegralActivityPrize.getRelationId(),
sweetIntegralActivityPrize.getPrizeTypeNum(), mobile, nowTime, "INTEGRAL_ACTIVITY_DRAW_COUPON", nowTime
});
queueUtils.sendMsgByRedis(MQConst.StoneQueue.STONE_ORDER_COUPON.getKey(),
SqlMapping.gets(sqls, sqlsDataA));
// 发放状态
receivingStatus = 2;
}*/
if (prizeType == 1) { // 谢谢惠顾
receivingStatus = 3;
}
integralActivityDrawVo.setReceivingStatus(receivingStatus);
// redis
redisDataUtils.setIntegralActivityDraw(integralActivityDrawVo);
if (prizeType == StatusConst.PRIZE_TYPE3 || prizeType == StatusConst.PRIZE_TYPE4 || prizeType == StatusConst.PRIZE_TYPE5) { // 中实物减实物总库存
redisDataUtils.decrIntegralActivityTotalPrizeNum(integralActivityId);
}
// mongo
mongoTemplate.insert(integralActivityDrawVo, IntegralActivityDrawVo.class.getSimpleName());
// mysql 抽奖记录
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("integral_activity_draw.insert"));
sqls.add(SqlMapping.get("sweet_integral_activity_draw.insert"));
sqlsDataA.add(new Object[]{
drawId, integralActivityId, integralActivity.getActivityNum(),
sweetIntegralActivityPrize.getPrizeId(), sweetIntegralActivityPrize.getPrizeTitle(), sweetIntegralActivityPrize.getPrizeType(),
sweetIntegralActivityPrize.getPrizeTypeNum(), sweetIntegralActivityPrize.getRelationId(),
integralActivityPrizeVo.getPrizeId(), integralActivityPrizeVo.getPrizeTitle(), integralActivityPrizeVo.getPrizeType(),
integralActivityPrizeVo.getPrizeTypeNum(),
userId, nickname,
receivingStatus
});
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_INTEGRAL_ACTIVITY_DRAW.getKey(),
SqlMapping.gets(sqls, sqlsDataA));
IntegralActivityPrizeApiVo activityPrizeApiVo = IntegralActivityPrizeApiVo.getNew().copy(integralActivityPrizeVo);
activityPrizeApiVo.setDrawId(drawId);
return ResponseDto.success(sweetIntegralActivityPrizeVo);
// 参与次数
if (!isBlack) {
redisDataUtils.decrIntegralActivityEstimatedNum(integralActivityId, 1);
}
return ResponseDto.success(activityPrizeApiVo);
} catch (Exception e) {
log.error("积分抽奖异常 e:{}", e);
return ResponseDto.failure("操作失败,请稍后重试!");
......@@ -220,32 +238,27 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
}
@Override
public ResponseDto<PagedResult<IntegralActivityDrawVo>> drawList(Integer type, String integralActivityId, Integer pageNum) {
public ResponseDto<PagedResult<IntegralActivityDrawVo>> drawList(String integralActivityId, Integer pageNum) {
Integer pageSize = 20;
String currentUid = CurrentUtil.getCurrentUid();
PagedResult<IntegralActivityDrawVo> sweetIntegralActivityDrawPagedResult = SweetNewObjectUtil.getSweetIntegralActivityDrawVoPagedResult();
long count = 0;
//条件
Query query = Query.query(
Criteria.where("integralActivityId").is(integralActivityId).and("userId").is(currentUid)
);
if (type == 1) {
query.addCriteria(Criteria.where("prizeType").ne(1));
} else {
query.addCriteria(Criteria.where("prizeType").is(1));
}
if (pageNum <= 1) {
LinkedList<IntegralActivityDrawVo> integralActivityDrawList = redisDataUtils.getIntegralActivityDrawList(type, currentUid, integralActivityId);
count = mongoTemplate.count(query, IntegralActivityDrawVo.class, IntegralActivityDrawVo.class.getSimpleName());
sweetIntegralActivityDrawPagedResult.setList(integralActivityDrawList).setTotal(count, pageSize).setPageSize(pageSize).setCurrentPage(pageNum);
} else {// page大于1 去mongo里面取
HashMap<String, Object> info = CollectionUtil.mapStringObject();
long count = mongoTemplate.count(query, IntegralActivityDrawVo.class, IntegralActivityDrawVo.class.getSimpleName());
LinkedList<IntegralActivityDrawVo> integralActivityDrawList = redisDataUtils.getIntegralActivityDrawList(currentUid, integralActivityId);
if (null == integralActivityDrawList || pageNum > 1) {
// 排序 分页
Pageable pageable = PageRequest.of(pageNum - 1, pageSize, Sort.by(Sort.Direction.DESC, "createdAt"));
count = mongoTemplate.count(query, IntegralActivityDrawVo.class, IntegralActivityDrawVo.class.getSimpleName());
query.with(pageable);
List<IntegralActivityDrawVo> integralActivityDrawVos = mongoTemplate.find(query, IntegralActivityDrawVo.class, IntegralActivityDrawVo.class.getSimpleName());
sweetIntegralActivityDrawPagedResult.setList(integralActivityDrawVos).setTotal(count, pageSize).setPageSize(pageSize).setCurrentPage(pageNum);
if (null == integralActivityDrawList) {
redisDataUtils.setIntegralActivityDrawList(currentUid, integralActivityId, integralActivityDrawVos);
}
} else {
sweetIntegralActivityDrawPagedResult.setList(integralActivityDrawList).setTotal(count, pageSize).setPageSize(pageSize).setCurrentPage(pageNum);
}
return ResponseDto.success(sweetIntegralActivityDrawPagedResult);
}
......@@ -294,43 +307,15 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
.append("receivingCity", receivingCity)
.append("receivingCounty", receivingCounty)
.append("receivingAddress", receivingAddress)
.append("updatedAt", DateUtil.Formatter.yyyyMMddHHmmss.format(nowTime)))
.append("updatedAt", nowTime))
);
LinkedList<IntegralActivityDrawVo> integralActivityDrawList = redisDataUtils.getIntegralActivityDrawList(1, drawVo.getUserId(), drawVo.getIntegralActivityId());
for (IntegralActivityDrawVo info : integralActivityDrawList) {
if (info.getDrawId().equals(drawId)) {
info.setReceivingAddressesId(receivingAddressesId);
info.setReceivingName(receivingName);
info.setReceivingPhone(receivingPhone);
info.setReceivingProvince(receivingProvince);
info.setReceivingCity(receivingCity);
info.setReceivingCounty(receivingCounty);
info.setReceivingAddress(receivingAddress);
info.setUpdatedAt(nowTime);
}
}
redisDataUtils.setIntegralActivityDrawInList(drawVo.getUserId(), drawVo.getIntegralActivityId(), integralActivityDrawList);
LinkedList<IntegralActivityDrawVo> integralActivityDrawList2 = redisDataUtils.getIntegralActivityDrawList(2, drawVo.getUserId(), drawVo.getIntegralActivityId());
for (IntegralActivityDrawVo info : integralActivityDrawList2) {
if (info.getDrawId().equals(drawId)) {
info.setReceivingAddressesId(receivingAddressesId);
info.setReceivingName(receivingName);
info.setReceivingPhone(receivingPhone);
info.setReceivingProvince(receivingProvince);
info.setReceivingCity(receivingCity);
info.setReceivingCounty(receivingCounty);
info.setReceivingAddress(receivingAddress);
info.setUpdatedAt(nowTime);
}
}
redisDataUtils.setIntegralActivityDrawList(drawVo.getUserId(), drawVo.getIntegralActivityId(), integralActivityDrawList2);
redisDataUtils.delIntegralActivityDrawList(drawVo.getUserId(), drawVo.getIntegralActivityId());
// mysql
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("integral_activity_draw.update"));
sqls.add(SqlMapping.get("sweet_integral_activity_draw.update"));
sqlsDataA.add(new Object[]{
receivingAddressesId, receivingName, receivingPhone, receivingAddress, receivingProvince, receivingCity, receivingCounty, nowTime, drawId
});
......@@ -348,10 +333,77 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
return ResponseDto.success(drawVo);
}
@Override
public ResponseDto collectCoupon(String couponId, String drawId) {
IntegralActivityDrawVo drawVo = redisDataUtils.getIntegralActivityDrawInfo(drawId);
Map tokenClaims = CurrentUtil.getTokenClaims();
String mobile = StringUtils.defaultString((String.valueOf(tokenClaims.get(CurrentUtil.TOKEN_MOBILE))), "");
String uid = StringUtils.defaultString((String.valueOf(tokenClaims.get(CurrentUtil.TOKEN_SUB))), "");
if (null != drawVo && drawVo.getReceivingStatus() == 1 && drawVo.getUserId().equals(uid)) {
// 发放券
LocalDateTime nowTime = LocalDateTime.now();
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("sweet_integral_activity_draw.get_coupon"));
sqlsDataA.add(new Object[]{
IDGenerator.nextTimeId2(), couponId,
1, mobile, nowTime, "INTEGRAL_DRAW", nowTime
});
queueUtils.sendMsgByRedis(MQConst.StoneQueue.STONE_ORDER_COUPON.getKey(),
SqlMapping.gets(sqls, sqlsDataA));
// 更改发放状态
LinkedList<String> sqlsB = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataB = CollectionUtil.linkedListObjectArr();
sqlsB.add(SqlMapping.get("sweet_integral_activity_draw.updateStatus"));
sqlsDataB.add(new Object[]{
2, couponId, nowTime, drawId
});
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_INTEGRAL_ACTIVITY_DRAW.getKey(),
SqlMapping.gets(sqlsB, sqlsDataB));
// 更新缓存
redisDataUtils.updateIntegralActivityDrawInfo(drawId, couponId);
mongoTemplate.getCollection(IntegralActivityDrawVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("drawId").is(drawId)).getQueryObject(),
new Document("$set", new Document("receivingStatus", 2)
.append("relationId", couponId)
.append("updatedAt", LocalDateTime.now())
)
);
redisDataUtils.delIntegralActivityDrawList(drawVo.getIntegralActivityId(), uid);
}
return ResponseDto.success();
}
@Override
public ResponseDto<List<CandyCouponPreviewVo>> couponList(String prizeId, String integralActivityId) {
IntegralActivityVo integralActivity = redisDataUtils.getIntegralActivityInfo(integralActivityId);
List<IntegralActivityPrizeVo> prizeList1 = integralActivity.getPrizeList1();
List<IntegralActivityPrizeRelationVo> relationList = new ArrayList<>();
for (IntegralActivityPrizeVo prize : prizeList1) {
if (prize.getPrizeId().equals(prizeId)) {
relationList = prize.getPrizeRelationList();
break;
}
}
List<CandyCouponPreviewVo> couponBasicVos = new ArrayList<>();
if (!CollectionUtils.isEmpty(relationList)) {
try {
List<String> couponIds = relationList.stream().map(IntegralActivityPrizeRelationVo -> IntegralActivityPrizeRelationVo.getCouponId()).collect(Collectors.toList());
ResponseDto<List<CandyCouponPreviewVo>> responseDto = feignCandyBaseClient.couponListById(StringUtils.join(couponIds.toArray(), ","));
couponBasicVos = responseDto.getData();
} catch (Exception e) {
log.error("获取券详情失败 e:{}", e);
}
}
return ResponseDto.success(couponBasicVos);
}
/**
* 抽奖方法
* 抽奖方法 计算中哪一个
*/
private static SweetIntegralActivityPrize lotteryDraw(List<SweetIntegralActivityPrize> prizeList) {
private static IntegralActivityPrizeVo lotteryDraw1(List<IntegralActivityPrizeVo> prizeList) {
if (prizeList == null || prizeList.isEmpty()) {
return null;
}
......@@ -360,14 +412,14 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
// 计算总概率,这样可以保证不一定总概率是1
BigDecimal sumRate = BigDecimal.ZERO;
for (SweetIntegralActivityPrize prize : prizeList) {
for (IntegralActivityPrizeVo prize : prizeList) {
sumRate = sumRate.add(prize.getWinningProbability());
}
// 计算每个物品在总概率的基础下的概率情况
List<BigDecimal> sortOrignalRates = new ArrayList<>(size);
BigDecimal tempSumRate = BigDecimal.ZERO;
for (SweetIntegralActivityPrize prize : prizeList) {
for (IntegralActivityPrizeVo prize : prizeList) {
tempSumRate = tempSumRate.add(prize.getWinningProbability());
sortOrignalRates.add(tempSumRate.divide(sumRate, 4, BigDecimal.ROUND_HALF_UP));
}
......@@ -380,8 +432,77 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
int index = sortOrignalRates.indexOf(nextDoubleNew);
SweetIntegralActivityPrize sweetIntegralActivityPrize = prizeList.get(index);
return sweetIntegralActivityPrize;
IntegralActivityPrizeVo integralActivityPrizeVo = prizeList.get(index);
return integralActivityPrizeVo;
}
/**
* 抽奖方法 计算中哪个奖池的奖品
*/
/*private boolean lotteryDraw(String integralActivityId, String uid) {
// 随机数
double random = Math.random() * 100;
BigDecimal randomBig = BigDecimal.valueOf(random);
// 剩余总库存 添加编辑的时候冗余的总库存省去计算
int prizeNum = redisDataUtils.getIntegralActivityTotalPrizeNum(integralActivityId);
BigDecimal prizeNumBig = BigDecimal.valueOf(prizeNum);
// 概率
int estimatedNum = redisDataUtils.getIntegralActivityEstimatedNum(integralActivityId);
if (estimatedNum <= 0) { // 此时百分百记录中实物
return true;
}
BigDecimal estimatedNumBig = BigDecimal.valueOf(estimatedNum);
// 会员概率*2
try {
ResponseDto<Boolean> isMemberDto = feignAdamBaseClient.isMember(uid);
Boolean isMember = isMemberDto.getData();
if (isMember) {
estimatedNumBig = estimatedNumBig.divide(BigDecimal.valueOf(2), 2, BigDecimal.ROUND_HALF_UP);
}
} catch (Exception e) {
log.error("获取用户是否是会员失败 [uid:{}, e:{}]", uid, e);
}
BigDecimal multiply = prizeNumBig.divide(estimatedNumBig, 2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100));
// 对比大小
if (multiply.compareTo(randomBig) >= 0) {
return true; // 大于等于随机数中实物
} else {
return false;
}
}*/
/**
* 抽奖方法 计算中哪个奖池的奖品
*/
private boolean lotteryDraw(String integralActivityId, String uid) {
int estimatedNum = redisDataUtils.getIntegralActivityEstimatedNum(integralActivityId);
if (estimatedNum <= 0) { // 此时百分百中实物
return true;
}
// 剩余总库存 添加编辑的时候冗余的总库存省去计算
int prizeNum = redisDataUtils.getIntegralActivityTotalPrizeNum(integralActivityId);
BigDecimal prizeNumBig = BigDecimal.valueOf(prizeNum);
// 概率
BigDecimal estimatedNumBig = BigDecimal.valueOf(estimatedNum);
// 会员概率*2
try {
ResponseDto<Boolean> isMemberDto = feignAdamBaseClient.isMember(uid);
Boolean isMember = isMemberDto.getData();
if (isMember) {
estimatedNumBig = estimatedNumBig.divide(BigDecimal.valueOf(2), 2, BigDecimal.ROUND_HALF_UP);
}
} catch (Exception e) {
log.error("获取用户是否是会员失败 [uid:{}, e:{}]", uid, e);
}
// 随机数
double random = Math.random();
BigDecimal randomBig = BigDecimal.valueOf(random);
BigDecimal randomBigNew = randomBig.multiply(estimatedNumBig);
// 对比大小
if (randomBigNew.compareTo(prizeNumBig) <= 0) {
return true; // 0 - 剩余预估人数的随机数 <= 实物剩余总库存 中实物
} else {
return false;
}
}
/*public static void main(String[] args) {
......
package com.liquidnet.service.sweet.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivity;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
import com.liquidnet.service.sweet.mapper.SweetIntegralActivityDrawMapper;
import com.liquidnet.service.sweet.mapper.SweetIntegralActivityMapper;
import com.liquidnet.service.sweet.service.ISweetIntegralActivityService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.service.sweet.utils.ObjectUtil;
import com.liquidnet.service.sweet.utils.RedisDataUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
/**
* <p>
......@@ -29,6 +33,9 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
@Autowired
private RedisDataUtils redisDataUtils;
@Autowired
private SweetIntegralActivityDrawMapper drawMapper;
@Override
public ResponseDto<List<IntegralActivityVo>> getList() {
List<IntegralActivityVo> integralActivityList = redisDataUtils.getIntegralActivityList();
......@@ -57,6 +64,73 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
@Override
public ResponseDto<IntegralActivityVo> detail(String integralActivityId) {
IntegralActivityVo integralActivity = redisDataUtils.getIntegralActivityInfo(integralActivityId);
integralActivity.setPrizeList1(null);
integralActivity.setPrizeList2(null);
List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList();
if (!CollectionUtils.isEmpty(prizeList)) {
prizeList.forEach(r -> {
r.setPrizeNum(null);
r.setWinningProbability(null);
r.setPrizeRelationList(null);
r.setCreatedAt(null);
r.setUpdatedAt(null);
});
}
return ResponseDto.success(integralActivity);
}
@Override
public ResponseDto setDrawAllList(String integralActivityId) {
List<SweetIntegralActivityDraw> sweetIntegralActivityDraws = drawMapper.selectList(
Wrappers.lambdaQuery(SweetIntegralActivityDraw.class).eq(SweetIntegralActivityDraw::getIntegralActivityId, integralActivityId)
.last("limit 0,35")
);
List<String> asList = Arrays.asList(
"冯", "陈", "褚", "卫",
"蒋", "沈", "韩", "杨",
"朱", "秦", "尤", "许",
"何", "吕", "施", "张",
"孔", "曹", "严", "华",
"金", "魏", "陶", "姜",
"戚", "谢", "邹", "喻",
"柏", "水", "窦", "章",
"云", "苏", "潘", "葛",
"奚", "范", "彭", "郎",
"鲁", "韦", "昌", "马",
"苗", "凤", "花", "方",
"俞", "任", "袁", "柳",
"酆", "鲍", "史", "唐",
"费", "廉", "岑", "薛",
"雷", "贺", "倪", "汤"
);
ArrayList<String> asListArr = new ArrayList(asList);
IntegralActivityVo integralActivityInfo = redisDataUtils.getIntegralActivityInfo(integralActivityId);
List<IntegralActivityPrizeVo> prizeList2 = integralActivityInfo.getPrizeList2();
Random random = new Random();
for (int i = 0; i < 5; i++) {
String name = asListArr.get(random.nextInt(asListArr.size()));
IntegralActivityPrizeVo activityPrizeVo = prizeList2.get(random.nextInt(prizeList2.size()));
SweetIntegralActivityDraw activityDraw = SweetIntegralActivityDraw.getNew();
activityDraw.setNickname(name);
activityDraw.setPrizeTitle(activityPrizeVo.getPrizeTitle());
sweetIntegralActivityDraws.add(activityDraw);
}
Collections.shuffle(sweetIntegralActivityDraws);
redisDataUtils.setIntegralActivityDrawAll(integralActivityId, sweetIntegralActivityDraws);
return ResponseDto.success();
}
@Override
public ResponseDto drawBlack(String uidS) {
String[] strings = uidS.split(",");
List<String> aList = Arrays.asList(strings);
redisDataUtils.setIntegralActivityDrawBlack(aList);
// boolean contains = aList.contains("11");
return ResponseDto.success();
}
}
......@@ -7,6 +7,7 @@ import com.liquidnet.commons.lang.util.DESUtils;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.adam.dto.vo.AdamLoginInfoVo;
import com.liquidnet.service.adam.dto.vo.AdamUserInfoVo;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
......@@ -174,7 +175,7 @@ public class SweetWechatLoginServiceImpl {
WxMaJscode2SessionResult sessionResult = sweetWechatService.sessionInfo(jsCode, type);
SweetAppletUsersVo sweetAppletUsersVo = redisUtils.getSweetAppletUsersOfUnionId(sessionResult.getUnionid());
if (null == sweetAppletUsersVo) {
return ResponseDto.failure("90081", "获取用户信息失败");
return ResponseDto.failure(ErrorMapping.get("90081"));
}
String purePhone = sweetAppletUsersVo.getPurePhoneNumber();
String otp = DESUtils.DES().encrypt(purePhone + LocalDateTime.now().toEpochSecond(ZoneOffset.UTC));
......
......@@ -19,6 +19,7 @@ import com.liquidnet.service.sweet.entity.*;
import com.liquidnet.service.sweet.mapper.*;
import com.liquidnet.service.sweet.param.SweetCityVoteParam;
import com.liquidnet.service.sweet.vo.*;
import jodd.util.ArraysUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
......@@ -430,6 +431,7 @@ public class RedisDataUtils {
String redisKey = SweetConstant.REDIS_KEY_SWEET_ANSWER_PHONE.concat(sweetAnswerVo.getPhone());
redisUtil.set(redisKey, sweetAnswerVo);
}
//草莓音乐节活动海报相关
public void setSweetMusician(SweetStrawberryParam sweetStrawberry) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_STRAWBERRY_POSTER.concat(sweetStrawberry.getUnionId());
......@@ -533,52 +535,11 @@ public class RedisDataUtils {
}
public void setIntegralActivityDraw(IntegralActivityDrawVo integralActivityDrawVo) {
int redisListSizeUser = 20;
int redisListSizeAll = 20;
Integer prizeType = integralActivityDrawVo.getPrizeType();
String userId = integralActivityDrawVo.getUserId();
String integralActivityId = integralActivityDrawVo.getIntegralActivityId();
if (prizeType > 1) {// 写入中奖列表 1是谢谢惠顾
String redisKeyIn = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_IN_USER
.concat(integralActivityId)
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER_KEY)
.concat(userId);
LinkedList<IntegralActivityDrawVo> activityDrawArrayListIn = this.getIntegralActivityDrawList(1, userId, integralActivityId);
// 先获取set到redisListSize条
if (!CollectionUtil.isEmpty(activityDrawArrayListIn)) {
if (activityDrawArrayListIn.size() >= redisListSizeUser) {
activityDrawArrayListIn.remove(0);
}
}
activityDrawArrayListIn.addFirst(integralActivityDrawVo);
redisUtil.set(redisKeyIn, activityDrawArrayListIn);
// all用户中奖列表
String redisKeyAll = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_ALL_LIST
.concat(integralActivityId);
LinkedList<IntegralActivityDrawVo> integralActivityDrawAll = this.getIntegralActivityDrawAll(integralActivityId);
if (!CollectionUtil.isEmpty(integralActivityDrawAll)) {
if (integralActivityDrawAll.size() >= redisListSizeAll) {
integralActivityDrawAll.remove(0);
}
}
integralActivityDrawAll.addFirst(integralActivityDrawVo);
redisUtil.set(redisKeyAll, integralActivityDrawAll);
}
// 是否中奖都写入抽奖列表
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER
.concat(integralActivityId)
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER_KEY)
.concat(userId);
LinkedList<IntegralActivityDrawVo> activityDrawArrayList = this.getIntegralActivityDrawList(2, userId, integralActivityId);
// 先获取set到redisListSizeUser条
if (!CollectionUtil.isEmpty(activityDrawArrayList)) {
if (activityDrawArrayList.size() >= redisListSizeUser) {
activityDrawArrayList.remove(0);
}
}
activityDrawArrayList.addFirst(integralActivityDrawVo);
redisUtil.set(redisKey, activityDrawArrayList);
this.delIntegralActivityDrawList(userId, integralActivityId);
// 抽奖详情
String redisKeyDraw = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_INFO
.concat(integralActivityDrawVo.getDrawId());
......@@ -597,42 +558,38 @@ public class RedisDataUtils {
return collect;
}
}
public void setIntegralActivityDrawAll(String integralActivityId, List<SweetIntegralActivityDraw> sweetIntegralActivityDraws) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_ALL_LIST
.concat(integralActivityId);
redisUtil.set(redisKey, sweetIntegralActivityDraws);
}
public LinkedList<IntegralActivityDrawVo> getIntegralActivityDrawList(Integer type, String uid, String integralActivityId) {
String redisKey = "";
if (type == 1) { // 中奖列表
redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_IN_USER
.concat(integralActivityId)
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER_KEY)
.concat(uid);
} else {
redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER
public LinkedList<IntegralActivityDrawVo> getIntegralActivityDrawList(String uid, String integralActivityId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_IN_USER
.concat(integralActivityId)
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER_KEY)
.concat(uid);
}
Object obj = redisUtil.get(redisKey);
if (null == obj) {
return SweetNewObjectUtil.getSweetIntegralActivityDrawVoLinkedList();
return null;
} else {
return (LinkedList<IntegralActivityDrawVo>) obj;
}
}
public void setIntegralActivityDrawInList(String uid, String integralActivityId, LinkedList<IntegralActivityDrawVo> integralActivityDrawList) {
public void setIntegralActivityDrawList(String uid, String integralActivityId, List<IntegralActivityDrawVo> integralActivityDrawVos) {
List<IntegralActivityDrawVo> myList = integralActivityDrawVos.stream().collect(Collectors.toCollection(LinkedList::new));
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_IN_USER
.concat(integralActivityId)
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER_KEY)
.concat(uid);
redisUtil.set(redisKey, integralActivityDrawList);
redisUtil.set(redisKey, myList);
}
public void setIntegralActivityDrawList(String uid, String integralActivityId, LinkedList<IntegralActivityDrawVo> integralActivityDrawList) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER
public void delIntegralActivityDrawList(String uid, String integralActivityId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_IN_USER
.concat(integralActivityId)
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER_KEY)
.concat(uid);
redisUtil.set(redisKey, integralActivityDrawList);
redisUtil.del(redisKey);
}
public int getIntegralActivityPrizeNum(String integralActivityId, String prizeId) {
......@@ -648,19 +605,6 @@ public class RedisDataUtils {
}
}
public int getIntegralActivityPrizeWinnersNum(String integralActivityId, String prizeId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_WINNERS_NUM
.concat(integralActivityId)
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_ID)
.concat(prizeId);
Object obj = redisUtil.get(redisKey);
if (null == obj) {
return 0;
} else {
return (int) obj;
}
}
public long decrIntegralActivityPrizeNum(String integralActivityId, String prizeId, int num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_NUM
.concat(integralActivityId)
......@@ -670,15 +614,6 @@ public class RedisDataUtils {
return decr;
}
public long decrIntegralActivityPrizeWinnersNum(String integralActivityId, String prizeId, int num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_WINNERS_NUM
.concat(integralActivityId)
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_ID)
.concat(prizeId);
long decr = redisUtil.decr(redisKey, num);
return decr;
}
public long incrIntegralActivityPrizeNum(String integralActivityId, String prizeId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_NUM
.concat(integralActivityId)
......@@ -687,12 +622,22 @@ public class RedisDataUtils {
return redisUtil.incr(redisKey, num);
}
public long incrIntegralActivityPrizeWinnersNum(String integralActivityId, String prizeId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_WINNERS_NUM
.concat(integralActivityId)
.concat(SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_ID)
.concat(prizeId);
return redisUtil.incr(redisKey, num);
public int getIntegralActivityTotalPrizeNum(String integralActivityId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_TOTAL_PRIZE_NUM
.concat(integralActivityId);
Object obj = redisUtil.get(redisKey);
if (null == obj) {
return 0;
} else {
return (int) obj;
}
}
public long decrIntegralActivityTotalPrizeNum(String integralActivityId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_TOTAL_PRIZE_NUM
.concat(integralActivityId);
long decr = redisUtil.decr(redisKey, 1);
return decr;
}
public IntegralActivityDrawVo getIntegralActivityDrawInfo(String drawId) {
......@@ -712,6 +657,30 @@ public class RedisDataUtils {
redisUtil.set(redisKeyDraw, drawVo);
}
public void updateIntegralActivityDrawInfo(String drawId, String couponId) {
String redisKeyDraw = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_INFO
.concat(drawId);
IntegralActivityDrawVo info = (IntegralActivityDrawVo) redisUtil.get(redisKeyDraw);
info.setReceivingStatus(2);
info.setRelationId(couponId);
info.setUpdatedAt(LocalDateTime.now());
redisUtil.set(redisKeyDraw, info);
}
public void setIntegralActivityDrawBlack(List<String> uidS) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_BLACK;
redisUtil.set(redisKey, uidS);
}
public List<String> getIntegralActivityDrawBlack() {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_BLACK;
Object obj = redisUtil.get(redisKey);
if (null == obj) {
return Arrays.asList();
} else {
return (List<String>) obj;
}
}
public boolean setIntegralDrawLock(String userId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_LOCK
.concat(userId);
......@@ -759,6 +728,7 @@ public class RedisDataUtils {
/**
* 设置临时banner
*
* @param type
* @param vo
*/
......@@ -769,16 +739,34 @@ public class RedisDataUtils {
/**
* 获取临时banner
*
* @param type
* @return
*/
public List<TempBannerVo> getTempBanner(Integer type) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_CITY_VOTE_BANNER.concat(":type:" + type);
Object obj = redisUtil.get(redisKey);
if(obj==null){
if (obj == null) {
return null;
}else{
return (List<TempBannerVo>)obj;
} else {
return (List<TempBannerVo>) obj;
}
}
public int getIntegralActivityEstimatedNum(String integralActivityId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM
.concat(integralActivityId);
Object obj = redisUtil.get(redisKey);
if (null == obj) {
return 0;
} else {
return (int) obj;
}
}
public void decrIntegralActivityEstimatedNum(String integralActivityId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM
.concat(integralActivityId);
redisUtil.decr(redisKey, num);
}
}
40001=登录信息有误
40002=账号已在另一台设备登录
40003=登录已过期
# ------------------------ 4开头错误码作系统保留
#APP ERROR
20001=验证码发送失败
20002=验证码无效
20003=无权查看
20004=参数错误
20005=手机号获取失败,请更换登录方式
20006=第三方账号未注册
20007=数量错误
20008=无权购买
20009=非会员用户暂不可购买
20010=当前不可购买
20011=未开始售卖
20012=售卖已结束
20013=已超过快递票截止时间
20014=快递票未填写收货地址
20015=入场人数量错误
20016=库存不足
20017=年龄不符合
20018=下单失败
20019=申请失败
20020=当前状态不可撤回
20021=退款金额不能为0
20022=申请金额不得小于0
20023=请求频繁
20024=订单不存在
20025=订单已支付
20026=订单已关闭
20028=订单已失效
20027=您已支付请刷新再试
20029=未选择支付方式
20030=查看失败
#APP JDM
20201=
# 专业版APP
20601=账号不存在
20602=密码错误
20603=
20604=
20605=
20606=当前账号无关联演出数据
20607=当前账号未关联当前演出
20608=当前演出还未开放下载
# 演出
20700=演出详情获取失败
20701=巡演获取失败
20702=获取演出场次票种失败
20703=获取支付前详情失败
# 特殊状态码
90081=获取用户信息失败
90082=您的积分账户余额不足!
......@@ -16,13 +16,6 @@ kylin_order_ticket_status.synPay=UPDATE kylin_order_ticket_status SET `status` =
kylin_order_ticket_relation.synPay=UPDATE kylin_order_ticket_relations SET updated_at = ? WHERE order_id = ? and (updated_at <= ? or created_at = ?)
kylin_order_ticket_entities.synPay=UPDATE kylin_order_ticket_entities SET is_payment = ?,updated_at = ?,sys_damai = 1 WHERE order_id = ? and (updated_at <= ? or created_at = ?)
# ------------------------订单关闭----------------------------
kylin_order_ticket.close=UPDATE kylin_order_tickets SET updated_at = ? WHERE order_tickets_id = ?
kylin_order_ticket_status.close=UPDATE kylin_order_ticket_status SET `status` = ?,updated_at = ? WHERE order_id = ?
kylin_order_ticket_relation.close=UPDATE kylin_order_ticket_relations SET updated_at = ? WHERE order_id = ?
# ------------------------用户关系----------------------------
sweet_user_relation.insert=INSERT INTO sweet_user_relation (user_id,type,target_id,manual_id,status,created_at) VALUES (?,?,?,?,1,?)
sweet_user_relation.delete=DELETE FROM sweet_user_relation WHERE user_id = ? and target_id = ? and manual_id = ? and type = ?
......@@ -45,8 +38,10 @@ sweet_city_vote_stat.update=UPDATE sweet_city_vote_stat SET vote_num = IFNULL(vo
# --------------------------防疫答题--------------------------
sweet_antigenic_question.insert=INSERT INTO sweet_antigenic_question (question_id,type,openId,unionId,nickname,address,phone,urgent_phone,keyword1,keyword11,keyword2,keyword3,keyword4,keyword5,keyword6,keyword7) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
# ------------------------积分抽奖----------------------------
integral_activity_draw.insert=INSERT INTO sweet_integral_activity_draw (draw_id,integral_activity_id,activity_num,prize_id,prize_title,prize_type,prize_type_num,relation_id,user_id,nickname,receiving_status) VALUES (?,?,?,?,?,?,?,?,?,?,?)
integral_activity_draw.update=UPDATE sweet_integral_activity_draw SET receiving_addresses_id = ?, receiving_name = ?, receiving_phone = ?, receiving_address = ?, receiving_province = ?, receiving_city = ?, receiving_county = ?, updated_at = ? WHERE draw_id = ?
sweet_integral_activity_draw.insert=INSERT INTO sweet_integral_activity_draw (draw_id,integral_activity_id,activity_num,prize_id,prize_title,prize_type,prize_type_num,user_id,nickname,receiving_status) VALUES (?,?,?,?,?,?,?,?,?,?)
sweet_integral_activity_draw.update=UPDATE sweet_integral_activity_draw SET receiving_addresses_id = ?, receiving_name = ?, receiving_phone = ?, receiving_address = ?, receiving_province = ?, receiving_city = ?, receiving_county = ?, updated_at = ? WHERE draw_id = ?
sweet_integral_activity_draw.updateStatus=UPDATE sweet_integral_activity_draw SET receiving_status = ?, relation_id = ?, updated_at = ? WHERE draw_id = ?
sweet_integral_activity_draw.get_coupon=INSERT INTO candy_mgt_coupon (mcoupon_id, coupon_id, `state`, event_amt, event_type, event_limit, event_at, `operator`, created_at) VALUES (?, ?, 0, ?, 2, ?, ?, ?, ?)
# --------------------------小程序登录记录用户解密后信息--------------------------
sweet_applet_users.insert=INSERT INTO sweet_applet_users (applet_user_id,user_id,open_id,union_id,phone_number,pure_phone_number,country_code,type) VALUES (?,?,?,?,?,?,?,?)
......
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