Visit-detail.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  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 :xs="24" :sm="24" :md="24" :lg="24" :xl="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-row v-for="(item, index) in state.ruleForm.visitDetails" :key="item.id" :gutter="10">
  197. <!-- 务员评价 -->
  198. <template v-if="item.visitTarget === 10">
  199. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  200. <el-form-item
  201. label="语音评价"
  202. :prop="`visitDetails.${index}.voiceEvaluate`"
  203. :rules="[{ required: notGetThrough, message: '请选择语音评价', trigger: 'change' }]"
  204. >
  205. <el-radio-group v-model="item.voiceEvaluate">
  206. <el-radio :label="item.key" v-for="item in viceEvaluate" :key="item.key">{{ item.value }}</el-radio>
  207. </el-radio-group>
  208. </el-form-item>
  209. </el-col>
  210. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  211. <el-form-item
  212. label="话务员评价"
  213. :prop="`visitDetails.${index}.seatEvaluate`"
  214. :rules="[{ required: notGetThrough, message: '请选择话务员评价', trigger: 'change' }]"
  215. >
  216. <el-radio-group v-model="item.seatEvaluate">
  217. <el-radio :label="item.key" v-for="item in seatEvaluate" :key="item.key">{{ item.value }}</el-radio>
  218. </el-radio-group>
  219. </el-form-item>
  220. </el-col>
  221. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  222. <el-form-item
  223. label="话务员回访内容"
  224. :prop="`visitDetails.${index}.visitContent`"
  225. :rules="[{ required: notGetThrough, message: '请填写话务员回访内容', trigger: 'blur' }]"
  226. >
  227. <common-advice
  228. @chooseAdvice="chooseAdvice($event, index)"
  229. v-model="item.visitContent"
  230. placeholder="请填写话务员回访内容"
  231. :loading="state.loading"
  232. :commonEnum="commonEnum.Seat"
  233. :minRows="5"
  234. :maxRows="10"
  235. drawerWidth="40%"
  236. />
  237. </el-form-item>
  238. </el-col>
  239. </template>
  240. <!-- 部门评价 -->
  241. <template v-if="item.visitTarget === 20">
  242. <el-divider content-position="left">
  243. <el-text tag="b" size="large"> {{ item.visitOrgName }} </el-text>
  244. </el-divider>
  245. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  246. <el-form-item
  247. label="部门办件结果"
  248. :prop="`visitDetails.${index}.orgProcessingResults`"
  249. :rules="[{ required: notGetThrough, message: '请选择部门办件结果', trigger: 'change' }]"
  250. >
  251. <el-select
  252. v-model="item.orgProcessingResults"
  253. placeholder="请选择部门办件结果"
  254. class="w100"
  255. value-key="dicDataValue"
  256. @change="
  257. (val) => {
  258. item.orgProcessingResults.value = val.dicDataName;
  259. item.orgProcessingResults.key = val.dicDataValue;
  260. }
  261. "
  262. >
  263. <el-option v-for="items in visitManner" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
  264. </el-select>
  265. </el-form-item>
  266. </el-col>
  267. <!-- 不满意才会选择不满意原因 -->
  268. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="['1', '2'].includes(item.orgProcessingResults?.key)">
  269. <el-form-item
  270. label="不满意原因"
  271. :prop="`visitDetails.${index}.orgNoSatisfiedReason`"
  272. :rules="[{ required: notGetThrough, message: '请选择不满意原因', trigger: 'change' }]"
  273. >
  274. <el-select
  275. v-model="item.orgNoSatisfiedReason"
  276. placeholder="请选择不满意原因"
  277. class="w100"
  278. value-key="dicDataValue"
  279. multiple
  280. collapse-tags
  281. collapse-tags-tooltip
  282. @change="selectReason($event, index)"
  283. >
  284. <el-option v-for="items in dissatisfiedReason" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
  285. </el-select>
  286. </el-form-item>
  287. </el-col>
  288. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  289. <el-form-item
  290. label="部门办件态度"
  291. :prop="`visitDetails.${index}.orgHandledAttitude`"
  292. :rules="[{ required: notGetThrough, message: '请选择部门办件态度', trigger: 'change' }]"
  293. >
  294. <el-select
  295. v-model="item.orgHandledAttitude"
  296. placeholder="请选择部门办件态度"
  297. class="w100"
  298. value-key="dicDataValue"
  299. @change="
  300. (val) => {
  301. item.orgHandledAttitude.value = val.dicDataName;
  302. item.orgHandledAttitude.key = val.dicDataValue;
  303. }
  304. "
  305. >
  306. <el-option v-for="items in visitSatisfaction" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
  307. </el-select>
  308. </el-form-item>
  309. </el-col>
  310. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  311. <el-form-item
  312. label="部门回访内容"
  313. :prop="`visitDetails.${index}.visitContent`"
  314. :rules="[{ required: notGetThrough, message: '请填写部门回访内容', trigger: 'blur' }]"
  315. >
  316. <common-advice
  317. @chooseAdvice="chooseAdvice($event, index)"
  318. v-model="item.visitContent"
  319. placeholder="请填写部门回访内容"
  320. :loading="state.loading"
  321. :commonEnum="commonEnum.Seat"
  322. :minRows="5"
  323. :maxRows="10"
  324. drawerWidth="40%"
  325. />
  326. </el-form-item>
  327. </el-col>
  328. </template>
  329. </el-row>
  330. </template>
  331. </el-row>
  332. </el-form>
  333. </div>
  334. </el-collapse-item>
  335. </el-collapse>
  336. <template #footer v-if="disabled">
  337. <span class="dialog-footer">
  338. <el-button @click="closeDialog" class="default-button">取 消</el-button>
  339. </span>
  340. </template>
  341. <template #footer v-else>
  342. <span class="dialog-footer">
  343. <el-button @click="closeDialog" class="default-button">取 消</el-button>
  344. <el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">保存</el-button>
  345. </span>
  346. </template>
  347. </el-dialog>
  348. <!-- 播放录音 -->
  349. <play-record ref="playRecordRef" />
  350. </template>
  351. <script setup lang="ts" name="orderFollowUpDetail">
  352. import { computed, defineAsyncComponent, reactive, ref, watch } from 'vue';
  353. import { ElButton, ElMessage, FormInstance } from 'element-plus';
  354. import { commonEnum } from '@/utils/constants';
  355. import { storeToRefs } from 'pinia';
  356. import { useUserInfo } from '@/stores/userInfo';
  357. import { ola } from '@/utils/ola_api';
  358. import dayjs from 'dayjs';
  359. import { visitDetailBaseData, visitOrder } from '@/api/business/visit';
  360. // 引入组件
  361. const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
  362. const PlayRecord = defineAsyncComponent(() => import('@/views/tels/callLog/component/Play-record.vue')); // 播放录音
  363. // 定义子组件向父组件传值/事件
  364. const emit = defineEmits(['updateList']);
  365. // 定义变量内容
  366. const state = reactive<any>({
  367. collapseArr: ['1', '2', '3'], // 折叠面板
  368. dialogVisible: false, // 是否显示弹窗
  369. loading: false, // 是否显示加载
  370. transform: 'translate(0px, 0px)', // 附件弹窗位置
  371. ruleForm: {
  372. isPutThrough: false, //未接通
  373. visitDetails: {},
  374. },
  375. orderDetail: {}, // 工单详情
  376. orderVisitModel: {}, // 回访详情
  377. recordingFileUrl: '', // 录音文件
  378. });
  379. const ruleFormRef = ref<RefType>();
  380. const storesUserInfo = useUserInfo();
  381. const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
  382. const visitCount = ref<number>(0); // 回访次数
  383. const seatEvaluate = ref<EmptyArrayType>(); // 话务员评价
  384. const viceEvaluate = ref<EmptyArrayType>(); // 语音评价
  385. const dissatisfiedReason = ref<EmptyArrayType>(); // 不满意原因
  386. const visitManner = ref<EmptyArrayType>(); // 部门办件结果
  387. const visitSatisfaction = ref<EmptyArrayType>(); // 部门办件态度
  388. const visitId = ref<string>(''); // 回访id
  389. const dialogTitle = ref<string>('回访'); // 弹窗标题
  390. const getBaseData = async (id: string) => {
  391. state.loading = true;
  392. try {
  393. const res = await visitDetailBaseData(id);
  394. visitCount.value = res.result?.visitCount ?? 0;
  395. seatEvaluate.value = res.result?.seatEvaluate ?? [];
  396. viceEvaluate.value = res.result?.viceEvaluate ?? [];
  397. dissatisfiedReason.value = res.result?.dissatisfiedReason ?? [];
  398. visitManner.value = res.result?.visitManner ?? [];
  399. visitSatisfaction.value = res.result?.visitSatisfaction ?? [];
  400. visitId.value = res.result?.orderVisitModel?.id ?? '';
  401. state.orderDetail = res.result?.orderVisitModel?.order ?? {};
  402. state.orderVisitModel = res.result?.orderVisitModel ?? {};
  403. state.recordingFileUrl = res.result?.recordingFileUrl ?? '';
  404. if (res.result?.orderVisitModel?.isPutThrough !== null) {
  405. state.ruleForm.isPutThrough = !res.result?.orderVisitModel?.isPutThrough ?? false;
  406. } else {
  407. state.ruleForm.isPutThrough = false;
  408. }
  409. state.ruleForm.visitDetails = res.result?.orderVisitModel?.orderVisitDetails ?? {};
  410. for (let i of state.ruleForm.visitDetails) {
  411. if (i.visitTarget === 20) {
  412. if (i.orgProcessingResults) {
  413. i.orgProcessingResults = {
  414. ...i.orgProcessingResults,
  415. dicDataName: i.orgProcessingResults.value,
  416. dicDataValue: i.orgProcessingResults.key,
  417. };
  418. }
  419. if (i.orgNoSatisfiedReason) {
  420. i.orgNoSatisfiedReason = i.orgNoSatisfiedReason.map((item: any) => {
  421. return {
  422. ...item,
  423. dicDataName: item.value,
  424. dicDataValue: item.key,
  425. };
  426. });
  427. } else {
  428. i.orgNoSatisfiedReason = [];
  429. }
  430. if (i.orgHandledAttitude) {
  431. i.orgHandledAttitude = {
  432. ...i.orgHandledAttitude,
  433. dicDataName: i.orgHandledAttitude.value,
  434. dicDataValue: i.orgHandledAttitude.key,
  435. };
  436. }
  437. }
  438. }
  439. state.loading = false;
  440. } catch (error) {
  441. console.log(error);
  442. state.loading = false;
  443. }
  444. };
  445. const notGetThrough = ref(false);
  446. watch(
  447. () => state.ruleForm.isPutThrough,
  448. (val) => {
  449. notGetThrough.value = !val;
  450. },
  451. { immediate: true, deep: true }
  452. );
  453. // 打开弹窗
  454. const openDialog = (row: any, type: string = '回访') => {
  455. getBaseData(row.id);
  456. dialogTitle.value = type;
  457. state.dialogVisible = true;
  458. };
  459. const disabled = computed(() => {
  460. return dialogTitle.value === '回访详情';
  461. });
  462. // 设置抽屉
  463. const dialogRef = ref<RefType>(); // 弹窗ref
  464. const mouseup = () => {
  465. state.transform = dialogRef.value.dialogContentRef.$el.style.transform;
  466. };
  467. // 关闭弹窗
  468. const closeDialog = () => {
  469. state.dialogVisible = false;
  470. };
  471. // 查看录音文件
  472. const playRecordRef = ref<RefType>();
  473. const recordFile = (url: string) => {
  474. playRecordRef.value.openDialog(url);
  475. };
  476. // 呼叫
  477. const onCall = (phoneNumber: string) => {
  478. ola.dial(phoneNumber);
  479. };
  480. // 选择不满意原因
  481. const selectReason = (val: any, index: number | string) => {
  482. state.ruleForm.visitDetails[index].orgNoSatisfiedReason = val.map((item: any) => {
  483. return {
  484. ...item,
  485. value: item.dicDataName,
  486. key: item.dicDataValue,
  487. };
  488. });
  489. };
  490. const close = () => {
  491. ruleFormRef.value?.clearValidate();
  492. ruleFormRef.value?.resetFields();
  493. };
  494. // 提交
  495. const onSubmit = (formEl: FormInstance | undefined) => {
  496. if (!formEl) return;
  497. formEl.validate((valid: boolean) => {
  498. if (!valid) return;
  499. state.loading = true;
  500. let request = {
  501. ...state.ruleForm,
  502. isPutThrough: !state.ruleForm.isPutThrough,
  503. ...state.visitDetails,
  504. id: visitId.value,
  505. };
  506. visitOrder(request)
  507. .then(() => {
  508. ElMessage.success('操作成功');
  509. state.loading = false;
  510. closeDialog();
  511. emit('updateList');
  512. })
  513. .catch(() => {
  514. state.loading = false;
  515. });
  516. });
  517. };
  518. // 选中常用意见
  519. const chooseAdvice = (item: any, index: number | string) => {
  520. if (state.ruleForm.visitDetails[index].visitContent === null) {
  521. state.ruleForm.visitDetails[index].visitContent = '';
  522. }
  523. state.ruleForm.visitDetails[index].visitContent += item.content;
  524. };
  525. defineExpose({
  526. openDialog,
  527. closeDialog,
  528. });
  529. </script>
  530. <style lang="scss" scoped>
  531. .collapse-box {
  532. :deep(.el-collapse-item__header) {
  533. background-color: var(--hotline-bg-main-color);
  534. height: 40px;
  535. border-radius: var(--el-border-radius-base);
  536. }
  537. :deep(.el-collapse-item__content) {
  538. padding-bottom: 10px !important;
  539. }
  540. .collapse-container {
  541. padding: 10px;
  542. .plug-container {
  543. border: var(--el-border);
  544. border-radius: var(--el-border-radius-base);
  545. margin-bottom: 15px;
  546. &:last-child {
  547. margin-bottom: 0;
  548. }
  549. .plug-container-title {
  550. padding: 10px 15px;
  551. font-weight: bold;
  552. border-bottom: var(--el-border);
  553. font-size: var(--el-font-size-medium);
  554. }
  555. }
  556. }
  557. }
  558. </style>
  559. <style lang="scss">
  560. .demo-tabs-form {
  561. .title {
  562. font-size: var(--el-font-size-medium);
  563. padding: 10px 15px 20px 15px;
  564. }
  565. }
  566. </style>