cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/controller/WorldCupController.java
@@ -17,15 +17,22 @@ import com.dsh.communityWorldCup.service.IWorldCupPaymentParticipantService; import com.dsh.communityWorldCup.service.IWorldCupService; import com.dsh.communityWorldCup.service.IWorldCupStoreService; import com.dsh.communityWorldCup.util.PayMoneyUtil; import com.dsh.communityWorldCup.util.ResultUtil; import com.dsh.communityWorldCup.util.TokenUtil; import groovy.util.logging.Log4j; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; @@ -40,6 +47,8 @@ @RestController @RequestMapping("") public class WorldCupController { Logger log = LoggerFactory.getLogger(WorldCupController.class); @Autowired private TokenUtil tokenUtil; @@ -67,6 +76,9 @@ @Resource private StoreClient storeClient; @Autowired private PayMoneyUtil payMoneyUtil; @@ -252,5 +264,107 @@ public ResultUtil paymentWorldCup() @ResponseBody @PostMapping("/api/worldCup/checkPaymentMethod") @ApiOperation(value = "世界杯报名前校验支付方式【2.0】", tags = {"APP-社区世界杯"}) @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil<CheckPaymentMethodVo> checkPaymentMethod(CheckPaymentMethod checkPaymentMethod){ try { Integer uid = tokenUtil.getUserIdFormRedis(); if(null == uid){ return ResultUtil.success(); } checkPaymentMethod.setUid(uid); CheckPaymentMethodVo checkPaymentMethodVo = worldCupService.checkPaymentMethod(checkPaymentMethod); return ResultUtil.success(checkPaymentMethodVo); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } @ResponseBody @PostMapping("/api/worldCup/paymentWorldCup") @ApiOperation(value = "世界杯报名【2.0】", tags = {"APP-社区世界杯"}) @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public ResultUtil paymentWorldCup(PaymentWorldCup paymentWorldCup){ try { Integer uid = tokenUtil.getUserIdFormRedis(); if(null == uid){ return ResultUtil.success(); } paymentWorldCup.setUid(uid); return worldCupService.paymentWorldCup(paymentWorldCup); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } /** * 微信支付回调 */ @ResponseBody @PostMapping("/base/worldCup/wxPayWorldCupCallback") public void wxPayWorldCupCallback(HttpServletRequest request, HttpServletResponse response){ try { Map<String, String> map = payMoneyUtil.weixinpayCallback(request); if(null != map){ String code = map.get("out_trade_no"); String transaction_id = map.get("transaction_id"); String result = map.get("result"); ResultUtil resultUtil = worldCupService.paymentWorldCupCallback(code, transaction_id); if(resultUtil.getCode() == 200){ PrintWriter out = response.getWriter(); out.println(result); out.flush(); out.close(); }else{ log.error("社区世界杯报名微信支付回业务处理异常:" + resultUtil.getMsg()); } }else{ log.error("社区世界杯报名微信支付回调解析异常"); } }catch (Exception e){ e.printStackTrace(); } } /** * 支付宝支付回调 */ @ResponseBody @PostMapping("/base/worldCup/aliPayWorldCupCallback") public void aliPayWorldCupCallback(HttpServletRequest request, HttpServletResponse response){ try { Map<String, String> map = payMoneyUtil.alipayCallback(request); if(null != map){ String code = map.get("out_trade_no"); String transaction_id = map.get("trade_no"); String result = map.get("result"); ResultUtil resultUtil = worldCupService.paymentWorldCupCallback(code, transaction_id); if(resultUtil.getCode() == 200){ PrintWriter out = response.getWriter(); out.println(result); out.flush(); out.close(); }else{ log.error("社区世界杯报名支付宝支付回业务处理异常:" + resultUtil.getMsg()); } }else{ log.error("社区世界杯报名付宝支支付回调解析异常"); } }catch (Exception e){ e.printStackTrace(); } } } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/entity/WorldCupPayment.java
New file @@ -0,0 +1,89 @@ package com.dsh.communityWorldCup.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; import java.util.Date; /** * @author zhibing.pu * @Date 2024/2/22 14:15 */ @Data @TableName("t_world_cup_payment") public class WorldCupPayment { /** * 主键 */ @TableId(value = "id", type = IdType.INPUT) private Long id; /** * 支付流水号 */ @TableField("code") private String code; /** * 世界杯id */ @TableField("worldCupId") private Integer worldCupId; /** * 用户id */ @TableField("appUserId") private Integer appUserId; /** * 支付方式(0=免费,1=微信,2=支付宝,3=玩湃币,4=课时) */ @TableField("payType") private Integer payType; /** * 支付金额 */ @TableField("amount") private BigDecimal amount; /** * 支付状态(1=待支付,2=已支付,3=已退款) */ @TableField("payStatus") private Integer payStatus; /** * 支付时间 */ @TableField("payTime") private Date payTime; /** * 第三方支付流水号 */ @TableField("payOrderNo") private String payOrderNo; /** * 退款时间 */ @TableField("refundTime") private Date refundTime; /** * 第三方退款流水号 */ @TableField("refundOrderNo") private String refundOrderNo; /** * 状态(1=正常,2=冻结,3=删除) */ @TableField("state") private Integer state; /** * 添加时间 */ @TableField("createTime") private Date createTime; /** * 参赛人数据 */ @TableField("entrant") private String entrant; } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/feignclient/course/CoursePackageOrderStudentClient.java
New file @@ -0,0 +1,34 @@ package com.dsh.communityWorldCup.feignclient.course; import com.dsh.communityWorldCup.feignclient.course.model.CoursePackageOrderStudent; import com.dsh.communityWorldCup.model.DeductionClassHour; import com.dsh.communityWorldCup.model.DeductionClassHourList; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; /** * @author zhibing.pu * @Date 2024/2/22 15:26 */ @FeignClient("mb-cloud-course") public interface CoursePackageOrderStudentClient { /** * 根据学院id获取剩余有效课时数据 * @param studentId * @return */ @PostMapping("/getCoursePackageOrderStudent") List<CoursePackageOrderStudent> getCoursePackageOrderStudent(Integer studentId); /** * 扣减学员课时 * @param deductionClassHourList */ @PostMapping("/deductionClassHour") boolean deductionClassHour(DeductionClassHourList deductionClassHourList); } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/feignclient/course/model/CoursePackageOrderStudent.java
New file @@ -0,0 +1,77 @@ package com.dsh.communityWorldCup.feignclient.course.model; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; /** * @author zhibing.pu * @Date 2023/11/25 11:59 */ @Data public class CoursePackageOrderStudent { /** * 主键 */ private Long id; /** * 用户id */ private Integer appUserId; /** * 学员id */ private Integer studentId; /** * 课包id */ private Integer coursePackageId; /** * 总课时 */ private Integer totalClassHours; /** * 剩余课时 */ private Integer laveClassHours; /** * 缺课次数 */ private Integer absencesNumber; /** * 退课课时 */ private Integer dropoutsNumber; /** * 课程状态(1=正常,2=已退课) */ private Integer status; /** * 退课时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date withdrawalTime; /** * 退课凭证 */ private String certificate; /** * 状态(1=正常,2=冻结,3=删除) */ private Integer state; /** * 添加时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date insertTime; /** * 赠送课时 */ private Integer giftClassHours; /** * 课程有效期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date useTime; } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/mapper/WorldCupPaymentMapper.java
New file @@ -0,0 +1,11 @@ package com.dsh.communityWorldCup.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dsh.communityWorldCup.entity.WorldCupPayment; /** * @author zhibing.pu * @Date 2024/2/22 14:22 */ public interface WorldCupPaymentMapper extends BaseMapper<WorldCupPayment> { } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/model/CheckPaymentMethod.java
New file @@ -0,0 +1,19 @@ package com.dsh.communityWorldCup.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author zhibing.pu * @Date 2024/2/22 15:20 */ @Data @ApiModel public class CheckPaymentMethod { @ApiModelProperty(value = "世界杯id", required = true, dataType = "int") private Integer id; @ApiModelProperty(value = "参赛人员id[{\"id\":123,\"isStudent\":1},{\"id\":222,\"isStudent\":0}]", required = true, dataType = "String") private String ids; private Integer uid; } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/model/CheckPaymentMethodVo.java
New file @@ -0,0 +1,18 @@ package com.dsh.communityWorldCup.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author zhibing.pu * @Date 2024/2/22 15:14 */ @Data @ApiModel public class CheckPaymentMethodVo { @ApiModelProperty("能否使用玩湃币支付(0=否,1=是)") private Integer paiCoin; @ApiModelProperty("能否使用课时支付(0=否,1=是)") private Integer classHour; } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/model/DeductionClassHour.java
New file @@ -0,0 +1,27 @@ package com.dsh.communityWorldCup.model; import lombok.Data; /** * @author zhibing.pu * @Date 2024/2/22 15:44 */ @Data public class DeductionClassHour { /** * 课时记录id */ private Long id; /** * 学员id */ private Integer studentId; /** * 课时id */ private Integer coursePackageId; /** * 扣减课时 */ private Integer classHour; } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/model/DeductionClassHourList.java
New file @@ -0,0 +1,14 @@ package com.dsh.communityWorldCup.model; import lombok.Data; import java.util.List; /** * @author zhibing.pu * @Date 2024/2/22 15:46 */ @Data public class DeductionClassHourList { List<DeductionClassHour> deductionClassHourList; } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/model/PaymentWorldCup.java
@@ -15,5 +15,7 @@ private Integer id; @ApiModelProperty(value = "支付方式(1=微信,2=支付宝,3=玩湃币,4=课时)") private Integer payType; @ApiModelProperty(value = "参赛人员") @ApiModelProperty(value = "参赛人员id[{\"id\":123,\"isStudent\":1},{\"id\":222,\"isStudent\":0}]", required = true, dataType = "String") private String ids; private Integer uid; } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/service/IWorldCupPaymentService.java
New file @@ -0,0 +1,11 @@ package com.dsh.communityWorldCup.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dsh.communityWorldCup.entity.WorldCupPayment; /** * @author zhibing.pu * @Date 2024/2/22 14:22 */ public interface IWorldCupPaymentService extends IService<WorldCupPayment> { } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/service/IWorldCupService.java
@@ -51,4 +51,29 @@ * @return */ WorldCupInfo getWorldCupInfo(Integer id); /** * 报名前校验支付方式 * @param checkPaymentMethod * @return */ CheckPaymentMethodVo checkPaymentMethod(CheckPaymentMethod checkPaymentMethod); /** * 报名世界杯 * @param paymentWorldCup * @return */ ResultUtil paymentWorldCup(PaymentWorldCup paymentWorldCup); /** * 第三方支付完成后回调逻辑处理 * @param code * @param outTradeNo * @return */ ResultUtil paymentWorldCupCallback(String code, String outTradeNo); } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/service/impl/WorldCupPaymentServiceImpl.java
New file @@ -0,0 +1,15 @@ package com.dsh.communityWorldCup.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.communityWorldCup.entity.WorldCupPayment; import com.dsh.communityWorldCup.mapper.WorldCupPaymentMapper; import com.dsh.communityWorldCup.service.IWorldCupPaymentService; import org.springframework.stereotype.Service; /** * @author zhibing.pu * @Date 2024/2/22 14:23 */ @Service public class WorldCupPaymentServiceImpl extends ServiceImpl<WorldCupPaymentMapper, WorldCupPayment> implements IWorldCupPaymentService { } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/service/impl/WorldCupServiceImpl.java
@@ -5,26 +5,32 @@ 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.WorldCup; import com.dsh.communityWorldCup.entity.WorldCupCompetitor; import com.dsh.communityWorldCup.entity.WorldCupPaymentParticipant; import com.dsh.communityWorldCup.entity.WorldCupStore; 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.IWorldCupCompetitorService; import com.dsh.communityWorldCup.service.IWorldCupPaymentParticipantService; import com.dsh.communityWorldCup.service.IWorldCupService; import com.dsh.communityWorldCup.service.IWorldCupStoreService; 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 @@ -44,6 +50,24 @@ @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; @@ -160,4 +184,292 @@ 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(); } } cloud-server-communityWorldCup/src/main/java/com/dsh/communityWorldCup/util/PayMoneyUtil.java
@@ -131,7 +131,7 @@ //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody(body);//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。 model.setSubject("报名赛事");//商品的标题/交易标题/订单标题/订单关键字等。 model.setSubject(subject);//商品的标题/交易标题/订单标题/订单关键字等。 model.setOutTradeNo(outTradeNo);//商户网站唯一订单号 model.setTimeoutExpress("30m"); model.setTotalAmount(amount);//付款金额 cloud-server-communityWorldCup/src/main/resources/mapper/WorldCupPaymentMapper.xml
File was renamed from cloud-server-communityWorldCup/target/classes/mapper/UserCompetitionMapper.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dsh.competition.mapper.UserCompetitionMapper"> <mapper namespace="com.dsh.communityWorldCup.mapper.WorldCupPaymentMapper"> </mapper> </mapper> cloud-server-communityWorldCup/target/classes/META-INF/spring-configuration-metadata.json
File was deleted cloud-server-communityWorldCup/target/classes/bootstrap.properties
File was deleted cloud-server-communityWorldCup/target/classes/com/dsh/CompetitionApplication.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/advice/ControllerException.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/controller/CompetitionController.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/controller/ParticipantController.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/controller/UserCompetitionController.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/entity/Competition.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/entity/OperatorUser.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/entity/Participant.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/entity/PaymentCompetition.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/entity/UserCompetition.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/DeductionCompetitionsClient.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/account/AppUserClient.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/account/StudentClient.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/account/model/AppUser.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/account/model/Student.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/account/model/TStudent.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/course/CoursePackagePaymentClient.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/course/model/PaymentDeductionClassHour.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/model/BillingDataRequestVo.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/model/BillingRequest.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/model/BillingRequestVo.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/model/CompetitionUser.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/model/GetPeopleQuery.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/model/GetStuSourseList.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/model/ListQuery.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/model/PurchaseRecordVo.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/other/StoreClient.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/feignclient/other/model/Store.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/mapper/CompetitionMapper.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/mapper/ParticipantMapper.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/mapper/PaymentCompetitionMapper.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/mapper/UserCompetitionMapper.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/model/AddParticipant.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/model/CompetionVO.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/model/CompetitionInfo.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/model/CompetitionListVo.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/model/CompetitionQuery.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/model/EditParticipant.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/model/ParticipantVo.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/model/PayCourseRes.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/model/PaymentCompetitionVo.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/model/QueryDataFee.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/model/SaveParticipant.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/model/TCompetition.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/service/CompetitionService.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/service/IParticipantService.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/service/IPaymentCompetitionService.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/service/UserCompetitionService.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/service/impl/CompetitionServiceImpl.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/service/impl/ParticipantServiceImpl.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/service/impl/UserCompetitionServiceImpl.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/CodeGenerateUtils.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/DateTimeHelper.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/DateUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/DoubleUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/EmojiUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/GeodesyUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/HeaderAuthUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/JsonUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/JuHeUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/LocalDateTimeUtils.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/MD5AndKL.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/MessageUtils.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/PayMoneyUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/RedisUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/ResultUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/StrUtils.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/StringUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/StudyTimeUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/TaskUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/TaskUtilCompetition.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/TokenUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/ToolUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/UUIDUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/akeylogin/Base64Utils.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/akeylogin/BaseUtils.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/akeylogin/DES.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/akeylogin/Md5Util.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/akeylogin/SignUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/httpClinet/HttpClientUtil.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/competition/util/httpClinet/HttpResult.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/config/JsonLongSerializer.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/config/MessageLocalConfig.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/config/MyLocaleResolver.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/config/RedisConfig.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/config/Sharding_jdbc/DatasourceModel.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/config/Sharding_jdbc/Master0DataSource.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/config/Sharding_jdbc/ShardingConfig.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/config/SwaggerConfig.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/page/HttpKit.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/page/Order.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/page/PageFactory.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/page/WafKit.classBinary files differ
cloud-server-communityWorldCup/target/classes/com/dsh/page/WafRequestWrapper.classBinary files differ
cloud-server-communityWorldCup/target/classes/logback-spring.xml
File was deleted cloud-server-communityWorldCup/target/classes/mapper/CompetitionMapper.xml
File was deleted cloud-server-communityWorldCup/target/classes/mapper/ParticipantMapper.xml
File was deleted cloud-server-communityWorldCup/target/classes/mapper/PaymentCompetitionMapper.xml
File was deleted cloud-server-communityWorldCup/target/classes/redis.properties
File was deleted cloud-server-communityWorldCup/target/classes/sharding-jdbc.properties
File was deleted cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageOrderStudentController.java
New file @@ -0,0 +1,48 @@ package com.dsh.course.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.dsh.course.entity.CoursePackageOrderStudent; import com.dsh.course.model.DeductionClassHourList; import com.dsh.course.service.ICoursePackageOrderStudentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @author zhibing.pu * @Date 2024/2/22 15:27 */ @RestController @RequestMapping("/coursePackageOrderStudent") public class CoursePackageOrderStudentController { @Autowired private ICoursePackageOrderStudentService coursePackageOrderStudentService; /** * 根据学院id获取剩余有效课时数据 * @param studentId * @return */ @ResponseBody @PostMapping("/getCoursePackageOrderStudent") public List<CoursePackageOrderStudent> getCoursePackageOrderStudent(@RequestBody Integer studentId){ return coursePackageOrderStudentService.list(new QueryWrapper<CoursePackageOrderStudent>() .eq("studentId", studentId).eq("status", 1).eq("state", 1) .gt("laveClassHours", 0).last(" and useTime > now()")); } /** * 扣减学员课时 * @param deductionClassHourList * @return */ @ResponseBody @PostMapping("/deductionClassHour") public boolean deductionClassHour(@RequestBody DeductionClassHourList deductionClassHourList){ return coursePackageOrderStudentService.deductionClassHour(deductionClassHourList); } } cloud-server-course/src/main/java/com/dsh/course/model/DeductionClassHour.java
New file @@ -0,0 +1,27 @@ package com.dsh.course.model; import lombok.Data; /** * @author zhibing.pu * @Date 2024/2/22 15:44 */ @Data public class DeductionClassHour { /** * 课时记录id */ private Long id; /** * 学员id */ private Integer studentId; /** * 课时id */ private Integer coursePackageId; /** * 扣减课时 */ private Integer classHour; } cloud-server-course/src/main/java/com/dsh/course/model/DeductionClassHourList.java
New file @@ -0,0 +1,14 @@ package com.dsh.course.model; import lombok.Data; import java.util.List; /** * @author zhibing.pu * @Date 2024/2/22 15:46 */ @Data public class DeductionClassHourList { List<DeductionClassHour> deductionClassHourList; } cloud-server-course/src/main/java/com/dsh/course/service/ICoursePackageOrderStudentService.java
@@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dsh.course.entity.CoursePackageOrderStudent; import com.dsh.course.feignclient.model.RecordAppoint; import com.dsh.course.model.DeductionClassHourList; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -20,4 +22,12 @@ * @return */ List<RecordAppoint> obtainStuClassDetails(Integer stuId, Integer appUserId, Integer pageNum); /** * 扣除学员课时 * @param deductionClassHourList * @return */ boolean deductionClassHour(DeductionClassHourList deductionClassHourList); } cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageOrderStudentServiceImpl.java
@@ -13,8 +13,11 @@ import com.dsh.course.feignclient.other.StoreClient; import com.dsh.course.feignclient.other.model.Store; import com.dsh.course.mapper.*; import com.dsh.course.model.DeductionClassHour; import com.dsh.course.model.DeductionClassHourList; import com.dsh.course.service.ICoursePackageOrderStudentService; import com.dsh.course.service.ICoursePackageSchedulingService; import com.dsh.course.service.TCoursePackageService; import com.dsh.course.util.DateTimeHelper; import com.dsh.course.util.DateUtil; import com.dsh.course.util.ToolUtil; @@ -49,6 +52,9 @@ @Resource private StoreClient stoClient; @Autowired private TCoursePackageService coursePackageService; @@ -229,4 +235,57 @@ return ids; } /** * 扣除学员课时 * @param deductionClassHourList * @return */ @Override public boolean deductionClassHour(DeductionClassHourList deductionClassHourList) { try { List<DeductionClassHour> list = deductionClassHourList.getDeductionClassHourList(); for (DeductionClassHour deductionClassHour : list) { CoursePackageOrderStudent coursePackageOrderStudent = this.getById(deductionClassHour.getId()); Integer laveClassHours = coursePackageOrderStudent.getLaveClassHours(); coursePackageOrderStudent.setLaveClassHours(coursePackageOrderStudent.getLaveClassHours() - deductionClassHour.getClassHour()); //计算需要删除几个排课记录 TCoursePackage coursePackage = coursePackageService.getById(coursePackageOrderStudent.getCoursePackageId()); Integer codeTime = coursePackage.getCodeTime(); //未上的排课数据 List<CoursePackageScheduling> packageSchedulings = coursePackageSchedulingService.list(new QueryWrapper<CoursePackageScheduling>().eq("studentId", coursePackageOrderStudent.getStudentId()) .eq("coursePackageId", coursePackageOrderStudent.getCoursePackageId()).eq("status", 1).orderByDesc("classDate")); //排课使用的总课时 int classHour = packageSchedulings.size() * codeTime; //未排课的课时 int notClass = laveClassHours - classHour; //判断是否需要删除排课数据 if(notClass < deductionClassHour.getClassHour()){ int clss = deductionClassHour.getClassHour() - notClass; int n = clss % codeTime; int l = 0; //不整除的情况,需要多删除一节排课,回加差额课时。 if(n != 0){ n += 1; l = (codeTime * n) - clss; coursePackageOrderStudent.setLaveClassHours(l); } //删除已排的课程 List<CoursePackageScheduling> coursePackageSchedulings = packageSchedulings.subList(0, n); List<Long> collect = coursePackageSchedulings.stream().map(CoursePackageScheduling::getId).collect(Collectors.toList()); coursePackageSchedulingService.removeByIds(collect); } this.updateById(coursePackageOrderStudent); } return true; }catch (Exception e){ e.printStackTrace(); } return false; } }