package com.matrix.system.shopXcx.api.service.impl; import com.matrix.system.hive.bean.SysVipInfo; import com.matrix.system.common.init.UserCacheManager; import com.matrix.core.pojo.AjaxResult; import com.matrix.core.pojo.PaginationVO; import com.matrix.core.tools.LogUtil; import com.matrix.core.tools.StringUtils; import com.matrix.system.common.constance.AppConstance; import com.matrix.system.shopXcx.api.pojo.OrderCouponGroup; import com.matrix.system.shopXcx.api.pojo.OrderItemDto; import com.matrix.system.shopXcx.api.service.WxShopCouponService; import com.matrix.system.shopXcx.api.tools.WxShopCouponUtil; import com.matrix.system.shopXcx.api.tools.WxShopOrderUtil; import com.matrix.system.shopXcx.api.vo.CouponReceiveInfoVO; import com.matrix.system.shopXcx.bean.*; import com.matrix.system.shopXcx.dao.*; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; /** * @author jyy * @description 优惠券服务层 * @date 2019-06-10 10:58 */ @Service public class WxShopCouponServiceImpl implements WxShopCouponService { @Autowired private WxShopOrderUtil wxShopOrderUtil; @Autowired private UserCacheManager userCacheManager; @Autowired private ShopCouponDao shopCouponDao; @Autowired private ShopCouponRecordDao shopCouponRecordDao; @Autowired private ShopProductAttrRefDao shopProductAttrRefDao; @Autowired private ShopReceiveAddressDao shopReceiveAddressDao; @Autowired private WxShopCouponUtil wxShopCouponUtil; @Autowired private ShopProductDao productDao; /** * 根据购物车选中的产品,计算合适的优惠券 * * @return */ public List getCartVoCouponList(Long companyId,List OrderItemDtos){ //可用优惠券列表 List shopCoupons = new ArrayList<>(); SysVipInfo sysVipInfo = userCacheManager.getLoginUser(); //1.找到用户所有的优惠券 List userAllCoupon = shopCouponRecordDao.selectMyCouponByStatus(companyId, sysVipInfo.getId(), AppConstance.MY_COUPON_NOT_USE, null); if (CollectionUtils.isNotEmpty(userAllCoupon)) { //根据优惠力度排序,优惠力度大的先参与计算 Collections.sort(userAllCoupon, new Comparator() { @Override public int compare(Object o1, Object o2) { CouponReceiveInfoVO e1 = (CouponReceiveInfoVO) o1; CouponReceiveInfoVO e2 = (CouponReceiveInfoVO) o2; return e2.getMinAmount().compareTo(e1.getMinAmount()); } }); //定义购物车优惠分组 List cartList = new ArrayList<>(); // 记录所有优惠券,一个优惠券(活动)表示一组 Map shopCouponMap = new HashMap<>(); //2.把用户的优惠券和产品进行匹配匹配成功后分组, for (int i = 0; i < userAllCoupon.size(); i++) { CouponReceiveInfoVO couponReceiveInfoVO = userAllCoupon.get(i); OrderCouponGroup shopCarVo = new OrderCouponGroup(); shopCarVo.setCouponReceiveInfoVO(couponReceiveInfoVO); shopCarVo.setOrderItemDtos(new ArrayList<>()); cartList.add(i, shopCarVo); for (OrderItemDto orderItemDto : OrderItemDtos) { // 如果匹配到的产品已经出现在其他优惠组中,则需要判断是否移除之前的组 boolean needRemove = false; //找到产品所有的优惠券 List productShopCoupons = getCouponListByProductId(orderItemDto.getProductId()); for (ShopCoupon productShopCoupon : productShopCoupons) { if (couponReceiveInfoVO.getCouponId().equals(productShopCoupon.getId())) { LogUtil.debug("购物车" + orderItemDto.getProductId() + "和优惠券" + couponReceiveInfoVO.getcName() + "匹配"); shopCarVo.getOrderItemDtos().add(orderItemDto); break; } } } // 计算本组优惠券是否已经满足优惠条件 countPrice(shopCarVo); } //3.计算各组的金额是否满足,把满足的优惠券全部返回 for (OrderCouponGroup orderCouponGroup : cartList) { if (orderCouponGroup.isSatisfactionCoupon() && CollectionUtils.isNotEmpty(orderCouponGroup.getOrderItemDtos())) { shopCoupons.add(orderCouponGroup.getCouponReceiveInfoVO()); } } } return shopCoupons; } private void countPrice(OrderCouponGroup orderCouponGroup) { List orderItemDtoList = orderCouponGroup.getOrderItemDtos(); // 计算总价 BigDecimal sum = BigDecimal.ZERO; for (OrderItemDto orderItemDto : orderItemDtoList) { sum = sum.add(orderItemDto.getShopSku().getPrice().multiply(BigDecimal.valueOf(orderItemDto.getCount()))); } // 存在优惠券 if (sum.compareTo(orderCouponGroup.getCouponReceiveInfoVO().getMinAmount()) >= 0) { //标记为合理分组 orderCouponGroup.setSatisfactionCoupon(true); } else { orderCouponGroup.setSatisfactionCoupon(false); } } /** * 获取可用优惠券 * * @return */ @Override public AjaxResult getUsableCoupon(PaginationVO pageVo) { SysVipInfo sysVipInfo = userCacheManager.getLoginUser(); boolean newPeople = wxShopCouponUtil.verifyIsNewPeople(sysVipInfo.getId()); List list = shopCouponDao.selectUsableCoupon(newPeople, sysVipInfo.getOpenId(), pageVo); return new AjaxResult(AjaxResult.STATUS_SUCCESS, list); } /** * * * @param couponId * @return */ @Transactional(rollbackFor = Exception.class) @Override public AjaxResult receiveCoupon(Integer couponId) { ShopCoupon shopCoupon = shopCouponDao.selectById(couponId); SysVipInfo sysVipInfo = userCacheManager.getLoginUser(); // 如果没有找到该优惠券 if (shopCoupon == null) { return new AjaxResult(AjaxResult.STATUS_FAIL, "没有找到该优惠券!"); } // 如果优惠券有数量限制并且已经领完 if (shopCoupon.getMaxQuantity() >= 0 && (shopCoupon.getMaxQuantity() <= shopCoupon.getQuantityReceive())) { return new AjaxResult(AjaxResult.STATUS_FAIL, "优惠券已领完!"); } boolean newPeople = wxShopCouponUtil.verifyIsNewPeople(sysVipInfo.getId()); // 如果改券是新人专属且当前用户不是新人 if (AppConstance.COUPON_GET_LIMT_NEW.equals(shopCoupon.getGetLimit()) && !newPeople) { return new AjaxResult(AjaxResult.STATUS_FAIL, "该优惠券为新人专享优惠券!"); } ShopCouponRecord param = new ShopCouponRecord(); param.setUserId(sysVipInfo.getId()); param.setCId(couponId); List recordList = shopCouponRecordDao.selectByModel(param); // 如果已经领取改优惠券 if (CollectionUtils.isNotEmpty(recordList)) { return new AjaxResult(AjaxResult.STATUS_FAIL, "优惠券不能重复领取!"); } ShopCouponRecord insertRecord = new ShopCouponRecord(); insertRecord.setCreateBy(AppConstance.SYSTEM_USER); insertRecord.setUpdateBy(AppConstance.SYSTEM_USER); insertRecord.setCId(couponId); insertRecord.setUserId(sysVipInfo.getId()); insertRecord.setIsUsing(2); int i = shopCouponRecordDao.insert(insertRecord); // 如果插入领取记录表失败 if (i < 0) { return new AjaxResult(AjaxResult.STATUS_FAIL, "优惠券领取失败!"); } shopCoupon.setQuantityReceive(shopCoupon.getQuantityReceive() + 1); shopCouponDao.updateByModel(shopCoupon); return new AjaxResult(AjaxResult.STATUS_SUCCESS, "优惠券领取成功!"); } /** * 根据订单状态查询优惠券列表 * * * @param companyId * @param status 1=已使用;2=未使用;3=过期 * @return */ @Override public AjaxResult getMyCouponInfoByStatus(Long companyId, Integer status, PaginationVO pageVo) { SysVipInfo sysVipInfo = userCacheManager.getLoginUser(); // 如果查询使用或未使用状态的优惠券列表 if (AppConstance.MY_COUPON_USE.equals(status) || AppConstance.MY_COUPON_NOT_USE.equals(status)) { List list = shopCouponRecordDao.selectMyCouponByStatus(companyId,sysVipInfo.getId(), status, pageVo); return new AjaxResult(AjaxResult.STATUS_SUCCESS, list); } List list = shopCouponRecordDao.selectMyPastCoupon(companyId,sysVipInfo.getId(), pageVo); return new AjaxResult(AjaxResult.STATUS_SUCCESS, list); } /** * 根据产品ID获取可用优惠券列表 * * @param productId * @return */ @Override public List getCouponListByProductId(Integer productId) { ShopProductAttrRef refParam = new ShopProductAttrRef(); refParam.setPId(productId); List refList = shopProductAttrRefDao.selectByModel(refParam); List attrIds = new ArrayList<>(); if (CollectionUtils.isNotEmpty(refList)) { for (ShopProductAttrRef shopProductAttrRef : refList) { if (shopProductAttrRef.getAttrFullPath() == null) { continue; } List ids = StringUtils.strToCollToString(shopProductAttrRef.getAttrFullPath(), "/"); for (int j = ids.size() - 1; j >= 0; j--) { if (StringUtils.isBlank(ids.get(j))) { ids.remove(j); } } attrIds.addAll(ids); } } SysVipInfo sysVipInfo = userCacheManager.getLoginUser(); List list = shopCouponDao.selectUsableCouponByProductInfo(sysVipInfo.getOpenId(), productId, attrIds); return list; } /** * 根据产品ID获取可用活动券列表 * * @param productId * @return */ @Override public List getHdListByProductId(Integer productId) { ShopProductAttrRef refParam = new ShopProductAttrRef(); refParam.setPId(productId); List refList = shopProductAttrRefDao.selectByModel(refParam); List attrIds = new ArrayList<>(); if (CollectionUtils.isNotEmpty(refList)) { for (ShopProductAttrRef shopProductAttrRef : refList) { if (shopProductAttrRef.getAttrFullPath() == null) { continue; } List ids = StringUtils.strToCollToString(shopProductAttrRef.getAttrFullPath(), "/"); for (int j = ids.size() - 1; j >= 0; j--) { if (StringUtils.isBlank(ids.get(j))) { ids.remove(j); } } attrIds.addAll(ids); } } ShopProduct shopProduct = productDao.selectById(productId); List list = shopCouponDao.selectHdListByProductId(productId, attrIds,shopProduct.getCompanyId()); return list; } /** * 通过优惠券标签获取优惠券列表 * * @param tag 标签名称 * @return */ @Override public AjaxResult getCouponListByTag(String tag, Long companyId) { SysVipInfo sysVipInfo = userCacheManager.getLoginUser(); boolean newPeople = wxShopCouponUtil.verifyIsNewPeople(sysVipInfo.getId()); List couponList = shopCouponDao.selectCouponListByTag(newPeople, sysVipInfo.getOpenId(), tag,companyId); AjaxResult res = new AjaxResult(AjaxResult.STATUS_SUCCESS, couponList); res.putInMap("isNewPeople", newPeople); return res; } }