recordCheck.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  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. <el-form-item label="任务单号" prop="orderNo">
  12. <el-input
  13. v-model="queryParams.orderNo"
  14. placeholder="请输入任务单号"
  15. clearable
  16. @keyup.enter="handleQuery"
  17. class="!w-240px"
  18. />
  19. </el-form-item>
  20. <el-form-item label="记录编号" prop="recordNo">
  21. <el-input
  22. v-model="queryParams.recordNo"
  23. placeholder="请输入记录编号"
  24. clearable
  25. @keyup.enter="handleQuery"
  26. class="!w-240px"
  27. />
  28. </el-form-item>
  29. <el-form-item label="设备注册代码" prop="equipCode">
  30. <el-input
  31. v-model="queryParams.equipCode"
  32. placeholder="请输入设备注册代码"
  33. clearable
  34. @keyup.enter="handleQuery"
  35. class="!w-240px"
  36. />
  37. </el-form-item>
  38. <el-form-item label="出厂编号" prop="productCode">
  39. <el-input
  40. v-model="queryParams.productCode"
  41. placeholder="请输入出厂编号"
  42. clearable
  43. @keyup.enter="handleQuery"
  44. class="!w-240px"
  45. />
  46. </el-form-item>
  47. <el-form-item label="单位名称" prop="unitName">
  48. <el-input
  49. v-model="queryParams.unitName"
  50. placeholder="请输入单位名称"
  51. clearable
  52. @keyup.enter="handleQuery"
  53. class="!w-240px"
  54. />
  55. </el-form-item>
  56. <el-form-item label="检验类型" prop="checkType">
  57. <el-select
  58. v-model="queryParams.checkType"
  59. placeholder="请选择检验类型"
  60. clearable
  61. class="!w-240px"
  62. >
  63. <el-option
  64. v-for="(item, key) in PressureBoilerCheckTypeMap"
  65. :key="key"
  66. :label="item"
  67. :value="key"
  68. />
  69. </el-select>
  70. </el-form-item>
  71. <el-form-item label="检验项目" prop="checkProject">
  72. <el-input
  73. v-model="queryParams.checkProject"
  74. placeholder="请输入检验项目"
  75. clearable
  76. @keyup.enter="handleQuery"
  77. class="!w-240px"
  78. />
  79. </el-form-item>
  80. <el-form-item label="检验员" prop="checkUserStrIds">
  81. <el-select
  82. class="!w-240px"
  83. v-model="queryParams.checkUserStrIds"
  84. readonly
  85. clearable
  86. placeholder="请选择检验员"
  87. multiple
  88. popper-class="user-select-popper"
  89. @click.stop.prevent="() => handleOpenUserDialog(recheckStrIdsOpts, 'checkUserStrIds')"
  90. >
  91. <el-option
  92. v-for="child in recheckStrIdsOpts"
  93. :key="child && child.id"
  94. :label="child.nickName"
  95. :value="child.id"
  96. />
  97. </el-select>
  98. </el-form-item>
  99. <!-- <el-form-item label="已检天数" prop="checkedDays">-->
  100. <!-- <el-input-->
  101. <!-- v-model="queryParams.checkedDays"-->
  102. <!-- placeholder="请输入已检天数"-->
  103. <!-- clearable-->
  104. <!-- @keyup.enter="handleQuery"-->
  105. <!-- class="!w-240px"-->
  106. <!-- />-->
  107. <!-- </el-form-item>-->
  108. <el-form-item label="审核状态" prop="recheckStatus">
  109. <el-select v-model="queryParams.recheckStatus" placeholder="请选择审核状态" clearable class="!w-240px">
  110. <el-option label="全部" value="all" />
  111. <el-option
  112. v-for="(item, key) in PressureCheckerRecheckStatusMap"
  113. :key="key"
  114. :label="item"
  115. :value="key"
  116. />
  117. </el-select>
  118. </el-form-item>
  119. <el-form-item label="校核人" prop="recheckStrIds">
  120. <el-select
  121. class="!w-240px"
  122. v-model="queryParams.recheckStrIds"
  123. readonly
  124. clearable
  125. placeholder="请选择校核人"
  126. multiple
  127. popper-class="user-select-popper"
  128. @click.stop.prevent="() => handleOpenUserDialog(recheckStrIdsOpts, 'recheckStrIds')"
  129. >
  130. <el-option
  131. v-for="child in recheckStrIdsOpts"
  132. :key="child && child.id"
  133. :label="child.nickName"
  134. :value="child.id"
  135. />
  136. </el-select>
  137. </el-form-item>
  138. <el-form-item label="项目负责人" prop="managerStrIds">
  139. <el-select
  140. class="!w-240px"
  141. v-model="queryParams.managerStrIds"
  142. readonly
  143. clearable
  144. placeholder="请选择项目负责人"
  145. multiple
  146. popper-class="user-select-popper"
  147. @click.stop.prevent="() => handleOpenUserDialog(recheckStrIdsOpts, 'managerStrIds')"
  148. >
  149. <el-option
  150. v-for="child in recheckStrIdsOpts"
  151. :key="child && child.id"
  152. :label="child.nickName"
  153. :value="child.id"
  154. />
  155. </el-select>
  156. </el-form-item>
  157. <el-form-item>
  158. <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
  159. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
  160. </el-form-item>
  161. </el-form>
  162. </ContentWrap>
  163. <!-- 列表 -->
  164. <ContentWrap>
  165. <!-- <el-radio-group class="mb-20px" v-model="isClaim" @change="handleQuery">
  166. <el-radio-button label="全部" value="all" />
  167. <el-radio-button label="审核中" value="100" />
  168. <el-radio-button label="已通过" value="200" />
  169. <el-radio-button label="已拒绝" value="300" />
  170. </el-radio-group> -->
  171. <el-table v-loading="loading" :data="list" :stripe="true" border>
  172. <el-table-column label="任务单号" align="center" prop="orderNo" min-width="150px" />
  173. <el-table-column label="记录编号" align="center" prop="subReportNo" min-width="205px">
  174. <template #default="scope">
  175. <div class="report-number-cell">
  176. <span
  177. v-if="getReportTypeIcon(scope.row.reportType)"
  178. :class="getReportTypeIconClass(scope.row.reportType)"
  179. >
  180. {{ getReportTypeIcon(scope.row.reportType) }}
  181. </span>
  182. <span>{{ scope.row.subReportNo || '-' }}</span>
  183. </div>
  184. </template>
  185. </el-table-column>
  186. <el-table-column label="设备注册代码" align="center" prop="equipCode" min-width="200px">
  187. <template #default="{ row }">
  188. {{ row.equipCode }}
  189. <div class="mt-8px">
  190. <el-tag v-if="row.productCode" type="success">
  191. {{ row.productCode }}
  192. </el-tag>
  193. </div>
  194. </template>
  195. </el-table-column>
  196. <el-table-column label="检验性质" align="center" prop="checkType" min-width="120px">
  197. <template #default="scope">
  198. {{ PressureBoilerCheckTypeMap[scope.row.checkType] || '-' }}
  199. </template>
  200. </el-table-column>
  201. <el-table-column label="单位名称" align="center" prop="unitName" min-width="200px" />
  202. <el-table-column label="检验项目" align="center" prop="reportName" min-width="150px">
  203. <template #default="{row}">
  204. <template v-if="!row.recheckList || !row.recheckList?.length">
  205. <el-row style="justify-content: center;">{{ getReportDisplayName(row, row.reportId, row.reportName) }}</el-row>
  206. </template>
  207. <template v-else>
  208. <el-row style="justify-content: center;" v-for="item in row.recheckList" :key="JSON.stringify(item)">{{ getReportDisplayName(row, item.reportId, item.reportName) }}</el-row>
  209. </template>
  210. </template>
  211. </el-table-column>
  212. <el-table-column label="项目负责人" align="center" prop="manager" min-width="120px">
  213. <template #default="scope">
  214. {{
  215. scope.row.manager
  216. ? `${scope.row.manager.nickname} (${scope.row.manager.employeeNo})`
  217. : '-'
  218. }}
  219. </template>
  220. </el-table-column>
  221. <el-table-column label="检验员" align="center" prop="checkUsers" min-width="150px">
  222. <template #default="scope">
  223. <div v-if="scope.row.checkUsers && scope.row.checkUsers.length > 0">
  224. <div v-for="user in scope.row.checkUsers" :key="user.id">
  225. {{ user.nickname }} ({{ user.employeeNo }})
  226. </div>
  227. </div>
  228. <div v-else>-</div>
  229. </template>
  230. </el-table-column>
  231. <el-table-column label="校核人" align="center" prop="dataEntry" min-width="120px">
  232. <template #default="scope">
  233. {{ scope.row.recheckName || '-' }}
  234. </template>
  235. </el-table-column>
  236. <el-table-column label="剩余期限(工作日)" align="center" prop="workDays" min-width="100px">
  237. <template #default="scope">
  238. {{ scope.row.workDays || '10' }}
  239. </template>
  240. </el-table-column>
  241. <el-table-column label="状态" align="center" prop="recheckStatus" min-width="120px">
  242. <template #default="scope">
  243. <el-tag :type="getStatusTagType(scope.row.recheckStatus)">
  244. {{ PressureCheckerRecheckStatusMap[scope.row.recheckStatus] || '未知状态' }}
  245. </el-tag>
  246. </template>
  247. </el-table-column>
  248. <!-- 退回原因 -->
  249. <el-table-column label="退回原因" align="center" prop="recheckReason" min-width="150px">
  250. <template #default="scope">
  251. {{ scope.row.recheckReason || '-' }}
  252. </template>
  253. </el-table-column>
  254. <el-table-column label="提交时间" align="center" prop="submitTime" min-width="155px">
  255. <template #default="scope">
  256. {{ formatDate(scope.row.submitTime) }}
  257. </template>
  258. </el-table-column>
  259. <!-- 操作 -->
  260. <el-table-column label="操作" align="center" min-width="150px" fixed="right">
  261. <template #default="scope">
  262. <el-button
  263. link
  264. type="primary"
  265. @click="handleCheck(scope.row)"
  266. v-if="scope.row.recheckStatus === PressureCheckerRecheckStatus.AUDITING"
  267. >
  268. 校核
  269. </el-button>
  270. <el-button
  271. link
  272. type="primary"
  273. @click="handleView(scope.row)"
  274. v-if="scope.row.recheckStatus !== PressureCheckerRecheckStatus.AUDITING"
  275. >
  276. 详情
  277. </el-button>
  278. <el-button link type="primary" @click="handleShowRecord(scope.row)"> 流转记录 </el-button>
  279. </template>
  280. </el-table-column>
  281. </el-table>
  282. <!-- 分页 -->
  283. <Pagination
  284. :total="total"
  285. v-model:page="queryParams.pageNo"
  286. v-model:limit="queryParams.pageSize"
  287. @pagination="getList"
  288. />
  289. </ContentWrap>
  290. <AuditCheckRecord
  291. v-if="showAuditCheckRecord"
  292. v-model:visible="showAuditCheckRecord"
  293. :reportUrl="reportUrl"
  294. v-model:recheckInfo="recheckInfo"
  295. :auditId="auditId"
  296. :id="idValue"
  297. :apiParams="auditApiParams"
  298. :pageType="pageType"
  299. :flagStatus="true"
  300. :equipId="equipId"
  301. :reportType="reportType"
  302. :rejectFn="!recheckInfo?.recheckList ? BoilerTaskOrderApi.rejectRecordTemplateAudit : BoilerTaskOrderApi.batchRejectRecheck"
  303. :passFn="!recheckInfo?.recheckList ? BoilerTaskOrderApi.passRecordTemplateAudit : BoilerTaskOrderApi.batchPassRecheck"
  304. @close="handleCloseAuditDetail"
  305. />
  306. <!-- 流转记录对话框 -->
  307. <ReportRecordDialog v-model:visible="showRecordDialog" :selected-item="selectedRecordItem" />
  308. <!-- 选择人员公共弹窗 -->
  309. <CustomDialog
  310. v-model="customUserDialogVisible"
  311. :dialogAttrs="{
  312. zIndex: 10006
  313. }"
  314. @confirm="handleUserConfirm"
  315. >
  316. <el-input
  317. v-model="userQueryData.nickName"
  318. clearable
  319. placeholder="请输入名称"
  320. @keyup.enter="handleFetchUserList"
  321. style="margin-bottom: 14px"
  322. >
  323. <template #append>
  324. <el-button @click="handleFetchUserList">
  325. <Icon icon="ep:search" />
  326. </el-button>
  327. </template>
  328. </el-input>
  329. <SmartTable
  330. ref="userTableRef"
  331. v-model:pageNo="userQueryData.pageNo"
  332. v-model:pagesize="userQueryData.pageSize"
  333. :total="userQueryData.total"
  334. v-model:columns="userColumns"
  335. :data="userTableList"
  336. :buttons="[]"
  337. :showSettingTools="false"
  338. :showSearch="false"
  339. :showRefresh="false"
  340. @on-page-size-change="onPageSizeChange"
  341. @on-page-no-change="onPageNoChange"
  342. />
  343. </CustomDialog>
  344. </template>
  345. <script setup lang="ts">
  346. import AuditCheckRecord from './AuditCheckRecord.vue'
  347. import ReportRecordDialog from './components/ReportRecordDialog.vue'
  348. import { ref, reactive, onMounted, computed } from 'vue'
  349. import { useMessage } from '@/hooks/web/useMessage'
  350. import { BoilerTaskOrderApi } from '@/api/pressure2/boilertaskorder'
  351. import {
  352. PressureCheckerRecheckStatus,
  353. PressureReportType, PressureBoilerCheckTypeMap, PressureCheckerMyTaskStatusMap
  354. } from '@/utils/constants'
  355. import SmartTable from '@/components/SmartTable/SmartTable'
  356. import { getUserList } from '@/api/common/user'
  357. import { useUserStore } from '@/store/modules/user'
  358. import { cloneDeep } from 'lodash-es'
  359. import { useRoute } from 'vue-router'
  360. import { formatDate } from '@/utils/formatTime'
  361. const PressureCheckerRecheckStatusMap = {
  362. [PressureCheckerRecheckStatus.AUDITING]: '审核中',
  363. [PressureCheckerRecheckStatus.APPROVED]: '已通过',
  364. [PressureCheckerRecheckStatus.REJECTED]: '退回',
  365. }
  366. const route = useRoute()
  367. const userStore = useUserStore()
  368. const userInfo = computed(() => userStore.user)
  369. /** 记录校核页面 */
  370. defineOptions({ name: 'BoilerCheckerRecordCheck' })
  371. const fieldKey = ref('')
  372. const loading = ref(true)
  373. const list = ref<any[]>([])
  374. const total = ref(0)
  375. // 人员选择弹窗
  376. const checkFormOptions = ref<any[]>([])
  377. const queryParams = reactive<Recordable>({
  378. pageNo: 1,
  379. pageSize: 10,
  380. orderNo: undefined,
  381. recordNo: undefined,
  382. productCode: undefined,
  383. equipCode: undefined,
  384. unitName: undefined,
  385. checkType: undefined,
  386. checkProject: undefined,
  387. // checkUserStrIds: [userInfo.value.id], //检验员, 用户id集合
  388. checkUserStrIds: [], //检验员, 用户id集合
  389. checkedDays: undefined,
  390. //status: 'all',
  391. recheckStrIds: [userInfo.value.id],
  392. managerStrIds: [], //项目负责人,用户id集合
  393. recheckStatus: '100'
  394. })
  395. const queryFormRef = ref()
  396. const message = useMessage()
  397. // 获取状态标签类型
  398. const getStatusTagType = (
  399. status: number
  400. ): 'success' | 'warning' | 'info' | 'primary' | 'danger' => {
  401. const statusTagMap: Record<number, 'success' | 'warning' | 'info' | 'primary' | 'danger'> = {
  402. [PressureCheckerRecheckStatus.AUDITING]: 'primary',
  403. [PressureCheckerRecheckStatus.APPROVED]: 'success',
  404. [PressureCheckerRecheckStatus.REJECTED]: 'danger'
  405. }
  406. return statusTagMap[status] || 'info'
  407. }
  408. /** 查询列表 */
  409. const getList = async () => {
  410. loading.value = true
  411. try {
  412. const params: Record<string, any> = cloneDeep(queryParams)
  413. params.recheckStrIds = params.recheckStrIds.join(',')
  414. params.managerStrIds = params.managerStrIds.join(',')
  415. params.checkUserStrIds = params.checkUserStrIds.join(',')
  416. //if(params.status === 'all') delete params.status
  417. if(params.recheckStatus === 'all') delete params.recheckStatus
  418. if(!params.recheckStrIds) delete params.recheckStrIds
  419. if(!params.managerStrIds) delete params.managerStrIds
  420. if(!params.checkUserStrIds) delete params.checkUserStrIds
  421. const data = await BoilerTaskOrderApi.getTaskOrderOrderItemRecheckPage(params)
  422. list.value = data.list || []
  423. total.value = data.total || 0
  424. } catch (error) {
  425. console.error('获取记录校核列表失败:', error)
  426. message.error('获取列表数据失败')
  427. } finally {
  428. loading.value = false
  429. }
  430. }
  431. // const isClaim = ref('100')
  432. /** 搜索按钮操作 */
  433. const handleQuery = () => {
  434. // if (isClaim.value === 'all') {
  435. // // 清除状态筛选
  436. // delete queryParams.recheckStatus
  437. // } else {
  438. // // 设置状态筛选
  439. // queryParams.recheckStatus = [isClaim.value]
  440. // }
  441. queryParams.pageNo = 1
  442. getList()
  443. }
  444. /** 重置按钮操作 */
  445. const resetQuery = () => {
  446. queryFormRef.value.resetFields()
  447. queryParams.recheckStrIds = [userInfo.value.id]
  448. handleQuery()
  449. }
  450. /** 校核 */
  451. const showAuditCheckRecord = ref(false)
  452. const reportUrl = ref('')
  453. const auditId = ref('')
  454. const idValue = ref('')
  455. const equipId = ref('')
  456. const auditApiParams = ref({})
  457. const reportType = ref(0)
  458. const pageType = ref('check')
  459. const recheckInfo = ref({})
  460. const handleCheck = async (row: any) => {
  461. //测试先注释
  462. //if (!row.reportUrl) return ElMessage.warning('缺少记录文件地址,请联系管理员!')
  463. pageType.value = 'check'
  464. showAuditCheckRecord.value = true
  465. reportUrl.value = row.reportUrl
  466. auditId.value = row.reportId
  467. equipId.value = row.equipId
  468. idValue.value = row.id
  469. auditApiParams.value = {
  470. id: row.reportId
  471. }
  472. // 从后端获取同一 orderItemId + 当前校核人 的所有待校核项(跨报告合并),不受分页影响
  473. const relatedItems = await BoilerTaskOrderApi.getRecheckRelatedItems(row.id)
  474. recheckInfo.value = {
  475. ...row,
  476. recheckList: relatedItems || []
  477. }
  478. //console.log(row.reportType, !row.reportType ? 0 : Number(row.reportType))
  479. reportType.value = !row.reportType ? 0 : Number(row.reportType)
  480. console.log(equipId.value);
  481. }
  482. // 审核详情页面关闭回调
  483. const handleCloseAuditDetail = () => {
  484. auditApiParams.value = {}
  485. reportType.value = 0
  486. getList()
  487. }
  488. /** 查看详情 */
  489. const handleView = (row: any) => {
  490. // 根据实际需求实现详情查看功能
  491. pageType.value = 'detail'
  492. showAuditCheckRecord.value = true
  493. reportUrl.value = row.reportUrl
  494. auditId.value = row.reportId
  495. equipId.value = row.equipId
  496. idValue.value = row.id
  497. auditApiParams.value = {
  498. id: row.reportId
  499. }
  500. reportType.value = row.reportType
  501. // message.info('详情查看功能待实现')
  502. }
  503. /** 流转记录对话框状态 */
  504. const showRecordDialog = ref(false)
  505. const selectedRecordItem = ref<any>(null)
  506. // 显示流转记录
  507. const handleShowRecord = (row: any) => {
  508. selectedRecordItem.value = {
  509. ...row,
  510. id: row.reportId || row.id
  511. }
  512. showRecordDialog.value = true
  513. }
  514. // 人员选择弹窗
  515. // const checkFormItem = ref<any>({})
  516. const recheckStrIdsOpts = ref<any[]>([
  517. { id: userInfo.value.id, nickName: userInfo.value?.nickname }
  518. ])
  519. const userTableRef = ref()
  520. const customUserDialogVisible = ref(false)
  521. interface UserListQuery {
  522. nickName: string
  523. pageNo: number
  524. pageSize: number
  525. total?: number
  526. }
  527. const userQueryData = reactive<UserListQuery>({
  528. nickName: '',
  529. pageNo: 1,
  530. pageSize: 10,
  531. total: 0
  532. })
  533. const userTableList = ref<any[]>([])
  534. const userColumns = ref<any[]>([
  535. {
  536. type: 'selection',
  537. width: '50px'
  538. },
  539. {
  540. label: '工号',
  541. prop: 'employeeNo'
  542. },
  543. {
  544. label: '姓名',
  545. prop: 'nickname'
  546. },
  547. {
  548. label: '部门',
  549. prop: 'deptName'
  550. }
  551. ])
  552. // 打开用户选择框
  553. const handleOpenUserDialog = (options: any, key: string) => {
  554. checkFormOptions.value = options
  555. userQueryData.nickName = ''
  556. fieldKey.value = key
  557. userQueryData.pageNo = 1
  558. userQueryData.pageSize = 10
  559. handleFetchUserList()
  560. }
  561. // 获取用户信息
  562. const handleFetchUserList = async () => {
  563. const queryParams: UserListQuery = {
  564. ...userQueryData
  565. }
  566. delete queryParams.total
  567. const result = await getUserList(queryParams)
  568. userTableList.value = result.list
  569. userQueryData.total = result.total
  570. customUserDialogVisible.value = true
  571. }
  572. const onPageSizeChange = (val) => {
  573. userQueryData.pageSize = val
  574. handleFetchUserList()
  575. }
  576. const onPageNoChange = (val) => {
  577. userQueryData.pageNo = val
  578. handleFetchUserList()
  579. }
  580. const handleUserConfirm = () => {
  581. console.log('getTableRef', userTableRef.value.getTableRef())
  582. const selectRows = userTableRef.value.getTableRef().getSelectionRows()
  583. console.log('selectRows', selectRows)
  584. // 过滤组合合成options
  585. const currOptions = checkFormOptions.value.map((item) => item.id) || []
  586. selectRows
  587. .filter((item) => !currOptions.includes(item.id))
  588. .forEach((item) => {
  589. checkFormOptions.value.push({
  590. id: item.id,
  591. nickName: item.nickname,
  592. employeeNo: item.employeeNo
  593. })
  594. })
  595. queryParams[fieldKey.value] = [
  596. ...new Set([...queryParams[fieldKey.value], ...selectRows.map((row) => row.id)])
  597. ]
  598. customUserDialogVisible.value = false
  599. }
  600. // 获取报告类型图标样式类
  601. const getReportTypeIconClass = (reportType): string => {
  602. reportType = Number(reportType)
  603. switch (reportType) {
  604. case PressureReportType.MAIN: // 100 主报告
  605. return 'report-type-icon main'
  606. case PressureReportType.SUB: // 200 子报告
  607. return 'report-type-icon sub'
  608. case PressureReportType.SINGLE: // 300 独审报告
  609. return 'report-type-icon single'
  610. case PressureReportType.SUBCONTRACT:
  611. return 'report-type-icon subcontract'
  612. default:
  613. return 'report-type-icon'
  614. }
  615. }
  616. // 获取报告类型图标
  617. const getReportTypeIcon = (reportType) => {
  618. reportType = Number(reportType)
  619. switch (reportType) {
  620. case PressureReportType.MAIN: // 100 主报告
  621. return '主'
  622. case PressureReportType.SINGLE: // 300 独审报告
  623. return '独'
  624. case PressureReportType.SUB: // 200 子报告
  625. return '子'
  626. case PressureReportType.SUBCONTRACT:
  627. return '分'
  628. default:
  629. return null // 子报告或未知类型不显示图标
  630. }
  631. }
  632. // 获取检验项目显示名称(电站锅炉内检有部件的项目,名称前加"部件名-")
  633. const getReportDisplayName = (row: any, reportId: string, reportName: string): string => {
  634. // 优先使用子报告自身的 partName,其次使用 row 的 partName
  635. let partName = ''
  636. if (row?.recheckList && row.recheckList.length) {
  637. const item = row.recheckList.find((r: any) => r.reportId === reportId)
  638. partName = item?.partName || ''
  639. }
  640. if (!partName) {
  641. partName = row?.partName || ''
  642. }
  643. if (partName) {
  644. return `${partName}-${reportName || ''}`
  645. }
  646. return reportName || ''
  647. }
  648. watch(() => route.path, async () => {
  649. if (route.path === '/gljy/record-check/boiler') {
  650. await getList()
  651. }
  652. })
  653. /** 初始化 */
  654. onMounted(() => {
  655. const { searchUserId } = route.query
  656. if (searchUserId) {
  657. queryParams.checkUserStrIds = []
  658. queryParams.recheckStrIds = [searchUserId as string]
  659. queryParams.managerStrIds = []
  660. }
  661. getList()
  662. })
  663. </script>
  664. <style lang="scss" scoped>
  665. // 可以添加必要的样式
  666. </style>
  667. <style lang="scss" scoped>
  668. .user-select-popper {
  669. display: none !important;
  670. }
  671. .report-number-cell {
  672. display: flex;
  673. align-items: center;
  674. gap: 8px;
  675. justify-content: center;
  676. .report-type-icon {
  677. display: inline-flex;
  678. align-items: center;
  679. justify-content: center;
  680. width: 20px;
  681. height: 20px;
  682. background-color: var(--el-color-primary);
  683. color: white;
  684. border-radius: 3px;
  685. font-size: 12px;
  686. font-weight: bold;
  687. flex-shrink: 0;
  688. &.main {
  689. background-color: var(--el-color-primary); // 主报告使用系统primary颜色
  690. }
  691. &.sub {
  692. background-color: var(--el-color-primary); // 主报告使用系统primary颜色
  693. }
  694. &.single {
  695. background-color: #e6a23c; // 独审报告使用橙色
  696. }
  697. &.subcontract {
  698. background-color: #afadf6; // 分包项目使用蓝色
  699. }
  700. }
  701. }
  702. </style>