| package com.dsh.activity.service.impl; | 
|   | 
| import com.alibaba.fastjson.JSON; | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
| import com.dsh.activity.entity.Coupon; | 
| import com.dsh.activity.entity.CouponCity; | 
| import com.dsh.activity.entity.CouponStore; | 
| import com.dsh.activity.entity.UserCoupon; | 
| import com.dsh.activity.feignclient.account.AppUserClient; | 
| import com.dsh.activity.feignclient.account.StudentClient; | 
| import com.dsh.activity.feignclient.account.model.AppUser; | 
| import com.dsh.activity.feignclient.course.CoursePackageClient; | 
| import com.dsh.activity.feignclient.course.model.CoursePackage; | 
| import com.dsh.activity.feignclient.other.SiteClient; | 
| import com.dsh.activity.feignclient.other.StoreClient; | 
| import com.dsh.activity.feignclient.other.model.Site; | 
| import com.dsh.activity.feignclient.other.model.StoreDetailOfCourse; | 
| import com.dsh.activity.mapper.CouponCityMapper; | 
| import com.dsh.activity.mapper.CouponMapper; | 
| import com.dsh.activity.mapper.CouponStoreMapper; | 
| import com.dsh.activity.mapper.UserCouponMapper; | 
| import com.dsh.activity.model.ConponJsonRuleModel; | 
| import com.dsh.activity.model.CouponListVo; | 
| import com.dsh.activity.model.request.CouponPackageReq; | 
| import com.dsh.activity.model.response.CouponPackageResp; | 
| import com.dsh.activity.service.UserCouponService; | 
| import com.dsh.activity.util.DateUtil; | 
| import com.dsh.activity.util.GDMapGeocodingUtil; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
|   | 
| import javax.annotation.Resource; | 
| import java.text.SimpleDateFormat; | 
| import java.util.ArrayList; | 
| import java.util.List; | 
| import java.util.Map; | 
| import java.util.stream.Collectors; | 
|   | 
| /** | 
|  * <p> | 
|  * 用户优惠券领取记录 服务实现类 | 
|  * </p> | 
|  * | 
|  * @author jqs | 
|  * @since 2023-06-29 | 
|  */ | 
| @Service | 
| public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements UserCouponService { | 
|   | 
|     @Resource | 
|     private CoursePackageClient coursePackageClient; | 
|   | 
|     @Autowired | 
|     private GDMapGeocodingUtil gdMapGeocodingUtil; | 
|   | 
|     @Resource | 
|     private AppUserClient appClient; | 
|   | 
|     @Resource | 
|     private StudentClient studentClient; | 
|   | 
|     @Resource | 
|     private CouponMapper couponMapper; | 
|   | 
|     @Resource | 
|     private CouponCityMapper couponCityMapper; | 
|   | 
|     @Resource | 
|     private StoreClient storeClient; | 
|   | 
|     @Resource | 
|     private CouponStoreMapper csMapper; | 
|   | 
|     @Resource | 
|     private SiteClient siteClient; | 
|   | 
|   | 
|     /** | 
|      * 获取购买课程可用优惠券列表 | 
|      * | 
|      * @param uid | 
|      * @param coursePackageId | 
|      * @return | 
|      */ | 
|     @Override | 
|     public List<CouponListVo> queryAvailableCouponList(Integer uid, Integer coursePackageId, Double price, String lon, String lat) throws Exception { | 
|         CoursePackage coursePackage = coursePackageClient.queryCoursePackageById(coursePackageId); | 
|         Integer storeId = coursePackage.getStoreId(); | 
|         Map<String, String> geocode = gdMapGeocodingUtil.geocode(lon, lat); | 
|         String provinceCode = geocode.get("provinceCode"); | 
|         String cityCode = geocode.get("cityCode"); | 
|         List<Map<String, Object>> userCoupons = this.baseMapper.queryAvailableCouponList(uid, storeId, provinceCode, cityCode); | 
|         List<CouponListVo> listVos = new ArrayList<>(); | 
|         for (Map<String, Object> userCoupon : userCoupons) { | 
|             Integer type = Integer.valueOf(userCoupon.get("type").toString()); | 
|             CouponListVo couponListVo = new CouponListVo(); | 
|             couponListVo.setId(Long.valueOf(userCoupon.get("id").toString())); | 
|             couponListVo.setName(userCoupon.get("name").toString()); | 
|             couponListVo.setType(type); | 
|             couponListVo.setEffectiveTime(userCoupon.get("endTime").toString()); | 
|             String content = userCoupon.get("content").toString(); | 
|             if (type == 1) {//满减{"num1":1,"num2":1} | 
|                 JSONObject jsonObject = JSON.parseObject(content); | 
|                 Double num1 = jsonObject.getDouble("conditionalAmount"); | 
|                 if (price.compareTo(num1) < 0) { | 
|                     continue; | 
|                 } | 
|                 couponListVo.setUseCondition("满¥" + num1 + "元可用"); | 
|                 couponListVo.setFavorable(jsonObject.getString("deductionAmount")); | 
|             } | 
|             if (type == 2) {//代金券{"num1":1} | 
|                 JSONObject jsonObject = JSON.parseObject(content); | 
|                 Double num1 = jsonObject.getDouble("conditionalAmount"); | 
|                 if (num1 == null) { | 
|                     num1 = 0d; | 
|                 } | 
|                 if (price.compareTo(num1) < 0) { | 
|                     continue; | 
|                 } | 
|                 couponListVo.setUseCondition(""); | 
|                 couponListVo.setFavorable(num1 + ""); | 
|             } | 
|             if (type == 3) {//体验券{"num1":1} | 
|                 JSONObject jsonObject = JSON.parseObject(content); | 
|                 couponListVo.setUseCondition(""); | 
|                 couponListVo.setFavorable(jsonObject.getString("experienceName")); | 
|             } | 
|             listVos.add(couponListVo); | 
|         } | 
|         return listVos; | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 获取预约场地可用优惠券列表 | 
|      * | 
|      * @param siteId | 
|      * @param price | 
|      * @return | 
|      * @throws Exception | 
|      */ | 
|     @Override | 
|     public List<CouponListVo> querySiteCouponList(Integer uid, Integer siteId, Double price, String lon, String lat) throws Exception { | 
|         Site site = siteClient.querySiteById(siteId); | 
|         Integer storeId = site.getStoreId(); | 
|         Map<String, String> geocode = gdMapGeocodingUtil.geocode(lon, lat); | 
|         String provinceCode = geocode.get("provinceCode"); | 
|         String cityCode = geocode.get("cityCode"); | 
|         List<Map<String, Object>> userCoupons = this.baseMapper.queryAvailableCouponList(uid, storeId, provinceCode, cityCode); | 
|         List<CouponListVo> listVos = new ArrayList<>(); | 
|         for (Map<String, Object> userCoupon : userCoupons) { | 
|             Integer type = Integer.valueOf(userCoupon.get("type").toString()); | 
|             CouponListVo couponListVo = new CouponListVo(); | 
|             couponListVo.setId(Long.valueOf(userCoupon.get("id").toString())); | 
|             couponListVo.setName(userCoupon.get("name").toString()); | 
|             couponListVo.setType(type); | 
|             couponListVo.setEffectiveTime(userCoupon.get("endTime").toString()); | 
|             String content = userCoupon.get("content").toString(); | 
|             if (type == 1) {//满减{"num1":1,"num2":1} | 
|                 JSONObject jsonObject = JSON.parseObject(content); | 
|                 Double num1 = jsonObject.getDouble("conditionalAmount"); | 
|                 if (price.compareTo(num1) < 0) { | 
|                     continue; | 
|                 } | 
|                 couponListVo.setUseCondition("满" + num1 + "元可用"); | 
|                 couponListVo.setFavorable(jsonObject.getString("deductionAmount")); | 
|             } | 
|             if (type == 2) {//代金券{"num1":1} | 
|                 JSONObject jsonObject = JSON.parseObject(content); | 
|                 Double num1 = jsonObject.getDouble("conditionalAmount"); | 
|                 if (num1 == null) { | 
|                     num1 = 0d; | 
|                 } | 
|                 if (price.compareTo(num1) < 0) { | 
|                     continue; | 
|                 } | 
|                 couponListVo.setUseCondition(""); | 
|                 couponListVo.setFavorable(num1 + ""); | 
|             } | 
|             if (type == 3) {//体验券{"num1":1} | 
|                 JSONObject jsonObject = JSON.parseObject(content); | 
|                 couponListVo.setUseCondition(""); | 
|                 couponListVo.setFavorable(jsonObject.getString("experienceName")); | 
|             } | 
|             listVos.add(couponListVo); | 
|         } | 
|         return listVos; | 
|     } | 
|   | 
|     @Override | 
|     public List<CouponPackageResp> queryCouponPackagesList(Integer uid, CouponPackageReq req) { | 
|         List<CouponPackageResp> respList = new ArrayList<>(); | 
|         AppUser appUser = appClient.queryAppUser(uid); | 
|         if (null != appUser) { | 
|             List<UserCoupon> userCoupons = this.baseMapper.selectList(new QueryWrapper<UserCoupon>() | 
|                     .eq("userId", appUser.getId()) | 
|                     .orderByDesc("insertTime")); | 
|             if (userCoupons.size() > 0) { | 
|                 for (UserCoupon userCoupon : userCoupons) { | 
|                     Coupon coupon = couponMapper.selectById(userCoupon.getCouponId()); | 
|                     CouponPackageResp packageResp = new CouponPackageResp(); | 
|                     packageResp.setId(coupon.getId()); | 
|                     packageResp.setName(coupon.getName()); | 
|                     packageResp.setType(coupon.getType()); | 
|                     packageResp.setUseCondition(coupon.getUseScope()); | 
|                     switch (coupon.getUseScope()) { | 
|                         case 1: | 
|                             packageResp.setAvailable("全国通用"); | 
|                             break; | 
|                         case 2: | 
|                             packageResp.setAvailable("指定城市可用"); | 
|                             List<CouponCity> couponId = couponCityMapper.selectList(new QueryWrapper<CouponCity>().eq("couponId", coupon.getId())); | 
|                             StringBuilder stringBuilder = new StringBuilder(); | 
|                             for (CouponCity couponCity : couponId) { | 
|                                 stringBuilder.append(couponCity.getCity()); | 
|                             } | 
|                             packageResp.setCityOrStore(String.valueOf(stringBuilder)); | 
|                             break; | 
|                         case 3: | 
|                             packageResp.setAvailable("指定门店可用"); | 
|                             CouponStore couponStore = csMapper.selectOne(new QueryWrapper<CouponStore>() | 
|                                     .eq("couponId", coupon.getId()).last("limit 1")); | 
|                             StoreDetailOfCourse courseOfStore = storeClient.getCourseOfStore(couponStore.getStoreId()); | 
| //                            packageResp.setCityOrStore(courseOfStore.getStoreName()+","+courseOfStore.getStoreAddr()); | 
|                             packageResp.setCityOrStore(courseOfStore.getStoreName()); | 
|                             break; | 
|                         default: | 
|                             break; | 
|                     } | 
|                     packageResp.setInstructionsForUse(coupon.getIllustrate()); | 
|                     ConponJsonRuleModel ruleModel = new ConponJsonRuleModel(); | 
|                     JSONObject jsonObject = JSON.parseObject(coupon.getContent()); | 
|                     switch (coupon.getType()) { | 
|                         case 1: | 
| //                        {"conditionalAmount":50,"deductionAmount":10,"experienceName":""} | 
| //                            满减券 | 
|                             Double num1 = jsonObject.getDouble("conditionalAmount"); | 
|                             Double num2 = jsonObject.getDouble("deductionAmount"); | 
|                             ruleModel.setConditionalAmount("满" + num1 + "可用"); | 
|                             ruleModel.setDeductionAmount("¥ " + num2); | 
|                             ruleModel.setExperienceName(""); | 
|                             break; | 
|                         case 2: | 
| //                            代金券 | 
|                             Double jsonObjectDouble = jsonObject.getDouble("conditionalAmount"); | 
|                             ruleModel.setConditionalAmount(""); | 
|                             ruleModel.setDeductionAmount("¥ " + jsonObjectDouble); | 
|                             ruleModel.setExperienceName(""); | 
|                             break; | 
|                         case 3: | 
| //                            体验券 | 
|                             ruleModel.setConditionalAmount(""); | 
|                             ruleModel.setDeductionAmount(""); | 
|                             ruleModel.setExperienceName(jsonObject.getString("experienceName")); | 
|                             break; | 
|                         default: | 
|                             break; | 
|                     } | 
|                     packageResp.setRuleModel(ruleModel); | 
|   | 
|                     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); | 
|                     packageResp.setEffectiveTime(simpleDateFormat.format(coupon.getEndTime())); | 
|   | 
|                     if (userCoupon.getStatus() == 1) { | 
|                         if (DateUtil.getDate().before(coupon.getEndTime())) { | 
|                             packageResp.setUseStatus(1); | 
|                         } else { | 
|                             packageResp.setUseStatus(3); | 
|                         } | 
|                     } | 
|                     if (userCoupon.getStatus() == 2) { | 
|                         packageResp.setUseStatus(2); | 
|                     } | 
|                     respList.add(packageResp); | 
|                 } | 
|                 if (null != req.getCouponType()) { | 
|                     respList = respList.stream() | 
|                             .filter(couponPackageResp -> couponPackageResp.getType().equals(req.getCouponType())) | 
|                             .collect(Collectors.toList()); | 
|                 } | 
|                 if (null != req.getUseStatus()) { | 
|                     respList = respList.stream() | 
|                             .filter(couponPackageResp -> couponPackageResp.getUseStatus().equals(req.getUseStatus())) | 
|                             .collect(Collectors.toList()); | 
|                 } | 
|             } | 
|   | 
|         } | 
|         return respList; | 
|     } | 
|   | 
| } |