Visit-detail.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. <template>
  2. <el-dialog
  3. v-model="state.dialogVisible"
  4. draggable
  5. :title="dialogTitle"
  6. ref="dialogRef"
  7. width="50%"
  8. append-to-body
  9. @mouseup="mouseup"
  10. :style="'transform: ' + state.transform + ';'"
  11. @close="close"
  12. >
  13. <el-collapse v-model="state.collapseArr" class="collapse-box" v-loading="state.loading">
  14. <!-- 工单信息 -->
  15. <el-collapse-item name="1">
  16. <template #title>
  17. <p class="pl20">
  18. <b class="font14">工单信息</b>
  19. </p>
  20. </template>
  21. <div class="collapse-container pb1">
  22. <el-form label-width="100px" class="show-info-form">
  23. <el-row :gutter="10">
  24. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  25. <el-form-item label="工单编码" class="mb5"> {{ state.orderDetail.no }} </el-form-item>
  26. </el-col>
  27. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  28. <el-form-item label="受理时间" class="mb5">
  29. <span>{{ dayjs(state.orderDetail.startTime).format('YYYY-MM-DD HH:mm:ss') }}</span></el-form-item
  30. >
  31. </el-col>
  32. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  33. <el-form-item label="受理人" class="mb5">
  34. <span
  35. >{{ state.orderDetail?.acceptorName }}
  36. <span v-if="state.orderDetail?.acceptorStaffNo">[{{ state.orderDetail?.acceptorStaffNo }}]</span></span
  37. >
  38. </el-form-item>
  39. </el-col>
  40. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  41. <el-form-item label="来源方式" class="mb5"> {{ state.orderDetail.sourceChannel }} </el-form-item>
  42. </el-col>
  43. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  44. <el-form-item label="受理类型" class="mb5"> {{ state.orderDetail.acceptType }} </el-form-item>
  45. </el-col>
  46. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  47. <el-form-item label="热点分类" class="mb5"> {{ state.orderDetail.hotspotName }} </el-form-item>
  48. </el-col>
  49. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  50. <el-form-item label="工单标题" class="mb5"> {{ state.orderDetail.title }} </el-form-item>
  51. </el-col>
  52. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  53. <el-form-item label="工单内容" class="mb5"> {{ state.orderDetail.content }} </el-form-item>
  54. </el-col>
  55. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  56. <el-form-item label="办理结果" class="mb5"> {{ state.orderDetail.actualOpinion }} </el-form-item>
  57. </el-col>
  58. </el-row>
  59. </el-form>
  60. </div>
  61. </el-collapse-item>
  62. <el-collapse-item name="2">
  63. <template #title>
  64. <p class="pl20">
  65. <b class="font14">来电人信息</b>
  66. </p>
  67. </template>
  68. <div class="collapse-container pb1">
  69. <el-form label-width="100px" class="show-info-form">
  70. <el-row :gutter="10">
  71. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  72. <el-form-item label="来电人姓名"> {{ state.orderDetail.fromName }} </el-form-item>
  73. </el-col>
  74. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  75. <el-form-item label="来电号码" class="mb5">
  76. {{ state.orderDetail.fromPhone }}
  77. <el-button
  78. plain
  79. title="录音文件"
  80. size="small"
  81. type="primary"
  82. class="ml8"
  83. @click="recordFile(state.recordingFileUrl)"
  84. v-if="state.recordingFileUrl"
  85. >录音文件</el-button
  86. >
  87. </el-form-item>
  88. </el-col>
  89. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  90. <el-form-item label="来电人性别" class="mb5"> {{ state.orderDetail.fromGenderText }} </el-form-item>
  91. </el-col>
  92. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  93. <el-form-item label="联系电话">
  94. {{ state.orderDetail.contact }}
  95. <el-button plain title="呼叫" size="small" type="primary" class="ml8" @click="onCall(state.orderDetail.contact)">外呼</el-button>
  96. </el-form-item>
  97. </el-col>
  98. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  99. <el-form-item label="联系地址"> {{ state.orderDetail.address }} </el-form-item>
  100. </el-col>
  101. </el-row>
  102. </el-form>
  103. </div>
  104. </el-collapse-item>
  105. <el-collapse-item name="3">
  106. <template #title>
  107. <p class="pl20">
  108. <b class="font14">回访信息</b>
  109. </p>
  110. </template>
  111. <div class="collapse-container pb1">
  112. <el-form label-width="120px" ref="ruleFormRef" :model="state.ruleForm" label-position="left">
  113. <el-row :gutter="10">
  114. <!-- 详情 -->
  115. <template v-if="disabled">
  116. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  117. <el-form-item label="当前回访人">
  118. {{ state.orderVisitModel.employeeName }}
  119. </el-form-item>
  120. </el-col>
  121. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="visitCount">
  122. <el-form-item label="当前工单已回访次数" label-width="140px"> {{ visitCount }}次 </el-form-item>
  123. </el-col>
  124. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  125. <el-form-item label="回访标签">
  126. <span v-if="state.ruleForm.isPutThrough !== null">{{ state.ruleForm.isPutThrough ? '已接通' : '未接通' }}</span>
  127. </el-form-item>
  128. </el-col>
  129. <el-row v-for="item in state.ruleForm.visitDetails" :key="item.id" :gutter="10">
  130. <!-- 务员评价 -->
  131. <template v-if="item.visitTarget === 10">
  132. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  133. <el-form-item label="语音评价">
  134. <el-radio-group v-model="item.voiceEvaluate" disabled>
  135. <el-radio :label="item.key" v-for="item in viceEvaluate" :key="item.key">{{ item.value }}</el-radio>
  136. </el-radio-group>
  137. </el-form-item>
  138. </el-col>
  139. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  140. <el-form-item label="话务员评价">
  141. <el-radio-group v-model="item.seatEvaluate" disabled>
  142. <el-radio :label="item.key" v-for="item in seatEvaluate" :key="item.key">{{ item.value }}</el-radio>
  143. </el-radio-group>
  144. </el-form-item>
  145. </el-col>
  146. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  147. <el-form-item label="话务员回访内容">
  148. {{ item.visitContent }}
  149. </el-form-item>
  150. </el-col>
  151. </template>
  152. <!-- 部门评价 -->
  153. <template v-if="item.visitTarget === 20">
  154. <el-divider content-position="left">
  155. <el-text tag="b" size="large"> {{ item.visitOrgName }} </el-text>
  156. </el-divider>
  157. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  158. <el-form-item label="部门办件结果">
  159. {{ item.orgProcessingResults?.dicDataName }}
  160. </el-form-item>
  161. </el-col>
  162. <!-- 不满意才会选择不满意原因 -->
  163. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="item.orgNoSatisfiedReason && item.orgNoSatisfiedReason.length">
  164. <el-form-item label="不满意原因">
  165. {{ item.orgNoSatisfiedReason.map((item) => item.dicDataName).join(',') }}
  166. </el-form-item>
  167. </el-col>
  168. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  169. <el-form-item label="部门办件态度">
  170. {{ item.orgHandledAttitude?.dicDataName }}
  171. </el-form-item>
  172. </el-col>
  173. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  174. <el-form-item label="部门回访内容">
  175. {{ item.visitContent }}
  176. </el-form-item>
  177. </el-col>
  178. </template>
  179. </el-row>
  180. </template>
  181. <!-- 编辑 -->
  182. <template v-else>
  183. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  184. <el-form-item label="当前回访人">
  185. {{ userInfos.name }}
  186. </el-form-item>
  187. </el-col>
  188. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  189. <el-form-item label="当前工单已回访次数" label-width="140px"> {{ visitCount }}次 </el-form-item>
  190. </el-col>
  191. <el-col :span="24">
  192. <el-form-item label="回访标签" prop="isPutThrough" :rules="[{ required: false, message: '请选择回访标签', trigger: 'change' }]">
  193. <el-checkbox v-model="state.ruleForm.isPutThrough">未接通</el-checkbox>
  194. </el-form-item>
  195. </el-col>
  196. <el-col :span="24">
  197. <el-row v-for="(item, index) in state.ruleForm.visitDetails" :key="item.id" :gutter="10">
  198. <!-- 务员评价 -->
  199. <template v-if="item.visitTarget === 10">
  200. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  201. <el-form-item
  202. label="语音评价"
  203. :prop="`visitDetails.${index}.voiceEvaluate`"
  204. :rules="[{ required: notGetThrough, message: '请选择语音评价', trigger: 'change' }]"
  205. >
  206. <el-radio-group v-model="item.voiceEvaluate">
  207. <el-radio :label="item.key" v-for="item in viceEvaluate" :key="item.key">{{ item.value }}</el-radio>
  208. </el-radio-group>
  209. </el-form-item>
  210. </el-col>
  211. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  212. <el-form-item
  213. label="话务员评价"
  214. :prop="`visitDetails.${index}.seatEvaluate`"
  215. :rules="[{ required: notGetThrough, message: '请选择话务员评价', trigger: 'change' }]"
  216. >
  217. <el-radio-group v-model="item.seatEvaluate">
  218. <el-radio :label="item.key" v-for="item in seatEvaluate" :key="item.key">{{ item.value }}</el-radio>
  219. </el-radio-group>
  220. </el-form-item>
  221. </el-col>
  222. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  223. <el-form-item
  224. label="话务员回访内容"
  225. :prop="`visitDetails.${index}.visitContent`"
  226. :rules="[{ required: notGetThrough, message: '请填写话务员回访内容', trigger: 'blur' }]"
  227. >
  228. <common-advice
  229. @chooseAdvice="chooseAdvice($event, index)"
  230. v-model="item.visitContent"
  231. placeholder="请填写话务员回访内容"
  232. :loading="state.loading"
  233. :commonEnum="commonEnum.Seat"
  234. :minRows="5"
  235. :maxRows="10"
  236. drawerWidth="40%"
  237. />
  238. </el-form-item>
  239. </el-col>
  240. </template>
  241. <!-- 部门评价 -->
  242. <template v-if="item.visitTarget === 20">
  243. <el-divider content-position="left">
  244. <el-text tag="b" size="large"> {{ item.visitOrgName }} </el-text>
  245. </el-divider>
  246. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  247. <el-form-item
  248. label="部门办件结果"
  249. :prop="`visitDetails.${index}.orgProcessingResults`"
  250. :rules="[{ required: notGetThrough, message: '请选择部门办件结果', trigger: 'change' }]"
  251. >
  252. <el-select
  253. v-model="item.orgProcessingResults"
  254. placeholder="请选择部门办件结果"
  255. class="w100"
  256. value-key="dicDataValue"
  257. @change="
  258. (val) => {
  259. item.orgProcessingResults.value = val.dicDataName;
  260. item.orgProcessingResults.key = val.dicDataValue;
  261. }
  262. "
  263. >
  264. <el-option v-for="items in visitManner" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
  265. </el-select>
  266. </el-form-item>
  267. </el-col>
  268. <!-- 不满意才会选择不满意原因 -->
  269. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="['1', '2'].includes(item.orgProcessingResults?.key)">
  270. <el-form-item
  271. label="不满意原因"
  272. :prop="`visitDetails.${index}.orgNoSatisfiedReason`"
  273. :rules="[{ required: notGetThrough, message: '请选择不满意原因', trigger: 'change' }]"
  274. >
  275. <el-select
  276. v-model="item.orgNoSatisfiedReason"
  277. placeholder="请选择不满意原因"
  278. class="w100"
  279. value-key="dicDataValue"
  280. multiple
  281. collapse-tags
  282. collapse-tags-tooltip
  283. @change="selectReason($event, index)"
  284. >
  285. <el-option v-for="items in dissatisfiedReason" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
  286. </el-select>
  287. </el-form-item>
  288. </el-col>
  289. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  290. <el-form-item
  291. label="部门办件态度"
  292. :prop="`visitDetails.${index}.orgHandledAttitude`"
  293. :rules="[{ required: notGetThrough, message: '请选择部门办件态度', trigger: 'change' }]"
  294. >
  295. <el-select
  296. v-model="item.orgHandledAttitude"
  297. placeholder="请选择部门办件态度"
  298. class="w100"
  299. value-key="dicDataValue"
  300. @change="
  301. (val) => {
  302. item.orgHandledAttitude.value = val.dicDataName;
  303. item.orgHandledAttitude.key = val.dicDataValue;
  304. }
  305. "
  306. >
  307. <el-option v-for="items in visitSatisfaction" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
  308. </el-select>
  309. </el-form-item>
  310. </el-col>
  311. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  312. <el-form-item
  313. label="部门回访内容"
  314. :prop="`visitDetails.${index}.visitContent`"
  315. :rules="[{ required: notGetThrough, message: '请填写部门回访内容', trigger: 'blur' }]"
  316. >
  317. <common-advice
  318. @chooseAdvice="chooseAdvice($event, index)"
  319. v-model="item.visitContent"
  320. placeholder="请填写部门回访内容"
  321. :loading="state.loading"
  322. :commonEnum="commonEnum.Seat"
  323. :minRows="5"
  324. :maxRows="10"
  325. drawerWidth="40%"
  326. />
  327. </el-form-item>
  328. </el-col>
  329. </template>
  330. </el-row>
  331. </el-col>
  332. </template>
  333. </el-row>
  334. </el-form>
  335. </div>
  336. </el-collapse-item>
  337. </el-collapse>
  338. <template #footer v-if="disabled">
  339. <span class="dialog-footer">
  340. <el-button @click="closeDialog" class="default-button">取 消</el-button>
  341. </span>
  342. </template>
  343. <template #footer v-else>
  344. <span class="dialog-footer">
  345. <el-button @click="closeDialog" class="default-button">取 消</el-button>
  346. <el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">保存</el-button>
  347. </span>
  348. </template>
  349. </el-dialog>
  350. <!-- 播放录音 -->
  351. <play-record ref="playRecordRef" />
  352. </template>
  353. <script setup lang="ts" name="orderFollowUpDetail">
  354. import { computed, defineAsyncComponent, reactive, ref, watch } from 'vue';
  355. import { ElButton, ElMessage, FormInstance } from 'element-plus';
  356. import { commonEnum } from '@/utils/constants';
  357. import { storeToRefs } from 'pinia';
  358. import { useUserInfo } from '@/stores/userInfo';
  359. import { ola } from '@/utils/ola_api';
  360. import dayjs from 'dayjs';
  361. import { visitDetailBaseData, visitOrder } from '@/api/business/visit';
  362. // 引入组件
  363. const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
  364. const PlayRecord = defineAsyncComponent(() => import('@/views/tels/callLog/component/Play-record.vue')); // 播放录音
  365. // 定义子组件向父组件传值/事件
  366. const emit = defineEmits(['updateList']);
  367. // 定义变量内容
  368. const state = reactive<any>({
  369. collapseArr: ['1', '2', '3'], // 折叠面板
  370. dialogVisible: false, // 是否显示弹窗
  371. loading: false, // 是否显示加载
  372. transform: 'translate(0px, 0px)', // 附件弹窗位置
  373. ruleForm: {
  374. isPutThrough: false, //未接通
  375. visitDetails: {},
  376. },
  377. orderDetail: {}, // 工单详情
  378. orderVisitModel: {}, // 回访详情
  379. recordingFileUrl: '', // 录音文件
  380. });
  381. const ruleFormRef = ref<RefType>();
  382. const storesUserInfo = useUserInfo();
  383. const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
  384. const visitCount = ref<number>(0); // 回访次数
  385. const seatEvaluate = ref<EmptyArrayType>(); // 话务员评价
  386. const viceEvaluate = ref<EmptyArrayType>(); // 语音评价
  387. const dissatisfiedReason = ref<EmptyArrayType>(); // 不满意原因
  388. const visitManner = ref<EmptyArrayType>(); // 部门办件结果
  389. const visitSatisfaction = ref<EmptyArrayType>(); // 部门办件态度
  390. const visitId = ref<string>(''); // 回访id
  391. const dialogTitle = ref<string>('回访'); // 弹窗标题
  392. const getBaseData = async (id: string) => {
  393. state.loading = true;
  394. try {
  395. const res = await visitDetailBaseData(id);
  396. visitCount.value = res.result?.visitCount ?? 0;
  397. seatEvaluate.value = res.result?.seatEvaluate ?? [];
  398. viceEvaluate.value = res.result?.viceEvaluate ?? [];
  399. dissatisfiedReason.value = res.result?.dissatisfiedReason ?? [];
  400. visitManner.value = res.result?.visitManner ?? [];
  401. visitSatisfaction.value = res.result?.visitSatisfaction ?? [];
  402. visitId.value = res.result?.orderVisitModel?.id ?? '';
  403. state.orderDetail = res.result?.orderVisitModel?.order ?? {};
  404. state.orderVisitModel = res.result?.orderVisitModel ?? {};
  405. state.recordingFileUrl = res.result?.recordingFileUrl ?? '';
  406. if (res.result?.orderVisitModel?.isPutThrough !== null) {
  407. state.ruleForm.isPutThrough = !res.result?.orderVisitModel?.isPutThrough ?? false;
  408. } else {
  409. state.ruleForm.isPutThrough = false;
  410. }
  411. state.ruleForm.visitDetails = res.result?.orderVisitModel?.orderVisitDetails ?? {};
  412. for (let i of state.ruleForm.visitDetails) {
  413. if (i.visitTarget === 20) {
  414. if (i.orgProcessingResults) {
  415. i.orgProcessingResults = {
  416. ...i.orgProcessingResults,
  417. dicDataName: i.orgProcessingResults.value,
  418. dicDataValue: i.orgProcessingResults.key,
  419. };
  420. }
  421. if (i.orgNoSatisfiedReason) {
  422. i.orgNoSatisfiedReason = i.orgNoSatisfiedReason.map((item: any) => {
  423. return {
  424. ...item,
  425. dicDataName: item.value,
  426. dicDataValue: item.key,
  427. };
  428. });
  429. } else {
  430. i.orgNoSatisfiedReason = [];
  431. }
  432. if (i.orgHandledAttitude) {
  433. i.orgHandledAttitude = {
  434. ...i.orgHandledAttitude,
  435. dicDataName: i.orgHandledAttitude.value,
  436. dicDataValue: i.orgHandledAttitude.key,
  437. };
  438. }
  439. }
  440. }
  441. state.loading = false;
  442. } catch (error) {
  443. console.log(error);
  444. state.loading = false;
  445. }
  446. };
  447. const notGetThrough = ref(false);
  448. watch(
  449. () => state.ruleForm.isPutThrough,
  450. (val) => {
  451. notGetThrough.value = !val;
  452. },
  453. { immediate: true, deep: true }
  454. );
  455. // 打开弹窗
  456. const openDialog = (row: any, type: string = '回访') => {
  457. getBaseData(row.id);
  458. dialogTitle.value = type;
  459. state.dialogVisible = true;
  460. };
  461. const disabled = computed(() => {
  462. return dialogTitle.value === '回访详情';
  463. });
  464. // 设置抽屉
  465. const dialogRef = ref<RefType>(); // 弹窗ref
  466. const mouseup = () => {
  467. state.transform = dialogRef.value.dialogContentRef.$el.style.transform;
  468. };
  469. // 关闭弹窗
  470. const closeDialog = () => {
  471. state.dialogVisible = false;
  472. };
  473. // 查看录音文件
  474. const playRecordRef = ref<RefType>();
  475. const recordFile = (url: string) => {
  476. playRecordRef.value.openDialog(url);
  477. };
  478. // 呼叫
  479. const onCall = (phoneNumber: string) => {
  480. ola.dial(phoneNumber);
  481. };
  482. // 选择不满意原因
  483. const selectReason = (val: any, index: number | string) => {
  484. state.ruleForm.visitDetails[index].orgNoSatisfiedReason = val.map((item: any) => {
  485. return {
  486. ...item,
  487. value: item.dicDataName,
  488. key: item.dicDataValue,
  489. };
  490. });
  491. };
  492. const close = () => {
  493. ruleFormRef.value?.clearValidate();
  494. ruleFormRef.value?.resetFields();
  495. };
  496. // 提交
  497. const onSubmit = (formEl: FormInstance | undefined) => {
  498. if (!formEl) return;
  499. formEl.validate((valid: boolean) => {
  500. if (!valid) return;
  501. state.loading = true;
  502. let request = {
  503. ...state.ruleForm,
  504. isPutThrough: !state.ruleForm.isPutThrough,
  505. ...state.visitDetails,
  506. id: visitId.value,
  507. };
  508. visitOrder(request)
  509. .then(() => {
  510. ElMessage.success('操作成功');
  511. state.loading = false;
  512. closeDialog();
  513. emit('updateList');
  514. })
  515. .catch(() => {
  516. state.loading = false;
  517. });
  518. });
  519. };
  520. // 选中常用意见
  521. const chooseAdvice = (item: any, index: number | string) => {
  522. if (state.ruleForm.visitDetails[index].visitContent === null) {
  523. state.ruleForm.visitDetails[index].visitContent = '';
  524. }
  525. state.ruleForm.visitDetails[index].visitContent += item.content;
  526. };
  527. defineExpose({
  528. openDialog,
  529. closeDialog,
  530. });
  531. </script>
  532. <style lang="scss" scoped>
  533. .collapse-box {
  534. :deep(.el-collapse-item__header) {
  535. background-color: var(--hotline-bg-main-color);
  536. height: 40px;
  537. border-radius: var(--el-border-radius-base);
  538. }
  539. :deep(.el-collapse-item__content) {
  540. padding-bottom: 10px !important;
  541. }
  542. .collapse-container {
  543. padding: 10px;
  544. .plug-container {
  545. border: var(--el-border);
  546. border-radius: var(--el-border-radius-base);
  547. margin-bottom: 15px;
  548. &:last-child {
  549. margin-bottom: 0;
  550. }
  551. .plug-container-title {
  552. padding: 10px 15px;
  553. font-weight: bold;
  554. border-bottom: var(--el-border);
  555. font-size: var(--el-font-size-medium);
  556. }
  557. }
  558. }
  559. }
  560. </style>
  561. <style lang="scss">
  562. .demo-tabs-form {
  563. .title {
  564. font-size: var(--el-font-size-medium);
  565. padding: 10px 15px 20px 15px;
  566. }
  567. }
  568. </style>