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;
|
}
|
|
}
|