index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  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. <!-- 约检单号 -->
  12. <el-form-item label="约检单号" prop="appointmentNo">
  13. <el-input v-model="queryParams.appointmentNo" placeholder="请输入约检单号" clearable class="!w-240px" />
  14. </el-form-item>
  15. <el-form-item label="检测日期" prop="appointmentDate">
  16. <el-date-picker
  17. v-model="queryParams.appointmentDate"
  18. value-format="YYYY-MM-DD"
  19. type="daterange"
  20. start-placeholder="开始日期"
  21. end-placeholder="结束日期"
  22. :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
  23. class="!w-240px"
  24. />
  25. </el-form-item>
  26. <el-form-item label="申请单位" prop="unitName">
  27. <el-input v-model="queryParams.unitName" placeholder="请输入申请单位" clearable class="!w-240px" />
  28. </el-form-item>
  29. <el-form-item label="使用单位" prop="useUnitName">
  30. <el-input v-model="queryParams.useUnitName" placeholder="请输入使用单位" clearable class="!w-240px" />
  31. </el-form-item>
  32. <!-- <el-form-item label="单位地址" prop="unitAddress">
  33. <el-input v-model="queryParams.unitAddress" placeholder="请输入单位地址" clearable class="!w-240px" />
  34. </el-form-item> -->
  35. <el-form-item label="部门" prop="deptId">
  36. <DeptSelect v-model="queryParams.deptId" placeholder="请选择部门" clearable class="!w-240px" />
  37. </el-form-item>
  38. <el-form-item label="区域" prop="equipDistrict">
  39. <AreaSelect
  40. v-model="queryParams.equipDistrict"
  41. placeholder="请选择区域"
  42. class="!w-[240px]"
  43. collapse-tags
  44. collapse-tags-tooltip
  45. :clearable="true"
  46. @clear="handleAreaClear"
  47. @change="handleAreaChange"
  48. />
  49. </el-form-item>
  50. <el-form-item label="街道" prop="equipStreet">
  51. <StreetSelect
  52. v-model="queryParams.equipStreet"
  53. :district-ids="queryParams.equipDistrict ? [queryParams.equipDistrict] : []"
  54. placeholder="请选择街道"
  55. class="!w-[240px]"
  56. collapse-tags
  57. collapse-tags-tooltip
  58. :clearable="true"
  59. @clear="handleStreetClear"
  60. @change="handleStreetChange"
  61. />
  62. </el-form-item>
  63. <el-form-item label="设备" prop="equipType">
  64. <el-select v-model="queryParams.equipType" placeholder="请选择设备" clearable class="!w-240px">
  65. <el-option v-for="(item, key) in equipTypeMap" :key="key" :label="item" :value="key" />
  66. </el-select>
  67. </el-form-item>
  68. <el-form-item label="设备代码" prop="equipCode">
  69. <el-input v-model="queryParams.equipCode" placeholder="请输入设备注册代码" clearable class="!w-240px" />
  70. </el-form-item>
  71. <el-form-item label="检验性质" prop="checkType">
  72. <el-select v-model="queryParams.checkType" placeholder="请选择检验性质" clearable class="!w-240px">
  73. <el-option v-for="(item, key) in checkTypeMap" :key="key" :label="item" :value="key" />
  74. </el-select>
  75. </el-form-item>
  76. <el-form-item label="约检状态" prop="status">
  77. <el-select multiple v-model="queryParams.status" placeholder="请选择约检状态" clearable class="!w-240px">
  78. <el-option v-for="(item, key) in statusMap" :key="key" :label="item" :value="key" />
  79. </el-select>
  80. </el-form-item>
  81. <el-form-item label="预警时间" prop="warningDay">
  82. <el-input
  83. v-model="queryParams.warningDay[0]"
  84. :min="0"
  85. :max="365"
  86. placeholder="最小天数"
  87. class="!w-[110px]"
  88. />
  89. <span class="mx-2">至</span>
  90. <el-input
  91. v-model="queryParams.warningDay[1]"
  92. :min="0"
  93. :max="365"
  94. placeholder="最大天数"
  95. class="!w-[110px]"
  96. />
  97. </el-form-item>
  98. <el-form-item label="生成受理单" prop="createAcceptOrder">
  99. <el-select v-model="queryParams.createAcceptOrder" placeholder="请选择是否生成受理单" clearable class="!w-240px">
  100. <el-option label="是" :value="true" />
  101. <el-option label="否" :value="false" />
  102. </el-select>
  103. </el-form-item>
  104. <el-form-item>
  105. <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
  106. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
  107. <el-button type="warning" @click="handleWarningSettings">
  108. <Icon icon="ep:bell" class="mr-5px" /> 预警设置
  109. </el-button>
  110. </el-form-item>
  111. </el-form>
  112. </ContentWrap>
  113. <!-- 列表 -->
  114. <ContentWrap>
  115. <el-table
  116. class="cursor-pointer"
  117. v-loading="loading"
  118. :data="list"
  119. stripe
  120. border
  121. :cell-style="cellStyle"
  122. @selection-change="handleSelectionChange"
  123. @row-dblclick="handleAppointment"
  124. show-overflow-tooltip
  125. tooltip-effect="dark"
  126. >
  127. <el-table-column label="操作" width="150" align="center">
  128. <template #default="scope">
  129. <!-- <el-button
  130. link
  131. type="primary"
  132. @click="handleAppointment(scope.row)"
  133. >
  134. 约检
  135. </el-button> -->
  136. <el-button
  137. v-if="scope.row.status === 100"
  138. link
  139. type="success"
  140. @click="handleSendConfirm(scope.row)"
  141. >
  142. 发送确认
  143. </el-button>
  144. </template>
  145. </el-table-column>
  146. <el-table-column label="约检状态" prop="status" align="center" width="100">
  147. <template #default="scope">
  148. {{ statusMap[scope.row.status] }}
  149. </template>
  150. </el-table-column>
  151. <el-table-column label="推送情况" prop="tempSendStatus" align="center" width="130">
  152. <template #default="scope">
  153. <el-tag v-if="!isEmpty(scope.row.tempSendStatus)" :type=getTypeColor(scope.row.tempSendStatus)>
  154. {{ tempSendStatusMap[scope.row.tempSendStatus] }}
  155. </el-tag>
  156. </template>
  157. </el-table-column>
  158. <!-- <el-table-column type="selection" width="30" align="center" /> -->
  159. <!-- 约检单号 -->
  160. <el-table-column label="约检单号" prop="appointmentNo" align="center" width="150">
  161. <template #default="{ row }">
  162. <el-button
  163. link
  164. type="primary"
  165. @click="handleAppointment(row)">{{ row.appointmentNo }}</el-button>
  166. </template>
  167. </el-table-column>
  168. <!-- 检验性质 -->
  169. <el-table-column label="检验性质" prop="checkType" align="center" width="100">
  170. <template #default="scope">
  171. {{ checkTypeMap[scope.row.checkType] }}
  172. </template>
  173. </el-table-column>
  174. <!-- 约检时间 -->
  175. <el-table-column label="检测日期" prop="appointmentDate" sortable align="center" width="140">
  176. <template #default="scope">
  177. {{ formatArrayDate(scope.row.appointmentDate) }}
  178. </template>
  179. </el-table-column>
  180. <!-- 预警剩余时间 -->
  181. <el-table-column label="预警时间" prop="warningDay" sortable align="center" width="110">
  182. <template #default="scope">
  183. {{ scope.row.warningDay }} 天
  184. </template>
  185. </el-table-column>
  186. <!-- 单位名称 -->
  187. <el-table-column label="使用单位" prop="useUnitName" align="center" width="150" />
  188. <!-- 单位名称 -->
  189. <el-table-column label="申请单位" prop="unitName" align="center" width="150" :show-overflow-tooltip="false">
  190. <template #default="{row}">
  191. <div style="color: #015293; cursor: pointer; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;" @click="handleUnitCodeFn(row.useUnitId)">{{row.unitName}}</div>
  192. </template>
  193. </el-table-column>
  194. <!-- 单位地址 -->
  195. <!-- <el-table-column label="使用单位地址" prop="unitAddress" align="center" width="150" /> -->
  196. <!-- 使用单位联系人 -->
  197. <el-table-column label="联系人" prop="unitContact" align="center" width="140" />
  198. <!-- 使用单位联系电话 -->
  199. <el-table-column label="手机" prop="unitPhone" align="center" width="140" />
  200. <!-- 设备 -->
  201. <el-table-column label="设备" prop="equipType" align="center" width="100">
  202. <template #default="scope">
  203. {{ equipTypeMap[scope.row.equipType] }}
  204. </template>
  205. </el-table-column>
  206. <!-- 设备数量 -->
  207. <el-table-column label="台数" prop="equipNum" sortable align="center" width="100" />
  208. <!-- 部门 -->
  209. <el-table-column label="部门" prop="deptId" sortable align="center" width="130">
  210. <template #default="scope">
  211. {{ scope.row.dept ? scope.row.dept.name : '' }}
  212. </template>
  213. </el-table-column>
  214. <!-- 区域 -->
  215. <el-table-column label="所属区" prop="equipDistrictName" align="center" sortable width="100" />
  216. <!-- 街道 -->
  217. <el-table-column label="街道" prop="equipStreetName" align="center" sortable width="100" />
  218. <!-- 备注 -->
  219. <el-table-column label="备注" prop="remark" align="center" width="150" />
  220. <!-- 是否受理 -->
  221. <el-table-column label="是否受理" prop="createAcceptOrder" align="center" width="100">
  222. <template #default="scope">
  223. {{ scope.row.createAcceptOrder ? '是' : '否' }}
  224. </template>
  225. </el-table-column>
  226. <!-- 受理时间 -->
  227. <el-table-column label="受理时间" prop="schedulingTime" align="center" sortable width="180">
  228. <template #default="scope">
  229. {{ scope.row.schedulingTime ? dayjs(scope.row.schedulingTime).format('YYYY-MM-DD HH:mm:ss') : ''}}
  230. </template>
  231. </el-table-column>
  232. <!-- 客户确认时间 -->
  233. <el-table-column label="客户确认时间" prop="confirmDate" align="center" sortable width="180">
  234. <template #default="scope">
  235. {{ scope.row.confirmDate ? formatArrayDate(scope.row.confirmDate) : '-'}}
  236. </template>
  237. </el-table-column>
  238. </el-table>
  239. <!-- 分页 -->
  240. <Pagination
  241. :total="total"
  242. v-model:page="queryParams.pageNo"
  243. v-model:limit="queryParams.pageSize"
  244. @pagination="getList"
  245. />
  246. </ContentWrap>
  247. <!-- 短信确认弹窗 -->
  248. <el-dialog
  249. v-model="smsDialogVisible"
  250. title="推送约检确认信息"
  251. width="500px"
  252. append-to-body
  253. destroy-on-close
  254. >
  255. <el-form
  256. ref="smsFormRef"
  257. :model="smsForm"
  258. :rules="smsRules"
  259. label-width="80px"
  260. >
  261. <!-- <el-form-item label="手机号" prop="mobile">
  262. <el-input
  263. v-model="smsForm.mobile"
  264. placeholder="请输入手机号"
  265. maxlength="11"
  266. show-word-limit
  267. />
  268. </el-form-item> -->
  269. </el-form>
  270. <template #footer>
  271. <div class="dialog-footer">
  272. <el-button @click="smsDialogVisible = false">取消</el-button>
  273. <el-button type="primary" @click="submitSmsConfirm">发送短信</el-button>
  274. <!-- <el-button type="success" @click="handleCopyConfirmLink">复制链接</el-button> -->
  275. <el-button type="success" @click="handleSendWechatConfirm">微信推送</el-button>
  276. </div>
  277. </template>
  278. </el-dialog>
  279. <!-- 预警设置弹窗 -->
  280. <el-dialog
  281. v-model="warningDialogVisible"
  282. title="预警设置"
  283. width="400px"
  284. destroy-on-close
  285. append-to-body
  286. >
  287. <el-form
  288. ref="warningFormRef"
  289. :model="warningForm"
  290. :rules="warningRules"
  291. label-width="100px"
  292. >
  293. <el-form-item label="预警天数" prop="warningDays">
  294. <el-input-number
  295. v-model="warningForm.warningDays"
  296. :min="1"
  297. :max="365"
  298. placeholder="请输入预警天数"
  299. class="!w-full"
  300. :precision="0"
  301. :step="1"
  302. />
  303. </el-form-item>
  304. </el-form>
  305. <template #footer>
  306. <el-button @click="warningDialogVisible = false">取 消</el-button>
  307. <el-button type="primary" @click="submitWarningSettings">确 定</el-button>
  308. </template>
  309. </el-dialog>
  310. <unitContainerForm ref="unitContainerFormRef" />
  311. </template>
  312. <script setup lang="ts">
  313. import { formatArrayDate } from '@/utils/formatTime'
  314. import { AppointmentConfirmOrderApi, AppointmentConfirmOrderVO } from '@/api/pressure/appointmentconfirmorder'
  315. import { ElMessage } from 'element-plus'
  316. import AreaSelect from '../../system/equipcontainer/components/AreaSelect.vue'
  317. import StreetSelect from '../../system/equipcontainer/components/StreetSelect.vue'
  318. import DeptSelect from '../plan/components/DeptSelect.vue'
  319. import { useRouter, useRoute } from 'vue-router'
  320. import dayjs from 'dayjs'
  321. import unitContainerForm from '@/components/unitContainerForm/index.vue'
  322. import { useEmitt } from '@/hooks/web/useEmitt'
  323. import { computed } from 'vue'
  324. import { cloneDeep } from 'lodash'
  325. import { isEmpty } from '@/utils/is'
  326. /** 约检确认 列表 */
  327. defineOptions({ name: 'OrderConfirm' })
  328. const cellStyle = ()=> {
  329. return {
  330. 'padding': '30px 0'
  331. }
  332. }
  333. const unitContainerFormRef = ref<InstanceType<typeof unitContainerForm>>()
  334. const router = useRouter()
  335. const route = useRoute()
  336. // 检验性质映射
  337. const checkTypeMap = {
  338. 100: '定期检验',
  339. 200: '年度检查',
  340. 300: '超年限检验'
  341. }
  342. const tempSendStatusMap: { [key: string]: string } = {
  343. '0': '推送成功',
  344. '1': '用户拒绝',
  345. '2': '其他原因失败',
  346. '3': '找不到平台用户'
  347. }
  348. const getTypeColor = computed(() => {
  349. return (status) => {
  350. const statusMap = {
  351. '1': 'warning',
  352. '0': 'success',
  353. '2': 'danger',
  354. '3': 'info',
  355. }
  356. return statusMap[status]
  357. }
  358. })
  359. // 设备类型
  360. const equipTypeMap = {
  361. 100: '容器',
  362. 200: '管道',
  363. 300: '锅炉'
  364. }
  365. // 确认状态
  366. const statusMap = {
  367. 100: '待确认',
  368. 200: '已确认',
  369. 300: '约检调整',
  370. 500: '已作废'
  371. }
  372. const loading = ref(true) // 列表的加载中
  373. const list = ref<AppointmentConfirmOrderVO[]>([]) // 列表的数据
  374. const total = ref(0) // 列表的总页数
  375. const queryParams = ref<Record<string, any>>({
  376. pageNo: 1,
  377. pageSize: 10,
  378. appointmentDate: [],
  379. unitName: '',
  380. useUnitName: '',
  381. unitAddress: '',
  382. equipCode: '',
  383. equipDistrict: undefined as number | undefined,
  384. equipStreet: undefined as number | undefined,
  385. deptId: '',
  386. equipType: '',
  387. checkType: '',
  388. status: ['100', '200', '300'],
  389. warningDay: [] as number[],
  390. createAcceptOrder: false,
  391. appointmentNo: ''
  392. })
  393. const queryFormRef = ref() // 搜索的表单
  394. // 短信确认相关
  395. const smsDialogVisible = ref(false)
  396. const smsFormRef = ref()
  397. const smsForm = reactive({
  398. mobile: ''
  399. })
  400. const smsRules = {
  401. mobile: [
  402. { required: true, message: '请输入手机号', trigger: 'blur' },
  403. { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }
  404. ]
  405. }
  406. const currentRow = ref<AppointmentConfirmOrderVO>()
  407. const areaStreetMap = ref<Map<number, number[]>>(new Map())
  408. const handleAreaClear = () => {
  409. queryParams.value.equipStreet = undefined
  410. areaStreetMap.value.clear()
  411. }
  412. const handleAreaChange = (_areas: number[]) => {
  413. queryParams.value.equipStreet = undefined
  414. areaStreetMap.value.clear()
  415. return
  416. }
  417. const handleStreetClear = () => {
  418. areaStreetMap.value.clear()
  419. }
  420. const handleStreetChange = (streets: number[], areaId: number) => {
  421. if (queryParams.value.equipDistrict && areaId === queryParams.value.equipDistrict) {
  422. areaStreetMap.value.set(areaId, streets)
  423. }
  424. }
  425. const getPaginationList = async (page) => {
  426. queryParams.value.pageNo = page.page
  427. queryParams.value.pageSize = page.limit
  428. const { ids } = route.query as Recordable
  429. if(ids){
  430. queryParams.value.status = []
  431. queryParams.value.createAcceptOrder = undefined
  432. }
  433. await getList()
  434. }
  435. /** 查询列表 */
  436. const getList = async () => {
  437. loading.value = true
  438. try {
  439. const params = cloneDeep(queryParams.value)
  440. for (const key in params) {
  441. if (isEmpty(params[key])) {
  442. delete params[key]
  443. }
  444. }
  445. const data = await AppointmentConfirmOrderApi.getAppointmentConfirmOrderPage(params)
  446. list.value = data.list
  447. total.value = data.total
  448. } finally {
  449. loading.value = false
  450. }
  451. }
  452. /** 搜索按钮操作 */
  453. const handleQuery = () => {
  454. queryParams.value.pageNo = 1
  455. getList()
  456. }
  457. /** 重置按钮操作 */
  458. const resetQuery = () => {
  459. // queryFormRef.value.resetFields()
  460. queryParams.value = {
  461. pageNo: 1,
  462. pageSize: 10,
  463. warningDay: [] as number[],
  464. }
  465. handleQuery()
  466. }
  467. /** 约检按钮操作 */
  468. const handleAppointment = (row: AppointmentConfirmOrderVO) => {
  469. // 根据不同设备类型跳转不同页面
  470. switch (row.equipMainType){
  471. case 200:
  472. router.push({
  473. name: 'OrderBoilerDetail',
  474. query: {
  475. id: row.id
  476. }
  477. })
  478. break;
  479. case 300:
  480. router.push({
  481. name: 'OrderPipeDetail',
  482. query: {
  483. id: row.id
  484. }
  485. })
  486. break
  487. case 100:
  488. default:
  489. router.push({
  490. name: 'OrderConfirmDetail',
  491. query: {
  492. id: row.id
  493. }
  494. })
  495. break;
  496. }
  497. // router.push({
  498. // name: 'OrderConfirmDetail',
  499. // query: {
  500. // id: row.id
  501. // }
  502. // })
  503. }
  504. /** 选择框操作 */
  505. const handleSelectionChange = (selection: AppointmentConfirmOrderVO[]) => {
  506. console.log(selection)
  507. }
  508. /** 打开发送确认弹窗 */
  509. const handleSendConfirm = (row: AppointmentConfirmOrderVO) => {
  510. const {unitPhone = ''} = row
  511. if(!new RegExp(/^1[3-9]\d{9}$/).test(unitPhone)){
  512. ElMessage.error('发送失败,请修正约检联系人电话格式')
  513. return
  514. }
  515. currentRow.value = row
  516. smsForm.mobile = row.unitPhone || '' // 默认填入单位联系电话
  517. smsDialogVisible.value = true
  518. }
  519. /** 提交短信确认 */
  520. const submitSmsConfirm = async () => {
  521. if (!smsFormRef.value) return
  522. await smsFormRef.value.validate(async (valid: boolean) => {
  523. if (valid) {
  524. try {
  525. // 调用发送短信的API
  526. await AppointmentConfirmOrderApi.sendSmsConfirm({
  527. id: currentRow.value?.id,
  528. mobile: smsForm.mobile
  529. })
  530. ElMessage.success('短信发送成功')
  531. smsDialogVisible.value = false
  532. } catch (error) {
  533. console.error('发送短信失败:', error)
  534. } finally {
  535. getList();
  536. }
  537. }
  538. })
  539. }
  540. const handleUnitCodeFn = (id) => {
  541. if (!id) {
  542. return ElMessage.warning('该单位信息异常!')
  543. }
  544. unitContainerFormRef.value?.open(id)
  545. }
  546. /** 发送微信推送 */
  547. const handleSendWechatConfirm = async () => {
  548. try {
  549. // 调用发送短信的API
  550. await AppointmentConfirmOrderApi.sendWechatConfirm({
  551. id: currentRow.value?.id,
  552. })
  553. ElMessage.success('微信推送发送成功')
  554. smsDialogVisible.value = false
  555. } catch (error) {
  556. console.error('发送微信推送失败:', error)
  557. } finally {
  558. getList();
  559. }
  560. }
  561. // 预警设置相关
  562. const warningDialogVisible = ref(false)
  563. const warningFormRef = ref()
  564. const warningForm = reactive({
  565. warningDays: 30
  566. })
  567. const warningRules = {
  568. warningDays: [
  569. { required: true, message: '请输入预警天数', trigger: 'blur' },
  570. { validator: (_rule, value, callback) => {
  571. if (value < 1 || value > 365) {
  572. callback(new Error('预警天数必须在1-365之间'))
  573. } else {
  574. callback()
  575. }
  576. }, trigger: 'blur' }
  577. ]
  578. }
  579. /** 打开预警设置弹窗 */
  580. const handleWarningSettings = () => {
  581. warningDialogVisible.value = true
  582. }
  583. /** 提交预警设置 */
  584. const submitWarningSettings = async () => {
  585. if (!warningFormRef.value) return
  586. await warningFormRef.value.validate(async (valid: boolean) => {
  587. if (valid) {
  588. // 调用保存预警设置的API
  589. await AppointmentConfirmOrderApi.putWarningSettings({
  590. warningDay: warningForm.warningDays
  591. })
  592. ElMessage.success('预警设置保存成功')
  593. warningDialogVisible.value = false
  594. }
  595. })
  596. }
  597. /** 复制约检确认链接 */
  598. const handleCopyConfirmLink = () => {
  599. if (!currentRow.value?.id) {
  600. ElMessage.warning('获取约检ID失败')
  601. return
  602. }
  603. const url = `https://tjt.gzsei.cn/mp/pages/appointment-confirm/index?id=${currentRow.value.id}`
  604. // 使用 Clipboard API
  605. navigator.clipboard.writeText(url)
  606. .then(() => {
  607. ElMessage.success('约检确认链接已复制到剪贴板')
  608. })
  609. .catch(err => {
  610. console.error('复制失败: ', err)
  611. ElMessage.error('复制失败,请手动复制')
  612. // 兼容性处理:创建临时输入框
  613. const textArea = document.createElement('textarea')
  614. textArea.value = url
  615. document.body.appendChild(textArea)
  616. textArea.select()
  617. try {
  618. document.execCommand('copy')
  619. ElMessage.success('约检确认链接已复制到剪贴板')
  620. } catch (err) {
  621. ElMessage.error('复制失败,请手动复制')
  622. }
  623. document.body.removeChild(textArea)
  624. })
  625. }
  626. const { emitter } = useEmitt()
  627. emitter.on('refresh-list', ()=> {
  628. getList();
  629. })
  630. /** 初始化 **/
  631. onMounted(() => {
  632. // const { unitName } = route.query as Recordable
  633. // if(unitName){
  634. // queryParams.value.status = []
  635. // queryParams.value.createAcceptOrder = undefined
  636. // queryParams.value.unitName = unitName
  637. // }
  638. getList()
  639. })
  640. </script>
  641. <style lang="scss" scoped>
  642. .cursor-pointer .el-table__row {
  643. cursor: pointer;
  644. }
  645. .cursor-pointer .el-table__body-wrapper{
  646. padding-bottom: 16px;
  647. }
  648. </style>