CreateOrder.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. const API = require("../../../lib/API.js");
  2. const db = require("../../../plugin/DataBase/db.js");
  3. const { BaseStdResponse } = require("../../../BaseStdResponse.js");
  4. const AccessControl = require("../../../lib/AccessControl.js");
  5. const EmailTemplate = require('../../../../plugin/Email/emailTemplate')
  6. class CreateOrder extends API {
  7. constructor() {
  8. super();
  9. this.setPath('/Kefu/Order')
  10. this.setMethod('POST')
  11. }
  12. async onRequest(req, res) {
  13. let { uuid, session, id, title, content, files, email } = req.body
  14. if ([uuid, session, content].some(value => value === '' || value === null || value === undefined))
  15. return res.json({
  16. ...BaseStdResponse.MISSING_PARAMETER
  17. })
  18. if (!await AccessControl.checkSession(uuid, session))
  19. return res.status(401).json({
  20. ...BaseStdResponse.ACCESS_DENIED
  21. })
  22. const time = new Date().getTime()
  23. let msg = []
  24. let message = {
  25. time,
  26. content,
  27. files: files ?? [],
  28. uuid,
  29. type: 'user'
  30. }
  31. let sql, r
  32. if (!id) {
  33. if ([title].some(value => value === '' || value === null || value === undefined))
  34. return res.json({
  35. ...BaseStdResponse.MISSING_PARAMETER
  36. })
  37. msg.push(message)
  38. const systemMsg = {
  39. time,
  40. content: '您的问题已收到,我们将会尽快处理您的问题,请耐心等待,感谢您的支持理解。',
  41. uuid: 'e4fe0277-0b1a-41a1-b25f-8b6e4cec3281',
  42. type: 'system'
  43. }
  44. msg.push(systemMsg)
  45. sql = 'INSERT INTO work_order (title, email, msg, create_user, create_time, update_time) VALUES (?, ?, ?, ?, ?, ?)'
  46. r = await db.query(sql, [title, email, msg, uuid, time, time])
  47. } else {
  48. const selectSql = 'SELECT msg, state, email FROM work_order WHERE id = ? AND create_user = ?'
  49. const selectRows = await db.query(selectSql, [id, uuid])
  50. if (!selectRows || selectRows.length !== 1 || selectRows[0].state === 2)
  51. return res.json({
  52. ...BaseStdResponse.ERR,
  53. msg: '工单异常或已关闭,请提交新工单'
  54. })
  55. msg = selectRows[0].msg
  56. msg.push(message)
  57. sql = 'UPDATE work_order SET msg = ?, update_time = ?, state = 0 WHERE id = ? AND create_user = ?'
  58. r = await db.query(sql, [msg, time, id, uuid])
  59. }
  60. try {
  61. if (r && r.affectedRows > 0) {
  62. res.json({
  63. ...BaseStdResponse.OK,
  64. data: r.insertId
  65. })
  66. let kefuSql = `
  67. SELECT email FROM users
  68. WHERE JSON_CONTAINS(permission, '"admin"') OR JSON_CONTAINS(permission, '"service"')
  69. `
  70. let kefuRows = await db.query(kefuSql);
  71. let emails = [...new Set(kefuRows.map(row => row.email))]
  72. for (const email of emails) {
  73. await EmailTemplate.orderNewReply(email, { id, content, files })
  74. }
  75. } else {
  76. return res.json({ ...BaseStdResponse.ERR, msg: '提交工单失败!数据库错误' })
  77. }
  78. } catch (err) {
  79. this.logger.error(`提交工单失败!${err.stack}`)
  80. res.json({
  81. ...BaseStdResponse.ERR,
  82. msg: "提交工单失败!",
  83. })
  84. }
  85. }
  86. }
  87. module.exports.CreateOrder = CreateOrder