package com.dsh.communityWorldCup.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.communityWorldCup.entity.*;
|
import com.dsh.communityWorldCup.feignclient.account.AppUserClient;
|
import com.dsh.communityWorldCup.feignclient.account.StudentClient;
|
import com.dsh.communityWorldCup.feignclient.account.model.AppUser;
|
import com.dsh.communityWorldCup.feignclient.account.model.TStudent;
|
import com.dsh.communityWorldCup.feignclient.competition.ParticipantClient;
|
import com.dsh.communityWorldCup.feignclient.competition.model.Participant;
|
import com.dsh.communityWorldCup.feignclient.course.CoursePackageOrderStudentClient;
|
import com.dsh.communityWorldCup.feignclient.course.model.CoursePackageOrderStudent;
|
import com.dsh.communityWorldCup.feignclient.other.StoreClient;
|
import com.dsh.communityWorldCup.feignclient.other.model.Store;
|
import com.dsh.communityWorldCup.mapper.WorldCupMapper;
|
import com.dsh.communityWorldCup.model.*;
|
import com.dsh.communityWorldCup.service.*;
|
import com.dsh.communityWorldCup.util.GeodesyUtil;
|
import com.dsh.communityWorldCup.util.PayMoneyUtil;
|
import com.dsh.communityWorldCup.util.ResultUtil;
|
import com.dsh.communityWorldCup.util.UUIDUtil;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author zhibing.pu
|
* @Date 2024/2/18 17:11
|
*/
|
@Service
|
public class WorldCupServiceImpl extends ServiceImpl<WorldCupMapper, WorldCup> implements IWorldCupService {
|
|
@Autowired
|
private IWorldCupCompetitorService worldCupCompetitorService;
|
|
@Autowired
|
private IWorldCupPaymentParticipantService worldCupPaymentParticipantService;
|
|
@Resource
|
private StoreClient storeClient;
|
|
@Autowired
|
private IWorldCupStoreService worldCupStoreService;
|
|
@Resource
|
private StudentClient studentClient;
|
|
@Resource
|
private ParticipantClient participantClient;
|
|
@Autowired
|
private IWorldCupPaymentService worldCupPaymentService;
|
|
@Autowired
|
private PayMoneyUtil payMoneyUtil;
|
|
@Resource
|
private AppUserClient appUserClient;
|
|
@Resource
|
private CoursePackageOrderStudentClient coursePackageOrderStudentClient;
|
|
|
|
|
|
/**
|
* 裁判获取世界杯列表数据
|
* @return
|
*/
|
@Override
|
public List<WorldCupListCoachVo> getWorldCupListCoach(WorldCupListCoach worldCupListCoach) {
|
List<WorldCupListCoachVo> worldCupListCoach1 = this.baseMapper.getWorldCupListCoach(worldCupListCoach);
|
//对查询结果进行距离排序(直线距离)
|
Collections.sort(worldCupListCoach1, new Comparator<WorldCupListCoachVo>() {
|
@Override
|
public int compare(WorldCupListCoachVo o1, WorldCupListCoachVo o2) {
|
Map<String, Double> distance1 = GeodesyUtil.getDistance(o1.getLon() + "," + o1.getLat(), worldCupListCoach.getLon() + "," + worldCupListCoach.getLat());
|
Double wgs841 = distance1.get("WGS84");
|
Map<String, Double> distance2 = GeodesyUtil.getDistance(o2.getLon() + "," + o2.getLat(), worldCupListCoach.getLon() + "," + worldCupListCoach.getLat());
|
Double wgs842 = distance2.get("WGS84");
|
return wgs841.compareTo(wgs842);
|
}
|
});
|
return worldCupListCoach1;
|
}
|
|
|
/**
|
* 开启世界杯赛事
|
* @param startWorldCup
|
* @return
|
*/
|
@Override
|
public ResultUtil startWorldCup(StartWorldCup startWorldCup) {
|
//先检测当前是否已经结束
|
|
WorldCup worldCup = this.getById(startWorldCup.getWorldCupId());
|
if(worldCup.getStartTime().getTime() > System.currentTimeMillis()){
|
return ResultUtil.error("赛事还未开始");
|
}
|
if(worldCup.getEndTime().getTime() <= System.currentTimeMillis()){
|
return ResultUtil.error("赛事已结束");
|
}
|
if(worldCup.getStatus() == 4){
|
return ResultUtil.error("赛事已取消");
|
}
|
String people = startWorldCup.getPeople();
|
JSONArray jsonArray = JSON.parseArray(people);
|
String timeStr = UUIDUtil.getTimeStr() + UUIDUtil.getNumberRandom(3);
|
for (int i = 0; i < jsonArray.size(); i++) {
|
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
Integer id = jsonObject.getInteger("id");
|
Integer participantType = jsonObject.getInteger("participantType");
|
String type = jsonObject.getString("type");
|
WorldCupCompetitor worldCupCompetitor = new WorldCupCompetitor();
|
worldCupCompetitor.setCode(timeStr);
|
worldCupCompetitor.setWorldCupId(startWorldCup.getWorldCupId());
|
worldCupCompetitor.setParticipantType(participantType);
|
WorldCupPaymentParticipant worldCupPaymentParticipant = worldCupPaymentParticipantService.getWorldCupPaymentParticipant(startWorldCup.getWorldCupId(), participantType, id);
|
worldCupCompetitor.setAppUserId(worldCupPaymentParticipant.getAppUserId());
|
worldCupCompetitor.setParticipantId(id);
|
worldCupCompetitor.setParticipant("blue".equals(type) ? 1 : 2);
|
worldCupCompetitor.setStartTime(new Date());
|
worldCupCompetitorService.save(worldCupCompetitor);
|
}
|
//调接口开启游戏
|
|
return ResultUtil.success();
|
}
|
|
|
/**
|
* 获取用户完成赛事没有提示的数据
|
* @param uid
|
* @return
|
*/
|
@Override
|
public Integer getCompletedWorldCupTips(Integer uid) {
|
int count = worldCupCompetitorService.count(new QueryWrapper<WorldCupCompetitor>()
|
.eq("appUserId", uid).eq("tips", 0).isNotNull("endTime"));
|
return count;
|
}
|
|
|
/**
|
* 获取社区世界杯列表
|
* @param worldCupList
|
* @return
|
*/
|
@Override
|
public List<WorldCupListVo> getWorldCupList(WorldCupList worldCupList) {
|
//没有筛选门店,默认使用当前门店
|
if(null == worldCupList.getStoreId()){
|
worldCupList.setStoreId(worldCupList.getStoreId());
|
}
|
return this.baseMapper.getWorldCupList(worldCupList);
|
}
|
|
|
/**
|
* 获取世界杯详情
|
* @param id
|
* @return
|
*/
|
@Override
|
public WorldCupInfo getWorldCupInfo(Integer id) {
|
WorldCupInfo worldCupInfo = this.baseMapper.getWorldCupInfo(id);
|
List<WorldCupStore> worldCupStores = worldCupStoreService.list(new QueryWrapper<WorldCupStore>().eq("worldCupId", id));
|
JSONArray jsonArray = new JSONArray();
|
for (WorldCupStore worldCupStore : worldCupStores) {
|
Store store = storeClient.queryStoreById(worldCupStore.getStoreId());
|
jsonArray.add(store.getName());
|
}
|
worldCupInfo.setStores(jsonArray.toJSONString());
|
return worldCupInfo;
|
}
|
|
|
/**
|
* 报名前校验支付方式
|
* @param checkPaymentMethod
|
* @return
|
*/
|
@Override
|
public CheckPaymentMethodVo checkPaymentMethod(CheckPaymentMethod checkPaymentMethod) {
|
WorldCup worldCup = this.getById(checkPaymentMethod.getId());
|
JSONArray jsonArray = JSON.parseArray(checkPaymentMethod.getIds());
|
CheckPaymentMethodVo checkPaymentMethodVo = new CheckPaymentMethodVo();
|
AppUser appUser = appUserClient.getAppUser(checkPaymentMethod.getUid());
|
BigDecimal multiply = new BigDecimal(jsonArray.size()).multiply(new BigDecimal(worldCup.getPaiCoin()));
|
if(appUser.getPlayPaiCoins() < multiply.intValue()){
|
checkPaymentMethodVo.setPaiCoin(0);
|
}else{
|
checkPaymentMethodVo.setPaiCoin(1);
|
}
|
|
int classHour = 1;
|
for (int i = 0; i < jsonArray.size(); i++) {
|
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
Integer id = jsonObject.getInteger("id");
|
//是否是学员(0=否,1=是)
|
Integer isStudent = jsonObject.getInteger("isStudent");
|
if(0 == isStudent){
|
classHour = 0;
|
break;
|
}
|
List<CoursePackageOrderStudent> coursePackageOrderStudent = coursePackageOrderStudentClient.getCoursePackageOrderStudent(id);
|
int sum = coursePackageOrderStudent.stream().mapToInt(CoursePackageOrderStudent::getLaveClassHours).sum();
|
if(sum < worldCup.getClassHour()){
|
classHour = 0;
|
break;
|
}
|
}
|
checkPaymentMethodVo.setClassHour(classHour);
|
return checkPaymentMethodVo;
|
}
|
|
|
|
|
|
/**
|
* 报名世界杯
|
* @param paymentWorldCup
|
* @return
|
*/
|
@Override
|
public ResultUtil paymentWorldCup(PaymentWorldCup paymentWorldCup) {
|
WorldCup worldCup = this.getById(paymentWorldCup.getId());
|
if(null == worldCup){
|
return ResultUtil.error("报名数据异常");
|
}
|
if(System.currentTimeMillis() > worldCup.getRegistrationClosingTime().getTime()){
|
return ResultUtil.error("报名时间已结束,无法完成报名");
|
}
|
if(System.currentTimeMillis() > worldCup.getEndTime().getTime()){
|
return ResultUtil.error("世界杯赛事已结束,无法完成报名");
|
}
|
String ids = paymentWorldCup.getIds();
|
JSONArray jsonArray = JSON.parseArray(ids);
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
|
for (int i = 0; i < jsonArray.size(); i++) {
|
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
Integer id = jsonObject.getInteger("id");
|
//是否是学员(0=否,1=是)
|
Integer isStudent = jsonObject.getInteger("isStudent");
|
if(isStudent == 1){
|
TStudent tStudent = studentClient.queryById(id);
|
if(worldCup.getStartAge() > Integer.valueOf(sdf.format(tStudent.getBirthday()))){
|
return ResultUtil.error("【" + tStudent.getName() + "】年龄不符合要求");
|
}
|
if(worldCup.getEndAge() < Integer.valueOf(sdf.format(tStudent.getBirthday()))){
|
return ResultUtil.error("【" + tStudent.getName() + "】年龄不符合要求");
|
}
|
}else{
|
Participant participant = participantClient.getParticipant(id);
|
if(worldCup.getStartAge() > Integer.valueOf(sdf.format(participant.getBirthday()))){
|
return ResultUtil.error("【" + participant.getName() + "】年龄不符合要求");
|
}
|
if(worldCup.getEndAge() < Integer.valueOf(sdf.format(participant.getBirthday()))){
|
return ResultUtil.error("【" + participant.getName() + "】年龄不符合要求");
|
}
|
}
|
}
|
|
//开始支付操作
|
ResultUtil payment = null;
|
try {
|
payment = payment(worldCup, paymentWorldCup);
|
} catch (Exception e) {
|
throw new RuntimeException(e);
|
}
|
return payment;
|
}
|
|
|
/**
|
* 支付逻辑
|
* @param worldCup
|
* @param paymentWorldCup
|
* @return
|
* @throws Exception
|
*/
|
private ResultUtil payment(WorldCup worldCup, PaymentWorldCup paymentWorldCup) throws Exception {
|
WorldCupPayment worldCupPayment = new WorldCupPayment();
|
worldCupPayment.setCode(UUIDUtil.getTimeStr() + UUIDUtil.getNumberRandom(5));
|
worldCupPayment.setWorldCupId(paymentWorldCup.getId());
|
worldCupPayment.setAppUserId(paymentWorldCup.getUid());
|
worldCupPayment.setPayType(paymentWorldCup.getPayType());
|
worldCupPayment.setPayStatus(1);
|
worldCupPayment.setState(1);
|
worldCupPayment.setCreateTime(new Date());
|
worldCupPayment.setEntrant(paymentWorldCup.getIds());
|
int num = JSON.parseArray(paymentWorldCup.getIds()).size();
|
//不免费
|
if(worldCup.getPayType() != 0){
|
Integer payType = paymentWorldCup.getPayType();
|
//微信
|
if(payType == 1){
|
worldCupPayment.setAmount(new BigDecimal(num).multiply(worldCup.getCash()));
|
worldCupPaymentService.save(worldCupPayment);
|
return payMoneyUtil.weixinpay("社区世界杯报名", "", worldCupPayment.getCode(),
|
worldCup.getCash().toString(), "/base/worldCup/wxPayWorldCupCallback", "APP", "");
|
}
|
//支付宝
|
if(payType == 2){
|
worldCupPayment.setAmount(new BigDecimal(num).multiply(worldCup.getCash()));
|
worldCupPaymentService.save(worldCupPayment);
|
return payMoneyUtil.alipay("2088330203191220", "社区世界杯报名", "世界杯报名", "", worldCupPayment.getCode(),
|
worldCup.getCash().toString(), "/base/worldCup/aliPayWorldCupCallback");
|
}
|
//玩湃币
|
if(payType == 3){
|
AppUser appUser = appUserClient.getAppUser(paymentWorldCup.getUid());
|
BigDecimal multiply = new BigDecimal(num).multiply(new BigDecimal(worldCup.getPaiCoin()));
|
if(appUser.getPlayPaiCoins() < multiply.intValue()){
|
return ResultUtil.error("报名失败,玩湃币不足,请充值!");
|
}
|
worldCupPayment.setAmount(multiply);
|
worldCupPayment.setPayStatus(2);
|
worldCupPayment.setPayTime(new Date());
|
worldCupPaymentService.save(worldCupPayment);
|
|
appUser.setPlayPaiCoins(appUser.getPlayPaiCoins() - multiply.intValue());
|
appUserClient.updateAppUser(appUser);
|
|
//添加报名明细
|
String ids = paymentWorldCup.getIds();
|
JSONArray jsonArray = JSON.parseArray(ids);
|
for (int i = 0; i < jsonArray.size(); i++) {
|
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
Integer id = jsonObject.getInteger("id");
|
//是否是学员(0=否,1=是)
|
Integer isStudent = jsonObject.getInteger("isStudent");
|
|
WorldCupPaymentParticipant worldCupPaymentParticipant = new WorldCupPaymentParticipant();
|
worldCupPaymentParticipant.setWorldCupId(paymentWorldCup.getId());
|
worldCupPaymentParticipant.setWorldCupPaymentId(worldCupPayment.getId());
|
worldCupPaymentParticipant.setAppUserId(paymentWorldCup.getUid());
|
worldCupPaymentParticipant.setParticipantType(isStudent == 0 ? 2 : 1);
|
worldCupPaymentParticipant.setParticipantId(id);
|
worldCupPaymentParticipantService.save(worldCupPaymentParticipant);
|
}
|
return ResultUtil.success();
|
}
|
//课时
|
if(payType == 4){
|
BigDecimal multiply = new BigDecimal(num).multiply(new BigDecimal(worldCup.getClassHour()));
|
String ids = paymentWorldCup.getIds();
|
JSONArray jsonArray = JSON.parseArray(ids);
|
List<DeductionClassHour> list = new ArrayList<>();
|
for (int i = 0; i < jsonArray.size(); i++) {
|
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
Integer id = jsonObject.getInteger("id");
|
//是否是学员(0=否,1=是)
|
Integer isStudent = jsonObject.getInteger("isStudent");
|
if(0 == isStudent){
|
return ResultUtil.error("非学员无法使用课时报名");
|
}
|
List<CoursePackageOrderStudent> coursePackageOrderStudent = coursePackageOrderStudentClient.getCoursePackageOrderStudent(id);
|
int sum = coursePackageOrderStudent.stream().mapToInt(CoursePackageOrderStudent::getLaveClassHours).sum();
|
if(sum < worldCup.getClassHour()){
|
return ResultUtil.error("报名失败,课时不足,请续课!");
|
}
|
|
//构建扣减课时数据
|
Integer classHour = worldCup.getClassHour();
|
for (CoursePackageOrderStudent packageOrderStudent : coursePackageOrderStudent) {
|
Integer laveClassHours = packageOrderStudent.getLaveClassHours();
|
|
DeductionClassHour deductionClassHour = new DeductionClassHour();
|
if(classHour.compareTo(laveClassHours) > 0){
|
//不够扣除,轮询直到扣除完
|
classHour = classHour - laveClassHours;
|
deductionClassHour.setId(packageOrderStudent.getId());
|
deductionClassHour.setClassHour(laveClassHours);
|
deductionClassHour.setStudentId(packageOrderStudent.getStudentId());
|
deductionClassHour.setCoursePackageId(packageOrderStudent.getCoursePackageId());
|
list.add(deductionClassHour);
|
}else{
|
//够扣除直接跳出进行下个学员
|
deductionClassHour.setId(packageOrderStudent.getId());
|
deductionClassHour.setClassHour(classHour);
|
deductionClassHour.setStudentId(packageOrderStudent.getStudentId());
|
deductionClassHour.setCoursePackageId(packageOrderStudent.getCoursePackageId());
|
list.add(deductionClassHour);
|
break;
|
}
|
}
|
}
|
|
//扣减课时操作
|
DeductionClassHourList deductionClassHourList = new DeductionClassHourList();
|
deductionClassHourList.setDeductionClassHourList(list);
|
coursePackageOrderStudentClient.deductionClassHour(deductionClassHourList);
|
|
worldCupPayment.setAmount(multiply);
|
worldCupPayment.setPayStatus(2);
|
worldCupPayment.setPayTime(new Date());
|
worldCupPaymentService.save(worldCupPayment);
|
return ResultUtil.success();
|
}
|
}else{
|
worldCupPayment.setPayType(0);
|
worldCupPayment.setAmount(BigDecimal.ZERO);
|
worldCupPayment.setPayStatus(2);
|
worldCupPayment.setPayTime(new Date());
|
worldCupPaymentService.save(worldCupPayment);
|
|
//添加报名明细
|
String ids = paymentWorldCup.getIds();
|
JSONArray jsonArray = JSON.parseArray(ids);
|
for (int i = 0; i < jsonArray.size(); i++) {
|
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
Integer id = jsonObject.getInteger("id");
|
//是否是学员(0=否,1=是)
|
Integer isStudent = jsonObject.getInteger("isStudent");
|
|
WorldCupPaymentParticipant worldCupPaymentParticipant = new WorldCupPaymentParticipant();
|
worldCupPaymentParticipant.setWorldCupId(paymentWorldCup.getId());
|
worldCupPaymentParticipant.setWorldCupPaymentId(worldCupPayment.getId());
|
worldCupPaymentParticipant.setAppUserId(paymentWorldCup.getUid());
|
worldCupPaymentParticipant.setParticipantType(isStudent == 0 ? 2 : 1);
|
worldCupPaymentParticipant.setParticipantId(id);
|
worldCupPaymentParticipantService.save(worldCupPaymentParticipant);
|
}
|
return ResultUtil.success();
|
}
|
return ResultUtil.success();
|
}
|
|
|
/**
|
* 第三方支付完成后的处理逻辑
|
* @param code
|
* @param outTradeNo
|
* @return
|
*/
|
@Override
|
public ResultUtil paymentWorldCupCallback(String code, String outTradeNo) {
|
WorldCupPayment worldCupPayment = worldCupPaymentService.getOne(new QueryWrapper<WorldCupPayment>().eq("code", code));
|
worldCupPayment.setPayStatus(2);
|
worldCupPayment.setPayTime(new Date());
|
worldCupPaymentService.updateById(worldCupPayment);
|
|
//添加报名明细
|
String ids = worldCupPayment.getEntrant();
|
JSONArray jsonArray = JSON.parseArray(ids);
|
for (int i = 0; i < jsonArray.size(); i++) {
|
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
Integer id = jsonObject.getInteger("id");
|
//是否是学员(0=否,1=是)
|
Integer isStudent = jsonObject.getInteger("isStudent");
|
|
WorldCupPaymentParticipant worldCupPaymentParticipant = new WorldCupPaymentParticipant();
|
worldCupPaymentParticipant.setWorldCupId(worldCupPayment.getWorldCupId());
|
worldCupPaymentParticipant.setWorldCupPaymentId(worldCupPayment.getId());
|
worldCupPaymentParticipant.setAppUserId(worldCupPayment.getAppUserId());
|
worldCupPaymentParticipant.setParticipantType(isStudent == 0 ? 2 : 1);
|
worldCupPaymentParticipant.setParticipantId(id);
|
worldCupPaymentParticipantService.save(worldCupPaymentParticipant);
|
}
|
return ResultUtil.success();
|
}
|
}
|