| @@ -16,10 +16,7 @@ import org.apache.commons.lang3.StringUtils; | |||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | |||||
| import org.springframework.web.bind.annotation.ModelAttribute; | |||||
| import org.springframework.web.bind.annotation.RequestMapping; | |||||
| import org.springframework.web.bind.annotation.RestController; | |||||
| import org.springframework.web.bind.annotation.*; | |||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| @@ -137,4 +134,31 @@ public class WxCouponOrderController extends BaseController { | |||||
| return wxCouponOrderService.cardDetailCUserVo(getUserId(), couponOrderId); | return wxCouponOrderService.cardDetailCUserVo(getUserId(), couponOrderId); | ||||
| } | } | ||||
| @ApiOperation(value = "卡转赠领取") | |||||
| @PostMapping("cardAccept") | |||||
| public ResultData cardAccept(@ModelAttribute WxCouponOrder wxCouponOrder) { | |||||
| //coupon_order_id判断 | |||||
| Long id = wxCouponOrder.getId(); | |||||
| if (id == null) { | |||||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); | |||||
| } | |||||
| //转赠人判断 | |||||
| if (wxCouponOrder.getCUserId() == null) { | |||||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); | |||||
| } | |||||
| //当前领取人 | |||||
| wxCouponOrder.setOwnerId(getUserId()); | |||||
| //转赠者与当前领取人是否为同一个 | |||||
| if (wxCouponOrder.getCUserId().equals(wxCouponOrder.getOwnerId())) { | |||||
| logger.info("转赠人与卡所有者相同"); | |||||
| return new ResultData(ErrorCode.CARD_TRANSFER_INVALID.getCode(), "转赠人与卡所有者相同"); | |||||
| } | |||||
| return wxCouponOrderService.cardAccept(wxCouponOrder); | |||||
| } | |||||
| } | } | ||||
| @@ -166,6 +166,8 @@ public enum ErrorCode{ | |||||
| CARD_IS_NOT_FOUND(9001, "优惠卡不存在"), | CARD_IS_NOT_FOUND(9001, "优惠卡不存在"), | ||||
| CARD_REMAIN_AMOUNT_IS_NOT_ENOUGH(9002, "优惠卡余额不足"), | CARD_REMAIN_AMOUNT_IS_NOT_ENOUGH(9002, "优惠卡余额不足"), | ||||
| CARD_IS_NOT_COST(9003, "优惠卡未消费,退款请用卡券退款,钱直接退回购买人手里"), | CARD_IS_NOT_COST(9003, "优惠卡未消费,退款请用卡券退款,钱直接退回购买人手里"), | ||||
| CARD_TRANSFERED(9004, "消费卡已被转赠"), | |||||
| CARD_TRANSFER_INVALID(9005, "消费卡转赠已失效"), | |||||
| /** | /** | ||||
| * 卡消费 | * 卡消费 | ||||
| @@ -0,0 +1,155 @@ | |||||
| package com.iformall.domain.po; | |||||
| import javax.persistence.Id; | |||||
| import javax.persistence.Table; | |||||
| import javax.persistence.Transient; | |||||
| import java.io.Serializable; | |||||
| import java.util.Date; | |||||
| import java.util.List; | |||||
| @Table(name = "wx_card_transfer_info") | |||||
| public class WxCardTransferInfo implements Serializable { | |||||
| private static final long serialVersionUID = 1L; | |||||
| @Id | |||||
| protected Long id; | |||||
| @Transient | |||||
| protected List<Long> ids; | |||||
| @Transient | |||||
| protected String sortColumns; | |||||
| public Long getId() { | |||||
| return id; | |||||
| } | |||||
| public void setId(Long id) { | |||||
| this.id = id; | |||||
| } | |||||
| public String getSortColumns() { | |||||
| return sortColumns; | |||||
| } | |||||
| public List<Long> getIds() { | |||||
| return ids; | |||||
| } | |||||
| public void setIds(List<Long> ids) { | |||||
| this.ids = ids; | |||||
| } | |||||
| //保存到转赠表中 id,coupon_order_id,tenant_id,title,amount,remain_amount,from_user,to_user,status,create_date,update_date | |||||
| @io.swagger.annotations.ApiModelProperty(value = "卡与订单关联ID", name = "couponOrderId") | |||||
| private Long couponOrderId; | |||||
| @io.swagger.annotations.ApiModelProperty(value = "租户ID", name = "tenantId") | |||||
| private String tenantId; | |||||
| @io.swagger.annotations.ApiModelProperty(value = "卡名称", name = "title") | |||||
| private String title; | |||||
| @io.swagger.annotations.ApiModelProperty(value = "面额", name = "amount") | |||||
| private Integer amount; | |||||
| @io.swagger.annotations.ApiModelProperty(value = "余额", name = "remainAmount") | |||||
| private Integer remainAmount; | |||||
| @io.swagger.annotations.ApiModelProperty(value = "转赠者", name = "fromUser") | |||||
| private Long fromUser; | |||||
| @io.swagger.annotations.ApiModelProperty(value = "领取者", name = "toUser") | |||||
| private Long toUser; | |||||
| @io.swagger.annotations.ApiModelProperty(value = "状态", name = "status") | |||||
| private Integer status; | |||||
| @io.swagger.annotations.ApiModelProperty(value = "创建时间", name = "createDate") | |||||
| private Date createDate; | |||||
| @io.swagger.annotations.ApiModelProperty(value = "创建时间", name = "updateDate") | |||||
| private Date updateDate; | |||||
| public Long getCouponOrderId() { | |||||
| return couponOrderId; | |||||
| } | |||||
| public void setCouponOrderId(Long couponOrderId) { | |||||
| this.couponOrderId = couponOrderId; | |||||
| } | |||||
| public String getTenantId() { | |||||
| return tenantId; | |||||
| } | |||||
| public void setTenantId(String tenantId) { | |||||
| this.tenantId = tenantId; | |||||
| } | |||||
| public String getTitle() { | |||||
| return title; | |||||
| } | |||||
| public void setTitle(String title) { | |||||
| this.title = title; | |||||
| } | |||||
| public Integer getAmount() { | |||||
| return amount; | |||||
| } | |||||
| public void setAmount(Integer amount) { | |||||
| this.amount = amount; | |||||
| } | |||||
| public Integer getRemainAmount() { | |||||
| return remainAmount; | |||||
| } | |||||
| public void setRemainAmount(Integer remainAmount) { | |||||
| this.remainAmount = remainAmount; | |||||
| } | |||||
| public Long getFromUser() { | |||||
| return fromUser; | |||||
| } | |||||
| public void setFromUser(Long fromUser) { | |||||
| this.fromUser = fromUser; | |||||
| } | |||||
| public Long getToUser() { | |||||
| return toUser; | |||||
| } | |||||
| public void setToUser(Long toUser) { | |||||
| this.toUser = toUser; | |||||
| } | |||||
| public Integer getStatus() { | |||||
| return status; | |||||
| } | |||||
| public void setStatus(Integer status) { | |||||
| this.status = status; | |||||
| } | |||||
| public Date getCreateDate() { | |||||
| return createDate; | |||||
| } | |||||
| public void setCreateDate(Date createDate) { | |||||
| this.createDate = createDate; | |||||
| } | |||||
| public Date getUpdateDate() { | |||||
| return updateDate; | |||||
| } | |||||
| public void setUpdateDate(Date updateDate) { | |||||
| this.updateDate = updateDate; | |||||
| } | |||||
| } | |||||
| @@ -13,7 +13,8 @@ public enum EnumCouponOrderStatus { | |||||
| CARD_USING(4, "使用中"), | CARD_USING(4, "使用中"), | ||||
| CARD_OVER_TIME(5, "已过期"), | CARD_OVER_TIME(5, "已过期"), | ||||
| CARD_COMPLETE(6, "已用完"), | CARD_COMPLETE(6, "已用完"), | ||||
| CARD_RETURNED(7, "已线下退款") | |||||
| CARD_RETURNED(7, "已线下退款"), | |||||
| CARD_TRANSFER(8, "已转赠") | |||||
| ; | ; | ||||
| public static EnumCouponOrderStatus getEnum(Integer code) { | public static EnumCouponOrderStatus getEnum(Integer code) { | ||||
| @@ -0,0 +1,9 @@ | |||||
| package com.iformall.mapper; | |||||
| import com.iformall.common.CommonMapper; | |||||
| import com.iformall.domain.po.WxCardTransferInfo; | |||||
| public interface WxCardTransferInfoMapper extends CommonMapper<WxCardTransferInfo, Long> { | |||||
| } | |||||
| @@ -4,14 +4,15 @@ import com.github.pagehelper.PageInfo; | |||||
| import com.iformall.common.ResultData; | import com.iformall.common.ResultData; | ||||
| import com.iformall.domain.po.WxCouponOrder; | import com.iformall.domain.po.WxCouponOrder; | ||||
| import com.iformall.domain.po.WxMerchantBUser; | import com.iformall.domain.po.WxMerchantBUser; | ||||
| import com.iformall.domain.po.WxOrder; | |||||
| import com.iformall.domain.vo.*; | |||||
| import java.util.Date; | |||||
| import java.util.List; | |||||
| import com.iformall.domain.vo.CUserDateAmountVo; | |||||
| import com.iformall.domain.vo.WxCardCVo; | |||||
| import com.iformall.domain.vo.WxCouponOrderBVo; | |||||
| import com.iformall.domain.vo.WxCouponOrderCarCVo; | |||||
| import javax.servlet.http.HttpServletRequest; | import javax.servlet.http.HttpServletRequest; | ||||
| import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
| import java.util.Date; | |||||
| import java.util.List; | |||||
| public interface WxCouponOrderService { | public interface WxCouponOrderService { | ||||
| @@ -178,4 +179,7 @@ public interface WxCouponOrderService { | |||||
| * @param ownerId C端用户 | * @param ownerId C端用户 | ||||
| */ | */ | ||||
| ResultData cardDetailCUserVo(Long ownerId, String couponOrderId); | ResultData cardDetailCUserVo(Long ownerId, String couponOrderId); | ||||
| ResultData cardAccept(WxCouponOrder wxCouponOrder); | |||||
| } | } | ||||
| @@ -11,6 +11,7 @@ import com.github.pagehelper.PageInfo; | |||||
| import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | ||||
| import com.iformall.common.ErrorCode; | import com.iformall.common.ErrorCode; | ||||
| import com.iformall.common.IdWorker; | import com.iformall.common.IdWorker; | ||||
| import com.iformall.common.Result; | |||||
| import com.iformall.common.ResultData; | import com.iformall.common.ResultData; | ||||
| import com.iformall.domain.dto.WxSharingOrderDto; | import com.iformall.domain.dto.WxSharingOrderDto; | ||||
| import com.iformall.domain.po.*; | import com.iformall.domain.po.*; | ||||
| @@ -90,6 +91,12 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| @Autowired | @Autowired | ||||
| WxPayAccountMapper wxPayAccountMapper; | WxPayAccountMapper wxPayAccountMapper; | ||||
| @Autowired | |||||
| WxCardInfoMapper wxCardInfoMapper; | |||||
| @Autowired | |||||
| WxCardTransferInfoMapper wxCardTransferInfoMapper; | |||||
| @Override | @Override | ||||
| public PageInfo<WxCouponOrder> listAsPage(WxCouponOrder record, Integer pageIndex, Integer pageSize) { | public PageInfo<WxCouponOrder> listAsPage(WxCouponOrder record, Integer pageIndex, Integer pageSize) { | ||||
| return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findList(record)); | return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findList(record)); | ||||
| @@ -686,4 +693,70 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| return new ResultData(cardCVo); | return new ResultData(cardCVo); | ||||
| } | } | ||||
| @Transactional(rollbackFor = Exception.class) | |||||
| @Override | |||||
| public ResultData cardAccept(WxCouponOrder record) { | |||||
| //卡券是否存在 | |||||
| WxCardCVo cardCVo = wxCouponOrderMapper.findCardDetailOfCUser(record.getId()); | |||||
| if (cardCVo == null) { | |||||
| logger.info("卡券不存在" + record.getId()); | |||||
| return new ResultData(ErrorCode.COUPON_ORDER_IS_NULL); | |||||
| } | |||||
| //转赠人是否存在 | |||||
| Long cUserId = record.getCUserId(); | |||||
| WxCUser wxCuser = wxCUserMapper.selectByPrimaryKey(cUserId); | |||||
| if (wxCuser == null) { | |||||
| logger.info("转赠人不存在:" + cUserId); | |||||
| return new ResultData(ErrorCode.USER_IS_EMPTY.getCode(), "转赠人不存在"); | |||||
| } | |||||
| //判断转赠人与目前卡所有者是否为同一个 | |||||
| //数据表中当前卡所有者 | |||||
| Long ownerId = cardCVo.getOwnerId(); | |||||
| if (!ownerId.equals(cUserId)) { | |||||
| logger.info("转赠人与目前卡所有者不相同," + "转赠人:" + cUserId + ",当前所有者:" + ownerId); | |||||
| return new ResultData(ErrorCode.CARD_TRANSFERED); | |||||
| } | |||||
| //判断卡是否已消费 | |||||
| //面额与余额是否相同 | |||||
| if (!cardCVo.getAmount().equals(cardCVo.getRemainingAmount())) { | |||||
| logger.info("面额与余额不相同"); | |||||
| return new ResultData(ErrorCode.CARD_TRANSFER_INVALID); | |||||
| } | |||||
| //保存到转赠表中 id,coupon_order_id,tenant_id,title,amount,remain_amount,from_user,to_user,status,create_date,update_date | |||||
| try { | |||||
| saveCardTransfer(record, cardCVo); | |||||
| } catch (Exception e) { | |||||
| logger.info("保存卡转赠信息失败"); | |||||
| throw new MallinkException(ErrorCode.CARD_TRANSFER_INVALID); | |||||
| } | |||||
| //更新卡拥有者 | |||||
| try { | |||||
| wxCouponOrderMapper.updateByPrimaryKeySelective(record); | |||||
| } catch (Exception e) { | |||||
| logger.info("更新卡拥有者信息失败"); | |||||
| throw new MallinkException(ErrorCode.CARD_TRANSFER_INVALID); | |||||
| } | |||||
| return new ResultData(Result.SUCCESS, "领取成功"); | |||||
| } | |||||
| public void saveCardTransfer(WxCouponOrder couponOrder, WxCardCVo cardCVo) { | |||||
| logger.info("保存卡转赠信息"); | |||||
| WxCardTransferInfo wxCardTransferInfo = new WxCardTransferInfo(); | |||||
| final IdWorker idWorker = IdWorker.get(); | |||||
| wxCardTransferInfo.setId(idWorker.nextId()); | |||||
| wxCardTransferInfo.setTenantId(cardCVo.getTenantId()); | |||||
| wxCardTransferInfo.setCouponOrderId(couponOrder.getId()); | |||||
| wxCardTransferInfo.setFromUser(couponOrder.getCUserId()); | |||||
| wxCardTransferInfo.setToUser(couponOrder.getOwnerId()); | |||||
| wxCardTransferInfo.setAmount(cardCVo.getAmount()); | |||||
| wxCardTransferInfo.setRemainAmount(cardCVo.getRemainingAmount()); | |||||
| wxCardTransferInfo.setStatus(EnumCouponOrderStatus.CARD_TRANSFER.getCode()); | |||||
| wxCardTransferInfo.setTitle(cardCVo.getTitle()); | |||||
| Date date = new Date(); | |||||
| wxCardTransferInfo.setCreateDate(date); | |||||
| wxCardTransferInfo.setUpdateDate(date); | |||||
| wxCardTransferInfoMapper.insertSelective(wxCardTransferInfo); | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,5 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||||
| <mapper namespace="com.iformall.mapper.WxCardTransferInfoMapper"> | |||||
| </mapper> | |||||
| @@ -659,11 +659,29 @@ | |||||
| <sql id="allCUserCardDetailColumns"> | <sql id="allCUserCardDetailColumns"> | ||||
| co.id,co.tenant_id,co.coupon_id,co.coupon_type,co.c_user_id,co.owner_id,co.b_user_id,co.order_id,co.expired_time,co.coupon_order_status,co.create_date,co.update_date,co.coupon_price, | co.id,co.tenant_id,co.coupon_id,co.coupon_type,co.c_user_id,co.owner_id,co.b_user_id,co.order_id,co.expired_time,co.coupon_order_status,co.create_date,co.update_date,co.coupon_price, | ||||
| c.cover_img,c.title,c.sub_title,c.sale_price,c.price,c.unit,c.detail,c.remark, | c.cover_img,c.title,c.sub_title,c.sale_price,c.price,c.unit,c.detail,c.remark, | ||||
| a.amount,a.remaining_amount | |||||
| a.amount,a.remaining_amount,c.support_transfer | |||||
| </sql> | </sql> | ||||
| <select id="findCardListOfCUser" parameterType="com.iformall.domain.vo.WxCardCVo" resultMap="CCardVoResultMap"> | <select id="findCardListOfCUser" parameterType="com.iformall.domain.vo.WxCardCVo" resultMap="CCardVoResultMap"> | ||||
| select id,tenant_id,coupon_id,coupon_type,expired_time,coupon_order_status,create_date,update_date, | |||||
| cover_img,title,sub_title,detail,unit,remark,amount,remaining_amount,support_transfer | |||||
| from wx_card_transfer_info where 1=1 | |||||
| <if test="tenantId != null"> | |||||
| and tenant_id = #{tenantId} | |||||
| </if> | |||||
| <if test="ownerId != null"> | |||||
| and from_user = #{ownerId} | |||||
| </if> | |||||
| <choose> | |||||
| <when test="couponOrderStatus != null"> | |||||
| co.coupon_order_status = #{couponOrderStatus} | |||||
| </when> | |||||
| <otherwise> | |||||
| co.coupon_order_status=8 | |||||
| </otherwise> | |||||
| </choose> | |||||
| union | |||||
| select <include refid="allCUserCardListColumns" /> | select <include refid="allCUserCardListColumns" /> | ||||
| from wx_coupon_order co | from wx_coupon_order co | ||||
| inner join wx_coupon c on co.coupon_id = c.id | inner join wx_coupon c on co.coupon_id = c.id | ||||