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; /** *

* 用户优惠券领取记录 服务实现类 *

* * @author jqs * @since 2023-06-29 */ @Service public class UserCouponServiceImpl extends ServiceImpl 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 queryAvailableCouponList(Integer uid, Integer coursePackageId, Double price, String lon, String lat) throws Exception { CoursePackage coursePackage = coursePackageClient.queryCoursePackageById(coursePackageId); Integer storeId = coursePackage.getStoreId(); Map geocode = gdMapGeocodingUtil.geocode(lon, lat); String provinceCode = geocode.get("provinceCode"); String cityCode = geocode.get("cityCode"); List> userCoupons = this.baseMapper.queryAvailableCouponList(uid, storeId, provinceCode, cityCode); List listVos = new ArrayList<>(); for (Map 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 querySiteCouponList(Integer uid, Integer siteId, Double price, String lon, String lat) throws Exception { Site site = siteClient.querySiteById(siteId); Integer storeId = site.getStoreId(); Map geocode = gdMapGeocodingUtil.geocode(lon, lat); String provinceCode = geocode.get("provinceCode"); String cityCode = geocode.get("cityCode"); List> userCoupons = this.baseMapper.queryAvailableCouponList(uid, storeId, provinceCode, cityCode); List listVos = new ArrayList<>(); for (Map 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 queryCouponPackagesList(Integer uid, CouponPackageReq req) { List respList = new ArrayList<>(); AppUser appUser = appClient.queryAppUser(uid); if (null != appUser) { List userCoupons = this.baseMapper.selectList(new QueryWrapper() .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 couponId = couponCityMapper.selectList(new QueryWrapper().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() .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; } }