const express = require('express'); const moment = require('moment'); const _ = require('lodash'); const { query, body } = require('express-validator'); const { onSuccess, fill, createTradeNo, onError } = require('../../../utils'); const { limit, ORDER_STATUS } = require('../../config'); const check = require('../../../middleware/check'); const Order = require('../../../db/models/order'); const SysUser = require('../../../db/fuxi/sys_user'); const Teacher = require('../../../db/models/teacher'); const Course = require('../../../db/models/course'); const Channel = require('../../../db/models/channel'); const { Op } = require('sequelize'); const router = express.Router(); const _ORDER_STATUS = _.invert(ORDER_STATUS); async function fillSingle(data) { const { uid, recordId, channel } = data; const tdata = await Promise.all([ SysUser.findOne({ where: { id: uid } }), // Teacher.findOne({ where: { id: recordId } }), ]); data.channelName = '在线支付'; if (channel) { const cdata = await Channel.findOne({ where: { id: channel } }); data.channelName = cdata.name; } Object.assign(data, _.pick(tdata[0], ['login', 'phoneNumber'])); // data.recordName = tdata[1].name; // data.recordPhone = tdata[1].phone; data.statusStr = _ORDER_STATUS[data.status]; return data; } /** * showdoc * @catalog v1/订单 * @title 订单列表 * @description 订单列表接口 * @method GET * @url /master/order/ * @param page 0 Int 页码: 不传默认取第1页数据,每页20条数据 * @param id 0 string 订单id * @param title 0 string 课程名 * @param uname 0 string 用户名 * @param stime 0 string 支付开始时间 * @param etime 0 string 支付结束时间 * @param status 0 string 订单状态 * @param channel 0 string 来源 * @return {"code":0, "count":1, "data": []} * @return_param id string id * @return_param cid integer 课程id * @return_param title string 课程名 * @return_param price decimal 支付价格 * @return_param uid integer 用户id * @return_param payAt date 支付时间 * @return_param channel integer 1在线支付2渠道 * @return_param createdAt date - * @return_param updatedAt date - * @remark * @number */ router.get('/', async (req, res) => { const { page = 0, title, uname, stime, etime, channel, phone } = req.query; const where = _.omit(req.query, ['page', 'uname', 'stime', 'etime', 'phone']); if (title) { where.title = { [Op.like]: `%${title}%` }; } if (stime || etime) { where.payAt = {}; stime && (where.payAt[Op.gte] = moment(stime).startOf('d')); etime && (where.payAt[Op.lte] = moment(etime).endOf('d')); } if (uname || phone) { const where2 = {}; if (uname) { where2.login = { [Op.like]: `%${uname}%` }; } if (phone) { where2.phoneNumber = { [Op.like]: `%${phone}%` }; } const uList = await SysUser.findAll({ where: where2, attributes: ['id'], }); where.uid = { [Op.in]: uList.map(item => item.id) }; } const info = onSuccess(); info.data = await Order.findAll({ where, limit, offset: page * limit }); info.data = await fill(info.data, fillSingle); if (!page) { info.count = await Order.count({ where }); } res.send(info); }); /** * showdoc * @catalog v1/订单 * @title 订单详情 * @description * @method GET * @url /master/order/:id * @param :id 1 STRING 详情ID * @return {"code":0, "data": {}} * @return_param id string id * @return_param cid integer 课程id * @return_param price decimal 支付价格 * @return_param uid integer 用户id * @return_param payAt date 支付时间 * @return_param channel integer 1在线支付2渠道 * @return_param createdAt date - * @return_param updatedAt date - * @remark * @number */ router.get('/:id', async (req, res) => { let data = await Order.findOne({ where: req.params }); data = await fill(data, fillSingle); res.send(onSuccess(data)); }); /** * showdoc * @catalog v1/订单 * @title 订单添加 * @description * @method POST * @url /master/order/ * @param cid integer 课程id * @param uid integer 用户id * @param channel integer 1在线支付2渠道 * @return {"code":0, "data": {}} * @remark * @number */ router.post('/', check([body([]).notEmpty()]), async (req, res) => { const { channel, uid, cid } = req.body; const cdata = await Course.findOne({ where: { id: cid } }); if (!cdata) { return onError('课程不存在'); } const { title, price, detailimg, recordId } = cdata; const id = createTradeNo(); const odata = await Order.create({ id, cid, uid, title, detailimg, price: 0, recordId, channel, status: ORDER_STATUS.渠道, }); res.send(onSuccess(odata)); }); /** * showdoc * @catalog v1/订单 * @title 订单删除 * @description * @method DELETE * @url /master/order/:id * @param :id 1 STRING 详情ID * @return {"status":0, "msg": "删除成功"} * @remark * @number */ router.delete('/:id', async (req, res) => { const odata = await Order.findOne({ where: req.params }); if (odata && odata.channel === 0) { return res.send(onError('在线支付订单不可删除')); } const data = await Order.destroy({ where: req.params, limit: 1 }); res.send(onSuccess(null, '删除成功')); }); module.exports = router;