index.vue 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338
  1. <template>
  2. <ContentWrap>
  3. <!-- 搜索工作栏 -->
  4. <el-form
  5. class="-mb-15px"
  6. :model="queryParams"
  7. ref="queryFormRef"
  8. :inline="true"
  9. label-width="100px"
  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="pipeAddress">
  23. <el-input
  24. v-model="queryParams.pipeAddress"
  25. placeholder="请输入管道使用地址"
  26. clearable
  27. @keyup.enter="getList"
  28. class="!w-240px"
  29. />
  30. </el-form-item>
  31. <el-form-item label="工程号" prop="projectNo">
  32. <el-input
  33. v-model="queryParams.projectNo"
  34. placeholder="请输入工程号"
  35. clearable
  36. @keyup.enter="getList"
  37. class="!w-240px"
  38. />
  39. </el-form-item>
  40. <el-form-item label="工程名称" prop="projectName">
  41. <el-input
  42. v-model="queryParams.projectName"
  43. placeholder="请输入工程名称"
  44. clearable
  45. @keyup.enter="getList"
  46. class="!w-240px"
  47. />
  48. </el-form-item>
  49. <el-form-item label="部门" prop="relateDepartment">
  50. <DeptSelect
  51. v-model="queryParams.relateDepartment"
  52. placeholder="请选择部门"
  53. clearable
  54. class="!w-240px"
  55. />
  56. </el-form-item>
  57. <!-- </div>
  58. &lt;!&ndash; 区域和时间查询部分 &ndash;&gt;
  59. <div class="flex flex-wrap items-start gap-x-2">-->
  60. <el-form-item label="区域" prop="equipDistrict">
  61. <AreaSelect
  62. v-model="queryParams.equipDistrict"
  63. placeholder="请选择区域"
  64. class="!w-[240px]"
  65. multiple
  66. collapse-tags
  67. collapse-tags-tooltip
  68. :clearable="true"
  69. @clear="handleAreaClear"
  70. @change="handleAreaChange"
  71. @area-type-change="handleAreaTypeChange"
  72. />
  73. </el-form-item>
  74. <el-form-item label="街道" prop="equipStreet">
  75. <StreetSelect
  76. v-model="queryParams.equipStreet"
  77. :district-ids="queryParams.equipDistrict"
  78. placeholder="请选择街道"
  79. class="!w-[240px]"
  80. multiple
  81. collapse-tags
  82. collapse-tags-tooltip
  83. :clearable="true"
  84. @clear="handleStreetClear"
  85. @change="handleStreetChange"
  86. />
  87. </el-form-item>
  88. <el-form-item label="使用状态" prop="useStatus">
  89. <el-select
  90. v-model="queryParams.useStatus"
  91. placeholder="选择使用状态"
  92. clearable
  93. multiple
  94. collapse-tags
  95. collapse-tags-tooltip
  96. class="!w-240px"
  97. >
  98. <el-option
  99. v-for="dict in getStrDictOptions(DICT_TYPE.PIPE_USE_STATUS)"
  100. :key="dict.value"
  101. :label="dict.label"
  102. :value="dict.value"
  103. />
  104. </el-select>
  105. </el-form-item>
  106. <el-form-item label="临检时间" prop="checkDate">
  107. <div class="flex items-center gap-x-2">
  108. <el-select v-model="datePickerType" class="!w-[90px]">
  109. <el-option label="时间段" value="daterange" />
  110. <el-option label="月份" value="month" />
  111. </el-select>
  112. <el-date-picker
  113. v-if="datePickerType === 'daterange'"
  114. v-model="daterange"
  115. type="daterange"
  116. value-format="YYYY-MM-DD"
  117. start-placeholder="开始日期"
  118. end-placeholder="结束日期"
  119. class="!w-[220px]"
  120. @change="handleDateChange"
  121. />
  122. <el-date-picker
  123. v-else
  124. v-model="month"
  125. type="month"
  126. value-format="YYYY-MM"
  127. placeholder="选择月份"
  128. class="!w-[150px]"
  129. @change="handleMonthChange"
  130. />
  131. </div>
  132. </el-form-item>
  133. </div>
  134. <!-- 锅炉相关查询条件 -->
  135. <div class="bg-gray-50 p-3 rounded mt-2">
  136. <el-form-item label="管道归类" prop="typeList" class="mb-2">
  137. <div class="flex items-center flex-1">
  138. <el-checkbox-group
  139. v-model="queryParams.typeList"
  140. class="flex flex-wrap gap-2"
  141. @change="handleTypeListChange"
  142. >
  143. <el-checkbox
  144. v-for="dict in containerTypeOptions"
  145. :key="dict.value"
  146. :label="dict.label"
  147. :value="dict.value"
  148. />
  149. </el-checkbox-group>
  150. </div>
  151. </el-form-item>
  152. </div>
  153. <!-- 操作按钮 -->
  154. <div class="flex justify-between mt-3">
  155. <el-form-item class="mb-0">
  156. <el-button type="primary" @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
  157. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
  158. </el-form-item>
  159. <el-form-item class="mb-0">
  160. <el-button
  161. type="primary"
  162. plain
  163. v-if="source === 'pressure'"
  164. @click="handleBatchSchedule"
  165. :disabled="selectedRows.length === 0"
  166. >
  167. <Icon icon="ep:calendar" class="mr-5px" /> 排期约检
  168. </el-button>
  169. <el-button type="success" @click="handleExport">
  170. <Icon icon="ep:download" class="mr-5px" /> 导出
  171. </el-button>
  172. </el-form-item>
  173. </div>
  174. </el-form>
  175. </ContentWrap>
  176. <!-- 列表 -->
  177. <ContentWrap>
  178. <!-- <el-table
  179. v-loading="loading"
  180. :data="list"
  181. stripe
  182. @selection-change="handleSelectionChange"
  183. @sort-change="handleSortChange"
  184. @expand-change="handleExpandChange"
  185. ref="mainTableRef"
  186. border
  187. >
  188. <el-table-column type="expand">
  189. <template #default="props">
  190. <PipelineDetailList :row="props.row" @selection-change="handleChildSelectionChange"/>
  191. </template>
  192. </el-table-column>
  193. &lt;!&ndash; <el-table-column v-if="source === 'pressure'" type="selection" width="30" />&ndash;&gt;
  194. <el-table-column
  195. label="区域"
  196. align="center"
  197. prop="equipDistrictName"
  198. min-width="80"
  199. sortable="custom"
  200. />
  201. <el-table-column
  202. label="街道"
  203. align="center"
  204. prop="equipStreetName"
  205. min-width="100"
  206. sortable="custom"
  207. />
  208. <el-table-column label="使用单位名称 " align="center" prop="unitName" min-width="150" />
  209. <el-table-column label="使用管道使用地址" align="center" prop="pipeAddress" min-width="150" />
  210. &lt;!&ndash; 法定检验 &ndash;&gt;
  211. <el-table-column
  212. label="定期检验"
  213. align="center"
  214. prop="nextLegalCheckDate"
  215. min-width="140"
  216. sortable="custom"
  217. >
  218. <template #default="{ row }">
  219. <div class="check-number regular-check">{{ row.countLegal }}</div>
  220. <div v-if="row.nextLegalCheckDate !== null && row.countLegal > 0" class="text-xs text-gray-500">
  221. 最近临期时间:{{ dayjs(row.nextLegalCheckDate).format('YYYY-MM-DD') }}
  222. </div>
  223. </template>
  224. </el-table-column>
  225. &lt;!&ndash; 年度检查 &ndash;&gt;
  226. <el-table-column
  227. label="年度检查"
  228. align="center"
  229. prop="nextYearCheckDate"
  230. min-width="140"
  231. sortable="custom"
  232. >
  233. <template #default="{ row }">
  234. <div class="check-number year-check">{{ row.countYear }}</div>
  235. <div
  236. v-if="row.nextYearCheckDate !== null && row.countYear > 0"
  237. class="text-xs text-gray-500"
  238. >
  239. 最近临期时间:{{ dayjs(row.nextYearCheckDate).format('YYYY-MM-DD') }}
  240. </div>
  241. </template>
  242. </el-table-column>
  243. &lt;!&ndash; 使用单位联系人 &ndash;&gt;
  244. <el-table-column label="约检联系人" align="center" prop="contactPerson" min-width="140">
  245. <template #default="{ row }">
  246. <div>{{ row.contact || '无' }}</div>
  247. </template>
  248. </el-table-column>
  249. &lt;!&ndash; 使用单位联系电话 &ndash;&gt;
  250. <el-table-column label="约检联系电话" align="center" prop="contactPhone" min-width="140">
  251. <template #default="{ row }">
  252. <div>{{ row.contactPhone || '无' }}</div>
  253. </template>
  254. </el-table-column>
  255. &lt;!&ndash; 操作 &ndash;&gt;
  256. <el-table-column label="操作" align="center" width="150" fixed="right">
  257. <template #default="scope">
  258. <el-button link type="primary" size="small" @click="handleSchedule(scope.row)">
  259. 计划排期
  260. </el-button>
  261. <el-button link type="primary" size="small" @click="handleEdit(scope.row)">
  262. 编辑
  263. </el-button>
  264. </template>
  265. </el-table-column>
  266. </el-table>-->
  267. <el-table
  268. v-loading="loading"
  269. ref="mainTableRef"
  270. :data="list"
  271. border
  272. @selection-change="handleSelectionChange"
  273. @sort-change="handleSortChange"
  274. :row-key="(row) => row.id"
  275. :row-class-name="getMainRowClassName"
  276. @row-click="handleMainRowClick"
  277. @expand-change="handleExpandChange"
  278. :expand-row-keys="expandRowKeys"
  279. >
  280. <el-table-column type="selection" width="40"/>
  281. <el-table-column type="expand">
  282. <template #default="props">
  283. <el-table
  284. :data="props.row.pipes" border
  285. :header-cell-style="{background: '#f5f7fa', color: '#606266'}"
  286. :ref="(el) => setDetailTableRef(el, props.row.id)"
  287. @selection-change="(selection) => handleDetailSelectionChange(selection, props.row)"
  288. :row-class-name="getRowClassName"
  289. :cell-class-name="(params) => getDetailCellClassName(params, props.row)"
  290. class="inner-table"
  291. @row-click="handleRowClick"
  292. >
  293. <el-table-column type="selection" width="40"/>
  294. <el-table-column type="index" label="序号" width="60" align="center"/>
  295. <el-table-column label="工程号" prop="projectNo" align="center" min-width="150"/>
  296. <el-table-column label="管道编号" prop="pipeNo" align="center" min-width="150"/>
  297. <el-table-column label="注册代码" prop="pipeRegCode" align="center" min-width="150"/>
  298. <el-table-column label="管道名称" prop="pipeName" align="center" min-width="150"/>
  299. <el-table-column label="最近定期检查" prop="nextLegalCheckDateDetail" align="center" min-width="150" sortable>
  300. <template #default="{ row }">
  301. <div class="text-xs text-gray-500">
  302. {{ formatDate(row.nextLegalCheckDateDetail, 'YYYY-MM-DD') }}
  303. <div v-if="row.planLegalCheckDate" class="text-xs text-[#2D5FBD]">
  304. (排期时间:{{ formatDate(row.planLegalCheckDate, 'YYYY-MM-DD') }})
  305. </div>
  306. </div>
  307. </template>
  308. </el-table-column>
  309. <!-- 最近年度检查-->
  310. <el-table-column label="最近年度检查" prop="nextYearCheckDateDetail" align="center" min-width="150" sortable>
  311. <template #default="{ row }">
  312. <div class="text-xs text-gray-500">
  313. {{ formatDate(row.nextYearCheckDateDetail, 'YYYY-MM-DD') }}
  314. <div v-if="row.planYearCheckDate" class="text-xs text-[#2D5FBD]">
  315. (排期时间:{{ formatDate(row.planYearCheckDate, 'YYYY-MM-DD') }})
  316. </div>
  317. </div>
  318. </template>
  319. </el-table-column>
  320. <el-table-column label="状态" prop="useStatus" align="center" min-width="50">
  321. <template #default="{ row }">
  322. <dict-tag :type="DICT_TYPE.PIPE_USE_STATUS" :value="row.useStatus" />
  323. </template>
  324. </el-table-column>
  325. </el-table>
  326. </template>
  327. </el-table-column>
  328. <el-table-column type="index" label="序号" width="60" align="center"/>
  329. <el-table-column
  330. label="区域"
  331. align="center"
  332. prop="equipDistrictName"
  333. min-width="80"
  334. />
  335. <el-table-column
  336. label="街道"
  337. align="center"
  338. prop="equipStreetName"
  339. min-width="100"
  340. />
  341. <el-table-column label="使用单位名称 " align="center" prop="unitName" min-width="180">
  342. <template #default="{ row }">
  343. <el-link
  344. type="primary"
  345. :underline="false"
  346. @click.stop="handleEdit(row)"
  347. style="cursor: pointer"
  348. >
  349. {{ row.unitName }}
  350. </el-link>
  351. </template>
  352. </el-table-column>
  353. <el-table-column label="管道使用地址" align="center" prop="pipeAddress" min-width="150" />
  354. <el-table-column label="工程号" prop="projectNo" align="center" min-width="150"/>
  355. <el-table-column label="工程名称" prop="projectName" align="center" min-width="150"/>
  356. <el-table-column label="定期检验" prop="nextLegalCheckDate" align="center" min-width="150" sortable="custom">
  357. <template #default="{ row }">
  358. <div class="schedule-cell">
  359. <span class="schedule-date">
  360. <span class="schedule-date-link" @click.stop="handleSchedule(row,'100')">
  361. {{formatDate(row.nextLegalCheckDate, 'YYYY-MM-DD') || '-'}}
  362. </span>
  363. </span>
  364. <span
  365. class="schedule-count"
  366. :class="{ 'schedule-count-completed': row.legalScheduledCount === row.legalTotalCount && row.legalTotalCount > 0 }"
  367. v-if="row.legalScheduledCount > 0"
  368. >
  369. ({{ row.legalScheduledCount || 0 }}/{{ row.legalTotalCount || 0 }})
  370. </span>
  371. <span v-else class="schedule-count-placeholder"></span>
  372. </div>
  373. </template>
  374. </el-table-column>
  375. <el-table-column label="年度检查" prop="nextYearCheckDate" align="center" min-width="150" sortable="custom">
  376. <template #default="{ row }">
  377. <div class="schedule-cell">
  378. <span class="schedule-date">
  379. <span class="schedule-date-link" @click.stop="handleSchedule(row,'200')">
  380. {{formatDate(row.nextYearCheckDate, 'YYYY-MM-DD') || '-'}}
  381. </span>
  382. </span>
  383. <span
  384. class="schedule-count"
  385. :class="{ 'schedule-count-completed': row.yearScheduledCount === row.yearTotalCount && row.yearTotalCount > 0 }"
  386. v-if="row.yearScheduledCount > 0"
  387. >
  388. ({{ row.yearScheduledCount || 0 }}/{{ row.yearTotalCount || 0 }})
  389. </span>
  390. <span v-else class="schedule-count-placeholder"></span>
  391. </div>
  392. </template>
  393. </el-table-column>
  394. <el-table-column label="管道数量" prop="pipeCount" align="center" min-width="100"/>
  395. <el-table-column label="操作" align="center" width="150" fixed="right">
  396. <template #default="scope">
  397. <el-button link type="primary" size="small" @click.stop="handleSchedule(scope.row)">
  398. 计划排期
  399. </el-button>
  400. <el-button link type="primary" size="small" @click.stop="handleEdit(scope.row)">
  401. 编辑
  402. </el-button>
  403. </template>
  404. </el-table-column>
  405. </el-table>
  406. <!-- 分页 -->
  407. <Pagination
  408. :total="total"
  409. v-model:page="queryParams.pageNo"
  410. v-model:limit="queryParams.pageSize"
  411. @pagination="handleQuery"
  412. />
  413. </ContentWrap>
  414. <!-- 计划排期弹窗 -->
  415. <PipePlanScheduleDialog
  416. ref="scheduleDialogRef"
  417. :selected-rows="selectedRows"
  418. :selected-pipe-rows="selectedDetailRows"
  419. :selected-legal-list="selectedLegalList"
  420. :selected-year-list="selectedYearList"
  421. :source="source"
  422. @success="handleScheduleSuccess"
  423. />
  424. <!-- 详情弹窗 -->
  425. <Detail :source="source" ref="detailDialogRef" />
  426. </template>
  427. <script setup lang="ts">
  428. import {useUserStore} from "@/store/modules/user";
  429. import {
  430. EquipPipeSchedulingApi,
  431. EquipPipeSchedulingDetailVO,
  432. EquipPipeSchedulingVO,
  433. PipePlanSchedulingDetailVO
  434. } from '@/api/pressure2/pipescheduling'
  435. import {DICT_TYPE, getStrDictOptions, StringDictDataType} from "@/utils/dict";
  436. import DeptSelect from "@/views/pressure2/pipescheduling/components/DeptSelect.vue";
  437. import AreaSelect from "@/views/system/equipcontainer/components/AreaSelect.vue";
  438. import StreetSelect from "@/views/system/equipcontainer/components/StreetSelect.vue";
  439. import dayjs from "dayjs";
  440. import PipePlanScheduleDialog from "@/views/pressure2/pipescheduling/components/PipePlanScheduleDialog.vue";
  441. import Detail from "@/views/pressure2/pipescheduling/detail.vue";
  442. import PipelineDetailList from "@/views/pressure2/pipescheduling/components/PipelineDetailList.vue";
  443. import {formatDate} from "@/utils/formatTime";
  444. import {ref} from "vue";
  445. import {PipeEquipmentDetailVO, PipeEquipmentVO} from "@/api/pressure2/pipeequipment";
  446. import {EquipBoilerSchedulingVO} from "@/api/pressure2/equipboilerscheduling";
  447. import download from "@/utils/download";
  448. /** 锅炉计划排期 列表 */
  449. defineOptions({ name: 'EquipPipeScheduling' })
  450. const message = useMessage() // 消息弹窗
  451. const userStore = useUserStore()
  452. const loading = ref(true) // 列表的加载中
  453. const list = ref<EquipPipeSchedulingVO[]>([]) // 列表的数据
  454. const total = ref(0) // 列表的总页数
  455. const queryParams = ref({
  456. pageNo: 1,
  457. pageSize: 10,
  458. unitName: undefined as string | undefined,
  459. pipeAddress: undefined as string | undefined,
  460. projectNo: undefined as string | undefined,
  461. relateDepartment: userStore.user.deptId,
  462. equipDistrict: undefined as number[] | undefined,
  463. equipStreet: undefined as number[] | undefined,
  464. typeList: [] as string[],
  465. nextDate: [
  466. dayjs('1900-01-01').startOf('day').format('YYYY-MM-DD HH:mm:ss'),
  467. dayjs().add(1, 'month').endOf('month').endOf('day').format('YYYY-MM-DD HH:mm:ss')
  468. ] as string[],
  469. useStatus: [] as string[],
  470. areaType: 'gz',
  471. sort:undefined,
  472. order:undefined,
  473. })
  474. const queryFormRef = ref() // 搜索的表单
  475. const source = ref<string>('pressure') // 来源:计划约检、前台约检
  476. const selectedRows = ref<EquipPipeSchedulingVO[]>([]) // 选中的行
  477. const selectedPipeRows = ref<EquipPipeSchedulingVO[]>([]) // 选中的设备行
  478. const scheduleDialogRef = ref() // 计划排期弹窗引用
  479. const datePickerType = ref<'daterange' | 'month'>('month') // 修改时间选择类型定义
  480. const daterange = ref<string[]>([]) // 日期选择值
  481. const month = ref<string>(dayjs().add(1, 'month').endOf('month').endOf('day').format('YYYY-MM-DD')) // 月份选择值
  482. const detailDialogRef = ref() // 详情弹窗引用
  483. // 添加锅炉类型字典选项变量
  484. const containerTypeOptions = getStrDictOptions(DICT_TYPE.PIPE_TYPE)
  485. const selectedTypeList = ref<StringDictDataType[]>([]) // 选中的锅炉归类
  486. const selectedLegalList = ref([])
  487. const selectedYearList = ref([])
  488. const mainTableRef = ref() // 主表格引用
  489. const selectedDetailRows = ref<any[]>([]) // 选中的行
  490. /** 查询列表 */
  491. const getList = async () => {
  492. loading.value = true
  493. try {
  494. const data = await EquipPipeSchedulingApi.getEquipPipeSchedulingPagePipe(queryParams.value)
  495. list.value = data.list
  496. total.value = data.total
  497. // 重置展开状态、选中状态和缓存
  498. expandRowKeys.value = []
  499. selectedDetailRows.value = []
  500. selectedRows.value = []
  501. selectedLegalList.value = []
  502. selectedYearList.value = []
  503. expandedRowsCache.value.clear()
  504. } finally {
  505. loading.value = false
  506. }
  507. }
  508. /** 搜索按钮操作 */
  509. const handleQuery = () => {
  510. //queryParams.value.pageNo = 1
  511. getList()
  512. }
  513. /** 重置按钮操作 */
  514. const resetQuery = () => {
  515. queryFormRef.value.resetFields()
  516. // 重置日期相关的所有值
  517. daterange.value = []
  518. month.value = ''
  519. datePickerType.value = 'month' // 重置为默认的月份选择
  520. queryParams.value.nextDate = [
  521. dayjs('1900-01-01').startOf('day').format('YYYY-MM-DD HH:mm:ss'),
  522. dayjs().add(1, 'month').endOf('month').endOf('day').format('YYYY-MM-DD HH:mm:ss')
  523. ] // 重置nextDate参数
  524. // 重置区域和街道的选择
  525. queryParams.value.equipDistrict = undefined
  526. queryParams.value.equipStreet = undefined
  527. areaStreetMap.value.clear()
  528. queryParams.value.sort = undefined
  529. queryParams.value.order = undefined
  530. // 重置页码
  531. queryParams.value.pageNo = 1
  532. // 清空选中的容器归类对象
  533. selectedTypeList.value = []
  534. // 清除表格排序
  535. mainTableRef.value?.clearSort()
  536. handleQuery()
  537. }
  538. /** 处理日期变化 */
  539. const handleDateChange = (val: [string, string] | null) => {
  540. daterange.value = val || []
  541. queryParams.value.nextDate = val
  542. ? [
  543. dayjs(val[0]).startOf('day').format('YYYY-MM-DD HH:mm:ss'),
  544. dayjs(val[1]).endOf('day').format('YYYY-MM-DD HH:mm:ss')
  545. ]
  546. : []
  547. }
  548. /** 处理月份变化 */
  549. const handleMonthChange = (val: string | null) => {
  550. if (!val) {
  551. queryParams.value.nextDate = []
  552. return
  553. }
  554. const date = dayjs(val)
  555. queryParams.value.nextDate = [
  556. date.startOf('month').format('YYYY-MM-DD HH:mm:ss'),
  557. date.endOf('month').format('YYYY-MM-DD HH:mm:ss')
  558. ]
  559. month.value = val
  560. }
  561. // 记录每个区域下已选择的街道
  562. const areaStreetMap = ref(new Map<number, number[]>())
  563. /** 处理区域变化 */
  564. const handleAreaChange = (areas: number[]) => {
  565. // 获取移除的区域(通过比较之前的区域列表和现在的区域列表)
  566. const prevAreas = Array.from(areaStreetMap.value.keys())
  567. const removedAreas = prevAreas.filter((area) => !areas.includes(area))
  568. // 移除取消选择的区域下的街道
  569. if (removedAreas.length > 0) {
  570. const currentStreets = queryParams.value.equipDistrict || []
  571. removedAreas.forEach((areaId) => {
  572. const streetsToRemove = areaStreetMap.value.get(areaId) || []
  573. // 从当前选中的街道中移除这些街道
  574. queryParams.value.equipDistrict = currentStreets.filter(
  575. (streetId) => !streetsToRemove.includes(streetId)
  576. )
  577. // 从映射中移除该区域
  578. areaStreetMap.value.delete(areaId)
  579. })
  580. }
  581. }
  582. /** 处理区域清空 */
  583. const handleAreaClear = () => {
  584. // 清空所有选中的街道
  585. queryParams.value.equipDistrict = []
  586. // 清空区域-街道映射
  587. areaStreetMap.value.clear()
  588. }
  589. /** 区域类型的变化 */
  590. const handleAreaTypeChange = (areaType) => {
  591. queryParams.value.areaType = areaType
  592. }
  593. /** 处理街道变化 */
  594. const handleStreetChange = (streets: number[], areaId: number) => {
  595. // 更新区域-街道映射
  596. if (queryParams.value.equipDistrict?.includes(areaId)) {
  597. areaStreetMap.value.set(areaId, streets)
  598. }
  599. }
  600. /** 处理街道清空 */
  601. const handleStreetClear = () => {
  602. // 清空所有区域下的街道选择
  603. areaStreetMap.value.clear()
  604. }
  605. /** 处理锅炉归类变化 */
  606. const handleTypeListChange = (values: string[]) => {
  607. selectedTypeList.value = containerTypeOptions.filter((dict) => values.includes(dict.value))
  608. }
  609. /*
  610. /!** 表格选择框变化 *!/
  611. const handleSelectionChange = (selection: EquipPipeSchedulingVO[]) => {
  612. selectedRows.value = selection
  613. }
  614. /!** 处理表格排序 *!/
  615. const handleSortChange = ({ prop, order }) => {
  616. if (!prop || !order) {
  617. list.value.sort(() => 0) // 重置排序
  618. return
  619. }
  620. list.value.sort((a, b) => {
  621. const aValue = a[prop] || ''
  622. const bValue = b[prop] || ''
  623. if (order === 'ascending') {
  624. return aValue > bValue ? 1 : -1
  625. } else {
  626. return aValue < bValue ? 1 : -1
  627. }
  628. })
  629. }
  630. /!** 处理单条记录排期 *!/
  631. const handleSchedule = async (row: EquipPipeSchedulingVO) => {
  632. let rowSelections = selectedRows.value.filter(item => item.unitId === row.unitId);
  633. // if (rowSelections.length === 0){
  634. // message.warning('请至少选择一条明细记录')
  635. // return
  636. // }
  637. // 如果没有选中明细记录,则获取该主表下的所有子表数据
  638. if (rowSelections.length === 0) {
  639. // 从列表中找到对应的主表行
  640. const mainRow = list.value.find(item => item.id === row.id);
  641. if (mainRow) {
  642. // 获取该主表行的所有子表数据
  643. const params = {
  644. legalEquipIds: mainRow.legalEquipIds,
  645. yearEquipIds: mainRow.yearEquipIds,
  646. };
  647. try {
  648. const response = await EquipPipeSchedulingApi.getDetailByProject(params);
  649. rowSelections = response || [];
  650. if (rowSelections.length === 0) {
  651. message.warning('该工程下没有可排期的管道数据');
  652. return;
  653. }
  654. // 展开该主表行以显示子表
  655. if (mainTableRef.value) {
  656. mainTableRef.value.toggleRowExpansion(row, true);
  657. }
  658. } catch (error) {
  659. console.log(error)
  660. message.error('获取管道详情失败');
  661. return;
  662. }
  663. } else {
  664. message.warning('请至少选择一条明细记录');
  665. return;
  666. }
  667. }
  668. //按定检和年检分组
  669. selectedLegalList.value = []
  670. selectedYearList.value = []
  671. rowSelections.forEach(item => {
  672. if (!item.hasLegalScheduling && item.planLegalCheckDate == null){
  673. selectedLegalList.value.push(item)
  674. }
  675. if (!item.hasYearScheduling && item.planYearCheckDate == null){
  676. selectedYearList.value.push(item)
  677. }
  678. })
  679. //selectedPipeRows.value = [row];
  680. scheduleDialogRef.value?.open(selectedLegalList.value,selectedYearList.value)
  681. //console.log(selectedPipeRows.value)
  682. }
  683. /!** 处理编辑操作 *!/
  684. const handleEdit = (row: EquipPipeSchedulingVO) => {
  685. // 传递当前的查询条件,处理 relateDepartment 类型
  686. const currentQueryParams = {
  687. ...queryParams.value,
  688. relateDepartment: queryParams.value.relateDepartment?.toString(),
  689. datePickerType: datePickerType.value,
  690. month: month.value,
  691. nextDate: queryParams.value.nextDate
  692. }
  693. //console.log(currentQueryParams)
  694. detailDialogRef.value?.open(row, currentQueryParams)
  695. }
  696. */
  697. /** 处理批量排期 */
  698. const handleBatchSchedule = () => {
  699. if (selectedDetailRows.value.length === 0 && selectedRows.value.length === 0) {
  700. message.warning('请至少选择一条记录')
  701. return
  702. }
  703. // 遍历选中的子表行,找到主表行
  704. // selectedPipeRows.value = list.value.filter(item => selectedRows.value.some(row => {
  705. // if (item.legalEquipIds && item.legalEquipIds.includes(row.equipPipeId)) {
  706. // return true
  707. // }
  708. // return !!(item.yearEquipIds && item.yearEquipIds.includes(row.equipPipeId));
  709. //
  710. // }
  711. // ))
  712. //按定检和年检分组
  713. selectedLegalList.value = []
  714. selectedYearList.value = []
  715. // 选择了主表但是没有选子表,则获取该主表下的所有子表数据
  716. let ids = selectedDetailRows.value.map(item => item.equipPipeId)
  717. selectedRows.value.forEach(item => {
  718. if (!ids.includes(item.id)) {
  719. item.pipes.forEach(pipe => {
  720. if (!pipe.hasLegalScheduling && pipe.planLegalCheckDate == null) {
  721. selectedLegalList.value.push(pipe)
  722. }
  723. if (!pipe.hasYearScheduling && pipe.planYearCheckDate == null) {
  724. selectedYearList.value.push(pipe)
  725. }
  726. })
  727. }
  728. })
  729. selectedDetailRows.value.forEach(item => {
  730. if (!item.hasLegalScheduling && item.planLegalCheckDate == null){
  731. selectedLegalList.value.push(item)
  732. }
  733. if (!item.hasYearScheduling && item.planYearCheckDate == null){
  734. selectedYearList.value.push(item)
  735. }
  736. })
  737. //console.log("selectedRows.value",selectedRows.value)
  738. //console.log(selectedLegalList.value,selectedYearList.value)
  739. //scheduleDialogRef.value?.open(selectedPipeRows.value,selectedRows.value)
  740. //selectedPipeRows.value = [row];
  741. console.log('selectedLegalList.value',selectedLegalList.value,selectedYearList.value)
  742. scheduleDialogRef.value?.open(selectedLegalList.value,selectedYearList.value)
  743. }
  744. /** 排期成功处理 */
  745. const handleScheduleSuccess = () => {
  746. selectedRows.value = []
  747. getList()
  748. }
  749. /** 处理子组件选择变化 */
  750. /*const childSelectionsMap = ref<Record<string | number, PipePlanSchedulingDetailVO[]>>({}); // 新增: 存储子组件的选中项
  751. const handleChildSelectionChange = (selection: EquipPipeSchedulingDetailVO[], parentId: string | number) => {
  752. if (!parentId) {
  753. // 如果父ID无效,则不处理,或者记录一个警告
  754. console.warn('Received selection change from child with invalid parentId');
  755. return;
  756. }
  757. selectedRows.value = [...selection]
  758. if (selection && selection.length > 0) {
  759. childSelectionsMap.value[parentId] = [...selection];
  760. } else {
  761. //delete childSelectionsMap.value[parentId]; // 如果子列表选择为空,则移除其记录
  762. childSelectionsMap.value[parentId] = [];
  763. }
  764. // 重新计算 selectedRows,合并所有子列表的选中项,并基于 detail 项的 id 去重
  765. const allSelections = Object.values(childSelectionsMap.value).flat();
  766. if (allSelections.length > 0 && allSelections[0].id !== undefined) {
  767. selectedRows.value = Array.from(new Map(allSelections.map(item => [item.id, item])).values());
  768. } else {
  769. // 如果没有 id 字段或者 allSelections 为空,直接赋值(或根据实际情况处理)
  770. selectedRows.value = allSelections;
  771. }
  772. //console.log('Updated selectedRows:', selectedRows.value);
  773. }
  774. const handleExpandChange = (row,expandedRows) => {
  775. if (expandedRows.includes(row)) {
  776. //console.log(`展开行`,row);
  777. } else {
  778. //console.log(`收起行`,row);
  779. childSelectionsMap.value[row.id] = [];
  780. // 重新计算 selectedRows,合并所有子列表的选中项,并基于 detail 项的 id 去重
  781. const allSelections = Object.values(childSelectionsMap.value).flat();
  782. if (allSelections.length > 0 && allSelections[0].id !== undefined) {
  783. selectedRows.value = Array.from(new Map(allSelections.map(item => [item.id, item])).values());
  784. } else {
  785. // 如果没有 id 字段或者 allSelections 为空,直接赋值(或根据实际情况处理)
  786. selectedRows.value = allSelections;
  787. }
  788. }
  789. //console.log('Updated selectedRows:', selectedRows.value);
  790. }
  791. const handleChildExpandChange = (row,expandedRows,id) => {
  792. // if (expandedRows.includes(row)) {
  793. // //console.log(`展开行`,row);
  794. // } else {
  795. // //console.log(`收起行`,row);
  796. // childSelectionsMap.value[id] = [];
  797. // //console.log(`childSelectionsMap.value child`,childSelectionsMap.value);
  798. // // 重新计算 selectedRows,合并所有子列表的选中项,并基于 detail 项的 id 去重
  799. // const allSelections = Object.values(childSelectionsMap.value).flat();
  800. // //console.log('allSelections:', allSelections);
  801. // if (allSelections.length > 0 && allSelections[0].id !== undefined) {
  802. // selectedRows.value = Array.from(new Map(allSelections.map(item => [item.id, item])).values());
  803. // } else {
  804. // // 如果没有 id 字段或者 allSelections 为空,直接赋值(或根据实际情况处理)
  805. // selectedRows.value = allSelections;
  806. // }
  807. // }
  808. console.log('Updated selectedRows:', childSelectionsMap.value);
  809. }
  810. //保存查询参数
  811. const QUERY_PARAMS_CACHE_KEY = 'equip_pipe_scheduling_query_params'
  812. // 保存查询参数到缓存
  813. const saveQueryParamsToCache = () => {
  814. const cacheData = {
  815. queryParams: unref(queryParams),
  816. datePickerType: unref(datePickerType),
  817. dateRange: unref(daterange),
  818. month: unref(month),
  819. selectedTypeList: unref(selectedTypeList),
  820. }
  821. localStorage.setItem(QUERY_PARAMS_CACHE_KEY, JSON.stringify(cacheData))
  822. }
  823. // 从缓存恢复查询参数
  824. const loadQueryParamsFromCache = () => {
  825. const cacheData = localStorage.getItem(QUERY_PARAMS_CACHE_KEY)
  826. if (cacheData) {
  827. try {
  828. const parsedData = JSON.parse(cacheData)
  829. // 排除 useStatus和relateDepartment、pageNo、pageSize 字段
  830. const { useStatus,relateDepartment, pageNo, pageSize, ...queryParamsWithoutStatus } = parsedData.queryParams
  831. queryParams.value = {
  832. ...queryParams.value,
  833. ...queryParamsWithoutStatus
  834. }
  835. datePickerType.value = parsedData.datePickerType
  836. daterange.value = parsedData.dateRange
  837. month.value = parsedData.month
  838. selectedTypeList.value = parsedData.selectedTypeList
  839. } catch (error) {
  840. console.error('解析缓存数据失败:', error)
  841. }
  842. }
  843. }*/
  844. /** 判断是否有已排期的时间 */
  845. const hasPlanSchedule = (row: any, type: 'legal' | 'year') => {
  846. if (type === 'legal') {
  847. return row.planLegalCheckDate != null && row.planLegalCheckDate !== '' && row.planLegalCheckDate !== 'null'
  848. } else {
  849. return row.planYearCheckDate != null && row.planYearCheckDate !== '' && row.planYearCheckDate !== 'null'
  850. }
  851. }
  852. /** 获取子表单元格类名 */
  853. const getDetailCellClassName = ({ row, column }, mainRow) => {
  854. // 检查列是否为检验日期列,只有当有有效排期时间时才添加黄色背景类
  855. if (column.property === 'nextLegalCheckDateDetail') {
  856. if (row.planLegalCheckDate != null && row.planLegalCheckDate !== '' && row.planLegalCheckDate !== 'null') {
  857. return 'cell-scheduled'
  858. }
  859. }
  860. if (column.property === 'nextYearCheckDateDetail') {
  861. if (row.planYearCheckDate != null && row.planYearCheckDate !== '' && row.planYearCheckDate !== 'null') {
  862. return 'cell-scheduled'
  863. }
  864. }
  865. return ''
  866. }
  867. const detailTableRefs = ref<Record<string, any>>({})
  868. const setDetailTableRef = (el: any, parentId: string) => {
  869. if (el) {
  870. detailTableRefs.value[parentId] = el;
  871. }
  872. }
  873. const getDetailTableRef = (parentId: string) => {
  874. return detailTableRefs.value[parentId];
  875. }
  876. // 标志位:防止展开时恢复选中状态触发 handleDetailSelectionChange 覆盖缓存
  877. const isRestoringSelection = ref(false)
  878. /** 处理表格排序 */
  879. const handleSortChange = ({ prop, order }) => {
  880. queryParams.value.sort = prop
  881. queryParams.value.order = order
  882. handleQuery()
  883. }
  884. const getMainRowClassName = ({ row }) => {
  885. const isSelected = mainTableRef.value?.getSelectionRows().some((item) =>
  886. item.id === row.id
  887. )
  888. return isSelected ? 'selected-row' : ''
  889. }
  890. const getRowClassName = ({row}) => {
  891. // 找到当前行所在的分组,从 Map 中获取对应的表格实例
  892. const tableRef = getDetailTableRef(row.equipPipeId)
  893. if (tableRef) {
  894. const isSelected = tableRef.getSelectionRows().some((item) =>
  895. item.id === row.id
  896. )
  897. return isSelected ? 'selected-row' : ''
  898. }
  899. return ''
  900. }
  901. const handleExpandChange = (row, expandedRows: any[]) => {
  902. const rowId = row.id
  903. const isExpanded = expandedRows.some((r) => r.id === rowId)
  904. if (isExpanded) {
  905. // 展开时,从缓存中恢复或初始化
  906. if (!expandedRowsCache.value.has(rowId)) {
  907. // 首次展开,初始化缓存
  908. expandedRowsCache.value.set(rowId, {
  909. pipes: row.pipes || [],
  910. selectedIds: new Set<string>()
  911. })
  912. }
  913. // 恢复选中状态
  914. nextTick(() => {
  915. const cache = expandedRowsCache.value.get(rowId)
  916. const tableRef = getDetailTableRef(rowId)
  917. if (cache && tableRef && cache.pipes.length > 0) {
  918. // 设置标志位,防止触发 handleDetailSelectionChange
  919. isRestoringSelection.value = true
  920. cache.pipes.forEach((pipe) => {
  921. if (cache.selectedIds.has(pipe.id)) {
  922. tableRef.toggleRowSelection(pipe, true)
  923. }
  924. })
  925. // 恢复完成后,延迟重置标志位
  926. nextTick(() => {
  927. isRestoringSelection.value = false
  928. })
  929. }
  930. })
  931. } else {
  932. // 收起时,保存当前选中状态
  933. const tableRef = getDetailTableRef(rowId)
  934. if (tableRef) {
  935. const currentSelection = tableRef.getSelectionRows()
  936. const selectedIds = new Set(currentSelection.map((item: any) => item.id))
  937. expandedRowsCache.value.set(rowId, {
  938. pipes: row.pipes || [],
  939. selectedIds: selectedIds
  940. })
  941. }
  942. }
  943. // 更新展开的行 key 列表
  944. expandRowKeys.value = expandedRows.map((r) => r.id)
  945. }
  946. /** 处理行点击勾选 */
  947. const handleMainRowClick = (row, _event,_column) => {
  948. mainTableRef.value?.toggleRowSelection(row)
  949. }
  950. const handleRowClick = (row, _event, column) => {
  951. // 如果点击的是选择列,不处理
  952. if (column.type === 'selection') {
  953. return
  954. }
  955. // 找到当前行所在的分组,从 Map 中获取对应的表格实例
  956. const tableRef = getDetailTableRef(row.equipPipeId)
  957. if (tableRef && tableRef.toggleRowSelection) {
  958. tableRef.toggleRowSelection(row)
  959. }
  960. }
  961. // 已展开行的 key 列表
  962. const expandRowKeys = ref<string[]>([])
  963. // 缓存展开行的子表数据和选中状态
  964. const expandedRowsCache = ref<Map<string, { pipes: any[], selectedIds: Set<string> }>>(new Map())
  965. /** 表格选择框变化 */
  966. const handleSelectionChange = async (selection: any[]) => {
  967. // 计算取消选择的行
  968. const deselectedRows = selectedRows.value.filter(
  969. item => !selection.includes(item)
  970. );
  971. selectedRows.value = selection
  972. // 清除取消选中行的子表选择(包括展开的和收起的)
  973. deselectedRows.forEach(item => {
  974. const rowId = item.id
  975. // 如果该行是展开状态,直接清除表格选中
  976. const tableRef = getDetailTableRef(rowId)
  977. if (tableRef) {
  978. tableRef.clearSelection()
  979. }
  980. // 无论是否展开,都清除缓存中的选中状态
  981. if (expandedRowsCache.value.has(rowId)) {
  982. expandedRowsCache.value.get(rowId)!.selectedIds.clear()
  983. }
  984. // 从全局选中的子表数据中移除
  985. selectedDetailRows.value = selectedDetailRows.value.filter(
  986. detailRow => detailRow.equipPipeId !== rowId
  987. )
  988. })
  989. }
  990. /** 处理子表选择变化 */
  991. const handleDetailSelectionChange = (selection: any[], mainRow: any) => {
  992. // 如果正在恢复选中状态,不更新缓存(避免展开时 toggleRowSelection 触发此函数覆盖缓存)
  993. if (isRestoringSelection.value) {
  994. return
  995. }
  996. const rowId = mainRow.id
  997. // 更新缓存中的选中状态(如果缓存不存在则创建)
  998. if (!expandedRowsCache.value.has(rowId)) {
  999. // 如果该行还未展开,初始化缓存
  1000. expandedRowsCache.value.set(rowId, {
  1001. pipes: mainRow.pipes || [],
  1002. selectedIds: new Set<string>()
  1003. })
  1004. }
  1005. const cache = expandedRowsCache.value.get(rowId)!
  1006. cache.selectedIds = new Set(selection.map((item: any) => item.id))
  1007. // 更新全局选中的子表数据
  1008. selectedDetailRows.value = selectedDetailRows.value.filter((item) => item.equipPipeId !== mainRow.id)
  1009. selectedDetailRows.value = [...selectedDetailRows.value.filter(row => !selection.some(sel => sel.id === row.id)), ...selection]
  1010. // 如果子表有选中项,则自动选中主表行;否则取消选中主表行
  1011. nextTick(() => {
  1012. if (selection.length > 0) {
  1013. // 子表有选中项,选中主表行
  1014. mainTableRef.value.toggleRowSelection(mainRow, true);
  1015. } else if (!selectedDetailRows.value.map(row => row.equipPipeId).includes(mainRow.id)) {
  1016. const currentlySelected = selectedRows.value.some(row => row.id === mainRow.id);
  1017. if (currentlySelected && selection.length === 0) {
  1018. // 只有当主行当前是选中状态且子表没有任何选中项时才取消主行选择
  1019. mainTableRef.value.toggleRowSelection(mainRow, false);
  1020. }
  1021. }
  1022. });
  1023. }
  1024. /** 处理编辑操作 */
  1025. const handleEdit = (row: any) => {
  1026. // 传递当前的查询条件,处理 relateDepartment 类型
  1027. const currentQueryParams = {
  1028. ...queryParams.value,
  1029. relateDepartment: queryParams.value.relateDepartment?.toString(),
  1030. datePickerType: datePickerType.value,
  1031. month: month.value,
  1032. nextDate: queryParams.value.nextDate
  1033. }
  1034. //console.log(currentQueryParams)
  1035. detailDialogRef.value?.open(row, currentQueryParams)
  1036. }
  1037. const handleSchedule = async (row: any,checkType?: string) => {
  1038. selectedRows.value = [row]
  1039. //按定检和年检分组
  1040. selectedLegalList.value = []
  1041. selectedYearList.value = []
  1042. row.pipes.forEach(item => {
  1043. if (selectedDetailRows.value.includes(item)) {
  1044. if (!item.hasLegalScheduling && item.planLegalCheckDate == null) {
  1045. selectedLegalList.value.push(item)
  1046. }
  1047. if (!item.hasYearScheduling && item.planYearCheckDate == null) {
  1048. selectedYearList.value.push(item)
  1049. }
  1050. }
  1051. })
  1052. if (selectedLegalList.value.length == 0 && selectedYearList.value.length == 0) {
  1053. // 默认带出全部
  1054. row.pipes.forEach(item => {
  1055. if (!item.hasLegalScheduling && item.planLegalCheckDate == null) {
  1056. selectedLegalList.value.push(item)
  1057. }
  1058. if (!item.hasYearScheduling && item.planYearCheckDate == null) {
  1059. selectedYearList.value.push(item)
  1060. }
  1061. })
  1062. }
  1063. scheduleDialogRef.value?.open(selectedLegalList.value, selectedYearList.value,checkType)
  1064. }
  1065. const handleExport = async () => {
  1066. try {
  1067. const data = await EquipPipeSchedulingApi.exportEquipPipeScheduling(queryParams.value)
  1068. download.excel(data, '管道计划排期表单.xls')
  1069. message.success('导出成功')
  1070. } catch (error) {
  1071. console.error(error)
  1072. message.error('导出失败')
  1073. }
  1074. }
  1075. /** 初始化 **/
  1076. onMounted(() => {
  1077. //loadQueryParamsFromCache()
  1078. getList()
  1079. })
  1080. onUnmounted(()=>{
  1081. //saveQueryParamsToCache()
  1082. })
  1083. </script>
  1084. <style lang="scss" scoped>
  1085. .check-number {
  1086. font-size: 18px;
  1087. font-weight: bold;
  1088. }
  1089. .regular-check {
  1090. color: var(--el-color-primary);
  1091. }
  1092. .year-check {
  1093. color: var(--el-color-success);
  1094. }
  1095. .expired-check {
  1096. color: var(--el-color-danger);
  1097. }
  1098. .containerView {
  1099. padding: 10px;
  1100. }
  1101. ::v-deep .el-select__selection.is-near {
  1102. max-height: 200px;
  1103. overflow-y: scroll;
  1104. scrollbar-width: none;
  1105. -ms-overflow-style: none;
  1106. }
  1107. ::v-deep .containerView .el-select__wrapper {
  1108. min-width: 200px;
  1109. }
  1110. // 外层表格复选框样式
  1111. ::v-deep .outer-table .el-checkbox__input.is-checked .el-checkbox__inner,
  1112. ::v-deep .outer-table .el-checkbox__input.is-indeterminate .el-checkbox__inner {
  1113. }
  1114. ::v-deep .outer-table .el-checkbox__input.is-checked .el-checkbox__inner::after {
  1115. border-color: #fff;
  1116. }
  1117. // 内层表格复选框样式
  1118. ::v-deep .inner-table .el-checkbox__input.is-checked .el-checkbox__inner,
  1119. ::v-deep .inner-table .el-checkbox__input.is-indeterminate .el-checkbox__inner {
  1120. background-color: #67c23a; // 绿色
  1121. border-color: #67c23a;
  1122. }
  1123. ::v-deep .inner-table .el-checkbox__input.is-checked .el-checkbox__inner::after {
  1124. border-color: #fff;
  1125. }
  1126. // 外层表格选中行背景色
  1127. ::v-deep .outer-table .el-table__body tr.current-row > td {
  1128. background-color: #ecf5ff;
  1129. }
  1130. // 内层表格选中行背景色
  1131. ::v-deep .inner-table .el-table__body tr.current-row > td {
  1132. background-color: #f0f9eb;
  1133. }
  1134. :deep(.selected-row){
  1135. background-color: #ecf5ff !important;
  1136. }
  1137. // 子表选中行特殊背景色(浅绿色)
  1138. :deep(.inner-table .selected-row) {
  1139. background-color: #e8f5e9 !important;
  1140. }
  1141. // 排期日期链接样式
  1142. .schedule-date-link {
  1143. cursor: pointer;
  1144. color: var(--el-color-primary);
  1145. transition: all 0.2s;
  1146. &:hover {
  1147. color: var(--el-color-primary-light-3);
  1148. text-decoration: underline;
  1149. }
  1150. }
  1151. // 排期统计分数样式
  1152. .schedule-count {
  1153. font-size: 12px;
  1154. color: var(--el-color-info);
  1155. font-weight: 500;
  1156. background-color: #FFFF99;
  1157. }
  1158. // 已完成排期的样式
  1159. .schedule-count-completed {
  1160. color: var(--el-color-info);
  1161. background-color: #C5F1C1;
  1162. }
  1163. // 分数占位符,用于对齐
  1164. .schedule-count-placeholder {
  1165. width: 26.91px;
  1166. flex-shrink: 0;
  1167. }
  1168. // 排期单元格样式
  1169. .schedule-cell {
  1170. display: flex;
  1171. align-items: center;
  1172. justify-content: center;
  1173. min-height: 24px;
  1174. gap: 5px;
  1175. position: relative;
  1176. }
  1177. // 日期文本容器
  1178. .schedule-date {
  1179. min-width: 80px;
  1180. text-align: center;
  1181. flex-shrink: 0;
  1182. line-height: 24px;
  1183. }
  1184. // 已排期的单元格黄色背景
  1185. :deep(.cell-scheduled) {
  1186. background-color: #FFFF99 !important;
  1187. }
  1188. .schedule-link {
  1189. color: var(--el-color-primary);
  1190. &:hover {
  1191. color: var(--el-color-primary-light-3);
  1192. }
  1193. }
  1194. </style>