Commit dc174da3 authored by liuyang's avatar liuyang

完成微信H5下单处理

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