index.vue 42 KB

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