index.vue 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344
  1. <template>
  2. <el-button
  3. class="button-select"
  4. link
  5. :type="props.order?.isRed ? 'danger' : 'primary'"
  6. @click="onOrderDetail"
  7. title="点击查看工单详情"
  8. :disabled="props.disabled"
  9. >
  10. <slot>工单详情</slot>
  11. </el-button>
  12. <el-dialog
  13. v-model="state.dialogVisible"
  14. class="order-detail-dialog"
  15. draggable
  16. ref="dialogRef"
  17. width="80%"
  18. append-to-body
  19. destroy-on-close
  20. @close="close"
  21. :close-on-click-modal="false"
  22. >
  23. <template #header>
  24. <el-tabs v-model="state.activeName" @tab-change="handleClick">
  25. <el-tab-pane
  26. :name="item.value"
  27. v-for="item in state.tabPaneList"
  28. :key="item.value"
  29. :label="item.label"
  30. :disabled="state.loading"
  31. ></el-tab-pane>
  32. </el-tabs>
  33. </template>
  34. <!-- 工单详情 -->
  35. <el-collapse v-model="state.collapseArr" v-show="state.activeName === '0'" class="collapse-box" v-loading="state.loading">
  36. <el-collapse-item name="1">
  37. <template #title>
  38. <p class="pl20">
  39. <b class="font14">来电人信息</b>
  40. </p>
  41. </template>
  42. <div class="collapse-container">
  43. <el-form label-width="100px" ref="ruleFormRef">
  44. <el-row :gutter="10">
  45. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.transferPhone">
  46. <el-form-item label="转接来源"> {{ state.ruleForm.transferPhone }} </el-form-item>
  47. </el-col>
  48. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.fromPhone">
  49. <el-form-item label="来电号码">
  50. {{ state.ruleForm.fromPhone }}
  51. <el-button
  52. plain
  53. title="查看录音文件"
  54. size="small"
  55. type="primary"
  56. class="ml8"
  57. @click="recordFile(state.ruleForm)"
  58. v-if="
  59. ['ZiGong', 'LuZhou'].includes(themeConfig.appScope)
  60. ? state.ruleForm?.recordingAbsolutePath && userInfos.isCenter
  61. : state.ruleForm?.recordingAbsolutePath
  62. "
  63. >录音文件</el-button
  64. >
  65. <el-button plain title="外呼" size="small" type="primary" class="ml8" @click="callPhone(state.ruleForm.fromPhone)" v-if="ZGCenter"
  66. >外呼</el-button
  67. >
  68. <el-checkbox-group v-model="prefixOptions" :max="1" v-if="prefixOptionsAdd && ZGCenter" class="checkbox ml5">
  69. <el-checkbox value="add">加0</el-checkbox>
  70. <el-checkbox value="remove">减0</el-checkbox>
  71. </el-checkbox-group>
  72. </el-form-item>
  73. </el-col>
  74. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  75. <el-form-item label="来电人姓名">
  76. {{ state.ruleForm.fromName }} <el-text type="danger" tag="b" v-if="state.ruleForm.isSecret" class="ml15">保密</el-text>
  77. </el-form-item>
  78. </el-col>
  79. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  80. <el-form-item label="来电人性别">
  81. {{ state.ruleForm.fromGenderText }}
  82. </el-form-item>
  83. </el-col>
  84. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.contact">
  85. <el-form-item label="联系电话">
  86. <span> {{ state.ruleForm.contact }}</span>
  87. <el-button plain title="外呼" size="small" type="primary" class="ml8" @click="callPhone(state.ruleForm.contact)" v-if="ZGCenter"
  88. >外呼</el-button
  89. >
  90. <el-checkbox-group v-model="prefixOptions" :max="1" v-if="prefixOptionsAdd && ZGCenter" class="checkbox ml5">
  91. <el-checkbox value="add">加0</el-checkbox>
  92. <el-checkbox value="remove">减0</el-checkbox>
  93. </el-checkbox-group>
  94. </el-form-item>
  95. </el-col>
  96. <el-col
  97. :xs="24"
  98. :sm="12"
  99. :md="8"
  100. :lg="6"
  101. :xl="6"
  102. v-if="['ZiGong', 'LuZhou'].includes(themeConfig.appScope) && state.ruleForm.focusOnEvents"
  103. >
  104. <el-form-item label="重点标签">
  105. <span class="color-danger" v-if="state.ruleForm.isUrgent">紧急,</span>
  106. <span class="color-danger" v-if="state.ruleForm.is24HoursComplete">24小时办结,</span>
  107. <span class="color-danger" v-if="state.ruleForm.isThreePartyConference">三方通话</span>
  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="来电主体"> {{ state.ruleForm.identityTypeText }} </el-form-item>
  112. </el-col>
  113. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.licenceType">
  114. <el-form-item label="证件类型"> {{ state.ruleForm.licenceType }} </el-form-item>
  115. </el-col>
  116. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.licenceNo">
  117. <el-form-item label="证件号码"> {{ state.ruleForm.licenceNo }} </el-form-item>
  118. </el-col>
  119. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="ZGCenter">
  120. <el-form-item label="受理短信"> {{ state.ruleForm.smsSendedText }} </el-form-item>
  121. </el-col>
  122. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm?.incidentTime">
  123. <el-form-item label="事发时间"> {{ formatDate(state.ruleForm?.incidentTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  124. </el-col>
  125. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm?.incidentPurpose">
  126. <el-form-item label="事发目的"> {{ state.ruleForm.incidentPurpose }} </el-form-item>
  127. </el-col>
  128. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.enterpriseName">
  129. <el-form-item label="企业名称"> {{ state.ruleForm.enterpriseName }} </el-form-item>
  130. </el-col>
  131. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.zhuanBanMingCheng">
  132. <el-form-item label="专班名称"> {{ state.ruleForm.zhuanBanMingCheng }} </el-form-item>
  133. </el-col>
  134. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.fullAddress">
  135. <el-form-item label="事发地址"> {{ state.ruleForm.fullAddress }} </el-form-item>
  136. </el-col>
  137. </el-row>
  138. </el-form>
  139. </div>
  140. </el-collapse-item>
  141. <el-collapse-item name="2">
  142. <template #title>
  143. <p class="pl20">
  144. <b class="font14">工单信息</b>
  145. </p>
  146. </template>
  147. <div class="collapse-container">
  148. <el-form label-width="100px" ref="ruleFormRef">
  149. <el-row :gutter="10">
  150. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  151. <el-form-item label="来源渠道"> {{ state.ruleForm.sourceChannel }} </el-form-item>
  152. </el-col>
  153. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  154. <el-form-item label="受理类型"> {{ state.ruleForm.acceptType }} </el-form-item>
  155. </el-col>
  156. <!-- 中心才能查看密码 -->
  157. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  158. <el-form-item label="工单编码">
  159. {{ state.ruleForm.no }} <span v-if="state.ruleForm.password && userInfos.isCenter"> 【{{ state.ruleForm.password }}】</span>
  160. </el-form-item>
  161. </el-col>
  162. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.provinceNo">
  163. <el-form-item label="省本地编码">
  164. <div style="word-break: break-all">{{ state.ruleForm.provinceNo }}</div>
  165. </el-form-item>
  166. </el-col>
  167. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.receiveProvinceNo">
  168. <el-form-item label="省编码">
  169. <div style="word-break: break-all">{{ state.ruleForm.receiveProvinceNo }}</div>
  170. </el-form-item>
  171. </el-col>
  172. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm?.orderExtension?.orderTypeCode">
  173. <el-form-item label="工单类型">
  174. {{ state.ruleForm.orderExtension?.orderType }}
  175. <el-button link type="primary" class="ml10" @click="showExpandInfo"><SvgIcon name="ele-Document" class="mr2" /> 拓展信息</el-button>
  176. </el-form-item>
  177. </el-col>
  178. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  179. <el-form-item label="是否重复">
  180. {{
  181. state.ruleForm.duplicateIds && state.ruleForm.duplicateIds.length > 0 ? '是(' + state.ruleForm.duplicateIds.length + '次)' : '否'
  182. }}
  183. <el-button
  184. plain
  185. title="查看重复工单"
  186. size="small"
  187. type="primary"
  188. class="ml8"
  189. @click="showRepeatInfo"
  190. v-if="state.ruleForm.duplicateIds && state.ruleForm.duplicateIds.length > 0"
  191. >查看重复工单</el-button
  192. >
  193. </el-form-item>
  194. </el-col>
  195. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  196. <el-form-item label="热点分类"> {{ state.ruleForm.hotspotSpliceName }} </el-form-item>
  197. </el-col>
  198. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="ZGCenter">
  199. <el-form-item label="受理人">
  200. <span>{{ state.ruleForm?.acceptorName }}</span>
  201. </el-form-item>
  202. </el-col>
  203. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.creationTime">
  204. <el-form-item label="受理时间"> {{ formatDate(state.ruleForm?.creationTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  205. </el-col>
  206. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.pushType">
  207. <el-form-item label="推送分类"> {{ state.ruleForm.pushType }} </el-form-item>
  208. </el-col>
  209. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="['ZiGong', 'LuZhou'].includes(themeConfig.appScope) && state.ruleForm.orderTag">
  210. <el-form-item label="工单标签"> {{ state.ruleForm.orderTag }} </el-form-item>
  211. </el-col>
  212. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="['ZiGong', 'LuZhou'].includes(themeConfig.appScope) && state.ruleForm.company">
  213. <el-form-item label="工作单位"> {{ state.ruleForm.company }} </el-form-item>
  214. </el-col>
  215. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="['ZiGong'].includes(themeConfig.appScope) && state.ruleForm.industryName">
  216. <el-form-item label="行业类型"> {{ state.ruleForm.industryName }} </el-form-item>
  217. </el-col>
  218. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="['YiBin'].includes(themeConfig.appScope) && state.ruleForm.focusOnEventsName">
  219. <el-form-item label="重点关注事件"> {{ state.ruleForm.focusOnEventsName }} </el-form-item>
  220. </el-col>
  221. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  222. <el-form-item label="工单标题">
  223. {{ state.ruleForm.title }} <el-tag class="ml10" v-if="state.ruleForm?.workflowId">{{ state.ruleForm.statusText }}</el-tag>
  224. </el-form-item>
  225. </el-col>
  226. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  227. <el-form-item label="受理内容">
  228. <div v-html="showKeyWord(state.ruleForm.content, state.ruleForm.sensitive)" class="formatted-text"></div>
  229. </el-form-item>
  230. </el-col>
  231. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  232. <el-form-item label="附件">
  233. <annex-list name="附件列表" readonly :businessId="state.ruleForm.id" classify="查看附件" v-model="state.ruleForm.files" />
  234. </el-form-item>
  235. </el-col>
  236. <template v-if="state.ruleForm.knowledgeQuote && state.ruleForm.knowledgeQuote.length">
  237. <el-col v-for="item in state.ruleForm.knowledgeQuote" :key="item.id">
  238. <el-form-item label="引用知识">
  239. <el-button link type="primary" @click="showKnowledge(item)">{{ item.value }}</el-button>
  240. </el-form-item>
  241. </el-col>
  242. </template>
  243. </el-row>
  244. </el-form>
  245. </div>
  246. </el-collapse-item>
  247. <el-collapse-item name="3">
  248. <template #title>
  249. <p class="pl20">
  250. <b class="font14">结果信息</b>
  251. </p>
  252. </template>
  253. <div class="collapse-container">
  254. <el-form label-width="100px" ref="ruleFormRef" class="show-info-form">
  255. <el-row :gutter="10">
  256. <el-col :xs="24" :sm="24" :md="8" :lg="6" :xl="6">
  257. <el-form-item label="交办部门"> 热线中心 </el-form-item>
  258. </el-col>
  259. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.centerToOrgTime">
  260. <el-form-item label="交办时间"> {{ formatDate(state.ruleForm.centerToOrgTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  261. </el-col>
  262. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.actualHandleOrgName">
  263. <el-form-item label="接办部门"> {{ state.ruleForm.actualHandleOrgName }}</el-form-item>
  264. </el-col>
  265. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.actualHandleTime">
  266. <el-form-item label="接办时间"> {{ formatDate(state.ruleForm.actualHandleTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  267. </el-col>
  268. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.timeLimit">
  269. <el-form-item label="工单办理期限">
  270. {{ state.ruleForm.timeLimit }}
  271. <el-text
  272. tag="b"
  273. type="danger"
  274. class="ml10"
  275. v-if="['ZiGong', 'LuZhou'].includes(themeConfig.appScope) && state.ruleForm.is24HoursComplete"
  276. >24小时办结</el-text
  277. ></el-form-item
  278. >
  279. </el-col>
  280. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.filedTime">
  281. <el-form-item label="办结时间">
  282. {{ formatDate(state.ruleForm.filedTime, 'YYYY-mm-dd HH:MM:SS') }}
  283. </el-form-item>
  284. </el-col>
  285. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.expiredTime">
  286. <el-form-item label="期满时间">
  287. {{ formatDate(state.ruleForm.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
  288. </el-form-item>
  289. </el-col>
  290. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.orderTerminateStatus">
  291. <el-form-item label="终止状态">
  292. <span class="color-danger">{{ state.ruleForm.orderTerminateStatus }}</span>
  293. </el-form-item>
  294. </el-col>
  295. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm?.delayString">
  296. <el-form-item label="信件延期">
  297. <span class="color-danger">{{ state.ruleForm?.delayString }}</span></el-form-item
  298. >
  299. </el-col>
  300. <!-- 只有中心能看到省期满时间 -->
  301. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.expiredTimeProvince && userInfos.isCenter">
  302. <el-form-item label="省期满时间">
  303. {{ formatDate(state.ruleForm.expiredTimeProvince, 'YYYY-mm-dd HH:MM:SS') }}
  304. </el-form-item>
  305. </el-col>
  306. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.publishState !== null">
  307. <el-form-item label="是否公开"> {{ state.ruleForm.publishState ? '公开' : '不公开' }} </el-form-item>
  308. </el-col>
  309. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="['YiBin'].includes(themeConfig.appScope)">
  310. <el-form-item label="部门处理结果" class="formatted-text"> {{ state.ruleForm.isResolvedText }} </el-form-item>
  311. </el-col>
  312. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.centerOpinion">
  313. <el-form-item label="中心意见" class="formatted-text"> {{ state.ruleForm.centerOpinion }} </el-form-item>
  314. </el-col>
  315. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.fileOpinion">
  316. <el-form-item label="承办意见" class="formatted-text"> {{ state.ruleForm.fileOpinion }} </el-form-item>
  317. </el-col>
  318. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.provinceSendBackString">
  319. <el-form-item label="省件退回" class="formatted-text color-danger"> {{ state.ruleForm.provinceSendBackString }} </el-form-item>
  320. </el-col>
  321. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.provinceRevokeString">
  322. <el-form-item label="省件撤单" class="formatted-text color-danger"> {{ state.ruleForm.provinceRevokeString }} </el-form-item>
  323. </el-col>
  324. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.provinceReTransactNum >= 1">
  325. <el-form-item label="省件重办" class="formatted-text color-danger"> {{ state.ruleForm.caseProcessTypeText }} </el-form-item>
  326. </el-col>
  327. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.provinceScreenString">
  328. <el-form-item label="省件甄别" class="formatted-text color-danger"> {{ state.ruleForm.provinceScreenString }} </el-form-item>
  329. </el-col>
  330. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.provinceDelayString">
  331. <el-form-item label="省件延期" class="formatted-text color-danger"> {{ state.ruleForm.provinceDelayString }} </el-form-item>
  332. </el-col>
  333. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.sendBackOpinion">
  334. <el-form-item label="退回意见" class="formatted-text"> {{ state.ruleForm.sendBackOpinion }} </el-form-item>
  335. </el-col>
  336. <el-col
  337. :xs="24"
  338. :sm="24"
  339. :md="24"
  340. :lg="24"
  341. :xl="24"
  342. v-if="state.ruleForm.isReTransact && ['ZiGong', 'LuZhou'].includes(themeConfig.appScope)"
  343. >
  344. <el-form-item label="市件重办"> <span class="color-danger">不满意重办:经12345回访,要求该工单进行重办</span></el-form-item>
  345. </el-col>
  346. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.sendBackRefuseOpinion">
  347. <el-form-item label="退回不通过原因" label-width="120px" class="formatted-text">
  348. {{ state.ruleForm.sendBackRefuseOpinion }}
  349. </el-form-item>
  350. </el-col>
  351. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.sendBackAuditTime">
  352. <el-form-item label="退回审批时间" label-width="120px">
  353. {{ formatDate(state.ruleForm.sendBackAuditTime, 'YYYY-mm-dd HH:MM:SS') }}
  354. </el-form-item>
  355. </el-col>
  356. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.orderRemarks?.length">
  357. <el-form-item label="备注信息">
  358. <el-row v-for="(item, index) in state.ruleForm.orderRemarks" class="w100 mb10" :key="index">
  359. <el-col class="formatted-text">备注信息:{{ item.remark }} </el-col>
  360. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">备注人:{{ item.remarkUser }} </el-col>
  361. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">备注日期:{{ formatDate(item.remarkTime, 'YYYY-mm-dd HH:MM:SS') }}</el-col>
  362. </el-row>
  363. </el-form-item>
  364. </el-col>
  365. <el-col
  366. :xs="24"
  367. :sm="24"
  368. :md="24"
  369. :lg="24"
  370. :xl="24"
  371. v-if="state.ruleForm.isStepUrgent || state.ruleForm.isEvasiveTxt || state.ruleForm.isInactivelyTxt"
  372. >
  373. <el-form-item label="派单员勾选">
  374. <span class="color-danger mr5" v-if="state.ruleForm.isStepUrgent">紧急</span>
  375. <span class="color-danger mr5" v-if="state.ruleForm.isEvasiveTxt">{{ state.ruleForm.isEvasiveTxt }}</span>
  376. <span class="color-danger mr5" v-if="state.ruleForm.isInactivelyTxt">{{ state.ruleForm.isInactivelyTxt }}</span>
  377. </el-form-item>
  378. </el-col>
  379. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="state.ruleForm.realCommunicationTime">
  380. <el-form-item label="办件勾选">
  381. <el-row class="w100 mb10">
  382. <el-col>
  383. {{ state.ruleForm.realIsContacted ? '已与市民电话联系' : '' }}
  384. {{ state.ruleForm.realContactLocale ? '已赴现场处置' : '' }} {{ state.ruleForm.isOther ? '其他' : '' }}
  385. </el-col>
  386. <el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">经办人姓名:{{ state.ruleForm.realHandlerName }} </el-col>
  387. <el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">经办人电话:{{ state.ruleForm.realHandlerPhone }} </el-col>
  388. <el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8"
  389. >沟通时间:{{ formatDate(state.ruleForm.realCommunicationTime, 'YYYY-mm-dd HH:MM:SS') }}
  390. </el-col>
  391. <el-col>其他原因:{{ state.ruleForm.otherRemark }}</el-col>
  392. <el-col>沟通地点:{{ state.ruleForm.realCommunicationAddress }}</el-col>
  393. </el-row>
  394. </el-form-item>
  395. </el-col>
  396. </el-row>
  397. </el-form>
  398. </div>
  399. </el-collapse-item>
  400. <el-collapse-item name="4" v-if="state.orderComplements && state.orderComplements.length">
  401. <template #title>
  402. <p class="pl20">
  403. <b class="font14">补充信息</b>
  404. </p>
  405. </template>
  406. <div class="collapse-container">
  407. <div v-for="i in state.orderComplements" :key="i" class="plug-container">
  408. <el-form label-width="100px" ref="ruleFormRef">
  409. <el-row :gutter="10">
  410. <!-- <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  411. <el-form-item label="补充部门">
  412. {{ i.creator.organization }}
  413. </el-form-item>
  414. </el-col>
  415. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  416. <el-form-item label="补充时间"> {{ formatDate(i.creationTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
  417. </el-col>
  418. <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
  419. <el-form-item label="补充人">
  420. {{ i.creator.name }} <span v-if="i.creator.staffNo">[{{ i.creator.staffNo }} ]</span></el-form-item
  421. >
  422. </el-col>-->
  423. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  424. <el-form-item label="补充内容" class="formatted-text">
  425. <el-text type="danger">{{ i.opinion }}</el-text>
  426. </el-form-item>
  427. </el-col>
  428. </el-row>
  429. </el-form>
  430. </div>
  431. </div>
  432. </el-collapse-item>
  433. </el-collapse>
  434. <!-- 历史工单 -->
  435. <div v-show="state.activeName === '1'">
  436. <history-order :ruleForm="state.ruleForm" :orderId="state.orderId" ref="historyOrderRef" />
  437. </div>
  438. <!-- 回访详情 -->
  439. <div v-show="state.activeName === '2'">
  440. <el-form
  441. label-width="120px"
  442. label-position="left"
  443. v-if="state.ruleForm.orderVisits && state.ruleForm.orderVisits.length"
  444. class="show-info-form"
  445. >
  446. <el-row :gutter="10">
  447. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  448. <el-form-item label="回访状态">
  449. {{ state.ruleForm?.orderVisits[state.ruleForm?.orderVisits.length - 1]?.visitStateText }}
  450. </el-form-item>
  451. </el-col>
  452. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  453. <el-form-item label="回访方式">
  454. {{ state.ruleForm?.orderVisits[state.ruleForm?.orderVisits.length - 1]?.visitTypeText }}
  455. <el-button
  456. plain
  457. title="人工回访录音"
  458. size="small"
  459. type="primary"
  460. class="ml8"
  461. @click="onVisitRecord(state.ruleForm?.orderVisits[state.ruleForm?.orderVisits.length - 1])"
  462. v-if="
  463. ['ZiGong', 'LuZhou', 'YiBin'].includes(themeConfig.appScope)
  464. ? state.ruleForm?.orderVisits[state.ruleForm?.orderVisits.length - 1]?.recordingAbsolutePath && userInfos.isCenter
  465. : state.ruleForm?.orderVisits[state.ruleForm?.orderVisits.length - 1]?.recordingAbsolutePath
  466. "
  467. >人工回访录音</el-button
  468. >
  469. </el-form-item>
  470. </el-col>
  471. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  472. <el-form-item label="当前回访人">
  473. {{ state.ruleForm?.orderVisits[state.ruleForm?.orderVisits.length - 1]?.employeeName }}
  474. </el-form-item>
  475. </el-col>
  476. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  477. <el-form-item label="回访任务创建时间" label-width="130px">
  478. {{ formatDate(state.ruleForm?.orderVisits[state.ruleForm?.orderVisits.length - 1]?.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
  479. </el-form-item>
  480. </el-col>
  481. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  482. <el-form-item label="回访时间">
  483. {{ formatDate(state.ruleForm?.orderVisits[state.ruleForm?.orderVisits.length - 1]?.visitTime, 'YYYY-mm-dd HH:MM:SS') }}
  484. </el-form-item>
  485. </el-col>
  486. <!-- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  487. <el-form-item label="回访标签">
  488. <span v-if="state.ruleForm?.orderVisits[0]?.isPutThrough !== null">{{
  489. state.ruleForm?.orderVisits[state.ruleForm?.orderVisits.length - 1]?.isPutThrough ? '已接通' : '未接通'
  490. }}</span>
  491. </el-form-item>
  492. </el-col>-->
  493. </el-row>
  494. <el-row v-for="item in state.ruleForm?.orderVisits[state.ruleForm?.orderVisits.length - 1]?.orderVisitDetails" :key="item.id" :gutter="10">
  495. <!-- 务员评价 -->
  496. <template v-if="item.visitTarget === 10 && isTelSource">
  497. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  498. <el-divider content-position="left">
  499. <el-text tag="b" size="large" type="primary"> 话务员回访 </el-text>
  500. </el-divider>
  501. </el-col>
  502. <el-col :xs="12" :sm="12" :md="12" :lg="12" :xl="12">
  503. <el-form-item label="语音评价">
  504. {{ item.voiceEvaluateText }}
  505. </el-form-item>
  506. </el-col>
  507. <el-col :xs="12" :sm="12" :md="12" :lg="12" :xl="12">
  508. <el-form-item label="话务员评价">
  509. {{ item.seatEvaluateText }}
  510. </el-form-item>
  511. </el-col>
  512. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  513. <el-form-item label="话务员回访内容">
  514. {{ item.visitContent }}
  515. </el-form-item>
  516. </el-col>
  517. </template>
  518. <!-- 部门评价 -->
  519. <template v-if="item.visitTarget === 20">
  520. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  521. <el-divider content-position="left">
  522. <el-text tag="b" size="large" type="primary"> {{ item.visitOrgName }} </el-text>
  523. </el-divider>
  524. </el-col>
  525. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  526. <el-form-item label="部门办件结果">
  527. {{ item.orgProcessingResults?.value }}
  528. </el-form-item>
  529. </el-col>
  530. <!-- 不满意原因有值才展示不满意原因 -->
  531. <el-col
  532. :xs="24"
  533. :sm="24"
  534. :md="24"
  535. :lg="12"
  536. :xl="12"
  537. v-if="item.orgNoSatisfiedReason && item.orgNoSatisfiedReason?.length && item.orgProcessingResults?.value === '不满意'"
  538. >
  539. <el-form-item label="不满意原因">
  540. {{ item.orgNoSatisfiedReason?.map((item) => item.value).join(',') }}
  541. </el-form-item>
  542. </el-col>
  543. <!-- <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  544. <el-form-item label="部门办件态度">
  545. {{ item.orgHandledAttitude?.value }}
  546. </el-form-item>
  547. </el-col>-->
  548. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  549. <el-form-item label="部门回访内容" class="formatted-text">
  550. {{ item.visitContent }}
  551. </el-form-item>
  552. </el-col>
  553. </template>
  554. </el-row>
  555. </el-form>
  556. <el-empty v-else />
  557. </div>
  558. <!-- 市民画像 -->
  559. <div v-show="state.activeName === '3'" class="flex-center-center">
  560. <div style="max-width: 800px">
  561. <citizen-portrait :orderInfo="state.ruleForm" ref="citizenPortraitRef" :editable="false" />
  562. </div>
  563. </div>
  564. <!-- 副本工单 -->
  565. <div v-show="state.activeName === '4'">
  566. <copy-order ref="copyOrderRef" :orderId="state.orderId" />
  567. </div>
  568. <!-- 地图信息 -->
  569. <div v-if="state.activeName === '5'">
  570. <map-view ref="mapViewRef" />
  571. </div>
  572. <template #footer>
  573. <span class="dialog-footer">
  574. <el-text
  575. v-if="['ZiGong', 'LuZhou'].includes(themeConfig.appScope) && state.ruleForm?.sendBackAuditEndTime"
  576. type="danger"
  577. tag="b"
  578. class="mr20"
  579. >
  580. 退回截止时间:{{ formatDate(state.ruleForm?.sendBackAuditEndTime, 'YYYY-mm-dd HH:MM:SS') }}
  581. </el-text>
  582. <el-button type="primary" @click="onMarketDetail" :loading="state.loading" v-if="state.ruleForm.orderExtension?.orderType"
  583. >市场明细</el-button
  584. >
  585. <el-button type="primary" @click="onJbExport" :loading="state.loading" v-if="state.ruleForm.id">导出交办单</el-button>
  586. <!-- 单会签中+未到汇总节点 canEndCountersign 为true表示当前工单正在会签中,可以结束会签-->
  587. <el-button
  588. type="primary"
  589. @click="onCloseCountersignature"
  590. :loading="state.loading"
  591. v-auth="'business:order:closeCountersignature'"
  592. v-if="state.ruleForm?.countersignId && state.ruleForm.status !== 9"
  593. >结束会签</el-button
  594. >
  595. <!-- 有流程信息就可以查询明细 -->
  596. <el-button type="primary" @click="onRecord" :loading="state.loading" v-if="state.ruleForm?.workflowId">流程明细(旧)</el-button>
  597. <el-button type="primary" @click="onRecordNew" :loading="state.loading" v-if="state.ruleForm?.workflowId">流程明细(新)</el-button>
  598. <!-- 有流程信息就可以撤回 -->
  599. <el-button
  600. type="primary"
  601. @click="onSpecialHandle"
  602. :loading="state.loading"
  603. v-if="state.ruleForm?.workflowId && state.ruleForm.status !== 9"
  604. v-auth="'business:order:teti'"
  605. >特 提</el-button
  606. >
  607. <!-- 100-200 表示工单正在办理中,可以督办 -->
  608. <el-button
  609. type="primary"
  610. @click="onSupervise"
  611. :loading="state.loading"
  612. v-if="isInRange(state.ruleForm?.status, 100, 200) && state.ruleForm.status !== 9"
  613. v-auth="'business:order:supervise:apply'"
  614. >督 办</el-button
  615. >
  616. <!-- 100-200 表示工单正在办理中,可以催办 -->
  617. <el-button
  618. type="primary"
  619. @click="onUrge"
  620. :loading="state.loading"
  621. v-if="isInRange(state.ruleForm?.status, 100, 200) && state.ruleForm.status !== 9"
  622. v-auth="'business:order:urge:apply'"
  623. >
  624. 催 办</el-button
  625. >
  626. <!-- 100-200 表示工单正在办理中,可以延期申请 -->
  627. <!-- isCanDelay 为true表示可以发起延期申请并且可以办理工单(当前工单没有发起或者正在延期流程中)-->
  628. <el-button
  629. type="primary"
  630. @click="onDelayApply"
  631. :loading="state.loading"
  632. v-if="isInRange(state.ruleForm?.status, 100, 200) && state.ruleForm?.isCanDelay && state.ruleForm.status !== 9"
  633. v-auth="'business:order:delay'"
  634. >延 期</el-button
  635. >
  636. <!-- 只有发起了延期流程的可以取消延期 -->
  637. <!-- isCanDelay 为false表示可以发起取消延期申请(当前工单已在延期流程中)-->
  638. <el-button
  639. type="primary"
  640. @click="onCancelDelay"
  641. :loading="state.loading"
  642. v-auth="'business:order:cancelDelay'"
  643. v-if="state.ruleForm?.isCanCancelDelay && state.ruleForm.status !== 9"
  644. >取消延期</el-button
  645. >
  646. <!-- 100-200 表示工单正在办理中 并且应该自己办理 -->
  647. <el-button
  648. type="primary"
  649. @click="onSubmit('工单办理')"
  650. :loading="state.loading"
  651. v-if="isInRange(state.ruleForm?.status, 100, 200) && state.ruleForm?.canHandle && state.ruleForm.status !== 9"
  652. v-auth="'business:order:handle'"
  653. >办 理</el-button
  654. >
  655. <!-- 代办可用 canInsteadHandle -->
  656. <el-button
  657. type="primary"
  658. @click="onSubmit('工单代办')"
  659. :loading="state.loading"
  660. v-if="state.ruleForm?.canInsteadHandle && state.ruleForm.status !== 9"
  661. v-auth="'business:order:handle:instead'"
  662. >代 办</el-button
  663. >
  664. <!-- 流程结束之后不展示补充按钮 -->
  665. <!-- <el-button type="primary" @click="onSupply" :loading="state.loading" v-if="[0].includes(state.workflow.status)"
  666. >补 充</el-button
  667. >-->
  668. <!-- 100-200 表示工单正在办理中 并且应该自己办理 -->
  669. <!-- @click="onSubmit('工单退回', '退回附件', '退回附件', '退回意见')"-->
  670. <el-button
  671. type="primary"
  672. @click="onReturn"
  673. :loading="state.loading"
  674. v-if="
  675. isInRange(state.ruleForm?.status, 100, 200) && state.ruleForm?.canHandle && state.ruleForm?.canPrevious && state.ruleForm.status !== 9
  676. "
  677. v-auth="'business:order:return'"
  678. >退 回</el-button
  679. >
  680. </span>
  681. </template>
  682. </el-dialog>
  683. <!-- 扩展信息 -->
  684. <order-expand-detail ref="orderExpandDetailRef" />
  685. <!-- 流转记录 -->
  686. <audit-record ref="auditRecordRef">
  687. <template #header>
  688. <el-form label-width="90px" ref="ruleFormRef">
  689. <el-row :gutter="35">
  690. <el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
  691. <el-form-item label="工单编码"> {{ state.ruleForm.no }} </el-form-item>
  692. </el-col>
  693. <el-col :xs="24" :sm="16" :md="16" :lg="16" :xl="16">
  694. <el-form-item label="工单标题"> {{ state.ruleForm.title }} </el-form-item>
  695. </el-col>
  696. </el-row>
  697. </el-form>
  698. </template>
  699. </audit-record>
  700. <!-- 工单补充 -->
  701. <order-supply ref="orderSupplyRef" @onSupplySuccess="onSupplySuccess" />
  702. <!-- 工单督办 -->
  703. <order-supervise ref="orderSuperviseRef" @updateList="onSuperviseSuccess" />
  704. <!-- 工单催办 -->
  705. <order-urge ref="orderUrgeRef" @updateList="onSuperviseSuccess" />
  706. <!-- 流程审批 -->
  707. <process-audit ref="processAuditRef" @orderProcessSuccess="orderProcessSuccess" />
  708. <!-- 重复工单 -->
  709. <order-repeat ref="orderRepeatRef" />
  710. <!-- 特提 -->
  711. <special-handle-order ref="specialHandleOrderRef" @updateList="onSpecialHandleSuccess" />
  712. <!-- 播放录音 -->
  713. <play-record ref="playRecordRef" />
  714. <!-- 自贡流程办理 -->
  715. <z-g-process ref="zgProcessRef" @orderProcessSuccess="orderProcessSuccess" />
  716. <!-- 泸州流程办理 -->
  717. <l-z-process ref="lzProcessRef" @orderProcessSuccess="orderProcessSuccess" />
  718. <!-- 市场明细 -->
  719. <market-detail ref="marketDetailRef" />
  720. <!-- 延期申请 -->
  721. <delay-apply ref="delayApplyRef" @orderProcessSuccess="orderProcessSuccess" />
  722. <!-- 工单退回 -->
  723. <order-return ref="orderReturnRef" @updateList="orderProcessSuccess" />
  724. <!-- 流程明细 -->
  725. <process-detail ref="processDetailRef">
  726. <template #header>
  727. <el-form label-width="90px" ref="ruleFormRef">
  728. <el-row :gutter="35">
  729. <el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
  730. <el-form-item label="工单编码"> {{ state.ruleForm.no }} </el-form-item>
  731. </el-col>
  732. <el-col :xs="24" :sm="16" :md="16" :lg="16" :xl="16">
  733. <el-form-item label="工单标题"> {{ state.ruleForm.title }} </el-form-item>
  734. </el-col>
  735. </el-row>
  736. </el-form>
  737. </template>
  738. </process-detail>
  739. <!-- 自贡随手拍办理 -->
  740. <z-g-s-s-p-process ref="zgSspProcessRef" @orderProcessSuccess="orderProcessSuccess" />
  741. <!-- 宜宾工单办理 -->
  742. <y-b-process ref="ybProcessRef" />
  743. </template>
  744. <script setup lang="ts" name="orderDetail">
  745. import { computed, defineAsyncComponent, PropType, reactive, ref } from 'vue';
  746. import { downloadZip, isInRange, transformFile } from '@/utils/tools';
  747. import { cancelDelay, endCounterSign, exportJbOrder, orderDetail } from '@/api/business/order';
  748. import { ElMessage, ElMessageBox } from 'element-plus';
  749. import { formatDate } from '@/utils/formatTime';
  750. import { callCenterOutbound } from '@/utils/callCenter';
  751. import { useUserInfo } from '@/stores/userInfo';
  752. import { storeToRefs } from 'pinia';
  753. import { useThemeConfig } from '@/stores/themeConfig';
  754. import { useRouter } from 'vue-router';
  755. // 引入组件
  756. const OrderExpandDetail = defineAsyncComponent(() => import('@/views/business/order/components/Order-expand-detail.vue')); // 扩展信息
  757. const OrderSupply = defineAsyncComponent(() => import('@/views/business/order/components/Order-supply.vue')); // 工单补充
  758. const OrderSupervise = defineAsyncComponent(() => import('@/views/business/supervise/components/Order-supervise.vue')); // 工单督办
  759. const OrderUrge = defineAsyncComponent(() => import('@/views/business/urge/components/Order-urge.vue')); // 工单催办
  760. const OrderRepeat = defineAsyncComponent(() => import('@/views/business/order/components/Order-repeat.vue')); // 重复工单
  761. const AuditRecord = defineAsyncComponent(() => import('@/components/AuditRecord/index.vue')); // 流程明细
  762. const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
  763. const ProcessAudit = defineAsyncComponent(() => import('@/components/ProcessAudit/index.vue')); // 流程审批
  764. const HistoryOrder = defineAsyncComponent(() => import('@/components/OrderDetail/History.vue')); // 历史工单
  765. const CitizenPortrait = defineAsyncComponent(() => import('@/views/todo/seats/accept/Citizen-portrait.vue')); // 市民画像
  766. const SpecialHandleOrder = defineAsyncComponent(() => import('@/views/business/special/components/Special-apply-order.vue')); // 特提申请
  767. const PlayRecord = defineAsyncComponent(() => import('@/components/PlayRecord/index.vue')); // 播放录音
  768. const CopyOrder = defineAsyncComponent(() => import('@/views/todo/seats/accept/Copy.vue')); // 副本工单
  769. const ZGProcess = defineAsyncComponent(() => import('@/components/ProcessAudit/ZGProcess.vue')); // 自贡流程
  770. const LZProcess = defineAsyncComponent(() => import('@/components/ProcessAudit/LZProcess.vue')); // 泸州流程
  771. const OrderReturn = defineAsyncComponent(() => import('@/views/business/order/components/Order-return.vue')); // 工单退回
  772. const MarketDetail = defineAsyncComponent(() => import('@/views/business/order/components/Market-detail.vue')); // 市场明细
  773. const DelayApply = defineAsyncComponent(() => import('@/views/business/delay/components/Delay-apply.vue')); // 延期申请
  774. const ProcessDetail = defineAsyncComponent(() => import('@/components/ProcessDetail/index.vue')); // 流程明细
  775. const MapView = defineAsyncComponent(() => import('@/components/OrderDetail/Map-view.vue')); // 地图标点
  776. const ZGSSPProcess = defineAsyncComponent(() => import('@/components/ProcessAudit/ZGSSPProcess.vue')); // 自贡随手拍办理流程
  777. const YBProcess = defineAsyncComponent(() => import('@/components/ProcessAudit/YBProcess.vue')); // 宜宾工单办理流程
  778. type ButtonType = '' | 'default' | 'success' | 'warning' | 'info' | 'text' | 'primary' | 'danger';
  779. const props = defineProps({
  780. order: {
  781. // 工单详情
  782. type: [Object, null] as PropType<Object | null>,
  783. default: {},
  784. required: true,
  785. },
  786. type: {
  787. type: String as PropType<ButtonType>,
  788. default: 'primary',
  789. },
  790. source: {
  791. // 来源(根据来源判断 有特殊逻辑处理)
  792. type: String,
  793. default: '',
  794. },
  795. disabled: {
  796. type: Boolean,
  797. default: false,
  798. },
  799. });
  800. const storesUserInfo = useUserInfo();
  801. const storesThemeConfig = useThemeConfig();
  802. const { themeConfig } = storeToRefs(storesThemeConfig);
  803. const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
  804. // 定义子组件向父组件传值/事件
  805. const emit = defineEmits(['updateList']);
  806. // 定义变量内容
  807. const state = reactive<any>({
  808. dialogVisible: false, // 弹窗显示隐藏
  809. ruleForm: {
  810. // 表单数据
  811. },
  812. activeName: '0', // tab切换
  813. tabPaneList: [
  814. // tab列表
  815. {
  816. label: '工单详情',
  817. value: '0',
  818. },
  819. {
  820. label: '历史工单',
  821. value: '1',
  822. },
  823. {
  824. label: '回访详情',
  825. value: '2',
  826. },
  827. {
  828. label: '市民画像',
  829. value: '3',
  830. },
  831. {
  832. label: '副本工单',
  833. value: '4',
  834. },
  835. ],
  836. collapseArr: ['1', '2', '3', '4'], //展开列表
  837. loading: false,
  838. orderComplements: [], // 补充内容
  839. workflow: {}, // 工单流程内容
  840. orderId: '', //工单id
  841. });
  842. const ruleFormRef = ref<RefType>(); // 表单ref
  843. // 高亮关键词
  844. const showKeyWord = (val: string[], keywordArr: string[]) => {
  845. let str: any = val;
  846. if (keywordArr && keywordArr.length) {
  847. // 2.定制关键词对应正则
  848. keywordArr.forEach((e) => {
  849. let regStr = '' + `(${e})`;
  850. let reg = new RegExp(regStr, 'g');
  851. // 3.正则替换,关键词飘红
  852. str = str.replace(reg, '<span class="color-danger font-bold"">' + e + '</span>');
  853. });
  854. }
  855. return str;
  856. };
  857. // 自贡中心才能看 宜宾所有都可以
  858. const ZGCenter = computed(() => {
  859. if (['ZiGong', 'LuZhou'].includes(themeConfig.value.appScope) && userInfos.value.isCenter) {
  860. return true;
  861. } else return themeConfig.value.appScope === 'YiBin';
  862. });
  863. // 加0减0
  864. const prefixOptionsAdd = computed(() => {
  865. return ['ZiGong', 'LuZhou'].includes(themeConfig.value.appScope);
  866. });
  867. // 查看工单详情
  868. const getOrderDetail = async (id: string) => {
  869. state.loading = true;
  870. try {
  871. const { result } = await orderDetail(id);
  872. state.ruleForm = result;
  873. state.ruleForm.files = transformFile(state.ruleForm.files);
  874. state.workflow = state.ruleForm?.workflow ?? {};
  875. state.orderComplements = result?.orderComplements ?? [];
  876. state.loading = false;
  877. } catch (error: any) {
  878. state.loading = false;
  879. state.dialogVisible = false;
  880. }
  881. };
  882. // 查询历史工单
  883. const historyOrderRef = ref<RefType>(); // 历史工单
  884. const getHistoryList = async () => {
  885. state.loading = true;
  886. try {
  887. historyOrderRef.value.searchHistory();
  888. state.dialogVisible = true;
  889. state.loading = false;
  890. } catch (error) {
  891. state.loading = false;
  892. state.dialogVisible = false;
  893. }
  894. };
  895. // 查询市民画像
  896. const citizenPortraitRef = ref<RefType>(); // 市民画像
  897. const getPortraitList = async () => {
  898. state.loading = true;
  899. try {
  900. citizenPortraitRef.value?.getCitizen(state.ruleForm);
  901. state.dialogVisible = true;
  902. state.loading = false;
  903. } catch (error) {
  904. console.log(error, '2');
  905. state.loading = false;
  906. state.dialogVisible = false;
  907. }
  908. };
  909. // 查询地图信息
  910. const mapViewRef = ref<RefType>();
  911. const getMapInfo = async () => {
  912. state.loading = true;
  913. try {
  914. mapViewRef.value.addMarker(state.ruleForm);
  915. state.loading = false;
  916. } catch (error) {
  917. console.log(error);
  918. state.loading = false;
  919. state.dialogVisible = false;
  920. }
  921. };
  922. // 打开弹窗
  923. const openDialog = (val: any) => {
  924. if (!val || !val.id) {
  925. ElMessage.error('工单id不能为空');
  926. return;
  927. }
  928. state.dialogVisible = true;
  929. state.orderId = val.id;
  930. if(['LuZhou','ZiGong'].includes(themeConfig.value.appScope)){
  931. if(userInfos.value.isCenter){// 中心
  932. state.tabPaneList = [
  933. {
  934. label: '工单详情',
  935. value: '0',
  936. },
  937. {
  938. label: '历史工单',
  939. value: '1',
  940. },
  941. {
  942. label: '回访详情',
  943. value: '2',
  944. },
  945. {
  946. label: '副本工单',
  947. value: '4',
  948. },
  949. /* {
  950. label: '地图信息',
  951. value: '5',
  952. },*/
  953. ];
  954. }else{
  955. // 部门
  956. state.tabPaneList = [
  957. {
  958. label: '工单详情',
  959. value: '0',
  960. },
  961. {
  962. label: '历史工单',
  963. value: '1',
  964. },
  965. {
  966. label: '回访详情',
  967. value: '2',
  968. },
  969. ];
  970. }
  971. }else if (['YiBin'].includes(themeConfig.value.appScope) && !userInfos.value.isCenter) {
  972. state.tabPaneList = [
  973. {
  974. label: '工单详情',
  975. value: '0',
  976. },
  977. {
  978. label: '历史工单',
  979. value: '1',
  980. },
  981. {
  982. label: '回访详情',
  983. value: '2',
  984. },
  985. {
  986. label: '市民画像',
  987. value: '3',
  988. },
  989. ];
  990. }
  991. if (val.activeName) {
  992. state.activeName = val.activeName; //传入查询tab
  993. handleClick(val.activeName);
  994. } else {
  995. getOrderDetail(state.orderId);
  996. }
  997. };
  998. const close = () => {
  999. state.activeName = '0';
  1000. currentVisitObj.value = null;
  1001. };
  1002. // 切换tab 查询列表
  1003. const handleClick = (val: string) => {
  1004. switch (val) {
  1005. case '0': //工单详情
  1006. getOrderDetail(state.orderId);
  1007. break;
  1008. case '1': // 历史工单
  1009. getHistoryList();
  1010. break;
  1011. case '2': // 回访记录
  1012. break;
  1013. case '3': // 市民画像
  1014. getPortraitList();
  1015. break;
  1016. case '4': // 副本工单
  1017. getCopyOrder();
  1018. break;
  1019. case '5': // 地图信息
  1020. getMapInfo();
  1021. break;
  1022. default:
  1023. getOrderDetail(state.orderId);
  1024. break;
  1025. }
  1026. };
  1027. // 关闭弹窗
  1028. const closeDialog = () => {
  1029. state.dialogVisible = false;
  1030. };
  1031. // 查看录音文件 播放录音
  1032. const playRecordRef = ref<RefType>();
  1033. const recordFile = (obj: any) => {
  1034. playRecordRef.value.playRecord(obj.callId);
  1035. };
  1036. // 查看录音文件 回访录音
  1037. const onVisitRecord = (obj: any) => {
  1038. playRecordRef.value.playRecord(obj.callId);
  1039. };
  1040. const prefixOptions = ref<EmptyArrayType>([]);
  1041. // 电话外呼
  1042. const callPhone = (phoneNumber: any) => {
  1043. let finalNumber = phoneNumber;
  1044. // 处理加0
  1045. if (prefixOptions.value.includes('add')) {
  1046. finalNumber = '0' + finalNumber;
  1047. }
  1048. // 处理减0
  1049. if (prefixOptions.value.includes('remove')) {
  1050. finalNumber = finalNumber.startsWith('0') ? finalNumber.slice(1) : finalNumber;
  1051. }
  1052. // 移除号码中的非数字字符
  1053. finalNumber = finalNumber.replace(/\D/g, '');
  1054. if (['YiBin'].includes(themeConfig.value.appScope)) {
  1055. callCenterOutbound(finalNumber);
  1056. } else {
  1057. callCenterOutbound(finalNumber);
  1058. }
  1059. };
  1060. const orderRepeatRef = ref<RefType>();
  1061. // 展示重复工单列表
  1062. const showRepeatInfo = () => {
  1063. orderRepeatRef.value.openDialog(state.ruleForm);
  1064. };
  1065. // 展示扩展表单
  1066. const orderExpandDetailRef = ref<RefType>(); // 扩展信息
  1067. const showExpandInfo = () => {
  1068. orderExpandDetailRef.value.openDialog(state.ruleForm.orderExtension);
  1069. };
  1070. // 流转记录
  1071. const auditRecordRef = ref<RefType>(); // 流转记录
  1072. const processDetailRef = ref<RefType>();
  1073. const onRecord = () => {
  1074. const params = {
  1075. dialogTitle: '流程明细',
  1076. ...state.ruleForm,
  1077. };
  1078. auditRecordRef.value.openDialog(params);
  1079. };
  1080. const onRecordNew = () => {
  1081. const params = {
  1082. dialogTitle: '流程明细',
  1083. ...state.ruleForm,
  1084. };
  1085. processDetailRef.value.openDialog(params);
  1086. };
  1087. // 申请延期
  1088. const delayApplyRef = ref<RefType>();
  1089. const onDelayApply = () => {
  1090. const params = {
  1091. id: state.ruleForm.workflowId,
  1092. orderDetail: state.ruleForm,
  1093. };
  1094. delayApplyRef.value.openDialog(params);
  1095. };
  1096. // 提交流程
  1097. const lzProcessRef = ref<RefType>(); // 泸州流程办理
  1098. const processAuditRef = ref<RefType>(); // 处理流程
  1099. const zgProcessRef = ref<RefType>(); // 自贡流程办理
  1100. const zgSspProcessRef = ref<RefType>(); // 自贡随手拍流程办理
  1101. const ybProcessRef = ref<RefType>(); // 宜宾流程办理
  1102. const onSubmit = (val: string, annexName: string = '办理附件', classify: string = '办理附件', inputPlaceholder = '办理意见') => {
  1103. if (['工单办理', '工单退回'].includes(val) && state.ruleForm.isReturnUnderApproval) {
  1104. ElMessage.warning(`该工单存在正在审核中的退回,不能办理!`);
  1105. return;
  1106. }
  1107. const params = {
  1108. id: state.ruleForm.workflowId,
  1109. processType: val,
  1110. orderDetail: state.ruleForm,
  1111. extra: {
  1112. dialogTitle: val,
  1113. inputPlaceholder,
  1114. annexName,
  1115. classify,
  1116. },
  1117. };
  1118. const zgLzActions = ['工单办理', '工单代办', '工单退回'];
  1119. if (['ZiGong'].includes(themeConfig.value.appScope) && zgLzActions.includes(val)) {
  1120. if (state.ruleForm.sourceChannelCode === 'ZGSSP') {
  1121. // 随手拍工单办理
  1122. zgSspProcessRef.value.openDialog(params);
  1123. } else {
  1124. zgProcessRef.value.openDialog(params);
  1125. }
  1126. } else if (['LuZhou'].includes(themeConfig.value.appScope) && zgLzActions.includes(val)) {
  1127. lzProcessRef.value.openDialog(params);
  1128. } else {
  1129. // 宜宾
  1130. processAuditRef.value.openDialog(params);
  1131. // ybProcessRef.value.openDialog(params);
  1132. }
  1133. };
  1134. // 流程提交成功
  1135. const orderProcessSuccess = () => {
  1136. closeDialog();
  1137. emit('updateList');
  1138. };
  1139. // 工单退回
  1140. const orderReturnRef = ref<RefType>();
  1141. const onReturn = () => {
  1142. if (state.ruleForm.isReturnUnderApproval) {
  1143. ElMessage.warning(`该工单存在正在审核中的退回,不能办理!`);
  1144. return;
  1145. }
  1146. orderReturnRef.value.openDialog(state.ruleForm);
  1147. };
  1148. // 补充信息
  1149. const orderSupplyRef = ref<RefType>(); // 工单补充
  1150. const onSupply = () => {
  1151. // 穿入当前流程id
  1152. orderSupplyRef.value.openDialog(state.ruleForm);
  1153. };
  1154. // 补充意见提交成功
  1155. const onSupplySuccess = () => {
  1156. handleClick(state.activeName);
  1157. emit('updateList');
  1158. };
  1159. // 督办
  1160. const orderSuperviseRef = ref<RefType>(); // 工单督办
  1161. const onSupervise = () => {
  1162. orderSuperviseRef.value.openDialog(state.ruleForm);
  1163. };
  1164. // 催办
  1165. const orderUrgeRef = ref<RefType>(); // 工单催办
  1166. const onUrge = () => {
  1167. orderUrgeRef.value.openDialog(state.ruleForm);
  1168. };
  1169. // 督办提交成功
  1170. const onSuperviseSuccess = () => {
  1171. handleClick(state.activeName);
  1172. emit('updateList');
  1173. };
  1174. // 查看回访详情
  1175. const currentVisitObj = ref<any>();
  1176. const onVisitDetail = (row: any) => {
  1177. currentVisitObj.value = row;
  1178. };
  1179. // 查询副本工单
  1180. const copyOrderRef = ref<RefType>();
  1181. const getCopyOrder = () => {
  1182. copyOrderRef.value.queryList();
  1183. };
  1184. // 特提
  1185. const specialHandleOrderRef = ref<RefType>(); // 特提
  1186. const onSpecialHandle = () => {
  1187. if (['ZiGong', 'LuZhou'].includes(themeConfig.value.appScope)) {
  1188. if (state.ruleForm.isReturnUnderApproval) {
  1189. ElMessage.warning(`该工单存在正在审核中的退回,不能特提!`);
  1190. return;
  1191. }
  1192. if (state.ruleForm.status == 200) {
  1193. // 会签工单无法进行特提
  1194. ElMessage.warning('工单会签中,请先结束会签!');
  1195. return;
  1196. }
  1197. }
  1198. specialHandleOrderRef.value.openDialog(state.ruleForm);
  1199. };
  1200. // 特提提交成功
  1201. const onSpecialHandleSuccess = () => {
  1202. handleClick(state.activeName);
  1203. emit('updateList');
  1204. };
  1205. // 结束会签
  1206. const onCloseCountersignature = () => {
  1207. ElMessageBox.confirm(`当前工单正在会签中,是否确认结束会签?`, '提示', {
  1208. confirmButtonText: '结束会签',
  1209. cancelButtonText: '取消',
  1210. type: 'warning',
  1211. draggable: true,
  1212. cancelButtonClass: 'default-button',
  1213. autofocus: false,
  1214. })
  1215. .then(() => {
  1216. endCounterSign({ countersignId: state.ruleForm.countersignId })
  1217. .then(() => {
  1218. ElMessage.success('结束会签成功');
  1219. emit('updateList');
  1220. closeDialog();
  1221. })
  1222. .catch(() => {
  1223. emit('updateList');
  1224. });
  1225. })
  1226. .catch(() => {});
  1227. };
  1228. // 取消延期
  1229. const onCancelDelay = () => {
  1230. ElMessageBox.confirm(`当前工单正在延期中,是否确认取消延期?`, '提示', {
  1231. confirmButtonText: '确定取消',
  1232. cancelButtonText: '取消',
  1233. type: 'warning',
  1234. draggable: true,
  1235. cancelButtonClass: 'default-button',
  1236. autofocus: false,
  1237. })
  1238. .then(() => {
  1239. cancelDelay({ id: state.ruleForm.id })
  1240. .then(() => {
  1241. ElMessage.success('取消延期成功');
  1242. emit('updateList');
  1243. closeDialog();
  1244. })
  1245. .catch(() => {
  1246. emit('updateList');
  1247. });
  1248. })
  1249. .catch(() => {});
  1250. };
  1251. // 交办单导出
  1252. const onJbExport = () => {
  1253. state.loading = true;
  1254. exportJbOrder([state.ruleForm.id])
  1255. .then((res: any) => {
  1256. downloadZip(res);
  1257. state.loading = false;
  1258. ElMessage.success('导出成功');
  1259. })
  1260. .catch(() => {
  1261. state.loading = false;
  1262. });
  1263. };
  1264. // 市场明细
  1265. const marketDetailRef = ref<RefType>();
  1266. const onMarketDetail = () => {
  1267. marketDetailRef.value.openDialog(state.ruleForm);
  1268. };
  1269. // 工单详情
  1270. const onOrderDetail = () => {
  1271. openDialog(props.order);
  1272. };
  1273. // 判断当前工单是否是电话来源
  1274. const isTelSource = computed(() => {
  1275. return state.ruleForm?.sourceChannelCode === 'RGDH';
  1276. });
  1277. // 查看引用知识
  1278. const router = useRouter();
  1279. const showKnowledge = (row: any) => {
  1280. closeDialog();
  1281. router.push({
  1282. name: 'knowledgePreview',
  1283. params: {
  1284. id: row.key,
  1285. tagsViewName: row.value,
  1286. },
  1287. });
  1288. };
  1289. // 暴露变量
  1290. defineExpose({
  1291. openDialog,
  1292. closeDialog,
  1293. });
  1294. </script>
  1295. <style lang="scss" scoped>
  1296. .order-detail-container {
  1297. display: inline-flex;
  1298. }
  1299. .collapse-box {
  1300. :deep(.el-collapse-item__header) {
  1301. background-color: var(--hotline-bg-main-color);
  1302. height: 40px;
  1303. border-radius: var(--el-border-radius-base);
  1304. }
  1305. :deep(.el-collapse-item__content) {
  1306. padding-bottom: 10px !important;
  1307. .el-form-item {
  1308. margin-bottom: 5px;
  1309. .el-form-item__content {
  1310. line-height: 20px;
  1311. }
  1312. }
  1313. }
  1314. .collapse-container {
  1315. padding: 10px;
  1316. .plug-container {
  1317. &:last-child {
  1318. margin-bottom: 0;
  1319. }
  1320. }
  1321. }
  1322. }
  1323. :deep(.el-tabs__item) {
  1324. font-size: var(--el-font-size-base);
  1325. }
  1326. :deep(.el-collapse-item__wrap) {
  1327. border-bottom: none;
  1328. }
  1329. .checkbox {
  1330. :deep(.el-checkbox) {
  1331. margin-right: 5px;
  1332. }
  1333. }
  1334. /*.button-select{
  1335. -webkit-user-select:initial;
  1336. -moz-user-select: initial;
  1337. -ms-user-select: initial;
  1338. user-select:initial;
  1339. }*/
  1340. </style>