order.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. const express = require('express');
  2. const moment = require('moment');
  3. const _ = require('lodash');
  4. const { query, body } = require('express-validator');
  5. const { onSuccess, fill, createTradeNo, onError } = require('../../../utils');
  6. const { limit, ORDER_STATUS } = require('../../config');
  7. const check = require('../../../middleware/check');
  8. const Order = require('../../../db/models/order');
  9. const SysUser = require('../../../db/fuxi/sys_user');
  10. const Teacher = require('../../../db/models/teacher');
  11. const Course = require('../../../db/models/course');
  12. const Channel = require('../../../db/models/channel');
  13. const { Op } = require('sequelize');
  14. const router = express.Router();
  15. const _ORDER_STATUS = _.invert(ORDER_STATUS);
  16. async function fillSingle(data) {
  17. const { uid, recordId, channel } = data;
  18. const tdata = await Promise.all([
  19. SysUser.findOne({ where: { id: uid } }),
  20. // Teacher.findOne({ where: { id: recordId } }),
  21. ]);
  22. data.channelName = '在线支付';
  23. if (channel) {
  24. const cdata = await Channel.findOne({ where: { id: channel } });
  25. data.channelName = cdata.name;
  26. }
  27. Object.assign(data, _.pick(tdata[0], ['login', 'phoneNumber']));
  28. // data.recordName = tdata[1].name;
  29. // data.recordPhone = tdata[1].phone;
  30. data.statusStr = _ORDER_STATUS[data.status];
  31. return data;
  32. }
  33. /**
  34. * showdoc
  35. * @catalog v1/订单
  36. * @title 订单列表
  37. * @description 订单列表接口
  38. * @method GET
  39. * @url /master/order/
  40. * @param page 0 Int 页码: 不传默认取第1页数据,每页20条数据
  41. * @param id 0 string 订单id
  42. * @param title 0 string 课程名
  43. * @param uname 0 string 用户名
  44. * @param stime 0 string 支付开始时间
  45. * @param etime 0 string 支付结束时间
  46. * @param status 0 string 订单状态
  47. * @param channel 0 string 来源
  48. * @return {"code":0, "count":1, "data": []}
  49. * @return_param id string id
  50. * @return_param cid integer 课程id
  51. * @return_param title string 课程名
  52. * @return_param price decimal 支付价格
  53. * @return_param uid integer 用户id
  54. * @return_param payAt date 支付时间
  55. * @return_param channel integer 1在线支付2渠道
  56. * @return_param createdAt date -
  57. * @return_param updatedAt date -
  58. * @remark
  59. * @number
  60. */
  61. router.get('/', async (req, res) => {
  62. const { page = 0, title, uname, stime, etime, channel, phone } = req.query;
  63. const where = _.omit(req.query, ['page', 'uname', 'stime', 'etime', 'phone']);
  64. if (title) {
  65. where.title = { [Op.like]: `%${title}%` };
  66. }
  67. if (stime || etime) {
  68. where.payAt = {};
  69. stime && (where.payAt[Op.gte] = moment(stime).startOf('d'));
  70. etime && (where.payAt[Op.lte] = moment(etime).endOf('d'));
  71. }
  72. if (uname || phone) {
  73. const where2 = {};
  74. if (uname) {
  75. where2.login = { [Op.like]: `%${uname}%` };
  76. }
  77. if (phone) {
  78. where2.phoneNumber = { [Op.like]: `%${phone}%` };
  79. }
  80. const uList = await SysUser.findAll({
  81. where: where2,
  82. attributes: ['id'],
  83. });
  84. where.uid = { [Op.in]: uList.map(item => item.id) };
  85. }
  86. const info = onSuccess();
  87. info.data = await Order.findAll({ where, limit, offset: page * limit });
  88. info.data = await fill(info.data, fillSingle);
  89. if (!page) {
  90. info.count = await Order.count({ where });
  91. }
  92. res.send(info);
  93. });
  94. /**
  95. * showdoc
  96. * @catalog v1/订单
  97. * @title 订单详情
  98. * @description
  99. * @method GET
  100. * @url /master/order/:id
  101. * @param :id 1 STRING 详情ID
  102. * @return {"code":0, "data": {}}
  103. * @return_param id string id
  104. * @return_param cid integer 课程id
  105. * @return_param price decimal 支付价格
  106. * @return_param uid integer 用户id
  107. * @return_param payAt date 支付时间
  108. * @return_param channel integer 1在线支付2渠道
  109. * @return_param createdAt date -
  110. * @return_param updatedAt date -
  111. * @remark
  112. * @number
  113. */
  114. router.get('/:id', async (req, res) => {
  115. let data = await Order.findOne({ where: req.params });
  116. data = await fill(data, fillSingle);
  117. res.send(onSuccess(data));
  118. });
  119. /**
  120. * showdoc
  121. * @catalog v1/订单
  122. * @title 订单添加
  123. * @description
  124. * @method POST
  125. * @url /master/order/
  126. * @param cid integer 课程id
  127. * @param uid integer 用户id
  128. * @param channel integer 1在线支付2渠道
  129. * @return {"code":0, "data": {}}
  130. * @remark
  131. * @number
  132. */
  133. router.post('/', check([body([]).notEmpty()]), async (req, res) => {
  134. const { channel, uid, cid } = req.body;
  135. const cdata = await Course.findOne({ where: { id: cid } });
  136. if (!cdata) {
  137. return onError('课程不存在');
  138. }
  139. const { title, price, detailimg, recordId } = cdata;
  140. const id = createTradeNo();
  141. const odata = await Order.create({
  142. id,
  143. cid,
  144. uid,
  145. title,
  146. detailimg,
  147. price: 0,
  148. recordId,
  149. channel,
  150. status: ORDER_STATUS.渠道,
  151. });
  152. res.send(onSuccess(odata));
  153. });
  154. /**
  155. * showdoc
  156. * @catalog v1/订单
  157. * @title 订单删除
  158. * @description
  159. * @method DELETE
  160. * @url /master/order/:id
  161. * @param :id 1 STRING 详情ID
  162. * @return {"status":0, "msg": "删除成功"}
  163. * @remark
  164. * @number
  165. */
  166. router.delete('/:id', async (req, res) => {
  167. const odata = await Order.findOne({ where: req.params });
  168. if (odata && odata.channel === 0) {
  169. return res.send(onError('在线支付订单不可删除'));
  170. }
  171. const data = await Order.destroy({ where: req.params, limit: 1 });
  172. res.send(onSuccess(null, '删除成功'));
  173. });
  174. module.exports = router;