questionnaire.ts 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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.map((item: AnyObject) => {
  102. if (Array.isArray(item.options)) {
  103. item.options = item.options.map(item => {
  104. return { ...item, hide: item.css === 'hide' }
  105. })
  106. }
  107. return { ...item, hide: item.css === 'hide' }
  108. }),
  109. multiple: question.css === 'checkbox',
  110. required: question.required
  111. }
  112. })
  113. } else if (question.over) {
  114. return this._end();
  115. }
  116. }
  117. });
  118. if (data.classify === 'report') {
  119. const diff = dayjs().diff(this.data._timestamp, 'm');
  120. this._createMessage({
  121. id: 'report', type: 'report',
  122. payload: {
  123. title: `本次问答已结束,历史${diff || 1}分钟,非常感谢您的配合!请查看您本次的健康评估情况。`,
  124. url: `/module/health/pages/report/report?id=${data.healthAnalysisReportId}`
  125. }
  126. })
  127. }
  128. if (data.over) return this._end();
  129. this.setData({
  130. [`_next.dialogId`]: data.dialogId,
  131. [`_next.questions`]: data.nextQuestions,
  132. })
  133. this.triggerEvent('to');
  134. } catch (error) {
  135. console.log(error);
  136. const date = Date.now();
  137. this._createMessage({
  138. id: `system-${date}`, type: 'system',
  139. payload: { date, title: error.errMsg ?? `分析错误,请重试!`, }
  140. });
  141. this._end();
  142. }
  143. },
  144. _createMessage(body: Message, data?: Record<string, any>) {
  145. const messages = this.data.messages;
  146. const index = Object.keys(messages).length;
  147. this.setData({
  148. [`messages.${index}`]: body,
  149. ...data,
  150. })
  151. console.log(this.data.messages);
  152. },
  153. _updateMessage(body: Message) {
  154. const messages = this.data.messages;
  155. const index = Object.keys(messages).length;
  156. this.setData({
  157. [`messages.${index - 1}`]: body,
  158. })
  159. },
  160. }
  161. })