order.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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 } = req.query;
  63. const where = _.omit(req.query, ['page', 'uname', 'stime', 'etime']);
  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) {
  73. const uList = await SysUser.findAll({
  74. where: { login: { [Op.like]: `%${uname}` } },
  75. attributes: ['id'],
  76. });
  77. where.uid = { [Op.in]: uList.map(item => item.id) };
  78. }
  79. const info = onSuccess();
  80. info.data = await Order.findAll({ where, limit, offset: page * limit });
  81. info.data = await fill(info.data, fillSingle);
  82. if (!page) {
  83. info.count = await Order.count({ where });
  84. }
  85. res.send(info);
  86. });
  87. /**
  88. * showdoc
  89. * @catalog v1/订单
  90. * @title 订单详情
  91. * @description
  92. * @method GET
  93. * @url /master/order/:id
  94. * @param :id 1 STRING 详情ID
  95. * @return {"code":0, "data": {}}
  96. * @return_param id string id
  97. * @return_param cid integer 课程id
  98. * @return_param price decimal 支付价格
  99. * @return_param uid integer 用户id
  100. * @return_param payAt date 支付时间
  101. * @return_param channel integer 1在线支付2渠道
  102. * @return_param createdAt date -
  103. * @return_param updatedAt date -
  104. * @remark
  105. * @number
  106. */
  107. router.get('/:id', async (req, res) => {
  108. let data = await Order.findOne({ where: req.params });
  109. data = await fill(data, fillSingle);
  110. res.send(onSuccess(data));
  111. });
  112. /**
  113. * showdoc
  114. * @catalog v1/订单
  115. * @title 订单添加
  116. * @description
  117. * @method POST
  118. * @url /master/order/
  119. * @param cid integer 课程id
  120. * @param uid integer 用户id
  121. * @param channel integer 1在线支付2渠道
  122. * @return {"code":0, "data": {}}
  123. * @remark
  124. * @number
  125. */
  126. router.post('/', check([body([]).notEmpty()]), async (req, res) => {
  127. const { channel, uid, cid } = req.body;
  128. const cdata = await Course.findOne({ where: { id: cid } });
  129. if (!cdata) {
  130. return onError('课程不存在');
  131. }
  132. const { title, price, detailimg, recordId } = cdata;
  133. const id = createTradeNo();
  134. const odata = await Order.create({
  135. id,
  136. cid,
  137. uid,
  138. title,
  139. detailimg,
  140. price: 0,
  141. recordId,
  142. channel,
  143. status: ORDER_STATUS.渠道,
  144. });
  145. res.send(onSuccess(odata));
  146. });
  147. /**
  148. * showdoc
  149. * @catalog v1/订单
  150. * @title 订单删除
  151. * @description
  152. * @method DELETE
  153. * @url /master/order/:id
  154. * @param :id 1 STRING 详情ID
  155. * @return {"status":0, "msg": "删除成功"}
  156. * @remark
  157. * @number
  158. */
  159. router.delete('/:id', async (req, res) => {
  160. const odata = await Order.findOne({ where: req.params });
  161. if (odata && odata.channel === 0) {
  162. return res.send(onError('在线支付订单不可删除'));
  163. }
  164. const data = await Order.destroy({ where: req.params, limit: 1 });
  165. res.send(onSuccess(null, '删除成功'));
  166. });
  167. module.exports = router;