添加获取购物车中商品可用优惠券接口

This commit is contained in:
zhh
2018-08-29 17:08:16 +08:00
parent 201b405a08
commit 61a67c9aa9
16 changed files with 604 additions and 79 deletions

View File

@@ -0,0 +1,61 @@
package com.macro.mall.portal.controller;
import com.macro.mall.model.SmsCouponHistory;
import com.macro.mall.portal.domain.CartPromotionItem;
import com.macro.mall.portal.domain.CommonResult;
import com.macro.mall.portal.domain.SmsCouponHistoryDetail;
import com.macro.mall.portal.service.OmsCartItemService;
import com.macro.mall.portal.service.UmsMemberCouponService;
import com.macro.mall.portal.service.UmsMemberService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 用户优惠券管理Controller
* Created by macro on 2018/8/29.
*/
@Controller
@Api(tags = "UmsMemberCouponController", description = "用户优惠券管理")
@RequestMapping("/member/coupon")
public class UmsMemberCouponController {
@Autowired
private UmsMemberCouponService memberCouponService;
@Autowired
private OmsCartItemService cartItemService;
@Autowired
private UmsMemberService memberService;
@ApiOperation("领取指定优惠券")
@RequestMapping(value = "/add/{couponId}", method = RequestMethod.POST)
@ResponseBody
public Object add(@PathVariable Long couponId) {
return memberCouponService.add(couponId);
}
@ApiOperation("获取用户优惠券列表")
@ApiImplicitParam(name = "useStatus", value = "优惠券筛选类型:0->未使用1->已使用2->已过期",
allowableValues = "0,1,2", paramType = "query", dataType = "integer")
@RequestMapping(value = "/list", method = RequestMethod.GET)
@ResponseBody
public Object list(@RequestParam(value = "useStatus", required = false) Integer useStatus) {
List<SmsCouponHistory> couponHistoryList = memberCouponService.list(useStatus);
return new CommonResult().success(couponHistoryList);
}
@ApiOperation("获取登录会员购物车的相关优惠券")
@ApiImplicitParam(name = "type", value = "使用可用:0->不可用1->可用",
defaultValue = "1", allowableValues = "0,1", paramType = "query", dataType = "integer")
@RequestMapping(value = "/list/cart/{type}", method = RequestMethod.GET)
@ResponseBody
public Object listCart(@PathVariable Integer type) {
List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(memberService.getCurrentMember().getId());
List<SmsCouponHistoryDetail> couponHistoryList = memberCouponService.listCart(cartPromotionItemList, type);
return new CommonResult().success(couponHistoryList);
}
}

View File

@@ -0,0 +1,14 @@
package com.macro.mall.portal.dao;
import com.macro.mall.portal.domain.SmsCouponHistoryDetail;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 会员优惠券领取历史自定义Dao
* Created by macro on 2018/8/29.
*/
public interface SmsCouponHistoryDao {
List<SmsCouponHistoryDetail> getDetailList(@Param("memberId") Long memberId);
}

View File

@@ -0,0 +1,45 @@
package com.macro.mall.portal.domain;
import com.macro.mall.model.SmsCoupon;
import com.macro.mall.model.SmsCouponHistory;
import com.macro.mall.model.SmsCouponProductCategoryRelation;
import com.macro.mall.model.SmsCouponProductRelation;
import java.util.List;
/**
* 优惠券领取历史详情封装
* Created by macro on 2018/8/29.
*/
public class SmsCouponHistoryDetail extends SmsCouponHistory {
//相关优惠券信息
private SmsCoupon coupon;
//优惠券关联商品
private List<SmsCouponProductRelation> productRelationList;
//优惠券关联商品分类
private List<SmsCouponProductCategoryRelation> categoryRelationList;
public SmsCoupon getCoupon() {
return coupon;
}
public void setCoupon(SmsCoupon coupon) {
this.coupon = coupon;
}
public List<SmsCouponProductRelation> getProductRelationList() {
return productRelationList;
}
public void setProductRelationList(List<SmsCouponProductRelation> productRelationList) {
this.productRelationList = productRelationList;
}
public List<SmsCouponProductCategoryRelation> getCategoryRelationList() {
return categoryRelationList;
}
public void setCategoryRelationList(List<SmsCouponProductCategoryRelation> categoryRelationList) {
this.categoryRelationList = categoryRelationList;
}
}

View File

