puzhibing
2023-07-04 60ef8b4a95540dfab9df0447364ee40c18354010
cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java
@@ -1,13 +1,35 @@
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.QueryWrapper;
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.feignclient.account.AppUserClient;
import com.dsh.course.feignclient.account.model.AppUser;
import com.dsh.course.feignclient.other.StoreClient;
import com.dsh.course.feignclient.other.model.Store;
import com.dsh.course.mapper.TCoursePackageMapper;
import com.dsh.course.feignclient.model.CourseOfStoreVo;
import com.dsh.course.model.CoursePackageList;
import com.dsh.course.model.CoursePackageListVo;
import com.dsh.course.service.ICoursePackagePaymentConfigService;
import com.dsh.course.service.TCoursePackageDiscountService;
import com.dsh.course.service.TCoursePackagePaymentService;
import com.dsh.course.service.TCoursePackageService;
import com.dsh.course.util.GDMapGeocodingUtil;
import com.dsh.course.util.GeodesyUtil;
import com.dsh.course.util.ToolUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
 * <p>
@@ -20,8 +42,179 @@
@Service
public class TCoursePackageServiceImpl extends ServiceImpl<TCoursePackageMapper, TCoursePackage> implements TCoursePackageService {
    @Resource
    private StoreClient storeClient;
    @Autowired
    private GDMapGeocodingUtil gdMapGeocodingUtil;
    @Autowired
    private TCoursePackagePaymentService coursePackagePaymentService;
    @Autowired
    private ICoursePackagePaymentConfigService coursePackagePaymentConfigService;
    @Autowired
    private TCoursePackageDiscountService coursePackageDiscountService;
    @Resource
    private AppUserClient appUserClient;
    @Override
    public List<CourseOfStoreVo> queryStoreOfCourse() {
        return this.baseMapper.queryStoreOfCourse();
    }
    /**
     * 获取课程列表
     * @param coursePackageList
     * @return
     * @throws Exception
     */
    @Override
    public List<CoursePackageListVo> queryCourseList(Integer uid, CoursePackageList coursePackageList) throws Exception {
        AppUser appUser = appUserClient.queryAppUser(uid);
        Map<String, String> geocode = gdMapGeocodingUtil.geocode(coursePackageList.getLon(), coursePackageList.getLat());
        String provinceCode = geocode.get("provinceCode");
        String cityCode = geocode.get("cityCode");
        QueryWrapper<TCoursePackage> wrapper = new QueryWrapper<TCoursePackage>().in("status", Arrays.asList(1, 2))
                .eq("auditStatus", 2).eq("state", 1).eq("provinceCode", provinceCode).eq("cityCode", cityCode);
        if(null != coursePackageList.getCoursePackageTypeId()){
            wrapper.eq("coursePackageTypeId", coursePackageList.getCoursePackageTypeId());
        }
        if(null != coursePackageList.getStoreId()){
            wrapper.eq("storeId", coursePackageList.getStoreId());
        }
        if(null != coursePackageList.getStoreId()){
            wrapper.eq("storeId", coursePackageList.getStoreId());
        }
        if(ToolUtil.isNotEmpty(coursePackageList.getSearch())){
            wrapper.like("name", coursePackageList.getSearch());
            List<Store> stores = storeClient.queryStoreListByName(coursePackageList.getSearch());
            List<Integer> collect = stores.stream().map(Store::getId).collect(Collectors.toList());
            if(collect.size() > 0){
                wrapper.or().in("id", collect);
            }
        }
        List<TCoursePackage> list = this.list(wrapper.last(" order by sort, insertTime desc"));
        List<CoursePackageListVo> listVos = new ArrayList<>();
        for (TCoursePackage coursePackage : list) {
            Store store = storeClient.queryStoreById(coursePackage.getStoreId());
            Integer integer = coursePackagePaymentService.queryCountNumber(coursePackage.getId());
            CoursePackagePaymentConfig coursePackagePaymentConfig = coursePackagePaymentConfigService.getOne(new QueryWrapper<CoursePackagePaymentConfig>()
                    .eq("coursePackageId", coursePackage.getId()).last(" order by if(payType = 1, cashPayment, playPaiCoin)"));
            CoursePackageListVo coursePackageListVo = new CoursePackageListVo();
            coursePackageListVo.setId(coursePackage.getId());
            coursePackageListVo.setName(coursePackage.getName());
            coursePackageListVo.setStoreName(null != store ? store.getName() : "");
            coursePackageListVo.setCoverDrawing(coursePackage.getCoverDrawing());
            coursePackageListVo.setClassStartTime(coursePackage.getClassStartTime() + "-" + coursePackage.getClassEndTime());
            coursePackageListVo.setApplicantsNumber(integer);
            coursePackageListVo.setOriginalPrice(coursePackagePaymentConfig.getPayType() == 1 ? coursePackagePaymentConfig.getCashPayment() : coursePackagePaymentConfig.getPlayPaiCoin().doubleValue());
            TCoursePackageDiscount coursePackageDiscount = coursePackageDiscountService.getOne(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackageId", coursePackage.getId()).eq("auditStatus", 2).eq("type", 1));
            if(1 == appUser.getIsVip() && null != coursePackageDiscount){
                //{"num1":100}
                JSONObject jsonObject = JSON.parseObject(coursePackageDiscount.getContent());
                coursePackageListVo.setVipPrice(jsonObject.getDouble("num1"));
            }
            coursePackageDiscount = coursePackageDiscountService.getOne(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackageId", coursePackage.getId()).eq("auditStatus", 2).eq("type", 3));
            if(null == coursePackageDiscount){
                coursePackageListVo.setPaymentPrice(coursePackageListVo.getOriginalPrice());
            }else{
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                /**
                 * [{
                 *    "startDate": "2023-01-01 00:00:00",
                 *    "endDate": "2023-12-31 23:59:59",
                 *    "startTime": "02:00:00",
                 *    "endTime": "23:00:00",
                 *    "weeks": [1, 2, 7],
                 *    "cashPayment": 100
                 * }]
                 */
                JSONArray jsonArray = JSON.parseArray(coursePackageDiscount.getContent());
                for (int i = 0; i < jsonArray.size(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    String startDate = jsonObject.getString("startDate");
                    String endDate = jsonObject.getString("endDate");
                    String startTime = jsonObject.getString("startTime");
                    String endTime = jsonObject.getString("endTime");
                    List<Integer> weeks = jsonObject.getJSONArray("weeks").toJavaList(Integer.class);
                    Double cashPayment = jsonObject.getDouble("cashPayment");
                    Date startDate_date = sdf.parse(startDate);
                    Date endDate_date = sdf.parse(endDate);
                    long timeMillis = System.currentTimeMillis();
                    if(timeMillis >= startDate_date.getTime() && timeMillis < endDate_date.getTime()){
                        Date date = new Date();
                        Calendar calendar = Calendar.getInstance();
                        calendar.setTime(date);
                        int week = calendar.get(Calendar.DAY_OF_WEEK);
                        boolean isFirstSunday = (calendar.getFirstDayOfWeek() == Calendar.SUNDAY);
                        if(isFirstSunday){
                            week = week - 1;
                            if(week == 0){
                                week = 7;
                            }
                        }
                        if(!weeks.contains(week)){
                            continue;
                        }
                        String[] split = startTime.split(":");
                        Integer hour1 = Integer.valueOf(split[0]);
                        Calendar s = Calendar.getInstance();
                        s.setTime(date);
                        s.set(Calendar.HOUR_OF_DAY, hour1);
                        s.set(Calendar.MINUTE, Integer.valueOf(split[1]));
                        s.set(Calendar.SECOND, Integer.valueOf(split[2]));
                        String[] split1 = endTime.split(":");
                        Integer hour2 = Integer.valueOf(split1[0]);
                        Calendar e = Calendar.getInstance();
                        e.setTime(date);
                        e.set(Calendar.HOUR_OF_DAY, hour2);
                        e.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
                        e.set(Calendar.SECOND, Integer.valueOf(split1[2]));
                        if(hour1 > hour2){
                            if(s.getTimeInMillis() > date.getTime()){
                                s.set(Calendar.DAY_OF_YEAR, s.get(Calendar.DAY_OF_YEAR) - 1);
                            }else{
                                e.set(Calendar.DAY_OF_YEAR, e.get(Calendar.DAY_OF_YEAR) + 1);
                            }
                        }
                        if(timeMillis >= s.getTimeInMillis() && timeMillis < e.getTimeInMillis()){
                            coursePackageListVo.setPaymentPrice(cashPayment);
                        }
                    }
                }
            }
            Map<String, Double> distance = GeodesyUtil.getDistance(coursePackageList.getLon() + "," + coursePackageList.getLat(), store.getLon() + "," + store.getLat());
            coursePackageListVo.setDistance(distance.get("WGS84") / 1000);
            listVos.add(coursePackageListVo);
        }
        //销量排行
        if(ToolUtil.isNotEmpty(coursePackageList.getSalesRanking())){
            Collections.sort(listVos, new Comparator<CoursePackageListVo>() {
                public int compare(CoursePackageListVo s1, CoursePackageListVo s2) {
                    return Integer.compare(s1.getApplicantsNumber(), s2.getApplicantsNumber());
                }
            });
        }
        //距离排行
        if(ToolUtil.isNotEmpty(coursePackageList.getDistanceSort())){
            Collections.sort(listVos, new Comparator<CoursePackageListVo>() {
                public int compare(CoursePackageListVo s1, CoursePackageListVo s2) {
                    return Double.compare(s1.getDistance(), s2.getDistance());
                }
            });
        }
        return listVos;
    }
}