index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  1. <template>
  2. <ContentWrap>
  3. <!-- 搜索工作栏 -->
  4. <el-form
  5. class="-mb-15px"
  6. :model="taskStatusQueryParams[taskStatus]"
  7. ref="queryFormRef"
  8. :inline="true"
  9. label-width="100px"
  10. >
  11. <el-row :gutter="20" class="flex-wrap" style="margin-right: 0">
  12. <template v-for="(item, index) in formItems" :key="item.prop">
  13. <el-col :xs="24" :sm="12" :md="8" :lg="6">
  14. <el-collapse-transition>
  15. <div v-show="isSearchExpanded || index < 4">
  16. <el-form-item :label="item.label" :prop="item.prop" class="w-full">
  17. <template v-if="item.component === 'select-modal'">
  18. <el-select
  19. v-model="taskStatusQueryParams[taskStatus][item.prop]"
  20. readonly
  21. clearable
  22. placeholder="请选择"
  23. multiple
  24. popper-class="user-select-popper"
  25. @click.stop.prevent="() => handleOpenUserDialog(item.selctOptions, item.prop)"
  26. class="w-full"
  27. >
  28. <el-option
  29. v-for="child in item.selctOptions"
  30. :key="child && child.id"
  31. :label="child.nickName"
  32. :value="child.id"
  33. />
  34. </el-select>
  35. </template>
  36. <component
  37. v-else
  38. :is="item.component"
  39. v-model="taskStatusQueryParams[taskStatus][item.prop]"
  40. v-bind="item.attrs"
  41. @keyup.enter="handleQuery"
  42. class="w-full min-w-[180px] sm:min-w-[220px] lg:min-w-[240px]"
  43. >
  44. <!-- select 的 option 渲染 -->
  45. <template v-if="item.component === 'el-select'">
  46. <el-option
  47. v-for="child in item.children"
  48. :key="child.value"
  49. :label="child.label"
  50. :value="child.value"
  51. />
  52. </template>
  53. </component>
  54. </el-form-item>
  55. </div>
  56. </el-collapse-transition>
  57. </el-col>
  58. </template>
  59. </el-row>
  60. <!-- 按钮区 -->
  61. <el-row class="flex justify-end mt-2">
  62. <el-form-item>
  63. <el-button @click="handleQuery">
  64. <Icon icon="ep:search" class="mr-5px" /> 搜索
  65. </el-button>
  66. <el-button @click="resetQuery">
  67. <Icon icon="ep:refresh" class="mr-5px" /> 重置
  68. </el-button>
  69. <!-- <el-button type="primary" @click="showSettingDialog">-->
  70. <!-- <Icon icon="ep:user" class="mr-5px" /> 审核配置-->
  71. <!-- </el-button>-->
  72. <el-button link @click="isSearchExpanded = !isSearchExpanded">
  73. <el-icon>
  74. <ArrowUp v-if="isSearchExpanded" />
  75. <ArrowDown v-else />
  76. </el-icon>
  77. {{ isSearchExpanded ? '收起' : '展开' }}
  78. </el-button>
  79. </el-form-item>
  80. </el-row>
  81. </el-form>
  82. </ContentWrap>
  83. <!-- 列表 -->
  84. <ContentWrap>
  85. <el-radio-group v-model="taskStatus" class="mb-10px" @change="handleQuery">
  86. <el-radio-button label="全部" value="all" />
  87. <el-radio-button label="报告编制" value="reportInput" />
  88. <el-radio-button label="报告审核" value="reportAudit" />
  89. <el-radio-button label="报告审批" value="reportApprove" />
  90. <el-radio-button label="报告办结" value="reportEnd" />
  91. </el-radio-group>
  92. <el-table
  93. v-loading="loading"
  94. :data="list"
  95. class="cursor-pointer"
  96. border
  97. :stripe="true"
  98. ref="MyTaskTableListRef"
  99. @row-dblclick="handleRowDblclick"
  100. >
  101. <el-table-column type="selection" align="center" width="55" />
  102. <el-table-column label="任务单号" align="center" prop="orderNo" min-width="150px" />
  103. <el-table-column label="设备代码" align="center" prop="equipCode" min-width="200px">
  104. <template #default="{ row }">
  105. <div class="mb-8px">{{ row.equipCode }}</div>
  106. <el-tag v-if="row.productCode" type="success">{{ row.productCode }}</el-tag>
  107. </template>
  108. </el-table-column>
  109. <!-- <el-table-column label="设备名称" align="center" prop="equipName" min-width="120px" /> -->
  110. <el-table-column label="使用单位" align="center" prop="unitName" min-width="150px" />
  111. <el-table-column label="检验性质" align="center" prop="checkType" min-width="120px">
  112. <template #default="scope">
  113. {{ PressureBoilerCheckTypeMap[scope.row.checkType] }}
  114. </template>
  115. </el-table-column>
  116. <!-- 检验项目 -->
  117. <el-table-column label="检验项目" prop="reportDOList" :min-width="200" align="center">
  118. <!-- <template #default="scope">
  119. <div v-if="scope.row.reportDOList && scope.row.reportDOList.length > 0">
  120. <div class="reportDOList-item">
  121. &lt;!&ndash; 数据大于2条时,使用展开收起功能 &ndash;&gt;
  122. <div v-if="scope.row.reportDOList.length > 2">
  123. &lt;!&ndash; 始终显示的前2条数据 &ndash;&gt;
  124. <div
  125. v-for="(item, index) in scope.row.reportDOList.slice(0, 2)"
  126. :key="item?.id || index"
  127. class="report-item"
  128. >
  129. <div style="color: #015293">
  130. {{ index + 1 }}、{{ item?.reportName }}
  131. </div>
  132. <div v-if="item?.fee" style="color: #015293">
  133. (费用:{{ item?.fee }})
  134. </div>
  135. </div>
  136. &lt;!&ndash; 可展开的剩余数据 &ndash;&gt;
  137. <div
  138. class="expandable-content"
  139. :style="{
  140. maxHeight: isExpanded(scope.row)
  141. ? `${(scope.row.reportDOList.length - 2) * 40}px`
  142. : '0px',
  143. transition: 'max-height 0.4s cubic-bezier(0.4, 0, 0.2, 1)',
  144. overflow: 'hidden'
  145. }"
  146. >
  147. <div
  148. v-for="(item, index) in scope.row.reportDOList.slice(2)"
  149. :key="item?.id || `extra-${index}`"
  150. class="report-item-animated"
  151. :style="{
  152. opacity: isExpanded(scope.row) ? 1 : 0,
  153. transform: isExpanded(scope.row) ? 'translateY(0)' : 'translateY(-10px)',
  154. transition: `all 0.3s ease ${index * 50}ms`,
  155. padding: '2px 0'
  156. }"
  157. >
  158. <div link type="primary" style="color: #015293">
  159. {{ index + 3 }}、{{ item?.reportName }}
  160. </div>
  161. <div v-if="item?.fee" style="color: #015293">
  162. (费用:{{ item?.fee }})
  163. </div>
  164. </div>
  165. </div>
  166. &lt;!&ndash; 展开收起按钮 &ndash;&gt;
  167. <div class="expand-control" style="text-align: center; margin-top: 8px">
  168. <el-button
  169. size="small"
  170. link
  171. type="primary"
  172. @click="toggleExpand(scope.row)"
  173. class="expand-button"
  174. :style="{
  175. transition: 'all 0.2s ease'
  176. }"
  177. >
  178. <span style="margin-right: 4px">
  179. {{
  180. isExpanded(scope.row)
  181. ? '收起'
  182. : `查看更多(${scope.row.reportDOList.length - 2}条)`
  183. }}
  184. </span>
  185. <el-icon
  186. :style="{
  187. width: '12px',
  188. height: '12px',
  189. display: 'inline-block',
  190. transition: 'transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
  191. transform: isExpanded(scope.row) ? 'rotate(180deg)' : 'rotate(0deg)'
  192. }"
  193. >
  194. <ArrowDown />
  195. </el-icon>
  196. </el-button>
  197. </div>
  198. </div>
  199. &lt;!&ndash; 数据小于等于2条时,直接显示所有数据 &ndash;&gt;
  200. <div v-else>
  201. <div
  202. v-for="(item, index) in scope.row.reportDOList"
  203. :key="item?.id || index"
  204. class="report-item"
  205. >
  206. <div style="color: #015293">
  207. {{ index + 1 }}、{{ item?.reportName }}
  208. </div>
  209. <div v-if="item?.fee" style="color: #015293">
  210. (费用:{{ item?.fee }})
  211. </div>
  212. </div>
  213. </div>
  214. </div>
  215. </div>
  216. <div v-else class="empty-data">-</div>
  217. </template>-->
  218. <template #default="scope">
  219. <BoilerReportList :row="scope.row"/>
  220. </template>
  221. </el-table-column>
  222. <el-table-column label="主报告状态" align="center" prop="taskStatus" min-width="150px">
  223. <template #default="scope">
  224. <el-tag :type="getTypeColor(scope.row.taskStatus)">{{
  225. PressureCheckerMyTaskStatusMap[scope.row.taskStatus]
  226. }}</el-tag>
  227. </template>
  228. </el-table-column>
  229. <el-table-column
  230. label="剩余期限 (工作日)"
  231. align="center"
  232. prop="remainingDays"
  233. min-width="140px"
  234. />
  235. <el-table-column label="检验时间" align="center" prop="checkDate" min-width="120px">
  236. <template #default="scope">
  237. {{ formatArrayDate(scope.row.checkDate) }}
  238. </template>
  239. </el-table-column>
  240. <el-table-column label="项目负责人" align="center" prop="manager" min-width="120px">
  241. <template #default="scope">
  242. {{
  243. scope.row.manager
  244. ? scope.row.manager.nickname + ' (' + scope.row.manager.employeeNo + ')'
  245. : '-'
  246. }}
  247. </template>
  248. </el-table-column>
  249. <!-- 主检人 -->
  250. <el-table-column label="主检人" align="center" prop="mainInspector" min-width="120px">
  251. <template #default="scope">
  252. {{
  253. scope.row.mainCheckerUser
  254. ? scope.row.mainCheckerUser.nickname +
  255. ' (' +
  256. scope.row.mainCheckerUser.employeeNo +
  257. ')'
  258. : '-'
  259. }}
  260. </template>
  261. </el-table-column>
  262. <el-table-column label="检验员" align="center" prop="checkUsers" min-width="150px">
  263. <template #default="scope">
  264. <div v-if="scope.row.checkUsers && scope.row.checkUsers.length > 0">
  265. <div v-for="user in scope.row.checkUsers" :key="user.id">
  266. {{ user.nickname }} ({{ user.employeeNo }})
  267. </div>
  268. </div>
  269. <div v-else>-</div>
  270. </template>
  271. </el-table-column>
  272. <el-table-column label="操作" align="center" min-width="150px" fixed="right">
  273. <template #default="scope">
  274. <div class="flex flex-col gap-1">
  275. <el-button link type="primary" @click="handleEdit(scope.row)"> 编制报告 </el-button>
  276. </div>
  277. </template>
  278. </el-table-column>
  279. </el-table>
  280. <!-- 分页 -->
  281. <Pagination
  282. :total="total"
  283. v-model:page="taskStatusQueryParams[taskStatus].pageNo"
  284. v-model:limit="taskStatusQueryParams[taskStatus].pageSize"
  285. @pagination="getList"
  286. />
  287. </ContentWrap>
  288. <SettingDialog ref="formRef" />
  289. <!-- 选择人员公共弹窗 -->
  290. <CustomDialog
  291. v-model="customUserDialogVisible"
  292. :dialogAttrs="{
  293. zIndex: 10006
  294. }"
  295. @confirm="handleUserConfirm"
  296. >
  297. <el-input
  298. v-model="userQueryData.nickName"
  299. clearable
  300. placeholder="请输入名称"
  301. @keyup.enter="handleFetchUserList"
  302. style="margin-bottom: 14px"
  303. >
  304. <template #append>
  305. <el-button @click="handleFetchUserList">
  306. <Icon icon="ep:search" />
  307. </el-button>
  308. </template>
  309. </el-input>
  310. <SmartTable
  311. ref="userTableRef"
  312. v-model:pageNo="userQueryData.pageNo"
  313. v-model:pagesize="userQueryData.pageSize"
  314. :total="userQueryData.total"
  315. v-model:columns="userColumns"
  316. :data="userTableList"
  317. :buttons="[]"
  318. :showSettingTools="false"
  319. :showSearch="false"
  320. :showRefresh="false"
  321. @on-page-size-change="onPageSizeChange"
  322. @on-page-no-change="onPageNoChange"
  323. />
  324. </CustomDialog>
  325. </template>
  326. <script setup lang="ts">
  327. import { ref, reactive, onMounted, computed } from 'vue'
  328. import { formatArrayDate } from '@/utils/formatTime'
  329. import { ArrowDown, ArrowUp } from '@element-plus/icons-vue'
  330. import { BoilerTaskOrderApi, BoilerTaskOrderOrderItemVO } from '@/api/pressure2/boilertaskorder'
  331. import {
  332. PressureBoilerCheckTypeMap,
  333. PressureCheckerMyTaskStatusMap,
  334. PressureCheckerMyTaskStatus,
  335. PressureTaskOrderTaskStatus
  336. } from '@/utils/constants'
  337. import { ElMessageBox, ElMessage } from 'element-plus'
  338. import { useRouter, useRoute } from 'vue-router'
  339. import SettingDialog from '@/views/pressure/checker/components/SettingDialog.vue'
  340. const router = useRouter()
  341. import SmartTable from '@/components/SmartTable/SmartTable'
  342. import { getUserList } from '@/api/common/user'
  343. import { useUserStore } from '@/store/modules/user'
  344. import { cloneDeep } from 'lodash-es'
  345. import { useEmitt } from '@/hooks/web/useEmitt'
  346. import BoilerReportList from "@/views/pressure2/boilerReportPreparationList/BoilerReportList.vue";
  347. const userStore = useUserStore()
  348. const userInfo = computed(() => userStore.user)
  349. const route = useRoute()
  350. const getTypeColor = (status: string | number) => {
  351. const statusMap = {
  352. [PressureTaskOrderTaskStatus.WAIT_CONFIRM]: 'primary',
  353. [PressureTaskOrderTaskStatus.CANCELLED]: 'info',
  354. [PressureTaskOrderTaskStatus.AUDITING_EDIT]: 'warning',
  355. [PressureTaskOrderTaskStatus.AUDITING_CANCEL]: 'warning',
  356. [PressureTaskOrderTaskStatus.AUDITING_TIME]: 'warning',
  357. [PressureTaskOrderTaskStatus.CONFIRMED]: 'success',
  358. [PressureTaskOrderTaskStatus.RECORD_INPUT]: 'warning',
  359. [PressureTaskOrderTaskStatus.RECORD_CHECK]: 'warning',
  360. [PressureTaskOrderTaskStatus.REPORT_INPUT]: 'warning',
  361. [PressureTaskOrderTaskStatus.REPORT_AUDIT]: 'warning',
  362. [PressureTaskOrderTaskStatus.REPORT_APPROVE]: 'warning',
  363. [PressureTaskOrderTaskStatus.REPORT_CONFIRMATION]: 'warning',
  364. [PressureTaskOrderTaskStatus.REPORT_END]: 'success'
  365. }
  366. return statusMap[status] || 'info'
  367. }
  368. /** 报告编制 列表 */
  369. defineOptions({ name: 'BoilerReportPreparationList' })
  370. const isSearchExpanded = ref<boolean>(false)
  371. const loading = ref(true)
  372. const list = ref<BoilerTaskOrderOrderItemVO[]>([])
  373. const total = ref(0)
  374. const queryParams = reactive<Recordable>({
  375. pageNo: 1,
  376. pageSize: 10,
  377. orderNo: undefined,
  378. unitName: undefined,
  379. checkType: undefined,
  380. equipCode: undefined,
  381. productNo: undefined,
  382. checkDate: [],
  383. // checkUserStrIds: [userInfo.value.id],
  384. // managerStrIds: [userInfo.value.id],
  385. checkUserStrIds: [],
  386. managerStrIds: [],
  387. // taskStatusList: ['520'],
  388. remainingDays: undefined,
  389. mainCheckerStrIds: [userInfo.value.id]
  390. })
  391. const defaultFormValue = {
  392. pageNo: 1,
  393. pageSize: 10,
  394. orderNo: undefined,
  395. unitName: undefined,
  396. checkType: undefined,
  397. equipCode: undefined,
  398. productNo: undefined,
  399. checkDate: [],
  400. // checkUserStrIds: [userInfo.value.id],
  401. // managerStrIds: [userInfo.value.id],
  402. checkUserStrIds: [],
  403. managerStrIds: [],
  404. // taskStatusList: ['520'],
  405. remainingDays: undefined,
  406. mainCheckerStrIds: [userInfo.value.id]
  407. }
  408. const taskStatus = ref('reportInput')
  409. const taskStatusQueryParams =reactive({
  410. all: {...defaultFormValue, taskStatus: 'all'},
  411. reportInput: {...defaultFormValue, taskStatus: 520},
  412. reportAudit: {...defaultFormValue, taskStatus: 600},
  413. reportApprove: {...defaultFormValue, taskStatus: 700},
  414. reportEnd: {...defaultFormValue, taskStatus: 800}
  415. })
  416. const ReportPreparationStatusOpts = {
  417. [PressureCheckerMyTaskStatus.REPORT_INPUT]: '报告编制',
  418. [PressureCheckerMyTaskStatus.REPORT_AUDIT]: '报告审核',
  419. [PressureCheckerMyTaskStatus.REPORT_APPROVE]: '报告审批',
  420. [PressureCheckerMyTaskStatus.REPORT_END]: '报告办结'
  421. }
  422. const formItems = [
  423. {
  424. label: '设备代码',
  425. prop: 'equipCode',
  426. component: 'el-input',
  427. attrs: {
  428. placeholder: '请输入设备代码',
  429. clearable: true
  430. }
  431. },
  432. // {
  433. // label: '任务状态',
  434. // prop: 'taskStatusList',
  435. // component: 'el-select',
  436. // attrs: {
  437. // placeholder: '请选择任务状态',
  438. // clearable: true,
  439. // multiple: true
  440. // },
  441. // children: [
  442. // // { label: '全部', value: 'all' },
  443. // ...Object.entries(ReportPreparationStatusOpts).map(([key, label]) => ({
  444. // label,
  445. // value: key
  446. // }))
  447. // ]
  448. // },
  449. {
  450. label: '任务单号',
  451. prop: 'orderNo',
  452. component: 'el-input',
  453. attrs: {
  454. placeholder: '请输入任务单号',
  455. clearable: true
  456. }
  457. },
  458. {
  459. label: '使用单位',
  460. prop: 'unitName',
  461. component: 'el-input',
  462. attrs: {
  463. placeholder: '请输入使用单位',
  464. clearable: true
  465. }
  466. },
  467. {
  468. label: '检验性质',
  469. prop: 'checkType',
  470. component: 'el-select',
  471. attrs: {
  472. placeholder: '请选择检验性质',
  473. clearable: true
  474. },
  475. children: Object.entries(PressureBoilerCheckTypeMap).map(([key, label]) => ({
  476. label,
  477. value: key
  478. }))
  479. },
  480. {
  481. label: '检验时间',
  482. prop: 'checkDate',
  483. component: 'el-date-picker',
  484. attrs: {
  485. type: 'daterange',
  486. placeholder: '请选择时间',
  487. startPlaceholder: '开始日期',
  488. endPlaceholder: '结束日期',
  489. valueFormat: 'YYYY-MM-DD HH:mm:ss',
  490. defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')],
  491. class: '!w-240px'
  492. }
  493. },
  494. {
  495. label: '主检人',
  496. prop: 'mainCheckerStrIds',
  497. component: 'select-modal',
  498. selctOptions: [{ id: userInfo.value.id, nickName: userInfo.value?.nickname }],
  499. attrs: {
  500. placeholder: '请输入主检人名称',
  501. clearable: true
  502. }
  503. },
  504. {
  505. label: '检验员',
  506. prop: 'checkUserStrIds',
  507. component: 'select-modal',
  508. selctOptions: [{ id: userInfo.value.id, nickName: userInfo.value?.nickname }],
  509. attrs: {
  510. placeholder: '请输入检验员名称',
  511. clearable: true
  512. }
  513. },
  514. {
  515. label: '项目负责人',
  516. prop: 'managerStrIds',
  517. component: 'select-modal',
  518. selctOptions: [{ id: userInfo.value.id, nickName: userInfo.value?.nickname }],
  519. attrs: {
  520. placeholder: '请输入项目负责人',
  521. clearable: true
  522. }
  523. },
  524. // {
  525. // label: '剩余期限',
  526. // prop: 'remainingDays',
  527. // component: 'el-input',
  528. // attrs: {
  529. // placeholder: '请输入剩余期限',
  530. // clearable: true
  531. // }
  532. // },
  533. // {
  534. // label: '出厂编号',
  535. // prop: 'productNo',
  536. // component: 'el-input',
  537. // attrs: {
  538. // placeholder: '请输入出厂编号',
  539. // clearable: true
  540. // }
  541. // }
  542. ]
  543. const queryFormRef = ref()
  544. const formRef = ref()
  545. const showSettingDialog = () => {
  546. formRef.value.open()
  547. }
  548. // 存储展开状态的响应式数据
  549. const expandedRows = ref(new Set())
  550. // 判断行是否展开
  551. const isExpanded = (row) => {
  552. return expandedRows.value.has(row.id || JSON.stringify(row))
  553. }
  554. // 切换展开状态
  555. const toggleExpand = (row) => {
  556. const rowKey = row.id || JSON.stringify(row)
  557. if (expandedRows.value.has(rowKey)) {
  558. expandedRows.value.delete(rowKey)
  559. } else {
  560. expandedRows.value.add(rowKey)
  561. }
  562. }
  563. const formattingFn = (reportDOList: Record<string, any>[]) => {
  564. return `<ol style="padding: 10px">${reportDOList
  565. .map((item) => `<li>${item.reportName}</li>`)
  566. .join('')}</ol>`
  567. }
  568. const MyTaskTableListRef = ref() // table的实例
  569. // 出具报告对话框状态
  570. const generateReportDialogVisible = ref(false)
  571. const currentReportItem = ref<any>(null)
  572. /** 查询列表 */
  573. const getList = async () => {
  574. loading.value = true
  575. try {
  576. const params: any = cloneDeep(taskStatusQueryParams[unref(taskStatus)])
  577. if (params.taskStatus === 'all') {
  578. params.taskStatus = undefined
  579. }
  580. params.checkUserStrIds = params.checkUserStrIds.join(',')
  581. params.managerStrIds = params.managerStrIds.join(',')
  582. params.mainCheckerStrIds = params.mainCheckerStrIds.join(',')
  583. // params.taskStatusList = params.taskStatusList.join(',')
  584. if(!params.checkUserStrIds) delete params.checkUserStrIds
  585. if(!params.managerStrIds) delete params.managerStrIds
  586. if(!params.mainCheckerStrIds) delete params.mainCheckerStrIds
  587. if(!params.taskStatusList) delete params.taskStatusList
  588. const data = await BoilerTaskOrderApi.prepareReportPage(params)
  589. list.value = data.list
  590. total.value = data.total
  591. } catch (error) {
  592. console.error('获取我的任务列表失败:', error)
  593. ElMessage.error('获取报告编制列表失败')
  594. list.value = []
  595. total.value = 0
  596. } finally {
  597. loading.value = false
  598. }
  599. }
  600. /** 搜索按钮操作 */
  601. const handleQuery = () => {
  602. taskStatusQueryParams[unref(taskStatus)].pageNo = 1
  603. getList()
  604. }
  605. /** 重置按钮操作 */
  606. const resetQuery = () => {
  607. queryFormRef.value.resetFields()
  608. // queryParams.taskStatusList = ['520']
  609. handleQuery()
  610. }
  611. // 修改后的编辑/查看详情操作
  612. const handleEdit = async(row: Record<string, any>) => {
  613. // 校验是否有完成审核审批的检验方案
  614. const res = await BoilerTaskOrderApi.checkSchemeStatus(row.id)
  615. if (!res) {
  616. ElMessage.warning('请先完成检验方案的审核审批')
  617. return
  618. }
  619. //判断报告编制时是否有结束检验日期
  620. if (row.taskStatus >= PressureTaskOrderTaskStatus.REPORT_INPUT){
  621. if (!row.endCheckDate) {
  622. ElMessage.error('请添加结束检验时间再进行编制!')
  623. return
  624. }
  625. }
  626. router.push({ name: 'BoilerCheckerTaskDetail', query: { id: row.id, type: 'BoilerReportPreparationList' } })
  627. }
  628. const handleRowDblclick = (row: Record<string, any>) => {
  629. if (row.isClaim === false) {
  630. return
  631. }
  632. // router.push({ name: 'BoilerCheckerTaskDetail', query: { id: row.id, type: 'BoilerReportPreparationList' } })
  633. }
  634. //------------人员选择弹窗------------------------
  635. const checkFormOptions = ref<any[]>([])
  636. const fieldKey = ref('')
  637. const userTableRef = ref()
  638. const customUserDialogVisible = ref(false)
  639. interface UserListQuery {
  640. nickName: string
  641. pageNo: number
  642. pageSize: number
  643. total?: number
  644. }
  645. const userQueryData = reactive<UserListQuery>({
  646. nickName: '',
  647. pageNo: 1,
  648. pageSize: 10,
  649. total: 0
  650. })
  651. const userTableList = ref<any[]>([])
  652. const userColumns = ref<any[]>([
  653. {
  654. type: 'selection',
  655. width: '50px'
  656. },
  657. {
  658. label: '工号',
  659. prop: 'employeeNo'
  660. },
  661. {
  662. label: '姓名',
  663. prop: 'nickname'
  664. },
  665. {
  666. label: '部门',
  667. prop: 'deptName'
  668. }
  669. ])
  670. // 打开用户选择框
  671. const handleOpenUserDialog = (options: any, key: string) => {
  672. checkFormOptions.value = options
  673. fieldKey.value = key
  674. userQueryData.nickName = ''
  675. userQueryData.pageNo = 1
  676. userQueryData.pageSize = 10
  677. handleFetchUserList()
  678. }
  679. // 获取用户信息
  680. const handleFetchUserList = async () => {
  681. const queryParams: UserListQuery = {
  682. ...userQueryData
  683. }
  684. delete queryParams.total
  685. const result = await getUserList(queryParams)
  686. userTableList.value = result.list
  687. userQueryData.total = result.total
  688. customUserDialogVisible.value = true
  689. }
  690. const onPageSizeChange = (val) => {
  691. userQueryData.pageSize = val
  692. handleFetchUserList()
  693. }
  694. const onPageNoChange = (val) => {
  695. userQueryData.pageNo = val
  696. handleFetchUserList()
  697. }
  698. const handleUserConfirm = () => {
  699. console.log('getTableRef', userTableRef.value.getTableRef())
  700. const selectRows = userTableRef.value.getTableRef().getSelectionRows()
  701. console.log('selectRows', selectRows)
  702. // 过滤组合合成options
  703. const currOptions = checkFormOptions.value.map((item) => item.id) || []
  704. selectRows
  705. .filter((item) => !currOptions.includes(item.id))
  706. .forEach((item) => {
  707. checkFormOptions.value.push({
  708. id: item.id,
  709. nickName: item.nickname,
  710. employeeNo: item.employeeNo
  711. })
  712. })
  713. taskStatusQueryParams[unref(taskStatus)][unref(fieldKey)] = [
  714. ...new Set([...taskStatusQueryParams[unref(taskStatus)][unref(fieldKey)], ...selectRows.map((row) => row.id)])
  715. ]
  716. // queryParams[fieldKey.value] = [
  717. // ...new Set([...queryParams[fieldKey.value], ...selectRows.map((row) => row.id)])
  718. // ]
  719. customUserDialogVisible.value = false
  720. }
  721. //------------------------------------
  722. const { emitter } = useEmitt()
  723. const { searchUserId } = route.query as Recordable
  724. if (searchUserId) {
  725. taskStatus.value = 'reportInput'
  726. taskStatusQueryParams[unref(taskStatus)].mainCheckerStrIds = [searchUserId]
  727. // taskStatusQueryParams[unref(taskStatus)].checkUserStrIds = [searchUserId]
  728. }
  729. /** 初始化 **/
  730. onMounted(() => {
  731. getList()
  732. emitter.on('refresh-report-preparation-list-boiler', ()=> {
  733. getList();
  734. })
  735. })
  736. onUnmounted(() => {
  737. emitter.off('refresh-report-preparation-list-boiler')
  738. })
  739. </script>
  740. <style lang="scss" scoped>
  741. .cursor-pointer .el-table__row {
  742. cursor: pointer;
  743. }
  744. .report-item {
  745. display: flex;
  746. flex-direction: column;
  747. }
  748. .report-item-animated {
  749. line-height: 1.5;
  750. }
  751. .report-name-list {
  752. position: relative;
  753. .collapsed::after {
  754. content: '';
  755. position: absolute;
  756. bottom: 0;
  757. left: 0;
  758. right: 0;
  759. height: 15px;
  760. background: linear-gradient(transparent, rgba(255, 255, 255, 0.9));
  761. pointer-events: none;
  762. }
  763. }
  764. </style>
  765. <style>
  766. .user-select-popper {
  767. display: none !important;
  768. }
  769. </style>