validation.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. <script setup lang="ts">
  2. import {
  3. exportFile,
  4. readvaildation,
  5. Storehouse_ProductClass_List,
  6. updatevaildation,
  7. uploadFile,
  8. validation_add,
  9. validation_del,
  10. validation_List,
  11. validation_update
  12. } from '@/api/storehouse'
  13. import TableBase from '@/components/TableBase/index.vue'
  14. import { computed, onMounted, reactive, ref } from 'vue'
  15. import { GlobalStore } from '@/stores'
  16. import type { ColumnProps } from '@/components/TableBase/interface'
  17. import { Delete, Edit } from '@element-plus/icons-vue'
  18. import type { FormInstance, UploadInstance } from 'element-plus'
  19. import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
  20. const uploadRef = ref<UploadInstance>()
  21. const uploadFiles = ref<File[]>([]) // 新增:用于存储上传的文件
  22. const globalStore = GlobalStore()
  23. const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
  24. const initParam = reactive({
  25. User_tokey: globalStore.GET_User_tokey,
  26. Validationnumber: '',
  27. T_state: '',
  28. T_sn: '',
  29. T_imei: '',
  30. T_iccid: '',
  31. LendUser: '',
  32. T_project: '',
  33. T_class: ''
  34. })
  35. const columns: ColumnProps[] = [
  36. { type: 'index', label: '序号', width: 80 },
  37. { prop: 'Validationnumber', label: '设备编号', ellipsis: true },
  38. { prop: 'T_sn', label: '设备SN', ellipsis: true },
  39. { prop: 'T_imei', label: '模组imei', ellipsis: true },
  40. { prop: 'T_iccid', label: '物联网卡号', ellipsis: true },
  41. { prop: 'T_state', label: '状态', name: 'T_state' },
  42. { prop: 'T_class', label: '设备类型', name: 'T_class' },
  43. { prop: 'LendUser', label: '借出人', ellipsis: true },
  44. { prop: 'T_project', label: '借出项目', ellipsis: true },
  45. { prop: 'T_remark', label: '备注', name: 'T_remark', ellipsis: true },
  46. { prop: 'operation', label: '操作', width: 260, fixed: 'right' }
  47. ]
  48. // 搜索
  49. const options = reactive([
  50. { name: '已出库', id: 1 },
  51. { name: '未出库', id: 2 },
  52. { name: '已损坏', id: 3 }
  53. ])
  54. const searchHandle = () => {
  55. TableRef.value?.searchTable()
  56. }
  57. /**
  58. * 删除
  59. */
  60. const deleteFun = (row: any) => {
  61. ElMessageBox.confirm('删除操作,是否立即删除?', '删除', {
  62. confirmButtonText: '立即删除',
  63. cancelButtonText: '取消',
  64. type: 'warning',
  65. center: true
  66. })
  67. .then(async () => {
  68. const result: any = await validation_del({ t_sn: row })
  69. if (result.Code == 200) {
  70. ElMessage.success('删除成功')
  71. TableRef.value?.searchTable()
  72. }
  73. })
  74. // eslint-disable-next-line @typescript-eslint/no-empty-function
  75. .catch(() => {})
  76. }
  77. //导出文件execl
  78. const exportExecl = async () => {
  79. try {
  80. const response: any = await exportFile({
  81. User_tokey: globalStore.GET_User_tokey,
  82. Validationnumber: initParam.Validationnumber,
  83. T_state: initParam.T_state,
  84. T_sn: initParam.T_sn,
  85. T_imei: initParam.T_imei,
  86. T_iccid: initParam.T_iccid,
  87. LendUser: initParam.LendUser,
  88. T_project: initParam.T_project,
  89. T_class: initParam.T_class
  90. })
  91. // 处理返回的二进制文件并触发下载
  92. const blob = new Blob([response], { type: 'application/vnd.ms-excel;charset=utf8' })
  93. const url = window.URL.createObjectURL(blob)
  94. const a = document.createElement('a')
  95. a.href = url
  96. a.download = 'filename.xlsx' // 设置下载的文件名
  97. document.body.appendChild(a)
  98. a.click()
  99. a.remove()
  100. window.URL.revokeObjectURL(url)
  101. ElMessage.success('导出成功')
  102. } catch (error) {
  103. ElMessage.error('导出失败,请检查网络连接')
  104. }
  105. }
  106. const showInStorageForm = ref(false)
  107. const showrRepaidForm = ref(false)
  108. const inStorageFormRef = ref<FormInstance | null>(null)
  109. const inStorageForm = reactive({
  110. T_sn: '',
  111. Validationnumber: '',
  112. T_remark: '',
  113. T_class: ''
  114. })
  115. interface InStorageItem {
  116. T_sn: string
  117. Validationnumber: string
  118. T_remark: string
  119. }
  120. // 获取产品分类
  121. const Pruductoptions = ref<any[]>([
  122. {
  123. Id: '',
  124. T_name: ''
  125. }
  126. ])
  127. const getProductClassList = async () => {
  128. const res: any = await Storehouse_ProductClass_List({ page: 1, page_z: 999 })
  129. Pruductoptions.value = res.Data.Data
  130. }
  131. const pendingItems = ref<InStorageItem[]>([])
  132. const pageSize = ref(8)
  133. const currentPage = ref(1)
  134. const paginatedPendingItems = computed(() => {
  135. const start = (currentPage.value - 1) * pageSize.value
  136. const end = start + pageSize.value
  137. return pendingItems.value.slice(start, end)
  138. })
  139. const rules = reactive({
  140. T_sn: [{ required: true, message: '请输入SN', trigger: 'blur' }],
  141. Validationnumber: [{ required: true, message: '请输入设备编号', trigger: 'blur' }],
  142. T_class: [{ required: true, message: '请选择产品分类', trigger: 'blur' }]
  143. })
  144. const rulesrepaid = reactive({
  145. T_sn: [{ required: true, message: '请输入SN', trigger: 'blur' }]
  146. })
  147. const extractSN = (fullSN: string): string => {
  148. if (fullSN.length === 24 && fullSN.startsWith('03') && fullSN.endsWith('000001')) {
  149. return fullSN.substring(2, 18)
  150. }
  151. return fullSN
  152. }
  153. const submitInStorageForm = () => {
  154. inStorageFormRef.value?.validate((valid: boolean) => {
  155. if (valid) {
  156. const extractedSN = extractSN(inStorageForm.T_sn)
  157. if (pendingItems.value.some((item: any) => item.T_sn === extractedSN)) {
  158. ElMessage.warning('已存在相同的SN,不能添加')
  159. return
  160. }
  161. pendingItems.value.unshift({ ...inStorageForm, T_sn: extractedSN })
  162. inStorageForm.T_sn = ''
  163. inStorageForm.Validationnumber = ''
  164. inStorageForm.T_remark = ''
  165. ElMessage.success('已添加到待提交列表')
  166. if ('speechSynthesis' in window) {
  167. const utterance = new SpeechSynthesisUtterance('添加成功')
  168. window.speechSynthesis.speak(utterance)
  169. } else {
  170. console.warn('Web Speech API 不被支持')
  171. }
  172. }
  173. })
  174. }
  175. const submitRepaidForm = () => {
  176. inStorageFormRef.value?.validate(async (valid: boolean) => {
  177. if (valid) {
  178. const extractedSN = extractSN(inStorageForm.T_sn)
  179. if (pendingItems.value.some((item: any) => item.T_sn === extractedSN)) {
  180. ElMessage.warning('已存在相同的SN,不能添加')
  181. return
  182. }
  183. const result: any = await readvaildation({ sn: extractedSN })
  184. if (result.Code !== 200) {
  185. ElMessage.warning('当前SN未入库不能归还')
  186. return
  187. }
  188. pendingItems.value.unshift({ ...inStorageForm, T_sn: extractedSN })
  189. inStorageForm.T_sn = ''
  190. inStorageForm.Validationnumber = ''
  191. inStorageForm.T_remark = ''
  192. ElMessage.success('已添加到待提交列表')
  193. if ('speechSynthesis' in window) {
  194. const utterance = new SpeechSynthesisUtterance('添加成功')
  195. window.speechSynthesis.speak(utterance)
  196. } else {
  197. console.warn('Web Speech API 不被支持')
  198. }
  199. }
  200. })
  201. }
  202. const removePendingItem = (index: number) => {
  203. pendingItems.value.splice(index, 1)
  204. ElMessage.success('已从待提交列表中移除')
  205. }
  206. const submitInStoragePendingItems = async () => {
  207. if (pendingItems.value.length === 0) {
  208. ElMessage.warning('暂无数据可提交')
  209. return
  210. }
  211. const rest = JSON.parse(JSON.stringify(pendingItems.value))
  212. try {
  213. const result: any = await validation_add(rest)
  214. if (result.Code === 200) {
  215. ElMessage.success('提交成功')
  216. pendingItems.value = []
  217. inStorageForm.T_sn = ''
  218. inStorageForm.Validationnumber = ''
  219. inStorageForm.T_remark = ''
  220. searchHandle()
  221. } else {
  222. ElMessage.error('提交失败')
  223. }
  224. } catch (error) {
  225. ElMessage.error('提交失败,请检查网络连接')
  226. }
  227. }
  228. const handlePageChange = (page: number) => {
  229. currentPage.value = page
  230. }
  231. const showLendForm = ref(false)
  232. const lendFormRef = ref<FormInstance | null>(null)
  233. const lendForm = reactive({
  234. T_sn: '',
  235. Validationnumber: '',
  236. T_remark: '',
  237. LendUser: '',
  238. T_project: ''
  239. })
  240. interface LendItem {
  241. T_sn: string
  242. Validationnumber: string
  243. T_remark: string
  244. LendUser: string
  245. T_project: string
  246. }
  247. const pendingLendItems = ref<LendItem[]>([])
  248. const lendPageSize = ref(8)
  249. const lendCurrentPage = ref(1)
  250. const paginatedPendingLendItems = computed(() => {
  251. const start = (lendCurrentPage.value - 1) * lendPageSize.value
  252. const end = start + lendPageSize.value
  253. return pendingLendItems.value.slice(start, end)
  254. })
  255. const lendRules = reactive({
  256. T_sn: [{ required: true, message: '请输入SN', trigger: 'blur' }]
  257. })
  258. const submitLendForm = () => {
  259. lendFormRef.value?.validate(async (valid: boolean) => {
  260. if (valid) {
  261. const extractedSN = extractSN(lendForm.T_sn)
  262. if (pendingLendItems.value.some((item: any) => item.T_sn === extractedSN)) {
  263. ElMessage.warning('已存在相同的SN,不能添加')
  264. return
  265. }
  266. const result: any = await readvaildation({ sn: extractedSN })
  267. if (result.Code !== 200) {
  268. ElMessage.warning('当前SN未入库不能借出')
  269. return
  270. }
  271. pendingLendItems.value.unshift({
  272. T_sn: extractedSN,
  273. Validationnumber: lendForm.Validationnumber,
  274. T_remark: lendForm.T_remark,
  275. LendUser: lendForm.LendUser,
  276. T_project: lendForm.T_project
  277. })
  278. lendForm.T_sn = ''
  279. lendForm.T_remark = ''
  280. ElMessage.success('已添加到待提交列表')
  281. if ('speechSynthesis' in window) {
  282. const utterance = new SpeechSynthesisUtterance('添加成功')
  283. window.speechSynthesis.speak(utterance)
  284. } else {
  285. console.warn('Web Speech API 不被支持')
  286. }
  287. } else {
  288. }
  289. })
  290. }
  291. const removePendingLendItem = (index: number) => {
  292. pendingLendItems.value.splice(index, 1)
  293. ElMessage.success('已从待提交列表中移除')
  294. }
  295. const submitLendPendingItems = async () => {
  296. if (pendingLendItems.value.length === 0) {
  297. ElMessage.warning('暂无数据可提交')
  298. return
  299. }
  300. const rest = JSON.parse(JSON.stringify(pendingLendItems.value))
  301. const result: any = await validation_update(rest)
  302. if (result.Code == 200) {
  303. ElMessage.success('提交成功')
  304. pendingLendItems.value = []
  305. lendForm.T_sn = ''
  306. lendForm.T_remark = ''
  307. lendForm.LendUser = ''
  308. lendForm.T_project = ''
  309. searchHandle()
  310. } else {
  311. ElMessage.error('提交失败')
  312. }
  313. }
  314. const handleLendPageChange = (page: number) => {
  315. lendCurrentPage.value = page
  316. }
  317. const showEditForm = ref(false)
  318. const ImportEdit = ref(false)
  319. const editFormRef = ref<FormInstance | null>(null)
  320. const editForm = reactive({
  321. T_sn: '',
  322. Validationnumber: '',
  323. T_remark: '',
  324. T_state: '',
  325. T_class: ''
  326. })
  327. const Repaid = () => {
  328. submitRepaidForm()
  329. }
  330. const previewEdit = async (row: any) => {
  331. showEditForm.value = true
  332. const result: any = await readvaildation({ sn: row.T_sn })
  333. if (result.Code === 200) {
  334. Object.assign(editForm, result.Data)
  335. } else {
  336. ElMessage.error('获取数据失败')
  337. }
  338. }
  339. const submitEditForm = () => {
  340. editFormRef.value?.validate(async (valid: boolean): Promise<void> => {
  341. if (valid) {
  342. const result: any = await updatevaildation(editForm)
  343. if (result.Code === 200) {
  344. ElMessage.success('编辑成功')
  345. showEditForm.value = false
  346. searchHandle()
  347. } else {
  348. ElMessage.error('编辑失败')
  349. }
  350. } else {
  351. // do nothing
  352. }
  353. })
  354. }
  355. const handleFileChange = (file: any, fileList: any) => {
  356. uploadFiles.value = fileList.map((item: any) => item.raw) // 新增:更新上传文件列表
  357. }
  358. const submitUpload = async () => {
  359. if (uploadFiles.value.length === 0) {
  360. // 修改:使用 uploadFiles.value
  361. ElMessage.warning('请先选择文件')
  362. return
  363. }
  364. const formData = new FormData()
  365. uploadFiles.value.forEach((file: File) => {
  366. // 修改:遍历 uploadFiles.value
  367. formData.append('excelFile', file)
  368. })
  369. const loading = ElLoading.service({
  370. // 新增:显示加载动画
  371. lock: true,
  372. text: '正在上传文件...',
  373. background: 'rgba(0, 0, 0, 0.7)'
  374. })
  375. try {
  376. const result: any = await uploadFile(formData)
  377. if (result.Code === 200) {
  378. ElMessage.success('文件上传成功')
  379. // 处理上传成功后的逻辑
  380. searchHandle()
  381. uploadFiles.value = [] // 新增:清除文件上传列表
  382. } else {
  383. ElMessage.error('文件上传失败')
  384. }
  385. } catch (error) {
  386. ElMessage.error('文件上传失败,请检查网络连接')
  387. } finally {
  388. loading.close() // 新增:关闭加载动画
  389. }
  390. }
  391. onMounted(() => {
  392. getProductClassList()
  393. })
  394. </script>
  395. <template>
  396. <div class="list">
  397. <TableBase
  398. ref="TableRef"
  399. :columns="columns"
  400. :requestApi="validation_List"
  401. :initParam="initParam"
  402. :pagination="true"
  403. >
  404. <template #table-header>
  405. <div class="input-suffix">
  406. <el-row :gutter="20" style="margin-bottom: 0">
  407. <el-col :xl="3" :lg="3" :md="3">
  408. <span class="inline-flex items-center">设备编号:</span>
  409. <el-input
  410. v-model="initParam.Validationnumber"
  411. class="w-50 m-2"
  412. type="text"
  413. placeholder="设备编号搜索"
  414. clearable
  415. @change="searchHandle"
  416. />
  417. </el-col>
  418. <el-col :xl="3" :lg="3" :md="3">
  419. <span class="inline-flex items-center">状态:</span>
  420. <el-select v-model="initParam.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
  421. <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id" />
  422. </el-select>
  423. </el-col>
  424. <el-col :xl="3" :lg="3" :md="3">
  425. <span class="inline-flex items-center">SN:</span>
  426. <el-input
  427. class="w-50 m-2"
  428. v-model="initParam.T_sn"
  429. type="text"
  430. placeholder="按SN搜索"
  431. clearable
  432. @change="searchHandle"
  433. />
  434. </el-col>
  435. <el-col :xl="3" :lg="3" :md="3">
  436. <span class="inline-flex items-center">产品分类:</span>
  437. <el-select v-model="initParam.T_class" class="w-50 m-2" clearable placeholder="请选择分类~">
  438. <el-option v-for="item in Pruductoptions" :key="item.Id" :label="item.T_name" :value="item.Id" />
  439. </el-select>
  440. </el-col>
  441. <el-col :xl="3" :lg="3" :md="3">
  442. <span class="inline-flex items-center">模组imei:</span>
  443. <el-input
  444. class="w-50 m-2"
  445. v-model="initParam.T_imei"
  446. type="text"
  447. placeholder="按模组imei搜索"
  448. clearable
  449. @change="searchHandle"
  450. />
  451. </el-col>
  452. <el-col :xl="3" :lg="3" :md="3">
  453. <span class="inline-flex items-center">借出人</span>
  454. <el-input
  455. class="w-50 m-2"
  456. v-model="initParam.LendUser"
  457. type="text"
  458. placeholder="按借出人搜索"
  459. clearable
  460. @change="searchHandle"
  461. />
  462. </el-col>
  463. <el-col :xl="3" :lg="3" :md="3">
  464. <span class="inline-flex items-center">借出项目</span>
  465. <el-input
  466. class="w-50 m-2"
  467. v-model="initParam.T_project"
  468. type="text"
  469. placeholder="按借出项目搜索"
  470. clearable
  471. @change="searchHandle"
  472. />
  473. </el-col>
  474. <el-col :xl="3" :lg="3" :md="3">
  475. <span class="inline-flex items-center">物联网卡号:</span>
  476. <el-input
  477. class="w-50 m-2"
  478. v-model="initParam.T_iccid"
  479. type="text"
  480. placeholder="按物联网卡号搜索"
  481. clearable
  482. @change="searchHandle"
  483. />
  484. </el-col>
  485. <el-col :xl="10" :lg="10" :md="10" style="margin-top: 10px">
  486. <el-button type="primary" @click="searchHandle">搜索</el-button>
  487. <el-button type="primary" @click="showInStorageForm = true">入库</el-button>
  488. <el-button type="primary" @click="showLendForm = true">借出</el-button>
  489. <el-button type="primary" @click="showrRepaidForm = true">归还</el-button>
  490. <el-button type="success" @click="ImportEdit = true">模板导入</el-button>
  491. <el-button type="success" @click="exportExecl">导出</el-button>
  492. </el-col>
  493. </el-row>
  494. </div>
  495. </template>
  496. <template #T_state="{ row }">
  497. <el-tag v-if="row.T_state == 1" type="success" effect="dark"> 已出库</el-tag>
  498. <el-tag v-if="row.T_state == 2" effect="dark">未出库</el-tag>
  499. <el-tag v-if="row.T_state == 3" effect="dark" type="danger">已损坏</el-tag>
  500. </template>
  501. <template #T_class="{ row }">
  502. <el-tag>{{ Pruductoptions.find(option => option.Id === row.T_class)?.T_name || '' }}</el-tag>
  503. </template>
  504. <template #right="{ row }">
  505. <el-button link type="success" size="small" :icon="Edit" @click="previewEdit(row)">编辑</el-button>
  506. <el-button link type="danger" size="small" :icon="Delete" @click="deleteFun(row.T_sn)">删除</el-button>
  507. </template>
  508. </TableBase>
  509. </div>
  510. <!-- 新增入库表单 -->
  511. <el-dialog title="入库" v-model="showInStorageForm" width="50%">
  512. <el-form :model="inStorageForm" :rules="rules" ref="inStorageFormRef">
  513. <el-form-item label="SN" prop="T_sn">
  514. <el-input v-model="inStorageForm.T_sn" placeholder="请输入SN"></el-input>
  515. </el-form-item>
  516. <el-form-item label="设备编号" prop="Validationnumber">
  517. <el-input v-model="inStorageForm.Validationnumber" placeholder="请输入设备编号"></el-input>
  518. </el-form-item>
  519. <el-form-item label="产品分类" prop="T_class">
  520. <el-select v-model="inStorageForm.T_class" class="w-50 m-2" clearable placeholder="请选择分类~">
  521. <el-option v-for="item in Pruductoptions" :key="item.Id" :label="item.T_name" :value="item.Id" />
  522. </el-select>
  523. </el-form-item>
  524. <el-form-item label="备注">
  525. <el-input v-model="inStorageForm.T_remark" type="textarea" placeholder="请输入备注"></el-input>
  526. </el-form-item>
  527. </el-form>
  528. <!-- 新增数据条数提示 -->
  529. <div style="margin: 10px 0">
  530. <span>当前待提交数据条数: {{ pendingItems.length }}</span>
  531. </div>
  532. <el-table :data="paginatedPendingItems" style="width: 100%; margin-top: 20px">
  533. <el-table-column type="index" label="序号" width="80"></el-table-column>
  534. <!-- 添加序号列 -->
  535. <el-table-column prop="T_sn" label="SN" width="300"></el-table-column>
  536. <el-table-column prop="Validationnumber" label="设备编号"></el-table-column>
  537. <el-table-column prop="T_class" label="产品分类"></el-table-column>
  538. <el-table-column prop="T_remark" label="备注"></el-table-column>
  539. <el-table-column label="操作" width="180">
  540. <template #default="scope">
  541. <el-button type="danger" size="small" @click="removePendingItem(scope.$index)">删除</el-button>
  542. </template>
  543. </el-table-column>
  544. </el-table>
  545. <el-pagination
  546. background
  547. layout="prev, pager, next"
  548. :total="pendingItems.length"
  549. :page-size="pageSize"
  550. :current-page="currentPage"
  551. @current-change="handlePageChange"
  552. style="margin-top: 20px; text-align: right"
  553. />
  554. <template #footer>
  555. <span class="dialog-footer">
  556. <el-button @click="showInStorageForm = false">取消</el-button>
  557. <el-button type="primary" @click="submitInStorageForm">添加到暂存</el-button>
  558. <!-- 新增提交按钮 -->
  559. <el-button type="primary" @click="submitInStoragePendingItems">提交</el-button>
  560. </span>
  561. </template>
  562. </el-dialog>
  563. <!-- 新增借出表单 -->
  564. <el-dialog title="借出" v-model="showLendForm" width="50%">
  565. <el-form :model="lendForm" :rules="lendRules" ref="lendFormRef">
  566. <el-form-item label="SN" prop="T_sn">
  567. <el-input v-model="lendForm.T_sn" placeholder="请输入SN" @keyup.enter="submitLendForm"></el-input>
  568. </el-form-item>
  569. <el-form-item label="备注">
  570. <el-input v-model="lendForm.T_remark" type="textarea" placeholder="请输入备注"></el-input>
  571. </el-form-item>
  572. <!-- 新增借出人和借出项目 -->
  573. <el-form-item label="借出人" prop="LendUser">
  574. <el-input v-model="lendForm.LendUser" placeholder="请输入借出人"></el-input>
  575. </el-form-item>
  576. <el-form-item label="借出项目" prop="T_project">
  577. <el-input v-model="lendForm.T_project" placeholder="请输入借出项目"></el-input>
  578. </el-form-item>
  579. </el-form>
  580. <!-- 新增数据条数提示 -->
  581. <div style="margin: 10px 0">
  582. <span>当前待提交数据条数: {{ pendingLendItems.length }}</span>
  583. </div>
  584. <el-table :data="paginatedPendingLendItems" style="width: 100%; margin-top: 20px">
  585. <el-table-column type="index" label="序号" width="80"></el-table-column>
  586. <!-- 添加序号列 -->
  587. <el-table-column prop="T_sn" label="SN" width="300"></el-table-column>
  588. <el-table-column prop="LendUser" label="借出人"></el-table-column>
  589. <el-table-column prop="T_project" label="借出项目"></el-table-column>
  590. <el-table-column prop="T_remark" label="备注"></el-table-column>
  591. <el-table-column label="操作" width="180">
  592. <template #default="scope">
  593. <el-button type="danger" size="small" @click="removePendingLendItem(scope.$index)">删除</el-button>
  594. </template>
  595. </el-table-column>
  596. </el-table>
  597. <el-pagination
  598. background
  599. layout="prev, pager, next"
  600. :total="pendingLendItems.length"
  601. :page-size="lendPageSize"
  602. :current-page="lendCurrentPage"
  603. @current-change="handleLendPageChange"
  604. style="margin-top: 20px; text-align: right"
  605. />
  606. <template #footer>
  607. <span class="dialog-footer">
  608. <el-button @click="showLendForm = false">取消</el-button>
  609. <el-button type="primary" @click="submitLendForm">添加到暂存</el-button>
  610. <!-- 新增提交按钮 -->
  611. <el-button type="primary" @click="submitLendPendingItems">提交</el-button>
  612. </span>
  613. </template>
  614. </el-dialog>
  615. <el-dialog title="编辑" v-model="showEditForm" width="50%">
  616. <el-form :model="editForm" ref="editFormRef">
  617. <el-form-item label="SN" prop="T_sn">
  618. <el-input v-model="editForm.T_sn" placeholder="请输入SN"></el-input>
  619. </el-form-item>
  620. <el-form-item label="设备编号" prop="Validationnumber">
  621. <el-input v-model="editForm.Validationnumber" placeholder="请输入设备编号"></el-input>
  622. </el-form-item>
  623. <el-form-item label="状态">
  624. <el-select v-model="editForm.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
  625. <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id" />
  626. </el-select>
  627. </el-form-item>
  628. <el-form-item label="设备类型">
  629. <el-select v-model="editForm.T_class" class="w-50 m-2" clearable placeholder="请选择分类~">
  630. <el-option v-for="item in Pruductoptions" :key="item.Id" :label="item.T_name" :value="item.Id" />
  631. </el-select>
  632. </el-form-item>
  633. <el-form-item label="备注">
  634. <el-input v-model="editForm.T_remark" type="textarea" placeholder="请输入备注"></el-input>
  635. </el-form-item>
  636. </el-form>
  637. <template #footer>
  638. <span class="dialog-footer">
  639. <el-button @click="showEditForm = false">取消</el-button>
  640. <el-button type="primary" @click="submitEditForm">提交</el-button>
  641. </span>
  642. </template>
  643. </el-dialog>
  644. <!-- 新增归还表单 -->
  645. <el-dialog title="归还" v-model="showrRepaidForm" width="50%">
  646. <el-form :model="inStorageForm" :rules="rulesrepaid" ref="inStorageFormRef">
  647. <el-form-item label="SN" prop="T_sn">
  648. <el-input v-model="inStorageForm.T_sn" placeholder="请输入SN" @keyup.enter="Repaid"></el-input>
  649. </el-form-item>
  650. <el-form-item label="备注">
  651. <el-input v-model="inStorageForm.T_remark" type="textarea" placeholder="请输入备注"></el-input>
  652. </el-form-item>
  653. </el-form>
  654. <!-- 新增数据条数提示 -->
  655. <div style="margin: 10px 0">
  656. <span>当前待提交数据条数: {{ pendingItems.length }}</span>
  657. </div>
  658. <el-table :data="paginatedPendingItems" style="width: 100%; margin-top: 20px">
  659. <el-table-column type="index" label="序号" width="80"></el-table-column>
  660. <!-- 添加序号列 -->
  661. <el-table-column prop="T_sn" label="SN"></el-table-column>
  662. <el-table-column prop="T_remark" label="备注"></el-table-column>
  663. <el-table-column label="操作" width="180">
  664. <template #default="scope">
  665. <el-button type="danger" size="small" @click="removePendingItem(scope.$index)">删除</el-button>
  666. </template>
  667. </el-table-column>
  668. </el-table>
  669. <el-pagination
  670. background
  671. layout="prev, pager, next"
  672. :total="pendingItems.length"
  673. :page-size="pageSize"
  674. :current-page="currentPage"
  675. @current-change="handlePageChange"
  676. style="margin-top: 20px; text-align: right"
  677. />
  678. <template #footer>
  679. <span class="dialog-footer">
  680. <el-button @click="showInStorageForm = false">取消</el-button>
  681. <el-button type="primary" @click="submitInStorageForm">添加到暂存</el-button>
  682. <!-- 新增提交按钮 -->
  683. <el-button type="primary" @click="submitInStoragePendingItems">提交</el-button>
  684. </span>
  685. </template>
  686. </el-dialog>
  687. <el-dialog title="模板导入" v-model="ImportEdit" width="50%">
  688. <el-upload ref="uploadRef" class="upload-demo" :auto-upload="false" @change="handleFileChange">
  689. <template #trigger>
  690. <el-button type="primary">模板导入</el-button>
  691. </template>
  692. <el-button class="ml-3" type="success" @click="submitUpload"> 提交文件</el-button>
  693. <template #tip></template>
  694. </el-upload>
  695. </el-dialog>
  696. </template>
  697. <style scoped lang="scss">
  698. @import '@/styles/var.scss';
  699. .list {
  700. @include f-direction;
  701. }
  702. // .input-suffix {
  703. // width: 100%;
  704. // .w-50 {
  705. // width: 33.33%;
  706. // }
  707. // }
  708. </style>