package com.dsh.competition.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.competition.entity.Competition; import com.dsh.competition.entity.Participant; import com.dsh.competition.entity.PaymentCompetition; import com.dsh.competition.entity.UserCompetition; import com.dsh.competition.feignclient.account.AppUserClient; import com.dsh.competition.feignclient.account.StudentClient; import com.dsh.competition.feignclient.account.model.AppUser; import com.dsh.competition.feignclient.account.model.Student; import com.dsh.competition.feignclient.account.model.TStudent; import com.dsh.competition.feignclient.course.CoursePackagePaymentClient; import com.dsh.competition.feignclient.course.model.PaymentDeductionClassHour; import com.dsh.competition.feignclient.model.BillingRequest; import com.dsh.competition.feignclient.other.StoreClient; import com.dsh.competition.feignclient.other.model.Store; import com.dsh.competition.mapper.CompetitionMapper; import com.dsh.competition.mapper.PaymentCompetitionMapper; import com.dsh.competition.model.*; import com.dsh.competition.service.CompetitionService; import com.dsh.competition.service.IParticipantService; import com.dsh.competition.service.IPaymentCompetitionService; import com.dsh.competition.service.UserCompetitionService; import com.dsh.competition.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @author zhibing.pu * @date 2023/7/6 16:37 */ @Service public class PaymentCompetitionServiceImpl extends ServiceImpl implements IPaymentCompetitionService { @Autowired private CompetitionService competitionService; @Resource private StoreClient storeClient; @Autowired private UserCompetitionService userCompetitionService; @Autowired private IParticipantService participantService; @Autowired private PayMoneyUtil payMoneyUtil; @Resource private AppUserClient appUserClient; @Resource private CoursePackagePaymentClient coursePackagePaymentClient; @Resource private StudentClient studentClient; @Autowired private PaymentCompetitionMapper paymentCompetitionMapper; @Resource private CompetitionMapper competitionMapper; /** * 获取我的报名赛事记录 * * @param uid * @param type * @param pageSize * @param pageNo * @return * @throws Exception */ @Override public List queryMyCompetitionList(Integer uid, Integer type, Integer pageSize, Integer pageNo) throws Exception { pageNo = (pageNo - 1) * pageSize; if (0 == type) { type = null; } List competitionListVos = this.baseMapper.queryMyCompetitionList(uid, type, pageSize, pageNo); for (CompetitionListVo competitionListVo : competitionListVos) { Integer counts = competitionMapper.counts(competitionListVo.getPId()); competitionListVo.setHeat(competitionListVo.getHeat() + counts); } return competitionListVos; } /** * 获取我报名的赛事详情 * * @param id * @return * @throws Exception */ @Override public CompetitionInfo queryMyCompetitionInfo(Long id) throws Exception { PaymentCompetition paymentCompetition = this.getById(id); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); Competition competition = competitionService.getById(paymentCompetition.getCompetitionId()); CompetitionInfo competitionInfo = new CompetitionInfo(); competitionInfo.setId(id); competitionInfo.setImgs(competition.getImgs()); competitionInfo.setName(competition.getName()); competitionInfo.setRegisterCondition(competition.getRegisterCondition()); Store store = storeClient.queryStoreById(Integer.valueOf(competition.getStoreId().split(",")[0])); competitionInfo.setStoreName(store.getName()); competitionInfo.setStoreAddress(store.getAddress()); competitionInfo.setStoreLon(store.getLon()); competitionInfo.setStoreLat(store.getLat()); competitionInfo.setStoreCoverDrawing(store.getCoverDrawing()); competitionInfo.setRegisterEndTime(sdf.format(competition.getRegisterEndTime())); competitionInfo.setStartTime(sdf.format(competition.getStartTime())); competitionInfo.setEndTime(sdf.format(competition.getEndTime())); competitionInfo.setAge(competition.getStartAge() + "-" + competition.getEndAge()); competitionInfo.setProvince(competition.getEntryProvince()); competitionInfo.setCity(competition.getEntryCity()); String str = competition.getAddress(); str = str.substring(str.indexOf("省") + 1); // 去掉第一个“市”及之前的字符串 str = str.substring(str.indexOf("市") + 1); // 去掉第一个“区”及之前的字符串 str = str.substring(str.indexOf("区") + 1); competitionInfo.setAddress(str); competitionInfo.setCashPrice(competition.getCashPrice()); competitionInfo.setPlayPaiCoin(competition.getPlayPaiCoin()); competitionInfo.setClassPrice(competition.getClassPrice()); competitionInfo.setIntroduction(competition.getIntroduction()); competitionInfo.setRegistrationNotes(competition.getRegistrationNotes()); competitionInfo.setApply(1); ArrayList> objects = new ArrayList<>(); if (null != competition.getStoreId()) { String storeId = competition.getStoreId(); for (String s : storeId.split(",")) { HashMap map = new HashMap<>(); Store store1 = storeClient.queryStoreById(Integer.valueOf(s)); map.put("name", store1.getName()); String str1 = store1.getAddress(); str1 = str1.substring(str1.indexOf("省") + 1); // 去掉第一个“市”及之前的字符串 str1 = str1.substring(str1.indexOf("市") + 1); // 去掉第一个“区”及之前的字符串 str1 = str1.substring(str1.indexOf("区") + 1); map.put("address", str1); map.put("storeLon", store.getLon()); map.put("storeLat", store.getLat()); map.put("storeCoverDrawing", store.getCoverDrawing()); // 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(); // map.put("distance",wgs84); // } objects.add(map); } } competitionInfo.setStoreInfos(objects); List participant = new ArrayList<>(); List list = userCompetitionService.list(new QueryWrapper().eq("paymentCompetitionId", paymentCompetition.getId())); List collect = list.stream().map(UserCompetition::getParticipantId).collect(Collectors.toList()); if (collect.size() == 0) { collect.add(-1); } List participants = participantService.listByIds(collect); SimpleDateFormat sdf_year = new SimpleDateFormat("yyyy"); for (Participant participant1 : participants) { ParticipantVo participantVo = new ParticipantVo(); participantVo.setId(participant1.getId()); participantVo.setName(participant1.getName()); participantVo.setIdcard(participant1.getIdcard()); Integer age = Integer.valueOf(sdf_year.format(new Date())) - Integer.valueOf(sdf_year.format(participant1.getBirthday())); participantVo.setAge(age); participantVo.setPhone(participant1.getPhone()); participant.add(participantVo); } for (Integer i : collect) { TStudent tStudent = studentClient.queryById(i); if (tStudent != null) { ParticipantVo participantVo = new ParticipantVo(); participantVo.setId(tStudent.getId()); participantVo.setName(tStudent.getName()); participantVo.setIdcard(tStudent.getIdCard()); Integer age = Integer.valueOf(sdf_year.format(new Date())) - Integer.valueOf(sdf_year.format(tStudent.getBirthday())); participantVo.setAge(age); participantVo.setPhone(tStudent.getPhone()); participant.add(participantVo); } } competitionInfo.setParticipant(participant); competitionInfo.setStatus(competition.getStatus()); if (paymentCompetition.getPayStatus() == 3) { competitionInfo.setStatus(4); } competitionInfo.setPayMoney(paymentCompetition.getAmount()); competitionInfo.setPayType(paymentCompetition.getPayType()); return competitionInfo; } /** * 取消赛事报名 * * @param id * @return * @throws Exception */ @Override public ResultUtil cancelMyCompetition(Long id) throws Exception { PaymentCompetition paymentCompetition = this.getById(id); if (paymentCompetition.getPayStatus() == 3) { return ResultUtil.error("不能重复取消"); } String code = paymentCompetition.getCode(); Double amount = paymentCompetition.getAmount(); Competition competition = competitionService.getById(paymentCompetition.getCompetitionId()); if (System.currentTimeMillis() >= competition.getRegisterEndTime().getTime()) { return ResultUtil.error("赛事已结束报名,无法取消"); } String payOrderNo = paymentCompetition.getPayOrderNo(); if (paymentCompetition.getPayType() == 1) {//微信支付 Map map = payMoneyUtil.wxRefund(payOrderNo, code, amount.toString(), amount.toString(), "/base/competition/weChatCancelPaymentCompetitionCallback"); String return_code = map.get("return_code"); if (!"SUCCESS".equals(return_code)) { return ResultUtil.error(map.get("return_msg")); } String refund_id = map.get("refund_id"); paymentCompetition.setRefundOrderNo(refund_id); this.updateById(paymentCompetition); storeClient.addBackRecord(paymentCompetition.getAmount() + "_" + paymentCompetition.getAppUserId()); } if (paymentCompetition.getPayType() == 2) {//支付宝支付 Map map = payMoneyUtil.aliRefund(payOrderNo, amount.toString()); String return_code = map.get("code"); if (!"10000".equals(return_code)) { return ResultUtil.error(map.get("msg")); } String refund_id = map.get("trade_no"); paymentCompetition.setRefundOrderNo(refund_id); paymentCompetition.setRefundTime(new Date()); paymentCompetition.setPayStatus(3); paymentCompetition.setAppUserId(null); this.updateById(paymentCompetition); // competition.setApplicantsNumber(competition.getApplicantsNumber() - 1); competitionService.updateById(competition); } if (paymentCompetition.getPayType() == 3) {//玩湃币支付 AppUser appUser = appUserClient.queryAppUser(paymentCompetition.getAppUserId()); appUser.setPlayPaiCoins(appUser.getPlayPaiCoins() + amount.intValue()); appUserClient.updateAppUser(appUser); paymentCompetition.setRefundOrderNo(""); paymentCompetition.setRefundTime(new Date()); paymentCompetition.setPayStatus(3); paymentCompetition.setAppUserId(null); this.updateById(paymentCompetition); // competition.setApplicantsNumber(competition.getApplicantsNumber() - 1); competitionService.updateById(competition); } if (paymentCompetition.getPayType() == 4) {//课程支付 List list = userCompetitionService.list(new QueryWrapper().eq("paymentCompetitionId", paymentCompetition.getId())); for (UserCompetition userCompetition : list) { // Participant participant = participantService.getById(userCompetition.getId()); // Student student = studentClient.queryStudentByPhone(participant.getPhone()); PaymentDeductionClassHour paymentDeductionClassHour = new PaymentDeductionClassHour(); paymentDeductionClassHour.setId(userCompetition.getParticipantId()); paymentDeductionClassHour.setClassHour(competition.getClassPrice()); paymentDeductionClassHour.setCode(code); coursePackagePaymentClient.rollbackPaymentDeductionClassHour(paymentDeductionClassHour); } paymentCompetition.setRefundOrderNo(""); paymentCompetition.setRefundTime(new Date()); paymentCompetition.setPayStatus(3); paymentCompetition.setAppUserId(null); this.updateById(paymentCompetition); // competition.setApplicantsNumber(competition.getApplicantsNumber() - 1); competitionService.updateById(competition); } return ResultUtil.success(); } @Override public List queryDatas(Integer appUserId, String monthStart, String monthEnd) { return this.baseMapper.queryDatas(appUserId, monthStart, monthEnd); } @Override public List queryCancelDatas(Integer appUserId, String monthStart, String monthEnd) { return this.baseMapper.queryCancelDatas(appUserId, monthStart, monthEnd); } @Override public List listAll(CompetitionQuery query) { String STime = null; String ETime = null; if (StringUtils.hasLength(query.getTime())) { STime = query.getTime().split(" - ")[0] + " 00:00:00"; ETime = query.getTime().split(" - ")[1] + " 23:59:59"; } return paymentCompetitionMapper.listAll(query, STime, ETime, query.getAmount()); } @Override public Integer queryByCode(String code) { return this.baseMapper.queryBycode(code); } }