questionnaire.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. classify: "",
  28. dialogId: "",
  29. questions: []
  30. } as AnyObject,
  31. _timestamp: Date.now(),
  32. },
  33. observers: {
  34. 'messages.**'(messages) {
  35. const message = Object.values(messages).pop() as Message;
  36. this.setData({ lastId: message?.id });
  37. }
  38. },
  39. methods: {
  40. handle(event: HandleEvent) {
  41. const index = event.target.id.split('.').pop() ?? 0;
  42. console.log(index, event.target.id);
  43. const questions = this.data._next.questions;
  44. Object.assign(questions[index], event.detail);
  45. this.setData({ '_next.questions': questions })
  46. console.log(this.data._next);
  47. this._next()
  48. },
  49. async _start() {
  50. try {
  51. const count = await Post(`/patientInfoManage/rechargeUseDetail`, {}, {
  52. transform({ data }: any) {
  53. return data?.residuedCou
  54. }
  55. });
  56. if (count > 0) {
  57. this.setData({
  58. [`_next.classify`]: '',
  59. [`_next.dialogId`]: '',
  60. [`_next.questions`]: [],
  61. _timestamp: Date.now(),
  62. })
  63. this._next();
  64. } else {
  65. throw { errMsg: `您的健康分析次数已用完,请联系工作人员。` }
  66. }
  67. } catch (error) {
  68. this._createMessage({
  69. id: `system-start`, type: 'system',
  70. payload: { date: Date.now(), title: error.errMsg ?? `分析错误,请重试!`, }
  71. });
  72. this._end();
  73. }
  74. },
  75. _end() {
  76. this.setData({
  77. [`_next.classify`]: '',
  78. [`_next.dialogId`]: '',
  79. [`_next.questions`]: [],
  80. })
  81. this.triggerEvent('next', { component: 'guide', scroll: true });
  82. },
  83. async _next() {
  84. if (this.data._next.classify === 'tongue') {
  85. this._createMessage({
  86. id: `tongue-loading.${Date.now()}`, type: 'text',
  87. payload: { title: '分析中', loading: true }
  88. });
  89. this.triggerEvent('to');
  90. }
  91. try {
  92. const { data } = await Post(`/dialogueManage/dialog`, this.data._next);
  93. data.nextQuestions?.forEach((question: any, index: number) => {
  94. if (question.classify === 'tongue_result') {
  95. this._updateMessage({
  96. id: `${question.classify}.${question.id}.${index}`, type: 'text',
  97. payload: { title: question.content }
  98. })
  99. } else {
  100. if (question.css === 'tongue') {
  101. this._createMessage({
  102. id: `${question.classify}.${question.id}.${index}`, type: 'analysis',
  103. payload: { title: question.title }
  104. });
  105. } else if (question.css === 'text') {
  106. this._createMessage({
  107. id: `${question.classify}.${question.id}.${index}`, type: 'text',
  108. payload: { title: question.content }
  109. });
  110. } else if (['select', 'checkbox'].includes(question.css)) {
  111. this._createMessage({
  112. id: `${question.classify}.${question.id}.${index}`, type: 'select',
  113. payload: {
  114. title: question.title,
  115. options: question.options.map((item: AnyObject) => {
  116. if (Array.isArray(item.options)) {
  117. item.options = item.options.map(item => {
  118. return { ...item, hide: item.css === 'hide' }
  119. })
  120. }
  121. return { ...item, hide: item.css === 'hide' }
  122. }),
  123. multiple: question.css === 'checkbox',
  124. required: question.required
  125. }
  126. })
  127. } else if (question.over) {
  128. return this._end();
  129. }
  130. }
  131. });
  132. if (data.classify === 'report') {
  133. const diff = dayjs().diff(this.data._timestamp, 'm');
  134. this._createMessage({
  135. id: 'report', type: 'report',
  136. payload: {
  137. title: `本次问答已结束,历史${diff || 1}分钟,非常感谢您的配合!请查看您本次的健康评估情况。`,
  138. url: `/module/health/pages/report/report?id=${data.healthAnalysisReportId}`
  139. }
  140. })
  141. }
  142. if (data.over) return this._end();
  143. this.setData({
  144. [`_next.classify`]: data.classify,
  145. [`_next.dialogId`]: data.dialogId,
  146. [`_next.questions`]: data.nextQuestions,
  147. })
  148. this.triggerEvent('to');
  149. } catch (error) {
  150. if (this.data._next.classify === 'tongue') {
  151. this._updateMessage({
  152. id: `tongue-error-${Date.now()}`, type: 'text',
  153. payload: { title: error.errMsg ?? `图像检测失败,请重新拍摄上传`, }
  154. });
  155. this.triggerEvent('to');
  156. setTimeout(() => this._start(), 20);
  157. } else {
  158. const date = Date.now();
  159. this._createMessage({
  160. id: `system-${date}`, type: 'system',
  161. payload: { date, title: error.errMsg ?? `分析错误,请重试!`, }
  162. });
  163. this._end();
  164. }
  165. }
  166. },
  167. _createMessage(body: Message, data?: Record<string, any>) {
  168. const messages = this.data.messages;
  169. const index = Object.keys(messages).length;
  170. this.setData({
  171. [`messages.${index}`]: body,
  172. ...data,
  173. })
  174. console.log(this.data.messages);
  175. },
  176. _updateMessage(body: Message) {
  177. const messages = this.data.messages;
  178. const index = Object.keys(messages).length;
  179. this.setData({
  180. [`messages.${index - 1}`]: body,
  181. })
  182. },
  183. }
  184. })