| | |
| | | |
| | | <uni-forms ref="form" :modelValue="formData" validate-trigger="bind" err-show-type="undertext"> |
| | | <uni-group top="1"> |
| | | |
| | | <uni-forms-item :label-width="100" required name="num" label="设备编号:"> |
| | | <uni-easyinput v-model="formData.equipmentCode" :disabled="true" /> |
| | | </uni-forms-item> |
| | | |
| | | <uni-forms-item :label-width="100" name="remark" label="设备名称:"> |
| | | <uni-easyinput v-model="formData.equipmentName" :disabled="true" /> |
| | | </uni-forms-item> |
| | | <!-- <uni-forms-item :label-width="100" name="outNum" label="关键设备标识:"> |
| | | |
| | | <uni-forms-item :label-width="100" required name="num" label="设备编号:"> |
| | | <uni-easyinput v-model="formData.equipmentCode" :disabled="true" /> |
| | | </uni-forms-item> |
| | | |
| | | <uni-forms-item :label-width="100" name="remark" label="设备名称:"> |
| | | <uni-easyinput v-model="formData.equipmentName" :disabled="true" /> |
| | | </uni-forms-item> |
| | | <!-- <uni-forms-item :label-width="100" name="outNum" label="关键设备标识:"> |
| | | <uni-easyinput v-model="formData.equipmentImportance" :disabled="true" /> |
| | | </uni-forms-item> --> |
| | | <view class="text-gray margin-bottom-lg">—————————— 基本信息 ——————————</view> |
| | | <uni-forms-item :label-width="100" name="taskCode" label="维修状态:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.repairStatus_dictText" /> |
| | | </uni-forms-item> |
| | | <uni-forms-item :label-width="100" name="endLocation" label="保养状态:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.maintenanceStatus_dictText" /> |
| | | |
| | | </uni-forms-item> |
| | | <uni-forms-item :label-width="100" name="endLocation" label="使用车间:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.orgId_dictText" /> |
| | | |
| | | </uni-forms-item> |
| | | |
| | | <uni-forms-item :label-width="100" name="endLocation" label="安装位置:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.installationPosition" /> |
| | | </uni-forms-item> |
| | | <uni-forms-item :label-width="100" name="endLocation" label="技术状态:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.technologyStatus_dictText" /> |
| | | </uni-forms-item> |
| | | <uni-forms-item :label-width="100" name="endLocation" label="设备管理员:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.equipmentManager_dictText" /> |
| | | </uni-forms-item> |
| | | <uni-forms-item :label-width="100" name="endLocation" label="出厂日期:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.leaveFactoryDate" /> |
| | | </uni-forms-item> |
| | | <view class="text-gray margin-bottom-lg">—————————— 基本信息 ——————————</view> |
| | | <uni-forms-item :label-width="100" name="taskCode" label="维修状态:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.repairStatus_dictText" /> |
| | | </uni-forms-item> |
| | | <uni-forms-item :label-width="100" name="endLocation" label="保养状态:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.maintenanceStatus_dictText" /> |
| | | |
| | | </uni-forms-item> |
| | | <uni-forms-item :label-width="100" name="endLocation" label="使用车间:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.orgId_dictText" /> |
| | | |
| | | </uni-forms-item> |
| | | |
| | | <uni-forms-item :label-width="100" name="endLocation" label="安装位置:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.installationPosition" /> |
| | | </uni-forms-item> |
| | | <uni-forms-item :label-width="100" name="endLocation" label="技术状态:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.technologyStatus_dictText" /> |
| | | </uni-forms-item> |
| | | <uni-forms-item :label-width="100" name="endLocation" label="设备管理员:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.equipmentManager_dictText" /> |
| | | </uni-forms-item> |
| | | <uni-forms-item :label-width="100" name="endLocation" label="出厂日期:"> |
| | | <uni-easyinput :disabled="true" v-model="formData.leaveFactoryDate" /> |
| | | </uni-forms-item> |
| | | <uni-forms-item :label-width="100" name="outNum" label="设备文档:"> |
| | | <uni-file-picker v-model="fileLists" :extension="['.pdf']" @fail="uploadFail" |
| | | :list-styles="listStyles" :delIcon="del" :max-count="5" file-mediatype="all" |
| | | @downloadFile="downloadFile" @select="onFileSelect" @delete="onFileDelete"> |
| | | <button size="mini" type="primary">点击上传</button> |
| | | </uni-file-picker> |
| | | </uni-forms-item> |
| | | </uni-group> |
| | | </uni-forms> |
| | | |
| | | |
| | | <view class="file-list margin-sm"> |
| | | <view class="file-item" v-for="(file, index) in this.selectedFiles" :key="index"> |
| | | <view class="file-icon"> |
| | | <!-- 文件图标 --> |
| | | <image src="/static/icon_file.png" style="height: 25px; width: 25px; margin-right: 10px;" |
| | | mode='aspectFit' class="zai-logo "></image> |
| | | |
| | | </view> |
| | | <view class="file-name"> |
| | | <!-- 文件名 --> |
| | | {{file.fileName}} |
| | | </view> |
| | | <view class="file-actions"> |
| | | <!-- 下载按钮 --> |
| | | <image v-show="showBtn" src="/static/icon_down.png" @click="downloadFile(file)" |
| | | style="height: 25px; width: 25px; margin-right: 10px;"></image> |
| | | <!-- <button size="mini" @click="downloadFile(file)"> |
| | | <view class="icon-download">下载</view> |
| | | </button> --> |
| | | <!-- 删除按钮 --> |
| | | <image v-show="showBtn" src="/static/icon_del.png" @click="deleteFile(index)" |
| | | style="height: 25px; width: 25px;"></image> |
| | | </button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view class="flex margin-bottom-xs"> |
| | | <button class="flex-sub cu-btn bg-blue margin-sm lg" hover-class="is-hover" |
| | | @click="goReportRepair()">报修</button> |
| | |
| | | |
| | | <script> |
| | | import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js"; |
| | | import { |
| | | saveAs |
| | | } from 'file-saver'; // 引入 file-saver 库 |
| | | export default { |
| | | mixins: [MescrollMixin], // 使用mixin |
| | | data() { |
| | | return { |
| | | showBtn: true, |
| | | listStyles: { |
| | | "borderStyle": { |
| | | "width": "0", // 边框宽度 |
| | | }, |
| | | "border": false, // 是否显示边框 |
| | | "dividline": false |
| | | }, |
| | | |
| | | del: true, |
| | | scrollLeft: 0, |
| | | searchValue: '', |
| | | formData: {}, |
| | | NavBarColor: this.NavBarColor, |
| | | url: { |
| | | stallList: "/eam/equipment/queryById" |
| | | fileList: 'eam/equipmentAttachment/list', |
| | | stallList: "/eam/equipment/queryById", |
| | | upload: "/eam/sysFiles/batch_upload", |
| | | add: 'eam/equipmentAttachment/add', |
| | | downloadFile: 'eam/equipmentAttachment/downloadFile' |
| | | }, |
| | | uploading: false, // 是否正在上传 |
| | | selectedFiles: [], |
| | | formData: { |
| | | fileLists: [] |
| | | }, |
| | | fileLists: [], |
| | | id: '', |
| | | upOption: { |
| | | page: { |
| | |
| | | }, |
| | | created() { |
| | | this.upCallback() |
| | | this.getFileList() |
| | | }, |
| | | methods: { |
| | | goHome() { |
| | | uni.reLaunch({ |
| | | url: '/pages/index/index' |
| | | downloadFile(item) { |
| | | uni.showModal({ |
| | | title: '提示', |
| | | content: '确认要下载吗', |
| | | cancelText: '取消', |
| | | confirmText: '确认', |
| | | success: res => { |
| | | if (res.confirm) { |
| | | this.downFile(item) |
| | | } |
| | | } |
| | | }) |
| | | |
| | | }, |
| | | |
| | | |
| | | downFile(item) { |
| | | this.$http.download(this.url.downloadFile, { |
| | | params: { |
| | | id: item.id |
| | | }, |
| | | responseType: 'blob' // 确保响应类型为 blob |
| | | }).then(response => { |
| | | console.log('Response:', response); // 查看完整响应结构 |
| | | |
| | | // 获取 tempFilePath(Blob URL) |
| | | const tempFilePath = response.tempFilePath; |
| | | |
| | | if (!tempFilePath) { |
| | | uni.showToast({ |
| | | title: '文件下载失败', |
| | | icon: 'none' |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | let fileName = item.fileName; |
| | | |
| | | // 创建 <a> 标签并触发下载 |
| | | const link = document.createElement('a'); |
| | | link.href = tempFilePath; |
| | | link.setAttribute('download', fileName); |
| | | link.style.display = 'none'; |
| | | |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | |
| | | // 清理资源 |
| | | document.body.removeChild(link); |
| | | |
| | | }).catch(err => { |
| | | console.error('Download error:', err); |
| | | uni.showToast({ |
| | | title: '文件下载失败', |
| | | icon: 'none' |
| | | }); |
| | | }); |
| | | }, |
| | | |
| | | |
| | | |
| | | |
| | | // downFile(item) { |
| | | // this.$http.download(this.url.downloadFile, { |
| | | // params: { |
| | | // id:item.id |
| | | // }, |
| | | // }).then(res => { |
| | | // if (!res) { |
| | | // this.$message.warning('文件下载失败') |
| | | // return |
| | | // } else { |
| | | // let fileName = item.fileName; |
| | | // if (typeof window.navigator.msSaveBlob !== 'undefined') { |
| | | // window.navigator.msSaveBlob(new Blob([res]), fileName); |
| | | // } else { |
| | | // let url = window.URL.createObjectURL(new Blob([res])); |
| | | // let link = document.createElement('a'); |
| | | // link.style.display = 'none'; |
| | | // link.href = url; |
| | | // link.setAttribute('download', fileName); |
| | | // document.body.appendChild(link); |
| | | // link.click() |
| | | // document.body.removeChild(link) //下载完成移除元素 |
| | | // window.URL.revokeObjectURL(url) //释放掉blob对象 |
| | | // } |
| | | // } |
| | | // }).catch((err) => { |
| | | // uni.showToast({ |
| | | // title: '获取文件列表失败', |
| | | // icon: 'none' |
| | | // }); |
| | | // }); |
| | | // }, |
| | | |
| | | |
| | | getFileList() { |
| | | this.$http.get(this.url.fileList, { |
| | | params: { |
| | | equipmentId: this.id, |
| | | pageNo: 1, |
| | | pageSize: 999, |
| | | column: 'createTime', |
| | | order: 'desc' |
| | | }, |
| | | }).then(res => { |
| | | if (res.data.success) { |
| | | this.selectedFiles = res.data.result.records || []; |
| | | |
| | | } |
| | | }).catch(() => { |
| | | uni.showToast({ |
| | | title: '获取文件列表失败', |
| | | icon: 'none' |
| | | }); |
| | | }); |
| | | }, |
| | | uploadFail(e) { |
| | | console.log('上传失败:', e) |
| | | }, |
| | | |
| | | |
| | | |
| | | onFileSelect(e) { |
| | | const tempFilePaths = e.tempFilePaths; |
| | | |
| | | uni.showLoading({ |
| | | title: '上传中...' |
| | | }); |
| | | |
| | | const uploadPromises = tempFilePaths.map((filePath, index) => { |
| | | return new Promise((resolve, reject) => { |
| | | this.$http.upload(this.url.upload, { |
| | | filePath: filePath, |
| | | name: 'file' |
| | | }) |
| | | .then(uploadRes => { |
| | | const serverFile = uploadRes.data.result[0]; |
| | | console.log(serverFile); |
| | | // 提取fileSuffix并拼接 |
| | | if (serverFile.fileSuffix && serverFile.fileName && !serverFile |
| | | .fileName.includes('.')) { |
| | | serverFile.fileName += '.' + serverFile.fileSuffix; |
| | | } |
| | | this.fileLists = []; |
| | | // 防止重复添加(根据 id 或 fileName 判断) |
| | | if (!this.fileLists.some(file => file.id === serverFile.id)) { |
| | | this.fileLists.push(serverFile); |
| | | } |
| | | resolve(); |
| | | }) |
| | | .catch(err => { |
| | | console.error(`文件 ${index + 1} 上传失败`, err); |
| | | uni.showToast({ |
| | | title: `第 ${index + 1} 个文件上传失败`, |
| | | icon: 'none' |
| | | }); |
| | | reject(err); |
| | | }); |
| | | }); |
| | | }); |
| | | |
| | | Promise.all(uploadPromises) |
| | | .then(() => { |
| | | uni.hideLoading(); |
| | | uni.showToast({ |
| | | title: '全部上传成功,正在提交...' |
| | | }); |
| | | this.submitFileList(); // 自动提交所有文件 |
| | | }) |
| | | .catch(() => { |
| | | uni.hideLoading(); |
| | | uni.showToast({ |
| | | title: '部分上传失败', |
| | | icon: 'none' |
| | | }); |
| | | }); |
| | | }, |
| | | // 文件删除回调 |
| | | onFileDelete(e) { |
| | | console.log('删除文件:', e.index); |
| | | }, |
| | | |
| | | // 删除单个文件 |
| | | deleteFile(index) { |
| | | this.fileLists.splice(index, 1); |
| | | }, |
| | | |
| | | |
| | | submitFileList() { |
| | | if (!this.fileLists.length) { |
| | | uni.showToast({ |
| | | title: '没有可提交的文件', |
| | | icon: 'none' |
| | | }); |
| | | return; |
| | | } |
| | | console.log(this.fileLists) |
| | | this.$http.post(this.url.add, { |
| | | equipmentId: this.id, |
| | | fileList: this.fileLists |
| | | }).then(res => { |
| | | if (res.data.success) { |
| | | uni.showToast({ |
| | | title: '提交成功' |
| | | }); |
| | | this.getFileList(); |
| | | } else { |
| | | uni.showToast({ |
| | | title: '提交失败', |
| | | icon: 'none' |
| | | }); |
| | | } |
| | | }).catch(err => { |
| | | uni.showToast({ |
| | | title: '提交异常', |
| | | icon: 'none' |
| | | }); |
| | | console.error('提交失败:', err); |
| | | }); |
| | | }, |
| | | /** |
| | | * 报修 |
| | | */ |
| | | goReportRepair() { |
| | | console.log('getSera 方法被调用'); |
| | | uni.navigateTo({ |
| | | url: `/pages/reportRepair/reportRepair?equipmentId=${encodeURIComponent(this.id)}`, |
| | | uni.redirectTo({ |
| | | url: `/pages/reportRepair/reportRepair?equipmentId=${encodeURIComponent(this.id)}` |
| | | }); |
| | | }, |
| | | /** |
| | | * 点检 |
| | | */ |
| | | goCheck() { |
| | | uni.navigateTo({ |
| | | url: '/pages/checkList/checkList', |
| | | uni.redirectTo({ |
| | | // url: '/pages/checkList/checkList', |
| | | url: `/pages/checkList/checkList?equipmentId=${encodeURIComponent(this.id)}` |
| | | }); |
| | | }, |
| | | /** |
| | | * 周保 |
| | | */ |
| | | goBaoZhou() { |
| | | uni.navigateTo({ |
| | | url: '/pages/baoZhou/baoZhou', |
| | | uni.redirectTo({ |
| | | // url: '/pages/baoZhou/baoZhou', |
| | | url: `/pages/baoZhou/baoZhou?equipmentId=${encodeURIComponent(this.id)}` |
| | | }); |
| | | }, |
| | | /** |
| | | * 维修 |
| | | */ |
| | | goMaintenance() { |
| | | uni.navigateTo({ |
| | | url: '/pages/maintenanceReport/maintenanceReport', |
| | | uni.redirectTo({ |
| | | // url: '/pages/maintenanceReport/maintenanceReport', |
| | | url: `/pages/maintenanceReport/maintenanceReport?equipmentId=${encodeURIComponent(this.id)}` |
| | | }); |
| | | }, |
| | | |
| | | |
| | | upCallback() { |
| | | this.$http.get(this.url.stallList, { |
| | | params: { |
| | |
| | | </script> |
| | | |
| | | <style> |
| | | .file-list { |
| | | margin-top: 20px; |
| | | } |
| | | |
| | | .file-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 10px; |
| | | border-bottom: 1px solid #eee; |
| | | } |
| | | |
| | | .file-item text { |
| | | flex: 1; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .is-hover { |
| | | color: rgba(255, 255, 255, 0.6); |
| | | background-color: #55aaff; |
| | |
| | | margin-top: 85px; |
| | | height: auto; |
| | | } |
| | | |
| | | .file-list { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 10px; |
| | | } |
| | | |
| | | .file-item { |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 10px; |
| | | border: 1px solid #ddd; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .file-icon img { |
| | | width: 32px; |
| | | height: 32px; |
| | | margin-right: 10px; |
| | | } |
| | | |
| | | .file-name { |
| | | flex: 1; |
| | | font-size: 16px; |
| | | } |
| | | |
| | | .file-actions button { |
| | | background: none; |
| | | border: none; |
| | | cursor: pointer; |
| | | margin-left: 10px; |
| | | } |
| | | |
| | | .file-actions .icon-download, |
| | | .file-actions .icon-delete { |
| | | font-size: 18px; |
| | | color: #555; |
| | | } |
| | | |
| | | .file-actions .icon-download:hover, |
| | | .file-actions .icon-delete:hover { |
| | | color: #007bff; |
| | | } |
| | | </style> |