ApiUserCouponService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. package com.kmall.api.service;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.google.common.collect.Maps;
  4. import com.kmall.api.dto.UserCouponDto;
  5. import com.kmall.api.entity.CartVo;
  6. import com.kmall.api.entity.UserVo;
  7. import com.kmall.api.entity.mk.MkStoreTicketDiscountVo;
  8. import com.kmall.api.service.mk.ApiMkStoreTicketDiscountService;
  9. import com.kmall.api.service.mk.ApiMkStoreTopicStatService;
  10. import com.kmall.common.constant.Dict;
  11. import com.kmall.api.dao.ApiUserCouponMapper;
  12. import com.kmall.api.entity.UserCouponVo;
  13. import com.kmall.common.utils.Constant;
  14. import com.kmall.common.utils.DateUtils;
  15. import com.kmall.common.utils.MapUtils;
  16. import com.kmall.common.utils.RRException;
  17. import org.apache.commons.logging.Log;
  18. import org.apache.commons.logging.LogFactory;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import java.math.BigDecimal;
  23. import java.util.*;
  24. @Service
  25. public class ApiUserCouponService {
  26. private Log logger = LogFactory.getLog(ApiUserCouponService.class);
  27. @Autowired
  28. private ApiUserCouponMapper userCouponDao;
  29. @Autowired
  30. private ApiMkStoreTicketDiscountService mkStoreTicketDiscountService;
  31. @Autowired
  32. private ApiMkStoreTopicStatService apiMkStoreTopicStatService;
  33. public UserCouponVo queryObject(Integer id) {
  34. return userCouponDao.queryObject(id);
  35. }
  36. public List<UserCouponVo> queryList(Map<String, Object> map) {
  37. return userCouponDao.queryList(map);
  38. }
  39. public int queryTotal(Map<String, Object> map) {
  40. return userCouponDao.queryTotal(map);
  41. }
  42. public void save(UserCouponVo goods) {
  43. userCouponDao.save(goods);
  44. }
  45. public void update(UserCouponVo goods) {
  46. userCouponDao.update(goods);
  47. }
  48. public void delete(Integer id) {
  49. userCouponDao.delete(id);
  50. }
  51. public void deleteBatch(Integer[] ids) {
  52. userCouponDao.deleteBatch(ids);
  53. }
  54. /**
  55. * 标记未使用的优惠券是否可用,暂时无用
  56. *
  57. * @param userId
  58. * @param goodsTotalPrice
  59. * @return
  60. */
  61. public List<UserCouponVo> signUserCouponList(Long userId,String merchSn, BigDecimal goodsTotalPrice) {
  62. Map param = Maps.newHashMap();
  63. param.put("user_id", userId);
  64. param.put("unUsed", true);
  65. param.put("enabled", true);
  66. Integer[] send_types = new Integer[]{1, 2, 3, 4, 5, 6}; // 去除订单满减0,运费7
  67. param.put("send_types", send_types);
  68. param.put("merchSn", merchSn);
  69. List<UserCouponVo> couponVos = userCouponDao.queryList(param);
  70. if (null != couponVos && couponVos.size() > 0) {
  71. // 如果没有用户优惠券直接返回新用户优惠券
  72. for (UserCouponVo couponVo : couponVos) {
  73. //// TODO: 2019/5/15 最小金额
  74. // if (couponVo.getTypeMoney().compareTo(goodsTotalPrice) <= 0) {
  75. // couponVo.setEnabled("1");
  76. // }
  77. }
  78. }
  79. return couponVos;
  80. }
  81. /**
  82. * 匹配未使用的优惠券是否可用
  83. *
  84. * @param userCouponDto
  85. * @return
  86. */
  87. public List<UserCouponVo> matchUserCouponList(UserCouponDto userCouponDto) {
  88. List<UserCouponVo> result = new ArrayList();
  89. List<MkStoreTicketDiscountVo> switchList = new ArrayList();
  90. if(userCouponDto.getCartGoodsList() == null || userCouponDto.getCartGoodsList().size() == 0){
  91. return result;
  92. }
  93. //获取订单中商品可支持的优惠券,自动选择减免最大的金额
  94. String isUsed = "0";
  95. //查询未使用已领取的优惠券
  96. Map map = mkStoreTicketDiscountService.queryStoreDiscountByCartGoodsId(userCouponDto, isUsed);
  97. List<MkStoreTicketDiscountVo> discountVoList = (List<MkStoreTicketDiscountVo>)map.get("discountVoList");
  98. if(discountVoList != null && discountVoList.size() > 0){
  99. for (MkStoreTicketDiscountVo discountVo : discountVoList) {
  100. BigDecimal cond = Constant.ZERO;
  101. BigDecimal money = Constant.ZERO;
  102. if(discountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_00.getItem())){
  103. cond = discountVo.getVoucherCond();
  104. money = discountVo.getVoucherMoney();
  105. }
  106. if(discountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_01.getItem())){
  107. cond = discountVo.getDiscCond();
  108. money = discountVo.getDiscRatio();//满多少打几折
  109. }
  110. //// TODO: 2019/5/21 代金券暂时无用
  111. /*if(discountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_02.getItem())){
  112. cond = discountVo.getExchCond();
  113. money = discountVo.getExchCond();
  114. }*/
  115. if(discountVo.getApplyType().equalsIgnoreCase(Dict.applyType.item_00.getItem())){ //全部商品参与
  116. //计算购物车中满足部分商品的销售价
  117. BigDecimal totalByGoodsId = getTotalByGoodsId(userCouponDto.getCartGoodsList(),discountVoList,discountVo.getTickDiscId());
  118. //销售价>满减价,去重
  119. if (totalByGoodsId.compareTo(cond) >= 0 && containsList(switchList,discountVo)) {
  120. UserCouponVo userCouponVo = setUserCouponVo(discountVo, money);
  121. result.add(userCouponVo);
  122. switchList.add(discountVo);
  123. }
  124. }
  125. if(!discountVo.getApplyType().equalsIgnoreCase(Dict.applyType.item_00.getItem())) { //部分商品参与
  126. //计算购物车中满足部分商品的销售价
  127. BigDecimal totalByGoodsId = getTotalByGoodsId(userCouponDto.getCartGoodsList(),discountVoList,discountVo.getTickDiscId());
  128. //销售价>满减价,去重
  129. if(totalByGoodsId.compareTo(cond) >= 0 && containsList(switchList,discountVo)){
  130. UserCouponVo userCouponVo = setUserCouponVo(discountVo, money);
  131. result.add(userCouponVo);
  132. switchList.add(discountVo);
  133. }
  134. }
  135. }
  136. UserCouponVo userCouponVo = new UserCouponVo();
  137. userCouponVo.setId(0L);
  138. userCouponVo.setCouponName("不参与优惠券");
  139. userCouponVo.setTypeMoney(Constant.ZERO);
  140. userCouponVo.setGoodsBizType(userCouponDto.getBizType());
  141. result.add(userCouponVo);
  142. }
  143. return result;
  144. }
  145. /**
  146. * 获取优惠券可支持的商品总销售价
  147. * @param cartGoodsList
  148. * @param discountVoList
  149. * @param tickDistId
  150. * @return
  151. */
  152. private BigDecimal getTotalByGoodsId(List<CartVo> cartGoodsList, List<MkStoreTicketDiscountVo> discountVoList, Integer tickDistId){
  153. BigDecimal total = new BigDecimal(0);
  154. for (CartVo vo: cartGoodsList) {
  155. for(MkStoreTicketDiscountVo discountVo: discountVoList){
  156. if(discountVo.getTickDiscId() == tickDistId && discountVo.getGoodsId().compareTo(vo.getGoods_id().intValue()) == 0){
  157. total = total.add(vo.getRetail_price().multiply(BigDecimal.valueOf(vo.getNumber())));
  158. }
  159. }
  160. }
  161. return total;
  162. }
  163. /**
  164. * 去重
  165. * @param switchList
  166. * @param discountVo
  167. * @return
  168. */
  169. private Boolean containsList(List<MkStoreTicketDiscountVo> switchList,MkStoreTicketDiscountVo discountVo){
  170. for (MkStoreTicketDiscountVo vo: switchList) {
  171. if(vo.getTickDiscId().equals(discountVo.getTickDiscId())){
  172. return false;
  173. }
  174. }
  175. return true;
  176. }
  177. private UserCouponVo setUserCouponVo(MkStoreTicketDiscountVo discountVo,BigDecimal money){
  178. UserCouponVo userCouponVo = new UserCouponVo();
  179. userCouponVo.setTickDiscType(discountVo.getTickDiscType());
  180. userCouponVo.setCouponName(discountVo.getName());
  181. userCouponVo.setTypeMoney(money);
  182. userCouponVo.setId(Long.valueOf(discountVo.getTickDiscId()));
  183. userCouponVo.setSelectTicket(false);
  184. userCouponVo.setGoodsBizType(discountVo.getGoodsBizType());
  185. return userCouponVo;
  186. }
  187. public UserCouponVo queryObjectByStoreTopicIdAndUserId(Integer storeTopicId,Long userId){
  188. return userCouponDao.queryObjectByStoreTopicIdAndUserId(storeTopicId,userId);
  189. }
  190. /**
  191. * 领取优惠券
  192. * @param jsonParam
  193. * @param loginUser
  194. */
  195. @Transactional
  196. public void getUserCoupon(JSONObject jsonParam, UserVo loginUser){
  197. Integer tickDiscId = jsonParam.getInteger("tickDiscId");
  198. Integer storeTopicId = jsonParam.getInteger("storeTopicId");
  199. Integer storeId = jsonParam.getInteger("storeId");
  200. Long userId = loginUser.getId();
  201. MkStoreTicketDiscountVo discountVo = mkStoreTicketDiscountService.queryObject(tickDiscId);
  202. if(discountVo == null){
  203. logger.error("该优惠券无效" );
  204. throw new RRException("该优惠券无效");
  205. }
  206. Map map = new HashMap();
  207. map.put("userId" , userId);
  208. map.put("storeId", storeId);
  209. map.put("storeTopicId", storeTopicId);
  210. map.put("tickDiscId", tickDiscId);
  211. List<MkStoreTicketDiscountVo> list = mkStoreTicketDiscountService.queryStoreDiscountByUserId(map);
  212. if (list.size() > 0 && list.size() == discountVo.getLimitNum()) {
  213. logger.error("您已经领取过该优惠券,不能重复领取" );
  214. throw new RRException("您已经领取过该优惠券,不能重复领取");
  215. }
  216. UserCouponVo userCouponVo = new UserCouponVo();
  217. userCouponVo.setCouponUrl(discountVo.getAdvImgUrl());
  218. userCouponVo.setCouponName(discountVo.getName());
  219. userCouponVo.setUserId(Long.valueOf(userId));
  220. userCouponVo.setAddTime(new Date());
  221. userCouponVo.setSourceKey("小程序");
  222. userCouponVo.setShowState(1);
  223. userCouponVo.setIsUsed(Dict.isUsed.item_0.getItem());
  224. userCouponVo.setEnabled("1");
  225. userCouponVo.setCreateTime(new Date());
  226. userCouponVo.setModTime(new Date());
  227. if(discountVo.getEffectTimeType().equalsIgnoreCase(Dict.effectTimeType.item_00.getItem())){
  228. userCouponVo.setEndTime(discountVo.getFixEndTime());
  229. userCouponVo.setValidTime(discountVo.getFixBegTime());
  230. }
  231. if(discountVo.getEffectTimeType().equalsIgnoreCase(Dict.effectTimeType.item_01.getItem())){
  232. Integer postponeNum = Integer.parseInt(discountVo.getPostponeNum());//领取后多少天后生效
  233. Integer day = postponeNum + Integer.parseInt(discountVo.getValidDayNum());
  234. Date validDate = DateUtils.addDay(new Date(), postponeNum);//生效时间
  235. Date endDate = DateUtils.addDay(new Date(), day);//过期时间
  236. userCouponVo.setEndTime(endDate);
  237. userCouponVo.setValidTime(validDate);
  238. }
  239. userCouponVo.setStoreTopicId(Long.valueOf(storeTopicId));
  240. //// TODO: 2019/5/21 代金券暂时无用
  241. /*if(discountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_02.getItem())){
  242. userCouponVo.setTypeMoney(discountVo.getExchCond());
  243. }*/
  244. if(discountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_00.getItem())){
  245. userCouponVo.setTypeMoney(discountVo.getVoucherMoney());
  246. }
  247. if(discountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_01.getItem())){
  248. userCouponVo.setTypeMoney(discountVo.getDiscRatio());//折扣金额
  249. }
  250. userCouponDao.save(userCouponVo);
  251. //优惠券库存扣减
  252. if(discountVo.getTicketNum()-1 >= 0){
  253. MkStoreTicketDiscountVo mkStoreTicketDiscountVo = new MkStoreTicketDiscountVo();
  254. mkStoreTicketDiscountVo.setTickDiscId(discountVo.getTickDiscId());
  255. mkStoreTicketDiscountVo.setTicketNum(discountVo.getTicketNum()-1);
  256. mkStoreTicketDiscountService.updateDiscount(mkStoreTicketDiscountVo);
  257. //记录活动营销统计领取量数据
  258. apiMkStoreTopicStatService.saveStoreTopicStatByReceiveData(Integer.parseInt(String.valueOf(userCouponVo.getId())));
  259. }
  260. }
  261. }