index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. <template>
  2. <ContentWrap>
  3. <!-- 搜索工作栏 -->
  4. <el-form
  5. class="-mb-15px"
  6. :model="queryParams"
  7. ref="queryFormRef"
  8. :inline="true"
  9. label-width="68px"
  10. >
  11. <!-- 基本信息查询部分 -->
  12. <div class="flex flex-wrap items-start gap-x-2">
  13. <el-form-item label="单位名称" prop="unitName">
  14. <el-input
  15. v-model="queryParams.unitName"
  16. placeholder="请输入单位名称"
  17. clearable
  18. @keyup.enter="getList"
  19. class="!w-240px"
  20. />
  21. </el-form-item>
  22. <el-form-item label="单位地址" prop="unitAddress">
  23. <el-input
  24. v-model="queryParams.unitAddress"
  25. placeholder="请输入单位地址"
  26. clearable
  27. @keyup.enter="getList"
  28. class="!w-240px"
  29. />
  30. </el-form-item>
  31. <el-form-item label="设备代码" prop="equipCode">
  32. <el-input
  33. v-model="queryParams.equipCode"
  34. placeholder="请输入设备注册代码"
  35. clearable
  36. @keyup.enter="getList"
  37. class="!w-240px"
  38. />
  39. </el-form-item>
  40. <el-form-item label="部门" prop="relateDepartment">
  41. <DeptSelect
  42. v-model="queryParams.relateDepartment"
  43. placeholder="请选择部门"
  44. clearable
  45. class="!w-240px"
  46. />
  47. </el-form-item>
  48. </div>
  49. <!-- 区域和时间查询部分 -->
  50. <div class="flex flex-wrap items-start gap-x-2">
  51. <el-form-item label="区域" prop="equipDistrict">
  52. <AreaSelect
  53. v-model="queryParams.equipDistrict"
  54. placeholder="请选择区域"
  55. class="!w-[240px]"
  56. multiple
  57. collapse-tags
  58. collapse-tags-tooltip
  59. :clearable="true"
  60. @clear="handleAreaClear"
  61. @change="handleAreaChange"
  62. @area-type-change="handleAreaTypeChange"
  63. />
  64. </el-form-item>
  65. <el-form-item label="街道" prop="equipStreet">
  66. <StreetSelect
  67. v-model="queryParams.equipStreet"
  68. :district-ids="queryParams.equipDistrict"
  69. placeholder="请选择街道"
  70. class="!w-[240px]"
  71. multiple
  72. collapse-tags
  73. collapse-tags-tooltip
  74. :clearable="true"
  75. @clear="handleStreetClear"
  76. @change="handleStreetChange"
  77. />
  78. </el-form-item>
  79. <el-form-item label="使用状态" prop="useStatus">
  80. <el-select
  81. v-model="queryParams.useStatus"
  82. placeholder="选择使用状态"
  83. clearable
  84. multiple
  85. collapse-tags
  86. collapse-tags-tooltip
  87. class="!w-240px"
  88. >
  89. <el-option
  90. v-for="dict in getStrDictOptions(DICT_TYPE.SYSTEM_EQUIP_BOILER_STATUS)"
  91. :key="dict.value"
  92. :label="dict.label"
  93. :value="dict.value"
  94. />
  95. </el-select>
  96. </el-form-item>
  97. <el-form-item label="临检时间" prop="checkDate">
  98. <div class="flex items-center gap-x-2">
  99. <el-select v-model="datePickerType" class="!w-[90px]">
  100. <el-option label="时间段" value="daterange" />
  101. <el-option label="月份" value="month" />
  102. </el-select>
  103. <el-date-picker
  104. v-if="datePickerType === 'daterange'"
  105. v-model="daterange"
  106. type="daterange"
  107. value-format="YYYY-MM-DD"
  108. start-placeholder="开始日期"
  109. end-placeholder="结束日期"
  110. class="!w-[220px]"
  111. @change="handleDateChange"
  112. />
  113. <el-date-picker
  114. v-else
  115. v-model="month"
  116. type="month"
  117. value-format="YYYY-MM"
  118. placeholder="选择月份"
  119. class="!w-[150px]"
  120. @change="handleMonthChange"
  121. />
  122. </div>
  123. </el-form-item>
  124. </div>
  125. <!-- 锅炉相关查询条件 -->
  126. <div class="bg-gray-50 p-3 rounded mt-2">
  127. <el-form-item label="锅炉归类" prop="typeList" class="mb-2">
  128. <div class="flex items-center flex-1">
  129. <el-checkbox-group
  130. v-model="queryParams.typeList"
  131. class="flex flex-wrap gap-2"
  132. @change="handleTypeListChange"
  133. >
  134. <el-checkbox
  135. v-for="dict in containerTypeOptions"
  136. :key="dict.value"
  137. :label="dict.label"
  138. :value="dict.value"
  139. />
  140. </el-checkbox-group>
  141. </div>
  142. </el-form-item>
  143. </div>
  144. <!-- 操作按钮 -->
  145. <div class="flex justify-center mt-3">
  146. <el-form-item class="mb-0">
  147. <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
  148. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
  149. <el-button
  150. type="primary"
  151. v-if="source === 'pressure'"
  152. @click="handleBatchSchedule"
  153. :disabled="selectedRows.length === 0"
  154. >
  155. <Icon icon="ep:calendar" class="mr-5px" /> 批量排期
  156. </el-button>
  157. <el-button
  158. type="success"
  159. plain
  160. @click="handleExport"
  161. :loading="exportLoading"
  162. >
  163. <Icon icon="ep:download" class="mr-5px" /> 导出
  164. </el-button>
  165. </el-form-item>
  166. </div>
  167. </el-form>
  168. </ContentWrap>
  169. <!-- 列表 -->
  170. <ContentWrap>
  171. <el-table
  172. v-loading="loading"
  173. :data="list"
  174. stripe
  175. @selection-change="handleSelectionChange"
  176. @sort-change="handleSortChange"
  177. ref="tableRef"
  178. :cell-style="getCellStyle"
  179. border
  180. >
  181. <el-table-column v-if="source === 'pressure'" type="selection" width="30" />
  182. <el-table-column
  183. label="区域"
  184. align="center"
  185. prop="equipDistrictName"
  186. min-width="80"
  187. sortable="custom"
  188. />
  189. <el-table-column
  190. label="街道"
  191. align="center"
  192. prop="equipStreetName"
  193. min-width="100"
  194. sortable="custom"
  195. />
  196. <el-table-column label="使用单位名称" align="center" prop="unitName" min-width="180">
  197. <template #default="{ row }">
  198. <el-link
  199. type="primary"
  200. :underline="false"
  201. @click="handleEdit(row)"
  202. style="cursor: pointer"
  203. >
  204. {{ row.unitName }}
  205. </el-link>
  206. </template>
  207. </el-table-column>
  208. <el-table-column label="使用单位地址" align="center" prop="unitAddress" min-width="150" />
  209. <!-- 内部检验 -->
  210. <el-table-column
  211. label="内部检验"
  212. align="center"
  213. prop="nextInCheckDate"
  214. min-width="140"
  215. sortable="custom"
  216. >
  217. <template #default="{ row }">
  218. <!-- <div class="check-number regular-check">{{ row.countIn }}</div>-->
  219. <div v-if="row.nextInCheckDate !== null" :class="['text-sm']">
  220. {{ dayjs(row.nextInCheckDate).format('YYYY-MM-DD') }}
  221. </div>
  222. <div v-else class="text-xs text-gray-500">
  223. -
  224. </div>
  225. <div class="text-xs text-gray-400" v-if="hasPlanSchedule(row, 'in')">
  226. {{ row.planInCheckDate ? `(已排时间:${dayjs(row.planInCheckDate).format('YYYY-MM-DD')})` : '' }}
  227. </div>
  228. </template>
  229. </el-table-column>
  230. <!-- 外部检验 -->
  231. <el-table-column
  232. label="外部检验"
  233. align="center"
  234. prop="nextOutCheckDate"
  235. min-width="140"
  236. sortable="custom"
  237. >
  238. <template #default="{ row }">
  239. <!-- <div class="check-number year-check">{{ row.countOut }}</div>-->
  240. <div
  241. v-if="row.nextOutCheckDate !== null"
  242. :class="['text-sm']"
  243. >
  244. {{ dayjs(row.nextOutCheckDate).format('YYYY-MM-DD') }}
  245. </div>
  246. <div v-else class="text-xs text-gray-500">
  247. -
  248. </div>
  249. <div class="text-xs text-gray-400" v-if="hasPlanSchedule(row, 'out')">
  250. {{ row.planOutCheckDate ? `(已排时间:${dayjs(row.planOutCheckDate).format('YYYY-MM-DD')})` : '' }}
  251. </div>
  252. </template>
  253. </el-table-column>
  254. <!-- 耐压检验 -->
  255. <el-table-column
  256. label="耐压检验"
  257. align="center"
  258. prop="nextPressureCheckDate"
  259. min-width="140"
  260. sortable="custom"
  261. >
  262. <template #default="{ row }">
  263. <!-- <div class="check-number expired-check">{{ row.countOut }}</div>-->
  264. <div
  265. v-if="row.nextPressureCheckDate !== null"
  266. :class="['text-sm']"
  267. >
  268. {{ dayjs(row.nextPressureCheckDate).format('YYYY-MM-DD') }}
  269. </div>
  270. <div v-else class="text-xs text-gray-500">
  271. -
  272. </div>
  273. <div class="text-xs text-gray-400" v-if="hasPlanSchedule(row, 'pressure')">
  274. {{ row.planPressureCheckDate ? `(已排时间:${dayjs(row.planPressureCheckDate).format('YYYY-MM-DD')})` : '' }}
  275. </div>
  276. </template>
  277. </el-table-column>
  278. <!-- 设备注册代码 -->
  279. <el-table-column label="设备注册代码" align="center" prop="equipCode" min-width="140">
  280. <template #default="{ row }">
  281. <div>{{ row.equipCode || '-' }}</div>
  282. </template>
  283. </el-table-column>
  284. <el-table-column label="使用证编号" align="center" prop="useRegisterNo" min-width="140">
  285. <template #default="{ row }">
  286. <div>{{ row.useRegisterNo || '-' }}</div>
  287. </template>
  288. </el-table-column>
  289. <el-table-column label="型号" align="center" prop="boilerModel" min-width="140">
  290. <template #default="{ row }">
  291. <div>{{ row.boilerModel || '-' }}</div>
  292. </template>
  293. </el-table-column>
  294. <el-table-column label="出厂编号" align="center" prop="factoryCode" min-width="140">
  295. <template #default="{ row }">
  296. <div>{{ row.factoryCode || '-' }}</div>
  297. </template>
  298. </el-table-column>
  299. <!-- 操作 -->
  300. <el-table-column label="操作" align="center" width="150" fixed="right">
  301. <template #default="scope">
  302. <el-button link type="primary" size="small" @click="handleSchedule(scope.row)">
  303. 计划排期
  304. </el-button>
  305. <!-- <el-button link type="primary" size="small" @click="handleEdit(scope.row)">-->
  306. <!-- 编辑-->
  307. <!-- </el-button>-->
  308. </template>
  309. </el-table-column>
  310. </el-table>
  311. <!-- 分页 -->
  312. <Pagination
  313. :total="total"
  314. v-model:page="queryParams.pageNo"
  315. v-model:limit="queryParams.pageSize"
  316. @pagination="handleQuery"
  317. />
  318. </ContentWrap>
  319. <!-- 计划排期弹窗 -->
  320. <BoilerPlanScheduleDialog
  321. ref="scheduleDialogRef"
  322. :selected-rows="selectedRows"
  323. :source="source"
  324. @success="handleScheduleSuccess"
  325. @clear-selected-rows="clearSelectedRows"
  326. />
  327. <!-- 详情弹窗 -->
  328. <Detail :source="source" ref="detailDialogRef" />
  329. </template>
  330. <script setup lang="ts">
  331. import {useUserStore} from "@/store/modules/user";
  332. import { EquipBoilerSchedulingApi, EquipBoilerSchedulingVO } from '@/api/pressure2/equipboilerscheduling'
  333. import {DICT_TYPE, getStrDictOptions, StringDictDataType} from "@/utils/dict";
  334. import DeptSelect from "@/views/pressure2/equipboilerscheduling/components/DeptSelect.vue";
  335. import AreaSelect from "@/views/system/equipcontainer/components/AreaSelect.vue";
  336. import StreetSelect from "@/views/system/equipcontainer/components/StreetSelect.vue";
  337. import dayjs from "dayjs";
  338. import BoilerPlanScheduleDialog from "@/views/pressure2/equipboilerscheduling/components/BoilerPlanScheduleDialog.vue";
  339. import Detail from "@/views/pressure2/equipboilerscheduling/detail.vue";
  340. import download from '@/utils/download'
  341. /** 锅炉计划排期 列表 */
  342. defineOptions({ name: 'EquipBoilerScheduling' })
  343. const message = useMessage() // 消息弹窗
  344. const userStore = useUserStore()
  345. const loading = ref(true) // 列表的加载中
  346. const list = ref<EquipBoilerSchedulingVO[]>([]) // 列表的数据
  347. const total = ref(0) // 列表的总页数
  348. const queryParams = ref({
  349. pageNo: 1,
  350. pageSize: 10,
  351. unitName: undefined as string | undefined,
  352. unitAddress: undefined as string | undefined,
  353. equipCode: undefined as string | undefined,
  354. relateDepartment: userStore.user.deptId,
  355. equipDistrict: undefined as number[] | undefined,
  356. equipStreet: undefined as number[] | undefined,
  357. typeList: [] as string[],
  358. nextDate: [] as string[],
  359. useStatus: ['100'],
  360. areaType: 'gz'
  361. })
  362. const queryFormRef = ref() // 搜索的表单
  363. const source = ref<string>('pressure') // 来源:计划约检、前台约检
  364. const selectedRows = ref<EquipBoilerSchedulingVO[]>([]) // 选中的行
  365. const scheduleDialogRef = ref() // 计划排期弹窗引用
  366. const datePickerType = ref<'daterange' | 'month'>('month') // 修改时间选择类型定义
  367. const daterange = ref<string[]>([]) // 日期选择值
  368. const month = ref<string>('') // 月份选择值
  369. const detailDialogRef = ref() // 详情弹窗引用
  370. // 添加锅炉类型字典选项变量
  371. const containerTypeOptions = getStrDictOptions(DICT_TYPE.SYSTEM_EQUIP_BOILER_TYPE)
  372. const selectedTypeList = ref<StringDictDataType[]>([]) // 选中的锅炉归类
  373. const tableRef = ref() // 表格引用
  374. /** 查询列表 */
  375. const getList = async () => {
  376. loading.value = true
  377. try {
  378. const data = await EquipBoilerSchedulingApi.getEquipBoilerSchedulingPage(queryParams.value)
  379. list.value = data.list
  380. total.value = data.total
  381. } finally {
  382. loading.value = false
  383. }
  384. }
  385. /** 搜索按钮操作 */
  386. const handleQuery = () => {
  387. //queryParams.value.pageNo = 1
  388. getList()
  389. }
  390. /** 重置按钮操作 */
  391. const resetQuery = () => {
  392. queryFormRef.value.resetFields()
  393. // 重置日期相关的所有值
  394. daterange.value = []
  395. month.value = ''
  396. datePickerType.value = 'month' // 重置为默认的月份选择
  397. queryParams.value.nextDate = [] // 重置nextDate参数
  398. // 重置区域和街道的选择
  399. queryParams.value.equipDistrict = undefined
  400. queryParams.value.equipStreet = undefined
  401. areaStreetMap.value.clear()
  402. // 重置页码
  403. queryParams.value.pageNo = 1
  404. // 清空选中的容器归类对象
  405. selectedTypeList.value = []
  406. // 清除表格排序
  407. tableRef.value?.clearSort()
  408. handleQuery()
  409. }
  410. /** 处理日期变化 */
  411. const handleDateChange = (val: [string, string] | null) => {
  412. daterange.value = val || []
  413. queryParams.value.nextDate = val
  414. ? [
  415. dayjs(val[0]).startOf('day').format('YYYY-MM-DD HH:mm:ss'),
  416. dayjs(val[1]).endOf('day').format('YYYY-MM-DD HH:mm:ss')
  417. ]
  418. : []
  419. }
  420. /** 处理月份变化 */
  421. const handleMonthChange = (val: string | null) => {
  422. if (!val) {
  423. queryParams.value.nextDate = []
  424. return
  425. }
  426. const date = dayjs(val)
  427. queryParams.value.nextDate = [
  428. date.startOf('month').format('YYYY-MM-DD HH:mm:ss'),
  429. date.endOf('month').format('YYYY-MM-DD HH:mm:ss')
  430. ]
  431. month.value = val
  432. }
  433. // 记录每个区域下已选择的街道
  434. const areaStreetMap = ref(new Map<number, number[]>())
  435. /** 处理区域变化 */
  436. const handleAreaChange = (areas: number[]) => {
  437. // 获取移除的区域(通过比较之前的区域列表和现在的区域列表)
  438. const prevAreas = Array.from(areaStreetMap.value.keys())
  439. const removedAreas = prevAreas.filter((area) => !areas.includes(area))
  440. // 移除取消选择的区域下的街道
  441. if (removedAreas.length > 0) {
  442. const currentStreets = queryParams.value.equipDistrict || []
  443. removedAreas.forEach((areaId) => {
  444. const streetsToRemove = areaStreetMap.value.get(areaId) || []
  445. // 从当前选中的街道中移除这些街道
  446. queryParams.value.equipDistrict = currentStreets.filter(
  447. (streetId) => !streetsToRemove.includes(streetId)
  448. )
  449. // 从映射中移除该区域
  450. areaStreetMap.value.delete(areaId)
  451. })
  452. }
  453. }
  454. /** 处理区域清空 */
  455. const handleAreaClear = () => {
  456. // 清空所有选中的街道
  457. queryParams.value.equipDistrict = []
  458. // 清空区域-街道映射
  459. areaStreetMap.value.clear()
  460. }
  461. /** 区域类型的变化 */
  462. const handleAreaTypeChange = (areaType) => {
  463. queryParams.value.areaType = areaType
  464. }
  465. /** 处理街道变化 */
  466. const handleStreetChange = (streets: number[], areaId: number) => {
  467. // 更新区域-街道映射
  468. if (queryParams.value.equipDistrict?.includes(areaId)) {
  469. areaStreetMap.value.set(areaId, streets)
  470. }
  471. }
  472. /** 处理街道清空 */
  473. const handleStreetClear = () => {
  474. // 清空所有区域下的街道选择
  475. areaStreetMap.value.clear()
  476. }
  477. /** 处理锅炉归类变化 */
  478. const handleTypeListChange = (values: string[]) => {
  479. selectedTypeList.value = containerTypeOptions.filter((dict) => values.includes(dict.value))
  480. }
  481. /** 表格选择框变化 */
  482. const handleSelectionChange = (selection: EquipBoilerSchedulingVO[]) => {
  483. selectedRows.value = selection
  484. }
  485. /** 处理表格排序 */
  486. const handleSortChange = ({ prop, order }) => {
  487. if (!prop || !order) {
  488. list.value.sort(() => 0) // 重置排序
  489. return
  490. }
  491. list.value.sort((a, b) => {
  492. const aValue = a[prop] || ''
  493. const bValue = b[prop] || ''
  494. if (order === 'ascending') {
  495. return aValue > bValue ? 1 : -1
  496. } else {
  497. return aValue < bValue ? 1 : -1
  498. }
  499. })
  500. }
  501. /** 判断是否有已排期的时间 */
  502. const hasPlanSchedule = (row: EquipBoilerSchedulingVO, type: 'in' | 'out' | 'pressure') => {
  503. if (type === 'in') {
  504. return !!row.planInCheckDate
  505. } else if (type === 'out') {
  506. return !!row.planOutCheckDate
  507. } else {
  508. return !!row.planPressureCheckDate
  509. }
  510. }
  511. /** 获取单元格样式 */
  512. const getCellStyle = ({ row, column, rowIndex, columnIndex }) => {
  513. // 检查列是否为检验日期列
  514. const checkColumns = ['nextInCheckDate', 'nextOutCheckDate', 'nextPressureCheckDate']
  515. if (checkColumns.includes(column.property)) {
  516. // 根据不同类型的检验判断是否有排期
  517. if (column.property === 'nextInCheckDate' && row.planInCheckDate) {
  518. return { background: '#FFFF99' }
  519. } else if (column.property === 'nextOutCheckDate' && row.planOutCheckDate) {
  520. return { background: '#FFFF99' }
  521. } else if (column.property === 'nextPressureCheckDate' && row.planPressureCheckDate) {
  522. return { background: '#FFFF99' }
  523. }
  524. }
  525. return {}
  526. }
  527. /** 处理单条记录排期 */
  528. const handleSchedule = (row: EquipBoilerSchedulingVO) => {
  529. selectedRows.value = [row]
  530. scheduleDialogRef.value?.open([row])
  531. }
  532. //清除选择行
  533. const clearSelectedRows = () => {
  534. // 清空表格的多选状态
  535. nextTick(() => {
  536. tableRef.value?.clearSelection()
  537. })
  538. selectedRows.value = []
  539. }
  540. /** 处理编辑操作 */
  541. const handleEdit = (row: EquipBoilerSchedulingVO) => {
  542. // 传递当前的查询条件,处理 relateDepartment 类型
  543. const currentQueryParams = {
  544. // ...queryParams.value,
  545. // relateDepartment: queryParams.value.relateDepartment?.toString(),
  546. // datePickerType: datePickerType.value,
  547. // month: month.value
  548. }
  549. //console.log(currentQueryParams)
  550. detailDialogRef.value?.open(row, currentQueryParams)
  551. }
  552. /** 处理批量排期 */
  553. const handleBatchSchedule = () => {
  554. if (selectedRows.value.length === 0) {
  555. message.warning('请至少选择一条记录')
  556. return
  557. }
  558. scheduleDialogRef.value?.open()
  559. }
  560. /** 排期成功处理 */
  561. const handleScheduleSuccess = () => {
  562. selectedRows.value = []
  563. getList()
  564. }
  565. //保存查询参数
  566. const QUERY_PARAMS_CACHE_KEY = 'equip_boiler_scheduling_query_params'
  567. // 保存查询参数到缓存
  568. const saveQueryParamsToCache = () => {
  569. const cacheData = {
  570. queryParams: unref(queryParams),
  571. datePickerType: unref(datePickerType),
  572. dateRange: unref(daterange),
  573. month: unref(month),
  574. selectedTypeList: unref(selectedTypeList),
  575. }
  576. localStorage.setItem(QUERY_PARAMS_CACHE_KEY, JSON.stringify(cacheData))
  577. }
  578. // 从缓存恢复查询参数
  579. const loadQueryParamsFromCache = () => {
  580. const cacheData = localStorage.getItem(QUERY_PARAMS_CACHE_KEY)
  581. if (cacheData) {
  582. try {
  583. const parsedData = JSON.parse(cacheData)
  584. // 排除 useStatus和relateDepartment、pageNo、pageSize 字段
  585. const { useStatus,relateDepartment, pageNo, pageSize, ...queryParamsWithoutStatus } = parsedData.queryParams
  586. queryParams.value = {
  587. ...queryParams.value,
  588. ...queryParamsWithoutStatus
  589. }
  590. datePickerType.value = parsedData.datePickerType
  591. daterange.value = parsedData.dateRange
  592. month.value = parsedData.month
  593. selectedTypeList.value = parsedData.selectedTypeList
  594. } catch (error) {
  595. console.error('解析缓存数据失败:', error)
  596. }
  597. }
  598. }
  599. const exportLoading = ref(false) // 导出的加载中
  600. /** 导出按钮操作 */
  601. const handleExport = async () => {
  602. try {
  603. // 导出的二次确认
  604. await message.exportConfirm()
  605. // 发起导出
  606. exportLoading.value = true
  607. console.log(queryParams.value)
  608. const data = await EquipBoilerSchedulingApi.exportBoilerScheduling(queryParams.value)
  609. download.excel(data, '锅炉计划排期表单.xls')
  610. } catch {
  611. } finally {
  612. exportLoading.value = false
  613. }
  614. }
  615. /** 初始化 **/
  616. onMounted(() => {
  617. loadQueryParamsFromCache()
  618. getList()
  619. })
  620. onUnmounted(()=>{
  621. saveQueryParamsToCache()
  622. })
  623. </script>
  624. <style lang="scss" scoped>
  625. .check-number {
  626. font-size: 18px;
  627. font-weight: bold;
  628. }
  629. .regular-check {
  630. color: var(--el-color-primary);
  631. }
  632. .year-check {
  633. color: var(--el-color-success);
  634. }
  635. .expired-check {
  636. color: var(--el-color-danger);
  637. }
  638. .containerView {
  639. padding: 10px;
  640. }
  641. ::v-deep .el-select__selection.is-near {
  642. max-height: 200px;
  643. overflow-y: scroll;
  644. scrollbar-width: none;
  645. -ms-overflow-style: none;
  646. }
  647. ::v-deep .containerView .el-select__wrapper {
  648. min-width: 200px;
  649. }
  650. </style>