OrderController.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package com.qxgmat.controller.api;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.github.pagehelper.Page;
  4. import com.nuliji.tools.PageMessage;
  5. import com.nuliji.tools.Response;
  6. import com.nuliji.tools.ResponseHelp;
  7. import com.nuliji.tools.Transform;
  8. import com.nuliji.tools.exception.ParameterException;
  9. import com.nuliji.tools.pay.data.PayResponseData;
  10. import com.qxgmat.data.constants.enums.ServiceKey;
  11. import com.qxgmat.data.constants.enums.SettingKey;
  12. import com.qxgmat.data.constants.enums.module.ProductType;
  13. import com.qxgmat.data.constants.enums.status.DirectionStatus;
  14. import com.qxgmat.data.constants.enums.trade.PayChannel;
  15. import com.qxgmat.data.constants.enums.trade.PayModule;
  16. import com.qxgmat.data.dao.entity.*;
  17. import com.qxgmat.dto.extend.CourseDataExtendDto;
  18. import com.qxgmat.dto.extend.CourseExtendDto;
  19. import com.qxgmat.dto.extend.CoursePackageExtendDto;
  20. import com.qxgmat.dto.extend.UserOrderRecordExtendDto;
  21. import com.qxgmat.dto.request.OrderConfirmDto;
  22. import com.qxgmat.dto.request.PayOrderDto;
  23. import com.qxgmat.dto.request.RecordAddDto;
  24. import com.qxgmat.dto.request.RecordUseDto;
  25. import com.qxgmat.dto.response.UserOrderPreDto;
  26. import com.qxgmat.dto.response.UserOrderRecordListDto;
  27. import com.qxgmat.help.ShiroHelp;
  28. import com.qxgmat.service.extend.OrderFlowService;
  29. import com.qxgmat.service.extend.TradeService;
  30. import com.qxgmat.service.inline.*;
  31. import io.swagger.annotations.Api;
  32. import io.swagger.annotations.ApiOperation;
  33. import org.springframework.beans.factory.annotation.Autowired;
  34. import org.springframework.http.MediaType;
  35. import org.springframework.validation.annotation.Validated;
  36. import org.springframework.web.bind.annotation.*;
  37. import javax.servlet.http.HttpServletRequest;
  38. import javax.servlet.http.HttpSession;
  39. import java.math.BigDecimal;
  40. import java.util.*;
  41. import java.util.stream.Collectors;
  42. @RestController
  43. @RequestMapping("/api/order")
  44. @Api(tags = "订单接口", description = "订单相关接口", produces = MediaType.APPLICATION_JSON_VALUE)
  45. public class OrderController {
  46. @Autowired
  47. private ShiroHelp shiroHelp;
  48. @Autowired
  49. private SettingService settingService;
  50. @Autowired
  51. private TradeService tradeService;
  52. @Autowired
  53. private PayService payService;
  54. @Autowired
  55. private OrderFlowService orderFlowService;
  56. @Autowired
  57. private UserOrderService userOrderService;
  58. @Autowired
  59. private UserOrderRecordService userOrderRecordService;
  60. @Autowired
  61. private UserOrderCheckoutService userOrderCheckoutService;
  62. @Autowired
  63. private CourseService courseService;
  64. @Autowired
  65. private CoursePackageService coursePackageService;
  66. @Autowired
  67. private CourseDataService courseDataService;
  68. @RequestMapping(value = "/checkout/all", method = RequestMethod.GET)
  69. @ApiOperation(value = "全部购物车", notes = "全部购物车", httpMethod = "GET")
  70. public Response<UserOrderPreDto> allCheckout(HttpServletRequest request) throws Exception {
  71. User user = (User) shiroHelp.getLoginUser();
  72. //
  73. List<UserOrderCheckout> list = userOrderCheckoutService.allByUser(user.getId(), 0);
  74. UserOrder order = orderFlowService.preOrderWithCheckout(user.getId(), list);
  75. List<UserOrderRecordExtendDto> dtos = Transform.convert(list, UserOrderRecordExtendDto.class);
  76. return ResponseHelp.success(detail(user.getId(), order, dtos));
  77. }
  78. @RequestMapping(value = "/checkout/add", method = RequestMethod.POST)
  79. @ApiOperation(value = "添加购物车", notes = "添加购物车", httpMethod = "POST")
  80. public Response<Integer> addCheckout(@RequestBody @Validated RecordAddDto dto, HttpServletRequest request) {
  81. User user = (User) shiroHelp.getLoginUser();
  82. UserOrderCheckout checkout = Transform.dtoToEntity(dto);
  83. int number = orderFlowService.addCheckout(user.getId(), checkout);
  84. return ResponseHelp.success(number);
  85. }
  86. @RequestMapping(value = "/checkout/delete", method = RequestMethod.DELETE)
  87. @ApiOperation(value = "删除购物车", notes = "删除购物车", httpMethod = "DELETE")
  88. public Response<Integer> deleteCheckout(@RequestParam int checkoutId, HttpServletRequest request) throws Exception {
  89. User user = (User) shiroHelp.getLoginUser();
  90. int number = orderFlowService.removeCheckout(checkoutId, user.getId());
  91. return ResponseHelp.success(number);
  92. }
  93. @RequestMapping(value = "/pay/confirm", method = RequestMethod.POST)
  94. @ApiOperation(value = "确认支付:创建订单", notes = "创建订单", httpMethod = "POST")
  95. public Response<UserOrderPreDto> confirmPay(@RequestBody @Validated OrderConfirmDto dto, HttpServletRequest request) throws Exception {
  96. User user = (User) shiroHelp.getLoginUser();
  97. UserOrder order = orderFlowService.makeOrder(user.getId(), dto.getCourseId());
  98. return ResponseHelp.success(detail(user.getId(), order, null));
  99. }
  100. @RequestMapping(value = "/pay/speed", method = RequestMethod.POST)
  101. @ApiOperation(value = "确认支付:单条记录创建订单", notes = "单条记录创建订单", httpMethod = "POST")
  102. public Response<UserOrderPreDto> speedPay(@RequestBody @Validated RecordAddDto dto, HttpServletRequest request) throws Exception {
  103. User user = (User) shiroHelp.getLoginUser();
  104. UserOrderCheckout checkout = Transform.dtoToEntity(dto);
  105. UserOrder order = orderFlowService.makeOrderWithSpeed(user.getId(), checkout);
  106. return ResponseHelp.success(detail(user.getId(), order, null));
  107. }
  108. @RequestMapping(value = "/pay/wechat_qr", method = RequestMethod.POST)
  109. @ApiOperation(value = "通过微信二维码支付", notes = "通过微信二维码支付", httpMethod = "POST")
  110. public Response<PayResponseData> wechatQr(@RequestBody @Validated PayOrderDto dto, HttpServletRequest request) throws Exception {
  111. User user = (User) shiroHelp.getLoginUser();
  112. UserOrder order = userOrderService.get(dto.getOrderId());
  113. if (order == null) {
  114. throw new ParameterException("订单不存在");
  115. }
  116. if (!order.getUserId().equals(user.getId())){
  117. throw new ParameterException("订单不存在");
  118. }
  119. PayResponseData data = tradeService.pay(user.getId(), "", "", PayModule.ORDER, order.getId(), BigDecimal.valueOf(0), PayChannel.WECHAT_QR, request);
  120. return ResponseHelp.success(data);
  121. }
  122. @RequestMapping(value = "/pay/wechat_js", method = RequestMethod.POST)
  123. @ApiOperation(value = "通过微信内支付", notes = "通过微信内支付", httpMethod = "POST")
  124. public Response<PayResponseData> wechatJs(@RequestBody @Validated PayOrderDto dto, HttpServletRequest request) throws Exception {
  125. User user = (User) shiroHelp.getLoginUser();
  126. UserOrder order = userOrderService.get(dto.getOrderId());
  127. if (order == null) {
  128. throw new ParameterException("订单不存在");
  129. }
  130. if (!order.getUserId().equals(user.getId())){
  131. throw new ParameterException("订单不存在");
  132. }
  133. PayResponseData data = tradeService.pay(user.getId(), "", "", PayModule.ORDER, order.getId(), BigDecimal.valueOf(0), PayChannel.WECHAT_JS, request);
  134. return ResponseHelp.success(data);
  135. }
  136. @RequestMapping(value = "/pay/alipay_qr", method = RequestMethod.POST)
  137. @ApiOperation(value = "通过支付宝二维码支付", notes = "通过支付宝二维码支付", httpMethod = "POST")
  138. public Response<PayResponseData> alipayQr(@RequestBody @Validated PayOrderDto dto, HttpServletRequest request) throws Exception {
  139. User user = (User) shiroHelp.getLoginUser();
  140. UserOrder order = userOrderService.get(dto.getOrderId());
  141. if (order == null) {
  142. throw new ParameterException("订单不存在");
  143. }
  144. if (!order.getUserId().equals(user.getId())){
  145. throw new ParameterException("订单不存在");
  146. }
  147. PayResponseData data = tradeService.pay(user.getId(), "", "", PayModule.ORDER, order.getId(), BigDecimal.valueOf(0), PayChannel.ALIPAY_QR, request);
  148. return ResponseHelp.success(data);
  149. }
  150. @RequestMapping(value = "/pay/query", method = RequestMethod.GET)
  151. @ApiOperation(value = "支付结果查询", notes = "支付结果查询", httpMethod = "GET")
  152. public Response<Boolean> response(
  153. @RequestParam(required = true, name="id") Long orderId
  154. ) {
  155. User user = (User) shiroHelp.getLoginUser();
  156. UserOrder order = userOrderService.get(orderId);
  157. if (order == null) {
  158. throw new ParameterException("订单不存在");
  159. }
  160. if (!order.getUserId().equals(user.getId())){
  161. throw new ParameterException("支付信息不存在");
  162. }
  163. return ResponseHelp.success(order.getPayStatus() > 0);
  164. }
  165. @RequestMapping(value = "/record/list", method = RequestMethod.GET)
  166. @ApiOperation(value = "获取订单记录列表", notes = "获取订单记录列表", httpMethod = "GET")
  167. public Response<PageMessage<UserOrderRecordListDto>> listRecord(
  168. @RequestParam(required = false, defaultValue = "1") int page,
  169. @RequestParam(required = false, defaultValue = "100") int size,
  170. @RequestParam(required = false) String productType,
  171. @RequestParam(required = false) Integer productId,
  172. @RequestParam(required = false) String service,
  173. @RequestParam(required = false) Boolean isUsed,
  174. @RequestParam(required = false) Boolean isExpire,
  175. @RequestParam(required = false, defaultValue = "id") String order,
  176. @RequestParam(required = false, defaultValue = "desc") String direction,
  177. HttpSession session) {
  178. User user = (User) shiroHelp.getLoginUser();
  179. Page<UserOrderRecord> p = userOrderRecordService.list(page, size, user.getId(), ProductType.ValueOf(productType), productId, ServiceKey.ValueOf(service), isUsed, isExpire, order, DirectionStatus.ValueOf(direction));
  180. List<UserOrderRecordListDto> pr = Transform.convert(p, UserOrderRecordListDto.class);
  181. // 绑定服务
  182. Map<Object, JSONObject> serviceList = new HashMap<Object, JSONObject>(){{
  183. Setting vipSetting = settingService.getByKey(SettingKey.SERVICE_VIP);
  184. put(ServiceKey.VIP.key, vipSetting.getValue());
  185. Setting textbookSetting = settingService.getByKey(SettingKey.SERVICE_TEXTBOOK);
  186. put(ServiceKey.TEXTBOOK.key, textbookSetting.getValue());
  187. Setting qxCatSetting = settingService.getByKey(SettingKey.SERVICE_QX_CAT);
  188. put(ServiceKey.QX_CAT.key, qxCatSetting.getValue());
  189. }};
  190. List<UserOrderRecordListDto> prService = pr.stream().filter((row)-> row.getProductType().equals(ProductType.SERVICE.key)).collect(Collectors.toList());
  191. Transform.combine(prService, serviceList, UserOrderRecordListDto.class, "service", "serviceInfo");
  192. // 绑定课程
  193. List<UserOrderRecordListDto> prCourse = pr.stream().filter((row)-> row.getProductType().equals(ProductType.COURSE.key)).collect(Collectors.toList());
  194. Collection courseIds = Transform.getIds(prCourse, UserOrderRecordListDto.class, "productId");
  195. List<Course> courseList = courseService.select(courseIds);
  196. Transform.combine(prCourse, courseList, UserOrderRecordListDto.class, "productId", "course", Course.class, "id", CourseExtendDto.class);
  197. // 绑定资料
  198. List<UserOrderRecordListDto> prData = pr.stream().filter((row)-> row.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
  199. Collection dataIds = Transform.getIds(prData, UserOrderRecordListDto.class, "productId");
  200. List<CourseData> dataList = courseDataService.select(dataIds);
  201. Transform.combine(prData, dataList, UserOrderRecordListDto.class, "productId", "data", CourseData.class, "id", CourseDataExtendDto.class);
  202. return ResponseHelp.success(pr, page, size, p.getTotal());
  203. }
  204. @RequestMapping(value = "/record/detail", method = RequestMethod.GET)
  205. @ApiOperation(value = "获取订单记录", notes = "获取订单记录", httpMethod = "GET")
  206. public Response<UserOrderRecord> getOrderRecord(
  207. @RequestParam(required = true) Integer id
  208. ) {
  209. User user = (User) shiroHelp.getLoginUser();
  210. UserOrderRecord record = userOrderRecordService.get(id);
  211. if (!record.getUserId().equals(user.getId())){
  212. throw new ParameterException("记录不存在");
  213. }
  214. // todo
  215. return ResponseHelp.success(record);
  216. }
  217. @RequestMapping(value = "/record/use", method = RequestMethod.POST)
  218. @ApiOperation(value = "开通", notes = "开通", httpMethod = "POST")
  219. public Response<UserOrderRecord> useRecord(@RequestBody @Validated RecordUseDto dto) {
  220. User user = (User) shiroHelp.getLoginUser();
  221. UserOrderRecord record = orderFlowService.useRecord(user.getId(), dto.getRecordId());
  222. return ResponseHelp.success(record);
  223. }
  224. /**
  225. * 统一处理订单以及完整购物车返回信息
  226. * @param userId
  227. * @param order
  228. * @param list
  229. * @return
  230. */
  231. public UserOrderPreDto detail(Integer userId, UserOrder order, List<UserOrderRecordExtendDto> list) {
  232. UserOrderPreDto dto = Transform.convert(order, UserOrderPreDto.class);
  233. if (list == null){
  234. list = Transform.convert(userOrderCheckoutService.allByUser(userId, order.getId()), UserOrderRecordExtendDto.class);
  235. }
  236. dto.setCheckouts(list);
  237. // 获取所有课程信息
  238. List<UserOrderRecordExtendDto> courseCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.COURSE.key)).collect(Collectors.toList());
  239. Collection courseIds = Transform.getIds(courseCheckout, UserOrderRecordExtendDto.class, "productId");
  240. List<Course> courseList = courseService.select(courseIds);
  241. dto.setCourses(Transform.convert(courseList, CourseExtendDto.class));
  242. // 获取所有资料信息
  243. List<UserOrderRecordExtendDto> dataCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
  244. Collection dataIds = Transform.getIds(dataCheckout, UserOrderRecordExtendDto.class, "productId");
  245. List<CourseData> dataList = courseDataService.select(dataIds);
  246. dto.setDatas(Transform.convert(dataList, CourseDataExtendDto.class));
  247. // 获取所有套餐信息
  248. List<UserOrderRecordExtendDto> packageCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.COURSE_PACKAGE.key)).collect(Collectors.toList());
  249. Collection packageIds = Transform.getIds(packageCheckout, UserOrderRecordExtendDto.class, "productId");
  250. List<CoursePackage> packageList = coursePackageService.select(packageIds);
  251. dto.setPackages(Transform.convert(packageList, CoursePackageExtendDto.class));
  252. return dto;
  253. }
  254. }