cloud-server-account/src/main/java/com/dsh/account/controller/PaymentCallbackController.java
@@ -2,12 +2,14 @@ import com.dsh.account.service.RechargeRecordsService; import com.dsh.account.service.TAppUserService; import com.dsh.account.service.TStudentService; import com.dsh.account.util.PayMoneyUtil; import com.dsh.account.util.ResultUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @@ -32,6 +34,9 @@ private TStudentService tstuService; @Autowired private RechargeRecordsService recordsService; @Autowired private TAppUserService tappService; /** * 课包续课支付宝支付回调接口 @@ -129,4 +134,59 @@ } } /** * 兑换商品支付的微信回调 * @param request * @param response */ @ResponseBody @PostMapping("/base/pointMer/exchangeGoodPaymentWeChatCallback") public void addVipPaymentWeChatCallback(HttpServletRequest request, HttpServletResponse response){ try { Map<String, String> map = payMoneyUtil.weixinpayCallback(request); if(null != map){ String out_trade_no = map.get("out_trade_no"); String transaction_id = map.get("transaction_id"); String result = map.get("result"); ResultUtil resultUtil = tappService.exchangeAddPaymentCallback(out_trade_no, transaction_id,1); if(resultUtil.getCode() == 200){ PrintWriter out = response.getWriter(); out.write(result); out.flush(); out.close(); } } }catch (Exception e){ e.printStackTrace(); } } /** * 兑换商品支付的支付宝回调 * @param request * @param response */ @ResponseBody @PostMapping("/base/pointMer/exchangeGoodPaymentAliCallback") public void addVipPaymentAliCallback(HttpServletRequest request, HttpServletResponse response){ try { Map<String, String> map = payMoneyUtil.alipayCallback(request); if(null != map){ String out_trade_no = map.get("out_trade_no"); String trade_no = map.get("trade_no"); ResultUtil resultUtil = tappService.exchangeAddPaymentCallback(out_trade_no, trade_no,2); if(resultUtil.getCode() == 200){ PrintWriter out = response.getWriter(); out.write("success"); out.flush(); out.close(); } } }catch (Exception e){ e.printStackTrace(); } } } cloud-server-account/src/main/java/com/dsh/account/controller/UseBenefitsController.java
@@ -296,6 +296,82 @@ } /** * 实体、门票、优惠券为默认门店|课包为默认学员 */ @ResponseBody @PostMapping("/api/useBenefit/goodsOfCourseStore") @ApiOperation(value = "积分商城-实体、门票、优惠券为默认门店|课包为默认学员", tags = {"APP-使用福利"}) @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), @ApiImplicitParam(value = "纬度", name = "lat", required = false, dataType = "String"), @ApiImplicitParam(value = "经度", name = "lon", required = false, dataType = "String"), @ApiImplicitParam(value = "是否为课包商品(1=是 2=否)", name = "isCourse", required = true, dataType = "int"), @ApiImplicitParam(value = "商品id", name = "pointsMerId", required = true, dataType = "int"), }) public ResultUtil<StuAndStoreResponse> goodsOfCourseStore(String lat, String lon,Integer isCourse,Integer pointsMerId){ try { Integer userIdFormRedis = tokenUtil.getUserIdFormRedis(); if(null == userIdFormRedis){ return ResultUtil.tokenErr(); } return ResultUtil.success(tauService.queryAppUserDefaultStuAndStore(userIdFormRedis,pointsMerId,lat,lon,isCourse)); }catch (Exception e){ return ResultUtil.runErr(); } } /** * 兑换详情(实体、门票、优惠券)中的门店列表 */ @ResponseBody @PostMapping("/api/useBenefit/exchangeStoreIds") @ApiOperation(value = "积分商城-兑换详情(实体、门票、优惠券)中的门店列表", tags = {"APP-使用福利"}) @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), @ApiImplicitParam(value = "商品类型 1实物 2课包 3门票 4优惠券", name = "lat", required = true, dataType = "String"), @ApiImplicitParam(value = "商品id", name = "pointsMerId", required = true, dataType = "int"), }) public ResultUtil<List<StoreResponse>> getExchangeStoreIds( Integer goodsType,Integer pointsMerId){ try { return ResultUtil.success(tauService.queryStoresOfExchange(goodsType,pointsMerId)); }catch (Exception e){ return ResultUtil.runErr(); } } /** * 商品兑换 */ @ResponseBody @PostMapping("/api/useBenefit/productRedemptionOperation") @ApiOperation(value = "积分商城-商品兑换", tags = {"APP-使用福利"}) @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), @ApiImplicitParam(value = "商品id", name = "goodId", required = true, dataType = "int"), @ApiImplicitParam(value = "商品类型 1实物 2课包 3门票 4优惠券", name = "goodsType", required = true, dataType = "int"), @ApiImplicitParam(value = "兑换数量", name = "nums", required = false, dataType = "int"), @ApiImplicitParam(value = "兑换方式(1=积分,2=积分+现金)", name = "exchangeType", required = true, dataType = "int"), @ApiImplicitParam(value = "现金支付方式(1=微信 2=支付宝)", name = "payType", required = false, dataType = "int"), @ApiImplicitParam(value = "学员id列表", name = "stuIds", required = false), }) public ResultUtil productRedemptionOperation(Integer goodId, Integer goodsType,Integer nums,Integer exchangeType,Integer payType,List<Integer> stuIds){ try { Integer userIdFormRedis = tokenUtil.getUserIdFormRedis(); if(null == userIdFormRedis){ return ResultUtil.tokenErr(); } return tauService.productRedemptionOperation(userIdFormRedis,goodId,goodsType,nums,exchangeType,payType,stuIds); }catch (Exception e){ return ResultUtil.runErr(); } } /** * 积分明细 */ cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/MerChandiseClient.java
@@ -1,10 +1,7 @@ package com.dsh.account.feignclient.activity; import com.dsh.account.feignclient.activity.model.CommodityRequest; import com.dsh.account.feignclient.activity.model.IntegralCommodity; import com.dsh.account.feignclient.activity.model.PointsMerchandise; import com.dsh.account.feignclient.activity.model.ProductDetailRequest; import com.dsh.account.feignclient.activity.model.*; import com.dsh.account.model.vo.userBenefitDetail.ExchangeDetailsResponse; import com.dsh.account.model.vo.userBenefitDetail.PointDetailsVo; import com.dsh.account.model.vo.userBenefitDetail.ProductDetailsVo; @@ -36,4 +33,19 @@ @PostMapping("/base/pointMerchars/getSpecificsOfGoods") public PointDetailsVo getSpecificsOfGoods(@RequestBody Integer speMercharsId); @PostMapping("/base/pointMerchars/selectPointsMerchandiseById") public PointsMerchandise selectPointsMerchandiseById(@RequestBody Integer speMercharsId); @PostMapping("/base/pointMerchars/saveDetailsUserPointMercase") public void saveDetailsUserPointMercase(@RequestBody UserPointsMerchandise merchandise); @PostMapping("/base/pointMerchars/updateDetailsUserPointMercase") public void updateDetailsUserPointMercase(@RequestBody UserPointsMerchandise merchandise); @PostMapping("/base/pointMerchars/queryUserPointMerchaseByCode") public List<UserPointsMerchandise> queryUserPointMerchaseByCode(@RequestBody String code); } cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/MerChandiseStoreClient.java
New file @@ -0,0 +1,17 @@ package com.dsh.account.feignclient.activity; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @FeignClient(value = "mb-cloud-activity") public interface MerChandiseStoreClient { @PostMapping("/base/pointMerchars/queryStoreIdsOfMerchandise") List<Integer> queryPointMerStoreIds(@RequestBody Integer pointMerId); } cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/UserConponClient.java
@@ -1,6 +1,7 @@ package com.dsh.account.feignclient.activity; import com.dsh.account.feignclient.activity.model.CommodityRequest; import com.dsh.account.feignclient.activity.model.UserCoupon; import com.dsh.account.model.dto.Coupon; import com.dsh.account.model.vo.sourceDetail.CouponStuAvailableVo; import org.springframework.cloud.openfeign.FeignClient; @@ -25,4 +26,9 @@ @PostMapping("/base/coupon/getRedeemedNums") public int getRedeemedQuantity(@RequestBody Integer id); @PostMapping("/base/coupon/insertToAppuserCoupon") public void insertToAppuserCoupon(@RequestBody UserCoupon coupon); @PostMapping("/userCoupon/queryCouponOfStore") List<Integer> getCouponStoreIds(@RequestBody Integer couponId); } cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/PointsMerchandise.java
@@ -13,7 +13,7 @@ */ private Integer id; /** * 类型(1=实体商品,2=课包商品,3=门票商品) * 类型(1=实体商品,2=课包商品,3=门票商品,4=优惠券) */ private Integer type; /** @@ -104,5 +104,9 @@ * 添加时间 */ private Date insertTime; /** * 课包支付配置id */ private Integer coursePackageConfigId; } cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/UserCoupon.java
New file @@ -0,0 +1,49 @@ package com.dsh.account.feignclient.activity.model; import lombok.Data; import java.util.Date; /** * <p> * 用户优惠券领取记录 * </p> * * @author jqs * @since 2023-06-29 */ @Data public class UserCoupon { private static final long serialVersionUID = 1L; /** * 主键 */ private Long id; /** * 优惠券id */ private Integer couponId; /** * 用户id */ private Integer userId; /** * 状态(1=待核销,2=已核销) */ private Integer status; /** * 核销人员id */ private Integer verificationUserId; /** * 核销时间 */ private Date verificationTime; /** * 领取时间 */ private Date insertTime; } cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/UserPointsMerchandise.java
New file @@ -0,0 +1,69 @@ package com.dsh.account.feignclient.activity.model; import lombok.Data; import java.util.Date; /** * <p> * 用户积分商品领取记录 * </p> * * @author jqs * @since 2023-06-29 */ @Data public class UserPointsMerchandise{ private static final long serialVersionUID = 1L; /** * 主键 */ private Long id; /** * 优惠券id */ private Integer pointsMerchandiseId; /** * 用户id */ private Integer userId; /** * 核销人员id */ private Integer verificationUserId; /** * 核销门店id */ private Integer verifiStoreId; /** * 核销时间 */ private Date verificationTime; /** * 状态(1=待核销,2=已核销) */ private Integer status; /** * 领取时间 */ private Date insertTime; /** * 现金支付方式(1=微信2支付宝) */ private Integer payType; /** * 现金支付的交易凭证 */ private String code; /** * 现金支付的交易订单号 */ private String orderNumber; /** * 现金的支付状态(1=待支付 2=已支付) */ private Integer payStatus; } cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePackageConfigClient.java
New file @@ -0,0 +1,18 @@ package com.dsh.account.feignclient.course; import com.dsh.account.feignclient.course.model.CoursePackagePaymentConfig; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @FeignClient(value = "mb-cloud-course") public interface CoursePackageConfigClient { @PostMapping("/base/coursePack/getCoursePackageConfig") List<CoursePackagePaymentConfig> getCourseConfigList(@RequestBody Integer coursePackageId); } cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java
@@ -55,4 +55,8 @@ @PostMapping("/base/coursePack/obtainStudentClassDetails") List<RecordAppoint> obtainStudentClassDetailsData(@RequestBody Integer stuId); @PostMapping("/base/coursePack/getCoursePackagePaymentOfCode") List<TCoursePackagePayment> getCoursePackagePaymentOfCode(@RequestBody String code); } cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/CoursePackagePaymentConfig.java
New file @@ -0,0 +1,31 @@ package com.dsh.account.feignclient.course.model; import lombok.Data; /** * @author zhibing.pu * @date 2023/6/29 10:42 */ @Data public class CoursePackagePaymentConfig { /** * 主键 */ private Integer id; /** * 课包id */ private Integer coursePackageId; /** * 课时数 */ private Integer classHours; /** * 现金支付价格 */ private Double cashPayment; /** * 玩湃币价格 */ private Integer playPaiCoin; } cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/TCoursePackagePayment.java
@@ -25,7 +25,7 @@ */ private Integer coursePackageId; /** * 支付方式(1=微信 2=支付宝 3=玩湃币) * 支付方式(1=微信,2=支付宝,3=玩湃币,4=积分,5=积分+微信,6=积分+支付宝) */ private Integer payType; /** cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/ProductDetailsVo.java
@@ -19,7 +19,7 @@ @ApiModelProperty(value = "商品名称") private String goodName; @ApiModelProperty(value = "适用人群") @ApiModelProperty(value = "适用人群(1=全部用户,2=年度会员,3=已有学员用户)") private Integer belongsScope; @ApiModelProperty(value = "已兑换数量") @@ -33,6 +33,9 @@ @ApiModelProperty(value = "所需类型(积分/积分+现金)") private String requiredType; @ApiModelProperty(value = "兑换方式(1=积分,2=积分+现金)") private Integer exchangeType; @ApiModelProperty(value = "价值") private BigDecimal cost; @@ -52,6 +55,9 @@ @ApiModelProperty(value = "兑换说明") private String contents; @ApiModelProperty(value = "兑换地点类型 1=全国 2=指定城市 3指定门店") private Integer exchangeAddrType; @ApiModelProperty(value = "商品类型 1实物 2课包 3门票 4优惠券") private Integer goodType; cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/StoreResponse.java
New file @@ -0,0 +1,15 @@ package com.dsh.account.model.vo.userBenefitDetail; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class StoreResponse { @ApiModelProperty(value = "门店id") private Integer storeId; @ApiModelProperty(value = "门店名称") private String storeName; } cloud-server-account/src/main/java/com/dsh/account/model/vo/userBenefitDetail/StuAndStoreResponse.java
New file @@ -0,0 +1,28 @@ package com.dsh.account.model.vo.userBenefitDetail; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class StuAndStoreResponse { @ApiModelProperty(value = "门店id") private Integer storeId; @ApiModelProperty(value = "门店名称") private String storeName; @ApiModelProperty(value = "学员id") private Integer stuId; @ApiModelProperty(value = "学员姓名") private String stuName; @ApiModelProperty(value = "学员联系方式") private String stuPhone; @ApiModelProperty(value = "学员年龄") private Integer stuAge; } cloud-server-account/src/main/java/com/dsh/account/service/TAppUserService.java
@@ -126,4 +126,11 @@ ProductDetailsVo productDetails(Integer goodId, Integer goodsType ); StuAndStoreResponse queryAppUserDefaultStuAndStore(Integer userIdFormRedis ,Integer pointsMerId, String lat, String lon,Integer isCourse); ResultUtil productRedemptionOperation(Integer userIdFormRedis, Integer goodId, Integer goodsType,Integer nums,Integer exchangeType,Integer payType,List<Integer> stuIds); ResultUtil exchangeAddPaymentCallback(String code, String orderNumber,Integer payType); List<StoreResponse> queryStoresOfExchange(Integer goodsType,Integer pointsMerId); } cloud-server-account/src/main/java/com/dsh/account/service/impl/RechargeRecordsServiceImpl.java
@@ -108,6 +108,8 @@ } } // 3.场地预约 // TODO: 2023/7/14 充值明细的场地预约查询 // 4.智慧球场 // 5.充值 cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java
@@ -3,30 +3,25 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.account.entity.RechargeRecords; import com.dsh.account.entity.TAppUser; import com.dsh.account.entity.TStudent; import com.dsh.account.entity.VipPayment; import com.dsh.account.entity.*; import com.dsh.account.enums.RechargeRecordEnum; import com.dsh.account.feignclient.activity.MerChandiseClient; import com.dsh.account.feignclient.activity.MerChandiseStoreClient; import com.dsh.account.feignclient.activity.UserConponClient; import com.dsh.account.feignclient.activity.model.CommodityRequest; import com.dsh.account.feignclient.activity.model.PointsMerchandise; import com.dsh.account.feignclient.activity.model.ProductDetailRequest; import com.dsh.account.feignclient.activity.model.*; import com.dsh.account.feignclient.competition.DeductionCompetitionsClient; import com.dsh.account.feignclient.competition.model.PaymentCompetition; import com.dsh.account.feignclient.course.CoursePackageClient; import com.dsh.account.feignclient.course.CoursePackageConfigClient; import com.dsh.account.feignclient.course.CoursePaymentClient; import com.dsh.account.feignclient.course.model.*; import com.dsh.account.feignclient.other.ImgConfigClient; import com.dsh.account.feignclient.other.RechargeConfigClient; import com.dsh.account.feignclient.other.StoreClient; import com.dsh.account.feignclient.other.model.Store; import com.dsh.account.feignclient.other.model.StoreDetailOfCourse; import com.dsh.account.feignclient.other.model.TImgConfig; import com.dsh.account.mapper.RechargeRecordsMapper; import com.dsh.account.mapper.TAppUserMapper; import com.dsh.account.mapper.TStudentMapper; import com.dsh.account.mapper.VipPaymentMapper; import com.dsh.account.mapper.*; import com.dsh.account.model.AddAppUserVo; import com.dsh.account.model.JoinPlayPaiVo; import com.dsh.account.model.LoginSMSCodeVo; @@ -50,6 +45,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -113,6 +109,18 @@ @Resource private DeductionCompetitionsClient deducClient; @Resource private UserIntegralChangesMapper uicMapper; @Resource private MerChandiseStoreClient mcsClient; @Resource private CoursePackageConfigClient cpconClient; @Autowired private PayMoneyUtil payMoneyUtil; @Override public ClassInfoVo queryUserOfStus(Integer id,String latitude,String longitude) { @@ -537,6 +545,8 @@ } } // 4.场地预约 // TODO: 2023/7/14 账单的场地预约查询 // 5.智慧球场 // 6.年度会员 List<VipPayment> vipPayments = vipPaymentMapper.selectList(new QueryWrapper<VipPayment>() @@ -748,4 +758,358 @@ return mcClient.getGoodDetailsWithId(detailsVo); } @Override public StuAndStoreResponse queryAppUserDefaultStuAndStore(Integer userIdFormRedis,Integer pointsMerId, String lat, String lon,Integer isCourse) { StuAndStoreResponse response = new StuAndStoreResponse(); if (isCourse == 1){ List<TStudent> tStudents = tsmapper.selectList(new QueryWrapper<TStudent>() .eq("appUserId",userIdFormRedis) .eq("state",1) .eq("isDefault",1)); if (tStudents.size() > 0 ){ response.setStuId(tStudents.get(0).getId()); response.setStuName(tStudents.get(0).getName()); response.setStuPhone(tStudents.get(0).getPhone()); response.setStuAge(DateUtil.age(tStudents.get(0).getBirthday())); } return response; }else { PointsMerchandise pointsMerchandise = mcClient.selectPointsMerchandiseById(pointsMerId); if (pointsMerchandise.getType() == 4){ List<Integer> couponStoreIds = ucponClient.getCouponStoreIds(pointsMerId); StoreDetailOfCourse courseOfStore = storeClient.getCourseOfStore(couponStoreIds.get(0)); if(ToolUtil.isNotEmpty(courseOfStore)){ response.setStoreId(couponStoreIds.get(0)); response.setStoreName(courseOfStore.getStoreName()); } }else { List<Integer> integers = mcsClient.queryPointMerStoreIds(pointsMerId); StoreDetailOfCourse courseOfStore = storeClient.getCourseOfStore(integers.get(0)); if(ToolUtil.isNotEmpty(courseOfStore)){ response.setStoreId(integers.get(0)); response.setStoreName(courseOfStore.getStoreName()); } } return response; } } @Override public ResultUtil productRedemptionOperation(Integer userIdFormRedis, Integer goodId, Integer goodsType,Integer nums,Integer exchangeType,Integer payType,List<Integer> stuIds) { PointsMerchandise merchandise = mcClient.selectPointsMerchandiseById(goodId); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5); for (int i = 0; i < nums; i++) { UserPointsMerchandise pointsMerchandise = new UserPointsMerchandise(); pointsMerchandise.setPointsMerchandiseId(goodId); pointsMerchandise.setUserId(userIdFormRedis); pointsMerchandise.setCode(code); mcClient.saveDetailsUserPointMercase(pointsMerchandise); } // 扣减积分 TAppUser tAppUser = this.baseMapper.selectById(userIdFormRedis); // 积分变更记录 UserIntegralChanges userIntegralChanges = new UserIntegralChanges(); userIntegralChanges.setAppUserId(userIdFormRedis); userIntegralChanges.setOldIntegral(tAppUser.getIntegral()); userIntegralChanges.setType(2); tAppUser.setIntegral(null == tAppUser.getIntegral() ? merchandise.getIntegral() : tAppUser.getIntegral() +merchandise.getIntegral()); userIntegralChanges.setNewIntegral(tAppUser.getIntegral()); userIntegralChanges.setInsertTime(new Date()); uicMapper.insert(userIntegralChanges); this.baseMapper.updateById(tAppUser); // 现金支付 if (exchangeType == 2) { switch (goodsType) { case 2: for (int i = 0; i < stuIds.size(); i++) { List<CoursePackagePaymentConfig> courseConfigList = cpconClient.getCourseConfigList(merchandise.getCoursePackageId()); TCoursePackagePayment packagePayment = new TCoursePackagePayment(); packagePayment.setAppUserId(userIdFormRedis); packagePayment.setStudentId(stuIds.get(i)); packagePayment.setCoursePackageId(merchandise.getCoursePackageId()); for (CoursePackagePaymentConfig coursePackagePaymentConfig : courseConfigList) { if (Objects.equals(coursePackagePaymentConfig.getId(),merchandise.getCoursePackageConfigId())){ packagePayment.setClassHours(coursePackagePaymentConfig.getClassHours()); packagePayment.setTotalClassHours(coursePackagePaymentConfig.getClassHours()); packagePayment.setLaveClassHours(coursePackagePaymentConfig.getClassHours()); packagePayment.setOriginalPrice(coursePackagePaymentConfig.getCashPayment()); break; } } packagePayment.setPlayPaiCoin(merchandise.getIntegral()); packagePayment.setAbsencesNumber(0); packagePayment.setPayUserType(1); packagePayment.setPayStatus(1); packagePayment.setPayUserId(userIdFormRedis); packagePayment.setStatus(1); packagePayment.setState(1); packagePayment.setInsertTime(new Date()); packagePayment.setCode(code); paymentClient.savePaymentCoursePackage(packagePayment); } break; case 4: for (int i = 0; i < nums; i++) { UserCoupon coupon = new UserCoupon(); coupon.setCouponId(goodId); coupon.setUserId(userIdFormRedis); coupon.setStatus(1); coupon.setInsertTime(new Date()); ucponClient.insertToAppuserCoupon(coupon); } break; default: break; } switch (payType){ case 1: try { if (merchandise.getType() == 2){ return WechatPayment(merchandise.getCash().multiply(new BigDecimal(stuIds.size())),code); }else { return WechatPayment(merchandise.getCash().multiply(new BigDecimal(nums)),code); } }catch (Exception e){ return ResultUtil.runErr(); } case 2: if (merchandise.getType() == 2){ AlipayPayment(merchandise.getCash().multiply(new BigDecimal(stuIds.size())),code); }else { AlipayPayment(merchandise.getCash().multiply(new BigDecimal(nums)),code); } break; default: break; } } return ResultUtil.success(); } private ResultUtil AlipayPayment(BigDecimal cash, String code) { ResultUtil alipay = payMoneyUtil.alipay("课包续费", "", "", code, cash.toString(), "/base/pointMer/exchangeGoodPaymentAliCallback"); if(alipay.getCode() == 200){ new Thread(new Runnable() { @Override public void run() { try { int num = 1; int wait = 0; while (num <= 10){ int min = 5000; wait += (min * num); Thread.sleep(wait); List<UserPointsMerchandise> userPointsMerchandises = mcClient.queryUserPointMerchaseByCode(code); if(userPointsMerchandises.get(0).getPayStatus() == 2){ break; } ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryALIOrder(code); if(resultUtil.getCode() == 200 && userPointsMerchandises.get(0).getPayStatus() == 1){ /** * WAIT_BUYER_PAY(交易创建,等待买家付款)、 * TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、 * TRADE_SUCCESS(交易支付成功)、 * TRADE_FINISHED(交易结束,不可退款) */ Map<String, String> data1 = resultUtil.getData(); String s = data1.get("tradeStatus"); String tradeNo = data1.get("tradeNo"); // if("TRADE_CLOSED".equals(s) || "TRADE_FINISHED".equals(s) || num == 10){ // coursePackagePayment.setState(3); // couPayClient.delPaymentCoursePackage(coursePackagePayment.getId()); // break; // } if("TRADE_SUCCESS".equals(s)){ for (UserPointsMerchandise userPointsMerchandise : userPointsMerchandises) { userPointsMerchandise.setPayStatus(2); userPointsMerchandise.setOrderNumber(tradeNo); userPointsMerchandise.setPayType(2); mcClient.updateDetailsUserPointMercase(userPointsMerchandise); } break; } if("WAIT_BUYER_PAY".equals(s)){ num++; } } } }catch (Exception e){ e.printStackTrace(); } } }).start(); } return alipay; } private ResultUtil WechatPayment(BigDecimal cash, String code) throws Exception { ResultUtil weixinpay = payMoneyUtil.weixinpay("课包", "", code, cash.toString(), "/base/pointMer/exchangeGoodPaymentWeChatCallback", "APP", ""); if(weixinpay.getCode() == 200){ new Thread(new Runnable() { @Override public void run() { try { int num = 1; int wait = 0; while (num <= 10){ int min = 5000; wait += (min * num); Thread.sleep(wait); List<UserPointsMerchandise> userPointsMerchandises = mcClient.queryUserPointMerchaseByCode(code); if(userPointsMerchandises.get(0).getPayStatus() == 2){ break; } ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(code, ""); if(resultUtil.getCode() == 200 && userPointsMerchandises.get(0).getPayStatus() == 1){ /** * SUCCESS—支付成功, * REFUND—转入退款, * NOTPAY—未支付, * CLOSED—已关闭, * REVOKED—已撤销(刷卡支付), * USERPAYING--用户支付中, * PAYERROR--支付失败(其他原因,如银行返回失败) */ Map<String, String> data1 = resultUtil.getData(); String s = data1.get("trade_state"); String transaction_id = data1.get("transaction_id"); // if("REFUND".equals(s) || "NOTPAY".equals(s) || "CLOSED".equals(s) || "REVOKED".equals(s) || "PAYERROR".equals(s) || num == 10){ // coursePackagePayment.setState(3); // couPayClient.delPaymentCoursePackage(coursePackagePayment.getId()); // break; // } if("SUCCESS".equals(s)){ for (UserPointsMerchandise userPointsMerchandise : userPointsMerchandises) { userPointsMerchandise.setPayStatus(2); userPointsMerchandise.setOrderNumber(transaction_id); userPointsMerchandise.setPayType(1); mcClient.updateDetailsUserPointMercase(userPointsMerchandise); } break; } if("USERPAYING".equals(s)){ num++; } } } }catch (Exception e){ e.printStackTrace(); } } }).start(); } return weixinpay; } @Override public ResultUtil exchangeAddPaymentCallback(String code, String orderNumber,Integer payType) { List<UserPointsMerchandise> userPointsMerchandises = mcClient.queryUserPointMerchaseByCode(code); if (userPointsMerchandises.size() > 1){ for (int i = 0; i < userPointsMerchandises.size(); i++) { userPointsMerchandises.get(i).setOrderNumber(orderNumber+ "-" + (i+1)); userPointsMerchandises.get(i).setPayType(payType); userPointsMerchandises.get(i).setPayStatus(2); mcClient.updateDetailsUserPointMercase(userPointsMerchandises.get(i)); Integer pointsMerchandiseId = userPointsMerchandises.get(i).getPointsMerchandiseId(); PointsMerchandise pointsMerchandise = mcClient.selectPointsMerchandiseById(pointsMerchandiseId); switch (pointsMerchandise.getType()){ case 2: List<TCoursePackagePayment> coursePackagePaymentOfCode = paymentClient.getCoursePackagePaymentOfCode(code); for (TCoursePackagePayment coursePackagePayment : coursePackagePaymentOfCode) { coursePackagePayment.setPayStatus(2); coursePackagePayment.setPayType(payType); coursePackagePayment.setOrderNumber(orderNumber); coursePackagePayment.setCashPayment(pointsMerchandise.getCash()); paymentClient.updatePaymentCoursePackage(coursePackagePayment); } break; case 4: UserCoupon coupon = new UserCoupon(); coupon.setCouponId(userPointsMerchandises.get(0).getPointsMerchandiseId()); coupon.setUserId(userPointsMerchandises.get(0).getUserId()); coupon.setStatus(1); coupon.setInsertTime(new Date()); ucponClient.insertToAppuserCoupon(coupon); break; default: break; } } }else { userPointsMerchandises.get(0).setOrderNumber(orderNumber); userPointsMerchandises.get(0).setPayType(payType); userPointsMerchandises.get(0).setPayStatus(2); mcClient.updateDetailsUserPointMercase(userPointsMerchandises.get(0)); Integer pointsMerchandiseId = userPointsMerchandises.get(0).getPointsMerchandiseId(); PointsMerchandise pointsMerchandise = mcClient.selectPointsMerchandiseById(pointsMerchandiseId); switch (pointsMerchandise.getType()){ case 2: List<TCoursePackagePayment> coursePackagePaymentOfCode = paymentClient.getCoursePackagePaymentOfCode(code); TCoursePackagePayment packagePayment =coursePackagePaymentOfCode.get(0); packagePayment.setPayStatus(2); packagePayment.setPayType(payType); packagePayment.setOrderNumber(orderNumber); packagePayment.setCashPayment(pointsMerchandise.getCash()); paymentClient.updatePaymentCoursePackage(packagePayment); break; case 4: UserCoupon coupon = new UserCoupon(); coupon.setCouponId(userPointsMerchandises.get(0).getPointsMerchandiseId()); coupon.setUserId(userPointsMerchandises.get(0).getUserId()); coupon.setStatus(1); coupon.setInsertTime(new Date()); ucponClient.insertToAppuserCoupon(coupon); break; default: break; } } return ResultUtil.success(); } @Override public List<StoreResponse> queryStoresOfExchange(Integer goodsType,Integer pointsMerId) { List<StoreResponse> responses = new ArrayList<>(); if (goodsType == 4){ List<Integer> couponStoreIds = ucponClient.getCouponStoreIds(pointsMerId); for (Integer couponStoreId : couponStoreIds) { StoreDetailOfCourse courseOfStore = storeClient.getCourseOfStore(couponStoreId); if(ToolUtil.isNotEmpty(courseOfStore)){ StoreResponse response = new StoreResponse(); response.setStoreId(couponStoreId); response.setStoreName(courseOfStore.getStoreName()); responses.add(response); } } }else { List<Integer> integers = mcsClient.queryPointMerStoreIds(pointsMerId); for (Integer integer : integers) { StoreDetailOfCourse courseOfStore = storeClient.getCourseOfStore(integer); if(ToolUtil.isNotEmpty(courseOfStore)){ StoreResponse response = new StoreResponse(); response.setStoreId(integer); response.setStoreName(courseOfStore.getStoreName()); responses.add(response); } } } return responses; } } cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java
@@ -155,4 +155,14 @@ .eq("couponId",id)); } @PostMapping("/base/coupon/insertToAppuserCoupon") public void insertToAppuserCoupon(@RequestBody UserCoupon coupon){ ucService.save(coupon); } } cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
@@ -14,6 +14,7 @@ import com.dsh.activity.service.*; import com.dsh.activity.util.GDMapGeocodingUtil; import com.dsh.activity.util.StrUtils; import com.dsh.activity.util.TokenUtil; import com.dsh.activity.util.ToolUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; @@ -23,6 +24,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @RestController @RequestMapping("") @@ -58,6 +60,9 @@ @Autowired private CouponStoreService cstoreService; @Autowired private TokenUtil tokenUtil; @PostMapping("/base/pointMerchars/convertGoods") @@ -121,7 +126,7 @@ switch (detailRequest.getGoodsType()){ case 2: // 课包 CoursePackage coursePackage = cpClient.queryCoursePackageById(detailRequest.getGoodId()); CoursePackage coursePackage = cpClient.queryCoursePackageById(merchandise.getCoursePackageId()); detailsVo.setGoodId(coursePackage.getId()); List<String> list1 = Arrays.asList(StrUtils.splitStr2StrArr(coursePackage.getDetailDrawing(), ",")); @@ -144,16 +149,21 @@ detailsVo.setResidueNum(merchandise.getQuantityIssued() - coursePackageNums); detailsVo.setPerLimit(merchandise.getPickUpQuantity()); if (merchandise.getRedemptionMethod() == 1){ detailsVo.setExchangeType(1); detailsVo.setRequiredType(merchandise.getIntegral() + "积分"); }else { detailsVo.setExchangeType(2); detailsVo.setRequiredType(merchandise.getIntegral() + "积分+¥"+merchandise.getCash()); } detailsVo.setCost(merchandise.getPrice()); if (merchandise.getUseScope() == 1){ detailsVo.setExchangeAddrType(1); detailsVo.setBelongs("全国通用"); }else if (merchandise.getUseScope() == 2){ detailsVo.setExchangeAddrType(2); detailsVo.setBelongs(merchandise.getProvince()+"|"+merchandise.getCity() + "用户可用"); }else { detailsVo.setExchangeAddrType(3); List<PointsMerchandiseStore> list = pmdstoService.list(new QueryWrapper<PointsMerchandiseStore>() .eq("pointsMerchandiseId",merchandise.getId() )); PointsMerchandiseStore pointsMerchandiseStore = list.get(0); @@ -161,12 +171,13 @@ detailsVo.setBelongs(courseOfStore.getStoreName()+"可用"); } List<CoursePackagePaymentConfig> courseConfigList = cpcfigClient.getCourseConfigList(coursePackage.getId()); int redul = 0; for (CoursePackagePaymentConfig coursePackagePaymentConfig : courseConfigList) { redul = redul + coursePackagePaymentConfig.getClassHours(); if (Objects.equals(coursePackagePaymentConfig.getId(), merchandise.getCoursePackageConfigId())){ detailsVo.setCourseHours(coursePackagePaymentConfig.getClassHours()); break; } detailsVo.setCourseHours(redul); } detailsVo.setStartTime(format.format(merchandise.getStartTime())); detailsVo.setEndTime(format.format(merchandise.getEndTime())); @@ -394,4 +405,40 @@ return detailsVo; } @PostMapping("/base/pointMerchars/selectPointsMerchandiseById") public PointsMerchandise selectPointsMerchandiseById(@RequestBody Integer speMercharsId){ return pmdsService.getById(speMercharsId); } @PostMapping("/base/pointMerchars/saveDetailsUserPointMercase") public void saveDetailsUserPointMercase(@RequestBody UserPointsMerchandise merchandise){ upmseService.save(merchandise); } @PostMapping("/base/pointMerchars/updateDetailsUserPointMercase") public void updateDetailsUserPointMercase(@RequestBody UserPointsMerchandise merchandise){ upmseService.updateById(merchandise); } @PostMapping("/base/pointMerchars/queryUserPointMerchaseByCode") public List<UserPointsMerchandise> queryUserPointMerchaseByCode(@RequestBody String code){ return upmseService.list(new QueryWrapper<UserPointsMerchandise>() .eq("code",code)); } @PostMapping("/base/pointMerchars/queryStoreIdsOfMerchandise") public List<Integer> queryPointMerStoreIds(@RequestBody Integer pointMerId){ List<Integer> storeIds = new ArrayList<>(); List<PointsMerchandiseStore> list = pmdstoService.list(new QueryWrapper<PointsMerchandiseStore>() .eq("pointsMerchandiseId",pointMerId)); if (list.size() > 0){ storeIds = list.stream().map(PointsMerchandiseStore::getStoreId).collect(Collectors.toList()); } return storeIds; } } cloud-server-activity/src/main/java/com/dsh/activity/controller/UserCouponController.java
@@ -2,9 +2,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.dsh.activity.entity.Coupon; import com.dsh.activity.entity.CouponStore; import com.dsh.activity.entity.UserCoupon; import com.dsh.activity.feignclient.model.CouponStuAvailableVo; import com.dsh.activity.model.CouponListVo; import com.dsh.activity.service.CouponStoreService; import com.dsh.activity.service.ICouponService; import com.dsh.activity.service.UserCouponService; import com.dsh.activity.util.ResultUtil; @@ -29,9 +31,6 @@ public class UserCouponController { @Autowired private UserCouponService uconService; @Autowired private ICouponService cService; @Autowired @@ -39,6 +38,10 @@ @Autowired private UserCouponService userCouponService; @Autowired private CouponStoreService csServie; @@ -50,7 +53,7 @@ List<CouponStuAvailableVo> availableVos = new ArrayList<>(); List<UserCoupon> list = uconService.list(new QueryWrapper<UserCoupon>() List<UserCoupon> list = userCouponService.list(new QueryWrapper<UserCoupon>() .eq("userId", appUserId) .eq("status",1)); if (list.size() > 0){ @@ -127,4 +130,23 @@ return null; } } @PostMapping("/userCoupon/queryCouponOfStore") public List<Integer> getCouponStoreIds(@RequestBody Integer couponId){ try { List<Integer> storeIds = new ArrayList<>(); List<CouponStore> list = csServie.list(new QueryWrapper<CouponStore>() .eq("couponId",couponId)); if (list.size() > 0 ){ storeIds = list.stream().map(CouponStore::getStoreId).collect(Collectors.toList()); } return storeIds; }catch (Exception e){ e.printStackTrace(); return null; } } } cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java
@@ -149,7 +149,11 @@ */ @TableField("insertTime") private Date insertTime; /** * 课包支付配置id */ @TableField("coursePackageConfigId") private Integer coursePackageConfigId; @Override protected Serializable pkVal() { cloud-server-activity/src/main/java/com/dsh/activity/entity/UserPointsMerchandise.java
@@ -68,7 +68,26 @@ */ @TableField("insertTime") private Date insertTime; /** * 现金支付方式(1=微信2支付宝) */ @TableField("payType") private Integer payType; /** * code */ @TableField("code") private String code; /** * orderNumber */ @TableField("orderNumber") private String orderNumber; /** * 现金的支付状态 */ @TableField("payStatus") private Integer payStatus; @Override protected Serializable pkVal() { cloud-server-activity/src/main/java/com/dsh/activity/feignclient/MerChandiseClient.java
@@ -2,6 +2,7 @@ import com.dsh.activity.entity.PointsMerchandise; import com.dsh.activity.entity.UserPointsMerchandise; import com.dsh.activity.feignclient.model.*; import com.dsh.activity.model.request.CommodityRequest; import org.springframework.cloud.openfeign.FeignClient; @@ -34,4 +35,17 @@ public PointDetailsVo getSpecificsOfGoods(@RequestBody Integer speMercharsId); @PostMapping("/base/pointMerchars/selectPointsMerchandiseById") public PointsMerchandise selectPointsMerchandiseById(@RequestBody Integer speMercharsId); @PostMapping("/base/pointMerchars/saveDetailsUserPointMercase") public void saveDetailsUserPointMercase(@RequestBody UserPointsMerchandise merchandise); @PostMapping("/base/pointMerchars/updateDetailsUserPointMercase") public void updateDetailsUserPointMercase(@RequestBody UserPointsMerchandise merchandise); @PostMapping("/base/pointMerchars/queryUserPointMerchaseByCode") public List<UserPointsMerchandise> queryUserPointMerchaseByCode(@RequestBody String code); } cloud-server-activity/src/main/java/com/dsh/activity/feignclient/MerChandiseStoreClient.java
New file @@ -0,0 +1,17 @@ package com.dsh.activity.feignclient; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @FeignClient(value = "mb-cloud-activity") public interface MerChandiseStoreClient { @PostMapping("/base/pointMerchars/queryStoreIdsOfMerchandise") List<Integer> queryPointMerStoreIds(@RequestBody Integer pointMerId); } cloud-server-activity/src/main/java/com/dsh/activity/feignclient/UserConponClient.java
@@ -1,6 +1,7 @@ package com.dsh.activity.feignclient; import com.dsh.activity.entity.Coupon; import com.dsh.activity.entity.UserCoupon; import com.dsh.activity.feignclient.model.CouponStuAvailableVo; import com.dsh.activity.model.request.CommodityRequest; import org.springframework.cloud.openfeign.FeignClient; @@ -24,4 +25,11 @@ @PostMapping("/base/coupon/getRedeemedNums") public int getRedeemedQuantity(@RequestBody Integer id); @PostMapping("/base/coupon/insertToAppuserCoupon") public void insertToAppuserCoupon(@RequestBody UserCoupon coupon); @PostMapping("/userCoupon/queryCouponOfStore") List<Integer> getCouponStoreIds(@RequestBody Integer couponId); } cloud-server-activity/src/main/java/com/dsh/activity/feignclient/course/model/CoursePackage.java
@@ -81,7 +81,7 @@ */ private Integer sort; /** * 支付方式(1=微信 2=支付宝 3=玩湃币) * 支付方式(1=微信,2=支付宝,3=玩湃币,4=积分,5=积分+微信,6=积分+支付宝) */ private Integer payType; /** cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/ProductDetailsVo.java
@@ -34,6 +34,10 @@ @ApiModelProperty(value = "所需类型(积分/积分+现金)") private String requiredType; @ApiModelProperty(value = "兑换方式(1=积分,2=积分+现金)") private Integer exchangeType; @ApiModelProperty(value = "价值") private BigDecimal cost; @@ -52,6 +56,9 @@ @ApiModelProperty(value = "兑换说明") private String contents; @ApiModelProperty(value = "兑换地点类型 1=全国 2=指定城市 3指定门店") private Integer exchangeAddrType; @ApiModelProperty(value = "商品类型 1实物 2课包 3门票 4优惠券") private Integer goodType; cloud-server-activity/src/main/java/com/dsh/activity/util/UUIDUtil.java
New file @@ -0,0 +1,101 @@ package com.dsh.activity.util; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; /** * 定义生成随机码的工具类 */ public class UUIDUtil { private int i = 1; /** * 定义生成原生的UUID随机码 * @return */ public static String getNativeUUID(){ return UUID.randomUUID().toString(); } /** * 生成32位随机码 * @return */ public static String getRandomCode(){ return UUIDUtil.getNativeUUID().replaceAll("-", ""); } /** * 获取给定长度的随机码 * @param num * @return * @throws Exception */ public static String getRandomCode(Integer num) throws Exception{ String str = null; if(0 < num){ if(num % 32 > 0){ Integer s = num / 32; Integer l = num % 32; StringBuffer sb = new StringBuffer(); for(int i = 0; i < s; i++){ sb.append(UUIDUtil.getRandomCode()); } sb.append(UUIDUtil.getRandomCode().substring(0, l)); str = sb.toString(); }else if(num % 32 == 0){ Integer s = num / 32; StringBuffer sb = new StringBuffer(); for(int i = 0; i < s; i++){ sb.append(UUIDUtil.getRandomCode()); } str = sb.toString(); }else{ str = UUIDUtil.getRandomCode().substring(0, num); } }else{ throw new Exception("参数只能大于0"); } return str; } /** * 获取根据当前时间的字符串数据 * @return */ public synchronized static String getTimeStr(){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddhhmmssS"); return simpleDateFormat.format(new Date()); } /** * @Description: 获取数字随机码 * @Author pzb * @Date 2021/8/11 16:52 * @Param * @Return * @Exception */ public static String getNumberRandom(Integer num){ if(null == num){ num = 32; } StringBuffer sb = new StringBuffer(); for(int i = 0; i < num; i++){ sb.append(Double.valueOf(Math.random() * 10).intValue()); } return sb.toString(); } } cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
@@ -700,4 +700,12 @@ .eq("coursePackageId",coursePackageId)); } @PostMapping("/base/coursePack/getCoursePackagePaymentOfCode") public List<TCoursePackagePayment> getCoursePackagePaymentOfCode(@RequestBody String code){ return packagePaymentService.list(new QueryWrapper<TCoursePackagePayment>() .eq("code",code)); } } cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java
@@ -52,7 +52,7 @@ @TableField("coursePackageId") private Integer coursePackageId; /** * 支付方式(1=微信,2=支付宝,3=玩湃币) * 支付方式(1=微信,2=支付宝,3=玩湃币,4=积分,5=积分+微信,6=积分+支付宝) */ @TableField("payType") private Integer payType; @@ -77,7 +77,7 @@ @TableField("cashPayment") private BigDecimal cashPayment; /** * 玩湃币价格 * 玩湃币价格/积分 */ @TableField("playPaiCoin") private Integer playPaiCoin; cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java
@@ -61,4 +61,8 @@ @PostMapping("/base/coursePack/obtainStudentClassDetails") List<RecordAppoint> obtainStudentClassDetailsData(@RequestBody Integer stuId); @PostMapping("/base/coursePack/getCoursePackagePaymentOfCode") List<TCoursePackagePayment> getCoursePackagePaymentOfCode(@RequestBody String code); } cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java