orderAdd.vue 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047
  1. <template>
  2. <div class="order-add-container layout-padding">
  3. <el-row :gutter="15" class="h100">
  4. <!-- 左边工单信息 -->
  5. <el-col :span="12" class="left-content mb20 h100">
  6. <el-scrollbar class="box pd20 h100">
  7. <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="110px" label-position="right" scroll-to-error v-loading="state.formLoading">
  8. <p class="border-title mb10">来电信息</p>
  9. <el-row :gutter="0">
  10. <!-- 来源渠道 -->
  11. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  12. <!-- 手动创建 -->
  13. <template v-if="state.createBy === 'manual'">
  14. <el-form-item label="来源渠道" prop="channel" :rules="[{ required: true, message: '请选择来源渠道', trigger: 'change' }]">
  15. <el-select
  16. v-model="state.ruleForm.channel"
  17. placeholder="请选择来源渠道"
  18. class="w100"
  19. clearable
  20. @change="
  21. () => {
  22. ruleFormRef.resetFields('fromPhone');
  23. state.ruleForm.fromPhone = '';
  24. }
  25. "
  26. >
  27. <el-option v-for="item in state.channelOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
  28. </el-select>
  29. </el-form-item>
  30. </template>
  31. <!-- 来电弹单 -->
  32. <template v-if="state.createBy === 'tel'">
  33. <el-form-item label="来源渠道" prop="channel">
  34. <el-select v-model="state.ruleForm.channel" placeholder="请选择来源渠道" class="w100" disabled>
  35. <el-option v-for="item in state.channelOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
  36. </el-select>
  37. </el-form-item>
  38. </template>
  39. <!-- 互联网来信 -->
  40. <template v-if="state.createBy === 'letter'">
  41. <el-form-item label="来源渠道" prop="channel">
  42. 互联网来信
  43. <span>[{{ state.ruleForm.channel }}]</span>
  44. </el-form-item>
  45. </template>
  46. </el-col>
  47. <!-- 转接来源 -->
  48. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  49. <!-- 手动创建 -->
  50. <template v-if="state.createBy === 'manual'">
  51. <el-form-item label="转接来源" prop="transferPhone"> 暂无 </el-form-item>
  52. </template>
  53. <!-- 来电弹单 -->
  54. <template v-if="state.createBy === 'tel'">
  55. <el-form-item label="转接来源" prop="transferPhone">
  56. <span>[{{ state.ruleForm.transferPhone }}]</span>
  57. </el-form-item>
  58. </template>
  59. <!-- 互联网来信 -->
  60. <template v-if="state.createBy === 'letter'">
  61. <el-form-item label="转接来源" prop="transferPhone">
  62. <span>[{{ state.ruleForm.transferPhone }}]</span>
  63. </el-form-item>
  64. </template>
  65. </el-col>
  66. <!-- 来电号码 -->
  67. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="state.ruleForm.channel === 'RGDH'">
  68. <!-- 手动创建 -->
  69. <template v-if="state.createBy === 'manual'">
  70. <el-form-item
  71. label="来电号码"
  72. prop="fromPhone"
  73. :rules="[
  74. { required: true, message: '请填写来电号码', trigger: 'blur' },
  75. {
  76. pattern: /^((0\d{2,3}(-)?\d{7,8})|(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8})$/,
  77. message: '来电号码格式错误',
  78. trigger: 'blur',
  79. },
  80. ]"
  81. >
  82. <el-input v-model="state.ruleForm.fromPhone" placeholder="请填写来电号码" clearable @blur="searchHistory"> </el-input>
  83. </el-form-item>
  84. </template>
  85. <!-- 来电弹单 -->
  86. <template v-if="state.createBy === 'tel'">
  87. <el-form-item label="来电号码" prop="fromPhone">
  88. <el-input v-model="state.ruleForm.fromPhone" placeholder="请填写来电号码" disabled> </el-input>
  89. </el-form-item>
  90. </template>
  91. <!-- 互联网来信 -->
  92. <template v-if="state.createBy === 'letter'">
  93. <el-form-item label="来电号码">
  94. <span>[{{ state.ruleForm.fromPhone }}]</span>
  95. </el-form-item>
  96. </template>
  97. </el-col>
  98. <!-- 服务坐席 -->
  99. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  100. <el-form-item label="服务坐席">
  101. <!-- 手动创建 -->
  102. <template v-if="state.createBy === 'manual'">
  103. <span>{{ state.ruleForm.employeeName + '[' + state.ruleForm.employeeStaffNo + ']' }}</span>
  104. </template>
  105. <!-- 来电弹单 -->
  106. <template v-if="state.createBy === 'tel'">
  107. <span>{{ state.ruleForm.employeeName + '[' + telStatusInfo.telsNo + ']' }}</span>
  108. </template>
  109. <!-- 互联网来信 -->
  110. <template v-if="state.createBy === 'letter'">
  111. <span>[{{ telStatusInfo.telsNo }}]</span>
  112. </template>
  113. </el-form-item>
  114. </el-col>
  115. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  116. <el-form-item label="来电/信人" prop="fromName" :rules="[{ required: true, message: '请填写来电/信人', trigger: 'blur' }]">
  117. <el-input v-model="state.ruleForm.fromName" placeholder="请填写来电/信人" clearable> </el-input>
  118. </el-form-item>
  119. </el-col>
  120. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  121. <el-form-item
  122. label="来电/信人性别"
  123. prop="fromGender"
  124. :rules="[{ required: true, message: '请选择来电/信人性别', trigger: 'change' }]"
  125. >
  126. <el-radio-group v-model="state.ruleForm.fromGender">
  127. <el-radio :label="item.key" v-for="item in state.genderOptions" :key="item.key">{{ item.value }}</el-radio>
  128. </el-radio-group>
  129. </el-form-item>
  130. </el-col>
  131. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  132. <el-form-item
  133. label="来电/信人身份"
  134. prop="identityType"
  135. :rules="[{ required: true, message: '请选择来电/信人身份', trigger: 'change' }]"
  136. >
  137. <el-radio-group v-model="state.ruleForm.identityType" @change="selectIdentity">
  138. <el-radio :label="item.key" v-for="item in state.identityTypeOptions" :key="item.key">{{ item.value }}</el-radio>
  139. </el-radio-group>
  140. </el-form-item>
  141. </el-col>
  142. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  143. <el-form-item label="证件类型" prop="licenceTypeObj" :rules="[{ required: false, message: '请选择证件类型', trigger: 'change' }]">
  144. <el-select
  145. v-model="state.ruleForm.licenceTypeObj"
  146. placeholder="请选择证件类型"
  147. class="w100"
  148. clearable
  149. value-key="dicDataValue"
  150. @change="(val:any) => {
  151. state.ruleForm.licenceType = val.dicDataName;
  152. state.ruleForm.licenceTypeCode = val.dicDataValue
  153. }"
  154. >
  155. <el-option v-for="item in state.licenceTypeOptions" :key="item.dicDataValue" :label="item.dicDataName" :value="item" />
  156. </el-select>
  157. </el-form-item>
  158. </el-col>
  159. <!-- 若“证件类型”有值,则证件号码必填 -->
  160. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  161. <el-form-item
  162. label="证件号码"
  163. prop="licenceNo"
  164. :rules="[
  165. { required: state.ruleForm.licenceTypeCode, message: '请填写证件号码', trigger: 'blur' },
  166. {
  167. pattern: licenceNoPattern,
  168. message: '证件号码格式错误',
  169. trigger: 'blur',
  170. },
  171. ]"
  172. >
  173. <el-input v-model="state.ruleForm.licenceNo" placeholder="请填写证件号码" clearable> </el-input>
  174. </el-form-item>
  175. </el-col>
  176. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  177. <el-form-item label="年龄段" prop="ageRangeObj" :rules="[{ required: false, message: '请选择年龄段', trigger: 'change' }]">
  178. <el-select
  179. v-model="state.ruleForm.ageRangeObj"
  180. placeholder="请选择年龄段"
  181. class="w100"
  182. clearable
  183. value-key="dicDataValue"
  184. @change="(val:any) => {
  185. state.ruleForm.ageRange = val.dicDataName;
  186. state.ruleForm.ageRangeCode = val.dicDataValue
  187. }"
  188. >
  189. <el-option v-for="item in state.ageRangeOptions" :key="item.dicDataValue" :label="item.dicDataName" :value="item" />
  190. </el-select>
  191. </el-form-item>
  192. </el-col>
  193. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  194. <el-form-item
  195. label="联系电话"
  196. prop="contact"
  197. :rules="[
  198. { required: true, message: '请填写联系电话', trigger: 'blur' },
  199. {
  200. pattern: /^((0\d{2,3}(-)?\d{7,8})|(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8})$/,
  201. message: '联系电话格式错误',
  202. trigger: 'blur',
  203. },
  204. ]"
  205. >
  206. <el-input v-model="state.ruleForm.contact" placeholder="请填写联系电话" clearable> </el-input>
  207. </el-form-item>
  208. </el-col>
  209. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  210. <el-form-item label="" prop="acceptSms" :rules="[{ required: false, message: '请选择', trigger: 'change' }]">
  211. <el-checkbox v-model="state.ruleForm.acceptSms" label="受理短信" />
  212. <el-checkbox v-model="state.ruleForm.isSecret" label="是否保密" />
  213. </el-form-item>
  214. </el-col>
  215. <!-- 当“来电/信人身份”为“企业”时必填 -->
  216. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  217. <el-form-item
  218. label="工作单位"
  219. prop="company"
  220. :rules="[{ required: state.ruleForm.identityType === 2, message: '请填写工作单位', trigger: 'blur' }]"
  221. >
  222. <el-input v-model="state.ruleForm.company" placeholder="请填写工作单位" clearable> </el-input>
  223. </el-form-item>
  224. </el-col>
  225. </el-row>
  226. <p class="border-title mb10">诉求信息</p>
  227. <el-row>
  228. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  229. <el-form-item label="工单编码"> {{ state.ruleForm.no }} </el-form-item>
  230. </el-col>
  231. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  232. <el-form-item label="工单标题" prop="title" :rules="[{ required: true, message: '请填写工单标题', trigger: 'blur' }]">
  233. <el-input v-model="state.ruleForm.title" placeholder="请填写工单标题" clearable> </el-input>
  234. </el-form-item>
  235. </el-col>
  236. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  237. <el-row :gutter="0">
  238. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  239. <el-form-item label="工单类型" prop="orderType" :rules="[{ required: true, message: '请选择工单类型', trigger: 'change' }]">
  240. <el-select v-model="state.ruleForm.orderType" placeholder="请选择工单类型" class="w100" @change="selectOrderType">
  241. <el-option v-for="item in state.orderTypeOptions" :key="item.key" :label="item.value" :value="item.key" />
  242. </el-select>
  243. </el-form-item>
  244. </el-col>
  245. <!-- 当“工单类型”为非通用工单时,展示【拓展信息】按钮 -->
  246. <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="6" :offset="1" v-if="state.ruleForm.orderType === 1 && state.ruleForm.acceptType">
  247. <el-form-item label="" label-width="0px">
  248. <el-button @click="showExpandForm"> <SvgIcon name="ele-CirclePlus" class="mr3" size="16px" /> 拓展信息 </el-button>
  249. </el-form-item>
  250. </el-col>
  251. </el-row>
  252. </el-col>
  253. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  254. <el-form-item label="受理类型" prop="acceptType" :rules="[{ required: true, message: '请选择受理类型', trigger: 'change' }]">
  255. <el-select v-model="state.ruleForm.acceptType" placeholder="请选择受理类型" class="w100">
  256. <el-option
  257. v-for="item in state.acceptTypeOptions"
  258. :key="item.key"
  259. :disabled="item.disabled"
  260. :label="item.value"
  261. :value="item.key"
  262. />
  263. </el-select>
  264. </el-form-item>
  265. </el-col>
  266. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  267. <el-form-item label="紧急程度" prop="emergencyLevel" :rules="[{ required: true, message: '请选择紧急程度', trigger: 'change' }]">
  268. <el-select v-model="state.ruleForm.emergencyLevel" placeholder="请选择紧急程度" class="w100">
  269. <el-option v-for="item in state.emergencyLevelOptions" :key="item.key" :label="item.value" :value="item.key" />
  270. </el-select>
  271. </el-form-item>
  272. </el-col>
  273. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  274. <el-form-item label="热点分类" prop="hotspotId" :rules="[{ required: true, message: '请选择热点分类', trigger: 'change' }]">
  275. <el-tree-select
  276. class="w100"
  277. v-model="state.ruleForm.hotspotId"
  278. filterable
  279. placeholder="请选择热点分类"
  280. :props="HotspotProps"
  281. lazy
  282. :load="load"
  283. node-key="id"
  284. check-strictly
  285. :render-after-expand="false"
  286. @node-click="hotSpotChange"
  287. :default-expanded-keys="state.hotspotExternal"
  288. />
  289. </el-form-item>
  290. </el-col>
  291. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  292. <el-form-item label="事发时间" prop="incidentTime" :rules="[{ required: false, message: '请选择事发时间', trigger: 'change' }]">
  293. <el-date-picker
  294. v-model="state.ruleForm.incidentTime"
  295. type="datetime"
  296. placeholder="请选择事发时间"
  297. value-format="YYYY-MM-DD[T]HH:mm:ss"
  298. class="w100"
  299. />
  300. </el-form-item>
  301. </el-col>
  302. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  303. <el-row :gutter="0">
  304. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  305. <el-form-item label="事发地址" prop="areaCode" :rules="[{ required: true, message: '请选择事发地址', trigger: 'change' }]">
  306. <el-cascader
  307. :options="state.areaOptions"
  308. filterable
  309. :props="{ value: 'id', label: 'areaName', emitPath: false }"
  310. placeholder="请选择事发地址"
  311. class="w100"
  312. v-model="state.ruleForm.areaCode"
  313. ref="areaRef"
  314. @change="changeArea"
  315. >
  316. <template #default="{ node, data }">
  317. <span>{{ data.areaName }}</span>
  318. <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
  319. </template>
  320. </el-cascader>
  321. </el-form-item>
  322. </el-col>
  323. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  324. <el-form-item
  325. label=""
  326. prop="street"
  327. :rules="[{ required: false, message: '请填写详细地址', trigger: 'blur' }]"
  328. label-width="10px"
  329. >
  330. <el-input v-model="state.ruleForm.street" placeholder="请填写详细地址" clearable> </el-input>
  331. </el-form-item>
  332. </el-col>
  333. </el-row>
  334. </el-col>
  335. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  336. <el-row :gutter="0">
  337. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  338. <el-form-item label="是否重复" prop="isRepeat" :rules="[{ required: true, message: '请选择是否重复', trigger: 'change' }]">
  339. <el-select v-model="state.ruleForm.isRepeat" placeholder="请选择是否重复" class="w100" @change="isRepeatChange">
  340. <el-option v-for="item in state.repeatOptions" :key="item.key" :label="item.value" :value="item.key" />
  341. </el-select>
  342. </el-form-item>
  343. </el-col>
  344. <!-- 必填,若“是否重复”为“是”,则展示重复件选择框 -->
  345. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="state.ruleForm.isRepeat === 'true'">
  346. <el-form-item
  347. label=""
  348. prop="duplicateTitle"
  349. label-width="10px"
  350. :rules="[{ required: true, message: '请选择重复件', trigger: 'change' }]"
  351. >
  352. <el-input v-model="state.ruleForm.duplicateTitle" placeholder="请选择重复件" readonly>
  353. <template #suffix>
  354. <el-button link type="danger" v-if="state.ruleForm.duplicateTitle" @click="clearRepeat">
  355. <SvgIcon name="ele-Delete" size="16px" />
  356. </el-button>
  357. <el-button link type="primary" class="ml1" @click="selectRepeat">
  358. <SvgIcon name="iconfont icon-tianjiatuozhanxinxi" size="18px" />
  359. </el-button>
  360. </template>
  361. </el-input>
  362. </el-form-item>
  363. </el-col>
  364. </el-row>
  365. </el-col>
  366. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  367. <el-form-item label="推送分类" prop="pushTypeObj" :rules="[{ required: false, message: '请选择推送分类', trigger: 'change' }]">
  368. <el-select
  369. v-model="state.ruleForm.pushTypeObj"
  370. placeholder="请选择推送分类"
  371. class="w100"
  372. clearable
  373. value-key="dicDataValue"
  374. @change="(val:any) => {
  375. state.ruleForm.pushType = val.dicDataName;
  376. state.ruleForm.pushTypeCode = val.dicDataValue
  377. }"
  378. >
  379. <el-option v-for="item in state.pushTypeOptions" :key="item.dicDataValue" :label="item.dicDataName" :value="item" />
  380. </el-select>
  381. </el-form-item>
  382. </el-col>
  383. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  384. <el-form-item label="诉求详情" prop="content" :rules="[{ required: true, message: '请填写诉求详情', trigger: 'blur' }]">
  385. <Comment
  386. @chooseComment="chooseComment"
  387. v-model="state.ruleForm.content"
  388. placeholder="请填写诉求详情"
  389. :loading="state.formLoading"
  390. :commonEnum="commonEnum.Seat"
  391. modal
  392. />
  393. </el-form-item>
  394. </el-col>
  395. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  396. <el-form-item label="附件" prop="remark" :rules="[{ required: false, message: '请填写诉求内容', trigger: 'change' }]">
  397. <annex-list></annex-list>
  398. </el-form-item>
  399. </el-col>
  400. <el-col :xs="24" :sm="12" :md="24" :lg="24" :xl="24">
  401. <el-form-item>
  402. <el-button class="default-button" @click="save(ruleFormRef)" v-auth="'business:order:add'"> 保存 </el-button>
  403. <el-button type="primary" v-waves @click="submit(ruleFormRef)" v-auth="'business:order:startWorkflow'"> 提交 </el-button>
  404. </el-form-item>
  405. </el-col>
  406. </el-row>
  407. </el-form>
  408. </el-scrollbar>
  409. </el-col>
  410. <!-- 右侧内容 -->
  411. <el-col :span="12" class="right-content h100">
  412. <el-scrollbar class="h100">
  413. <div class="right-content-box box pd20">
  414. <!-- <el-tabs v-model="state.activeName">
  415. <el-tab-pane label="历史工单" name="first"> </el-tab-pane>
  416. <el-tab-pane label="市民画像" name="second"> 市民画像 </el-tab-pane>
  417. </el-tabs> -->
  418. <el-form :model="state.queryParams" ref="queryParamsRef" :inline="true" @submit.native.prevent>
  419. <el-form-item label="关键词" prop="Keyword">
  420. <el-input v-model="state.queryParams.Keyword" placeholder="工单标题/工单编码" clearable @keyup.enter="handleQuery" />
  421. </el-form-item>
  422. <el-form-item>
  423. <el-button type="primary" @click="handleQuery" :loading="state.historyOrderLoading">
  424. <SvgIcon name="ele-Search" class="mr5" />查询
  425. </el-button>
  426. <el-button @click="resetQuery(queryParamsRef)" :loading="state.historyOrderLoading" class="default-button">
  427. <SvgIcon name="ele-Refresh" class="mr5" />重置
  428. </el-button>
  429. </el-form-item>
  430. </el-form>
  431. <el-table
  432. :data="state.tableData"
  433. v-loading="state.historyOrderLoading"
  434. row-key="id"
  435. @selection-change="handleSelectionChange"
  436. max-height="300"
  437. ref="multipleTableRef"
  438. >
  439. <el-table-column type="selection" label="重复件" width="80" v-if="state.ruleForm.isRepeat === 'true'" />
  440. <el-table-column prop="phoneNo" label="工单标题" show-overflow-tooltip width="180">
  441. <template #default="{ row }">
  442. <span style="color: var(--el-color-primary)">{{ row.title }}</span>
  443. </template>
  444. </el-table-column>
  445. <el-table-column prop="hotspotName" label="热点分类" show-overflow-tooltip> </el-table-column>
  446. <el-table-column prop="no" label="工单编码" show-overflow-tooltip> </el-table-column>
  447. <el-table-column prop="currentStepName" label="当前环节" show-overflow-tooltip></el-table-column>
  448. <el-table-column prop="statusText" label="状态" width="70" fixed="right" align="center">
  449. <template #default="{ row }">
  450. <!-- 草稿 -->
  451. <span style="color: var(--el-color-info)" v-if="row.status === 0">{{ row.statusText }}</span>
  452. <!-- 待签收 -->
  453. <span style="color: var(--el-color-success)" v-if="row.status === 10">{{ row.statusText }}</span>
  454. <!-- 办理中 -->
  455. <span style="color: var(--el-color-primary)" v-if="row.status === 20">{{ row.statusText }}</span>
  456. <!-- 会签中 -->
  457. <span style="color: var(--el-color-primary)" v-if="row.status === 30">{{ row.statusText }}</span>
  458. <!-- 退回 -->
  459. <span style="color: var(--el-color-danger)" v-if="row.status === 40">{{ row.statusText }}</span>
  460. <!-- 办理完成 -->
  461. <span style="color: var(--el-color-success)" v-if="row.status === 50">{{ row.statusText }}</span>
  462. <!-- 已归档 -->
  463. <span style="color: var(--el-color-info)" v-if="row.status === 60">{{ row.statusText }}</span>
  464. </template>
  465. </el-table-column>
  466. <el-table-column prop="statusText" label="操作" width="70" fixed="right" align="center">
  467. <template #default="{ row }">
  468. <el-button @click="onSupply(row)" link type="primary"> 补充 </el-button>
  469. </template>
  470. </el-table-column>
  471. </el-table>
  472. <!-- 分页 -->
  473. <pagination
  474. :total="state.total"
  475. v-model:page="state.queryParams.PageIndex"
  476. v-model:limit="state.queryParams.PageSize"
  477. @pagination="searchHistory"
  478. />
  479. </div>
  480. <!-- 知识检索 -->
  481. <div class="right-content-knowledge mt20 box pd20">
  482. <div class="flex-center-between mb20">
  483. <p class="table-title">知识检索</p>
  484. </div>
  485. <div class="knowledge-container">
  486. <el-input
  487. v-model="state.KnowledgeKeyword"
  488. class="knowledge-input mb20"
  489. placeholder="请填写搜索内容"
  490. @keyup.enter="knowledgeRetrievalPaged(state.KnowledgeKeyword)"
  491. >
  492. <template #prefix>
  493. <SvgIcon name="ele-Search" size="16px" />
  494. </template>
  495. <template #suffix>
  496. <el-button
  497. class="knowledge-search-button"
  498. type="primary"
  499. :loading="state.loading"
  500. round
  501. @click="knowledgeRetrievalPaged(state.KnowledgeKeyword)"
  502. >
  503. <SvgIcon name="ele-Search" size="16px" color="#fff" />
  504. </el-button>
  505. </template>
  506. </el-input>
  507. <div>
  508. <span class="mr10" v-if="state.hotWords.length">搜索热词</span>
  509. <el-tag
  510. v-for="(item, index) in state.hotWords"
  511. :key="index"
  512. class="mr10 mb10"
  513. style="cursor: pointer"
  514. @click="knowledgeRetrievalPaged(item)"
  515. round
  516. >
  517. {{ item }}
  518. </el-tag>
  519. </div>
  520. <ul class="mt10" v-loading="state.loading">
  521. <el-empty description="暂无数据" v-if="!state.knowledgeList.length" class="mb20">
  522. <template #image>
  523. <span></span>
  524. </template>
  525. </el-empty>
  526. <li v-for="(item, index) in state.knowledgeList" :key="index" class="mb20 knowledge-item" @click="onPreview(item)" v-else>
  527. <p class="font16">
  528. <SvgIcon name="iconfont icon-dian" size="16px" /> <b>{{ item.title }}</b>
  529. </p>
  530. <p class="pt6 indent text-ellipsis2" v-html="item.content"></p>
  531. </li>
  532. </ul>
  533. </div>
  534. <!-- 分页 -->
  535. <pagination
  536. :total="state.knowledgeTotal"
  537. v-model:page="state.knowledgeQuery.PageIndex"
  538. v-model:limit="state.knowledgeQuery.PageSize"
  539. @pagination="knowledgeRetrievalPaged(state.KnowledgeKeyword)"
  540. :pageSizes="[5, 10, 15, 20]"
  541. layout="total, prev, pager, next"
  542. class="pt10"
  543. />
  544. </div>
  545. </el-scrollbar>
  546. </el-col>
  547. </el-row>
  548. <!-- 拓展表单 -->
  549. <order-expand-form ref="ExpandFormRef" @saveExpandForm="saveExpandForm" />
  550. <!-- 历史工单 -->
  551. <order-history ref="HistoryOrderRef" @saveSelect="saveSelect" />
  552. <!-- 提交流程 -->
  553. <order-process ref="processRef" @orderProcessSuccess="orderProcessSuccess" />
  554. <!-- 补充信息 -->
  555. <order-supply ref="SupplyRef" @onSupplySuccess="onSupplySuccess" />
  556. </div>
  557. </template>
  558. <script setup lang="ts" name="orderAdd">
  559. import { defineAsyncComponent, ref, reactive, onMounted, computed } from 'vue';
  560. import { ElMessage } from 'element-plus';
  561. import type { FormInstance } from 'element-plus';
  562. import { storeToRefs } from 'pinia';
  563. import { useRoute, useRouter } from 'vue-router';
  564. import { useTelStatus } from '/@/stores/telStatus';
  565. import { throttle } from '/@/utils/tools';
  566. import {commonEnum} from '/@/utils/constants';
  567. import { auth } from '/@/utils/authFunction';
  568. import other from '/@/utils/other';
  569. import { orderBaseDataAdd, orderAdd, hotSpotType, historyOrder, orderEdit } from '/@/api/business/order';
  570. import { useUserInfo } from '/@/stores/userInfo';
  571. import { treeArea } from '/@/api/business/commonP';
  572. import { knowPopScreen, getKeyWord } from '/@/api/knowledge';
  573. import mittBus from '/@/utils/mitt';
  574. // 引入组件
  575. const OrderProcess = defineAsyncComponent(() => import('/@/views/business/order/components/Order-process.vue')); // 提交流程
  576. const OrderExpandForm = defineAsyncComponent(() => import('/@/views/business/order/components/Order-expand-form.vue')); // 拓展表单
  577. const OrderHistory = defineAsyncComponent(() => import('/@/views/business/order/components/Order-history.vue')); // 历史工单
  578. const Comment = defineAsyncComponent(() => import('/@/views/business/order/components/Order-comment.vue')); // 常用意见
  579. const OrderSupply = defineAsyncComponent(() => import('/@/views/business/order/components/Order-supply.vue')); // 补充信息
  580. const AnnexList = defineAsyncComponent(() => import('/@/components/AnnexList/index.vue')); // 附件列表
  581. // 定义变量内容
  582. const state = reactive<any>({
  583. createBy: 'manual', // 工单创建方式 默认手动创建 tel:来电弹单 letter:互联网来信 默认表示手动创建
  584. activeName: 'first', // tabs
  585. ruleForm: {
  586. channel: '', // 来源频道
  587. transferPhone: '', // 转接来源
  588. fromPhone: '', // 来电号码
  589. employeeName: '', // 员工姓名
  590. employeeStaffNo: '', // 员工工号
  591. fromName: '', // 来电人姓名
  592. fromGender: 1, // 来电人性别 默认先生
  593. identityType: 1, // 来电/信人身份 默认市民
  594. licenceType: '', // 证件类型
  595. licenceTypeCode: '', // 证件类型code
  596. licenceNo: '', // 证件号码
  597. ageRange: '', // 年龄段
  598. ageRangeCode: '', // 年龄段code
  599. contact: '', // 联系电话
  600. acceptSms: false, // 是否接收短信 默认false
  601. isSecret: false, // 是否保密 默认false
  602. company: '', // 工作单位
  603. no: '', // 工单编号
  604. title: '', // 工单标题
  605. orderType: 0, // 工单类型 默认通用工单
  606. acceptType: '', // 受理类型
  607. emergencyLevel: 1, // 紧急程度 默认一般
  608. hotspotId: '', // 热点问题
  609. incidentTime: '', // 事件发生时间
  610. areaCode: '', // 区域编码
  611. street: '', // 街道
  612. isRepeat: 'false', // 是否重复工单 默认否
  613. duplicateId: '', //重复工单id
  614. duplicateTitle: '', // 重复工单标题
  615. pushType: '', // 推送类型
  616. pushTypeCode: '', // 推送类型code
  617. content: '', // 工单内容
  618. },
  619. formLoading: false, // 表单加载状态
  620. historyOrderLoading: false, // 历史工单加载状态
  621. loading: false, // 知识检索加载状态
  622. acceptTypeOptions: [], // 受理类型
  623. channelOptions: [], // 来源频道
  624. emergencyLevelOptions: [], // 紧急程度
  625. genderOptions: [], // 性别
  626. identityTypeOptions: [], //来电人身份
  627. licenceTypeOptions: [], // 证件类型
  628. ageRangeOptions: [], // 年龄段
  629. orderTypeOptions: [], // 工单类型
  630. pushTypeOptions: [], //推送分类
  631. areaOptions: [], //省市区
  632. repeatOptions: [
  633. //是否重复
  634. {
  635. value: '是',
  636. key: 'true',
  637. },
  638. {
  639. value: '否',
  640. key: 'false',
  641. },
  642. ],
  643. tableRadio: null as any, // 重复件选择
  644. orgData: [], // 机构数据
  645. tableData: [], // 历史工单
  646. total: 0, // 历史工单总条数
  647. queryParams: {
  648. PageIndex: 1, // 当前页
  649. PageSize: 10, // 每页条数
  650. Keyword: '', // 关键字
  651. },
  652. KnowledgeKeyword: '', //知识检索内容
  653. hotWords: [], // 知识检索热点
  654. knowledgeList: [], //知识检索列表
  655. external: [], // 知识检索展开
  656. hotspotExternal: [], // 热点分类展开
  657. knowledgeQuery: {
  658. // 知识库查询
  659. PageIndex: 1, // 当前页
  660. PageSize: 5, // 每页条数
  661. Keyword: '', // 关键字
  662. },
  663. knowledgeTotal: 0, // 知识库总条数
  664. fileList: [],
  665. orderId: '', // 工单id
  666. });
  667. const queryParamsRef = ref<RefType>(); // 历史工单查询参数
  668. const useTelStatusStore = useTelStatus(); // 来电弹屏
  669. const { telStatusInfo } = storeToRefs(useTelStatusStore); // 来电弹屏信息
  670. const storesUserInfo = useUserInfo(); // 用户信息
  671. const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
  672. state.ruleForm.employeeName = userInfos.value.name; // 员工姓名
  673. state.ruleForm.employeeStaffNo = userInfos.value.staffNo; // 员工工号
  674. const route = useRoute(); // 路由
  675. const router = useRouter(); // 路由
  676. // 证件号码验证
  677. const licenceNoPattern = computed(() => {
  678. switch (state.ruleForm.licenceTypeCode) {
  679. case '10': // 身份证
  680. return /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/;
  681. default: //默认只允许数字字母
  682. return /^[A-Za-z0-9]+$/;
  683. }
  684. });
  685. // 热点分类远程搜索
  686. const HotspotProps = {
  687. label: 'hotSpotFullName',
  688. children: 'children',
  689. isLeaf: 'isLeaf',
  690. };
  691. // 热点分类懒加载
  692. const load = async (node: any, resolve: any) => {
  693. if (node.isLeaf) return resolve([]);
  694. const res: any = await hotSpotType({ id: node.data.id ? node.data.id : '' });
  695. resolve(res.result);
  696. };
  697. // 选择热点分类
  698. const hotSpotChange = (val: any, e: any) => {
  699. state.hotspotExternal = [];
  700. state.external = [];
  701. state.hotspotExternal = getParentId(e, state.external);
  702. state.ruleForm.hotspotSpliceName = val.hotSpotFullName;
  703. state.ruleForm.hotspotName = val.hotSpotName;
  704. knowledgeRetrievalPaged(val.hotSpotName);
  705. };
  706. // 知识检索
  707. const knowledgeRetrievalPaged = async (val?: string) => {
  708. state.knowledgeQuery.Keyword = val ?? '';
  709. state.KnowledgeKeyword = val ?? '';
  710. try {
  711. state.loading = true;
  712. const res: any = await knowPopScreen(state.knowledgeQuery);
  713. state.knowledgeList = res.result?.items ?? [];
  714. state.knowledgeTotal = res.result?.total ?? 0;
  715. state.loading = false;
  716. } catch (error) {
  717. state.loading = false;
  718. }
  719. };
  720. // 手机号码脱敏处理
  721. // const phoneNumber = computed(() => {
  722. // return desensitizationPhone(telStatusInfo.value.onCallArr[0]?.from);
  723. // });
  724. // 递归查找父级Id
  725. const getParentId = (val: any, arr: string[]) => {
  726. if (val.data.parentId) {
  727. arr.push(val.data.parentId);
  728. getParentId(val.parent, arr);
  729. }
  730. return arr;
  731. };
  732. // 选择工单类型 处理受理类型选择数据
  733. const ruleFormRef = ref<RefType>();
  734. const selectOrderType = (val: any) => {
  735. ruleFormRef.value.resetFields('acceptType');
  736. state.acceptTypeOptions = state.acceptTypeOptions.map((item: any) => {
  737. let isDisabled = val === 1 && ![30, 35].includes(item.key); // 选择了12315 市场监管受理单 举报:30 投诉:35
  738. return {
  739. key: item.key,
  740. value: item.value,
  741. disabled: isDisabled,
  742. };
  743. });
  744. };
  745. const areaRef = ref<RefType>();
  746. // 选择省市区
  747. const changeArea = () => {
  748. const currentNode = areaRef.value.getCheckedNodes();
  749. state.ruleForm.province = currentNode[0]?.pathLabels[0] ?? '';
  750. state.ruleForm.city = currentNode[0]?.pathLabels[1] ?? '';
  751. state.ruleForm.county = currentNode[0]?.pathLabels[2] ?? '';
  752. };
  753. const ExpandFormRef = ref<RefType>();
  754. // 打开拓展表单
  755. const showExpandForm = () => {
  756. ExpandFormRef.value.openDialog(state.ruleForm.acceptType);
  757. };
  758. // 拓展表单保存
  759. const saveExpandForm = (val: any) => {
  760. const acceptTypeMap: any = {
  761. 30: 'orderReport',
  762. 35: 'orderComplain',
  763. };
  764. const property = acceptTypeMap[state.ruleForm.acceptType];
  765. if (property) {
  766. state.ruleForm[property] = val;
  767. }
  768. };
  769. // 删除不必要的属性
  770. const deleteUnnecessaryProperties = (obj: any) => {
  771. const propertiesToDelete = ['ageRangeObj', 'pushTypeObj', 'licenceTypeObj'];
  772. propertiesToDelete.forEach((prop) => Reflect.deleteProperty(obj, prop));
  773. if (obj.acceptType === 30) Reflect.deleteProperty(obj, 'orderComplain');
  774. if (obj.acceptType === 35) Reflect.deleteProperty(obj, 'orderReport');
  775. };
  776. // 是否打开拓展表单
  777. const shouldOpenDialog = (obj: any) => obj.orderType === 1 && obj.acceptType && !ExpandFormRef.value.state.validated;
  778. // 保存
  779. const save = throttle((formEl: FormInstance | undefined) => {
  780. if (!formEl) return;
  781. formEl.validate((valid: boolean) => {
  782. if (!valid) return;
  783. state.ruleForm.hotspotExternal = [];
  784. state.ruleForm.hotspotExternal = state.hotspotExternal.join(',');
  785. let submitObj = other.deepClone(state.ruleForm);
  786. deleteUnnecessaryProperties(submitObj);
  787. const addOrderAndNavigate = () => {
  788. orderAdd(submitObj).then(() => {
  789. ElMessage.success('操作成功');
  790. mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
  791. mittBus.emit('clearCache', 'order');
  792. router.push({
  793. path: '/business/order',
  794. });
  795. });
  796. };
  797. if (shouldOpenDialog(submitObj)) {
  798. ExpandFormRef.value.openDialog(submitObj.acceptType, true);
  799. } else {
  800. addOrderAndNavigate();
  801. }
  802. });
  803. }, 500);
  804. // 选择来点人身份如果是企业 推送分类自动选择助企纾困
  805. const selectIdentity = (val: number) => {
  806. if (val === 2) {
  807. state.ruleForm.pushTypeObj = state.pushTypeOptions.find((item: any) => item.dicDataValue === '8'); // 助企纾困
  808. state.ruleForm.pushType = state.ruleForm.pushTypeObj.dicDataName;
  809. state.ruleForm.pushTypeCode = state.ruleForm.pushTypeObj.dicDataValue;
  810. }
  811. };
  812. const processRef = ref<RefType>();
  813. const processOrder = (submitObj: any, isEdit: boolean) => {
  814. const operation = isEdit ? orderEdit : orderAdd;
  815. operation(submitObj).then((res) => {
  816. ElMessage.success('操作成功');
  817. state.orderId = isEdit ? state.orderId : res.result;
  818. processRef.value.openDialog({ id: state.orderId, title: '提交', commonEnum: commonEnum.Seat, processType: 'start' });
  819. });
  820. };
  821. const handleForm = (submitObj: any, isEdit: boolean) => {
  822. if (submitObj.orderType === 1 && submitObj.acceptType) {
  823. if (ExpandFormRef.value.state.validated) {
  824. processOrder(submitObj, isEdit);
  825. } else {
  826. ExpandFormRef.value.openDialog(submitObj.acceptType, true);
  827. }
  828. } else {
  829. processOrder(submitObj, isEdit);
  830. }
  831. };
  832. // 提交
  833. const submit = throttle((formEl: FormInstance | undefined) => {
  834. if (!formEl) return;
  835. formEl.validate((valid: boolean) => {
  836. if (!valid) return;
  837. state.ruleForm.hotspotExternal = state.hotspotExternal.join(',');
  838. let submitObj = other.deepClone(state.ruleForm);
  839. deleteUnnecessaryProperties(submitObj);
  840. if (state.orderId) {
  841. handleForm(submitObj, true);
  842. } else {
  843. handleForm(submitObj, false);
  844. }
  845. });
  846. }, 500);
  847. // 选择是否重复
  848. const isRepeatChange = (val: string) => {
  849. if (val === 'false') clearRepeat();
  850. };
  851. const multipleSelection = ref<any[]>([]); // 重复件表格选中项
  852. const multipleTableRef = ref<RefType>(); // 重复件表格ref
  853. // 清除重复件
  854. const clearRepeat = () => {
  855. state.ruleForm.duplicateTitle = '';
  856. state.ruleForm.duplicateId = '';
  857. state.tableRadio = '';
  858. multipleTableRef.value.clearSelection();
  859. };
  860. // 选择重复件
  861. const HistoryOrderRef = ref<RefType>();
  862. const selectRepeat = () => {
  863. HistoryOrderRef.value.openDialog(state.ruleForm);
  864. };
  865. // 弹窗确定选择重复件
  866. const saveSelect = (row: any) => {
  867. state.ruleForm.duplicateId = row.id;
  868. state.ruleForm.duplicateTitle = row.title;
  869. state.tableRadio = row.id;
  870. multipleTableRef.value!.toggleRowSelection(row, undefined);
  871. HistoryOrderRef.value.closeDialog();
  872. };
  873. // 右边表格选中重复件
  874. const handleSelectionChange = (row: any) => {
  875. if (row) {
  876. state.ruleForm.duplicateId = row.id;
  877. state.tableRadio = row.id;
  878. state.ruleForm.duplicateTitle = row.title;
  879. multipleSelection.value = row;
  880. }
  881. };
  882. // 选中常用意见
  883. const chooseComment = (item: any) => {
  884. state.ruleForm.content += item.content;
  885. };
  886. // 流程提交成功
  887. const orderProcessSuccess = () => {
  888. // 关闭当前 tagsView
  889. mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
  890. mittBus.emit('clearCache', 'order');
  891. router.push({
  892. path: '/business/order',
  893. });
  894. };
  895. /** 搜索按钮操作 */
  896. const handleQuery = throttle(() => {
  897. state.queryParams.PageIndex = 1;
  898. searchHistory();
  899. }, 500);
  900. /** 重置按钮操作 */
  901. const resetQuery = throttle((formEl: FormInstance | undefined) => {
  902. if (!formEl) return;
  903. formEl.resetFields();
  904. handleQuery();
  905. }, 500);
  906. /** 获取历史工单 */
  907. const searchHistory = throttle(() => {
  908. if (!auth('business:order:history')) ElMessage.error('抱歉,您没有权限查询历史工单!');
  909. else {
  910. if (!state.ruleForm.fromPhone) return; // 如果没有来电号码 不进行查询
  911. state.historyOrderLoading = true;
  912. let request = {
  913. ...state.queryParams,
  914. PhoneNo: state.ruleForm.fromPhone,
  915. OrderId: route.params.id, //传入id 排除重复工单选择自己
  916. };
  917. historyOrder(request)
  918. .then((response: any) => {
  919. state.tableData = response?.result.items ?? [];
  920. state.total = response?.result.total;
  921. setTimeout(() => {
  922. state.historyOrderLoading = false;
  923. }, 300);
  924. })
  925. .catch(() => {
  926. state.historyOrderLoading = false;
  927. });
  928. }
  929. }, 500);
  930. // 补充信息
  931. const SupplyRef = ref<RefType>();
  932. const onSupply = (val: any) => {
  933. SupplyRef.value.openDialog(val);
  934. };
  935. // 补充意见提交成功
  936. const onSupplySuccess = () => {
  937. searchHistory();
  938. };
  939. // 预览知识
  940. const onPreview = (row: any) => {
  941. router.push({
  942. name: 'knowledgePreview',
  943. params: {
  944. id: row.id,
  945. tagsViewName: '知识预览',
  946. },
  947. });
  948. };
  949. onMounted(async () => {
  950. state.formLoading = true;
  951. state.loading = true;
  952. try {
  953. const [area, res, hotspot] = await Promise.all([treeArea(), orderBaseDataAdd(), getKeyWord()]);
  954. state.acceptTypeOptions = res.result?.acceptTypeOptions ?? [];
  955. state.channelOptions = res.result?.channelOptions ?? [];
  956. state.emergencyLevelOptions = res.result?.emergencyLevelOptions ?? [];
  957. state.genderOptions = res.result?.genderOptions ?? [];
  958. state.identityTypeOptions = res.result?.identityTypeOptions ?? [];
  959. state.orderTypeOptions = res.result?.orderTypeOptions ?? [];
  960. state.pushTypeOptions = res.result?.pushTypeOptions ?? [];
  961. state.licenceTypeOptions = res.result?.licenceTypeOptions ?? [];
  962. state.ageRangeOptions = res.result?.ageRangeOptions ?? [];
  963. state.ruleForm.seats = `${userInfos.value.name} [${userInfos.value.staffNo}]`;
  964. state.areaOptions = area.result ?? []; //省市区数据
  965. state.hotWords = hotspot.result ?? []; // 知识库热词
  966. // route.query.createBy createBy 代表来源 tel:来电弹单 letter:互联网来信 默认表示手动创建
  967. if (route.params.createBy) {
  968. state.createBy = route.params.createBy;
  969. if (route.params.createBy === 'tel') {
  970. //通话
  971. state.ruleForm.channel = 'RGDH'; //电话
  972. state.ruleForm.fromPhone = route.params.telNo;
  973. state.ruleForm.callId = route.params.callId;
  974. state.ruleForm.transferPhone = route.params.transfer;
  975. searchHistory(); // 查询历史订单
  976. }
  977. console.log(route.params);
  978. }
  979. } catch (error) {
  980. state.formLoading = false;
  981. state.loading = false;
  982. }
  983. state.formLoading = false;
  984. state.loading = false;
  985. });
  986. </script>
  987. <style scoped lang="scss">
  988. .box {
  989. background-color: var(--el-color-white);
  990. border-radius: 8px;
  991. }
  992. :deep(.el-divider--horizontal) {
  993. margin-top: 0;
  994. }
  995. .order-add-container {
  996. color: var(--hotline-color-text-main);
  997. .right-content {
  998. &-knowledge {
  999. .knowledge-container {
  1000. position: relative;
  1001. .knowledge-input {
  1002. :deep(.el-input__wrapper) {
  1003. border-radius: 20px;
  1004. background: var(--hotline-bg-main-color);
  1005. }
  1006. }
  1007. .knowledge-search-button {
  1008. height: calc(100% - 6px);
  1009. }
  1010. .knowledge-item {
  1011. &:last-child {
  1012. margin-bottom: 0;
  1013. }
  1014. cursor: pointer;
  1015. &:hover {
  1016. color: var(--el-color-primary);
  1017. }
  1018. .indent {
  1019. text-indent: 1em;
  1020. color: var(--hotline-color-text-main-light);
  1021. line-height: 20px;
  1022. &:hover {
  1023. color: var(--el-color-primary);
  1024. }
  1025. }
  1026. }
  1027. }
  1028. }
  1029. }
  1030. }
  1031. </style>