ApiUserCouponService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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. if(result != null && result.size() > 0) {
  137. UserCouponVo userCouponVo = new UserCouponVo();
  138. userCouponVo.setId(0L);
  139. userCouponVo.setCouponName("不参与优惠券");
  140. userCouponVo.setTypeMoney(Constant.ZERO);
  141. userCouponVo.setGoodsBizType(userCouponDto.getBizType());
  142. result.add(userCouponVo);
  143. }
  144. }
  145. return result;
  146. }
  147. /**
  148. * 获取优惠券可支持的商品总销售价
  149. * @param cartGoodsList
  150. * @param discountVoList
  151. * @param tickDistId
  152. * @return
  153. */
  154. private BigDecimal getTotalByGoodsId(List<CartVo> cartGoodsList, List<MkStoreTicketDiscountVo> discountVoList, Integer tickDistId){
  155. BigDecimal total = new BigDecimal(0);
  156. for (CartVo vo: cartGoodsList) {
  157. for(MkStoreTicketDiscountVo discountVo: discountVoList){
  158. if(discountVo.getTickDiscId() == tickDistId && discountVo.getGoodsId().compareTo(vo.getGoods_id().intValue()) == 0){
  159. total = total.add(vo.getRetail_price().multiply(BigDecimal.valueOf(vo.getNumber())));
  160. }
  161. }
  162. }
  163. return total;
  164. }
  165. /**
  166. * 去重
  167. * @param switchList
  168. * @param discountVo
  169. * @return
  170. */
  171. private Boolean containsList(List<MkStoreTicketDiscountVo> switchList,MkStoreTicketDiscountVo discountVo){
  172. for (MkStoreTicketDiscountVo vo: switchList) {
  173. if(vo.getTickDiscId().equals(discountVo.getTickDiscId())){
  174. return false;
  175. }
  176. }
  177. return true;
  178. }
  179. private UserCouponVo setUserCouponVo(MkStoreTicketDiscountVo discountVo,BigDecimal money){
  180. UserCouponVo userCouponVo = new UserCouponVo();
  181. userCouponVo.setTickDiscType(discountVo.getTickDiscType());
  182. userCouponVo.setCouponName(discountVo.getName());
  183. userCouponVo.setTypeMoney(money);
  184. userCouponVo.setId(Long.valueOf(discountVo.getTickDiscId()));
  185. userCouponVo.setSelectTicket(false);
  186. userCouponVo.setGoodsBizType(discountVo.getGoodsBizType());
  187. return userCouponVo;
  188. }
  189. public UserCouponVo queryObjectByStoreTopicIdAndUserId(Integer storeTopicId,Long userId){
  190. return userCouponDao.queryObjectByStoreTopicIdAndUserId(storeTopicId,userId);
  191. }
  192. /**
  193. * 领取优惠券
  194. * @param jsonParam
  195. * @param loginUser
  196. */
  197. @Transactional
  198. public void getUserCoupon(JSONObject jsonParam, UserVo loginUser){
  199. Integer tickDiscId = jsonParam.getInteger("tickDiscId");
  200. Integer storeTopicId = jsonParam.getInteger("storeTopicId");
  201. Integer storeId = jsonParam.getInteger("storeId");
  202. Long userId = loginUser.getId();
  203. MkStoreTicketDiscountVo discountVo = mkStoreTicketDiscountService.queryObject(tickDiscId);
  204. if(discountVo == null){
  205. logger.error("该优惠券无效" );
  206. throw new RRException("该优惠券无效");
  207. }
  208. Map map = new HashMap();
  209. map.put("userId" , userId);
  210. map.put("storeId", storeId);
  211. map.put("storeTopicId", storeTopicId);
  212. map.put("tickDiscId", tickDiscId);
  213. List<MkStoreTicketDiscountVo> list = mkStoreTicketDiscountService.queryStoreDiscountByUserId(map);
  214. if (list.size() > 0 && list.size() == discountVo.getLimitNum()) {
  215. logger.error("您已经领取过该优惠券,不能重复领取" );
  216. throw new RRException("您已经领取过该优惠券,不能重复领取");
  217. }
  218. UserCouponVo userCouponVo = new UserCouponVo();
  219. userCouponVo.setCouponUrl(discountVo.getAdvImgUrl());
  220. userCouponVo.setCouponName(discountVo.getName());
  221. userCouponVo.setUserId(Long.valueOf(userId));
  222. userCouponVo.setAddTime(new Date());
  223. userCouponVo.setSourceKey("小程序");
  224. userCouponVo.setShowState(1);
  225. userCouponVo.setIsUsed(Dict.isUsed.item_0.getItem());
  226. userCouponVo.setEnabled("1");
  227. userCouponVo.setCreateTime(new Date());
  228. userCouponVo.setModTime(new Date());
  229. if(discountVo.getEffectTimeType().equalsIgnoreCase(Dict.effectTimeType.item_00.getItem())){
  230. userCouponVo.setEndTime(discountVo.getFixEndTime());
  231. userCouponVo.setValidTime(discountVo.getFixBegTime());
  232. }
  233. if(discountVo.getEffectTimeType().equalsIgnoreCase(Dict.effectTimeType.item_01.getItem())){
  234. Integer postponeNum = Integer.parseInt(discountVo.getPostponeNum());//领取后多少天后生效
  235. Integer day = postponeNum + Integer.parseInt(discountVo.getValidDayNum());
  236. Date validDate = DateUtils.addDay(new Date(), postponeNum);//生效时间
  237. Date endDate = DateUtils.addDay(new Date(), day);//过期时间
  238. userCouponVo.setEndTime(endDate);
  239. userCouponVo.setValidTime(validDate);
  240. }
  241. userCouponVo.setStoreTopicId(Long.valueOf(storeTopicId));
  242. //// TODO: 2019/5/21 代金券暂时无用
  243. /*if(discountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_02.getItem())){
  244. userCouponVo.setTypeMoney(discountVo.getExchCond());
  245. }*/
  246. if(discountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_00.getItem())){
  247. userCouponVo.setTypeMoney(discountVo.getVoucherMoney());
  248. }
  249. if(discountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_01.getItem())){
  250. userCouponVo.setTypeMoney(discountVo.getDiscRatio());//折扣金额
  251. }
  252. userCouponDao.save(userCouponVo);
  253. //优惠券库存扣减
  254. if(discountVo.getTicketNum()-1 >= 0){
  255. MkStoreTicketDiscountVo mkStoreTicketDiscountVo = new MkStoreTicketDiscountVo();
  256. mkStoreTicketDiscountVo.setTickDiscId(discountVo.getTickDiscId());
  257. mkStoreTicketDiscountVo.setTicketNum(discountVo.getTicketNum()-1);
  258. mkStoreTicketDiscountService.updateDiscount(mkStoreTicketDiscountVo);
  259. //记录活动营销统计领取量数据
  260. apiMkStoreTopicStatService.saveStoreTopicStatByReceiveData(Integer.parseInt(String.valueOf(userCouponVo.getId())));
  261. }
  262. }
  263. }