package com.dsh.course.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsh.course.entity.CoursePackagePaymentConfig;
import com.dsh.course.entity.TCoursePackage;
import com.dsh.course.entity.TCoursePackageDiscount;
import com.dsh.course.entity.TCoursePackagePayment;
import com.dsh.course.feignclient.other.StoreClient;
import com.dsh.course.feignclient.other.model.GetDistanceVo;
import com.dsh.course.feignclient.other.model.Store;
import com.dsh.course.mapper.CoursePackagePaymentConfigMapper;
import com.dsh.course.mapper.TCoursePackageDiscountMapper;
import com.dsh.course.mapper.TCoursePackageMapper;
import com.dsh.course.mapper.TCoursePackagePaymentMapper;
import com.dsh.course.model.DiscountList;
import com.dsh.course.model.QueryDiscountList;
import com.dsh.course.model.vo.response.Details;
import com.dsh.course.model.vo.response.ExchangeCoursePackageResponse;
import com.dsh.course.service.TCoursePackageDiscountService;
import com.dsh.course.util.*;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
*
* 课包折扣 服务实现类
*
*
* @author administrator
* @since 2023-06-14
*/
@Service
public class TCoursePackageDiscountServiceImpl extends ServiceImpl implements TCoursePackageDiscountService {
@Resource
private TCoursePackageMapper tcpMapper;
@Resource
private TCoursePackagePaymentMapper tcppMapper;
@Resource
private CoursePackagePaymentConfigMapper cppcMapper;
@Resource
private StoreClient sreClient;
@Override
public List getWeeksBenefitCourse(Integer appUserId, Integer discountType, String lon, String lat) {
Date localTime = DateTimeHelper.getWXTime();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List list = new ArrayList<>();
QueryWrapper tCoursePackageDiscountQueryWrapper = new QueryWrapper<>();
tCoursePackageDiscountQueryWrapper.eq("auditStatus", 2).eq("status", 1);
List tCoursePackageDiscounts = new ArrayList<>();
int weekStr = LocalDateTimeUtils.getWeekStr();
if (null == discountType || discountType == 1) {
tCoursePackageDiscountQueryWrapper.eq("type", 3);
tCoursePackageDiscounts = this.baseMapper.selectList(tCoursePackageDiscountQueryWrapper);
if (tCoursePackageDiscounts.size() > 0) {
for (TCoursePackageDiscount tCoursePackageDiscount : tCoursePackageDiscounts) {
TCoursePackage coursePackage = tcpMapper.selectById(tCoursePackageDiscount.getCoursePackageId());
if (coursePackage.getState() == 2) {
continue;
}
// 判断预约人数是否已满
// Integer maxSubscribeNumber = coursePackage.getMaxSubscribeNumber();
// Integer integer = tcppMapper.selectCount(new QueryWrapper()
// .eq("appUserId",appUserId )
// .eq("status",1));
// if (integer >= maxSubscribeNumber){
// continue;
// }
try {
JSONArray jsonArray = JSON.parseArray(tCoursePackageDiscount.getContent());
JSONObject jsonObject = jsonArray.getJSONObject(0);
Date parse1 = null;
Date parse2 = null;
String startDate = jsonObject.getString("startDate");
String endDate = jsonObject.getString("endDate");
String startTime = jsonObject.getString("startTime");
String endTime = jsonObject.getString("endTime");
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String currentTime = sdf.format(new Date());
boolean isWithinTimeRange = false;
try {
Date currentTimeDate = sdf.parse(currentTime);
Date startTimeDate = sdf.parse(startTime);
Date endTimeDate = sdf.parse(endTime);
if (currentTimeDate.after(startTimeDate) && currentTimeDate.before(endTimeDate)) {
isWithinTimeRange = true;
}
} catch (Exception e) {
e.printStackTrace();
}
try {
parse1 = simpleDateFormat.parse(startDate);
parse2 = simpleDateFormat.parse(endDate);
} catch (ParseException e) {
throw new RuntimeException(e);
}
List weeks = jsonObject.getJSONArray("weeks").toJavaList(Integer.class);
Double cashPayment = jsonObject.getDouble("cashPayment");
Date tomorrowDate = null;
if (weekStr != 7) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(localTime);
calendar.add(Calendar.DAY_OF_WEEK, 1);
tomorrowDate = calendar.getTime();
}
boolean isWithinRange = false;
if (weeks.contains(weekStr)) {
isWithinRange = true;
}
if (isWithinRange) {
// 判断当前日期是否在开始时间和结束时间范围内
if (isDateWithinRange(localTime, parse1, parse2)) {
Details resde = new Details();
resde.setCoursePackageDiscountId(tCoursePackageDiscount.getId());
resde.setImage(coursePackage.getCoverDrawing());
resde.setCoursePackageName(coursePackage.getName());
CoursePackagePaymentConfig paymentConfig = cppcMapper.selectById(tCoursePackageDiscount.getCoursePackagePaymentConfigId());
resde.setCourseHours(paymentConfig.getClassHours());
resde.setDataTime("今日");
resde.setDate(localTime);
resde.setOriginalPrice(paymentConfig.getCashPayment());
resde.setDiscountPrice(cashPayment);
if (isWithinTimeRange) {
resde.setStatus(1);
} else {
resde.setStatus(2);
}
GetDistanceVo distanceVo = new GetDistanceVo();
distanceVo.setLatitude(lat);
distanceVo.setLongitude(lon);
distanceVo.setStoreId(coursePackage.getStoreId());
String s = sreClient.calculateDistance(distanceVo);
resde.setStoreDistance(s);
list.add(resde);
}
}
Calendar tempCalendar = Calendar.getInstance();
tempCalendar.setTime(localTime);
tempCalendar.add(Calendar.DAY_OF_WEEK, 1);
while (tempCalendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
Date tempDate = tempCalendar.getTime();
int weekNumOfDate = DateTimeHelper.getWeekNumOfDate(tempDate);
if (isDateWithinRange(tempDate, parse1, parse2) && weeks.contains(weekNumOfDate)) {
Details resde = new Details();
resde.setCoursePackageDiscountId(tCoursePackageDiscount.getId());
resde.setImage(coursePackage.getCoverDrawing());
resde.setCoursePackageName(coursePackage.getName());
CoursePackagePaymentConfig paymentConfig = cppcMapper.selectById(tCoursePackageDiscount.getCoursePackagePaymentConfigId());
resde.setCourseHours(paymentConfig.getClassHours());
String weekOfDate = "";
if (weekStr != 7 && tempDate.equals(tomorrowDate)) {
weekOfDate = "明日";
} else {
weekOfDate = DateTimeHelper.getWeekOfDate(tempDate);
}
resde.setDataTime(weekOfDate);
resde.setDate(tempDate);
resde.setOriginalPrice(paymentConfig.getCashPayment());
resde.setDiscountPrice(cashPayment);
resde.setStatus(2);
GetDistanceVo distanceVo = new GetDistanceVo();
distanceVo.setLatitude(lat);
distanceVo.setLongitude(lon);
distanceVo.setStoreId(coursePackage.getStoreId());
resde.setStoreDistance(sreClient.calculateDistance(distanceVo));
list.add(resde);
}
tempCalendar.add(Calendar.DAY_OF_WEEK, 1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
} else {
tCoursePackageDiscountQueryWrapper.eq("type", 4);
tCoursePackageDiscounts = this.baseMapper.selectList(tCoursePackageDiscountQueryWrapper);
if (tCoursePackageDiscounts.size() > 0) {
for (TCoursePackageDiscount tCoursePackageDiscount : tCoursePackageDiscounts) {
TCoursePackage coursePackage = tcpMapper.selectById(tCoursePackageDiscount.getCoursePackageId());
if (coursePackage.getState() == 2) {
continue;
}
// 判断预约人数是否已满
Integer maxSubscribeNumber = coursePackage.getMaxSubscribeNumber();
Integer integer = tcppMapper.selectCount(new QueryWrapper()
.eq("appUserId", appUserId)
.eq("status", 1));
if (integer >= maxSubscribeNumber) {
continue;
}
try {
JSONArray jsonArray = JSON.parseArray(tCoursePackageDiscount.getContent());
JSONObject jsonObject = jsonArray.getJSONObject(0);
Date parse1 = null;
Date parse2 = null;
String startDate = jsonObject.getString("startDate");
String endDate = jsonObject.getString("endDate");
String startTime = jsonObject.getString("startTime");
String endTime = jsonObject.getString("endTime");
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String currentTime = sdf.format(new Date());
boolean isWithinTimeRange = false;
try {
Date currentTimeDate = sdf.parse(currentTime);
Date startTimeDate = sdf.parse(startTime);
Date endTimeDate = sdf.parse(endTime);
if (currentTimeDate.after(startTimeDate) && currentTimeDate.before(endTimeDate)) {
isWithinTimeRange = true;
}
} catch (Exception e) {
e.printStackTrace();
}
try {
parse1 = simpleDateFormat.parse(startDate);
parse2 = simpleDateFormat.parse(endDate);
} catch (ParseException e) {
throw new RuntimeException(e);
}
List weeks = jsonObject.getJSONArray("weeks").toJavaList(Integer.class);
Integer cashPayment = jsonObject.getInteger("hour");
Date tomorrowDate = null;
if (weekStr != 7) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(localTime);
calendar.add(Calendar.DAY_OF_WEEK, 1);
tomorrowDate = calendar.getTime();
}
boolean isWithinRange = false;
if (weeks.contains(weekStr)) {
isWithinRange = true;
}
if (isWithinRange) {
// 判断当前日期是否在开始时间和结束时间范围内
if (isDateWithinRange(localTime, parse1, parse2)) {
Details resde = new Details();
resde.setCoursePackageDiscountId(tCoursePackageDiscount.getId());
resde.setImage(coursePackage.getCoverDrawing());
resde.setCoursePackageName(coursePackage.getName());
CoursePackagePaymentConfig paymentConfig = cppcMapper.selectById(tCoursePackageDiscount.getCoursePackagePaymentConfigId());
resde.setCourseHours(paymentConfig.getClassHours());
resde.setDonateHours(cashPayment);
resde.setCoin(paymentConfig.getPlayPaiCoin());
resde.setDataTime("今日");
resde.setDate(localTime);
resde.setOriginalPrice(paymentConfig.getCashPayment());
if (isWithinTimeRange) {
resde.setStatus(1);
} else {
resde.setStatus(2);
}
GetDistanceVo distanceVo = new GetDistanceVo();
distanceVo.setLatitude(lat);
distanceVo.setLongitude(lon);
distanceVo.setStoreId(coursePackage.getStoreId());
resde.setStoreDistance(sreClient.calculateDistance(distanceVo));
list.add(resde);
}
}
Calendar tempCalendar = Calendar.getInstance();
tempCalendar.setTime(localTime);
tempCalendar.add(Calendar.DAY_OF_WEEK, 1);
while (tempCalendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
Date tempDate = tempCalendar.getTime();
int weekNumOfDate = DateTimeHelper.getWeekNumOfDate(tempDate);
if (isDateWithinRange(tempDate, parse1, parse2) && weeks.contains(weekNumOfDate)) {
Details resde = new Details();
resde.setCoursePackageDiscountId(tCoursePackageDiscount.getId());
resde.setImage(coursePackage.getCoverDrawing());
resde.setCoursePackageName(coursePackage.getName());
CoursePackagePaymentConfig paymentConfig = cppcMapper.selectById(tCoursePackageDiscount.getCoursePackagePaymentConfigId());
resde.setCourseHours(paymentConfig.getClassHours());
resde.setDonateHours(cashPayment);
String weekOfDate = "";
resde.setCoin(paymentConfig.getPlayPaiCoin());
if (weekStr != 7 && tempDate.equals(tomorrowDate)) {
weekOfDate = "明日";
} else {
weekOfDate = DateTimeHelper.getWeekOfDate(tempDate);
}
resde.setDataTime(weekOfDate);
resde.setDate(tempDate);
resde.setOriginalPrice(paymentConfig.getCashPayment());
resde.setStatus(2);
GetDistanceVo distanceVo = new GetDistanceVo();
distanceVo.setLatitude(lat);
distanceVo.setLongitude(lon);
distanceVo.setStoreId(coursePackage.getStoreId());
resde.setStoreDistance(sreClient.calculateDistance(distanceVo));
list.add(resde);
}
tempCalendar.add(Calendar.DAY_OF_WEEK, 1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
System.out.println("list" + list);
return list;
}
@Override
public ExchangeCoursePackageResponse getWeekFreeCourseDetails(Integer coursePackageDiscountId, String lat, String lon) {
ExchangeCoursePackageResponse packageResponse = new ExchangeCoursePackageResponse();
TCoursePackageDiscount coursePackageDiscount = this.baseMapper.selectById(coursePackageDiscountId);
Integer coursePackageId = coursePackageDiscount.getCoursePackageId();
packageResponse.setCoursePackageDiscountId(coursePackageId);
TCoursePackage coursePackage = tcpMapper.selectById(coursePackageId);
packageResponse.setType(coursePackage.getType());
packageResponse.setCoverDrawing(coursePackage.getCoverDrawing());
packageResponse.setIntroduceDrawing(coursePackage.getIntroduceDrawing());
packageResponse.setCoursePackageName(coursePackage.getName());
packageResponse.setDetailDrawing(coursePackage.getDetailDrawing());
// packageResponse.setPayType(coursePackage.getPayType());
if (coursePackage.getType() == 2) {
Date startTime = coursePackage.getStartTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
String formattedDate = sdf.format(startTime);
Date endTime = coursePackage.getEndTime();
String formattedDate1 = sdf.format(endTime);
packageResponse.setHoliTime(formattedDate + "-" + formattedDate1);
}
Store store = sreClient.queryStoreById(coursePackage.getStoreId());
packageResponse.setStoreNameAddr(store.getName() + "(" + store.getAddress() + ")");
GetDistanceVo distanceVo = new GetDistanceVo();
if (ToolUtil.isNotEmpty(lon) && ToolUtil.isNotEmpty(lat)) {
Map distance = GeodesyUtil.getDistance(lon + "," + lat, store.getLon() + "," + store.getLat());
double wgs84 = new BigDecimal(distance.get("WGS84")).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
packageResponse.setDistance(wgs84);
}
// distanceVo.setLatitude(lat);
// distanceVo.setLongitude(lon);
// distanceVo.setStoreId(coursePackage.getStoreId());
// String s = sreClient.calculateDistance(distanceVo);
//
//
// packageResponse.setDistance(Double.valueOf(s));
if (coursePackageDiscount.getType() == 1 || coursePackageDiscount.getType() == 2) {
return packageResponse;
}
JSONArray jsonArray = JSON.parseArray(coursePackageDiscount.getContent());
JSONObject jsonObject = jsonArray.getJSONObject(0);
CoursePackagePaymentConfig paymentConfig = cppcMapper.selectById(coursePackageDiscount.getCoursePackagePaymentConfigId());
if (coursePackageDiscount.getType() == 3 || coursePackageDiscount.getType() == 4) {
Double cashPayment = jsonObject.getDouble("cashPayment");
if (ToolUtil.isNotEmpty(paymentConfig.getCashPayment()) && paymentConfig.getCashPayment() > 0 && ToolUtil.isNotEmpty(paymentConfig.getPlayPaiCoin()) && paymentConfig.getPlayPaiCoin() > 0) {
packageResponse.setPayType(3);
} else if (ToolUtil.isNotEmpty(paymentConfig.getCashPayment()) && paymentConfig.getCashPayment() > 0) {
packageResponse.setPayType(1);
} else if (ToolUtil.isNotEmpty(paymentConfig.getPlayPaiCoin()) && paymentConfig.getPlayPaiCoin() > 0) {
packageResponse.setPayType(2);
}
packageResponse.setClassHours(paymentConfig.getClassHours());
packageResponse.setCostPrice(paymentConfig.getCashPayment());
if (paymentConfig.getPlayPaiCoin() != null) {
packageResponse.setWanpaiGold(paymentConfig.getPlayPaiCoin());
}
if (cashPayment != null) {
packageResponse.setDiscountPrice(cashPayment);
} else {
packageResponse.setDiscountPrice(paymentConfig.getCashPayment());
// packageResponse.setCostPrice(null);
}
Integer cashPayment1 = jsonObject.getInteger("hour");
packageResponse.setFreeClassHours(cashPayment1);
} else {
packageResponse.setClassHours(paymentConfig.getClassHours());
Integer cashPayment = jsonObject.getInteger("hour");
packageResponse.setFreeClassHours(cashPayment);
packageResponse.setCostPrice(paymentConfig.getCashPayment());
TCoursePackageDiscount coursePackageDiscount1 = this.baseMapper.selectOne(new QueryWrapper()
.eq("type", 1)
.eq("coursePackageId", coursePackage.getId()));
String content = coursePackageDiscount1.getContent();
JSONObject jsonObject1 = JSON.parseObject(content);
Double vipPrice = jsonObject1.getDouble("num1");
packageResponse.setDiscountPrice(vipPrice);
packageResponse.setWanpaiGold(paymentConfig.getPlayPaiCoin());
}
String[] split = coursePackage.getClassWeeks().split(";");
if (split.length > 0) {
StringBuilder courWeeks = new StringBuilder("每");
for (String integer : split) {
courWeeks.append(integer).append("、");
}
if (courWeeks.length() > 0 && courWeeks.charAt(courWeeks.length() - 1) == '、') {
courWeeks.deleteCharAt(courWeeks.length() - 1);
}
packageResponse.setWeekTime(courWeeks.toString());
}
String classStartTime = coursePackage.getClassStartTime();
String classEndTime = coursePackage.getClassEndTime();
ArrayList classTime = new ArrayList<>();
String[] split4 = classStartTime.split(",");
String[] split3 = classEndTime.split(",");
if (ToolUtil.isNotEmpty(classStartTime)) {
for (int i = 0; i < split4.length; i++) {
String s = split4[i].substring(0, 5) + "-" + split3[i].substring(0, 5);
classTime.add(s);
}
}
String classTimeAsString = String.join(" | ", classTime);
packageResponse.setTime(classTimeAsString);
return packageResponse;
}
@Override
public List queryDiscountListAudit(QueryDiscountList queryDiscountList) {
Page discountListPage = new Page<>(queryDiscountList.getOffset(), queryDiscountList.getLimit());
List discountLists = this.baseMapper.queryDiscountListAudit(discountListPage,
queryDiscountList.getPCode(),
queryDiscountList.getCCode(),
queryDiscountList.getName(),
queryDiscountList.getType(),
queryDiscountList.getIds());
for (DiscountList discountList : discountLists) {
List tCoursePackageDiscounts = this.baseMapper
.selectList(new LambdaQueryWrapper()
.eq(TCoursePackageDiscount::getCoursePackageId, discountList.getCourseId())
.ne(TCoursePackageDiscount::getAuditStatus, 2)
.orderByAsc(TCoursePackageDiscount::getType));
// long count = tCoursePackageDiscounts.stream()
// .filter(e -> e.getAuditStatus().equals(2)).count();
// if(count>0){
// discountList.setStatus(2);
// }else {
// discountList.setStatus(1);
// }
String type = "";
for (int i = 0; i < tCoursePackageDiscounts.size(); i++) {
if (tCoursePackageDiscounts.get(i).getType() == 1) {
type += "会员折扣、";
} else if (tCoursePackageDiscounts.get(i).getType() == 2) {
type += "续课优惠、";
} else if (tCoursePackageDiscounts.get(i).getType() == 3) {
type += "限时折扣、";
} else if (tCoursePackageDiscounts.get(i).getType() == 4) {
type += "赠送课时、";
}
}
if (type.length() > 0) {
type = type.substring(0, type.length() - 1);
}
discountList.setType(type);
}
return discountLists;
}
@Override
public List queryDiscountList(QueryDiscountList queryDiscountList) {
Page discountListPage = new Page<>(queryDiscountList.getOffset(), queryDiscountList.getLimit());
List ids = queryDiscountList.getIds();
if (ids.size() == 0) {
ids.add(-1);
queryDiscountList.setIds(ids);
}
List discountLists = this.baseMapper.queryDiscountList(discountListPage,
queryDiscountList.getPCode(), queryDiscountList.getCCode(),
queryDiscountList.getName(), queryDiscountList.getType(), queryDiscountList.getIds());
for (DiscountList discountList : discountLists) {
List tCoursePackageDiscounts = this.baseMapper.selectList
(new LambdaQueryWrapper()
.eq(TCoursePackageDiscount::getCoursePackageId,
discountList.getCourseId())
.orderByAsc(TCoursePackageDiscount::getType));
String type = "";
for (int i = 0; i < tCoursePackageDiscounts.size(); i++) {
if (tCoursePackageDiscounts.get(i).getType() == 1) {
type += "会员折扣、";
} else if (tCoursePackageDiscounts.get(i).getType() == 2) {
type += "续课优惠、";
} else if (tCoursePackageDiscounts.get(i).getType() == 3) {
type += "限时折扣、";
} else if (tCoursePackageDiscounts.get(i).getType() == 4) {
type += "赠送课时、";
}
}
if (type.length() > 0) {
type = type.substring(0, type.length() - 1);
}
discountList.setType(type);
}
return discountLists;
}
private static boolean isDateWithinRange(Date date, Date startTime, Date endTime) {
return date.after(startTime) && date.before(endTime);
}
}