task.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  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="unitName">
  21. <el-input
  22. v-model="queryParams.unitName"
  23. placeholder="请输入使用单位"
  24. clearable
  25. @keyup.enter="handleQuery"
  26. class="!w-240px"
  27. />
  28. </el-form-item>
  29. <el-form-item label="检验项目" prop="checkType">
  30. <el-select
  31. v-model="queryParams.checkType"
  32. placeholder="请选择检验项目"
  33. clearable
  34. class="!w-240px"
  35. >
  36. <el-option v-for="(item, key) in PressurePipeCheckTypeMap" :key="key" :label="item" :value="key" />
  37. </el-select>
  38. </el-form-item>
  39. <el-form-item label="检验时间" prop="checkDate">
  40. <el-date-picker
  41. v-model="queryParams.checkDate"
  42. value-format="YYYY-MM-DD HH:mm:ss"
  43. type="daterange"
  44. start-placeholder="开始日期"
  45. end-placeholder="结束日期"
  46. :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
  47. class="!w-240px"
  48. />
  49. </el-form-item>
  50. <el-form-item label="检验员" prop="checkUserIds">
  51. <el-select
  52. class="!w-240px"
  53. v-model="queryParams.checkUserIds"
  54. readonly
  55. clearable
  56. placeholder="请选择检验员"
  57. multiple
  58. popper-class="user-select-popper"
  59. @click.stop.prevent="() => handleOpenUserDialog(recheckStrIdsOpts, 'checkUserIds')"
  60. >
  61. <el-option
  62. v-for="child in recheckStrIdsOpts"
  63. :key="child && child.id"
  64. :label="child.nickName"
  65. :value="child.id"
  66. />
  67. </el-select>
  68. </el-form-item>
  69. <el-form-item label="合同编号" prop="contractNo">
  70. <el-input
  71. v-model="queryParams.contractNo"
  72. placeholder="请输入合同编号"
  73. clearable
  74. @keyup.enter="handleQuery"
  75. class="!w-240px"
  76. />
  77. </el-form-item>
  78. <el-form-item label="任务状态" prop="status">
  79. <el-select
  80. v-model="queryParams.taskStatus"
  81. placeholder="请选择任务状态"
  82. clearable
  83. class="!w-240px"
  84. >
  85. <el-option label="全部" value="all" />
  86. <el-option v-for="(item, key) in filteredTaskStatusMap" :key="key" :label="item" :value="key"/>
  87. </el-select>
  88. </el-form-item>
  89. <el-form-item label="受理单提交人" prop="submitIds">
  90. <el-select
  91. class="!w-240px"
  92. v-model="queryParams.submitIds"
  93. readonly
  94. clearable
  95. placeholder="请选择受理单提交人"
  96. multiple
  97. popper-class="user-select-popper"
  98. @click.stop.prevent="() => handleOpenUserDialog(recheckStrIdsOpts, 'submitIds')"
  99. >
  100. <el-option
  101. v-for="child in recheckStrIdsOpts"
  102. :key="child && child.id"
  103. :label="child.nickName"
  104. :value="child.id"
  105. />
  106. </el-select>
  107. </el-form-item>
  108. <el-form-item label="受理单提交" prop="submitTime">
  109. <el-date-picker
  110. v-model="queryParams.submitTime"
  111. value-format="YYYY-MM-DD HH:mm:ss"
  112. type="daterange"
  113. start-placeholder="开始日期"
  114. end-placeholder="结束日期"
  115. :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
  116. class="!w-240px"
  117. />
  118. </el-form-item>
  119. <el-form-item>
  120. <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
  121. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
  122. </el-form-item>
  123. </el-form>
  124. </ContentWrap>
  125. <!-- 列表 -->
  126. <ContentWrap>
  127. <el-button type="primary" @click="handleBatchConfirmationFn" :disabled="selectedRows.length === 0">批量办结确认</el-button>
  128. <el-table ref="tableRef" v-loading="loading" :data="list" :stripe="true" @selection-change="handleSelectionChange" border>
  129. <el-table-column type="selection" width="40" />
  130. <el-table-column label="任务单号" align="center" prop="orderNo" min-width="150px" />
  131. <el-table-column label="使用单位" align="center" prop="unitName" min-width="150px" />
  132. <el-table-column label="检验性质" align="center" prop="checkType" min-width="120px">
  133. 法定检验
  134. </el-table-column>
  135. <el-table-column label="检验项目" align="center" prop="checkType" min-width="120px">
  136. <template #default="scope">
  137. {{ PressurePipeCheckTypeMap[scope.row.checkType] }}
  138. </template>
  139. </el-table-column>
  140. <el-table-column label="设备数量" align="center" prop="equipNum" min-width="150px"/>
  141. <el-table-column label="任务单状态" align="center" prop="taskStatus" min-width="150px">
  142. <template #default="scope">
  143. <el-tag :type="getTypeColor(scope.row.taskStatus)">{{ PressureTaskOrderTaskStatusMap[scope.row.taskStatus] }}</el-tag>
  144. </template>
  145. </el-table-column>
  146. <el-table-column
  147. label="检验时间"
  148. align="center"
  149. prop="checkDate"
  150. min-width="120px"
  151. >
  152. <template #default="scope">
  153. {{ formatArrayDate(scope.row.checkDate) }}
  154. </template>
  155. </el-table-column>
  156. <el-table-column label="主检员" align="center" prop="manager" min-width="120px" >
  157. <template #default="scope">
  158. {{ scope.row.manager ? scope.row.manager.nickname : '-' }}
  159. </template>
  160. </el-table-column>
  161. <el-table-column label="检验员" align="center" prop="appoinmentUser" min-width="150px">
  162. <template #default="scope">
  163. <div v-if="scope.row.appoinmentUser && scope.row.appoinmentUser.length > 0">
  164. <div v-for="user in scope.row.appoinmentUser" :key="user.id">
  165. {{ user.nickname }} ({{ user.employeeNo }})
  166. </div>
  167. </div>
  168. <div v-else>-</div>
  169. </template>
  170. </el-table-column>
  171. <el-table-column label="收费方式" align="center" prop="feeType" min-width="100px">
  172. <template #default="scope">
  173. {{ PressureFeeTypeMap[scope.row.feeType] }}
  174. </template>
  175. </el-table-column>
  176. <el-table-column label="合同编号" align="center" prop="contractNo" min-width="150px">
  177. <template #default="scope">
  178. {{ scope.row.contractNo ? scope.row.contractNo : '-' }}
  179. </template>
  180. </el-table-column>
  181. <el-table-column label="变更记录" align="center" prop="changeLogCount" min-width="100px">
  182. <template #default="scope">
  183. <div v-if="scope.row.changeLogCount > 0">
  184. <el-link type="primary" @click="showChangeLog(scope.row)">{{ scope.row.changeLogCount }}</el-link>
  185. </div>
  186. <div v-else>-</div>
  187. </template>
  188. </el-table-column>
  189. <el-table-column label="操作" align="center" min-width="180px" fixed="right">
  190. <template #default="scope">
  191. <!-- 认领 -->
  192. <el-button
  193. v-if="scope.row.taskStatus === PressureTaskOrderTaskStatus.WAIT_CONFIRM"
  194. link
  195. type="primary"
  196. @click="handleConfirm(scope.row.id,formatArrayDate(scope.row.checkDate))"
  197. >
  198. 认领
  199. </el-button>
  200. <!-- 取消认领 -->
  201. <el-button
  202. v-if="scope.row.taskStatus === PressureTaskOrderTaskStatus.CONFIRMED"
  203. link
  204. type="primary"
  205. :disabled="scope.row.manager?.id !== userStore?.user?.id"
  206. @click="handleCancelConfirm(scope.row.id)"
  207. >
  208. 取消认领
  209. </el-button>
  210. <!-- 办结确认 -->
  211. <el-button
  212. link
  213. type="primary"
  214. v-if="scope.row.taskStatus == 710"
  215. @click="handleConfirmationFn(scope.row.id)"
  216. >
  217. 办结确认
  218. </el-button>
  219. <el-button
  220. link
  221. type="primary"
  222. @click="handleEdit(scope.row.id)"
  223. >
  224. 编辑
  225. </el-button>
  226. </template>
  227. </el-table-column>
  228. </el-table>
  229. <!-- 分页 -->
  230. <Pagination
  231. :total="total"
  232. v-model:page="queryParams.pageNo"
  233. v-model:limit="queryParams.pageSize"
  234. @pagination="getList"
  235. />
  236. </ContentWrap>
  237. <!-- 选择人员公共弹窗 -->
  238. <CustomDialog
  239. v-model="customUserDialogVisible"
  240. :dialogAttrs="{
  241. zIndex: 10006
  242. }"
  243. @confirm="handleUserConfirm"
  244. >
  245. <el-input
  246. v-model="userQueryData.nickName"
  247. clearable
  248. placeholder="请输入名称"
  249. @keyup.enter="handleFetchUserList"
  250. style="margin-bottom: 14px"
  251. >
  252. <template #append>
  253. <el-button @click="handleFetchUserList">
  254. <Icon icon="ep:search" />
  255. </el-button>
  256. </template>
  257. </el-input>
  258. <SmartTable
  259. ref="userTableRef"
  260. v-model:pageNo="userQueryData.pageNo"
  261. v-model:pagesize="userQueryData.pageSize"
  262. :total="userQueryData.total"
  263. v-model:columns="userColumns"
  264. :data="userTableList"
  265. :buttons="[]"
  266. :showSettingTools="false"
  267. :showSearch="false"
  268. :showRefresh="false"
  269. @on-page-size-change="onPageSizeChange"
  270. @on-page-no-change="onPageNoChange"
  271. />
  272. </CustomDialog>
  273. <!-- 设置主检项目并认领对话框 -->
  274. <el-dialog
  275. v-model="setPipeConfirmDialogVisible"
  276. title="选择主检管道"
  277. width="40%"
  278. :before-close="handleCancelSetPipeInfo"
  279. >
  280. <div class="mb-4">
  281. <el-select
  282. v-model="selectedOrderItemId"
  283. placeholder="请选择主检管道"
  284. clearable
  285. filterable
  286. style="width: 100%"
  287. >
  288. <el-option
  289. v-for="pipe in pipeOrderItemList"
  290. :key="pipe.id"
  291. :label="pipe.projectName"
  292. :value="pipe.id"
  293. />
  294. </el-select>
  295. </div>
  296. <template #footer>
  297. <div class="dialog-footer">
  298. <el-button @click="handleCancelSetPipeInfo">取消</el-button>
  299. <el-button type="primary" @click="handleConfirmSetPipeInfo"> 确认认领 </el-button>
  300. </div>
  301. </template>
  302. </el-dialog>
  303. </template>
  304. <script setup lang="ts">
  305. import { ref, reactive, onMounted, computed } from 'vue'
  306. import { formatArrayDate } from '@/utils/formatTime'
  307. import { PipeTaskOrderApi, PipeTaskOrderVO } from '@/api/pressure2/pipetaskorder'
  308. import {
  309. PressureFeeTypeMap,
  310. PressureTaskOrderTaskStatusMap,
  311. PressureTaskOrderTaskStatus,
  312. PressurePipeCheckTypeMap
  313. } from '@/utils/constants'
  314. import {ElMessageBox, ElMessage, ElTable, dayjs} from 'element-plus'
  315. import { useRouter } from 'vue-router'
  316. // 在script部分
  317. import { getUserPage } from '@/api/system/user'
  318. import SmartTable from "@/components/SmartTable/SmartTable";
  319. import { getUserList } from '@/api/common/user'
  320. import {useUserStore} from "@/store/modules/user";
  321. // 定义用户搜索相关的响应式变量
  322. const userOptions = ref([])
  323. const userSearchLoading = ref(false)
  324. const router = useRouter()
  325. const tableRef = ref<InstanceType<typeof ElTable>>()
  326. const selectedRows = ref<PipeTaskOrderVO[]>([]) // 选中的行
  327. const setPipeConfirmDialogVisible = ref(false)
  328. const pipeOrderItemList = ref([])
  329. const selectedOrderItemId = ref('')
  330. const selectedOrderId = ref('')
  331. // 通过输入的值查询对应受理单提交人名字
  332. // 远程搜索用户方法
  333. const remoteSearchUsers = (query) => {
  334. if (query) {
  335. userSearchLoading.value = true
  336. getUserPage({
  337. pageNo: 1,
  338. pageSize: 10,
  339. nickName: query
  340. }).then(response => {
  341. const users = response.list || []
  342. userOptions.value = users.map(user => ({
  343. value: user.id, // 值是用户ID
  344. label: user.nickname, // 显示的是用户昵称
  345. key: user.id // 用于v-for的key
  346. }))
  347. }).finally(() => {
  348. userSearchLoading.value = false
  349. })
  350. } else {
  351. userOptions.value = []
  352. }
  353. }
  354. // 剔除查询模块中不需要的选项
  355. const filteredTaskStatusMap = computed(() => {
  356. const result = {};
  357. // 需要剔除的状态
  358. const excludeStatus = [
  359. PressureTaskOrderTaskStatus.RECORD_INPUT, // 记录录入 500
  360. PressureTaskOrderTaskStatus.RECORD_CHECK, // 记录校核 510
  361. PressureTaskOrderTaskStatus.REPORT_INPUT, // 报告编制 520
  362. PressureTaskOrderTaskStatus.REPORT_AUDIT, // 报告审核 600
  363. PressureTaskOrderTaskStatus.REPORT_APPROVE // 报告审批 700
  364. ];
  365. // 只保留不在排除列表中的状态
  366. Object.entries(PressureTaskOrderTaskStatusMap).forEach(([key, value]) => {
  367. if (!excludeStatus.includes(Number(key))) {
  368. result[key] = value;
  369. }
  370. });
  371. return result;
  372. });
  373. const getTypeColor = (status: string | number) => {
  374. const statusMap = {
  375. [PressureTaskOrderTaskStatus.WAIT_CONFIRM]: 'primary',
  376. [PressureTaskOrderTaskStatus.CANCELLED]: 'info',
  377. [PressureTaskOrderTaskStatus.AUDITING_EDIT]: 'warning',
  378. [PressureTaskOrderTaskStatus.AUDITING_CANCEL]: 'warning',
  379. [PressureTaskOrderTaskStatus.AUDITING_TIME]: 'warning',
  380. [PressureTaskOrderTaskStatus.CONFIRMED]: 'success',
  381. [PressureTaskOrderTaskStatus.RECORD_INPUT]: 'warning',
  382. [PressureTaskOrderTaskStatus.RECORD_CHECK]: 'warning',
  383. [PressureTaskOrderTaskStatus.REPORT_INPUT]: 'warning',
  384. [PressureTaskOrderTaskStatus.REPORT_AUDIT]: 'warning',
  385. [PressureTaskOrderTaskStatus.REPORT_APPROVE]: 'warning',
  386. [PressureTaskOrderTaskStatus.REPORT_END]: 'success'
  387. };
  388. return statusMap[status] || 'info';
  389. }
  390. /** 承压任务单 列表 */
  391. defineOptions({ name: 'PipeCheckerTaskList' })
  392. const loading = ref(true)
  393. const list = ref<PipeTaskOrderVO[]>([])
  394. const total = ref(0)
  395. const queryParams = reactive({
  396. pageNo: 1,
  397. pageSize: 10,
  398. orderNo: undefined,
  399. unitName: undefined,
  400. checkType: undefined,
  401. checkDate: [],
  402. checkUserIds: [],
  403. submitIds:[],
  404. contractNo: undefined,
  405. taskStatus: 'all',
  406. submitTime: []
  407. })
  408. const queryFormRef = ref()
  409. /** 查询列表 */
  410. const getList = async () => {
  411. loading.value = true
  412. try {
  413. const params = { ...queryParams }
  414. if (params.taskStatus === 'all') {
  415. params.taskStatus = undefined
  416. }
  417. const data = await PipeTaskOrderApi.getPipeTaskOrderPage(params)
  418. list.value = data.list
  419. total.value = data.total
  420. } finally {
  421. loading.value = false
  422. }
  423. }
  424. /** 搜索按钮操作 */
  425. const handleQuery = () => {
  426. queryParams.pageNo = 1
  427. getList()
  428. }
  429. /** 重置按钮操作 */
  430. const resetQuery = () => {
  431. queryFormRef.value.resetFields()
  432. queryParams.taskStatus = 'all'
  433. handleQuery()
  434. }
  435. // 修改后的编辑/查看详情操作
  436. const handleEdit = (id: string) => {
  437. router.push({
  438. name: 'PipeTaskOrderView',
  439. query: {
  440. id,
  441. type: 'checker'
  442. }
  443. })
  444. }
  445. // 变更记录
  446. const showChangeLog = (row: PipeTaskOrderVO) => {
  447. console.log('ChangeLog:', row)
  448. }
  449. // 认领
  450. const handleConfirm = async (id: string,checkDate: string) => {
  451. // 检查检验日期是否在三天内
  452. // if (checkDate) {
  453. // if (checkDate) {
  454. // const inspectionStartDate = dayjs(checkDate);
  455. // const now = dayjs();
  456. // const daysDiff = now.diff(inspectionStartDate, 'day', true); // 精确计算天数差(包含小数)
  457. // // 如果当前时间不在检验日期开始后的 3 天内,则不允许认领
  458. // if (daysDiff < 0 || daysDiff > 3) {
  459. // ElMessage.warning('只能在检验日期开始后的 3 天内进行认领操作');
  460. // return;
  461. // }
  462. // }
  463. // }
  464. try {
  465. await ElMessageBox.confirm('是否认领该任务单?', '认领提示', {
  466. confirmButtonText: '确定',
  467. cancelButtonText: '取消',
  468. type: 'warning'
  469. })
  470. await PipeTaskOrderApi.confirmTaskOrder({ id, "confirm": true })
  471. ElMessage.success('认领成功')
  472. getList()
  473. } catch (error) {
  474. if (error !== 'cancel') {
  475. ElMessage.error('认领失败')
  476. console.error('Confirm error:', error)
  477. }
  478. }
  479. // selectedOrderId.value = id
  480. // selectedOrderItemId.value = ''
  481. // //获取管线
  482. // const params = {
  483. // orderId: selectedOrderId.value
  484. // }
  485. // const response = await PipeTaskOrderApi.getPipeByOrderId(params)
  486. // pipeOrderItemList.value = response || []
  487. // setPipeConfirmDialogVisible.value = true
  488. }
  489. // 取消认领
  490. const handleCancelConfirm = async (id: string) => {
  491. try {
  492. await ElMessageBox.confirm('是否取消认领该任务单?', '取消认领提示', {
  493. confirmButtonText: '确定',
  494. cancelButtonText: '取消',
  495. type: 'warning'
  496. })
  497. await PipeTaskOrderApi.confirmTaskOrder({ id, "confirm": false })
  498. ElMessage.success('取消认领成功')
  499. getList()
  500. } catch (error) {
  501. if (error !== 'cancel') {
  502. ElMessage.error('取消认领失败')
  503. console.error('Cancel confirm error:', error)
  504. }
  505. }
  506. }
  507. // 批量办结确认
  508. const handleBatchConfirmationFn = async () => {
  509. const list = tableRef?.value?.getSelectionRows()
  510. if (list.length === 0) {
  511. ElMessage.warning('请选择需要办结确认的任务!')
  512. return
  513. }
  514. const flag = list.every(
  515. (item) => item.taskStatus === PressureTaskOrderTaskStatus.REPORT_CONFIRMATION
  516. )
  517. if (!flag) {
  518. ElMessage.warning('请选择状态为办结确认的任务!')
  519. return
  520. }
  521. const ids = list.map((item) => item.id)
  522. try {
  523. await ElMessageBox.confirm('确认要批量办结确认吗?此操作不可撤销。', '办结确认', {
  524. confirmButtonText: '确认',
  525. cancelButtonText: '取消',
  526. type: 'warning'
  527. })
  528. const submitResult = await PipeTaskOrderApi.finishApi({
  529. ids
  530. })
  531. if (submitResult) {
  532. ElMessage.success('办结确认成功!')
  533. // 清除所有选择
  534. tableRef?.value?.clearSelection()
  535. getList()
  536. }
  537. } catch (err) {
  538. ElMessage.info('已取消办结确认操作')
  539. }
  540. }
  541. //办结确认
  542. const handleConfirmationFn = async (id: string) => {
  543. try {
  544. await ElMessageBox.confirm('确认要办结确认该任务吗?此操作不可撤销。', '办结确认', {
  545. confirmButtonText: '确认',
  546. cancelButtonText: '取消',
  547. type: 'warning'
  548. })
  549. const ids = [id]
  550. const submitResult = await PipeTaskOrderApi.finishApi({
  551. ids
  552. })
  553. if (submitResult) {
  554. ElMessage.success('办结确认成功!')
  555. // 清除所有选择
  556. tableRef?.value?.clearSelection()
  557. getList()
  558. }
  559. } catch (err) {
  560. ElMessage.info('已取消办结确认操作')
  561. }
  562. }
  563. // 人员选择弹窗 start
  564. const userTableRef = ref()
  565. const userStore = useUserStore()
  566. const userInfo = computed(() => userStore.user)
  567. const fieldKey = ref('')
  568. const customUserDialogVisible = ref(false)
  569. const checkFormOptions = ref<any[]>([])
  570. interface UserListQuery {
  571. nickName: string
  572. pageNo: number
  573. pageSize: number
  574. total?: number
  575. }
  576. const userQueryData = reactive<UserListQuery>({
  577. nickName: '',
  578. pageNo: 1,
  579. pageSize: 10,
  580. total: 0
  581. })
  582. const recheckStrIdsOpts = ref<any[]>([
  583. { id: userInfo.value.id, nickName: userInfo.value?.nickname }
  584. ])
  585. const userTableList = ref<any[]>([])
  586. const userColumns = ref<any[]>([
  587. {
  588. type: 'selection',
  589. width: '50px'
  590. },
  591. {
  592. label: '工号',
  593. prop: 'employeeNo'
  594. },
  595. {
  596. label: '姓名',
  597. prop: 'nickname'
  598. },
  599. {
  600. label: '部门',
  601. prop: 'deptName'
  602. }
  603. ])
  604. const handleUserConfirm = () => {
  605. const selectRows = userTableRef.value.getTableRef().getSelectionRows()
  606. // 过滤组合合成options
  607. const currOptions = checkFormOptions.value.map((item) => item.id) || []
  608. selectRows
  609. .filter((item) => !currOptions.includes(item.id))
  610. .forEach((item) => {
  611. checkFormOptions.value.push({
  612. id: item.id,
  613. nickName: item.nickname,
  614. employeeNo: item.employeeNo
  615. })
  616. })
  617. queryParams[fieldKey.value] = [
  618. ...new Set([...queryParams[fieldKey.value], ...selectRows.map((row) => row.id)])
  619. ]
  620. customUserDialogVisible.value = false
  621. }
  622. // 打开用户选择框
  623. const handleOpenUserDialog = (options: any, key: string) => {
  624. checkFormOptions.value = options
  625. userQueryData.nickName = ''
  626. fieldKey.value = key
  627. userQueryData.pageNo = 1
  628. userQueryData.pageSize = 10
  629. handleFetchUserList()
  630. }
  631. // 获取用户信息
  632. const handleFetchUserList = async () => {
  633. const queryParams: UserListQuery = {
  634. ...userQueryData
  635. }
  636. delete queryParams.total
  637. const result = await getUserList(queryParams)
  638. userTableList.value = result.list
  639. userQueryData.total = result.total
  640. customUserDialogVisible.value = true
  641. }
  642. const onPageSizeChange = (val) => {
  643. userQueryData.pageSize = val
  644. handleFetchUserList()
  645. }
  646. const onPageNoChange = (val) => {
  647. userQueryData.pageNo = val
  648. handleFetchUserList()
  649. }
  650. const handleCancelSetPipeInfo = () => {
  651. setPipeConfirmDialogVisible.value = false
  652. selectedOrderItemId.value = ''
  653. selectedOrderId.value = ''
  654. }
  655. const handleConfirmSetPipeInfo = async () => {
  656. if (!selectedOrderItemId.value) {
  657. ElMessage.warning('请选择主检管道')
  658. return
  659. }
  660. try {
  661. const params = {
  662. id : selectedOrderId.value,
  663. confirm: true,
  664. orderItemId: selectedOrderItemId.value
  665. }
  666. await PipeTaskOrderApi.confirmTaskOrder(params)
  667. ElMessage.success('认领成功')
  668. setPipeConfirmDialogVisible.value = false
  669. getList()
  670. } catch (error) {
  671. if (error !== 'cancel') {
  672. ElMessage.error('认领失败')
  673. console.error('Confirm error:', error)
  674. }
  675. }
  676. }
  677. // 人员选择弹窗 end
  678. /** 表格选择框变化 */
  679. const handleSelectionChange = (selection: PipeTaskOrderVO[]) => {
  680. selectedRows.value = selection
  681. }
  682. /** 初始化 **/
  683. onMounted(() => {
  684. getList()
  685. })
  686. </script>
  687. <style lang="scss" scoped>
  688. </style>