index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  1. <template>
  2. <div class="case-index-container layout-padding">
  3. <div class="layout-padding-auto layout-padding-view pd20">
  4. <splitpanes class="h100" :horizontal="horizontal">
  5. <pane min-size="16" max-size="25" size="16">
  6. <el-scrollbar ref="scrollBarRef" noresiz>
  7. <el-skeleton :loading="state.typeLoading" animated :rows="10">
  8. <template #default>
  9. <v-tree-search
  10. :data="state.typeOptions"
  11. titleField="name"
  12. keyField="id"
  13. selectable
  14. searchPlaceholder="案例分类名称"
  15. @select="selectType"
  16. @unselect="unSelectType"
  17. ref="treeSearchRef"
  18. >
  19. <template #node="{ node }">
  20. <span>{{ node.name }}</span>
  21. </template>
  22. </v-tree-search>
  23. </template>
  24. </el-skeleton>
  25. </el-scrollbar>
  26. </pane>
  27. <pane class="h100" style="display: flex; flex: 1; flex-direction: column">
  28. <el-tabs v-model="state.queryParams.Status" @tab-change="handleClick" v-loading="state.loading">
  29. <el-tab-pane :label="v.value" :name="v.key" v-for="(v, i) in state.statusOptions" :key="i" :disabled="state.tableLoading"></el-tab-pane>
  30. </el-tabs>
  31. <el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent>
  32. <el-form-item label="标题" prop="Title">
  33. <el-input v-model="state.queryParams.Title" placeholder="标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
  34. </el-form-item>
  35. <el-form-item label="创建时间" prop="cjTime">
  36. <el-date-picker
  37. v-model="state.queryParams.cjTime"
  38. type="datetimerange"
  39. unlink-panels
  40. range-separator="至"
  41. start-placeholder="开始时间"
  42. end-placeholder="结束时间"
  43. :shortcuts="shortcuts"
  44. @change="handleQuery"
  45. value-format="YYYY-MM-DD[T]HH:mm:ss"
  46. :default-time="defaultTimeStartEnd"
  47. />
  48. </el-form-item>
  49. <el-form-item label="" prop="IsPopular">
  50. <el-checkbox v-model="state.queryParams.IsPopular" border @change="handleQuery">热门案例</el-checkbox>
  51. </el-form-item>
  52. <el-form-item>
  53. <el-button type="primary" @click="handleQuery" :loading="state.tableLoading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  54. <el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
  55. </el-form-item>
  56. </el-form>
  57. <vxe-toolbar
  58. ref="toolbarRef"
  59. :loading="state.tableLoading"
  60. custom
  61. :refresh="{
  62. queryMethod: handleQuery,
  63. }"
  64. :tools="[{ toolRender: { name: 'exportCurrent' } }, { toolRender: { name: 'exportAll' } }]"
  65. >
  66. <template #buttons>
  67. <el-button type="primary" @click="onAdd" v-auth="'case:index:add'" :loading="state.tableLoading">
  68. <SvgIcon name="ele-Plus" class="mr5" />创建案例
  69. </el-button>
  70. <el-dropdown v-auth="'case:index:export:detail'" @command="onExportDetail" class="ml12 mr12" :disabled="isChecked">
  71. <el-button type="primary" :disabled="isChecked" :loading="state.tableLoading">
  72. 导出案例详情<SvgIcon name="ele-ArrowDown" class="ml3" />
  73. </el-button>
  74. <template #dropdown>
  75. <el-dropdown-menu>
  76. <el-dropdown-item :command="item.key" v-for="item in exportType" :key="item.key">{{ item.value }}</el-dropdown-item>
  77. </el-dropdown-menu>
  78. </template>
  79. </el-dropdown>
  80. <el-button type="primary" :disabled="isChecked" :loading="state.tableLoading" v-auth="'case:index:hot'" @click="setHot">
  81. 设为热门案例
  82. </el-button>
  83. <el-button type="primary" :disabled="isChecked" :loading="state.tableLoading" v-auth="'case:index:unHot'" @click="cancelHot">
  84. 取消热门案例
  85. </el-button>
  86. </template>
  87. </vxe-toolbar>
  88. <div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
  89. <vxe-table
  90. border
  91. :loading="state.tableLoading"
  92. :data="state.tableData"
  93. :column-config="{ resizable: true }"
  94. :row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
  95. ref="tableRef"
  96. height="auto"
  97. auto-resize
  98. show-overflow
  99. :print-config="{}"
  100. :scrollY="{ enabled: true, gt: 100 }"
  101. id="caseManage"
  102. :custom-config="{ storage: true }"
  103. showHeaderOverflow
  104. :params="{ exportMethod: getCaseExport, exportParams: requestParams }"
  105. @checkbox-all="selectAllChangeEvent"
  106. @checkbox-change="selectChangeEvent"
  107. >
  108. <vxe-column type="checkbox" width="50" align="center"></vxe-column>
  109. <vxe-column field="title" title="标题" min-width="200">
  110. <template #default="{ row }">
  111. <el-button link type="primary" @click="onPreview(row)">{{ row.title }}</el-button>
  112. </template>
  113. </vxe-column>
  114. <vxe-column field="caseTypeText" title="案例分类" width="150"></vxe-column>
  115. <vxe-column field="orderTitle" title="关联工单" width="160">
  116. <template #default="{ row }">
  117. <order-detail :order="{ id: row.orderId }">{{ row.orderTitle }}</order-detail>
  118. </template>
  119. </vxe-column>
  120. <vxe-column field="knowledgeTitle" title="关联知识" width="160">
  121. <template #default="{ row }">
  122. <el-button link type="primary" @click="onPreviewKnowledge(row)">{{ row.knowledgeTitle }}</el-button>
  123. </template>
  124. </vxe-column>
  125. <vxe-column field="keywords" title="关键词" width="150"></vxe-column>
  126. <vxe-column field="statusName" title="案例状态" width="110"></vxe-column>
  127. <vxe-column field="pageView" title="阅读次数" width="100"></vxe-column>
  128. <vxe-column field="onShelfTime" title="上架时间" width="160">
  129. <template #default="{ row }">
  130. {{ formatDate(row.onShelfTime, 'YYYY-mm-dd HH:MM:SS') }}
  131. </template>
  132. </vxe-column>
  133. <vxe-column field="offShelfTime" title="下架时间" width="160">
  134. <template #default="{ row }">
  135. {{ formatDate(row.offShelfTime, 'YYYY-mm-dd HH:MM:SS') }}
  136. </template>
  137. </vxe-column>
  138. <vxe-column field="expiredTime" title="到期时间" width="160">
  139. <template #default="{ row }">
  140. {{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
  141. </template>
  142. </vxe-column>
  143. <vxe-column field="creatorName" title="创建人" width="120"></vxe-column>
  144. <vxe-column field="creatorOrgName" title="创建部门" width="150"></vxe-column>
  145. <vxe-column field="creationTime" title="创建时间" width="160">
  146. <template #default="{ row }">
  147. {{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
  148. </template>
  149. </vxe-column>
  150. <vxe-column field="examinMan.name" title="审批人" width="120"></vxe-column>
  151. <vxe-column field="examinTime" title="审批时间" width="160">
  152. <template #default="{ row }">
  153. {{ formatDate(row.examinTime, 'YYYY-mm-dd HH:MM:SS') }}
  154. </template>
  155. </vxe-column>
  156. <vxe-column field="examinOpinion" title="审批意见" width="200"></vxe-column>
  157. <vxe-column title="操作" fixed="right" width="250" align="center">
  158. <template #default="{ row }">
  159. <el-button link type="primary" @click="onEdit(row)" title="编辑" v-auth="'case:index:edit'" v-if="[4, 7, 5].includes(row.status)">
  160. 编辑
  161. </el-button>
  162. <el-button
  163. link
  164. type="danger"
  165. @click="onRowDel(row)"
  166. title="删除"
  167. v-auth="'case:index:delete'"
  168. v-if="[4, 7, 5].includes(row.status)"
  169. >
  170. 删除
  171. </el-button>
  172. <el-button
  173. link
  174. type="primary"
  175. @click="offShelfFn(row)"
  176. title="下架"
  177. v-auth="'case:index:undercarriage'"
  178. v-if="[3].includes(row.status)"
  179. >
  180. 下架
  181. </el-button>
  182. <el-button
  183. link
  184. type="primary"
  185. @click="groundingFn(row)"
  186. title="上架"
  187. v-auth="'case:index:grounding'"
  188. v-if="[4].includes(row.status)"
  189. >
  190. 上架
  191. </el-button>
  192. <el-button link type="primary" @click="onAudit(row)" title="审批" v-if="[1].includes(row.status)" v-auth="'case:index:audit'">
  193. 审批
  194. </el-button>
  195. <el-button link type="primary" @click="onPreview(row)" title="查看"> 查看 </el-button>
  196. </template>
  197. </vxe-column>
  198. </vxe-table>
  199. </div>
  200. <pagination
  201. @pagination="queryList"
  202. :total="state.total"
  203. v-model:current-page="state.queryParams.PageIndex"
  204. v-model:page-size="state.queryParams.PageSize"
  205. :disabled="state.tableLoading"
  206. />
  207. </pane>
  208. </splitpanes>
  209. </div>
  210. <!-- 更多查询 -->
  211. <el-drawer v-model="drawer" title="更多查询" size="500px">
  212. <el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px">
  213. <el-form-item label="上架时间" prop="sjTime">
  214. <el-date-picker
  215. v-model="state.queryParams.sjTime"
  216. type="datetimerange"
  217. unlink-panels
  218. range-separator="至"
  219. start-placeholder="开始时间"
  220. end-placeholder="结束时间"
  221. :shortcuts="shortcuts"
  222. @change="handleQuery"
  223. value-format="YYYY-MM-DD[T]HH:mm:ss"
  224. :default-time="defaultTimeStartEnd"
  225. />
  226. </el-form-item>
  227. <el-form-item label="下架时间" prop="xjTime">
  228. <el-date-picker
  229. v-model="state.queryParams.xjTime"
  230. type="datetimerange"
  231. unlink-panels
  232. range-separator="至"
  233. start-placeholder="开始时间"
  234. end-placeholder="结束时间"
  235. :shortcuts="shortcuts"
  236. @change="handleQuery"
  237. value-format="YYYY-MM-DD[T]HH:mm:ss"
  238. :default-time="defaultTimeStartEnd"
  239. />
  240. </el-form-item>
  241. <el-form-item label="更新时间" prop="gxTime">
  242. <el-date-picker
  243. v-model="state.queryParams.gxTime"
  244. type="datetimerange"
  245. unlink-panels
  246. range-separator="至"
  247. start-placeholder="开始时间"
  248. end-placeholder="结束时间"
  249. :shortcuts="shortcuts"
  250. @change="handleQuery"
  251. value-format="YYYY-MM-DD[T]HH:mm:ss"
  252. :default-time="defaultTimeStartEnd"
  253. />
  254. </el-form-item>
  255. </el-form>
  256. <template #footer>
  257. <el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  258. <el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
  259. </template>
  260. </el-drawer>
  261. <!-- 流程审批 -->
  262. <process-audit ref="processAuditRef" @orderProcessSuccess="queryList" />
  263. <!-- 审核记录 -->
  264. <audit-progress ref="auditProgressRef" />
  265. <!-- 批量审批 -->
  266. <to-end ref="toEndRef" @updateList="queryList" />
  267. <!-- 删除或者更新提交审核 -->
  268. <case-audit ref="caseAuditRef" @updateList="handleQuery" />
  269. <!-- 删除或者更新提交审核 -->
  270. <edit-submit-audit ref="editSubmitAuditRef" @updateList="handleQuery" />
  271. </div>
  272. </template>
  273. <script lang="tsx" setup name="caseManage">
  274. import { ref, reactive, onMounted, defineAsyncComponent, computed } from 'vue';
  275. import { ElMessageBox, ElMessage } from 'element-plus';
  276. import { useRouter } from 'vue-router';
  277. import type { FormInstance } from 'element-plus';
  278. import { formatDate } from '@/utils/formatTime';
  279. import { Splitpanes, Pane } from 'splitpanes';
  280. import 'splitpanes/dist/splitpanes.css';
  281. import Other from '@/utils/other';
  282. import { downloadFileByStream } from '@/utils/tools';
  283. import { VxeUI } from 'vxe-pc-ui';
  284. import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
  285. import { VTreeSearch } from '@wsfe/vue-tree';
  286. import { caseTreeList } from '@/api/case/type';
  287. import { caseDetailExport, caseHot, caseOffShelf, caseOnShelf, getCaseBaseData, getCaseExport, getCaseList } from '@/api/case';
  288. // 引入组件
  289. const ProcessAudit = defineAsyncComponent(() => import('@/components/ProcessAudit/index.vue')); // 流程审批
  290. const AuditProgress = defineAsyncComponent(() => import('@/views/knowledge/components/Audit-progress.vue')); // 编写规范
  291. const ToEnd = defineAsyncComponent(() => import('@/views/knowledge/index/components/To-end.vue')); // 批量审批
  292. const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
  293. const CaseAudit = defineAsyncComponent(() => import('@/views/case/index/components/Case-audit.vue')); // 审批新增 修改 删除
  294. const EditSubmitAudit = defineAsyncComponent(() => import('@/views/case/index/components/Edit-submit-audit.vue')); // 删除或者更新 提交审核
  295. const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
  296. const router = useRouter(); //路由
  297. const horizontal = ref(false);
  298. // 定义变量内容
  299. const state = reactive<any>({
  300. queryParams: {
  301. PageIndex: 1, //页码
  302. PageSize: 20, //每页条数
  303. Keyword: null, //关键字
  304. Status: 3, //状态 默认已上架
  305. Title: null, //标题
  306. sjTime: [], // 上架时间
  307. StartOnShelfTime: null,
  308. EndOnShelfTime: null,
  309. xjTime: [], // 下架时间
  310. StartOffShelfTime: null,
  311. EndOffShelfTime: null,
  312. cjTime: [], // 创建时间
  313. CreationStartTime: null,
  314. CreationEndTime: null,
  315. gxTime: [], // 更新时间
  316. StartUpdateTime: null,
  317. EndUpdateTime: null,
  318. IsPopular: null, // 是否热门
  319. },
  320. activeName: '1', //tab切换 默认案例分类
  321. tableData: [], //表格数据
  322. total: 0, //总条数
  323. loading: false, //表格loading
  324. tableLoading: false, //表格loading
  325. typeOptions: [], // 类型数据
  326. statusOptions: [], //状态数据
  327. typeLoading: false, // 类型loading
  328. });
  329. // 切换tab 查询列表
  330. const handleClick = () => {
  331. state.queryParams.PageIndex = 1;
  332. queryList();
  333. };
  334. /** 搜索按钮操作 节流操作 */
  335. const handleQuery = () => {
  336. state.queryParams.PageIndex = 1;
  337. queryList();
  338. };
  339. // 获取案例分类
  340. const getCaseType = async () => {
  341. state.typeLoading = true;
  342. try {
  343. const { result } = await caseTreeList({ IsEnable: true });
  344. state.typeOptions = result ?? [];
  345. state.typeLoading = false;
  346. } catch (error) {
  347. state.typeLoading = false;
  348. }
  349. };
  350. const exportType = ref<EmptyArrayType>([]);
  351. const getBaseDataFn = async () => {
  352. try {
  353. const { result } = await getCaseBaseData();
  354. state.statusOptions = result?.tabStatusName ?? []; // 列表状态
  355. exportType.value = result?.fileType ?? []; // 导出文件类型
  356. state.loading = false;
  357. } catch (error) {
  358. state.loading = false;
  359. }
  360. };
  361. /** 获取列表 */
  362. const requestParams = ref<EmptyObjectType>({});
  363. const queryList = () => {
  364. state.tableLoading = true;
  365. requestParams.value = Other.deepClone(state.queryParams);
  366. requestParams.value.StartOnShelfTime = state.queryParams.sjTime === null ? null : state.queryParams.sjTime[0]; // 上架时间
  367. requestParams.value.EndOnShelfTime = state.queryParams.sjTime === null ? null : state.queryParams.sjTime[1];
  368. Reflect.deleteProperty(requestParams.value, 'sjTime'); // 删除无用的参数
  369. requestParams.value.StartOffShelfTime = state.queryParams.xjTime === null ? null : state.queryParams.xjTime[0]; // 受理时间
  370. requestParams.value.EndOffShelfTime = state.queryParams.xjTime === null ? null : state.queryParams.xjTime[1]; //下架时间
  371. Reflect.deleteProperty(requestParams.value, 'xjTime'); // 删除无用的参数
  372. requestParams.value.CreationStartTime = state.queryParams.cjTime === null ? null : state.queryParams.cjTime[0]; // 创建时间
  373. requestParams.value.CreationEndTime = state.queryParams.cjTime === null ? null : state.queryParams.cjTime[1];
  374. Reflect.deleteProperty(requestParams.value, 'cjTime'); // 删除无用的参数
  375. requestParams.value.StartUpdateTime = state.queryParams.gxTime === null ? null : state.queryParams.gxTime[0]; // 更新时间
  376. requestParams.value.EndUpdateTime = state.queryParams.gxTime === null ? null : state.queryParams.gxTime[1];
  377. Reflect.deleteProperty(requestParams.value, 'gxTime'); // 删除无用的参数
  378. getCaseList(requestParams.value)
  379. .then((response: any) => {
  380. state.tableData = response?.result.items ?? [];
  381. state.total = response?.result.total;
  382. tableRef.value.clearCheckboxRow();
  383. checkTable.value = [];
  384. state.tableLoading = false;
  385. })
  386. .catch(() => {
  387. tableRef.value.clearCheckboxRow();
  388. checkTable.value = [];
  389. state.tableLoading = false;
  390. });
  391. };
  392. // 选择分类
  393. const selectType = (data: any) => {
  394. state.queryParams.CaseTypeID = data.id;
  395. handleQuery();
  396. };
  397. // 取消选择
  398. const unSelectType = () => {
  399. state.queryParams.CaseTypeID = null;
  400. handleQuery();
  401. };
  402. /** 重置按钮操作 */
  403. const drawerRuleFormRef = ref();
  404. const ruleFormRef = ref<RefType>(); // 表单ref
  405. const drawer = ref(false);
  406. const treeSearchRef = ref<RefType>();
  407. const resetQuery = (formEl: FormInstance | undefined) => {
  408. if (!formEl) return;
  409. formEl.resetFields();
  410. ruleFormRef.value?.resetFields();
  411. treeSearchRef.value.setSelected(state.queryParams.OrgCode, false); // 清空选择
  412. treeSearchRef.value.clearKeyword(); // 清空搜索关键词
  413. treeSearchRef.value.search(); // 搜索
  414. resetNode();
  415. setTimeout(() => {
  416. treeSearchRef.value.setExpandAll(false); // 默认全部收起
  417. }, 300);
  418. };
  419. // 重置选中的节点
  420. const resetNode = () => {
  421. state.queryParams.CaseTypeID = null;
  422. handleQuery();
  423. };
  424. // 新增案例
  425. const onAdd = () => {
  426. router.push({
  427. name: 'caseEdit',
  428. params: {
  429. tagsViewName: '新增案例',
  430. },
  431. });
  432. };
  433. // 修改
  434. const onEdit = (row: any) => {
  435. router.push({
  436. name: 'caseEdit',
  437. params: {
  438. id: row.id,
  439. tagsViewName: '编辑案例',
  440. },
  441. });
  442. };
  443. // 预览
  444. const onPreview = (row: any) => {
  445. router.push({
  446. name: 'casePreview',
  447. params: {
  448. id: row.id,
  449. tagsViewName: row.title,
  450. },
  451. });
  452. };
  453. // 预览知识库
  454. const onPreviewKnowledge = (row: any) => {
  455. router.push({
  456. name: 'knowledgePreview',
  457. params: {
  458. id: row.knowledgeId,
  459. tagsViewName: row.knowledgeTitle,
  460. },
  461. });
  462. };
  463. // 审批
  464. const caseAuditRef = ref<RefType>();
  465. const onAudit = (row: any) => {
  466. caseAuditRef.value.openDialog(row);
  467. };
  468. // 下架
  469. const offShelfFn = (row: any) => {
  470. ElMessageBox.confirm(`是否确定要下架【${row.title}】?,案例下架后,将不会被检索到!`, '提示', {
  471. confirmButtonText: '确认',
  472. cancelButtonText: '取消',
  473. type: 'warning',
  474. draggable: true,
  475. cancelButtonClass: 'default-button',
  476. })
  477. .then(() => {
  478. caseOffShelf(row.id).then(() => {
  479. ElMessage.success('下架成功');
  480. handleQuery();
  481. });
  482. })
  483. .catch(() => {});
  484. };
  485. // 上架
  486. const groundingFn = (row: any) => {
  487. ElMessageBox.confirm(`是否确定要上架【${row.title}】?`, '提示', {
  488. confirmButtonText: '确认',
  489. cancelButtonText: '取消',
  490. type: 'warning',
  491. draggable: true,
  492. cancelButtonClass: 'default-button',
  493. })
  494. .then(() => {
  495. caseOnShelf(row.id).then(() => {
  496. ElMessage.success('上架成功');
  497. handleQuery();
  498. });
  499. })
  500. .catch(() => {});
  501. };
  502. // 删除案例
  503. const editSubmitAuditRef = ref<RefType>();
  504. const onRowDel = (row: any) => {
  505. editSubmitAuditRef.value.openDialog(row, 'delete');
  506. };
  507. // 导出详情
  508. const onExportDetail = (command: string | number | object) => {
  509. state.loading = true;
  510. const ids = checkTable.value.map((item: any) => item.id);
  511. VxeUI.modal.message({
  512. content: `导出中,请稍等`,
  513. status: 'loading',
  514. id: 'exportDetail',
  515. duration: -1,
  516. });
  517. caseDetailExport({ ids, fileType: command })
  518. .then((res: any) => {
  519. downloadFileByStream(res);
  520. state.loading = false;
  521. VxeUI.modal.close('exportDetail');
  522. VxeUI.modal.message({
  523. content: `导出成功`,
  524. status: 'success',
  525. });
  526. })
  527. .catch((e) => {
  528. console.log(e, '导出错误');
  529. state.loading = false;
  530. VxeUI.modal.close('exportDetail');
  531. VxeUI.modal.message({
  532. content: `导出失败`,
  533. status: 'error',
  534. });
  535. });
  536. };
  537. const tableRef = ref<RefType>();
  538. const checkTable = ref<EmptyArrayType>([]);
  539. const selectAllChangeEvent = ({ checked }) => {
  540. if (tableRef.value) {
  541. const records = tableRef.value.getCheckboxRecords();
  542. checkTable.value = records;
  543. console.log(checked ? '所有勾选事件' : '所有取消事件', records);
  544. }
  545. };
  546. const selectChangeEvent = ({ checked }) => {
  547. if (tableRef.value) {
  548. const records = tableRef.value.getCheckboxRecords();
  549. checkTable.value = records;
  550. console.log(checked ? '勾选事件' : '取消事件', records);
  551. }
  552. };
  553. const isChecked = computed(() => {
  554. return !Boolean(checkTable.value.length);
  555. });
  556. const toolbarRef = ref<RefType>();
  557. // 设置热门
  558. const setHot = () => {
  559. const ids = checkTable.value.map((item: any) => item.id);
  560. ElMessageBox.confirm(`确定要将选中的案例设置热门?`, '提示', {
  561. confirmButtonText: '确认',
  562. cancelButtonText: '取消',
  563. type: 'warning',
  564. draggable: true,
  565. cancelButtonClass: 'default-button',
  566. })
  567. .then(() => {
  568. caseHot({ ids: ids, Popular: true })
  569. .then(() => {
  570. ElMessage.success('设置成功');
  571. handleQuery();
  572. })
  573. .catch((e) => {
  574. console.log(e);
  575. });
  576. })
  577. .catch(() => {});
  578. };
  579. // 取消热门
  580. const cancelHot = () => {
  581. const ids = checkTable.value.map((item: any) => item.id);
  582. ElMessageBox.confirm(`确定要将选中的案例取消热门?`, '提示', {
  583. confirmButtonText: '确认',
  584. cancelButtonText: '取消',
  585. type: 'warning',
  586. draggable: true,
  587. cancelButtonClass: 'default-button',
  588. })
  589. .then(() => {
  590. caseHot({ ids: ids, Popular: false })
  591. .then(() => {
  592. ElMessage.success('设置成功');
  593. handleQuery();
  594. })
  595. .catch((e) => {
  596. console.log(e);
  597. });
  598. })
  599. .catch(() => {});
  600. };
  601. onMounted(() => {
  602. queryList();
  603. if (tableRef.value && toolbarRef.value) {
  604. tableRef.value.connect(toolbarRef.value);
  605. }
  606. getBaseDataFn();
  607. getCaseType();
  608. });
  609. </script>