questionnaire.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. properties: {
  19. },
  20. /**
  21. * 组件的初始数据
  22. */
  23. data: {
  24. messages: {} as Record<number, Message>,
  25. lastId: '',
  26. _next: {
  27. dialogId: "",
  28. questions: []
  29. } as AnyObject,
  30. _timestamp: Date.now(),
  31. },
  32. observers: {
  33. 'messages.**'(messages) {
  34. const message = Object.values(messages).pop() as Message;
  35. this.setData({ lastId: message?.id });
  36. }
  37. },
  38. methods: {
  39. handle(event: HandleEvent) {
  40. const index = event.target.id.split('.').pop() ?? 0;
  41. console.log(index, event.target.id);
  42. const questions = this.data._next.questions;
  43. Object.assign(questions[index], event.detail);
  44. this.setData({ '_next.questions': questions })
  45. console.log(this.data._next);
  46. this._next()
  47. },
  48. _start() {
  49. this.setData({
  50. [`_next.dialogId`]: '',
  51. [`_next.questions`]: [],
  52. _timestamp: Date.now(),
  53. })
  54. this._next();
  55. },
  56. _end() {
  57. this.setData({
  58. [`_next.dialogId`]: '',
  59. [`_next.questions`]: [],
  60. })
  61. this.triggerEvent('next', { component: 'guide', scroll: true });
  62. },
  63. _pre() { },
  64. async _next() {
  65. try {
  66. this._pre();
  67. const { data } = await Post(`/dialogueManage/dialog`, this.data._next);
  68. data.nextQuestions?.forEach((question: any, index: number) => {
  69. if (question.classify === 'tongue_result') {
  70. this._updateMessage({
  71. id: `${question.classify}.${question.id}.${index}`, type: 'text',
  72. payload: { title: question.content }
  73. })
  74. } else {
  75. if (question.classify === 'tongue') {
  76. this._pre = () => {
  77. this._createMessage({
  78. id: `${question.classify}.${question.id}.loading`, type: 'text',
  79. payload: { title: '分析中', loading: true }
  80. });
  81. this.triggerEvent('to');
  82. }
  83. } else {
  84. this._pre = () => { }
  85. }
  86. if (question.css === 'tongue') {
  87. this._createMessage({
  88. id: `${question.classify}.${question.id}.${index}`, type: 'analysis',
  89. payload: { title: question.title }
  90. });
  91. } else if (question.css === 'text') {
  92. this._createMessage({
  93. id: `${question.classify}.${question.id}.${index}`, type: 'text',
  94. payload: { title: question.content }
  95. });
  96. } else if (['select', 'checkbox'].includes(question.css)) {
  97. this._createMessage({
  98. id: `${question.classify}.${question.id}.${index}`, type: 'select',
  99. payload: {
  100. title: question.title,
  101. options: question.options,
  102. multiple: question.css === 'checkbox',
  103. required: question.required
  104. }
  105. })
  106. } else if (question.over) {
  107. return this._end();
  108. }
  109. }
  110. });
  111. if (data.classify === 'report') {
  112. const diff = dayjs().diff(this.data._timestamp, 'm');
  113. this._createMessage({
  114. id: 'report', type: 'report',
  115. payload: {
  116. title: `本次问答已结束,历史${diff || 1}分钟,非常感谢您的配合!请查看您本次的健康评估情况。`,
  117. url: `/module/health/pages/report/report?id=${data.healthAnalysisReportId}`
  118. }
  119. })
  120. }
  121. if (data.over) return this._end();
  122. this.setData({
  123. [`_next.dialogId`]: data.dialogId,
  124. [`_next.questions`]: data.nextQuestions,
  125. })
  126. this.triggerEvent('to');
  127. } catch (error) {
  128. console.log(error);
  129. const date = Date.now();
  130. this._createMessage({
  131. id: `system-${date}`, type: 'system',
  132. payload: { date, title: error.errMsg ?? `分析错误,请重试!`, }
  133. });
  134. this._end();
  135. }
  136. },
  137. _createMessage(body: Message, data?: Record<string, any>) {
  138. const messages = this.data.messages;
  139. const index = Object.keys(messages).length;
  140. this.setData({
  141. [`messages.${index}`]: body,
  142. ...data,
  143. })
  144. console.log(this.data.messages);
  145. },
  146. _updateMessage(body: Message) {
  147. const messages = this.data.messages;
  148. const index = Object.keys(messages).length;
  149. this.setData({
  150. [`messages.${index - 1}`]: body,
  151. })
  152. },
  153. }
  154. })