package com.hai.service.impl; import com.alibaba.fastjson.JSON; import com.alicp.jetcache.anno.CacheType; import com.alicp.jetcache.anno.Cached; import com.alibaba.fastjson.JSONObject; import com.hai.common.exception.ErrorCode; import com.hai.common.exception.ErrorHelp; import com.hai.common.exception.SysCode; import com.hai.dao.HighCouponHandselMapper; import com.hai.dao.HighCouponMapper; import com.hai.entity.*; import com.hai.model.HighCouponHandselModel; import com.hai.model.HighCouponModel; import com.hai.service.*; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; /** * @Auther: 胡锐 * @Description: * @Date: 2021/3/11 22:07 */ @Service("highCouponService") public class HighCouponServiceImpl implements HighCouponService { @Resource private HighCouponMapper highCouponMapper; @Resource private HighCouponService highCouponService; @Resource private HighCouponHandselService highCouponHandselService; @Resource private HighGoodsPriceReferService highGoodsPriceReferService; @Resource private HighCouponCodeService highCouponCodeService; @Resource private HighMerchantService highMerchantService; @Resource private HighOrderService highOrderService; @Resource private HighApproveService highApproveService; @Autowired private RedisTemplate redisTemplate; @Resource private HighAgentService highAgentService; @Resource private HighCouponAgentService highCouponAgentService; @Override @Transactional(propagation= Propagation.REQUIRES_NEW) public void insertCoupon(HighCoupon highCouponModel) { highCouponMapper.insert(highCouponModel); // 增加赠送卡卷 if (highCouponModel.getHandselCouponList() != null && highCouponModel.getHandselCouponList().size() > 0) { for (HighCouponHandselModel handsel : highCouponModel.getHandselCouponList()) { handsel.setCouponId(highCouponModel.getId()); highCouponHandselService.insertCouponHandsel(handsel); } } HighGoodsPriceRefer salePrice = new HighGoodsPriceRefer(); salePrice.setObjectType(1); salePrice.setObjectId(highCouponModel.getId()); salePrice.setPriceType(1); // 价格类型 1:原价 2:折扣价 salePrice.setOldSalePrice(highCouponModel.getSalesPrice()); salePrice.setNewSalePrice(highCouponModel.getSalesPrice()); salePrice.setPromptlyType(true); salePrice.setEffectiveTime(new Date()); salePrice.setRemark("【创建产品】初始原价价格"); salePrice.setStatus(1); // 状态: 0:删除 1:待编辑 2:未生效 3:已生效 4:已失效 101.审批中 102.审批驳回 salePrice.setCreateTime(new Date()); salePrice.setOperatorId(highCouponModel.getOperatorId()); salePrice.setOperatorName(highCouponModel.getOperatorName()); highGoodsPriceReferService.insertPriceRefer(salePrice); HighGoodsPriceRefer discountPrice = new HighGoodsPriceRefer(); discountPrice.setObjectType(1); discountPrice.setObjectId(highCouponModel.getId()); discountPrice.setPriceType(2); // 价格类型 1:原价 2:折扣价 discountPrice.setOldSalePrice(highCouponModel.getDiscountPrice()); discountPrice.setNewSalePrice(highCouponModel.getDiscountPrice()); discountPrice.setPromptlyType(true); discountPrice.setEffectiveTime(new Date()); discountPrice.setRemark("【创建产品】初始折扣价格"); discountPrice.setStatus(1); // 状态: 0:删除 1:待编辑 2:未生效 3:已生效 4:已失效 101.审批中 102.审批驳回 discountPrice.setCreateTime(new Date()); discountPrice.setOperatorId(highCouponModel.getOperatorId()); discountPrice.setOperatorName(highCouponModel.getOperatorName()); highGoodsPriceReferService.insertPriceRefer(discountPrice); } @Override @Transactional(propagation= Propagation.REQUIRES_NEW) public void updateCoupon(HighCoupon highCouponModel) { highCouponMapper.updateByPrimaryKey(highCouponModel); // 赠送卡卷 if (highCouponModel.getHandselCouponList() != null && highCouponModel.getHandselCouponList().size() > 0) { for (HighCouponHandselModel handsel : highCouponModel.getHandselCouponList()) { // 状态标记为删除的,进行删除操作 if (handsel.getStatus() == 0) { highCouponHandselService.updateCouponHandsel(handsel); } // id为空的,进行增加操作 if (handsel.getId() == null) { handsel.setCouponId(highCouponModel.getId()); highCouponHandselService.insertCouponHandsel(handsel); } } } HighCoupon coupon = getCouponById(highCouponModel.getId()); // 如果卡卷销售价格进行了修改 if (!coupon.getSalesPrice().equals(highCouponModel.getSalesPrice())) { // 所有价格失效 highGoodsPriceReferService.couponAllSalesPriceInvalid(highCouponModel.getId()); // 增加新销售价格 HighGoodsPriceRefer salePrice = new HighGoodsPriceRefer(); salePrice.setObjectType(1); salePrice.setObjectId(highCouponModel.getId()); salePrice.setPriceType(1); // 价格类型 1:原价 2:折扣价 salePrice.setOldSalePrice(coupon.getSalesPrice()); salePrice.setNewSalePrice(highCouponModel.getSalesPrice()); salePrice.setPromptlyType(true); salePrice.setEffectiveTime(new Date()); salePrice.setRemark("【修改产品】初始原价价格"); salePrice.setStatus(1); // 状态: 0:删除 1:待编辑 2:未生效 3:已生效 4:已失效 101.审批中 102.审批驳回 salePrice.setCreateTime(new Date()); salePrice.setOperatorId(highCouponModel.getOperatorId()); salePrice.setOperatorName(highCouponModel.getOperatorName()); highGoodsPriceReferService.insertPriceRefer(salePrice); } if (!coupon.getDiscountPrice().equals(highCouponModel.getDiscountPrice())) { // 所有价格失效 highGoodsPriceReferService.couponAllDiscountPriceInvalid(highCouponModel.getId()); // 增加新价格 HighGoodsPriceRefer salePrice = new HighGoodsPriceRefer(); salePrice.setObjectType(1); salePrice.setObjectId(highCouponModel.getId()); salePrice.setPriceType(2); // 价格类型 1:原价 2:折扣价 salePrice.setOldSalePrice(coupon.getDiscountPrice()); salePrice.setNewSalePrice(highCouponModel.getDiscountPrice()); salePrice.setPromptlyType(true); salePrice.setEffectiveTime(new Date()); salePrice.setRemark("【修改产品】初始折扣价格"); salePrice.setStatus(1); // 状态: 0:删除 1:待编辑 2:未生效 3:已生效 4:已失效 101.审批中 102.审批驳回 salePrice.setCreateTime(new Date()); salePrice.setOperatorId(highCouponModel.getOperatorId()); salePrice.setOperatorName(highCouponModel.getOperatorName()); highGoodsPriceReferService.insertPriceRefer(salePrice); } } @Override public void update(HighCoupon highCoupon) { highCouponMapper.updateByPrimaryKey(highCoupon); } @Override @Transactional(propagation= Propagation.REQUIRES_NEW) public void upShelfApprove(Long id) { // 查询卡卷 HighCoupon coupon = getCouponById(id); if (coupon == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_FOUND_COUPON, ""); } coupon.setStatus(101); // 状态:0.删除 1.编辑中 2.已上架 3.已下架 101.上架审批中 102.上架审批驳回 coupon.setUpdateTime(new Date()); update(coupon); } @Override @Transactional(propagation= Propagation.REQUIRES_NEW) public void upShelfApproveResult(HighApprove highApprove) { // 查询卡卷 HighCoupon couponDetail = getCouponDetail(highApprove.getObjectId()); if (couponDetail == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_FOUND_COUPON, ""); } if (couponDetail.getStatus() != 101) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COUPON_UNABLE_UP_SHELF, ""); } // 状态: 1:待审批 2:驳回 3:通过 if (highApprove.getStatus() == 2) { couponDetail.setStatus(102); } if (highApprove.getStatus() == 3) { couponDetail.setStatus(2); Map map = new HashMap<>(); map.put("objectType", 1); map.put("objectId", couponDetail.getId()); map.put("status", 1); List list = highGoodsPriceReferService.getPriceList(map); if (list != null && list.size() > 0) { for (HighGoodsPriceRefer priceRefer : list) { priceRefer.setEffectiveTime(new Date()); priceRefer.setStatus(3); highGoodsPriceReferService.updatePriceRefer(priceRefer); } } } highCouponMapper.updateByPrimaryKey(couponDetail); } @Override @Transactional(propagation= Propagation.REQUIRES_NEW) public void ofShelfCoupon(Long id) { HighCoupon coupon = getCouponById(id); if (coupon == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_FOUND_COUPON, ""); } //状态:0.删除 1.编辑中 2.已上架 3.已下架 101.上架审批中 102.上架审批驳回 if (coupon.getStatus() != 2) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COUPON_UNABLE_UP_SHELF, ""); } coupon.setStatus(3); highCouponMapper.updateByPrimaryKey(coupon); // 卡卷价格全部失效。但保留当前生效的价格 highGoodsPriceReferService.couponAllInvalidKeepCurrent(coupon.getId()); } @Override public void deleteCoupon(Long id) { HighCoupon coupon = getCouponById(id); if (coupon == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_FOUND_COUPON, ""); } //状态:0.删除 1.编辑中 2.已上架 3.已下架 101.上架审批中 102.上架审批驳回 if (coupon.getStatus() != 1 && coupon.getStatus() != 102) { throw ErrorHelp.genException(SysCode.System, ErrorCode.COUPON_UNABLE_UP_SHELF, ""); } coupon.setStatus(0); highCouponMapper.updateByPrimaryKey(coupon); } @Override @Transactional(propagation= Propagation.REQUIRES_NEW) public void priceApproveResult(HighApprove highApprove) { HighGoodsPriceRefer highGoodsPriceRefer = highGoodsPriceReferService.getPriceReferById(highApprove.getObjectId()); if (highGoodsPriceRefer == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.GOODS_PRICE_REFER_ERROR, ""); } // 状态: 0:删除 1:待编辑 2:待生效 3:已生效 4:已失效 101.审批中 102.审批驳回 if (highGoodsPriceRefer.getStatus() != 101) { throw ErrorHelp.genException(SysCode.System, ErrorCode.STATUS_ERROR, ""); } // 卡卷信息 HighCoupon coupon = getCouponById(highGoodsPriceRefer.getObjectId()); if (coupon == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_FOUND_COUPON, ""); } // 状态: 1:待审批 2:驳回 3:通过 // 价格类型 1:原价 2:折扣价 if (highApprove.getStatus() == 2) { // 及时生效 0:否 1:是 if (highGoodsPriceRefer.getPromptlyType() == true) { coupon.setCouponPrice(highGoodsPriceRefer.getNewSalePrice()); update(coupon); } highGoodsPriceRefer.setStatus(3); } if (highApprove.getStatus() == 3) { highGoodsPriceRefer.setStatus(102); } highGoodsPriceReferService.updatePriceRefer(highGoodsPriceRefer); } @Override public void distributeApprove(HighApprove highApprove) { JSONObject object = JSONObject.parseObject(highApprove.getApproveObject()); if (highApprove.getStatus() == 3) { // 查询卡券详情 HighCoupon coupon = highCouponService.getCouponById(object.getLong("couponId")); if (coupon == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_FOUND_COUPON, ""); } // 查询代理商 HighAgent highAgent = highAgentService.findByAgentMsgId(object.getLong("agentId")); if (highAgent == null) { throw ErrorHelp.genException(SysCode.System, ErrorCode.NOT_FOUND_AGENT, ""); } // 校验是否分配过 HighCouponAgentRel couponAgent = highCouponAgentService.getRelByCouponAgent(object.getLong("couponId"), object.getLong("agentId"), object.getInteger("type")); if (couponAgent != null) { couponAgent.setStockCount(couponAgent.getStockCount() + object.getInteger("stockCount")); couponAgent.setOperatorId(highApprove.getSubmitOperatorId()); couponAgent.setOperatorName(highApprove.getSubmitOperatorName()); highCouponAgentService.assignCouponAgent(couponAgent,object.getInteger("stockCount")); } else { HighCouponAgentRel highCouponAgentRel = new HighCouponAgentRel(); highCouponAgentRel.setCouponName(coupon.getCouponName()); highCouponAgentRel.setSalesPrice(coupon.getSalesPrice()); // 状态 0:删除 1:正常 highCouponAgentRel.setStatus(1); highCouponAgentRel.setSalesCount(0); highCouponAgentRel.setType(object.getInteger("type")); highCouponAgentRel.setCouponId(object.getLong("couponId")); highCouponAgentRel.setAgentId(object.getLong("agentId")); highCouponAgentRel.setStockCount(object.getInteger("stockCount")); highCouponAgentRel.setCreateTime(new Date()); highCouponAgentRel.setOperatorId(highApprove.getSubmitOperatorId()); highCouponAgentRel.setOperatorName(highApprove.getSubmitOperatorName()); highCouponAgentService.assignCouponAgent(highCouponAgentRel,highCouponAgentRel.getStockCount()); } } } @Override public HighCoupon getCouponById(Long id) { HighCoupon highCoupon = highCouponMapper.selectByPrimaryKey(id); if (highCoupon == null) { return null; } HighCoupon model = new HighCoupon(); BeanUtils.copyProperties(highCoupon, model); // 查询有效库存 model.setStockCount(highCouponCodeService.getStockCountByCoupon(highCoupon.getId()).intValue()); // 查询赠送卡卷列表 List couponHandselModelList= new ArrayList<>(); List couponHandselList = highCouponHandselService.getHandselListByCoupon(highCoupon.getId()); for (HighCouponHandsel handsel : couponHandselList) { HighCouponHandselModel couponHandselModel = new HighCouponHandselModel(); BeanUtils.copyProperties(handsel, couponHandselModel); couponHandselModel.setHighCouponModel(getCouponDetail(handsel.getId())); couponHandselModelList.add(couponHandselModel); } model.setHandselCouponList(couponHandselModelList); // 组装赠送卡卷id List handselCouponId = new ArrayList<>(); if (couponHandselModelList.size() > 0) { for (HighCouponHandsel handsel : couponHandselModelList) { handselCouponId.add(handsel.getHandselCouponId()); } } model.setHandselCouponId(handselCouponId); return model; } @Override @Cached(cacheType = CacheType.REMOTE,name="coupon:", key = "#id",expire = 3600) public HighCoupon getCouponDetail(Long id) { return highCouponMapper.selectByPrimaryKey(id); } @Override public HighCoupon getCouponDetail(String couponKey) { HighCouponExample example = new HighCouponExample(); example.createCriteria().andCouponKeyEqualTo(couponKey).andStatusNotEqualTo(0); List list = highCouponMapper.selectByExample(example); if (list.size() > 0) { return list.get(0); } return null; } @Override public List getCouponList(Map map) { HighCouponExample example = new HighCouponExample(); HighCouponExample.Criteria criteria = example.createCriteria(); if (MapUtils.getLong(map, "companyId") != null) { criteria.andCompanyIdEqualTo(MapUtils.getLong(map, "companyId")); } if (MapUtils.getLong(map, "merchantId") != null) { criteria.andMerchantIdEqualTo(MapUtils.getLong(map, "merchantId")); } if (StringUtils.isNotBlank(MapUtils.getString(map, "couponName"))) { criteria.andCouponNameLike("%" + MapUtils.getString(map, "couponName") + "%"); } if (MapUtils.getInteger(map, "couponType") != null) { criteria.andCouponTypeEqualTo(MapUtils.getInteger(map, "couponType")); } if (MapUtils.getInteger(map, "displayArea") != null) { criteria.andDisplayAreaEqualTo(MapUtils.getInteger(map, "displayArea")); } if (MapUtils.getInteger(map, "displayArea") != null) { criteria.andDisplayAreaEqualTo(MapUtils.getInteger(map, "displayArea")); } if (MapUtils.getInteger(map, "brandId") != null) { criteria.andBrandIdEqualTo(MapUtils.getInteger(map, "brandId")); } if (MapUtils.getInteger(map, "goodsTypeId") != null) { criteria.andGoodsTypeIdEqualTo(MapUtils.getInteger(map, "goodsTypeId")); } if (MapUtils.getInteger(map, "status") != null) { criteria.andStatusEqualTo(MapUtils.getInteger(map, "status")); } if (MapUtils.getInteger(map, "couponSource") != null) { criteria.andCouponSourceEqualTo(MapUtils.getInteger(map, "status")); } if (MapUtils.getInteger(map, "notCouponSource") != null) { criteria.andCouponSourceNotEqualTo(MapUtils.getInteger(map, "notCouponSource")); } example.setOrderByClause("create_time desc"); List coupons = highCouponMapper.selectByExample(example); if (coupons != null && coupons.size() > 0) { for (HighCoupon highCoupon : coupons) { highCoupon.setMerchantName(highMerchantService.getMerchantById(highCoupon.getMerchantId()).getMerchantName()); highCoupon.setStockCount(highCouponCodeService.getStockCountByCoupon(highCoupon.getId()).intValue()); } } return coupons; } @Override public List getCouponListByAll(Map map) { HighCouponExample example = new HighCouponExample(); HighCouponExample.Criteria criteria = example.createCriteria(); if (MapUtils.getLong(map, "companyId") != null) { criteria.andCompanyIdEqualTo(MapUtils.getLong(map, "companyId")); } if (MapUtils.getLong(map, "merchantId") != null) { criteria.andMerchantIdEqualTo(MapUtils.getLong(map, "merchantId")); } if (StringUtils.isNotBlank(MapUtils.getString(map, "couponName"))) { criteria.andCouponNameLike("%" + MapUtils.getString(map, "couponName") + "%"); } if (MapUtils.getInteger(map, "couponType") != null) { criteria.andCouponTypeEqualTo(MapUtils.getInteger(map, "couponType")); } if (MapUtils.getInteger(map, "displayArea") != null) { criteria.andDisplayAreaEqualTo(MapUtils.getInteger(map, "displayArea")); } if (MapUtils.getInteger(map, "displayArea") != null) { criteria.andDisplayAreaEqualTo(MapUtils.getInteger(map, "displayArea")); } if (MapUtils.getInteger(map, "brandId") != null) { criteria.andBrandIdEqualTo(MapUtils.getInteger(map, "brandId")); } if (MapUtils.getInteger(map, "goodsTypeId") != null) { criteria.andGoodsTypeIdEqualTo(MapUtils.getInteger(map, "goodsTypeId")); } if (MapUtils.getInteger(map, "status") != null) { criteria.andStatusEqualTo(MapUtils.getInteger(map, "status")); } if (MapUtils.getInteger(map, "couponSource") != null) { criteria.andCouponSourceEqualTo(MapUtils.getInteger(map, "status")); } if (MapUtils.getInteger(map, "notCouponSource") != null) { criteria.andCouponSourceNotEqualTo(MapUtils.getInteger(map, "notCouponSource")); } example.setOrderByClause("create_time"); return highCouponMapper.selectByExample(example); } @Override public Long getCouponByCouponName(Long companyId,String couponName) { HighCouponExample example = new HighCouponExample(); example.createCriteria().andCompanyIdEqualTo(companyId).andCouponNameEqualTo(couponName); return highCouponMapper.countByExample(example); } @Override public String getCouponIdsByCompanyId(Long companyId) { HighCouponExample example = new HighCouponExample(); example.createCriteria().andCompanyIdEqualTo(companyId); List list = highCouponMapper.selectByExample(example); String str = null; for (HighCoupon coupon : list) { if (StringUtils.isBlank(str)) { str = coupon.getId().toString(); } else { str += ","+coupon.getId(); } } return str; } @Override public List getCouponListByMerchant(Long merchantId) { HighCouponExample example = new HighCouponExample(); example.createCriteria().andMerchantIdEqualTo(merchantId).andStatusEqualTo(1).andStatusNotEqualTo(0); return highCouponMapper.selectByExample(example); } @Override public Boolean userBuyLimitNumber(Long userId, Long couponId) { Boolean status = false; HighCoupon coupon = getCouponById(couponId); Map map = new HashMap<>(); map.put("memId", userId); map.put("goodsType", 1); map.put("goodsId", couponId); map.put("childOrdeStatusList", "2,3"); List childOrderList = highOrderService.getChildOrderList(map); // 限购数量 大于购买数量 if (coupon != null && childOrderList.size() > coupon.getLimitNumber()) { status = true; } return status; } @Override public HighCouponCode assignOrderStock(Long couponId, String childOrderNo) throws InterruptedException { String key = "coupon_" + couponId; try { // 分布式锁占坑 Boolean lock = redisTemplate.opsForValue().setIfAbsent(key, childOrderNo); if(lock) { // 加锁成功,处理业务 // 查询一张可用的兑换码 HighCouponCode stockCode = highCouponCodeService.getCouponStockCode(couponId); if (stockCode != null) { stockCode.setChildOrderNo(childOrderNo); stockCode.setStatus(99); highCouponCodeService.updateCouponCode(stockCode); } return stockCode; } else { // 加锁失败,重试 Thread.sleep(100); assignOrderStock(couponId,childOrderNo); } } catch (Exception e) { return null; } finally { // 删除key,释放锁 redisTemplate.delete(key); } return null; } @Override public int getMonthlySales(Long couponId) { return highCouponMapper.getMonthlySales(couponId); } }