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

Commit fe9ca421 authored by 张国柄's avatar 张国柄

+会员设置:套餐编辑、权益编辑、会员券编辑、会员码生成|列表|导出;

parent 2207992a
package com.liquidnet.service.adam.dto.param.admin;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@ApiModel(value = "AdamMemberCodeListParam", description = "会员码列表入参")
@Data
public class AdamMemberCodeGenParam implements Serializable {
private static final long serialVersionUID = 7212595876649709617L;
@NotBlank(message = "会员类型ID不能为空")
@ApiModelProperty(required = true, value = "会员类型ID[64]", example = "1")
private String memberId;
@NotBlank(message = "会员价格ID不能为空")
@ApiModelProperty(required = true, value = "会员价格ID[64]", example = "1")
private String memberPriceId;
@NotNull(message = "有效期不能为空")
@ApiModelProperty(required = true, value = "有效期", example = "30")
private Integer validity;
@NotNull(message = "生成数量不能为空")
@Min(1)
@Max(100)
@ApiModelProperty(required = true, value = "生成数量[1-100]", example = "1")
private Integer genNum;
}
package com.liquidnet.service.adam.dto.param.admin;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@ApiModel(value = "AdamMemberCodeListParam", description = "会员码列表入参")
@Data
public class AdamMemberCodeListParam implements Serializable {
private static final long serialVersionUID = -8454342033562304457L;
@ApiModelProperty(required = false, value = "会员类型ID[64]")
private String memberId;
}
package com.liquidnet.service.adam.dto.param.admin;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@ApiModel(value = "AdamMemberPriceBuildParam", description = "编辑价格入参")
@Data
public class AdamMemberPriceBuildParam implements Serializable {
private static final long serialVersionUID = -7331274160877946420L;
@ApiModelProperty(required = true, value = "会员卡ID")
private String memberId;
@ApiModelProperty(required = false, value = "会员价格ID")
private String memberPriceId;
@ApiModelProperty(required = true, value = "原价")
private BigDecimal price;
@ApiModelProperty(required = true, value = "折扣价")
private BigDecimal priceFixed;
@ApiModelProperty(required = true, value = "特价:首次、首年优惠价")
private BigDecimal priceSpecial;
@ApiModelProperty(required = true, value = "有效天数")
private Integer days;
@ApiModelProperty(required = true, value = "双倍积分[1-关闭,2-开启]")
private Integer integralRate;
}
......@@ -12,20 +12,13 @@ import java.util.List;
@Data
public class AdamMemberRightsBuildParam implements Serializable {
private static final long serialVersionUID = -7331274160877946420L;
@ApiModelProperty(required = false, value = "会员价格ID")
private String memberPriceId;
@ApiModelProperty(required = true, value = "原价")
private BigDecimal price;
@ApiModelProperty(required = true, value = "折扣价")
private BigDecimal priceFixed;
@ApiModelProperty(required = true, value = "特价:首次、首年优惠价")
private BigDecimal priceSpecial;
@ApiModelProperty(required = true, value = "有效天数")
private Integer days;
@ApiModelProperty(required = true, value = "会员卡ID")
private String memberId;
@ApiModelProperty(required = false, value = "权益ID[64]")
private String mrightsId;
@ApiModelProperty(required = true, value = "权益状态[]")
private Integer state;
@ApiModelProperty(required = true, value = "权益标题[50]")
private String title;
@ApiModelProperty(required = true, value = "权益副标题[200]")
......
......@@ -24,26 +24,35 @@ public class AdamMemberCodeVo implements Serializable, Cloneable {
private Integer type;
@ApiModelProperty(position = 4, value = "会员编号")
private String memberNo;
@ApiModelProperty(position = 5, value = "状态:0-未使用,1-已使用,2-不可用")
@ApiModelProperty(position = 5, value = "状态[0-可用|1-已用|2-无效|3-过期|4-失效|5-退回]")
private Integer state;
@ApiModelProperty(position = 6, value = "购买会员码的订单编号")
@ApiModelProperty(position = 6, value = "有效期(单位天)")
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private Integer validity;
@ApiModelProperty(position = 7, value = "生效时间")
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime effectAt;
@ApiModelProperty(position = 8, value = "失效时间")
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime expireAt;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime createdAt;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime updatedAt;
@ApiModelProperty(position = 11, value = "购买会员码的订单编号")
private String buyOrderNo;
@ApiModelProperty(position = 7, value = "购买会员码的用户id")
@ApiModelProperty(position = 12, value = "购买会员码的用户id")
private String buyUid;
@ApiModelProperty(position = 8, value = "购买时间")
@ApiModelProperty(position = 13, value = "购买时间")
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime buyAt;
@ApiModelProperty(position = 9, value = "使用会员码的订单编号")
@ApiModelProperty(position = 14, value = "使用会员码的订单编号")
private String useOrderNo;
@ApiModelProperty(position = 10, value = "使用会员码的用户id")
@ApiModelProperty(position = 15, value = "使用会员码的用户id")
private String useUid;
@ApiModelProperty(position = 11, value = "使用时间")
@ApiModelProperty(position = 16, value = "使用时间")
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime useAt;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime createdAt;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime updatedAt;
private static final AdamMemberCodeVo obj = new AdamMemberCodeVo();
......@@ -63,14 +72,17 @@ public class AdamMemberCodeVo implements Serializable, Cloneable {
this.setType(source.getType());
this.setMemberNo(source.getMemberNo());
this.setState(source.getState());
this.setValidity(source.getValidity());
this.setEffectAt(source.getEffectAt());
this.setExpireAt(source.getExpireAt());
this.setCreatedAt(source.getCreatedAt());
this.setUpdatedAt(source.getUpdatedAt());
this.setBuyOrderNo(source.getBuyOrderNo());
this.setBuyUid(source.getBuyUid());
this.setBuyAt(source.getBuyAt());
this.setUseOrderNo(source.getUseOrderNo());
this.setUseUid(source.getUseUid());
this.setUseAt(source.getUseAt());
this.setCreatedAt(source.getCreatedAt());
this.setUpdatedAt(source.getUpdatedAt());
return this;
}
}
......@@ -12,7 +12,14 @@ import java.util.List;
@ApiModel(value = "CandyMgtCouponBuildParam", description = "新建券入参")
@Data
public class CandyMemberCouponBuildParam {
//private String couponId;
@ApiModelProperty(required = true, value = "会员类型ID[64]")
private String memberId;
@ApiModelProperty(required = true, value = "权益ID[64]")
private String mrightsId;
@NotBlank(message = "券ID不能为空")
@ApiModelProperty(required = false, value = "券ID", example = "券ID")
private String couponId;
//private Integer state;
@NotBlank(message = "券标题不能为空")
@ApiModelProperty(required = true, value = "券标题", example = "券标题")
......@@ -72,7 +79,7 @@ public class CandyMemberCouponBuildParam {
@ApiModelProperty(required = true, value = "发放量", example = "1")
private Integer eventAmt;
// @NotNull(message = "券发放类型不能为空")
// @ApiModelProperty(required = true, value = "发放类型[1-会员|2-手机号|10-全体用户]", allowableValues = "1,2,10")
// @ApiModelProperty(required = true, value = "发放类型[1-会员|2-手机号|3-UID|10-全体用户]", allowableValues = "1,2,10")
// private Integer eventType;
// @ApiModelProperty(required = false, value = "`发放类型`为2-手机号时发放手机号以,分隔", example = "17701223310,17701223310")
// private String eventLimit;
......
......@@ -24,66 +24,66 @@ import javax.validation.constraints.NotBlank;
import java.util.ArrayList;
import java.util.List;
@Api(tags = "会员价格")
@Slf4j
@Validated
@RestController
@RequestMapping("adam/mprice")
//@Api(tags = "会员价格")
//@Slf4j
//@Validated
//@RestController
//@RequestMapping("adam/mprice")
public class AdamMemberPriceAdminController {
@Autowired
IAdamMemberPriceAdminService adamMemberPriceService;
@Log(title = "会员价格", businessType = BusinessType.LIST)
@RequiresPermissions("adam:mprice:list")
@ApiOperation(value = "会员价格列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "memberId", value = "会员卡ID[64]"),
})
@GetMapping("list")
public ResponseDto<List<AdamMemberPriceVo>> list(@NotBlank(message = "会员类型ID不能为空") @RequestParam String memberId) {
List<AdamMemberPrice> list = adamMemberPriceService.list(
Wrappers.lambdaQuery(AdamMemberPrice.class).eq(AdamMemberPrice::getMemberId, memberId)
);
List<AdamMemberPriceVo> vos = new ArrayList<>();
list.forEach(r -> {
vos.add(AdamMemberPriceVo.getNew().copy(r));
});
return ResponseDto.success(vos);
}
@Log(title = "会员价格", businessType = BusinessType.DETAIL)
@RequiresPermissions("adam:mprice:info")
@ApiOperation(value = "会员价格详情")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "memberId", value = "会员卡ID[64]"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "memberPriceId", value = "会员卡价格ID[64]"),
})
@GetMapping("info")
public ResponseDto<AdamMemberPriceVo> query(@NotBlank(message = "会员类型ID不能为空") @RequestParam String memberId,
@NotBlank(message = "会员价格ID不能为空") @RequestParam String memberPriceId) {
AdamMemberPrice one = adamMemberPriceService.getOne(
Wrappers.lambdaQuery(AdamMemberPrice.class)
.eq(AdamMemberPrice::getMemberPriceId, memberPriceId)
.eq(AdamMemberPrice::getMemberId, memberId)
);
return ResponseDto.success(AdamMemberPriceVo.getNew().copy(one));
}
@Log(title = "会员价格", businessType = BusinessType.INSERT)
@RequiresPermissions("adam:mprice:add")
@ApiOperation(value = "添加会员价格")
@PostMapping("add")
public ResponseDto<AdamMemberPriceVo> add(@Valid @RequestBody AdamMemberPriceParam param) {
AdamMemberPrice entity = new AdamMemberPrice();
BeanUtils.copyProperties(param, entity);
return ResponseDto.success(adamMemberPriceService.add(entity));
}
@Log(title = "会员价格", businessType = BusinessType.UPDATE)
@RequiresPermissions("adam:mprice:edit")
@ApiOperation(value = "编辑会员价格")
@PostMapping("edit")
public ResponseDto<AdamMemberPriceVo> edit(@Valid @RequestBody AdamMemberPriceParam param) {
return adamMemberPriceService.edit(param) ? ResponseDto.success() : ResponseDto.failure("无效编辑");
}
// @Autowired
// IAdamMemberPriceAdminService adamMemberPriceService;
//
// @Log(title = "会员价格", businessType = BusinessType.LIST)
// @RequiresPermissions("adam:mprice:list")
// @ApiOperation(value = "会员价格列表")
// @ApiImplicitParams({
// @ApiImplicitParam(type = "form", required = true, dataType = "String", name = "memberId", value = "会员卡ID[64]"),
// })
// @GetMapping("list")
// public ResponseDto<List<AdamMemberPriceVo>> list(@NotBlank(message = "会员类型ID不能为空") @RequestParam String memberId) {
// List<AdamMemberPrice> list = adamMemberPriceService.list(
// Wrappers.lambdaQuery(AdamMemberPrice.class).eq(AdamMemberPrice::getMemberId, memberId)
// );
// List<AdamMemberPriceVo> vos = new ArrayList<>();
// list.forEach(r -> {
// vos.add(AdamMemberPriceVo.getNew().copy(r));
// });
// return ResponseDto.success(vos);
// }
//
// @Log(title = "会员价格", businessType = BusinessType.DETAIL)
// @RequiresPermissions("adam:mprice:info")
// @ApiOperation(value = "会员价格详情")
// @ApiImplicitParams({
// @ApiImplicitParam(type = "form", required = true, dataType = "String", name = "memberId", value = "会员卡ID[64]"),
// @ApiImplicitParam(type = "form", required = true, dataType = "String", name = "memberPriceId", value = "会员卡价格ID[64]"),
// })
// @GetMapping("info")
// public ResponseDto<AdamMemberPriceVo> query(@NotBlank(message = "会员类型ID不能为空") @RequestParam String memberId,
// @NotBlank(message = "会员价格ID不能为空") @RequestParam String memberPriceId) {
// AdamMemberPrice one = adamMemberPriceService.getOne(
// Wrappers.lambdaQuery(AdamMemberPrice.class)
// .eq(AdamMemberPrice::getMemberPriceId, memberPriceId)
// .eq(AdamMemberPrice::getMemberId, memberId)
// );
// return ResponseDto.success(AdamMemberPriceVo.getNew().copy(one));
// }
//
// @Log(title = "会员价格", businessType = BusinessType.INSERT)
// @RequiresPermissions("adam:mprice:add")
// @ApiOperation(value = "添加会员价格")
// @PostMapping("add")
// public ResponseDto<AdamMemberPriceVo> add(@Valid @RequestBody AdamMemberPriceParam param) {
// AdamMemberPrice entity = new AdamMemberPrice();
// BeanUtils.copyProperties(param, entity);
// return ResponseDto.success(adamMemberPriceService.add(entity));
// }
//
// @Log(title = "会员价格", businessType = BusinessType.UPDATE)
// @RequiresPermissions("adam:mprice:edit")
// @ApiOperation(value = "编辑会员价格")
// @PostMapping("edit")
// public ResponseDto<AdamMemberPriceVo> edit(@Valid @RequestBody AdamMemberPriceParam param) {
// return adamMemberPriceService.edit(param) ? ResponseDto.success() : ResponseDto.failure("无效编辑");
// }
}
......@@ -41,8 +41,7 @@ public class CandyCouponCodeAdminController extends BaseController {
@RequiresPermissions("candy:coupon:code:view")
@GetMapping()
public String role(@RequestParam String couponId, ModelMap mmap)
{
public String view(@RequestParam String couponId, ModelMap mmap) {
mmap.put("couponId", couponId);
return prefix + "/code";
}
......@@ -50,10 +49,15 @@ public class CandyCouponCodeAdminController extends BaseController {
@RequiresPermissions("candy:coupon:code:list")
@PostMapping("list")
@ResponseBody
public TableDataInfo list(CandyCouponCodeListParam listParam)
{
LambdaQueryWrapper<CandyCouponCode> lambdaQuery = Wrappers.lambdaQuery(CandyCouponCode.class).orderByAsc(CandyCouponCode::getCcode);
public TableDataInfo list(CandyCouponCodeListParam listParam) {
startPage();
return getDataTable(listQuery(listParam));
}
private List<CandyCouponCode> listQuery(CandyCouponCodeListParam listParam) {
LambdaQueryWrapper<CandyCouponCode> lambdaQuery = Wrappers.lambdaQuery(CandyCouponCode.class);
lambdaQuery.eq(CandyCouponCode::getCouponId, listParam.getCouponId())
.ne(CandyCouponCode::getState, 2)
.select(
CandyCouponCode::getCcode,
CandyCouponCode::getCouponId,
......@@ -63,28 +67,14 @@ public class CandyCouponCodeAdminController extends BaseController {
if (null != listParam.getState()) {
lambdaQuery.eq(CandyCouponCode::getState, listParam.getState());
}
startPage();
List<CandyCouponCode> list = candyCouponCodeAdminService.list(lambdaQuery);
return getDataTable(list);
return candyCouponCodeAdminService.list(lambdaQuery);
}
@RequiresPermissions("candy:coupon:code:export")
@PostMapping("export")
@ResponseBody
public AjaxResult export(CandyCouponCodeListParam listParam)
{
LambdaQueryWrapper<CandyCouponCode> lambdaQuery = Wrappers.lambdaQuery(CandyCouponCode.class);
lambdaQuery.eq(CandyCouponCode::getCouponId, listParam.getCouponId())
.select(
CandyCouponCode::getCcode,
CandyCouponCode::getCouponId,
CandyCouponCode::getRedeemMobile,
CandyCouponCode::getState
);
if (null != listParam.getState()) {
lambdaQuery.eq(CandyCouponCode::getState, listParam.getState());
}
List<CandyCouponCode> list = candyCouponCodeAdminService.list(lambdaQuery);
public AjaxResult export(CandyCouponCodeListParam listParam) {
List<CandyCouponCode> list = listQuery(listParam);
ExcelUtil<CandyCouponCodeExcelDto> excelUtil = new ExcelUtil<>(CandyCouponCodeExcelDto.class);
List<CandyCouponCodeExcelDto> excelList = new ArrayList<>();
......@@ -97,8 +87,7 @@ public class CandyCouponCodeAdminController extends BaseController {
@RequiresPermissions("candy:coupon:code:invalid")
@PostMapping("invalid")
@ResponseBody
public AjaxResult invalid(CandyCouponCodeOptParam optParam)
{
public AjaxResult invalid(CandyCouponCodeOptParam optParam) {
logger.debug("optParam:{}", JsonUtils.toJson(optParam));
optParam.getCcodes().forEach(r -> {
......@@ -122,8 +111,7 @@ public class CandyCouponCodeAdminController extends BaseController {
@RequiresPermissions("candy:coupon:code:recover")
@PostMapping("recover")
@ResponseBody
public AjaxResult recover(CandyCouponCodeOptParam optParam)
{
public AjaxResult recover(CandyCouponCodeOptParam optParam) {
logger.debug("optParam:{}", JsonUtils.toJson(optParam));
optParam.getCcodes().forEach(r -> {
......
......@@ -36,6 +36,9 @@ import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Api(tags = "券发放管理")
@Controller
......@@ -104,13 +107,18 @@ public class CandyMgtCoupon1AdminController extends BaseController {
effectAt = eventAt.with(LocalTime.MIN);
expireAt = eventAt.plusDays(validity).withHour(23).withMinute(59).withSecond(59);
String eventLimit = null, operator = ShiroUtils.getLoginName();
StringBuilder eventLimit = new StringBuilder();
String operator = ShiroUtils.getLoginName();
if (buildParam.getEventType() == 2) {// 指定用户手机号
eventLimit = buildParam.getEventLimit().trim();
String eventLimitStr = buildParam.getEventLimit().trim();
// TODO: 2021/8/20 正则校验手机号字符串
if (StringUtils.isEmpty(eventLimit)) {
if (StringUtils.isEmpty(eventLimitStr)) {
return this.error(AjaxResult.Type.WARN, "请指定手机号");
}
Set<String> eventLimitSet = Stream.of(eventLimitStr.split(",")).collect(Collectors.toSet());
for (String l : eventLimitSet) {
eventLimit.append(l).append(",");
}
}
CandyCoupon initCoupon = new CandyCoupon();
......@@ -159,7 +167,7 @@ public class CandyMgtCoupon1AdminController extends BaseController {
initMgtCoupon.setState(0);
initMgtCoupon.setEventAmt(buildParam.getEventAmt());
initMgtCoupon.setEventType(buildParam.getEventType());
initMgtCoupon.setEventLimit(eventLimit);
initMgtCoupon.setEventLimit(eventLimit.toString());
initMgtCoupon.setEventAt(eventAt);
initMgtCoupon.setOperator(operator);
initMgtCoupon.setCreatedAt(nowTime);
......
package com.liquidnet.client.admin.zhengzai.adam.dto;
import com.liquidnet.client.admin.common.annotation.Excel;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.adam.entity.AdamMemberCode;
import lombok.Data;
import java.io.Serializable;
@Data
public class AdamMemberCodeExcelDto implements Serializable, Cloneable {
private static final long serialVersionUID = -6775626480969657499L;
@Excel(name = "会员码")
private String code;
@Excel(name = "状态")
private Integer state;
@Excel(name = "用户UID")
private String useUid;
@Excel(name = "生效时间", width = 30)
private String effectAt;
@Excel(name = "过期时间", width = 30)
private String expireAt;
@Excel(name = "批次号")
private String memberId;
private static final AdamMemberCodeExcelDto obj = new AdamMemberCodeExcelDto();
public static AdamMemberCodeExcelDto getNew() {
try {
return (AdamMemberCodeExcelDto) obj.clone();
} catch (CloneNotSupportedException e) {
return new AdamMemberCodeExcelDto();
}
}
public AdamMemberCodeExcelDto copy(AdamMemberCode source) {
if (null == source) return this;
this.setCode(source.getCode());
this.setState(source.getState());
this.setUseUid(source.getUseUid());
this.setEffectAt(DateUtil.Formatter.yyyyMMddHHmmss.format(source.getEffectAt()));
this.setExpireAt(DateUtil.Formatter.yyyyMMddHHmmss.format(source.getExpireAt()));
this.setMemberId(source.getMemberId());
return this;
}
}
package com.liquidnet.client.admin.zhengzai.adam.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.adam.dto.AdamMemberCodeParam;
import com.liquidnet.service.adam.dto.param.admin.AdamMemberCodeGenParam;
import com.liquidnet.service.adam.entity.AdamMemberCode;
/**
......@@ -13,5 +13,6 @@ public interface IAdamMemberCodeAdminService extends IService<AdamMemberCode> {
* 创建礼包码
* @param param
*/
String createGiftCode(AdamMemberCodeParam param);
// String createGiftCode(AdamMemberCodeParam param);
boolean createGiftCode(AdamMemberCodeGenParam param);
}
package com.liquidnet.client.admin.zhengzai.adam.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.adam.dto.AdamMemberPriceParam;
import com.liquidnet.service.adam.dto.param.admin.AdamMemberPriceBuildParam;
import com.liquidnet.service.adam.dto.vo.AdamMemberPriceVo;
import com.liquidnet.service.adam.entity.AdamMemberPrice;
public interface IAdamMemberPriceAdminService extends IService<AdamMemberPrice> {
AdamMemberPriceVo add(AdamMemberPrice info);
boolean edit(AdamMemberPriceParam param);
boolean edit(AdamMemberPriceBuildParam param);
}
package com.liquidnet.client.admin.zhengzai.adam.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.adam.dto.AdamMemberPriceParam;
import com.liquidnet.service.adam.dto.vo.AdamMemberPriceVo;
import com.liquidnet.service.adam.entity.AdamMemberPrice;
import com.liquidnet.service.adam.dto.param.admin.AdamMemberRightsBuildParam;
import com.liquidnet.service.adam.entity.AdamMemberRights;
public interface IAdamMemberRightsAdminService extends IService<AdamMemberRights> {
boolean edit(AdamMemberRightsBuildParam param);
}
package com.liquidnet.client.admin.zhengzai.adam.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberCodeAdminService;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.AdamMemberCodeParam;
import com.liquidnet.service.adam.dto.param.admin.AdamMemberCodeGenParam;
import com.liquidnet.service.adam.dto.vo.AdamMemberCodeVo;
import com.liquidnet.service.adam.entity.AdamMemberCode;
import com.liquidnet.service.adam.mapper.AdamMemberCodeMapper;
......@@ -13,9 +15,10 @@ import com.liquidnet.service.adam.util.MemberUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
@Slf4j
......@@ -23,77 +26,89 @@ import java.util.regex.Pattern;
public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMapper, AdamMemberCode> implements IAdamMemberCodeAdminService {
@Autowired
AdamMemberCodeMapper memberCodeMapper;
// @Autowired
// MongoTemplate mongoTemplate;
@Autowired
RedisUtil redisUtil;
@Override
public String createGiftCode(AdamMemberCodeParam param) {
String mCode, memberNo;
boolean exists;
do {
mCode = MemberUtil.freeCode();
// exists = mongoTemplate.exists(
// Query.query(Criteria.where("code").is(mCode)), AdamMemberCodeVo.class.getSimpleName()
// );
exists = redisUtil.hasKey(mCode);
} while (exists);
// 需要主动生成会员编号
memberNo = getNextMemberNo(param.getMemberId());
if (StringUtils.isEmpty(memberNo)) return "";
AdamMemberCode initMemberCode = new AdamMemberCode();
initMemberCode.setCode(mCode);
initMemberCode.setType(param.getType());
initMemberCode.setMemberId(param.getMemberId());
initMemberCode.setMemberPriceId(param.getMemberPriceId());
initMemberCode.setMemberNo(memberNo);
initMemberCode.setState(0);// 0-未使用,1-已使用,2-不可用
initMemberCode.setCreatedAt(LocalDateTime.now());
memberCodeMapper.insert(initMemberCode);
AdamMemberCodeVo vo = AdamMemberCodeVo.getNew().copy(initMemberCode);
// mongoTemplate.insert(vo, AdamMemberCodeVo.class.getSimpleName());
setMemberCodeVoByCode(mCode, vo);
public boolean createGiftCode(AdamMemberCodeGenParam param) {
List<AdamMemberCode> memberCodeList = new ArrayList<>();
ArrayList<String> codeList = CollectionUtil.arrayListString();
Integer genNum = param.getGenNum();
LocalDateTime now = LocalDateTime.now();
for (int i = 0; i < genNum; i++) {
String mCode;
boolean exists;
do {
mCode = MemberUtil.freeCode();
String key = AdamRedisConst.INFO_MEMBER_CODE.concat(mCode);
exists = redisUtil.hasKey(key);
} while (exists);
AdamMemberCode initMemberCode = new AdamMemberCode();
initMemberCode.setCode(mCode);
initMemberCode.setType(1);
initMemberCode.setMemberId(param.getMemberId());
initMemberCode.setMemberPriceId(param.getMemberPriceId());
// 需要主动生成会员编号
//initMemberCode.setMemberNo(getNextMemberNo(param.getMemberId()));
initMemberCode.setState(0);// 状态[0-可用|1-已用|2-无效|3-过期|4-失效|5-退回]
initMemberCode.setValidity(param.getValidity());
initMemberCode.setEffectAt(now);
initMemberCode.setExpireAt(now.plusDays(param.getValidity()).withHour(23).withMinute(59).withSecond(59));
initMemberCode.setCreatedAt(now);
memberCodeList.add(initMemberCode);
codeList.add(mCode);
//redisUtil.set(AdamRedisConst.INFO_MEMBER_CODE.concat(mCode), AdamMemberCodeVo.getNew().copy(initMemberCode));
}
return initMemberCode.getCode();
if (this.saveBatch(memberCodeList, memberCodeList.size())) {
List<AdamMemberCode> list = this.list(
Wrappers.lambdaQuery(AdamMemberCode.class).in(AdamMemberCode::getCode, codeList)
.eq(AdamMemberCode::getState, 0).eq(AdamMemberCode::getCreatedAt, now)
);
list.forEach(r -> {
r.setMemberNo(getNextMemberNo(param.getMemberId()));
redisUtil.set(AdamRedisConst.INFO_MEMBER_CODE.concat(r.getCode()), AdamMemberCodeVo.getNew().copy(r));
});
this.updateBatchById(list, list.size());
return true;
}
return false;
}
public String getNextMemberNo(String memberId) {
long s = System.currentTimeMillis();
int memberMaxNo = getMaxMemberNo();
int memberMaxNo = this.getMaxMemberNo();
if (-1 == memberMaxNo) {
// TODO: 2021/7/29 降级DB
throw new LiquidnetServiceException();
// if (RedisLockUtil.tryLock(LOCK_KEY_UMEMBER_NO, 1, 3)) {
// memberMaxNo = getMaxMemberNo();
// memberMaxNo = adamRdmService.getMaxMemberNo();
// if (-1 == memberMaxNo) {
// Query query = Query.query(Criteria.where("memberId").is(memberId)).with(Sort.by(Sort.Direction.DESC, "memberNo")).limit(1);
//
// AdamUserMemberVo latestMaxMemberNoVo = mongoTemplate.findOne(query, AdamUserMemberVo.class, AdamUserMemberVo.class.getSimpleName());
//
// if (null == latestMaxMemberNoVo) {
// AdamMemberVo memberVo = getMemberVoByMemberId(memberId);
//// Query query = Query.query(Criteria.where("memberId").is(memberId)).with(Sort.by(Sort.Direction.DESC, "memberNo")).limit(1);
////
//// AdamUserMemberVo latestMaxMemberNoVo = mongoTemplate.findOne(query, AdamUserMemberVo.class, AdamUserMemberVo.class.getSimpleName());
////
//// if (null == latestMaxMemberNoVo) {
// AdamMemberVo memberVo = adamRdmService.getMemberVoByMemberId(memberId);
//
// setMaxMemberNo(memberVo.getStartNo());
// } else {
// setMaxMemberNo(Integer.parseInt(latestMaxMemberNoVo.getMemberNo()));
// }
// adamRdmService.setMaxMemberNo(memberVo.getStartNo());
//// } else {
//// adamRdmService.setMaxMemberNo(Integer.parseInt(latestMaxMemberNoVo.getMemberNo()));
//// }
// }
// RedisLockUtil.unlock(LOCK_KEY_UMEMBER_NO);
// } else {
// return null;
// }
}
String nextMemberNoStr = String.valueOf(incrMemberNo());
if (Pattern.matches("([\\d])\\1{" + (nextMemberNoStr.length() - 1) + "}", nextMemberNoStr)) {
String nextMemberNoStr = String.valueOf(this.incrMemberNo());
while (Pattern.matches("([\\d])\\1{" + (nextMemberNoStr.length() - 1) + "}", nextMemberNoStr)) {
// 不能是完全相同的数字
nextMemberNoStr = String.valueOf(incrMemberNo());
nextMemberNoStr = String.valueOf(this.incrMemberNo());
}
log.debug("#MNO耗时:{}ms", System.currentTimeMillis() - s);
return nextMemberNoStr;
......@@ -104,23 +119,6 @@ public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMa
return null == o ? -1 : (int) o;
}
// public AdamMemberVo getMemberVoByMemberId(String memberId) {
// String key = AdamRedisConst.INFO_MEMBER_CATEGORY.concat(memberId);
// long s = System.currentTimeMillis();
// AdamMemberVo vo = (AdamMemberVo) redisUtil.get(key);
// if (null == vo) {
// s = System.currentTimeMillis();
// vo = mongoTemplate.findOne(
// Query.query(Criteria.where("memberId").is(memberId).and("state").is(1)),
// AdamMemberVo.class, AdamMemberVo.class.getSimpleName()
// );
// log.debug("#MDB耗时:{}ms", System.currentTimeMillis() - s);
// if (null != vo) redisUtil.set(key, vo);
// }
// log.debug("#RDM耗时:{}ms", System.currentTimeMillis() - s);
// return vo;
// }
public boolean setMaxMemberNo(int val) {
return redisUtil.set(AdamRedisConst.INCR_MEMBER_NO, val);
}
......@@ -128,8 +126,4 @@ public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMa
public int incrMemberNo() {
return (int) redisUtil.incr(AdamRedisConst.INCR_MEMBER_NO, 1);
}
public boolean setMemberCodeVoByCode(String memberCode, AdamMemberCodeVo vo) {
return redisUtil.set(AdamRedisConst.INFO_MEMBER_CODE.concat(memberCode), vo);
}
}
......@@ -5,20 +5,18 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberPriceAdminService;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.AdamMemberPriceParam;
import com.liquidnet.service.adam.dto.param.admin.AdamMemberPriceBuildParam;
import com.liquidnet.service.adam.dto.vo.AdamMemberPriceVo;
import com.liquidnet.service.adam.entity.AdamMember;
import com.liquidnet.service.adam.entity.AdamMemberPrice;
import com.liquidnet.service.adam.mapper.AdamMemberMapper;
import com.liquidnet.service.adam.mapper.AdamMemberPriceMapper;
import com.mongodb.client.result.UpdateResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
......@@ -28,66 +26,78 @@ import java.util.List;
@Service
public class AdamMemberPriceAdminServiceImpl extends ServiceImpl<AdamMemberPriceMapper, AdamMemberPrice> implements IAdamMemberPriceAdminService {
@Autowired
AdamMemberPriceMapper adamMemberPriceMapper;
private AdamMemberPriceMapper adamMemberPriceMapper;
@Autowired
MongoTemplate mongoTemplate;
private AdamMemberMapper adamMemberMapper;
@Autowired
RedisUtil redisUtil;
private RedisUtil redisUtil;
// public AdamMemberPriceVo add(AdamMemberPrice info) {
// List<AdamMemberPrice> existList = adamMemberPriceMapper.selectList(
// Wrappers.lambdaQuery(AdamMemberPrice.class).eq(AdamMemberPrice::getMemberId, info.getMemberId()));
// info.setMemberPriceId(CollectionUtils.isEmpty(existList) ? "101" : IDGenerator.nextSnowId().toString());
// info.setCreatedAt(LocalDateTime.now());
//
// adamMemberPriceMapper.insert(info);
//
// AdamMemberPriceVo vo = AdamMemberPriceVo.getNew().copy(info);
//
// redisUtil.set(AdamRedisConst.INFO_MEMBER_PRICE.concat(vo.getMemberPriceId()), vo);
//
// return vo;
// }
@Override
// @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public AdamMemberPriceVo add(AdamMemberPrice info) {
List<AdamMemberPrice> existList = adamMemberPriceMapper.selectList(
Wrappers.lambdaQuery(AdamMemberPrice.class).eq(AdamMemberPrice::getMemberId, info.getMemberId()));
info.setMemberPriceId(CollectionUtils.isEmpty(existList) ? "101" : IDGenerator.nextSnowId().toString());
info.setCreatedAt(LocalDateTime.now());
@Transactional
public boolean edit(AdamMemberPriceBuildParam param) {
String memberId = param.getMemberId(), memberPriceId = param.getMemberPriceId();
adamMemberPriceMapper.insert(info);
AdamMember updateInfo = new AdamMember();
updateInfo.setIntegralRate(param.getIntegralRate());
if (adamMemberMapper.update(updateInfo, Wrappers.lambdaUpdate(AdamMember.class)
.eq(AdamMember::getState, 1)
.eq(AdamMember::getMemberId, param.getMemberId())) > 0) {
LambdaQueryWrapper<AdamMemberPrice> queryWrapper = Wrappers.lambdaQuery(AdamMemberPrice.class)
// .eq(AdamMemberPrice::getMemberPriceId, memberPriceId)
.eq(AdamMemberPrice::getMemberId, memberId)
.eq(AdamMemberPrice::getState, 1);
List<AdamMemberPrice> memberPriceList = adamMemberPriceMapper.selectList(queryWrapper);
LocalDateTime nowTime = LocalDateTime.now();
boolean saveOrUpdateRst;
AdamMemberPrice saveOrUpdateInfo;
if (CollectionUtils.isEmpty(memberPriceList)) {
saveOrUpdateInfo = new AdamMemberPrice();
saveOrUpdateInfo.setMemberPriceId(memberId + "01");
saveOrUpdateInfo.setMemberId(memberId);
saveOrUpdateInfo.setState(1);
//saveOrUpdateInfo.setName();
saveOrUpdateInfo.setPrice(param.getPrice());
saveOrUpdateInfo.setPriceFixed(param.getPriceFixed());
saveOrUpdateInfo.setPriceSpecial(param.getPriceSpecial());
saveOrUpdateInfo.setDays(param.getDays());
//saveOrUpdateInfo.setDetail();
saveOrUpdateInfo.setCreatedAt(nowTime);
AdamMemberPriceVo vo = AdamMemberPriceVo.getNew().copy(info);
saveOrUpdateRst = adamMemberPriceMapper.insert(saveOrUpdateInfo) > 0;
} else {
saveOrUpdateInfo = new AdamMemberPrice();
saveOrUpdateInfo.setUpdatedAt(nowTime);
mongoTemplate.insert(vo, AdamMemberPriceVo.class.getSimpleName());
saveOrUpdateInfo.setPrice(param.getPrice());
saveOrUpdateInfo.setPriceFixed(param.getPriceFixed());
saveOrUpdateInfo.setPriceSpecial(param.getPriceSpecial());
saveOrUpdateInfo.setDays(param.getDays());
return vo;
}
@Override
// @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public boolean edit(AdamMemberPriceParam param) {
LocalDateTime now = LocalDateTime.now();
saveOrUpdateRst = adamMemberPriceMapper.update(saveOrUpdateInfo, queryWrapper) > 0;
AdamMemberPrice updateInfo = new AdamMemberPrice();
updateInfo.setState(param.getState());
updateInfo.setName(param.getName());
updateInfo.setPrice(param.getPrice());
updateInfo.setPriceFixed(param.getPriceFixed());
updateInfo.setDays(param.getDays());
updateInfo.setDetail(param.getDetail());
updateInfo.setUpdatedAt(now);
String memberId = param.getMemberId(), memberPriceId = param.getMemberPriceId();
LambdaQueryWrapper<AdamMemberPrice> queryWrapper = Wrappers.lambdaQuery(AdamMemberPrice.class)
.eq(AdamMemberPrice::getMemberPriceId, memberPriceId)
.eq(AdamMemberPrice::getMemberId, memberId);
if (adamMemberPriceMapper.update(updateInfo, queryWrapper) > 0) {
Update updateDoc = Update.update("state", updateInfo.getState())
.set("name", updateInfo.getName())
.set("price", updateInfo.getPrice())
.set("priceFixed", updateInfo.getPriceFixed())
.set("days", updateInfo.getDays())
.set("detail", updateInfo.getDetail())
.set("updatedAt", now);
UpdateResult updateResult = mongoTemplate.updateMulti(
Query.query(Criteria.where("memberPriceId").is(memberPriceId)),
updateDoc, AdamMemberPriceVo.class.getSimpleName()
);
// Document.parse(JsonUtils.toJson(updateInfo)).replace("updatedAt", now)
if (updateResult.getModifiedCount() > 0) {
redisUtil.del(AdamRedisConst.INFO_MEMBER_PRICE.concat(memberPriceId));
saveOrUpdateInfo = adamMemberPriceMapper.selectList(queryWrapper).get(0);
}
if (saveOrUpdateRst) {
AdamMemberPriceVo vo = AdamMemberPriceVo.getNew().copy(saveOrUpdateInfo);
redisUtil.set(AdamRedisConst.INFO_MEMBER_PRICE.concat(vo.getMemberPriceId()), vo);
return true;
}
return false;
throw new LiquidnetServiceException("-1", "会员价格编辑失败");
}
return false;
}
......
package com.liquidnet.client.admin.zhengzai.adam.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberRightsAdminService;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.adam.dto.param.admin.AdamMemberRightsBuildParam;
import com.liquidnet.service.adam.entity.AdamMemberRights;
import com.liquidnet.service.adam.mapper.AdamMemberRightsMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AdamMemberRightsAdminServiceImpl extends ServiceImpl<AdamMemberRightsMapper, AdamMemberRights> implements IAdamMemberRightsAdminService {
@Autowired
private AdamMemberRightsMapper adamMemberRightsMapper;
@Override
public boolean edit(AdamMemberRightsBuildParam param) {
String mrightsId = param.getMrightsId();
boolean saveOrUpadateRst;
AdamMemberRights saveOrUpdateInfo = new AdamMemberRights();
if (StringUtils.isEmpty(mrightsId)) {
saveOrUpdateInfo.setMrightsId(IDGenerator.nextBilliId());
saveOrUpdateInfo.setMemberId(param.getMemberId());
saveOrUpdateInfo.setState(1);
saveOrUpdateInfo.setSeqNo(param.getSeqNo());
saveOrUpdateInfo.setTitle(param.getTitle());
saveOrUpdateInfo.setSubTitle(param.getSubTitle());
saveOrUpdateInfo.setLabel(param.getLabel());
saveOrUpdateInfo.setCover(param.getCover());
saveOrUpdateInfo.setDetail(param.getDetail());
saveOrUpadateRst = adamMemberRightsMapper.insert(saveOrUpdateInfo) > 0;
} else {
LambdaUpdateWrapper<AdamMemberRights> updateWrapper = Wrappers.lambdaUpdate(AdamMemberRights.class).eq(AdamMemberRights::getState, 1)
.eq(AdamMemberRights::getMemberId, param.getMemberId())
.eq(AdamMemberRights::getMrightsId, param.getMrightsId());
saveOrUpdateInfo.setSeqNo(param.getSeqNo());
saveOrUpdateInfo.setTitle(param.getTitle());
saveOrUpdateInfo.setSubTitle(param.getSubTitle());
saveOrUpdateInfo.setLabel(param.getLabel());
saveOrUpdateInfo.setCover(param.getCover());
saveOrUpdateInfo.setDetail(param.getDetail());
saveOrUpadateRst = adamMemberRightsMapper.update(saveOrUpdateInfo, updateWrapper) > 0;
}
return saveOrUpadateRst;
}
}
......@@ -11,7 +11,7 @@ public class CandyCouponCodeExcelDto implements Serializable, Cloneable {
private static final long serialVersionUID = 2420844668059161869L;
@Excel(name = "券码")
private String ccode;
@Excel(name = "券码")
@Excel(name = "用户手机号")
private String redeemMobile;
@Excel(name = "状态")
private String state;
......
......@@ -12,7 +12,9 @@ import java.util.List;
public interface ICandyMgtCouponAdminService extends IService<CandyMgtCoupon> {
void saveMgtCouponInfo(CandyCoupon initCoupon, CandyMgtCoupon initMgtCoupon, List<CandyCouponRule> initCouponRuleList);
boolean saveMgtCouponInfo(CandyCoupon initCoupon, CandyMgtCoupon initMgtCoupon, List<CandyCouponRule> initCouponRuleList);
boolean updateMgtCouponInfo(CandyCoupon updateCoupon, CandyMgtCoupon updateMgtCoupon, List<CandyCouponRule> initCouponRuleList);
List<CandyMgtCouponInfoDto> listForMgtCouponInfoDto(CandyMgtCouponListParam listParam);
......
package com.liquidnet.client.admin.zhengzai.candy.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.client.admin.zhengzai.candy.service.ICandyCouponRuleAdminService;
import com.liquidnet.client.admin.zhengzai.candy.service.ICandyMgtCouponAdminService;
......@@ -31,15 +33,43 @@ public class CandyMgtCouponAdminServiceImpl extends ServiceImpl<CandyMgtCouponMa
@Override
@Transactional
public void saveMgtCouponInfo(CandyCoupon initCoupon, CandyMgtCoupon initMgtCoupon, List<CandyCouponRule> initCouponRuleList) {
int insert = candyCouponMapper.insert(initCoupon);
insert += candyMgtCouponMapper.insert(initMgtCoupon);
public boolean saveMgtCouponInfo(CandyCoupon initCoupon, CandyMgtCoupon initMgtCoupon, List<CandyCouponRule> initCouponRuleList) {
int insertCt = candyCouponMapper.insert(initCoupon);
insertCt += candyMgtCouponMapper.insert(initMgtCoupon);
boolean saveBatch = candyCouponRuleAdminService.saveBatch(initCouponRuleList);
if (insert < 2 || !saveBatch) {
if (insertCt < 2 || !saveBatch) {
throw new LiquidnetServiceException();
}
return true;
}
@Override
@Transactional
public boolean updateMgtCouponInfo(CandyCoupon updateCoupon, CandyMgtCoupon updateMgtCoupon, List<CandyCouponRule> initCouponRuleList) {
LambdaUpdateWrapper<CandyCoupon> couponLambdaUpdateWrapper = Wrappers.lambdaUpdate(CandyCoupon.class)
.eq(CandyCoupon::getCouponId, updateCoupon.getCouponId())
.eq(CandyCoupon::getState, 1)
.eq(CandyCoupon::getExclusive, 10);
int updateCt = candyCouponMapper.update(updateCoupon, couponLambdaUpdateWrapper);
LambdaUpdateWrapper<CandyMgtCoupon> mgtCouponLambdaUpdateWrapper = Wrappers.lambdaUpdate(CandyMgtCoupon.class)
.eq(CandyMgtCoupon::getMcouponId, updateMgtCoupon.getMcouponId())
.eq(CandyMgtCoupon::getState, 1);
updateCt += candyMgtCouponMapper.update(updateMgtCoupon, mgtCouponLambdaUpdateWrapper);
LambdaUpdateWrapper<CandyCouponRule> couponRuleLambdaUpdateWrapper = Wrappers.lambdaUpdate(CandyCouponRule.class)
.eq(CandyCouponRule::getCouponId, updateCoupon.getCouponId())
.eq(CandyCouponRule::getState, 1)
.set(CandyCouponRule::getState, 2);
candyCouponRuleAdminService.update(couponRuleLambdaUpdateWrapper);
if (updateCt < 2 || !candyCouponRuleAdminService.saveBatch(initCouponRuleList)) {
throw new LiquidnetServiceException();
}
return true;
}
@Override
......
......@@ -9,6 +9,7 @@ public class IDGenerator {
private static final String CROSS_BAR = "-";
private static final String EMPTY_STR = "";
private static final DateTimeFormatter MILLISECOND = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
private static final DateTimeFormatter BILLISECOND = DateTimeFormatter.ofPattern("yyDN");
public static String nextSnowId() {
return GenSnowFlowerUtil.next();
......@@ -22,6 +23,10 @@ public class IDGenerator {
return LocalDateTime.now().format(MILLISECOND);
}
public static String nextBilliId() {
return LocalDateTime.now().format(BILLISECOND);
}
public static String get32UUID() {
ThreadLocalRandom random = ThreadLocalRandom.current();
return (new UUID(random.nextLong(), random.nextLong())).toString().replace(CROSS_BAR, EMPTY_STR);
......@@ -69,6 +74,7 @@ public class IDGenerator {
System.out.println(""+IDGenerator.refundCode());
System.out.println("nextTimeId==="+IDGenerator.nextTimeId());
System.out.println("nextMilliId==="+IDGenerator.nextMilliId());
System.out.println("nextBilliId==="+IDGenerator.nextBilliId());
System.out.println("nextSnowId==="+IDGenerator.nextSnowId());
System.out.println("get32UUID==="+IDGenerator.get32UUID());
}
......
......@@ -37,9 +37,25 @@ public class AdamMemberCode {
*/
private String memberNo;
/**
* 状态 0-未使用 1-已使用 2-已过期
* 状态[0-可用|1-已用|2-无效|3-过期|4-失效|5-退回]
*/
private Integer state;
/**
* 有效期(单位天)
*/
private Integer validity;
/**
* 生效时间
*/
private LocalDateTime effectAt;
/**
* 过期时间
*/
private LocalDateTime expireAt;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
/**
* 购买会员码订单号
*/
......@@ -65,9 +81,5 @@ public class AdamMemberCode {
*/
private LocalDateTime useAt;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private String comment;
}
......@@ -5,5 +5,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.adam.entity.AdamMemberCode;
public interface AdamMemberCodeMapper extends BaseMapper<AdamMemberCode> {
String getMaxMemberNo(String memberId);
}
\ No newline at end of file
......@@ -35,7 +35,7 @@ public class CandyCouponCode implements Serializable {
private String couponId;
/**
* 状态[0-未使用|1-已使用|2-失效|3-退回]
* 状态[0-可用|1-已用|2-无效|3-过期|4-失效|5-退回]
*/
private Integer state;
......
......@@ -32,7 +32,7 @@ public class CandyMgtCoupon implements Serializable {
private String couponId;
/**
* 发放状态[0-未发放|1-已发放|2-无效|9-发放中|10-会员礼包专用模版]
* 发放状态[0-未发放|1-已发放|2-无效|9-发放中|10-会员礼包初始模版]
*/
private Integer state;
......
......@@ -311,7 +311,7 @@ create table adam_member_code
member_id varchar(64) comment '会员ID',
member_price_id varchar(64) comment '会员价格ID',
member_no varchar(20) comment '预留会员号',
state tinyint comment '0-未用,1-已用,2-不可用',
state tinyint comment '状态[0-可用|1-已用|2-无效|3-过期|4-失效|5-退回]',
created_at datetime(3),
updated_at datetime(3),
buy_order_no varchar(255) default null comment '购买会员码订单号',
......@@ -323,7 +323,7 @@ create table adam_member_code
comment text
) engine = InnoDB comment '会员兑换码';
create unique index uidx_amember_code_id on adam_member_code (code);
# create unique index uidx_amember_code_id on adam_member_code (code);
# MDB.idx:code,state
-- >>------------------------------------------------------------------------------------ |20210811用于会员改版前支持用户购买会员选礼包收货地址
drop table if exists adam_member_order_ext;
......@@ -353,6 +353,13 @@ alter table adam_member add integral_rate int default 0 null comment '积分倍
alter table adam_member_price modify price_fixed decimal(8, 2) null comment '购买价格';
alter table adam_member_price add price_special decimal(8, 2) null comment '特价:首次、首年优惠价' after price_fixed;
# 会员码表调整
alter table adam_member_code modify state tinyint null comment '状态[0-可用|1-已用|2-无效|3-过期|4-失效|5-退回]';
create index idx_amember_code_id on adam_member_code (code);
alter table adam_member_code add validity tinyint null comment '有效期(单位天)' after state;
alter table adam_member_code add effect_at datetime(3) null comment '生效时间' after validity;
alter table adam_member_code add expire_at datetime(3) null comment '过期时间' after effect_at;
# 订单
alter table adam_member_order modify state tinyint null comment '订单状态:0-未支付,1-已支付,2-已关闭,3-超时付,4-退款中,5-已退款';
alter table adam_member_order modify pay_no varchar(64) null comment '支付中心支付CODE';
......
......@@ -559,8 +559,8 @@ public class AdamRdmService {
return redisUtil.set(AdamRedisConst.INCR_MEMBER_NO, val);
}
public int incrMemberNo() {
return (int) redisUtil.incr(AdamRedisConst.INCR_MEMBER_NO, 1);
public long incrMemberNo() {
return redisUtil.incr(AdamRedisConst.INCR_MEMBER_NO, 1);
}
public int getMaxMemberNo() {
......
......@@ -43,7 +43,7 @@ public class AdamUserMemberServiceImpl implements IAdamUserMemberService {
// }
}
String nextMemberNoStr = String.valueOf(adamRdmService.incrMemberNo());
if (Pattern.matches("([\\d])\\1{" + (nextMemberNoStr.length() - 1) + "}", nextMemberNoStr)) {
while (Pattern.matches("([\\d])\\1{" + (nextMemberNoStr.length() - 1) + "}", nextMemberNoStr)) {
// 不能是完全相同的数字
nextMemberNoStr = String.valueOf(adamRdmService.incrMemberNo());
}
......
......@@ -8,7 +8,7 @@ create table candy_mgt_coupon
mid bigint unsigned auto_increment primary key,
mcoupon_id varchar(64) not null,
coupon_id varchar(64) not null comment '~candy_coupon.coupon_id',
state tinyint comment '发放状态[0-未发放|1-已发放|2-无效|9-发放中|10-会员礼包专用模版]',
state tinyint comment '发放状态[0-未发放|1-已发放|2-无效|9-发放中|10-会员礼包初始模版]',
# bind_type smallint comment '领取方式[0-用户输入兑换|1-发放至用户]',
event_amt int comment '发放量',
......@@ -22,7 +22,7 @@ create table candy_mgt_coupon
comment text
) engine InnoDB comment '券发放管理';
create unique index uidx_candy_mgt_coupon_id on candy_mgt_coupon (mcoupon_id);
create index idx_candy_mgt_coupon_id on candy_mgt_coupon (mcoupon_id);
# 券基础信息
......@@ -88,7 +88,7 @@ create table candy_coupon_code
mid bigint unsigned auto_increment primary key,
ccode varchar(64) not null comment '券码',
coupon_id varchar(64) not null comment '~candy_coupon.coupon_id',
state tinyint comment '状态[0-未使用|1-已使用|2-失效|3-退回]',
state tinyint comment '状态[0-可用|1-已用|2-无效|3-过期|4-失效|5-退回]',
redeem_uid varchar(64) comment '兑换用户UID',
redeem_mobile varchar(64) comment '兑换用户手机号',
......
......@@ -40,6 +40,7 @@ public class CandyMgtCouponTaskController {
public void issueCoupons() {
LambdaQueryWrapper<CandyMgtCoupon> queryWrapper = Wrappers.lambdaQuery(CandyMgtCoupon.class)
.eq(CandyMgtCoupon::getState, 0)
// TODO: 2021/8/26 时间判断
.orderByAsc(CandyMgtCoupon::getEventAt);
List<CandyMgtCoupon> list = platformCandyMgtCouponService.list(queryWrapper);
int taskSize = CollectionUtils.isEmpty(list) ? -1 : list.size();
......
......@@ -28,7 +28,6 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
......@@ -59,10 +58,10 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
redisUtil.set(couponInfoDtoKey, couponInfoDto);
LocalDateTime now = LocalDateTime.now();
Integer eventAmt = mgtCoupon.getEventAmt();
switch (coupon.getBindType()) {// 领取方式[0-用户输入兑换|1-发放至用户]
case 0:
List<CandyCouponCode> initCouponCodeList = new ArrayList<>();
Integer eventAmt = mgtCoupon.getEventAmt();
boolean batchFlag = eventAmt > 1000;
for (int i = 0; i < eventAmt; i++) {
CandyCouponCode couponCode = new CandyCouponCode();
......@@ -154,20 +153,23 @@ public class PlatformCandyCouponService extends ServiceImpl<CandyCouponMapper, C
case 2:
String eventLimit = mgtCoupon.getEventLimit();
String[] eventLimitArr = eventLimit.split(",");
log.info("发放券任务:eventLimitArrLength:{}", eventLimitArr.length);
for (String r : eventLimitArr) {
String uid = dmRdmService.getUidByMobile(r);
if (StringUtils.isNotEmpty(uid)) {
CandyUserCoupon userCoupon = new CandyUserCoupon();
userCoupon.setUcouponId(IDGenerator.get32UUID());
userCoupon.setMcouponId(mgtCoupon.getMcouponId());
userCoupon.setUid(uid);
userCoupon.setCouponId(coupon.getCouponId());
userCoupon.setState(1);
userCoupon.setBindAt(now);
initUserCouponList.add(userCoupon);
log.info("发放券任务:eventLimitArrLength:{}", eventLimitArr.length);
for (int i = 0; i < eventAmt; i++) {
for (String r : eventLimitArr) {
String uid = dmRdmService.getUidByMobile(r);
if (StringUtils.isNotEmpty(uid)) {
CandyUserCoupon userCoupon = new CandyUserCoupon();
userCoupon.setUcouponId(IDGenerator.get32UUID());
userCoupon.setMcouponId(mgtCoupon.getMcouponId());
userCoupon.setUid(uid);
userCoupon.setCouponId(coupon.getCouponId());
userCoupon.setState(1);
userCoupon.setBindAt(now);
initUserCouponList.add(userCoupon);
}
}
}
......
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