questionnaire.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import dayjs from "dayjs";
  2. import { Post } from "../../../../lib/request/method";
  3. // module/chats/components/questionnaire/questionnaire.ts
  4. interface Message {
  5. id: string;
  6. type: 'system' | 'analysis' | 'select' | 'text' | 'report';
  7. payload: AnyObject;
  8. }
  9. interface HandleEvent {
  10. target: { id: string; };
  11. detail: AnyObject;
  12. type: 'next';
  13. }
  14. Component({
  15. lifetimes: {
  16. attached() { this._start(); }
  17. },
  18. /**
  19. * 组件的属性列表
  20. */
  21. properties: {
  22. },
  23. /**
  24. * 组件的初始数据
  25. */
  26. data: {
  27. messages: {} as Record<number, Message>,
  28. lastId: '',
  29. _next: {
  30. dialogId: "",
  31. questions: []
  32. } as AnyObject,
  33. _timestamp: Date.now(),
  34. },
  35. observers: {
  36. 'messages.**'(messages) {
  37. const message = Object.values(messages).pop() as Message;
  38. this.setData({ lastId: message?.id });
  39. }
  40. },
  41. methods: {
  42. handle(event: HandleEvent) {
  43. const index = event.target.id.split('.').pop() ?? 0;
  44. console.log(index, event.target.id);
  45. const questions = this.data._next.questions;
  46. Object.assign(questions[index], event.detail);
  47. this.setData({ '_next.questions': questions })
  48. console.log(this.data._next);
  49. this._next()
  50. },
  51. _start() {
  52. this._createMessage({
  53. id: `start`, type: 'system',
  54. payload: { title: '对话管家 已进入聊天', date: this.data._timestamp },
  55. }, {
  56. [`_next.dialogId`]: '',
  57. [`_next.questions`]: [],
  58. })
  59. this._next();
  60. },
  61. _end() {
  62. this._createMessage({
  63. id: `end`, type: 'system',
  64. payload: { title: '对话管家 已结束聊天', date: Date.now() },
  65. }, {
  66. [`_next.dialogId`]: '',
  67. [`_next.questions`]: [],
  68. })
  69. this.triggerEvent('next', { component: 'guide', scroll: true });
  70. },
  71. async _next() {
  72. const { data } = await Post(`/dialogueManage/dialog`, this.data._next);
  73. data.nextQuestions?.forEach((question: any, index: number) => {
  74. if (question.css === 'tongue') {
  75. this._createMessage({
  76. id: `${question.classify}.${question.id}.${index}`, type: 'analysis',
  77. payload: { title: question.title }
  78. });
  79. } else if (question.css === 'text') {
  80. this._createMessage({
  81. id: `${question.classify}.${question.id}.${index}`, type: 'text',
  82. payload: { title: question.content }
  83. });
  84. } else if (['select', 'checkbox'].includes(question.css)) {
  85. this._createMessage({
  86. id: `${question.classify}.${question.id}.${index}`, type: 'select',
  87. payload: {
  88. title: question.title,
  89. options: question.options,
  90. multiple: question.css === 'checkbox',
  91. }
  92. })
  93. } else if (question.over) {
  94. return this._end();
  95. }
  96. });
  97. if (data.classify === 'report') {
  98. const diff = dayjs().diff(this.data._timestamp, 'm');
  99. this._createMessage({
  100. id: 'report', type: 'report',
  101. payload: {
  102. title: `本次问答已结束,历史${diff || 1}分钟,非常感谢您的配合!请查看您本次的健康评估情况。`,
  103. url: `/module/health/pages/report/report?id=${data.healthAnalysisReportId}`
  104. }
  105. })
  106. }
  107. if (data.over) return this._end();
  108. this.setData({
  109. [`_next.dialogId`]: data.dialogId,
  110. [`_next.questions`]: data.nextQuestions,
  111. })
  112. this.triggerEvent('to');
  113. },
  114. _createMessage(body: Message, data?: Record<string, any>) {
  115. const messages = this.data.messages;
  116. const index = Object.keys(messages).length;
  117. this.setData({
  118. [`messages.${index}`]: body,
  119. ...data,
  120. })
  121. console.log(this.data.messages);
  122. }
  123. }
  124. })