task.vue 22 KB

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