CreateOrder.js 4.6 KB

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