Order-detail.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. <template>
  2. <el-dialog v-model="state.dialogVisible" class="order-detail-dialog" draggable ref="dialogRef" width="80%" append-to-body destroy-on-close>
  3. <template #header>
  4. <el-tabs v-model="state.activeName" @tab-change="handleClick">
  5. <el-tab-pane :name="item.value" v-for="item in state.tabPaneList" :key="item.value" :label="item.label"></el-tab-pane>
  6. </el-tabs>
  7. </template>
  8. <el-collapse v-model="state.collapseArr" v-if="state.activeName === '0'" class="collapse-box" v-loading="state.loading">
  9. <el-collapse-item name="1">
  10. <template #title>
  11. <p class="pl20">
  12. <b class="font14">来电人信息</b>
  13. </p>
  14. </template>
  15. <div class="collapse-container pb1">
  16. <el-form label-width="100px" ref="ruleFormRef">
  17. <el-row :gutter="10">
  18. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.transferPhone">
  19. <el-form-item label="转接来源"> {{ state.ruleForm.transferPhone }} </el-form-item>
  20. </el-col>
  21. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.fromPhone">
  22. <el-form-item label="来电号码">
  23. {{ state.ruleForm.fromPhone }}
  24. <el-button plain title="录音文件" size="small" type="primary" class="ml8" @click="recordFile(state.ruleForm.callId)"
  25. v-if="state.ruleForm.callId" >录音文件</el-button>
  26. <!-- <el-popover :width="480" trigger="hover">
  27. <template #reference>
  28. <el-button link type="primary" class="ml5" title="播放录音"><SvgIcon name="ele-Headset" size="16px" /></el-button>
  29. </template>
  30. <AudioPlayer ref="AudioPlayerRef" :url="state.ruleForm.url" />
  31. </el-popover> -->
  32. </el-form-item>
  33. </el-col>
  34. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.callAddress">
  35. <el-form-item label="号码归属地">
  36. {{ state.ruleForm.callAddress }}
  37. </el-form-item>
  38. </el-col>
  39. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  40. <el-form-item label="来电人姓名">
  41. {{ state.ruleForm.fromName }} <span class="ml5"> {{ state.ruleForm.fromGenderText }}</span>
  42. </el-form-item>
  43. </el-col>
  44. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  45. <el-form-item label="来电人性别">
  46. {{ state.ruleForm.fromGenderText }}
  47. </el-form-item>
  48. </el-col>
  49. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.contact">
  50. <el-form-item label="联系电话">
  51. <span v-if="showMaskNumber"> {{ state.ruleForm.contactMask }}</span>
  52. <span v-else>{{ state.ruleForm.contact }}</span>
  53. <el-button plain title="外呼" size="small" type="primary" class="ml8" @click="callPhone(state.ruleForm.contact)">外呼</el-button>
  54. <el-button plain title="查看号码" size="small" type="primary" class="ml8" @click="showMaskNumber = !showMaskNumber">{{
  55. showMaskNumber ? '查看号码' : '隐藏号码'
  56. }}</el-button>
  57. </el-form-item>
  58. </el-col>
  59. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  60. <el-form-item label="来电人身份"> {{ state.ruleForm.identityTypeText }} </el-form-item>
  61. </el-col>
  62. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  63. <el-form-item label="受理短信"> {{ state.ruleForm.smsSendedText }} </el-form-item>
  64. </el-col>
  65. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  66. <el-form-item label="事发地址"> {{ state.ruleForm.address }} </el-form-item>
  67. </el-col>
  68. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.company">
  69. <el-form-item label="工作单位"> {{ state.ruleForm.company }} </el-form-item>
  70. </el-col>
  71. </el-row>
  72. </el-form>
  73. </div>
  74. </el-collapse-item>
  75. <el-collapse-item name="2">
  76. <template #title>
  77. <p class="pl20">
  78. <b class="font14">工单信息</b>
  79. </p>
  80. </template>
  81. <div class="collapse-container pb1">
  82. <el-form label-width="100px" ref="ruleFormRef">
  83. <el-row :gutter="10">
  84. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  85. <el-form-item label="来源方式"> {{ state.ruleForm.sourceChannel }} </el-form-item>
  86. </el-col>
  87. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  88. <el-form-item label="受理类型"> {{ state.ruleForm.acceptType }} </el-form-item>
  89. </el-col>
  90. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  91. <el-form-item label="工单编码"> {{ state.ruleForm.no }} </el-form-item>
  92. </el-col>
  93. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.fromProvinceNo">
  94. <el-form-item label="省工单编码"> {{ state.ruleForm.fromProvinceNo }} </el-form-item>
  95. </el-col>
  96. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  97. <el-form-item label="工单类型">
  98. {{ state.ruleForm.orderTypeText }}
  99. <!-- 投诉或者建议并且是12315工单才有扩展信息 -->
  100. <el-button
  101. link
  102. type="primary"
  103. v-if="state.ruleForm.orderType === 1 && (state.ruleForm.acceptType === '30' || state.ruleForm.acceptType === '35')"
  104. class="ml10"
  105. @click="showExpandInfo"
  106. ><SvgIcon name="ele-Document" class="mr2" /> 拓展信息</el-button
  107. >
  108. </el-form-item>
  109. </el-col>
  110. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  111. <el-form-item label="是否重复">
  112. {{ state.ruleForm.duplicateIds && state.ruleForm.duplicateIds.length > 0 ? '是(' + state.ruleForm.duplicateIds.length + '次)' : '否' }}
  113. <el-button
  114. plain
  115. title="查看重复工单"
  116. size="small"
  117. type="primary"
  118. class="ml8"
  119. @click="showRepeatInfo"
  120. v-if="state.ruleForm.duplicateIds && state.ruleForm.duplicateIds.length > 0"
  121. >查看重复工单</el-button
  122. >
  123. </el-form-item>
  124. </el-col>
  125. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  126. <el-form-item label="紧急程度"> {{ state.ruleForm.emergencyLevelText }} </el-form-item>
  127. </el-col>
  128. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  129. <el-form-item label="热点分类"> {{ state.ruleForm.hotspotSpliceName }} </el-form-item>
  130. </el-col>
  131. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  132. <el-form-item label="受理人">
  133. <span>{{ state.ruleForm?.acceptorName}} <span v-if="state.ruleForm?.acceptorStaffNo">[{{state.ruleForm?.acceptorStaffNo}}]</span></span>
  134. </el-form-item>
  135. </el-col>
  136. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.incidentTime">
  137. <el-form-item label="受理时间"> {{ formatDate(state.ruleForm.incidentTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  138. </el-col>
  139. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.pushType">
  140. <el-form-item label="推送分类"> {{ state.ruleForm.pushType }} </el-form-item>
  141. </el-col>
  142. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  143. <el-form-item label="工单标题">
  144. {{ state.ruleForm.title }} <el-tag class="ml10">{{ state.ruleForm.statusText }}</el-tag>
  145. </el-form-item>
  146. </el-col>
  147. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  148. <el-form-item label="受理内容">
  149. {{ state.ruleForm.content }}
  150. </el-form-item>
  151. </el-col>
  152. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-auth="'file:list'">
  153. <el-form-item label="附件">
  154. <annex-list name="查看附件" readonly :businessId="state.ruleForm.id" classify="查看附件" />
  155. </el-form-item>
  156. </el-col>
  157. </el-row>
  158. </el-form>
  159. </div>
  160. </el-collapse-item>
  161. <el-collapse-item name="3">
  162. <template #title>
  163. <p class="pl20">
  164. <b class="font14">结果信息</b>
  165. </p>
  166. </template>
  167. <div class="collapse-container pb1">
  168. <el-form label-width="100px" ref="ruleFormRef">
  169. <el-row :gutter="10">
  170. <el-col :xs="24" :sm="24" :md="8" :lg="6" :xl="6">
  171. <el-form-item label="交办部门"> 热线中心 </el-form-item>
  172. </el-col>
  173. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  174. <el-form-item label="交办时间"> {{ formatDate(state.ruleForm.centerToOrgTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  175. </el-col>
  176. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  177. <el-form-item label="办理部门"> {{ state.ruleForm.actualHandleOrgName }}</el-form-item>
  178. </el-col>
  179. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  180. <el-form-item label="办理时间"> {{ formatDate(state.ruleForm.actualHandleTime , 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  181. </el-col>
  182. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  183. <el-form-item label="工单办理期限"> {{ state.ruleForm.timeLimit }} </el-form-item>
  184. </el-col>
  185. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  186. <el-form-item label="工单期满时间"> {{ formatDate(state.ruleForm.expiredTime , 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  187. </el-col>
  188. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  189. <el-form-item label="办理结果"> {{ state.ruleForm.actualOpinion }} </el-form-item>
  190. </el-col>
  191. </el-row>
  192. </el-form>
  193. </div>
  194. </el-collapse-item>
  195. <el-collapse-item name="4" v-if="state.supplements && state.supplements.length">
  196. <template #title>
  197. <p class="pl20">
  198. <b class="font14">补充信息</b>
  199. </p>
  200. </template>
  201. <div class="collapse-container">
  202. <div v-for="i in state.supplements" :key="i" class="plug-container">
  203. <el-form label-width="100px" ref="ruleFormRef" class="pt10 pb10">
  204. <el-row :gutter="10">
  205. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  206. <el-form-item label="补充部门">
  207. {{ i.creator.organization }}
  208. </el-form-item>
  209. </el-col>
  210. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  211. <el-form-item label="补充时间"> {{ formatDate(i.creationTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  212. </el-col>
  213. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  214. <el-form-item label="补充人">
  215. {{ i.creator.name }} <span v-if="i.creator.staffNo">[{{ i.creator.staffNo }} ]</span></el-form-item
  216. >
  217. </el-col>
  218. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  219. <el-form-item label="补充详情">
  220. {{ i.opinion }}
  221. </el-form-item>
  222. </el-col>
  223. </el-row>
  224. </el-form>
  225. </div>
  226. </div>
  227. </el-collapse-item>
  228. <el-collapse-item name="5" v-if="state.workflow.assignOrgs">
  229. <template #title>
  230. <p class="pl20">
  231. <b class="font14">回访信息</b>
  232. </p>
  233. </template>
  234. <div class="collapse-container pb1">
  235. <el-form label-width="100px" ref="ruleFormRef">
  236. <el-row :gutter="10">
  237. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  238. <el-form-item label="语音评价"> {{ state.workflow.assignOrgs }}</el-form-item>
  239. </el-col>
  240. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  241. <el-form-item label="话务员评价"> {{ formatDate(state.workflow.assignTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  242. </el-col>
  243. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  244. <el-form-item label="补充人"> {{ state.workflow.timeLimit }} </el-form-item>
  245. </el-col>
  246. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  247. <el-form-item label="被回访部门"> {{ formatDate(state.workflow.expiredTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  248. </el-col>
  249. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  250. <el-form-item label="办件结果"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  251. </el-col>
  252. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  253. <el-form-item label="办件态度"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  254. </el-col>
  255. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  256. <el-form-item label="回访内容"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  257. </el-col>
  258. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  259. <el-form-item label="被回访部门"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  260. </el-col>
  261. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  262. <el-form-item label="办件结果"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  263. </el-col>
  264. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  265. <el-form-item label="办件态度"> {{ formatDate(state.workflow.completeTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  266. </el-col>
  267. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  268. <el-form-item label="回访内容"> {{ state.workflow.opinion }} </el-form-item>
  269. </el-col>
  270. </el-row>
  271. </el-form>
  272. </div>
  273. </el-collapse-item>
  274. <el-collapse-item name="6" v-if="state.workflow.assignOrgs">
  275. <template #title>
  276. <p class="pl20">
  277. <b class="font14">重办信息</b>
  278. </p>
  279. </template>
  280. <div class="collapse-container pb1">
  281. <el-form label-width="100px" ref="ruleFormRef">
  282. <el-row :gutter="10">
  283. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  284. <el-form-item label="被重办部门"> {{ state.workflow.assignOrgs }}</el-form-item>
  285. </el-col>
  286. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  287. <el-form-item label="重办时间"> {{ formatDate(state.workflow.assignTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  288. </el-col>
  289. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  290. <el-form-item label="重办理由"> {{ state.workflow.timeLimit }} </el-form-item>
  291. </el-col>
  292. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  293. <el-form-item label="重办原因"> {{ state.workflow.opinion }} </el-form-item>
  294. </el-col>
  295. </el-row>
  296. </el-form>
  297. </div>
  298. </el-collapse-item>
  299. </el-collapse>
  300. <template #footer>
  301. <span class="dialog-footer">
  302. <el-button type="primary" @click="onRecord" :loading="state.loading" v-auth="'system:workflow:record'">流转记录</el-button>
  303. <!-- 工单未归档和可以办理展示办理按钮 -->
  304. <el-button
  305. type="primary"
  306. @click="onSubmit('工单办理')"
  307. :loading="state.loading"
  308. v-if="state.ruleForm.workflow?.status !== 60 && state.workflow.canHandle"
  309. v-auth="'business:order:handle'"
  310. >办 理</el-button
  311. >
  312. <el-button type="primary" @click="onSubmit('延期申请','延期附件')" v-auth="'business:order:delay'" :loading="state.loading">延 期</el-button>
  313. <!-- 流程结束之后不展示补充按钮 -->
  314. <el-button type="primary" @click="onSupply" :loading="state.loading" v-if="state.workflow.status === 0" v-auth="'workflow:supply'"
  315. >补 充</el-button
  316. >
  317. <el-button type="primary" @click="onUrge" :loading="state.loading" v-auth="'business:order:supervise:apply'">
  318. 催 办</el-button>
  319. <el-button type="primary" @click="onSupervise" :loading="state.loading" v-auth="'business:order:urge:apply'">督 办</el-button>
  320. <el-button type="primary" @click="onRevoke" :loading="state.loading" v-auth="'business:order:revoke'">撤 销</el-button>
  321. <!-- 工单未归档都可以撤回 -->
  322. <el-button
  323. type="primary"
  324. @click="onSubmit('撤回申请')"
  325. :loading="state.loading"
  326. v-if="state.ruleForm.workflow?.status === 0"
  327. v-auth="'business:order:recall'"
  328. >撤 回</el-button
  329. >
  330. <!-- 工单未归档和可以办理展示退回按钮 -->
  331. <el-button
  332. type="primary"
  333. @click="onSubmit('退回申请')"
  334. :loading="state.loading"
  335. v-if="state.ruleForm.workflow?.status !== 60 && state.workflow.canHandle"
  336. v-auth="'business:order:return'"
  337. >退 回</el-button
  338. >
  339. </span>
  340. </template>
  341. </el-dialog>
  342. <!-- 扩展信息 -->
  343. <order-expand-detail ref="orderExpandDetailRef" />
  344. <!-- 流转记录 -->
  345. <audit-record ref="AuditRecordRef">
  346. <template #header>
  347. <el-form label-width="90px" ref="ruleFormRef">
  348. <el-row :gutter="35">
  349. <el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
  350. <el-form-item label="工单编码"> {{ state.ruleForm.no }} </el-form-item>
  351. </el-col>
  352. <el-col :xs="24" :sm="16" :md="16" :lg="16" :xl="16">
  353. <el-form-item label="工单标题"> {{ state.ruleForm.title }} </el-form-item>
  354. </el-col>
  355. </el-row>
  356. </el-form>
  357. </template>
  358. </audit-record>
  359. <!-- 工单补充 -->
  360. <order-supply ref="orderSupplyRef" @onSupplySuccess="onSupplySuccess" />
  361. <!-- 工单撤销 -->
  362. <order-revoke ref="orderRevokeRef" @onRevokeSuccess="onRevokeSuccess" />
  363. <!-- 工单督办 -->
  364. <order-supervise ref="orderSuperviseRef" @updateList="onSuperviseSuccess" />
  365. <!-- 工单催办 -->
  366. <order-urge ref="orderUrgeRef" @updateList="onSuperviseSuccess" />
  367. <!-- 流程审批 -->
  368. <process-audit ref="processAuditRef" @orderProcessSuccess="orderProcessSuccess" />
  369. <!-- 重复工单 -->
  370. <order-repeat ref="orderRepeatRef" />
  371. </template>
  372. <script setup lang="ts" name="orderDetail">
  373. import { defineAsyncComponent, reactive, ref } from 'vue';
  374. import { useRouter } from 'vue-router';
  375. import { throttle } from '/@/utils/tools';
  376. import { commonEnum } from '/@/utils/constants';
  377. import { orderDetail } from '/@/api/business/order';
  378. import { formatDate } from '/@/utils/formatTime';
  379. import { ElMessage } from 'element-plus';
  380. import { VoiceInterfaceObject } from '/@/utils/PhoneScript';
  381. // 引入组件
  382. const OrderExpandDetail = defineAsyncComponent(() => import('/@/views/business/order/components/Order-expand-detail.vue')); // 扩展信息
  383. const OrderSupply = defineAsyncComponent(() => import('/@/views/business/order/components/Order-supply.vue')); // 工单补充
  384. const OrderRevoke = defineAsyncComponent(() => import('/@/views/business/order/components/Order-revoke.vue')); // 工单撤销
  385. const OrderSupervise = defineAsyncComponent(() => import('/@/views/business/supervise/components/Order-supervise.vue')); // 工单督办
  386. const OrderUrge = defineAsyncComponent(() => import('/@/views/business/urge/components/Order-urge.vue')); // 工单催办
  387. const OrderRepeat = defineAsyncComponent(() => import('/@/views/business/order/components/Order-repeat.vue')); // 重复工单
  388. const AuditRecord = defineAsyncComponent(() => import('/@/components/AuditRecord/index.vue')); // 审核记录
  389. const AnnexList = defineAsyncComponent(() => import('/@/components/AnnexList/index.vue')); // 附件列表
  390. const ProcessAudit = defineAsyncComponent(() => import('/@/components/ProcessAudit/index.vue')); // 流程审批
  391. // const AudioPlayer = defineAsyncComponent(() => import('/@/components/AudioPlayer/index.vue'));
  392. // 定义子组件向父组件传值/事件
  393. const emit = defineEmits(['updateList', 'handle']);
  394. // 定义变量内容
  395. const state = reactive<any>({
  396. dialogVisible: false, // 弹窗显示隐藏
  397. ruleForm: {
  398. // 表单数据
  399. url: '',
  400. fromGenderText: '',
  401. channelText: '',
  402. identityTypeText: '',
  403. licenceNo: '',
  404. contactMask: '',
  405. company: '',
  406. emergencyLevelText: '',
  407. incidentTime: '',
  408. } as any,
  409. activeName: '0', // tab切换
  410. tabPaneList: [
  411. // tab列表
  412. {
  413. label: '工单详情',
  414. value: '0',
  415. },
  416. {
  417. label: '延期记录',
  418. value: '1',
  419. },
  420. {
  421. label: '历史工单',
  422. value: '2',
  423. },
  424. {
  425. label: '回访记录',
  426. value: '3',
  427. },
  428. {
  429. label: '甄别记录',
  430. value: '4',
  431. },
  432. {
  433. label: '市民画像',
  434. value: '5',
  435. },
  436. ],
  437. collapseArr: ['1', '2','3'], //展开列表
  438. loading: false,
  439. supplements: [], // 补充内容
  440. workflow: {}, // 工单流程内容
  441. orderId: '', //工单id
  442. });
  443. const showMaskNumber = ref<boolean>(true); // 是否展示号码
  444. const ruleFormRef = ref<RefType>(); // 表单ref
  445. const router = useRouter(); // 路由
  446. // 查看工单详情
  447. const getOrderDetail = async (id: string) => {
  448. state.loading = true;
  449. try {
  450. const res: any = await orderDetail(id);
  451. state.ruleForm = res.result;
  452. state.workflow = state.ruleForm?.workflow ?? {};
  453. state.supplements = res.result?.workflow?.supplements ?? [];
  454. state.loading = false;
  455. state.dialogVisible = true;
  456. } catch (error) {
  457. state.loading = false;
  458. state.dialogVisible = false;
  459. }
  460. };
  461. // 查询延期记录
  462. const getDelayList = async (id: string) => {
  463. state.loading = true;
  464. try {
  465. state.dialogVisible = true;
  466. } catch (error) {
  467. state.loading = false;
  468. state.dialogVisible = false;
  469. }
  470. };
  471. // 查询历史工单
  472. const getHistoryList = async (id: string) => {
  473. state.loading = true;
  474. try {
  475. state.dialogVisible = true;
  476. } catch (error) {
  477. state.loading = false;
  478. state.dialogVisible = false;
  479. }
  480. };
  481. // 查询回访记录
  482. const getVisitList = async (id: string) => {
  483. state.loading = true;
  484. try {
  485. state.dialogVisible = true;
  486. } catch (error) {
  487. state.loading = false;
  488. state.dialogVisible = false;
  489. }
  490. };
  491. // 查询甄别记录
  492. const getDiscernList = async (id: string) => {
  493. state.loading = true;
  494. try {
  495. state.dialogVisible = true;
  496. } catch (error) {
  497. state.loading = false;
  498. state.dialogVisible = false;
  499. }
  500. };
  501. // 查询市民画像
  502. const getPortraitList = async (id: string) => {
  503. state.loading = true;
  504. try {
  505. state.dialogVisible = true;
  506. } catch (error) {
  507. state.loading = false;
  508. state.dialogVisible = false;
  509. }
  510. };
  511. // 打开弹窗
  512. const openDialog = (val: any) => {
  513. if (!val || !val.id) {
  514. ElMessage.error('工单id不能为空');
  515. return;
  516. }
  517. state.orderId = val.id;
  518. console.log(val,'11')
  519. if(val.activeName) {
  520. state.activeName = val.activeName;//传入查询tab
  521. handleClick(val.activeName)
  522. }else{
  523. getOrderDetail(state.orderId);
  524. }
  525. };
  526. // 切换tab 查询列表
  527. const handleClick = (val: string) => {
  528. switch (val) {
  529. case '0': //工单详情
  530. getOrderDetail(state.orderId);
  531. break;
  532. case '1': // 延期记录
  533. getDelayList(state.orderId)
  534. break;
  535. case '2':// 历史工单
  536. getHistoryList(state.orderId)
  537. break;
  538. case '3': // 回访记录
  539. getVisitList(state.orderId)
  540. break;
  541. case '4':// 甄别记录
  542. getDiscernList(state.orderId)
  543. break;
  544. case '5': // 市民画像
  545. getPortraitList(state.orderId)
  546. break;
  547. default:
  548. getOrderDetail(state.orderId);
  549. break;
  550. }
  551. };
  552. // 关闭弹窗
  553. const closeDialog = () => {
  554. state.dialogVisible = false;
  555. };
  556. // 查看录音文件
  557. const recordFile = (callId:string)=>{
  558. console.log(callId)
  559. }
  560. // 电话外呼
  561. const callPhone = (number: number | string) => {
  562. VoiceInterfaceObject.DialOut(number); // 呼叫
  563. };
  564. const orderRepeatRef = ref<RefType>();
  565. // 展示重复工单列表
  566. const showRepeatInfo = () => {
  567. orderRepeatRef.value.openDialog(state.ruleForm);
  568. };
  569. // 展示扩展表单
  570. const orderExpandDetailRef = ref<RefType>(); // 扩展信息
  571. const showExpandInfo = () => {
  572. let form: any = {};
  573. if (state.ruleForm.acceptType === '30') {
  574. // 举报
  575. form = state.ruleForm.orderReport;
  576. form.orderTypeText = '12315市场监管局受理单';
  577. form.acceptTypeText = '举报';
  578. } else if (state.ruleForm.acceptType === '35') {
  579. //投诉
  580. form = state.ruleForm.orderComplain;
  581. form.orderTypeText = '12315市场监管局受理单';
  582. form.acceptTypeText = '投诉';
  583. }
  584. orderExpandDetailRef.value.openDialog(form);
  585. };
  586. // 流转记录
  587. const AuditRecordRef = ref<RefType>(); // 流转记录
  588. const onRecord = () => {
  589. const params = {
  590. dialogTitle: '流转记录',
  591. ...state.ruleForm,
  592. };
  593. AuditRecordRef.value.openDialog(params);
  594. };
  595. // 提交流程
  596. const processAuditRef = ref<RefType>(); // 处理流程
  597. const OrderCirculation = commonEnum.OrderCirculation
  598. const onSubmit = throttle((val: string,annexName:string ='办理附件',commonEnum:any=OrderCirculation) => {
  599. const params = {
  600. id: state.ruleForm.workflowId,
  601. commonEnum,
  602. processType: val,
  603. orderDetail: state.ruleForm,
  604. extra: {
  605. dialogTitle: val,
  606. inputPlaceholder: '办理意见',
  607. annexName,
  608. },
  609. };
  610. processAuditRef.value.openDialog(params);
  611. }, 300);
  612. // 流程提交成功
  613. const orderProcessSuccess = () => {
  614. closeDialog();
  615. emit('updateList');
  616. };
  617. // 补充信息
  618. const orderSupplyRef = ref<RefType>(); // 工单补充
  619. const onSupply = () => {
  620. // 穿入当前流程id
  621. orderSupplyRef.value.openDialog(state.ruleForm);
  622. };
  623. // 补充意见提交成功
  624. const onSupplySuccess = () => {
  625. handleClick(state.activeName)
  626. };
  627. // 撤销
  628. const orderRevokeRef = ref<RefType>(); // 工单撤销
  629. const onRevoke = () => {
  630. orderRevokeRef.value.openDialog(state.ruleForm);
  631. };
  632. // 撤销提交成功
  633. const onRevokeSuccess = () => {
  634. handleClick(state.activeName)
  635. };
  636. // 督办
  637. const orderSuperviseRef = ref<RefType>(); // 工单督办
  638. const onSupervise = () => {
  639. orderSuperviseRef.value.openDialog(state.ruleForm);
  640. };
  641. // 催办
  642. const orderUrgeRef = ref<RefType>(); // 工单催办
  643. const onUrge = () => {
  644. orderUrgeRef.value.openDialog(state.ruleForm);
  645. };
  646. // 督办提交成功
  647. const onSuperviseSuccess = () => {
  648. handleClick(state.activeName)
  649. };
  650. // 暴露变量
  651. defineExpose({
  652. openDialog,
  653. closeDialog,
  654. });
  655. </script>
  656. <style lang="scss" scoped>
  657. .collapse-box {
  658. :deep(.el-collapse-item__header) {
  659. background-color: var(--hotline-bg-main-color);
  660. height: 40px;
  661. border-radius: var(--el-border-radius-base);
  662. }
  663. :deep(.el-collapse-item__content) {
  664. padding-bottom: 10px !important;
  665. .el-form-item {
  666. margin-bottom: 5px;
  667. .el-form-item__content {
  668. line-height: 24px;
  669. }
  670. }
  671. }
  672. .collapse-container {
  673. padding: 10px;
  674. .plug-container {
  675. border: var(--el-border);
  676. border-radius: var(--el-border-radius-base);
  677. margin-bottom: 15px;
  678. &:last-child {
  679. margin-bottom: 0;
  680. }
  681. }
  682. }
  683. }
  684. :deep(.el-tabs__item) {
  685. font-size: var(--el-font-size-base);
  686. }
  687. </style>
  688. <style lang="scss">
  689. .order-detail-dialog {
  690. }
  691. </style>