OrderController.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. package com.qxgmat.controller.api;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.github.pagehelper.Page;
  5. import com.nuliji.tools.PageMessage;
  6. import com.nuliji.tools.Response;
  7. import com.nuliji.tools.ResponseHelp;
  8. import com.nuliji.tools.Transform;
  9. import com.nuliji.tools.exception.ParameterException;
  10. import com.nuliji.tools.pay.data.PayResponseData;
  11. import com.qxgmat.data.constants.enums.ServiceKey;
  12. import com.qxgmat.data.constants.enums.SettingKey;
  13. import com.qxgmat.data.constants.enums.module.ProductType;
  14. import com.qxgmat.data.constants.enums.status.DirectionStatus;
  15. import com.qxgmat.data.constants.enums.trade.PayChannel;
  16. import com.qxgmat.data.constants.enums.trade.PayModule;
  17. import com.qxgmat.data.dao.entity.*;
  18. import com.qxgmat.dto.extend.CourseDataExtendDto;
  19. import com.qxgmat.dto.extend.CourseExtendDto;
  20. import com.qxgmat.dto.extend.CoursePackageExtendDto;
  21. import com.qxgmat.dto.extend.UserOrderRecordExtendDto;
  22. import com.qxgmat.dto.request.*;
  23. import com.qxgmat.dto.response.UserOrderDetailDto;
  24. import com.qxgmat.dto.response.UserOrderRecordListDto;
  25. import com.qxgmat.help.ShiroHelp;
  26. import com.qxgmat.service.extend.OrderFlowService;
  27. import com.qxgmat.service.extend.TradeService;
  28. import com.qxgmat.service.inline.*;
  29. import io.swagger.annotations.Api;
  30. import io.swagger.annotations.ApiOperation;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.http.MediaType;
  33. import org.springframework.validation.annotation.Validated;
  34. import org.springframework.web.bind.annotation.*;
  35. import javax.servlet.http.HttpServletRequest;
  36. import javax.servlet.http.HttpSession;
  37. import java.math.BigDecimal;
  38. import java.util.*;
  39. import java.util.stream.Collectors;
  40. @RestController
  41. @RequestMapping("/api/order")
  42. @Api(tags = "订单接口", description = "订单相关接口", produces = MediaType.APPLICATION_JSON_VALUE)
  43. public class OrderController {
  44. @Autowired
  45. private ShiroHelp shiroHelp;
  46. @Autowired
  47. private SettingService settingService;
  48. @Autowired
  49. private TradeService tradeService;
  50. @Autowired
  51. private PayService payService;
  52. @Autowired
  53. private OrderFlowService orderFlowService;
  54. @Autowired
  55. private UserOrderService userOrderService;
  56. @Autowired
  57. private UserOrderRecordService userOrderRecordService;
  58. @Autowired
  59. private UserOrderCheckoutService userOrderCheckoutService;
  60. @Autowired
  61. private CourseService courseService;
  62. @Autowired
  63. private CoursePackageService coursePackageService;
  64. @Autowired
  65. private CourseDataService courseDataService;
  66. @Autowired
  67. private UserInvoiceService userInvoiceService;
  68. @RequestMapping(value = "/checkout/all", method = RequestMethod.GET)
  69. @ApiOperation(value = "全部购物车", notes = "全部购物车", httpMethod = "GET")
  70. public Response<UserOrderDetailDto> 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<UserOrderDetailDto> 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<UserOrderDetailDto> 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 = "/list", method = RequestMethod.GET)
  166. @ApiOperation(value = "获取订单列表", notes = "获取订单列表", httpMethod = "GET")
  167. public Response<PageMessage<UserOrderDetailDto>> listOrder(
  168. @RequestParam(required = false, defaultValue = "1") int page,
  169. @RequestParam(required = false, defaultValue = "100") int size,
  170. @RequestParam(required = false, defaultValue = "id") String order,
  171. @RequestParam(required = false, defaultValue = "desc") String direction,
  172. HttpSession session) {
  173. User user = (User) shiroHelp.getLoginUser();
  174. Page<UserOrder> p = userOrderService.list(page, size, user.getId(), order, DirectionStatus.ValueOf(direction));
  175. Map<Integer, UserOrder> map = new HashMap<>();
  176. List<UserOrderDetailDto> pr = Transform.convert(p, UserOrderDetailDto.class);
  177. Collection orderIds = Transform.getIds(p, UserOrder.class, "id");
  178. List<UserOrderRecord> recordList = userOrderRecordService.allByUser(user.getId(), orderIds).stream().filter(row->row.getParentId()==0).collect(Collectors.toList());
  179. List<UserOrderRecordListDto> records = Transform.convert(recordList, UserOrderRecordListDto.class);
  180. Map<Object, List<UserOrderRecordListDto>> recordMap = Transform.getMapList(records, UserOrderRecordListDto.class, "orderId");
  181. Transform.combine(pr, recordMap, UserOrderDetailDto.class, "id", "checkouts");
  182. // 绑定服务
  183. Map<Object, JSONObject> serviceList = new HashMap<Object, JSONObject>(){{
  184. Setting vipSetting = settingService.getByKey(SettingKey.SERVICE_VIP);
  185. put(ServiceKey.VIP.key, vipSetting.getValue());
  186. Setting textbookSetting = settingService.getByKey(SettingKey.SERVICE_TEXTBOOK);
  187. put(ServiceKey.TEXTBOOK.key, textbookSetting.getValue());
  188. Setting qxCatSetting = settingService.getByKey(SettingKey.SERVICE_QX_CAT);
  189. put(ServiceKey.QX_CAT.key, qxCatSetting.getValue());
  190. }};
  191. List<UserOrderRecordListDto> prService = records.stream().filter((row)-> row.getProductType().equals(ProductType.SERVICE.key)).collect(Collectors.toList());
  192. Transform.combine(prService, serviceList, UserOrderRecordListDto.class, "service", "serviceInfo");
  193. // 绑定课程
  194. List<UserOrderRecordListDto> prCourse = records.stream().filter((row)-> row.getProductType().equals(ProductType.COURSE.key)).collect(Collectors.toList());
  195. Collection courseIds = Transform.getIds(prCourse, UserOrderRecordListDto.class, "productId");
  196. List<Course> courseList = courseService.select(courseIds);
  197. Transform.combine(prCourse, courseList, UserOrderRecordListDto.class, "productId", "course", Course.class, "id", CourseExtendDto.class);
  198. // 绑定资料
  199. List<UserOrderRecordListDto> prData = records.stream().filter((row)-> row.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
  200. Collection dataIds = Transform.getIds(prData, UserOrderRecordListDto.class, "productId");
  201. List<CourseData> dataList = courseDataService.select(dataIds);
  202. Transform.combine(prData, dataList, UserOrderRecordListDto.class, "productId", "data", CourseData.class, "id", CourseDataExtendDto.class);
  203. // 绑定发票
  204. List<UserInvoice> userInvoiceList = userInvoiceService.listByOrder(user.getId(), orderIds);
  205. Map invoiceMap = Transform.getMap(userInvoiceList, UserInvoice.class, "orderId", "id");
  206. for(UserOrderDetailDto dto : pr){
  207. dto.setHasInvoice(invoiceMap.containsKey(dto.getId()));
  208. UserOrder userOrder = map.get(dto.getId());
  209. JSONArray value = userOrder.getProductTypes();
  210. if (value.contains(ProductType.COURSE.key)){
  211. dto.setCanInvoice(true);
  212. }
  213. }
  214. return ResponseHelp.success(pr, page, size, p.getTotal());
  215. }
  216. @RequestMapping(value = "/detail", method = RequestMethod.GET)
  217. @ApiOperation(value = "获取订单记录", notes = "获取订单记录", httpMethod = "GET")
  218. public Response<UserOrderDetailDto> getOrder(
  219. @RequestParam(required = true) Integer id
  220. ) {
  221. User user = (User) shiroHelp.getLoginUser();
  222. UserOrder order = userOrderService.get(id);
  223. if (!order.getUserId().equals(user.getId())){
  224. throw new ParameterException("记录不存在");
  225. }
  226. List<UserOrderRecord> list = userOrderRecordService.allByUser(user.getId(), id);
  227. List<UserOrderRecordExtendDto> dtos = Transform.convert(list, UserOrderRecordExtendDto.class);
  228. return ResponseHelp.success(detail(user.getId(), order, dtos));
  229. }
  230. @RequestMapping(value = "/record/list", method = RequestMethod.GET)
  231. @ApiOperation(value = "获取订单记录列表", notes = "获取订单记录列表", httpMethod = "GET")
  232. public Response<PageMessage<UserOrderRecordListDto>> listRecord(
  233. @RequestParam(required = false, defaultValue = "1") int page,
  234. @RequestParam(required = false, defaultValue = "100") int size,
  235. @RequestParam(required = false) String productType,
  236. @RequestParam(required = false) Integer productId,
  237. @RequestParam(required = false) String service,
  238. @RequestParam(required = false) Boolean isUsed,
  239. @RequestParam(required = false) Boolean isExpire,
  240. @RequestParam(required = false) Boolean filterChildren,
  241. @RequestParam(required = false, defaultValue = "id") String order,
  242. @RequestParam(required = false, defaultValue = "desc") String direction,
  243. HttpSession session) {
  244. User user = (User) shiroHelp.getLoginUser();
  245. Page<UserOrderRecord> p = userOrderRecordService.list(page, size, user.getId(), ProductType.ValueOf(productType), productId, ServiceKey.ValueOf(service), isUsed, isExpire, filterChildren, order, DirectionStatus.ValueOf(direction));
  246. List<UserOrderRecordListDto> pr = Transform.convert(p, UserOrderRecordListDto.class);
  247. // 绑定服务
  248. Map<Object, JSONObject> serviceList = new HashMap<Object, JSONObject>(){{
  249. Setting vipSetting = settingService.getByKey(SettingKey.SERVICE_VIP);
  250. put(ServiceKey.VIP.key, vipSetting.getValue());
  251. Setting textbookSetting = settingService.getByKey(SettingKey.SERVICE_TEXTBOOK);
  252. put(ServiceKey.TEXTBOOK.key, textbookSetting.getValue());
  253. Setting qxCatSetting = settingService.getByKey(SettingKey.SERVICE_QX_CAT);
  254. put(ServiceKey.QX_CAT.key, qxCatSetting.getValue());
  255. }};
  256. List<UserOrderRecordListDto> prService = pr.stream().filter((row)-> row.getProductType().equals(ProductType.SERVICE.key)).collect(Collectors.toList());
  257. Transform.combine(prService, serviceList, UserOrderRecordListDto.class, "service", "serviceInfo");
  258. // 绑定课程
  259. List<UserOrderRecordListDto> prCourse = pr.stream().filter((row)-> row.getProductType().equals(ProductType.COURSE.key)).collect(Collectors.toList());
  260. Collection courseIds = Transform.getIds(prCourse, UserOrderRecordListDto.class, "productId");
  261. List<Course> courseList = courseService.select(courseIds);
  262. Transform.combine(prCourse, courseList, UserOrderRecordListDto.class, "productId", "course", Course.class, "id", CourseExtendDto.class);
  263. // 绑定资料
  264. List<UserOrderRecordListDto> prData = pr.stream().filter((row)-> row.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
  265. Collection dataIds = Transform.getIds(prData, UserOrderRecordListDto.class, "productId");
  266. List<CourseData> dataList = courseDataService.select(dataIds);
  267. Transform.combine(prData, dataList, UserOrderRecordListDto.class, "productId", "data", CourseData.class, "id", CourseDataExtendDto.class);
  268. return ResponseHelp.success(pr, page, size, p.getTotal());
  269. }
  270. @RequestMapping(value = "/record/detail", method = RequestMethod.GET)
  271. @ApiOperation(value = "获取订单记录详情", notes = "获取订单记录", httpMethod = "GET")
  272. public Response<UserOrderRecord> getOrderRecord(
  273. @RequestParam(required = true) Integer id
  274. ) {
  275. User user = (User) shiroHelp.getLoginUser();
  276. UserOrderRecord record = userOrderRecordService.get(id);
  277. if (!record.getUserId().equals(user.getId())){
  278. throw new ParameterException("记录不存在");
  279. }
  280. // todo
  281. return ResponseHelp.success(record);
  282. }
  283. @RequestMapping(value = "/record/use", method = RequestMethod.POST)
  284. @ApiOperation(value = "开通", notes = "开通", httpMethod = "POST")
  285. public Response<UserOrderRecord> useRecord(@RequestBody @Validated RecordUseDto dto) {
  286. User user = (User) shiroHelp.getLoginUser();
  287. UserOrderRecord record = orderFlowService.useRecord(user.getId(), dto.getRecordId());
  288. return ResponseHelp.success(record);
  289. }
  290. @RequestMapping(value = "/invoice/open", method = RequestMethod.POST)
  291. @ApiOperation(value = "申请发票", notes = "申请发票", httpMethod = "POST")
  292. public Response<Boolean> openInvoice(@RequestBody @Validated OrderInvoiceDto dto) {
  293. User user = (User) shiroHelp.getLoginUser();
  294. UserInvoice userInvoice = Transform.dtoToEntity(dto);
  295. UserInvoice in = userInvoiceService.getByOrder(user.getId(), userInvoice.getOrderId());
  296. if (in != null) {
  297. throw new ParameterException("该订单已开发票");
  298. }
  299. UserOrder order = userOrderService.get(userInvoice.getOrderId());
  300. JSONArray value = order.getProductTypes();
  301. if (!value.contains(ProductType.COURSE.key)){
  302. throw new ParameterException("该订单无法开发票");
  303. }
  304. userInvoice.setUserId(user.getId());
  305. userInvoiceService.add(userInvoice);
  306. return ResponseHelp.success(true);
  307. }
  308. /**
  309. * 统一处理订单以及完整购物车返回信息
  310. * @param userId
  311. * @param order
  312. * @param list
  313. * @return
  314. */
  315. public UserOrderDetailDto detail(Integer userId, UserOrder order, List<UserOrderRecordExtendDto> list) {
  316. UserOrderDetailDto dto = Transform.convert(order, UserOrderDetailDto.class);
  317. if (list == null){
  318. list = Transform.convert(userOrderCheckoutService.allByUser(userId, order.getId()), UserOrderRecordExtendDto.class);
  319. }
  320. dto.setCheckouts(list);
  321. // 获取所有课程信息
  322. List<UserOrderRecordExtendDto> courseCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.COURSE.key)).collect(Collectors.toList());
  323. Collection courseIds = Transform.getIds(courseCheckout, UserOrderRecordExtendDto.class, "productId");
  324. List<Course> courseList = courseService.select(courseIds);
  325. dto.setCourses(Transform.convert(courseList, CourseExtendDto.class));
  326. // 获取所有资料信息
  327. List<UserOrderRecordExtendDto> dataCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
  328. Collection dataIds = Transform.getIds(dataCheckout, UserOrderRecordExtendDto.class, "productId");
  329. List<CourseData> dataList = courseDataService.select(dataIds);
  330. dto.setDatas(Transform.convert(dataList, CourseDataExtendDto.class));
  331. // 获取所有套餐信息
  332. List<UserOrderRecordExtendDto> packageCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.COURSE_PACKAGE.key)).collect(Collectors.toList());
  333. Collection packageIds = Transform.getIds(packageCheckout, UserOrderRecordExtendDto.class, "productId");
  334. List<CoursePackage> packageList = coursePackageService.select(packageIds);
  335. dto.setPackages(Transform.convert(packageList, CoursePackageExtendDto.class));
  336. // 发票
  337. UserInvoice invoice = userInvoiceService.getByOrder(userId, order.getId());
  338. dto.setHasInvoice(invoice != null);
  339. if (courseCheckout.size() > 0){
  340. dto.setCanInvoice(true);
  341. }
  342. return dto;
  343. }
  344. }