@@ -0,0 +1,32 @@
package com.macro.mall.portal.service;
import com.macro.mall.model.SmsCouponHistory;
import com.macro.mall.portal.domain.CartPromotionItem;
import com.macro.mall.portal.domain.CommonResult;
import com.macro.mall.portal.domain.SmsCouponHistoryDetail;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 用户优惠券管理Service
* Created by macro on 2018/8/29.
*/
public interface UmsMemberCouponService {
/**
* 会员添加优惠券
*/
@Transactional
CommonResult add(Long couponId);
/**
* 获取优惠券列表
* @param useStatus 优惠券的使用状态
*/
List<SmsCouponHistory> list(Integer useStatus);
/**
* 根据购物车信息获取可用优惠券
*/
List<SmsCouponHistoryDetail> listCart(List<CartPromotionItem> cartItemList, Integer type);
}

View File

@@ -0,0 +1,176 @@
package com.macro.mall.portal.service.impl;
import com.macro.mall.mapper.SmsCouponHistoryMapper;
import com.macro.mall.mapper.SmsCouponMapper;
import com.macro.mall.model.*;
import com.macro.mall.portal.dao.SmsCouponHistoryDao;
import com.macro.mall.portal.domain.CartPromotionItem;
import com.macro.mall.portal.domain.CommonResult;
import com.macro.mall.portal.domain.SmsCouponHistoryDetail;
import com.macro.mall.portal.service.UmsMemberCouponService;
import com.macro.mall.portal.service.UmsMemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 会员优惠券管理Service实现类
* Created by macro on 2018/8/29.
*/
@Service
public class UmsMemberCouponServiceImpl implements UmsMemberCouponService {
@Autowired
private UmsMemberService memberService;
@Autowired
private SmsCouponMapper couponMapper;
@Autowired
private SmsCouponHistoryMapper couponHistoryMapper;
@Autowired
private SmsCouponHistoryDao couponHistoryDao;
@Override
public CommonResult add(Long couponId) {
UmsMember currentMember = memberService.getCurrentMember();
//获取优惠券信息,判断数量
SmsCoupon coupon = couponMapper.selectByPrimaryKey(couponId);
if(coupon==null){
return new CommonResult().failed("优惠券不存在");
}
if(coupon.getCount()<=0){
return new CommonResult().failed("优惠券已经领完了");
}
Date now = new Date();
if(now.before(coupon.getEnableTime())){
return new CommonResult().failed("优惠券还没到领取时间");
}
//判断用户领取的优惠券数量是否超过限制
SmsCouponHistoryExample couponHistoryExample = new SmsCouponHistoryExample();
couponHistoryExample.createCriteria().andCouponIdEqualTo(couponId).andMemberIdEqualTo(currentMember.getId());
int count = couponHistoryMapper.countByExample(couponHistoryExample);
if(count>=coupon.getPerLimit()){
return new CommonResult().failed("您已经领取过该优惠券");
}
//生成领取优惠券历史
SmsCouponHistory couponHistory = new SmsCouponHistory();
couponHistory.setCouponId(couponId);
couponHistory.setCouponCode(coupon.getCode());
couponHistory.setCreateTime(now);
couponHistory.setMemberId(currentMember.getId());
couponHistory.setMemberNickname(currentMember.getNickname());
//主动领取
couponHistory.setGetType(1);
//未使用
couponHistory.setUseStatus(0);
couponHistoryMapper.insert(couponHistory);
//修改优惠券表的数量、领取数量
coupon.setCount(coupon.getCount()-1);
coupon.setReceiveCount(coupon.getReceiveCount()==null?1:coupon.getReceiveCount()+1);
couponMapper.updateByPrimaryKey(coupon);
return new CommonResult().success("领取成功",null);
}
@Override
public List<SmsCouponHistory> list(Integer useStatus) {
UmsMember currentMember = memberService.getCurrentMember();
SmsCouponHistoryExample couponHistoryExample=new SmsCouponHistoryExample();
SmsCouponHistoryExample.Criteria criteria = couponHistoryExample.createCriteria();
criteria.andMemberIdEqualTo(currentMember.getId());
if(useStatus!=null){
criteria.andUseStatusEqualTo(useStatus);
}
return couponHistoryMapper.selectByExample(couponHistoryExample);
}
@Override
public List<SmsCouponHistoryDetail> listCart(List<CartPromotionItem> cartItemList, Integer type) {
UmsMember currentMember = memberService.getCurrentMember();
Date now = new Date();
//获取该用户所有优惠券
List<SmsCouponHistoryDetail> allList = couponHistoryDao.getDetailList(currentMember.getId());
//根据优惠券使用类型来判断优惠券是否可用
List<SmsCouponHistoryDetail> enableList = new ArrayList<>();
List<SmsCouponHistoryDetail> disableList = new ArrayList<>();
for (SmsCouponHistoryDetail couponHistoryDetail : allList) {
Integer useType = couponHistoryDetail.getCoupon().getUseType();
BigDecimal minPoint = couponHistoryDetail.getCoupon().getMinPoint();
Date endTime = couponHistoryDetail.getCoupon().getEndTime();
if(useType.equals(0)){
//0->全场通用
//判断是否满足优惠起点
//计算购物车商品的总价
BigDecimal totalAmount = calcTotalAmount(cartItemList);
if(now.before(endTime)&&totalAmount.subtract(minPoint).intValue()>=0){
enableList.add(couponHistoryDetail);
}else{
disableList.add(couponHistoryDetail);
}
}else if(useType.equals(1)){
//1->指定分类
//计算指定分类商品的总价
List<Long> productCategoryIds = new ArrayList<>();
for (SmsCouponProductCategoryRelation categoryRelation : couponHistoryDetail.getCategoryRelationList()) {
productCategoryIds.add(categoryRelation.getProductCategoryId());
}
BigDecimal totalAmount = calcTotalAmountByproductCategoryId(cartItemList,productCategoryIds);
if(now.before(endTime)&&totalAmount.intValue()>0&&totalAmount.subtract(minPoint).intValue()>=0){
enableList.add(couponHistoryDetail);
}else{
disableList.add(couponHistoryDetail);
}
}else if(useType.equals(2)){
//2->指定商品
//计算指定商品的总价
List<Long> productIds = new ArrayList<>();
for (SmsCouponProductRelation productRelation : couponHistoryDetail.getProductRelationList()) {
productIds.add(productRelation.getProductId());
}
BigDecimal totalAmount = calcTotalAmountByProductId(cartItemList,productIds);
if(now.before(endTime)&&totalAmount.intValue()>0&&totalAmount.subtract(minPoint).intValue()>=0){
enableList.add(couponHistoryDetail);
}else{
disableList.add(couponHistoryDetail);
}
}
}
if(type.equals(1)){
return enableList;
}else{
return disableList;
}
}
private BigDecimal calcTotalAmount(List<CartPromotionItem> cartItemList) {
BigDecimal total = new BigDecimal("0");
for (CartPromotionItem item : cartItemList) {
BigDecimal realPrice = item.getPrice().subtract(item.getReduceAmount());
total=total.add(realPrice.multiply(new BigDecimal(item.getQuantity())));
}
return total;
}
private BigDecimal calcTotalAmountByproductCategoryId(List<CartPromotionItem> cartItemList,List<Long> productCategoryIds) {
BigDecimal total = new BigDecimal("0");
for (CartPromotionItem item : cartItemList) {
if(productCategoryIds.contains(item.getProductCategoryId())){
BigDecimal realPrice = item.getPrice().subtract(item.getReduceAmount());
total=total.add(realPrice.multiply(new BigDecimal(item.getQuantity())));
}
}
return total;
}
private BigDecimal calcTotalAmountByProductId(List<CartPromotionItem> cartItemList,List<Long> productIds) {
BigDecimal total = new BigDecimal("0");
for (CartPromotionItem item : cartItemList) {
if(productIds.contains(item.getProductId())){
BigDecimal realPrice = item.getPrice().subtract(item.getReduceAmount());
total=total.add(realPrice.multiply(new BigDecimal(item.getQuantity())));
}
}
return total;
}
}

