1
0

ApiUserCouponService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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. userCouponVo.setGoodsList(discountVo.getGoodsList());
  188. return userCouponVo;
  189. }
  190. public UserCouponVo queryObjectByStoreTopicIdAndUserId(Integer storeTopicId,Long userId){
  191. return userCouponDao.queryObjectByStoreTopicIdAndUserId(storeTopicId,userId);
  192. }
  193. /**
  194. * 领取优惠券
  195. * @param jsonParam
  196. * @param loginUser
  197. */
  198. @Transactional
  199. public void getUserCoupon(JSONObject jsonParam, UserVo loginUser){
  200. Integer tickDiscId = jsonParam.getInteger("tickDiscId");
  201. Integer storeTopicId = jsonParam.getInteger("storeTopicId");
  202. Integer storeId = jsonParam.getInteger("storeId");
  203. Long userId = loginUser.getId();
  204. MkStoreTicketDiscountVo discountVo = mkStoreTicketDiscountService.queryObject(tickDiscId);
  205. if(discountVo == null){
  206. logger.error("该优惠券无效" );
  207. throw new RRException("该优惠券无效");
  208. }
  209. Map map = new HashMap();
  210. map.put("userId" , userId);
  211. map.put("storeId", storeId);
  212. map.put("storeTopicId", storeTopicId);
  213. map.put("tickDiscId", tickDiscId);
  214. List<MkStoreTicketDiscountVo> list = mkStoreTicketDiscountService.queryStoreDiscountByUserId(map);
  215. if (list.size() > 0 && list.size() == discountVo.getLimitNum()) {
  216. logger.error("您已经领取过该优惠券,不能重复领取" );
  217. throw new RRException("您已经领取过该优惠券,不能重复领取");
  218. }
  219. UserCouponVo userCouponVo = new UserCouponVo();
  220. userCouponVo.setCouponUrl(discountVo.getAdvImgUrl());
  221. userCouponVo.setCouponName(discountVo.getName());
  222. userCouponVo.setUserId(Long.valueOf(userId));
  223. userCouponVo.setAddTime(new Date());
  224. userCouponVo.setSourceKey("小程序");
  225. userCouponVo.setShowState(1);
  226. userCouponVo.setIsUsed(Dict.isUsed.item_0.getItem());
  227. userCouponVo.setEnabled("1");
  228. userCouponVo.setCreateTime(new Date());
  229. userCouponVo.setModTime(new Date());
  230. if(discountVo.getEffectTimeType().equalsIgnoreCase(Dict.effectTimeType.item_00.getItem())){
  231. userCouponVo.setEndTime(discountVo.getFixEndTime());
  232. userCouponVo.setValidTime(discountVo.getFixBegTime());
  233. }
  234. if(discountVo.getEffectTimeType().equalsIgnoreCase(Dict.effectTimeType.item_01.getItem())){
  235. Integer postponeNum = Integer.parseInt(discountVo.getPostponeNum());//领取后多少天后生效
  236. Integer day = postponeNum + Integer.parseInt(discountVo.getValidDayNum());
  237. Date validDate = DateUtils.addDay(new Date(), postponeNum);//生效时间
  238. Date endDate = DateUtils.addDay(new Date(), day);//过期时间
  239. userCouponVo.setEndTime(endDate);
  240. userCouponVo.setValidTime(validDate);
  241. }
  242. userCouponVo.setStoreTopicId(Long.valueOf(storeTopicId));
  243. //// TODO: 2019/5/21 代金券暂时无用
  244. /*if(discountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_02.getItem())){
  245. userCouponVo.setTypeMoney(discountVo.getExchCond());
  246. }*/
  247. if(discountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_00.getItem())){
  248. userCouponVo.setTypeMoney(discountVo.getVoucherMoney());
  249. }
  250. if(discountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_01.getItem())){
  251. userCouponVo.setTypeMoney(discountVo.getDiscRatio());//折扣金额
  252. }
  253. userCouponDao.save(userCouponVo);
  254. //优惠券库存扣减
  255. if(discountVo.getTicketNum()-1 >= 0){
  256. MkStoreTicketDiscountVo mkStoreTicketDiscountVo = new MkStoreTicketDiscountVo();
  257. mkStoreTicketDiscountVo.setTickDiscId(discountVo.getTickDiscId());
  258. mkStoreTicketDiscountVo.setTicketNum(discountVo.getTicketNum()-1);
  259. mkStoreTicketDiscountService.updateDiscount(mkStoreTicketDiscountVo);
  260. //记录活动营销统计领取量数据
  261. apiMkStoreTopicStatService.saveStoreTopicStatByReceiveData(Integer.parseInt(String.valueOf(userCouponVo.getId())));
  262. }
  263. }
  264. }