task.vue 22 KB

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