task.vue 23 KB

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