Commit dc174da3 authored by liuyang's avatar liuyang

完成微信H5下单处理

parent 2fb69d4c
......@@ -8,6 +8,7 @@ import com.qkdata.biz.management.vo.TeacherModel;
import com.qkdata.common.annotation.SysLog;
import com.qkdata.common.base.model.PageResult;
import com.qkdata.common.base.model.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresRoles;
......@@ -28,6 +29,7 @@ import java.util.List;
* @author liuyang
* @since 2021-05-18
*/
@Api(tags = "讲师管理")
@RestController
@RequestMapping("/api/mgr/teacher")
public class TeacherController {
......
......@@ -38,6 +38,10 @@ public class ProductOrderPO extends BasePO {
* 用户ID
*/
private Long userId;
/**
* 用户所属企业ID
*/
private Long orgId;
/**
* 产品类型(个人包月、企业包月、付费点播)
......
......@@ -7,8 +7,6 @@ import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
import com.github.binarywang.wxpay.exception.WxPayException;
......@@ -17,12 +15,10 @@ import com.qkdata.biz.common.BizConstants;
import com.qkdata.biz.enums.*;
import com.qkdata.biz.management.entity.CoursePO;
import com.qkdata.biz.management.entity.ProductOrderPO;
import com.qkdata.biz.management.entity.UserCourseAuthPO;
import com.qkdata.biz.management.mapper.ProductOrderMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qkdata.biz.management.vo.ProductOrderModel;
import com.qkdata.biz.management.vo.QueryProductOrderModel;
import com.qkdata.biz.sys.entity.SysUserPO;
import com.qkdata.biz.sys.service.SysConfigService;
import com.qkdata.biz.sys.service.SysRoleService;
import com.qkdata.biz.sys.service.SysUserService;
......@@ -31,15 +27,15 @@ import com.qkdata.biz.web.vo.*;
import com.qkdata.common.base.enums.CodeEnum;
import com.qkdata.common.base.exception.BusinessException;
import com.qkdata.common.base.model.PageResult;
import com.qkdata.common.base.model.Result;
import com.qkdata.common.util.HttpContextUtils;
import com.qkdata.common.util.IPUtils;
import com.qkdata.common.util.UserContext;
import com.qkdata.wx.pay.config.WxPayProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.sql.DataSource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
......@@ -72,12 +68,6 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
@Autowired
private OrgSurplusService orgSurplusService;
public void createOrder(UserBuyVIPModel model) {
}
private String generateOrderNo() {
DateTime nowDateTime = DateUtil.date();
String dateStr = DateUtil.format(nowDateTime,"yyyyMMddHHmmssSSS");
......@@ -107,29 +97,38 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
return wxService.createOrder(payRequest);
}
public CreateOrderResult userBuyVIP(UserBuyVIPModel model) {
@Transactional
public CreateOrderResult createOrder(CreateOrderModel model) {
CreateOrderResult result = new CreateOrderResult();
ProductOrderPO orderPO = createPO(ProductTypeEnum.USER_VIP,model.getCount(),model.getPayMethod(),model.getCourseId());
ProductOrderPO orderPO = createPO(model);
save(orderPO);
result.setOrderNo(orderPO.getOrderNo());
Object rtObj = prePay(orderPO,model.getSource());
result.setResult(rtObj);
return result;
}
private Object prePay(ProductOrderPO orderPO,PaySourceEnum source){
if (orderPO.getPayMethod() == PayMethodEnum.WeiXin){
try {
Object rtObj = wxCreateOrder(orderPO,model.getSource());
result.setResult(rtObj);
save(orderPO);
return result;
Object rtObj = wxCreateOrder(orderPO,source);
return rtObj;
} catch (WxPayException e) {
log.error(e.getMessage(),e);
throw new BusinessException("微信支付异常");
}
}else if (orderPO.getPayMethod() == PayMethodEnum.AliPay){
return result;
//todo
return null;
}
return result;
return null;
}
private ProductOrderPO createPO(ProductTypeEnum productType, int count, PayMethodEnum payMehtod,Long courseId){
private ProductOrderPO createPO(CreateOrderModel model){
ProductOrderPO po = new ProductOrderPO();
po.setOrderNo(generateOrderNo());
po.setProductType(productType);
po.setProductType(model.getProductType());
FullUserInfo userInfo = sysUserService.findFullUserInfo(model.getUsername());
switch (po.getProductType()){
case USER_VIP:
po.setOrderName("会员包月");
......@@ -146,29 +145,30 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
throw new BusinessException("处理错误,尚未配置企业会员价格");
}
po.setProductPrice(new BigDecimal(enterpriseVipPriceStr));
po.setOrgId(userInfo.getEnterpriseId());
break;
case COURSE_BUY:
CoursePO coursePO = courseService.getById(courseId);
case ENTERPRISE_COURSE_BUY:case COURSE_BUY:
CoursePO coursePO = courseService.getById(model.getCourseId());
if (coursePO == null){
throw new BusinessException("请求错误,课程不存在");
}
String orderName = "付费点播:{}";
po.setOrderName(StrUtil.format(orderName,coursePO.getName()));
FullUserInfo userInfo = sysUserService.findFullUserInfo(UserContext.getUser().getUsername());
if (userInfo.getType() == AccountTypeEnum.USER){
po.setProductPrice(coursePO.getPrice());
}else {
po.setProductPrice(coursePO.getVipPrice());
}
po.setOrgId(userInfo.getEnterpriseId());
break;
default:
throw new BusinessException("购买产品类型错误");
}
po.setProductCount(count);
po.setProductCount(model.getCount());
po.setOrderMoney(po.getProductPrice().multiply(new BigDecimal(po.getProductCount())));
po.setPaymentMoney(po.getOrderMoney());
po.setCourseId(courseId);
po.setPayMethod(payMehtod);
po.setCourseId(model.getCourseId());
po.setPayMethod(model.getPayMethod());
po.setStatus(ProductOrderStatusEnum.WAIT_PAY);
po.setUserId(UserContext.getUserId());
return po;
......@@ -197,6 +197,7 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
}
WxPayOrderQueryResult queryResult = wxService.queryOrder(null, orderNo);
if ("SUCCESS".equals(queryResult.getTradeState())){
updateStatus(orderNo,ProductOrderStatusEnum.PAY_COMPLETE);
return ProductOrderStatusEnum.PAY_COMPLETE;
}else {
return ProductOrderStatusEnum.PAY_FAILD;
......@@ -257,4 +258,18 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
}
public CreateOrderResult payAgain(String orderNo,PaySourceEnum source) {
ProductOrderPO orderPO = getByOrderNo(orderNo);
if (orderPO == null){
throw new BusinessException("请求错误,订单不存在");
}
if (orderPO.getStatus() == ProductOrderStatusEnum.PAY_COMPLETE){
throw new BusinessException("订单已完成,请不要重覆支付");
}
CreateOrderResult result = new CreateOrderResult();
result.setOrderNo(orderNo);
Object rtObj = prePay(orderPO,source);
result.setResult(rtObj);
return result;
}
}
\ No newline at end of file
......@@ -8,4 +8,6 @@ public class QueryProductOrderModel {
private int pageIndex = Constants.DEFAULT_PAGE;
private int pageSize = Constants.DEFAULT_PAGE_SIZE;
private String username;
private boolean isEnterprise = false;
private Long orgId;
}
package com.qkdata.biz.web.controller;
import com.qkdata.biz.common.BizConstants;
import com.qkdata.biz.enums.PaySourceEnum;
import com.qkdata.biz.enums.ProductOrderStatusEnum;
import com.qkdata.biz.enums.ProductTypeEnum;
import com.qkdata.biz.management.entity.CoursePO;
import com.qkdata.biz.management.service.CourseService;
import com.qkdata.biz.management.service.ProductOrderService;
import com.qkdata.biz.web.vo.CreateOrderModel;
import com.qkdata.biz.web.vo.CreateOrderResult;
import com.qkdata.common.base.exception.BusinessException;
import com.qkdata.common.base.model.Result;
import com.qkdata.common.util.UserContext;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Api(tags = "用户下单处理-手机端")
@RestController
@RequestMapping("/api/productOrder")
public class FrontendProductOrderController {
@Autowired
private ProductOrderService orderService;
@Autowired
private CourseService courseService;
@ApiOperation("购买时新建订单")
@PostMapping("/createOrder")
@RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR)
public Result<CreateOrderResult> createOrder(@RequestBody CreateOrderModel model){
model.setUserId(UserContext.getUserId());
model.setUsername(UserContext.getUser().getUsername());
if (model.getProductType() == ProductTypeEnum.ENTERPRISE_COURSE_BUY || model.getProductType() == ProductTypeEnum.COURSE_BUY){
if (model.getCourseId() == null){
throw new BusinessException("请求错误,课程ID不能为空");
}
CoursePO coursePO = courseService.getById(model.getCourseId());
if (coursePO == null){
throw new BusinessException("请求错误,课程不存在");
}
}
if (model.getCount() <= 0){
throw new BusinessException("请求错误,购买数量不能为0");
}
CreateOrderResult result = orderService.createOrder(model);
return Result.succeed(result);
}
@ApiOperation("查询订单状态")
@GetMapping("/user/queryOrderStatus")
@RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR)
public Result<ProductOrderStatusEnum> queryOrderStatus(@RequestParam String orderNo){
ProductOrderStatusEnum status = orderService.queryStatus(orderNo);
return Result.succeed(status);
}
@ApiOperation("重新支付")
@PostMapping("/payAgain")
@RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR)
public Result<CreateOrderResult> payAgain(@RequestParam String orderNo, @RequestParam PaySourceEnum source){
CreateOrderResult result = orderService.payAgain(orderNo,source);
return Result.succeed(result);
}
}
......@@ -8,7 +8,6 @@ import com.qkdata.biz.enums.OrgTypeEnum;
import com.qkdata.biz.enums.ProductTypeEnum;
import com.qkdata.biz.management.entity.OrgSurplusPO;
import com.qkdata.biz.management.entity.OrganizationPO;
import com.qkdata.biz.management.mapper.CourseMapper;
import com.qkdata.biz.management.service.*;
import com.qkdata.biz.management.vo.*;
import com.qkdata.biz.sys.service.SysUserService;
......@@ -24,7 +23,6 @@ import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.rmi.MarshalledObject;
import java.util.Map;
@Api(tags = "我的企业相关接口-手机端")
......@@ -169,12 +167,13 @@ public class MyEnterpriseController {
return Result.succeed("ok");
}
// @ApiOperation("企业购买记录列表")
// @PostMapping("/order/list")
// @RequiresRoles(value = {BizConstants.ROLE_ENTERPRISE_ADMIN})
// public PageResult<ProductOrderModel> userOrderList(@RequestBody QueryProductOrderModel model){
// model.setUsername(UserContext.getUser().getUsername());
// return orderService.queryPageList(model);
// }
@ApiOperation("企业购买记录列表")
@PostMapping("/order/list")
@RequiresRoles(value = {BizConstants.ROLE_ENTERPRISE_ADMIN})
public PageResult<ProductOrderModel> userOrderList(@RequestBody QueryProductOrderModel model){
model.setEnterprise(true);
model.setOrgId(userService.getUserEnterpriesId(UserContext.getUserId()));
return orderService.queryPageList(model);
}
}
......@@ -2,7 +2,6 @@ package com.qkdata.biz.web.controller;
import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthResponse;
import com.qkdata.biz.common.BizConstants;
import com.qkdata.biz.enums.ProductOrderStatusEnum;
import com.qkdata.biz.management.service.CourseService;
import com.qkdata.biz.management.service.ProductOrderService;
import com.qkdata.biz.management.vo.ProductOrderModel;
......@@ -98,20 +97,7 @@ public class UserCenterController {
return Result.succeed(response);
}
@ApiOperation("个人购买创建订单")
@PostMapping("/user/createOrder")
@RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR)
public Result<CreateOrderResult> createOrder(@RequestBody UserBuyVIPModel model){
CreateOrderResult result = orderService.userBuyVIP(model);
return Result.succeed(result);
}
@ApiOperation("查询订单状态")
@GetMapping("/user/queryOrderStatus")
@RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR)
public Result<ProductOrderStatusEnum> queryOrderStatus(@RequestParam String orderNo){
ProductOrderStatusEnum status = orderService.queryStatus(orderNo);
return Result.succeed(status);
}
@ApiOperation("已购课程列表")
@PostMapping("/course/buy/list")
@RequiresRoles(value = {BizConstants.ROLE_USER,BizConstants.ROLE_ENTERPRISE_ADMIN},logical = Logical.OR)
......
......@@ -2,13 +2,17 @@ package com.qkdata.biz.web.vo;
import com.qkdata.biz.enums.PayMethodEnum;
import com.qkdata.biz.enums.PaySourceEnum;
import com.qkdata.biz.enums.ProductTypeEnum;
import lombok.Data;
/**
* 个人购买VIP请求参数
* 创建订单请求参数
*/
@Data
public class UserBuyVIPModel {
public class CreateOrderModel {
private Long userId;
private String username;
private ProductTypeEnum productType;
private int count;
private Long courseId;
private PayMethodEnum payMethod;
......
......@@ -36,9 +36,9 @@ public class WxPayNotifyController {
try {
final WxPayOrderNotifyResult notifyResult = this.wxPayService.parseOrderNotifyResult(xmlData);
log.info(notifyResult.toString());
outTradeNo = notifyResult.getOutTradeNo();
notifyResult.checkResult(wxPayService,notifyResult.getSignType(),true);
outTradeNo = notifyResult.getOutTradeNo();
orderService.orderComplete(outTradeNo);
}catch (WxPayException e){
......
ALTER TABLE `product_order`
ADD COLUMN `org_id` bigint(20) NULL AFTER `user_id`;
\ No newline at end of file
......@@ -12,6 +12,9 @@
<if test="p.username != null and p.username != ''">
and u.username like concat ('%',#{p.username},'%')
</if>
<if test="p.orgId != null">
and o.org_id = #{p.orgId}
</if>
order by `status` DESC,create_time DESC
</select>
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment