Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

index.vue 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. <template>
  2. <div>
  3. <crud-template
  4. ref="crudRef"
  5. class="as-weight"
  6. :home-data="field"
  7. :tableData="tableData"
  8. @btnSearch="btnSearch"
  9. @handleEdit="handleEdit"
  10. @handleDelete="handleDelete"
  11. @cancel="cancel"
  12. @CurrentChange="handleCurrentChange"
  13. @refreshLeft="refreshLeft"
  14. @submit="submit"
  15. @add="Add"
  16. @importData="handleSuccess"
  17. >
  18. <template #search>
  19. <el-select
  20. clearable
  21. v-model="searchForm.serviceType"
  22. style="width: 180px"
  23. placeholder="请选择客服类别"
  24. filterable
  25. >
  26. <el-option
  27. v-for="item in serviceTypeOptinos"
  28. :key="item.value"
  29. :label="item.label"
  30. :value="item.value"
  31. />
  32. </el-select>
  33. <el-select
  34. clearable
  35. v-model="searchForm.businessType"
  36. style="width: 180px"
  37. placeholder="请选择业务类型"
  38. filterable
  39. >
  40. <el-option
  41. v-for="item in businessTypeList"
  42. :key="item.value"
  43. :label="item.label"
  44. :value="item.value"
  45. />
  46. </el-select>
  47. <el-input
  48. maxlength="60"
  49. v-trim
  50. clearable
  51. v-model="searchForm.category"
  52. style="width: 200px"
  53. placeholder="请输入类别"
  54. />
  55. <el-input
  56. maxlength="60"
  57. v-trim
  58. clearable
  59. v-model="searchForm.key"
  60. style="width: 200px"
  61. placeholder="请输入关键字"
  62. />
  63. <el-input
  64. maxlength="60"
  65. v-trim
  66. clearable
  67. v-model="searchForm.knowledgeId"
  68. style="width: 200px"
  69. placeholder="请输入编号"
  70. />
  71. </template>
  72. <template #searchCustomButton>
  73. <el-button type="primary" @click="handleEmptyFeedback(0)">
  74. 无内容反馈
  75. </el-button>
  76. </template>
  77. <template #operation="{ scope }">
  78. <el-button
  79. type="primary"
  80. size="small"
  81. @click="handleEmptyFeedback(1, scope)"
  82. >
  83. 反馈
  84. </el-button>
  85. </template>
  86. </crud-template>
  87. <FeedBackDialog
  88. v-model="feedBackShow"
  89. :serviceTypeOptinos="serviceTypeOptinos"
  90. :businessTypeList="businessTypeList"
  91. @handleSubmit="handleSubmit"
  92. :feedBackType="feedBackType"
  93. />
  94. </div>
  95. </template>
  96. <!-- 知识库 -->
  97. <script setup lang="ts">
  98. import { ref, toRaw, onMounted, computed } from 'vue'
  99. // @ts-ignore crudFrom模板
  100. import CrudTemplate from '@/crud/index.vue'
  101. import $storeinitData from '@/store/initData' //引入tab vuex
  102. import BaseService from '@/utils/baseService' //引入接口请求
  103. import { msg, typeTy } from '@/utils/msg' //引入接口请求
  104. import { ElMessage } from 'element-plus' //提示
  105. import { useRoute } from 'vue-router'
  106. import { IsPermission } from '@/router/routerUtil'
  107. import FeedBackDialog from './components/FeedBackDialog.vue'
  108. const route = useRoute()
  109. const crudRef = ref()
  110. //问题类型
  111. let serviceTypeOptinos = [
  112. {
  113. label: '一线',
  114. value: 1,
  115. },
  116. {
  117. label: '二线',
  118. value: 2,
  119. },
  120. ]
  121. //查询参数
  122. const searchForm = ref<any>({
  123. serviceType: '', //客服类别
  124. key: '', //关键字
  125. category: '', //类别
  126. businessType: '', //业务类型
  127. knowledgeId: '', //编号
  128. })
  129. let tableData: any = ref([])
  130. const typeOption = ref('')
  131. onMounted(() => {
  132. // getList()
  133. getBusinessType()
  134. })
  135. // 搜索按钮
  136. function btnSearch() {
  137. field.value.paging.currentPage = 1
  138. getList()
  139. }
  140. // 编辑按钮
  141. function handleEdit(idx: any, row: any) {
  142. typeOption.value = 'edit'
  143. }
  144. // 删除按钮
  145. function handleDelete(idx: any, row: any) {
  146. const data = {
  147. id: row.id,
  148. }
  149. BaseService.post('/managew/knowledgebase/deleteById', data).then(
  150. (res: any) => {
  151. if (res && res.code === 0) {
  152. ElMessage.success('操作成功')
  153. getList()
  154. cancel()
  155. } else {
  156. ElMessage.error(res.message)
  157. }
  158. }
  159. )
  160. }
  161. //添加
  162. function Add() {
  163. typeOption.value = 'add'
  164. }
  165. // 取消
  166. function cancel() {
  167. crudRef.value.reset()
  168. crudRef.value.dialogFormVisible = false
  169. }
  170. //分页
  171. function handleCurrentChange(val: number) {
  172. field.value.paging.currentPage = val
  173. getList()
  174. }
  175. // 搜索重置
  176. function refreshLeft() {
  177. searchForm.value = {
  178. problemName: '', //问题内容
  179. problemType: '', //解决方案
  180. }
  181. field.value.paging.currentPage = 1
  182. getList()
  183. }
  184. //编辑与添加提交
  185. function submit(data: any) {
  186. let api = '/managew/knowledgebase/add'
  187. if (typeOption.value === 'edit') {
  188. api = '/managew/knowledgebase/updateById'
  189. }
  190. BaseService.post(api, data).then((res: any) => {
  191. if (res && res.code === 0) {
  192. let bizContent = res.data
  193. ElMessage.success('操作成功')
  194. getList()
  195. cancel()
  196. } else {
  197. ElMessage.error(res.message)
  198. }
  199. })
  200. }
  201. //获取列表
  202. function getList() {
  203. let errTxt = ''
  204. if (!searchForm.value.serviceType) {
  205. errTxt = '客服类别'
  206. }
  207. if (!searchForm.value.businessType) {
  208. errTxt = errTxt ? errTxt + '和' : errTxt
  209. errTxt += '业务类型'
  210. }
  211. if (errTxt) {
  212. msg(`请选择 ${errTxt} 后再次点击搜索`, typeTy.warning)
  213. return
  214. }
  215. crudRef.value.tableLoding = true
  216. let params: any = {
  217. methods: 'page',
  218. pageNo: field.value.paging.currentPage,
  219. pageSize: field.value.paging.pageSize,
  220. }
  221. let searchFormList = { ...searchForm.value }
  222. for (let key in searchFormList) {
  223. if (searchFormList[key]) {
  224. params[key] = searchFormList[key]
  225. }
  226. }
  227. BaseService.post(
  228. '/iaw/app/issue/knowledgebase/queryProblemPage',
  229. params
  230. ).then((res: any) => {
  231. if (res && res.code === 0) {
  232. //数据转换
  233. let bizContent = res.data
  234. let data = bizContent.result || []
  235. //数据渲染
  236. tableData.value = data
  237. crudRef.value.tableLoding = false
  238. //分页总数
  239. field.value.paging.total = bizContent.totalCount
  240. console.log(bizContent, 'getList')
  241. } else {
  242. crudRef.value.tableLoding = false
  243. ElMessage.error(res.message)
  244. }
  245. })
  246. }
  247. //获取所有业务类型
  248. const businessTypeList = ref<any>([])
  249. function getBusinessType() {
  250. BaseService.post('/iaw/app/issue/knowledgebase/getBusinessType', {}).then(
  251. (res: any) => {
  252. if (res && res.code === 0) {
  253. //数据转换
  254. let bizContent = res.data
  255. businessTypeList.value = bizContent.map((item) => {
  256. return {
  257. label: item,
  258. value: item,
  259. }
  260. })
  261. console.log(bizContent, 'bizContent')
  262. } else {
  263. crudRef.value.tableLoding = false
  264. ElMessage.error(res.message)
  265. }
  266. }
  267. )
  268. }
  269. const feedBackShow = ref(false)
  270. const feedBackType = ref(0)
  271. const currentData = ref({})
  272. // 无内容反馈
  273. function handleEmptyFeedback(keys, scope) {
  274. feedBackType.value = keys
  275. feedBackShow.value = true
  276. if (keys === 1) {
  277. currentData.value = scope.row
  278. }
  279. }
  280. function handleSubmit(data) {
  281. if (feedBackType.value === 0) {
  282. getFeedBackNo(data)
  283. } else {
  284. getFeedBack(data)
  285. }
  286. }
  287. function getFeedBackNo(data) {
  288. BaseService.post('/iaw/app/issue/knowledgebase/addFeedBackNo', data).then(
  289. (res: any) => {
  290. if (res && res.code === 0) {
  291. ElMessage.success('操作成功')
  292. feedBackShow.value = false
  293. getList()
  294. cancel()
  295. } else {
  296. ElMessage.error(res.message)
  297. }
  298. }
  299. )
  300. }
  301. function getFeedBack(data) {
  302. let params = {
  303. ...data,
  304. knowledgeId: currentData.value.knowledgeId,
  305. }
  306. BaseService.post('/iaw/app/issue/knowledgebase/addFeedBack', data).then(
  307. (res: any) => {
  308. if (res && res.code === 0) {
  309. ElMessage.success('操作成功')
  310. feedBackShow.value = false
  311. getList()
  312. cancel()
  313. } else {
  314. ElMessage.error(res.message)
  315. }
  316. }
  317. )
  318. }
  319. //表单数据配置
  320. let field = ref({
  321. border: true, //是否添加边框(默认false)
  322. searchShow: IsPermission(route, 'QUERY_BASE'), //搜索展示
  323. paginStart: true, //是否显示分页查询 (默认false)
  324. operateTitle: '操作', //操作栏标题(默认为"")
  325. operate: {
  326. edit: false, //是否编辑(默认true)
  327. delete: IsPermission(route, 'DEL_LIST'), //是否删除(默认true)
  328. info: IsPermission(route, 'INFO_LIST'), // 详情
  329. remark: false, // 详情
  330. announcement: false, // 公告
  331. forbidden: false, // 禁用
  332. enable: false, // 启用
  333. authorization: false, // 授权
  334. cancel: false, // 取消订单
  335. isToLead: true, // 导入
  336. },
  337. searchOperation: {
  338. isToLead: true, //导入
  339. isTemplate: true,
  340. uploadBtnName: '导入',
  341. templateUrl:
  342. import.meta.env.VITE_APP_UPLOAD_URL +
  343. 'sett-minio/template/线上营业厅/知识库问题导入模板.xlsx',
  344. templateFileName: '知识库问题导入模板',
  345. },
  346. crud: {
  347. add: IsPermission(route, 'ADD_BASE'),
  348. },
  349. tableSize: -1,
  350. paging: {
  351. pageSize: 10,
  352. currentPage: 1,
  353. total: 0,
  354. },
  355. extend: [
  356. {
  357. label: '序号',
  358. type: 'index',
  359. width: '80px',
  360. },
  361. ],
  362. field: [
  363. {
  364. prop: 'serviceType',
  365. label: '客服类别',
  366. listData: serviceTypeOptinos,
  367. form: {
  368. type: 'input',
  369. required: true,
  370. listData: serviceTypeOptinos,
  371. },
  372. },
  373. {
  374. prop: 'businessType',
  375. label: '业务类型',
  376. listData: businessTypeList,
  377. form: {
  378. type: 'input',
  379. required: true,
  380. listData: businessTypeList,
  381. },
  382. },
  383. {
  384. prop: 'category',
  385. label: '类别',
  386. form: {
  387. type: 'input',
  388. required: true,
  389. },
  390. },
  391. {
  392. prop: 'level4',
  393. label: 'level4',
  394. form: {
  395. type: 'input',
  396. required: true,
  397. },
  398. },
  399. {
  400. prop: 'level5',
  401. label: 'level5',
  402. form: {
  403. type: 'input',
  404. required: true,
  405. },
  406. },
  407. {
  408. prop: 'level6',
  409. label: 'level6',
  410. form: {
  411. type: 'input',
  412. required: true,
  413. },
  414. },
  415. {
  416. prop: 'level7',
  417. label: 'level7',
  418. form: {
  419. type: 'input',
  420. required: true,
  421. },
  422. },
  423. {
  424. prop: 'level8',
  425. label: 'level8',
  426. form: {
  427. type: 'input',
  428. required: true,
  429. },
  430. },
  431. {
  432. prop: 'level9',
  433. label: 'level9',
  434. form: {
  435. type: 'input',
  436. required: true,
  437. },
  438. },
  439. {
  440. prop: 'level10',
  441. label: 'level10',
  442. form: {
  443. type: 'input',
  444. required: true,
  445. },
  446. },
  447. {
  448. prop: 'level11',
  449. label: 'level11',
  450. form: {
  451. type: 'input',
  452. required: true,
  453. },
  454. },
  455. {
  456. prop: 'level12',
  457. label: 'level12',
  458. form: {
  459. type: 'input',
  460. required: true,
  461. },
  462. },
  463. {
  464. prop: 'level13',
  465. label: 'level13',
  466. form: {
  467. type: 'input',
  468. required: true,
  469. },
  470. },
  471. {
  472. prop: 'level14',
  473. label: 'level14',
  474. form: {
  475. type: 'input',
  476. required: true,
  477. },
  478. },
  479. {
  480. prop: 'level15',
  481. label: 'level15',
  482. form: {
  483. type: 'input',
  484. required: true,
  485. },
  486. },
  487. {
  488. prop: 'level16',
  489. label: 'level16',
  490. form: {
  491. type: 'input',
  492. required: true,
  493. },
  494. },
  495. {
  496. prop: 'level17',
  497. label: 'level17',
  498. form: {
  499. type: 'input',
  500. required: true,
  501. },
  502. },
  503. {
  504. prop: 'level18',
  505. label: 'level18',
  506. form: {
  507. type: 'input',
  508. required: true,
  509. },
  510. },
  511. {
  512. prop: 'level19',
  513. label: 'level19',
  514. form: {
  515. type: 'input',
  516. required: true,
  517. },
  518. },
  519. {
  520. prop: 'level20',
  521. label: 'level20',
  522. form: {
  523. type: 'input',
  524. required: true,
  525. },
  526. },
  527. {
  528. prop: 'level21',
  529. label: 'level21',
  530. form: {
  531. type: 'input',
  532. required: true,
  533. },
  534. },
  535. {
  536. prop: 'level22',
  537. label: 'level22',
  538. form: {
  539. type: 'input',
  540. required: true,
  541. },
  542. },
  543. {
  544. prop: 'level23',
  545. label: 'level23',
  546. form: {
  547. type: 'input',
  548. // required: true,
  549. },
  550. },
  551. {
  552. prop: 'level24',
  553. label: 'level24',
  554. form: {
  555. type: 'input',
  556. // required: true,
  557. },
  558. },
  559. {
  560. prop: 'level25',
  561. label: 'level25',
  562. form: {
  563. type: 'input',
  564. // required: true,
  565. },
  566. },
  567. {
  568. prop: 'level26',
  569. label: 'level26',
  570. form: {
  571. type: 'input',
  572. // required: true,
  573. },
  574. },
  575. {
  576. prop: 'level27',
  577. label: 'level27',
  578. form: {
  579. type: 'input',
  580. // required: true,
  581. },
  582. },
  583. {
  584. prop: 'level28',
  585. label: 'level28',
  586. form: {
  587. type: 'input',
  588. // required: true,
  589. },
  590. },
  591. {
  592. prop: 'level29',
  593. label: 'level29',
  594. form: {
  595. type: 'input',
  596. // required: true,
  597. },
  598. },
  599. {
  600. prop: 'level30',
  601. label: 'level30',
  602. form: {
  603. type: 'input',
  604. // required: true,
  605. },
  606. },
  607. ],
  608. })
  609. /***********上传下载**************/
  610. import { importFn } from '@/views/settlement/exportFn'
  611. // 文件上传到minio后触发
  612. const handleSuccess = (excelFileUrl: any, reportFileName: any) => {
  613. importFn(
  614. '/managew/knowledgebase/importSchemeFile',
  615. () => {
  616. getList()
  617. },
  618. {
  619. url: excelFileUrl,
  620. }
  621. )
  622. }
  623. </script>
  624. <style lang="scss" scoped></style>