| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196 |
- <script setup lang="ts">
- import {
- exportFile,
- exportOperationFile,
- readValidation,
- updateValidation,
- uploadFile,
- validation_add,
- validation_del,
- validation_List,
- validation_operationList,
- validation_recordList,
- validation_update,
- validationTool_class_list
- } from '@/api/storehouse'
- import {User_List} from '@/api/user/index';
- import TableBase from '@/components/TableBase/index.vue'
- import {computed, nextTick, onMounted, reactive, ref} from 'vue'
- import {GlobalStore} from '@/stores'
- import type {ColumnProps} from '@/components/TableBase/interface'
- import {Delete, Edit, View} from '@element-plus/icons-vue'
- import type {FormInstance, UploadInstance} from 'element-plus'
- import {ElLoading, ElMessage, ElMessageBox} from 'element-plus'
- import snAdd from './modules/snAdd.vue'
- import Drawer from "@/components/Drawer/index.vue";
- const formLabelWidth = ref('100px')
- const uploadRef = ref<UploadInstance>()
- const uploadFiles = ref<File[]>([]) // 新增:用于存储上传的文件
- const globalStore = GlobalStore()
- const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
- const recordTableRef = ref<InstanceType<typeof TableBase> | null>(null)
- const operationTableRef = ref<InstanceType<typeof TableBase> | null>(null)
- const drawerSnRef = ref<InstanceType<typeof Drawer> | null>(null)
- const initParam = reactive({
- User_tokey: globalStore.GET_User_tokey,
- Validationnumber: '',
- T_state: '',
- T_sn: '',
- T_imei: '',
- T_iccid: '',
- LendUser: '',
- T_project: '',
- T_class: ''
- })
- const recordInitParam = reactive({
- User_tokey: globalStore.GET_User_tokey,
- Validationnumber: '',
- T_state: '',
- T_sn: '',
- T_imei: '',
- T_iccid: '',
- LendUser: '',
- T_project: '',
- T_class: ''
- })
- const operationInitParam = reactive({
- User_tokey: globalStore.GET_User_tokey,
- T_state: '',
- T_sn: '',
- LendUser: '',
- T_project: '',
- })
- const columns: ColumnProps[] = [
- {type: 'index', label: '序号', width: 80},
- {prop: 'Validationnumber', label: '设备编号', ellipsis: true},
- {prop: 'T_sn', label: '设备SN', ellipsis: true, width: 180},
- {prop: 'T_imei', label: '模组imei', ellipsis: true},
- {prop: 'T_iccid', label: '物联网卡号', ellipsis: true},
- {prop: 'T_state', label: '状态', name: 'T_state'},
- {prop: 'T_class', label: '设备类型', name: 'T_class'},
- {prop: 'LendUser', label: '借出人', ellipsis: true},
- {prop: 'T_project', label: '借出项目', ellipsis: true},
- {prop: 'T_remark', label: '备注', ellipsis: true},
- {prop: 'operation', label: '操作', width: 260, fixed: 'right'}
- ]
- const recordColumns: ColumnProps[] = [
- {type: 'index', label: '序号', width: 80},
- {prop: 'Validationnumber', label: '设备编号', ellipsis: true},
- {prop: 'T_sn', label: '设备SN', ellipsis: true, width: 180},
- {prop: 'T_imei', label: '模组imei', ellipsis: true},
- {prop: 'T_iccid', label: '物联网卡号', ellipsis: true},
- {prop: 'T_state', label: '状态', name: 'T_state'},
- {prop: 'T_class', label: '设备类型', name: 'T_class'},
- {prop: 'LendUser', label: '借出(归还)人', ellipsis: true},
- {prop: 'T_project', label: '关联项目', ellipsis: true},
- {prop: 'T_remark', label: '备注', ellipsis: true},
- {prop: 'CreateTime', label: '操作时间', ellipsis: true},
- ]
- const operationColumns: ColumnProps[] = [
- {type: 'index', label: '序号', width: 80},
- {prop: 'BatchNumber', label: '操作时间', width: 190},
- {prop: 'T_state', label: '操作', name: 'T_state', width: 90},
- {prop: 'LendUser', label: '借出(归还)人', ellipsis: true},
- {prop: 'T_project', label: '关联项目', name: 'T_project', ellipsis: true, width: 300},
- {prop: 'T_remark', label: '备注', ellipsis: true},
- {prop: 'T_sn_quantity', label: '设备数量'},
- {prop: 'operation', label: 'SN', width: 100, fixed: 'right', align: 'center'}
- ]
- const snColumns = [
- {type: 'index', label: '序号', width: 80, align: 'center '},
- {label: '关联项目', prop: 'T_project', align: 'center '},
- {label: '数量', prop: 'T_number', align: 'center '},
- {label: 'SN', prop: 'T_sn', align: 'center '}
- ]
- // 搜索
- const options = reactive([
- {name: '已出库', id: 1},
- {name: '未出库', id: 2},
- {name: '维修中', id: 3},
- {name: '已报废', id: 4},
- {name: '已损坏', id: 5}
- ])
- const searchHandle = () => {
- TableRef.value?.searchTable()
- }
- const recordSearchHandle = () => {
- recordTableRef.value?.searchTable()
- }
- const operationSearchHandle = () => {
- operationTableRef.value?.searchTable()
- }
- /**
- * 删除
- */
- const deleteFun = (row: any) => {
- ElMessageBox.confirm('删除操作,是否立即删除?', '删除', {
- confirmButtonText: '立即删除',
- cancelButtonText: '取消',
- type: 'warning',
- center: true
- })
- .then(async () => {
- const result: any = await validation_del({t_sn: row})
- if (result.Code == 200) {
- ElMessage.success('删除成功')
- TableRef.value?.searchTable()
- }
- })
- // eslint-disable-next-line @typescript-eslint/no-empty-function
- .catch(() => {
- })
- }
- //导出文件excel
- const exportExcel = async () => {
- try {
- const response: any = await exportFile({
- User_tokey: globalStore.GET_User_tokey,
- Validationnumber: initParam.Validationnumber,
- T_state: initParam.T_state,
- T_sn: initParam.T_sn,
- T_imei: initParam.T_imei,
- T_iccid: initParam.T_iccid,
- LendUser: initParam.LendUser,
- T_project: initParam.T_project,
- T_class: initParam.T_class
- })
- // 处理返回的二进制文件并触发下载
- const blob = new Blob([response], {type: 'application/vnd.ms-excel;charset=utf8'})
- const url = window.URL.createObjectURL(blob)
- const a = document.createElement('a')
- a.href = url
- const now = new Date();
- const formattedDate = `${now.getFullYear()}${(now.getMonth() + 1).toString().padStart(2, '0')}${now.getDate().toString().padStart(2, '0')}_${now.getHours().toString().padStart(2, '0')}${now.getMinutes().toString().padStart(2, '0')}`;
- a.download = `验证工具记录表_${formattedDate}.xlsx`;
- document.body.appendChild(a)
- a.click()
- a.remove()
- window.URL.revokeObjectURL(url)
- ElMessage.success('导出成功')
- } catch (error) {
- ElMessage.error('导出失败,请检查网络连接')
- }
- }
- const exportOperationExcel = async () => {
- try {
- const response: any = await exportOperationFile({
- User_tokey: globalStore.GET_User_tokey,
- T_state: operationInitParam.T_state,
- T_sn: operationInitParam.T_sn,
- LendUser: operationInitParam.LendUser,
- T_project: operationInitParam.T_project,
- })
- // 处理返回的二进制文件并触发下载
- const blob = new Blob([response], {type: 'application/vnd.ms-excel;charset=utf8'})
- const url = window.URL.createObjectURL(blob)
- const a = document.createElement('a')
- a.href = url
- const now = new Date();
- const formattedDate = `${now.getFullYear()}${(now.getMonth() + 1).toString().padStart(2, '0')}${now.getDate().toString().padStart(2, '0')}_${now.getHours().toString().padStart(2, '0')}${now.getMinutes().toString().padStart(2, '0')}`;
- a.download = `验证工具操作记录表_${formattedDate}.xlsx`;
- document.body.appendChild(a)
- a.click()
- a.remove()
- window.URL.revokeObjectURL(url)
- ElMessage.success('导出成功')
- } catch (error) {
- ElMessage.error('导出失败,请检查网络连接')
- }
- }
- const showInStorageForm = ref(false)
- const dialogTableVisible = ref(false)
- const operationVisible = ref(false)
- const inStorageFormRef = ref<FormInstance | null>(null)
- const inStorageForm = reactive({
- T_sn: '',
- Validationnumber: '',
- T_remark: '',
- T_class: null
- })
- interface InStorageItem {
- T_sn: string
- Validationnumber: string
- T_remark: string
- }
- // 获取设备类型
- const Pruductoptions = ref<any[]>([
- {
- Id: '',
- T_name: ''
- }
- ])
- const getValidationToolClassList = async () => {
- const res: any = await validationTool_class_list({page: 1, page_z: 999})
- Pruductoptions.value = res.Data.Data
- }
- const pendingItems = ref<InStorageItem[]>([])
- const pageSize = ref(8)
- const currentPage = ref(1)
- const paginatedPendingItems = computed(() => {
- const start = (currentPage.value - 1) * pageSize.value
- const end = start + pageSize.value
- return pendingItems.value.slice(start, end)
- })
- const rules = reactive({
- T_sn: [{required: true, message: '请输入SN', trigger: 'blur'}],
- Validationnumber: [{required: true, message: '请输入设备编号', trigger: 'blur'}],
- T_class: [{required: true, message: '请选择设备类型', trigger: 'blur'}]
- })
- const extractSN = (fullSN: string): string => {
- if (fullSN.length === 24 && fullSN.startsWith('03') && fullSN.endsWith('000001')) {
- return fullSN.substring(2, 18)
- }
- return fullSN
- }
- /**
- * 处理SN输入,自动提取中间数据并更新输入框显示
- * @param formType 表单类型:'inStorageForm' | 'lendForm' | 'editForm'
- */
- const handleSNInput = (formType: string) => {
- let form: any
- switch (formType) {
- case 'inStorageForm':
- form = inStorageForm
- break
- case 'lendForm':
- form = lendForm
- break
- case 'editForm':
- form = editForm
- break
- default:
- return
- }
-
- if (form.T_sn) {
- const extractedSN = extractSN(form.T_sn)
- // 如果提取的SN与原始SN不同,说明需要自动处理
- if (extractedSN !== form.T_sn) {
- form.T_sn = extractedSN
- }
- }
- }
- // 入库
- const submitInStorageForm = () => {
- inStorageFormRef.value?.validate(async (valid: boolean) => {
- if (valid) {
- console.log(inStorageForm.T_sn)
- const extractedSN = extractSN(inStorageForm.T_sn)
- if (pendingItems.value.some((item: any) => item.T_sn === extractedSN)) {
- inStorageForm.T_sn = ''
- ElMessage.warning('已存在相同的SN,不能添加')
- return
- }
- const result: any = await readValidation({sn: extractedSN})
- if ((result.Code == 200) && (result.Data.T_state == 2)) {
- //1-已出库 2-待使用 3-待维修
- inStorageForm.T_sn = ''
- ElMessage.warning('当前SN已入库不能重复入库')
- return
- }
- pendingItems.value.unshift({...inStorageForm, T_sn: extractedSN})
- inStorageForm.T_sn = ''
- inStorageForm.Validationnumber = ''
- inStorageForm.T_remark = ''
- ElMessage.success('已添加到待提交列表')
- if ('speechSynthesis' in window) {
- const utterance = new SpeechSynthesisUtterance('添加成功')
- window.speechSynthesis.speak(utterance)
- } else {
- console.warn('Web Speech API 不被支持')
- }
- }
- })
- }
- const removePendingItem = (index: number) => {
- pendingItems.value.splice(index, 1)
- ElMessage.success('已从待提交列表中移除')
- }
- // 归还
- const submitInStoragePendingItems = async () => {
- if (pendingItems.value.length === 0) {
- ElMessage.warning('暂无数据可提交')
- return
- }
- const rest = JSON.parse(JSON.stringify(pendingItems.value))
- try {
- const result: any = await validation_add(rest)
- if (result.Code === 200) {
- ElMessage.success('提交成功')
- pendingItems.value = []
- inStorageForm.T_sn = ''
- inStorageForm.Validationnumber = ''
- inStorageForm.T_remark = ''
- searchHandle()
- nextTick(() => {
- showInStorageForm.value = false
- })
- } else {
- ElMessage.error('提交失败')
- }
- } catch (error) {
- ElMessage.error('提交失败,请检查网络连接')
- }
- }
- const handlePageChange = (page: number) => {
- currentPage.value = page
- }
- const showLendForm = ref(false)
- const lendFormRef = ref<FormInstance | null>(null)
- const lendForm = reactive({
- T_sn: '',
- Validationnumber: '',
- T_remark: '',
- LendUser: '',
- T_project: ''
- })
- interface LendItem {
- T_sn: string
- Validationnumber: string
- T_remark: string
- LendUser: string
- T_project: string
- }
- const pendingLendItems = ref<LendItem[]>([])
- const lendPageSize = ref(8)
- const lendCurrentPage = ref(1)
- const paginatedPendingLendItems = computed(() => {
- const start = (lendCurrentPage.value - 1) * lendPageSize.value
- const end = start + lendPageSize.value
- return pendingLendItems.value.slice(start, end)
- })
- const lendRules = reactive({
- T_sn: [{required: true, message: '请输入SN', trigger: 'blur'}],
- LendUser: [{required: true, message: '请输入借出人', trigger: 'blur'}]
- })
- const submitLendForm = () => {
- console.log()
- lendFormRef.value?.validate(async (valid: boolean) => {
- if (valid) {
- const extractedSN = extractSN(lendForm.T_sn)
- console.log(lendForm.T_sn)
- if (pendingLendItems.value.some((item: any) => item.T_sn === extractedSN)) {
- lendForm.T_sn = ''
- ElMessage.warning('已存在相同的SN,不能添加')
- return
- }
- const result: any = await readValidation({sn: extractedSN})
- if (result.Code !== 200) {
- lendForm.T_sn = ''
- ElMessage.warning('当前SN未入库不能借出')
- return
- }
- if (result.Data.T_state == 5) {
- ElMessage.warning('设备已损坏')
- if ('speechSynthesis' in window) {
- const utterance = new SpeechSynthesisUtterance('设备已损坏')
- window.speechSynthesis.speak(utterance)
- } else {
- console.warn('Web Speech API 不被支持')
- }
- return
- }
- if (result.Data.T_state != 2) {
- lendForm.T_sn = ''
- ElMessage.warning('当前SN未入库不能借出')
- return
- }
- pendingLendItems.value.unshift({
- T_sn: extractedSN,
- Validationnumber: lendForm.Validationnumber,
- T_remark: lendForm.T_remark,
- LendUser: lendForm.LendUser,
- T_project: lendForm.T_project
- })
- lendForm.T_sn = ''
- lendForm.T_remark = ''
- ElMessage.success('已添加到待提交列表')
- if ('speechSynthesis' in window) {
- const utterance = new SpeechSynthesisUtterance('添加成功')
- window.speechSynthesis.speak(utterance)
- } else {
- console.warn('Web Speech API 不被支持')
- }
- pendingLendItems.value = pendingLendItems.value.filter((value: any, index: any, self: any) => { //去重
- return self.findIndex((t: any) => (t.T_sn === value.T_sn)) === index;
- });
- } else {
- }
- })
- }
- const removePendingLendItem = (index: number) => {
- pendingLendItems.value.splice(index, 1)
- ElMessage.success('已从待提交列表中移除')
- }
- const submitLendPendingItems = async () => {
- if (pendingLendItems.value.length === 0) {
- ElMessage.warning('暂无数据可提交')
- return
- }
- const rest = JSON.parse(JSON.stringify(pendingLendItems.value))
- const result: any = await validation_update(rest)
- if (result.Code == 200) {
- ElMessage.success('提交成功')
- pendingLendItems.value = []
- lendForm.T_sn = ''
- lendForm.T_remark = ''
- lendForm.LendUser = ''
- lendForm.T_project = ''
- searchHandle()
- nextTick(() => {
- showLendForm.value = false
- })
- } else {
- ElMessage.error('提交失败')
- }
- }
- const handleLendPageChange = (page: number) => {
- lendCurrentPage.value = page
- }
- const showEditForm = ref(false)
- const ImportEdit = ref(false)
- const editFormRef = ref<FormInstance | null>(null)
- const editForm = reactive({
- T_sn: '',
- Validationnumber: '',
- T_remark: '',
- T_state: '',
- T_class: ''
- })
- const previewEdit = async (row: any) => {
- showEditForm.value = true
- const result: any = await readValidation({sn: row.T_sn})
- if (result.Code === 200) {
- Object.assign(editForm, result.Data)
- } else {
- ElMessage.error('获取数据失败')
- }
- }
- const preview = (T_sn: any) => {
- recordInitParam.T_sn = T_sn
- dialogTableVisible.value = true
- recordTableRef.value?.searchTable()
- }
- const callbackSnDrawer = (done: () => void) => done()
- const operationPreview = () => {
- operationVisible.value = true
- operationTableRef.value?.searchTable()
- }
- const tableSnData = ref<any[]>([])
- const previewSn = (devicelist: any[]) => {
- drawerSnRef.value?.openDrawer()
- if (!devicelist) return
- tableSnData.value = devicelist.map((item: string) => {
- return {
- sn: item
- }
- })
- }
- const submitEditForm = () => {
- editFormRef.value?.validate(async (valid: boolean): Promise<void> => {
- if (valid) {
- const result: any = await updateValidation(editForm)
- if (result.Code === 200) {
- ElMessage.success('编辑成功')
- showEditForm.value = false
- searchHandle()
- } else {
- ElMessage.error('编辑失败')
- }
- } else {
- // do nothing
- }
- })
- }
- const handleFileChange = (file: any, fileList: any) => {
- uploadFiles.value = fileList.map((item: any) => item.raw) // 新增:更新上传文件列表
- }
- const submitUpload = async () => {
- if (uploadFiles.value.length === 0) {
- // 修改:使用 uploadFiles.value
- ElMessage.warning('请先选择文件')
- return
- }
- const formData = new FormData()
- uploadFiles.value.forEach((file: File) => {
- // 修改:遍历 uploadFiles.value
- formData.append('excelFile', file)
- })
- const loading = ElLoading.service({
- // 新增:显示加载动画
- lock: true,
- text: '正在上传文件...',
- background: 'rgba(0, 0, 0, 0.7)'
- })
- try {
- const result: any = await uploadFile(formData)
- if (result.Code === 200) {
- ElMessage.success('文件上传成功')
- // 处理上传成功后的逻辑
- searchHandle()
- uploadFiles.value = [] // 新增:清除文件上传列表
- } else {
- ElMessage.error('文件上传失败')
- }
- } catch (error) {
- ElMessage.error('文件上传失败,请检查网络连接')
- } finally {
- loading.close() // 新增:关闭加载动画
- }
- }
- const btnRef = ref()
- const openDrawer = (tit: string, row: any, snItems: any) => {
- btnRef.value.outerVisible = true
- btnRef.value.data.title = tit
- btnRef.value.data.snItems = snItems
- btnRef.value.data.fromData = row
- }
- interface AddSnItem {
- T_sn: string
- Validationnumber: string
- T_remark: string
- }
- const holdRepairForm = reactive({
- T_sn: '',
- T_remark: '',
- })
- const holdScrapForm = reactive({
- T_sn: '',
- T_remark: '',
- })
- const holdReturnForm = reactive({
- T_sn: '',
- T_remark: '',
- })
- const ReturnSnItems = ref<AddSnItem[]>([])
- const RepairSnItems = ref<AddSnItem[]>([])
- const ScrapSnItems = ref<AddSnItem[]>([])
- const successFun = () => {
- TableRef.value?.searchTable()
- btnRef.value.data.fromData.T_remark = ''
- if (btnRef.value.data.title == '归还') {
- ReturnSnItems.value = [];
- }
- if (btnRef.value.data.title == '维修') {
- RepairSnItems.value = [];
- }
- if (btnRef.value.data.title == '报废') {
- ScrapSnItems.value = [];
- }
- }
- // 远程搜索用户的方法
- const remoteMethod = async (query: string) => {
- if (query.trim()) {
- userLoading.value = true;
- try {
- const res: any = await User_List({
- User_tokey: globalStore.GET_User_tokey,
- T_name: query,
- page_z: 100
- });
- if (res.Code === 200) {
- // 确保数据格式正确
- const formattedOptions = res.Data.Data?.map((user: any) => ({
- T_uuid: user.T_uuid,
- T_name: user.T_name
- })) || [];
- userOptions.value = formattedOptions;
- // 添加调试信息
- console.log('搜索结果:', formattedOptions);
- }
- } catch (error) {
- ElMessage.error('搜索用户失败');
- console.error('搜索用户错误:', error);
- } finally {
- userLoading.value = false;
- }
- } else {
- userOptions.value = [];
- }
- };
- // 选择用户后的处理函数
- const handleUserChange = (value: string) => {
- if (value) {
- const selectedUser = userOptions.value.find(user => user.T_uuid === value);
- if (selectedUser) {
- lendForm.LendUser = selectedUser.T_name;
- }
- } else {
- lendForm.LendUser = '';
- }
- };
- // 用户搜索相关
- const userOptions = ref<any[]>([]);
- const userLoading = ref(false);
- onMounted(() => {
- getValidationToolClassList()
- })
- </script>
- <template>
- <div class="list">
- <TableBase
- ref="TableRef"
- :columns="columns"
- :requestApi="validation_List"
- :initParam="initParam"
- :pagination="true"
- >
- <template #table-header>
- <div class="input-suffix">
- <el-row :gutter="20" style="margin-bottom: 0">
- <el-col :xl="3" :lg="3" :md="3">
- <span class="inline-flex items-center">设备编号:</span>
- <el-input
- v-model="initParam.Validationnumber"
- class="w-50 m-2"
- type="text"
- placeholder="设备编号搜索"
- clearable
- @change="searchHandle"
- />
- </el-col>
- <el-col :xl="3" :lg="3" :md="3">
- <span class="inline-flex items-center">状态:</span>
- <el-select v-model="initParam.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
- <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id"/>
- </el-select>
- </el-col>
- <el-col :xl="3" :lg="3" :md="3">
- <span class="inline-flex items-center">SN:</span>
- <el-input
- class="w-50 m-2"
- v-model="initParam.T_sn"
- type="text"
- placeholder="按SN搜索"
- clearable
- @change="searchHandle"
- />
- </el-col>
- <el-col :xl="3" :lg="3" :md="3">
- <span class="inline-flex items-center">设备类型:</span>
- <el-select v-model="initParam.T_class" class="w-50 m-2" clearable
- placeholder="请选择设备类型~">
- <el-option v-for="item in Pruductoptions" :key="item.Id" :label="item.T_name"
- :value="item.Id"/>
- </el-select>
- </el-col>
- <el-col :xl="3" :lg="3" :md="3">
- <span class="inline-flex items-center">模组imei:</span>
- <el-input
- class="w-50 m-2"
- v-model="initParam.T_imei"
- type="text"
- placeholder="按模组imei搜索"
- clearable
- @change="searchHandle"
- />
- </el-col>
- <el-col :xl="3" :lg="3" :md="3">
- <span class="inline-flex items-center">借出人</span>
- <el-input
- class="w-50 m-2"
- v-model="initParam.LendUser"
- type="text"
- placeholder="按借出人搜索"
- clearable
- @change="searchHandle"
- />
- </el-col>
- <el-col :xl="3" :lg="3" :md="3">
- <span class="inline-flex items-center">借出项目</span>
- <el-input
- class="w-50 m-2"
- v-model="initParam.T_project"
- type="text"
- placeholder="按借出项目搜索"
- clearable
- @change="searchHandle"
- />
- </el-col>
- <el-col :xl="3" :lg="3" :md="3">
- <span class="inline-flex items-center">物联网卡号:</span>
- <el-input
- class="w-50 m-2"
- v-model="initParam.T_iccid"
- type="text"
- placeholder="按物联网卡号搜索"
- clearable
- @change="searchHandle"
- />
- </el-col>
- <el-col :xl="15" :lg="15" :md="15" style="margin-top: 10px">
- <el-button type="primary" @click="searchHandle">搜索</el-button>
- <el-button type="primary" @click="showInStorageForm = true">入库
- </el-button>
- <el-button type="primary" @click="showLendForm = true">借出
- </el-button>
- <el-button type="primary" @click="openDrawer('归还',holdReturnForm,ReturnSnItems)">归还
- </el-button>
- <el-button type="warning" @click="openDrawer('维修',holdRepairForm,RepairSnItems)">维修
- </el-button>
- <el-button type="danger" @click="openDrawer('报废',holdScrapForm,ScrapSnItems)">报废
- </el-button>
- <el-button type="success" @click="ImportEdit = true">模板导入</el-button>
- <el-button type="success" @click="exportExcel">导出</el-button>
- <el-button type="primary" @click="operationPreview">操作记录</el-button>
- </el-col>
- </el-row>
- </div>
- </template>
- <template #T_state="{ row }">
- <el-tag v-if="row.T_state == 1" type="success" effect="dark"> 已出库</el-tag>
- <el-tag v-if="row.T_state == 2" effect="dark">未出库</el-tag>
- <el-tag v-if="row.T_state == 3" effect="dark" type="warning">维修中</el-tag>
- <el-tag v-if="row.T_state == 4" effect="dark" type="danger">已报废</el-tag>
- <el-tag v-if="row.T_state == 5" effect="dark" type="info">已损坏</el-tag>
- <el-tag v-if="row.T_state == 6" effect="light" type="warning">转移中</el-tag>
- </template>
- <template #T_class="{ row }">
- <el-tag>{{ Pruductoptions.find((option: any) => option.Id === row.T_class)?.T_name || '' }}</el-tag>
- </template>
- <template #right="{ row }">
- <el-button link type="primary" size="small" :icon="View" @click="preview(row.T_sn)">记录</el-button>
- <el-button link type="success" size="small" :icon="Edit" @click="previewEdit(row)">编辑</el-button>
- <el-button link type="danger" size="small" :icon="Delete" @click="deleteFun(row.T_sn)">删除</el-button>
- </template>
- </TableBase>
- <el-dialog title="入库" v-model="showInStorageForm" width="50%">
- <el-form :model="inStorageForm" :rules="rules" ref="inStorageFormRef">
- <el-form-item label="SN" prop="T_sn">
- <el-input v-model="inStorageForm.T_sn" placeholder="请输入SN" @keyup.enter="submitInStorageForm" @input="handleSNInput('inStorageForm')"></el-input>
- </el-form-item>
- <el-form-item label="设备编号" prop="Validationnumber">
- <el-input v-model="inStorageForm.Validationnumber" placeholder="请输入设备编号"></el-input>
- </el-form-item>
- <el-form-item label="设备类型" prop="T_class">
- <el-select v-model="inStorageForm.T_class" class="w-50 m-2" clearable placeholder="请选择设备类型~">
- <el-option v-for="item in Pruductoptions" :key="item.Id" :label="item.T_name" :value="item.Id"/>
- </el-select>
- </el-form-item>
- <el-form-item label="备注">
- <el-input v-model="inStorageForm.T_remark" type="textarea" placeholder="请输入备注"></el-input>
- </el-form-item>
- </el-form>
- <!-- 新增数据条数提示 -->
- <div style="margin: 10px 0">
- <span>当前待提交数据条数: {{ pendingItems.length }}</span>
- </div>
- <el-table :data="paginatedPendingItems" style="width: 100%; margin-top: 20px">
- <el-table-column type="index" label="序号" width="80"></el-table-column>
- <!-- 添加序号列 -->
- <el-table-column prop="T_sn" label="SN" width="300"></el-table-column>
- <el-table-column prop="Validationnumber" label="设备编号"></el-table-column>
- <el-table-column prop="T_class" label="设备类型"></el-table-column>
- <el-table-column prop="T_remark" label="备注"></el-table-column>
- <el-table-column label="操作" width="180">
- <template #default="scope">
- <el-button type="danger" size="small" @click="removePendingItem(scope.$index)">删除</el-button>
- </template>
- </el-table-column>
- </el-table>
- <el-pagination
- background
- layout="prev, pager, next"
- :total="pendingItems.length"
- :page-size="pageSize"
- :current-page="currentPage"
- @current-change="handlePageChange"
- style="margin-top: 20px; text-align: right"
- />
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="showInStorageForm = false">取消</el-button>
- <el-button type="primary" @click="submitInStorageForm">添加到暂存</el-button>
- <!-- 新增提交按钮 -->
- <el-button type="primary" @click="submitInStoragePendingItems">提交</el-button>
- </span>
- </template>
- </el-dialog>
- <el-dialog title="借出" v-model="showLendForm" width="50%">
- <el-form :model="lendForm" :rules="lendRules" ref="lendFormRef">
- <!-- 新增借出人和借出项目 -->
- <el-form-item class="m-b-6" :label-width="formLabelWidth" label="借出人" prop="LendUser">
- <el-select
- v-model="lendForm.LendUser"
- filterable
- remote
- reserve-keyword
- placeholder="请输入接收人"
- :remote-method="remoteMethod"
- :loading="userLoading"
- class="w-50"
- @change="handleUserChange"
- :clearable="true"
- >
- <el-option
- v-for="item in userOptions"
- :key="item.T_uuid"
- :label="item.T_name"
- :value="item.T_uuid"
- />
- </el-select>
- </el-form-item>
- <el-form-item class="m-b-6" :label-width="formLabelWidth" label="借出项目" prop="T_project">
- <el-input v-model="lendForm.T_project" placeholder="请输入借出项目"></el-input>
- </el-form-item>
- <el-form-item class="m-b-6" :label-width="formLabelWidth" label="SN" prop="T_sn">
- <el-input v-model="lendForm.T_sn" placeholder="请输入SN" @keyup.enter="submitLendForm" @input="handleSNInput('lendForm')"></el-input>
- </el-form-item>
- <el-form-item class="m-b-6" :label-width="formLabelWidth" label="备注">
- <el-input v-model="lendForm.T_remark" type="textarea" placeholder="请输入备注"></el-input>
- </el-form-item>
- </el-form>
- <!-- 新增数据条数提示 -->
- <div style="margin: 10px 0">
- <span>当前待提交数据条数: {{ pendingLendItems.length }}</span>
- </div>
- <el-table :data="paginatedPendingLendItems" style="width: 100%; margin-top: 20px">
- <el-table-column type="index" label="序号" width="80"></el-table-column>
- <!-- 添加序号列 -->
- <el-table-column prop="T_sn" label="SN" width="300"></el-table-column>
- <el-table-column prop="LendUser" label="借出人"></el-table-column>
- <el-table-column prop="T_project" label="借出项目"></el-table-column>
- <el-table-column prop="T_remark" label="备注"></el-table-column>
- <el-table-column label="操作" width="180">
- <template #default="scope">
- <el-button type="danger" size="small" @click="removePendingLendItem(scope.$index)">删除
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- <el-pagination
- background
- layout="prev, pager, next"
- :total="pendingLendItems.length"
- :page-size="lendPageSize"
- :current-page="lendCurrentPage"
- @current-change="handleLendPageChange"
- style="margin-top: 20px; text-align: right"
- />
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="showLendForm = false">取消</el-button>
- <el-button type="primary" @click="submitLendForm">添加到暂存</el-button>
- <!-- 新增提交按钮 -->
- <el-button type="primary" @click="submitLendPendingItems">提交</el-button>
- </span>
- </template>
- </el-dialog>
- <el-dialog title="编辑" v-model="showEditForm" width="50%">
- <el-form :model="editForm" ref="editFormRef">
- <el-form-item label="SN" prop="T_sn">
- <el-input v-model="editForm.T_sn" placeholder="请输入SN" @input="handleSNInput('editForm')"></el-input>
- </el-form-item>
- <el-form-item label="设备编号" prop="Validationnumber">
- <el-input v-model="editForm.Validationnumber" placeholder="请输入设备编号"></el-input>
- </el-form-item>
- <el-form-item label="状态">
- <el-select v-model="editForm.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
- <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id"/>
- </el-select>
- </el-form-item>
- <el-form-item label="设备类型">
- <el-select v-model="editForm.T_class" class="w-50 m-2" clearable placeholder="请选择设备类型~">
- <el-option v-for="item in Pruductoptions" :key="item.Id" :label="item.T_name" :value="item.Id"/>
- </el-select>
- </el-form-item>
- <el-form-item label="备注">
- <el-input v-model="editForm.T_remark" type="textarea" placeholder="请输入备注"></el-input>
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="showEditForm = false">取消</el-button>
- <el-button type="primary" @click="submitEditForm">提交</el-button>
- </span>
- </template>
- </el-dialog>
- <el-dialog title="模板导入" v-model="ImportEdit" width="50%">
- <el-upload ref="uploadRef" class="upload-demo" :auto-upload="false" @change="handleFileChange">
- <template #trigger>
- <el-button type="primary">模板导入</el-button>
- </template>
- <el-button class="ml-3" type="success" @click="submitUpload"> 提交文件</el-button>
- <template #tip></template>
- </el-upload>
- </el-dialog>
- <el-dialog title="查看记录" v-model="dialogTableVisible" width="60%">
- <TableBase
- ref="recordTableRef"
- :columns="recordColumns"
- :requestApi="validation_recordList"
- :initParam="recordInitParam"
- :pagination="true"
- >
- <template #table-header>
- <div class="input-suffix">
- <el-row :gutter="20" style="margin-bottom: 0">
- <el-col :xl="4" :lg="4" :md="4">
- <span class="inline-flex items-center">设备编号:</span>
- <el-input
- v-model="recordInitParam.Validationnumber"
- class="w-50 m-2"
- type="text"
- placeholder="设备编号搜索"
- clearable
- @change="recordSearchHandle"
- />
- </el-col>
- <el-col :xl="4" :lg="4" :md="4">
- <span class="inline-flex items-center">状态:</span>
- <el-select v-model="recordInitParam.T_state" class="w-50 m-2" clearable
- placeholder="请选择状态~">
- <el-option v-for="item in options" :key="item.id" :label="item.name"
- :value="item.id"/>
- </el-select>
- </el-col>
- <el-col :xl="4" :lg="4" :md="4">
- <span class="inline-flex items-center">借出(归还)人</span>
- <el-input
- class="w-50 m-2"
- v-model="recordInitParam.LendUser"
- type="text"
- placeholder="按借出(归还)人搜索"
- clearable
- @change="recordSearchHandle"
- />
- </el-col>
- <el-col :xl="4" :lg="4" :md="4">
- <span class="inline-flex items-center">关联项目</span>
- <el-input
- class="w-50 m-2"
- v-model="recordInitParam.T_project"
- type="text"
- placeholder="按关联项目搜索"
- clearable
- @change="recordSearchHandle"
- />
- </el-col>
- <el-col :xl="4" :lg="4" :md="4">
- <span class="inline-flex items-center">物联网卡号:</span>
- <el-input
- class="w-50 m-2"
- v-model="recordInitParam.T_iccid"
- type="text"
- placeholder="按物联网卡号搜索"
- clearable
- @change="recordSearchHandle"
- />
- </el-col>
- <el-col :xl="4" :lg="4" :md="4" style="margin-top: 10px">
- <el-button type="primary" @click="recordSearchHandle">搜索</el-button>
- </el-col>
- </el-row>
- </div>
- </template>
- <template #T_state="{ row }">
- <el-tag v-if="row.T_state == 1" type="success" effect="dark"> 已出库</el-tag>
- <el-tag v-if="row.T_state == 2" effect="dark">未出库</el-tag>
- <el-tag v-if="row.T_state == 3" effect="dark" type="warning">维修中</el-tag>
- <el-tag v-if="row.T_state == 4" effect="dark" type="danger">已报废</el-tag>
- <el-tag v-if="row.T_state == 5" effect="dark" type="info">已损坏</el-tag>
- <el-tag v-if="row.T_state == 6" effect="light" type="warning">转移</el-tag>
- <el-tag v-if="row.T_state == 7" effect="light" type="info">取消转移</el-tag>
- <el-tag v-if="row.T_state == 8" effect="light" type="success">已接收</el-tag>
- </template>
- <template #T_class="{ row }">
- <el-tag>{{ Pruductoptions.find((option: any) => option.Id === row.T_class)?.T_name || '' }}</el-tag>
- </template>
- </TableBase>
- </el-dialog>
- <el-dialog title="操作记录" v-model="operationVisible" width="60%">
- <TableBase
- ref="operationTableRef"
- :columns="operationColumns"
- :requestApi="validation_operationList"
- :initParam="operationInitParam"
- :pagination="true"
- >
- <template #table-header>
- <div class="input-suffix">
- <el-row :gutter="20" style="margin-bottom: 0">
- <el-col :xl="5" :lg="5" :md="5">
- <span class="inline-flex items-center">SN:</span>
- <el-input
- class="w-50 m-2"
- v-model="operationInitParam.T_sn"
- type="text"
- placeholder="按SN搜索"
- clearable
- @change="searchHandle"
- />
- </el-col>
- <el-col :xl="5" :lg="5" :md="5">
- <span class="inline-flex items-center">状态:</span>
- <el-select v-model="operationInitParam.T_state" class="w-50 m-2" clearable
- placeholder="请选择状态~">
- <el-option v-for="item in options" :key="item.id" :label="item.name"
- :value="item.id"/>
- </el-select>
- </el-col>
- <el-col :xl="5" :lg="5" :md="5">
- <span class="inline-flex items-center">借出(归还)人</span>
- <el-input
- class="w-50 m-2"
- v-model="operationInitParam.LendUser"
- type="text"
- placeholder="按借出(归还)人搜索"
- clearable
- @change="operationSearchHandle"
- />
- </el-col>
- <el-col :xl="5" :lg="5" :md="5">
- <span class="inline-flex items-center">关联项目</span>
- <el-input
- class="w-50 m-2"
- v-model="operationInitParam.T_project"
- type="text"
- placeholder="按关联项目搜索"
- clearable
- @change="operationSearchHandle"
- />
- </el-col>
- <el-col :xl="4" :lg="4" :md="4" style="margin-top: 10px">
- <el-button type="primary" @click="operationSearchHandle">搜索</el-button>
- <el-button type="success" @click="exportOperationExcel">导出</el-button>
- </el-col>
- </el-row>
- </div>
- </template>
- <template #T_state="{ row }">
- <el-tag v-if="row.T_state == 1" type="success" effect="dark">出库</el-tag>
- <el-tag v-if="row.T_state == 2" effect="dark">入库</el-tag>
- <el-tag v-if="row.T_state == 3" effect="dark" type="warning">维修</el-tag>
- <el-tag v-if="row.T_state == 4" effect="dark" type="danger">报废</el-tag>
- <el-tag v-if="row.T_state == 5" effect="dark" type="info">损坏</el-tag>
- <el-tag v-if="row.T_state == 6" effect="light" type="warning">转移</el-tag>
- <el-tag v-if="row.T_state == 7" effect="light" type="info">取消转移</el-tag>
- <el-tag v-if="row.T_state == 8" effect="light" type="success">已接收</el-tag>
- </template>
- <template #T_project="{ row }">
- <div v-for="(item, index) in row.T_project" :key="index"> {{ item }}</div>
- </template>
- <template #right="{ row }">
- <el-button type="primary" @click="previewSn(row.T_sn_List)">查看</el-button>
- </template>
- </TableBase>
- </el-dialog>
- <Drawer ref="drawerSnRef" :handleClose="callbackSnDrawer" size="40%">
- <el-table
- :data="tableSnData"
- style="width: 100%; height: 99%"
- :header-cell-style="{
- background: '#dedfe0',
- height: '50px'
- }"
- >
- <template v-for="item in snColumns" :key="item.prop">
- <el-table-column show-overflow-tooltip v-if="item.type === 'index'" v-bind="item"/>
- <el-table-column
- show-overflow-tooltip
- v-else-if="item.prop === 'T_project'"
- :label="item.label"
- :width="item.width"
- align="center"
- >
- <template #default="scope">
- {{ scope.row.sn.T_project }}
- </template>
- </el-table-column>
- <el-table-column
- show-overflow-tooltip
- v-else-if="item.prop === 'T_number'"
- :label="item.label"
- :width="item.width"
- align="center"
- >
- <template #default="scope">
- {{ scope.row.sn.T_sn.length }}
- </template>
- </el-table-column>
- <el-table-column
- show-overflow-tooltip
- v-else-if="item.prop === 'T_sn'"
- :label="item.label"
- :width="item.width"
- align="center"
- >
- <template #default="scope">
- <div v-for="(item, index) in scope.row.sn.T_sn" :key="index"> {{ item }}</div>
- </template>
- </el-table-column>
- </template>
- </el-table>
- </Drawer>
- <snAdd ref="btnRef" @successFun="successFun"></snAdd>
- </div>
- </template>
- <style scoped lang="scss">
- @import '@/styles/var.scss';
- .list {
- @include f-direction;
- }
- // .input-suffix {
- // width: 100%;
- // .w-50 {
- // width: 33.33%;
- // }
- // }
- </style>
|