View File

@@ -0,0 +1,35 @@
<?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.macro.mall.portal.dao.SmsCouponHistoryDao">
<resultMap id="couponHistoryDetailMap" type="com.macro.mall.portal.domain.SmsCouponHistoryDetail"
extends="com.macro.mall.mapper.SmsCouponHistoryMapper.BaseResultMap">
<association property="coupon" resultMap="com.macro.mall.mapper.SmsCouponMapper.BaseResultMap" columnPrefix="c_">
</association>
<collection property="productRelationList" columnPrefix="cpr_" resultMap="com.macro.mall.mapper.SmsCouponProductRelationMapper.BaseResultMap">
</collection>
<collection property="categoryRelationList" columnPrefix="cpcr_" resultMap="com.macro.mall.mapper.SmsCouponProductCategoryRelationMapper.BaseResultMap">
</collection>
</resultMap>
<select id="getDetailList" resultMap="couponHistoryDetailMap">
SELECT
ch.*,
c.id c_id,
c.name c_name,
c.amount c_amount,
c.min_point c_min_point,
c.platform c_platform,
c.start_time c_start_time,
c.end_time c_end_time,
c.note c_note,
c.use_type c_use_type,
c.type c_type,
cpr.id cpr_id,cpr.product_id cpr_product_id,
cpcr.id cpcr_id,cpcr.product_category_id cpcr_product_category_id
FROM
sms_coupon_history ch
LEFT JOIN sms_coupon c ON ch.coupon_id = c.id
LEFT JOIN sms_coupon_product_relation cpr ON cpr.coupon_id = c.id
LEFT JOIN sms_coupon_product_category_relation cpcr ON cpcr.coupon_id = c.id
WHERE ch.member_id = #{memberId}
</select>
</mapper>