diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponPasswordController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponPasswordController.java index 98fdf1c3e..526387c58 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponPasswordController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponPasswordController.java @@ -78,6 +78,19 @@ public class WxCouponPasswordController extends BaseController { } return new ResultData(); } + + @ApiOperation("批次卡密分页列表接口") + @GetMapping("/batchVoList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData batchList(@ModelAttribute WxCouponPassword wxCouponPassword, Integer pageNum, Integer pageSize) { + wxCouponPassword.updateTenantInfo(getTenantInfo()); + + wxCouponPassword.setSortColumns(BaseEntity.SortField.CreateDate_DESC, BaseEntity.SortField.Id_DESC); + final PageInfo page = wxCouponPasswordService.listAsPage(wxCouponPassword, pageNum, pageSize); + return new ResultData(page); + } } diff --git a/mallinkAdmin/src/main/resources/db/migration/V2023022800001__card.sql b/mallinkAdmin/src/main/resources/db/migration/V2023022800001__card.sql index 36dfe5633..28b4cccc9 100644 --- a/mallinkAdmin/src/main/resources/db/migration/V2023022800001__card.sql +++ b/mallinkAdmin/src/main/resources/db/migration/V2023022800001__card.sql @@ -1,3 +1,11 @@ alter table wx_card_info add column coupon_password varchar(50) comment '卡密'; +alter table wx_card_info add column c_user_id bigint(20) comment '用户编码'; + +###待做####### +##coupon_password_id,coupon_password,c_user_id 刷数据 +# 转赠验证wx_coupon_order的c_user_id不变 + + +alter table wx_card_info add column status int(1) not null default 0 comment '状态'; diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxCardInfo.java b/mallinkService/src/main/java/com/iformall/domain/po/WxCardInfo.java index 3801b5f1e..4d0a2232f 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxCardInfo.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxCardInfo.java @@ -24,14 +24,18 @@ public class WxCardInfo extends TenantEntity { protected Long id; @io.swagger.annotations.ApiModelProperty(value="卡密编码",name="couponPasswordId") protected Long couponPasswordId; - @io.swagger.annotations.ApiModelProperty(value="卡密",name="couponPassword") - protected String couponPassword; @TableField(exist = false) protected Long couponPasswordIdLike; + @TableField(exist = false) + protected List couponPasswordIdList; + @io.swagger.annotations.ApiModelProperty(value="卡密",name="couponPassword") + protected String couponPassword; @io.swagger.annotations.ApiModelProperty(value="卡类型EnumCardInfoType",name="type") protected Integer type; @io.swagger.annotations.ApiModelProperty(value = "券ID", name = "couponId") private Long couponId; + @io.swagger.annotations.ApiModelProperty(value = "用户ID", name = "cUserId") + private Long cUserId; @io.swagger.annotations.ApiModelProperty(value="微信订单号-购买类储值卡时的订单号",name="transactionId") private String transactionId; @io.swagger.annotations.ApiModelProperty(value="面额总金额",name="amount") @@ -63,6 +67,8 @@ public class WxCardInfo extends TenantEntity { private Date updateDate; @io.swagger.annotations.ApiModelProperty(value = "是否支持转送(0:不支持,1支持)", name = "supportTransfer") private Integer supportTransfer; + @io.swagger.annotations.ApiModelProperty(value = "状态EnumCardInfoStatus", name = "status") + private Integer status; @TableField(exist = false) @io.swagger.annotations.ApiModelProperty(value="查询-开始时间",name="startdate") protected Date startdate; diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxCardCVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxCardCVo.java index 75668349b..219b2c3ce 100644 --- a/mallinkService/src/main/java/com/iformall/domain/vo/WxCardCVo.java +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxCardCVo.java @@ -2,6 +2,7 @@ package com.iformall.domain.vo; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.iformall.domain.po.WxCardInfo; import com.iformall.domain.po.WxCouponOrder; import lombok.Data; import lombok.EqualsAndHashCode; @@ -58,6 +59,8 @@ public class WxCardCVo extends WxCouponOrder { @TableField(exist = false) protected String statusStr; + + private WxCardInfo wxCardInfo; } diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxCouponPasswordVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxCouponPasswordVo.java new file mode 100644 index 000000000..a7d0990c5 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxCouponPasswordVo.java @@ -0,0 +1,59 @@ +package com.iformall.domain.vo; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.iformall.domain.po.WxCouponOrder; +import com.iformall.domain.po.base.TenantEntity; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.util.Date; +import java.util.List; +@JsonIgnoreProperties(value = {"handler"}) +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class WxCouponPasswordVo extends TenantEntity { + + private static final long serialVersionUID = 6687954932922444531L; + + @Excel(name = "卡号", width = 20, orderNum = "1", prefix = "`") + protected Long id; + @Excel(name = "卡密", width = 20, orderNum = "2", prefix = "`") + @io.swagger.annotations.ApiModelProperty(value = "卡密", name = "couponPassword") + private String couponPassword; + @Excel(name = "创建时间", width = 20, exportFormat = "yyyy-MM-dd HH:mm:ss", orderNum = "3") + @io.swagger.annotations.ApiModelProperty(value = "", name = "createDate") + private Date createDate; + @Excel(name = "卡密状态", width = 20, orderNum = "4", replace = {"初始化_0", "消息发送中_1", "消息已发送_2", "已兑换_3","已作废_4"},prefix = "`") + @io.swagger.annotations.ApiModelProperty(value = "卡密状态", name = "remainPrice") + private Integer status; + @Excel(name = "卡激活状态", width = 20, orderNum = "5",replace = {"未激活_0", "已激活_1"}, prefix = "`") + @io.swagger.annotations.ApiModelProperty(value = "卡激活状态EnumYesOrNo", name = "used") + private Integer used; + @Excel(name = "激活时间", width = 20, exportFormat = "yyyy-MM-dd HH:mm:ss", orderNum = "6") + @io.swagger.annotations.ApiModelProperty(value = "", name = "activeDate") + private Date activeDate; + @Excel(name = "激活手机号", width = 20, orderNum = "7", prefix = "`") + @io.swagger.annotations.ApiModelProperty(value = "激活手机号", name = "phone") + private String phone; + @Excel(name = "激活会员", width = 20, orderNum = "8", prefix = "`") + @io.swagger.annotations.ApiModelProperty(value = "激活会员", name = "userName") + private String userName; + @Excel(name = "面额(元)", width = 20, orderNum = "9", prefix = "`") + @io.swagger.annotations.ApiModelProperty(value = "面额(元)", name = "price") + private Double price; + @Excel(name = "余额(元)", width = 20, orderNum = "10", prefix = "`") + @io.swagger.annotations.ApiModelProperty(value = "余额(元)", name = "remainPrice") + private Double remainPrice; + @Excel(name = "激活卡状态", width = 20, orderNum = "11",replace = {"正常_0", "已禁用_1"}, prefix = "`") + @io.swagger.annotations.ApiModelProperty(value = "激活卡状态EnumYesOrNo", name = "used") + private Integer cardStatus; + +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCardInfoStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumCardInfoStatus.java new file mode 100644 index 000000000..1bbfc4f5b --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumCardInfoStatus.java @@ -0,0 +1,36 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2019/09/17. + */ +public enum EnumCardInfoStatus { + + + NORMAL(0, "正常"), + STOP(1, "已禁用"); + + public static EnumCardInfoStatus getEnum(Integer code) { + for (EnumCardInfoStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumCardInfoStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordStatus.java index 867dd7bce..5aa3cdea3 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordStatus.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordStatus.java @@ -10,8 +10,7 @@ public enum EnumCouponPasswordStatus { MSG_SENDING(1, "消息发送中"), MSG_SENDED(2, "消息已发送"), USED(3, "已兑换"), - CANCEL(4, "已作废"), - PAID(5, "已支付过"),; + CANCEL(4, "已作废"); public static EnumCouponPasswordStatus getEnum(Integer code) { for (EnumCouponPasswordStatus value : values()) { diff --git a/mallinkService/src/main/java/com/iformall/service/WxCouponPasswordService.java b/mallinkService/src/main/java/com/iformall/service/WxCouponPasswordService.java index 6e99efbb3..1fc52b559 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxCouponPasswordService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxCouponPasswordService.java @@ -4,6 +4,7 @@ import com.github.pagehelper.PageInfo; import com.iformall.domain.po.WxCouponPassword; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.vo.WxCouponPasswordCountInfoVO; +import com.iformall.domain.vo.WxCouponPasswordVo; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -21,6 +22,8 @@ public interface WxCouponPasswordService { */ PageInfo listAsPage(WxCouponPassword record, Integer pageIndex, Integer pageSize); + PageInfo listVoAsPage(WxCouponPassword record, Integer pageIndex, Integer pageSize); + /** * 根据Id获得实体 * diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java index 5afe63030..d2728a249 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java @@ -2482,6 +2482,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { cvo.setRemainingAmount(cardInfo.getRemainingAmount()); cvo.setSupportTransfer(cardInfo.getSupportTransfer()); } + cvo.setWxCardInfo(cardInfo); return cvo; } catch (IllegalAccessException | InvocationTargetException e) { logger.error("getCouponOrderCardCVo error.",e); @@ -2521,15 +2522,18 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { //卡券是否存在 WxCardCVo cardCVo = findCardDetailOfCUser(record.getId(),record.getTenantId()); if (cardCVo == null) { - logger.info("卡券不存在" + record.getId()); return new ResultData(ErrorCode.COUPON_ORDER_IS_NULL); } + WxCardInfo cardInfo = cardCVo.getWxCardInfo(); + if (null == cardInfo) { + return new ResultData(ErrorCode.COUPON_ORDER_IS_NULL.getCode(),"cardInfo未查询到"); + } + //转赠人是否存在 Long cUserId = record.getCUserId(); WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoMapper.selectById(cUserId,cardCVo.getFinalTenantId()); if (wxCUserBasicInfo == null) { - logger.info("转赠人不存在:" + cUserId); return new ResultData(ErrorCode.USER_IS_EMPTY.getCode(), "转赠人不存在"); } @@ -2560,9 +2564,13 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { } //更新卡拥有者 try { - record.setCUserId(null); record.setUpdateDate(new Date()); wxCouponOrderMapper.updateById(record); + + cardInfo.setCUserId(record.getOwnerId()); + cardInfo.setUpdateDate(new Date()); + wxCardInfoMapper.updateById(cardInfo); + } catch (Exception e) { logger.info("更新卡拥有者信息失败"); throw new MallinkException(ErrorCode.CARD_TRANSFER_INVALID); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java index 74896cedc..46270d045 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java @@ -3,25 +3,49 @@ package com.iformall.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.IdWorker; +import com.iformall.domain.po.WxCUserBasicInfo; +import com.iformall.domain.po.WxCardInfo; +import com.iformall.domain.po.WxCoupon; +import com.iformall.domain.po.WxCouponOrder; import com.iformall.domain.po.WxCouponPassword; +import com.iformall.domain.po.WxMall; +import com.iformall.domain.po.WxMerchant; +import com.iformall.domain.po.WxMerchantBUser; import com.iformall.domain.po.base.TenantEntity; +import com.iformall.enums.EnumCouponOrderStatus; import com.iformall.enums.EnumCouponPasswordStatus; +import com.iformall.enums.EnumYesOrNo; +import com.iformall.domain.vo.WxCouponOrderBVo; import com.iformall.domain.vo.WxCouponPasswordCountInfoVO; +import com.iformall.domain.vo.WxCouponPasswordVo; +import com.iformall.domain.vo.WxMerchantProductVo; import com.iformall.common.ErrorCode; import com.iformall.exception.MallinkException; +import com.iformall.mapper.WxCardInfoMapper; import com.iformall.mapper.WxCouponPasswordMapper; import com.iformall.service.ExcelService; +import com.iformall.service.WxCUserBasicInfoService; import com.iformall.service.WxCouponPasswordService; + +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + +import java.lang.reflect.InvocationTargetException; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Random; @Service @@ -30,6 +54,11 @@ public class WxCouponPasswordServiceImpl implements WxCouponPasswordService { @Autowired WxCouponPasswordMapper wxCouponPasswordMapper; + @Autowired + WxCardInfoMapper wxCardInfoMapper; + @Lazy + @Autowired + WxCUserBasicInfoService wxCUserBasicInfoService; @Autowired ExcelService excelService; @@ -38,6 +67,92 @@ public class WxCouponPasswordServiceImpl implements WxCouponPasswordService { public PageInfo listAsPage(WxCouponPassword record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponPasswordMapper.findList(record)); } + + @Override + public PageInfo listVoAsPage(WxCouponPassword record, Integer pageIndex, Integer pageSize) { + PageInfo passwordPage = listAsPage(record,pageIndex,pageSize); + PageInfo retPageInfo = new PageInfo(); + retPageInfo.setPageNum(pageIndex); + retPageInfo.setPageSize(pageSize); + retPageInfo.setPages(passwordPage.getPages()); + retPageInfo.setTotal(passwordPage.getTotal()); + retPageInfo.setList(handleQueryResult(passwordPage.getList(), record)); + return retPageInfo; + } + + private List handleQueryResult(List list,TenantEntity tenantEntity) { + if (null != list && list.size() > 0) { + List couponPasswordIdList = new ArrayList(); + for (int i = 0 ; i < list.size() ; i ++ ) { + WxCouponPassword bo = list.get(i); + if (null != bo.getId() && (!couponPasswordIdList.contains(bo.getId()))) { + couponPasswordIdList.add(bo.getId()); + } + } + + List cUserIdList = new ArrayList(); + Map passwordCardInfoMap = new HashMap(); + if (couponPasswordIdList.size() > 0 ) { + WxCardInfo cardInfoQ = new WxCardInfo(); + cardInfoQ.updateTenantInfo(tenantEntity); + cardInfoQ.setCouponPasswordIdList(couponPasswordIdList); + List cardList = wxCardInfoMapper.findList(cardInfoQ); + if (null != cardList && cardList.size() > 0) { + for (int i = 0 ; i < cardList.size(); i++) { + WxCardInfo ci = cardList.get(i); + passwordCardInfoMap.put(ci.getCouponPasswordId(), ci); + if (null != ci.getCUserId() && (!cUserIdList.contains(ci.getCUserId()))) { + cUserIdList.add(ci.getCUserId()); + } + + } + } + } + + Map cUserMap = new HashMap(); + if (cUserIdList.size() > 0) { + WxCUserBasicInfo cUserBasicInfoQ = new WxCUserBasicInfo(); + cUserBasicInfoQ.setIds(cUserIdList); + cUserBasicInfoQ.setFinalTenantId(tenantEntity.getFinalTenantId()); + List cuserList = wxCUserBasicInfoService.listPhoneAndNameByIds(cUserBasicInfoQ); + if (null != cuserList) { + for (int i = 0 ; i < cuserList.size() ; i++) { + WxCUserBasicInfo cbi = cuserList.get(i); + cUserMap.put(cbi.getId(), cbi); + } + } + } + + List retList = new ArrayList(); + for (int i = 0 ; i < list.size() ; i ++) { + WxCouponPassword coo = list.get(i); + WxCouponPasswordVo co = new WxCouponPasswordVo(); + WxCardInfo cardInfo = passwordCardInfoMap.get(coo.getId()); + co.setId(coo.getId()); + co.setCouponPassword(coo.getPassword()); + if (null != cardInfo) { + co.setUsed(EnumYesOrNo.YES.getCode()); + co.setPrice(new BigDecimal(cardInfo.getAmount()).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); + co.setRemainPrice(new BigDecimal(cardInfo.getRateAmount()).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); + co.setActiveDate(cardInfo.getCreateDate()); + WxCUserBasicInfo basicInfo = cUserMap.get(cardInfo.getCUserId()); + if (null != basicInfo) { + co.setPhone(basicInfo.getPhone()); + co.setUserName(basicInfo.getName()); + } + co.setCardStatus(cardInfo.getStatus()); + }else { + co.setUsed(EnumYesOrNo.NO.getCode()); + } + co.setStatus(coo.getStatus()); + co.setCreateDate(coo.getCreateDate()); + retList.add(co); + } + return retList; + } + return new ArrayList(); + + } @Override public WxCouponPassword getById(Long id) { diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index ab998be30..9113629d6 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -1456,7 +1456,8 @@ public class WxOrderServiceImpl implements WxOrderService { cardInfo.setAmount(coupon.getPrice()); cardInfo.setSaleAmount(coupon.getSalePrice()); cardInfo.setCouponPasswordId(couponPassWord.getId()); - cardInfo.setCouponPassword(couponPassWord.getPassword()); + cardInfo.setCouponPassword(couponPassWord.getPassword()); + cardInfo.setCUserId(user.getId()); cardInfo.setRemainingAmount(coupon.getPrice()); if (!coupon.checkIsFree()) { //判断该transctionId是否已经存在,如果存在,则不添加 @@ -1501,7 +1502,6 @@ public class WxOrderServiceImpl implements WxOrderService { cardInfo.setCreateDate(curr); cardInfo.setUpdateDate(curr); cardInfo.setSupportTransfer(coupon.getSupportTransfer()); - //检查卡是否下架,如果是,不可转赠 WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId(),order.getTenantId()); if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { diff --git a/mallinkService/src/main/resources/mapper/WxCardInfoMapper.xml b/mallinkService/src/main/resources/mapper/WxCardInfoMapper.xml index 58655d0aa..3a1512a88 100644 --- a/mallinkService/src/main/resources/mapper/WxCardInfoMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCardInfoMapper.xml @@ -6,6 +6,7 @@ + @@ -22,25 +23,25 @@ - `id`,`tenant_id`,`parent_tenant_id`,`coupon_id`,`coupon_password_id`,`coupon_password`,`transaction_id`, + `id`,`tenant_id`,`parent_tenant_id`,`coupon_id`,`c_user_id`,`coupon_password_id`,`coupon_password`,`transaction_id`, `amount`,`sale_amount`,`remaining_amount`,`service_fee_amount`,`share_fee_amount`,`remaining_share_fee_amount`, `rate_amount`,`create_date`,`update_date`,`support_transfer` - where 1 = 1 + where `tenant_id` = #{tenantId} and `id` = #{id} - - and `tenant_id` = #{tenantId} - and `parent_tenant_id` = #{parentTenantId} and `coupon_id` = #{couponId} + + and `c_user_id` = #{cUserId} + and `transaction_id` = #{transactionId} @@ -83,6 +84,12 @@ and `create_date` between #{startdate} and #{enddate} + + and coupon_password_id in + + #{cpidItem} + + and coupon_id in