index.vue 24 KB

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