添加装备二维码功能

This commit is contained in:
jiang 2026-01-21 18:59:39 +08:00
parent e6d83a6b37
commit a0d3789d2e
6 changed files with 659 additions and 245 deletions

View File

@ -59,7 +59,8 @@
"jszip": "^3.10.1",
"moment": "^2.30.1",
"nprogress": "0.2.0",
"qrcodejs2": "0.0.2",
"qrcode": "^1.5.1",
"qrcodejs2": "^0.0.2",
"quill": "1.3.7",
"screenfull": "5.0.2",
"sm-crypto": "^0.3.13",
@ -67,7 +68,7 @@
"vue": "2.6.12",
"vue-count-to": "1.0.13",
"vue-cropper": "0.5.5",
"vue-easy-print": "0.0.8",
"vue-easy-print": "^0.0.8",
"vue-meta": "2.4.0",
"vue-router": "3.4.9",
"vuedraggable": "2.24.3",

View File

@ -0,0 +1,216 @@
<template>
<div
class="qrcode-container"
ref="qrcodeWrapper"
@mouseenter="showDownloadIcon = true"
@mouseleave="showDownloadIcon = false"
>
<!-- 二维码画布/图片 -->
<canvas ref="qrcodeCanvas" :width="size" :height="size"></canvas>
<img
v-if="showImgFallback"
ref="qrcodeImg"
class="qrcode-fallback"
:width="size"
:height="size"
alt="二维码"
>
<!-- 操作图标鼠标移入显示 -->
<div
class="qrcode-actions-icon"
v-show="showDownloadIcon"
>
<!-- 图标大小按二维码尺寸比例计算 -->
<i
@click.stop="downloadQrcode()"
:style="{ fontSize: iconSize + 'px', color: '#FFFFFF' }"
class="el-icon-download qrcode-icon"
title="下载二维码"
></i>
<i
@click.stop="printQrcode()"
:style="{ fontSize: iconSize + 'px', color: '#FFFFFF' }"
class="el-icon-zoom-in qrcode-icon"
title="打印二维码"
></i>
</div>
</div>
</template>
<script>
import QRCode from 'qrcode'
export default {
name: 'QrcodeGenerator',
props: {
value: { type: String, required: true, default: '' },
size: { type: Number, default: 200 },
errorCorrectionLevel: { type: String, default: 'M', validator: (val) => ['L', 'M', 'Q', 'H'].includes(val) },
color: { type: Object, default: () => ({ dark: '#000000', light: '#ffffff' }) },
showImgFallback: { type: Boolean, default: false }
},
data() {
return {
showDownloadIcon: false
}
},
//
computed: {
iconSize() {
// = * 0.1212%16px48px
const scale = 0.12
return Math.max(16, Math.min(this.size * scale, 48))
}
},
watch: {
value() { this.generateQrcode() },
size() { this.generateQrcode() },
color() { this.generateQrcode() }
},
mounted() {
this.generateQrcode()
},
methods: {
async generateQrcode() {
if (!this.value || !this.$refs.qrcodeCanvas) return
try {
const canvas = this.$refs.qrcodeCanvas
await QRCode.toCanvas(canvas, this.value, {
width: this.size,
color: this.color,
errorCorrectionLevel: this.errorCorrectionLevel
})
if (this.showImgFallback && this.$refs.qrcodeImg) {
const imgUrl = await QRCode.toDataURL(this.value, {
width: this.size,
color: this.color,
errorCorrectionLevel: this.errorCorrectionLevel
})
this.$refs.qrcodeImg.src = imgUrl
}
} catch (error) {
console.error('二维码生成失败:', error)
}
},
async downloadQrcode(fileName = `二维码${Date.now()}.png`) {
if (!this.$refs.qrcodeCanvas) return
try {
const canvas = this.$refs.qrcodeCanvas
canvas.toBlob(blob => {
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = fileName
a.click()
URL.revokeObjectURL(url)
}, 'image/png')
} catch (error) {
console.error('二维码下载失败:', error)
if (this.$message) {
this.$message.error('二维码下载失败')
}
}
},
async printQrcode() {
if (!this.$refs.qrcodeCanvas) return
try {
const canvas = this.$refs.qrcodeCanvas
const qrCodeDataUrl = canvas.toDataURL('image/png')
const printWindow = window.open('', '_blank')
if (!printWindow) {
alert('浏览器弹窗被拦截,请允许弹窗后重试')
return
}
printWindow.document.write(`
<!DOCTYPE html>
<html>
<head>
<title>打印二维码</title>
<style>
body { margin: 0; padding: 40px; text-align: center; }
.print-qrcode { display: inline-block; }
.print-qrcode img { width: 250px; height: 250px; }
</style>
</head>
<body>
<div class="print-qrcode">
<img src="${qrCodeDataUrl}" alt="二维码" />
</div>
</body>
</html>
`)
} catch (error) {
console.error('二维码打印失败:', error)
if (this.$message) {
this.$message.error('二维码打印失败')
}
}
},
refreshQrcode() {
this.generateQrcode()
}
}
}
</script>
<style scoped>
.qrcode-container {
display: inline-block;
position: relative;
cursor: pointer;
}
.qrcode-fallback {
display: none;
}
.no-canvas .qrcode-fallback {
display: block;
}
.no-canvas canvas {
display: none;
}
/* 操作图标容器样式 */
.qrcode-actions-icon {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
transition: background-color 0.2s ease;
pointer-events: auto;
}
/* 修复hover样式原类名写错 */
.qrcode-actions-icon:hover {
background-color: rgba(0, 0, 0, 0.8); /* hover 加深背景 */
}
/* 图标通用样式:增加交互反馈 */
.qrcode-icon {
transition: transform 0.2s ease;
pointer-events: auto; /* 确保图标可点击 */
}
.qrcode-icon:hover {
transform: scale(1.1); /* hover 轻微放大 */
}
/* 修复样式穿透选择器(原类名错误) */
.qrcode-actions-icon >>> .el-icon {
pointer-events: none;
}
</style>

View File

@ -47,7 +47,7 @@ import VueMeta from 'vue-meta'
// 字典数据组件
import DictData from '@/components/DictData'
import TitleTip from '@/components/TitleTip'
import QrcodeGenerator from '@/components/QrcodeGenerator'
import global_ from '@/utils/globalUrl'
// 全局方法挂载
Vue.prototype.getDicts = getDicts
@ -71,6 +71,7 @@ Vue.component('FileUpload', FileUpload)
Vue.component('ImageUpload', ImageUpload)
Vue.component('ImagePreview', ImagePreview)
Vue.component('TitleTip', TitleTip)
Vue.component('QrcodeGenerator', QrcodeGenerator)
import { get } from '@/utils/config' // 引入get方法
Vue.use(directive)
Vue.use(plugins)

View File

@ -7,7 +7,7 @@
class="el-icon-arrow-left goBack-btn"
@click="goBack"
style="border-color: transparent; color: #2CBAB2; background: transparent; padding-left: 0; padding-right: 0"
>返回</i
>返回</i
>
</div>
</div>
@ -42,29 +42,29 @@
</el-col>
<el-col :span="6">
<el-form-item label="装备名称" prop="name">
<el-input v-model="form.name" placeholder="装备名称" readonly />
<el-input v-model="form.name" placeholder="装备名称" readonly/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="规格型号" prop="specificationModel">
<el-input v-model="form.specificationModel" placeholder="规格型号" readonly />
<el-input v-model="form.specificationModel" placeholder="规格型号" readonly/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="资产原值(万元)" prop="originalValue">
<el-input v-model="form.originalValue" placeholder="资产原值(万元)" readonly />
<el-input v-model="form.originalValue" placeholder="资产原值(万元)" readonly/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="资产净值(万元)" prop="value">
<el-input v-model="form.value" placeholder="资产净值(万元)" readonly />
<el-input v-model="form.value" placeholder="资产净值(万元)" readonly/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="生产厂家" prop="manufacturer">
<el-input v-model="form.manufacturer" placeholder="生产厂家" readonly />
<el-input v-model="form.manufacturer" placeholder="生产厂家" readonly/>
</el-form-item>
</el-col>
@ -72,22 +72,22 @@
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="出厂日期" prop="productionDate">
<el-input v-model="form.productionDate" placeholder="出厂日期" readonly />
<el-input v-model="form.productionDate" placeholder="出厂日期" readonly/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="下次维保日期" prop="nextMaintenanceDate">
<el-input v-model="form.nextMaintenanceDate" placeholder="下次维保日期" readonly />
<el-input v-model="form.nextMaintenanceDate" placeholder="下次维保日期" readonly/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="装备原始编码" prop="originalCode">
<el-input clearable maxlength="20" placeholder="装备原始编码" v-model="form.originalCode" readonly />
<el-input clearable maxlength="20" placeholder="装备原始编码" v-model="form.originalCode" readonly/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="最大使用年限" prop="maxServiceLifeYears">
<el-input clearable maxlength="20" placeholder="最大使用年限" v-model="form.maxServiceLifeYears" readonly />
<el-input clearable maxlength="20" placeholder="最大使用年限" v-model="form.maxServiceLifeYears" readonly/>
</el-form-item>
</el-col>
@ -105,17 +105,17 @@
</el-col> -->
<el-col :span="6">
<el-form-item label="计数单位" prop="unit">
<el-input v-model="form.unit" placeholder="计数单位" readonly />
<el-input v-model="form.unit" placeholder="计数单位" readonly/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="采购日期" prop="purchaseDate">
<el-input v-model="form.purchaseDate" placeholder="采购日期" readonly />
<el-input v-model="form.purchaseDate" placeholder="采购日期" readonly/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="产权单位" prop="propertyUnit">
<el-input v-model="form.propertyUnit" placeholder="产权单位" readonly />
<el-input v-model="form.propertyUnit" placeholder="产权单位" readonly/>
</el-form-item>
</el-col>
</el-row>
@ -127,7 +127,7 @@
<el-row :gutter="24" style="padding-top: 10px">
<el-col :span="6" v-for="(item, index) in form.propertyVoList" :key="index">
<el-form-item :label="item.propertyName" prop="specialtyFeature">
<el-input v-model="item.propertyValue" readonly />
<el-input v-model="item.propertyValue" readonly/>
</el-form-item>
</el-col>
</el-row>
@ -302,6 +302,17 @@
style="width: 120px; height: 120px; margin-right: 10px"
/>
</el-form-item>
<el-form-item label="装备二维码" prop="">
<div class="qrcode-box" style="width: 150px;height: 150px">
<QrcodeGenerator
ref="qr3"
:value="dialogRow"
errorCorrectionLevel="H"
:size="150"
/>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
@ -316,13 +327,14 @@ export default {
data() {
return {
isLoading: false,
dialogRow: '',
form: {
deviceTypeList: [], //
appearanceImages: [], //
certificates: [], //
inspectionReports: [], //
purchaseInvoices: [], //
},
purchaseInvoices: [] //
}
}
},
created() {
@ -333,6 +345,31 @@ export default {
try {
this.isLoading = true
const res = await getDeviceApi(this.$route.query.id)
if (res.data) {
let row = res.data
const propertyList = row.propertyVoList || []
const property = propertyList
// item propertyValue
.filter(item => item && item.propertyValue)
// ":"
.map(item => `${item.propertyName}:${item.propertyValue}`)
// /线
.join(',')
//3.6.7.8.
// \n
this.dialogRow =
`装备名称:${row.name}\r\n` +
`装备编码:${row.code}\r\n` +
`规格型号:${row.specificationModel}\r\n` +
`产权单位:${row.propertyUnit}\r\n` +
`装备小类:${row.subCategory}\r\n` +
`生产厂家:${row.manufacturer}\r\n` +
`出厂日期:${row.productionDate}\r\n` +
`特征属性:{${property}}`
this.$nextTick(() => {
this.$refs.qr3?.refreshQrcode()
})
}
this.form = res.data
this.form.process = this.form.mainProcess + '>' + this.form.subProcess
this.form.category =
@ -350,8 +387,8 @@ export default {
},
handleFile(item) {
window.open(item.fileUrl, '_blank')
},
},
}
}
}
</script>

View File

@ -79,7 +79,7 @@
<div class="stat-content">
<div class="stat-row">
<div class="stat-value">{{ inStock }}</div>
<img src="@/assets/images/ledger/icon-instock.png" alt="在库数量" class="stat-icon" />
<img src="@/assets/images/ledger/icon-instock.png" alt="在库数量" class="stat-icon"/>
</div>
<div class="stat-label">在库数量</div>
</div>
@ -88,7 +88,7 @@
<div class="stat-content">
<div class="stat-row">
<div class="stat-value">{{ ownUse }}</div>
<img src="@/assets/images/ledger/icon-ownuse.png" alt="自用数量" class="stat-icon" />
<img src="@/assets/images/ledger/icon-ownuse.png" alt="自用数量" class="stat-icon"/>
</div>
<div class="stat-label">自用数量</div>
</div>
@ -97,7 +97,7 @@
<div class="stat-content">
<div class="stat-row">
<div class="stat-value">{{ share }}</div>
<img src="@/assets/images/ledger/icon-share.png" alt="共享数量" class="stat-icon" />
<img src="@/assets/images/ledger/icon-share.png" alt="共享数量" class="stat-icon"/>
</div>
<div class="stat-label">共享数量</div>
</div>
@ -106,7 +106,7 @@
<div class="stat-content">
<div class="stat-row">
<div class="stat-value">{{ underRepair }}</div>
<img src="@/assets/images/ledger/icon-maintenance.png" alt="维修数量" class="stat-icon" />
<img src="@/assets/images/ledger/icon-maintenance.png" alt="维修数量" class="stat-icon"/>
</div>
<div class="stat-label">维修数量</div>
</div>
@ -115,7 +115,7 @@
<div class="stat-content">
<div class="stat-row">
<div class="stat-value">{{ totalValue }}</div>
<img src="@/assets/images/ledger/icon-instock-value.png" alt="在库资产总价值" class="stat-icon" />
<img src="@/assets/images/ledger/icon-instock-value.png" alt="在库资产总价值" class="stat-icon"/>
</div>
<div class="stat-label">在库资产总价值</div>
</div>
@ -124,7 +124,7 @@
<div class="stat-content">
<div class="stat-row">
<div class="stat-value">{{ retirementValue }}</div>
<img src="@/assets/images/ledger/icon-retired-value.png" alt="退役资产总价值" class="stat-icon" />
<img src="@/assets/images/ledger/icon-retired-value.png" alt="退役资产总价值" class="stat-icon"/>
</div>
<div class="stat-label">退役资产总价值</div>
</div>
@ -132,7 +132,7 @@
</div>
</div>
</div>
<div class="status-operation-bar" style="margin-top: 15px;margin-bottom: 2px;">
@ -167,7 +167,7 @@
placeholder="请选择产权单位"
:options="propertyUnitList"
:props="{ label: 'label', value: 'id', children: 'children', checkStrictly: true }"
style="width: 100%"
style="width: 100%"
@change="handleUnitChange"
/>
<!-- <el-select
@ -183,12 +183,12 @@
</el-col>
<el-col :span="8">
<el-form-item label="装备名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入装备名称" clearable />
<el-input v-model="queryParams.name" placeholder="请输入装备名称" clearable/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="规格型号" prop="specificationModel">
<el-input v-model="queryParams.specificationModel" placeholder="请输入规格型号" clearable />
<el-input v-model="queryParams.specificationModel" placeholder="请输入规格型号" clearable/>
</el-form-item>
</el-col>
</el-row>
@ -204,7 +204,7 @@
@change="majorChange"
style="width: 100%"
>
<el-option v-for="item in majorList" :key="item.value" :label="item.label" :value="item.value" />
<el-option v-for="item in majorList" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</el-form-item>
</el-col>
@ -232,7 +232,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="装备编码" prop="code">
<el-input v-model="queryParams.code" placeholder="请输入装备编码" clearable />
<el-input v-model="queryParams.code" placeholder="请输入装备编码" clearable/>
</el-form-item>
</el-col>
<el-col :span="8">
@ -288,12 +288,12 @@
</el-col>
<el-col :span="8">
<el-form-item label="原始编码" prop="originalCode">
<el-input v-model="queryParams.originalCode" placeholder="请输入装备原始编码" clearable />
<el-input v-model="queryParams.originalCode" placeholder="请输入装备原始编码" clearable/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="使用年限" prop="serviceLife">
<el-input v-model="queryParams.serviceLife" placeholder="请输入使用年限" clearable />
<el-input v-model="queryParams.serviceLife" placeholder="请输入使用年限" clearable/>
</el-form-item>
</el-col>
<el-col :span="8">
@ -304,18 +304,18 @@
clearable
style="width: 100%"
>
<el-option v-for="item in manufacturerList" :key="item.id" :label="item.label" :value="item.id" />
<el-option v-for="item in manufacturerList" :key="item.id" :label="item.label" :value="item.id"/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="特征项" prop="featureItem">
<el-input v-model="queryParams.featureItem" placeholder="请输入特征项" clearable />
<el-input v-model="queryParams.featureItem" placeholder="请输入特征项" clearable/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="特征值" prop="featureValue">
<el-input v-model="queryParams.featureValue" placeholder="请输入特征值" clearable />
<el-input v-model="queryParams.featureValue" placeholder="请输入特征值" clearable/>
</el-form-item>
</el-col>
</el-row>
@ -327,8 +327,8 @@
<div class="status-operation-bar sticky-bar">
<el-button type="text" size="mini" @click="toggleSearch" class="search-toggle-btn">
<i :class="searchExpanded ? 'el-icon-up' : 'el-icon-down'"></i>
{{ searchExpanded ? '收起' : '展开' }}
<i :class="searchExpanded ? 'el-icon-up' : 'el-icon-down'"></i>
{{ searchExpanded ? '收起' : '展开' }}
</el-button>
<div class="operation-buttons">
@ -344,7 +344,7 @@
<!-- 装备列表表格 -->
<div class="card-container">
<el-row :gutter="10" class="mb8" style="display: flex; align-items: center">
<el-col :span="21">
<el-col :span="24">
<div class="card-header">
<div>
<span class="table-title">装备列表 </span>
@ -378,17 +378,21 @@
v-loading="tableLoading"
border
stripe
fit
:auto-resize="true"
height="546"
:cell-style="{ 'white-space': 'normal', 'line-height': '1.4' }"
:header-cell-style="{ 'line-height': '1.4' }"
>
<el-table-column align="center" show-overflow-tooltip type="selection" width="50" />
<el-table-column align="center" show-overflow-tooltip type="index" label="序号" width="50" />
<el-table-column align="center" show-overflow-tooltip type="selection" width="50"/>
<el-table-column align="center" show-overflow-tooltip type="index" fixed="left" label="序号" width="50"/>
<el-table-column
v-for="(item, index) in columns2"
v-if="item.visible"
:key="index"
align="center"
show-overflow-tooltip
min-width="200"
:width="item.width || 'auto'"
:fixed="item.fixed"
:label="item.label"
:prop="item.prop"
>
@ -407,7 +411,7 @@
<el-tag v-if="row.upDownStatus == 0" size="mini" type="danger">下架</el-tag>
</template>
<template v-slot="{ row }" v-else-if="item.prop == 'status'">
<el-tag v-if="row.status == 1" type="success" size="mini" >在库</el-tag>
<el-tag v-if="row.status == 1" type="success" size="mini">在库</el-tag>
<el-tag v-if="row.status == 2" size="mini">自用</el-tag>
<el-tag v-if="row.status == 3" size="mini">共享</el-tag>
<el-tag v-if="row.status == 4" size="mini" type="danger">退役</el-tag>
@ -435,13 +439,13 @@
</template>
</el-table-column>
<el-table-column align="center" fixed="right" min-width="200" label="操作">
<el-table-column align="center" fixed="right" width="150" label="操作">
<template slot-scope="scope">
<el-button type="text" @click="onHandlePreview(scope.row)">
查看
查看
</el-button>
<el-button type="text" @click="onHandleEdit(scope.row)"> 编辑 </el-button>
<el-button type="text" @click="onHandleDelete(scope.row)" style="color: #FF5129">
<el-button type="text" @click="onHandleEdit(scope.row)"> 编辑</el-button>
<el-button type="text" @click="onHandleDelete(scope.row)" style="color: #FF5129">
删除
</el-button>
</template>
@ -478,42 +482,42 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="公司名称" prop="companyName">
<el-input v-model="formData.companyName" disabled />
<el-input v-model="formData.companyName" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工主工序" prop="mainGx">
<el-input v-model="formData.mainGx" disabled />
<el-input v-model="formData.mainGx" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工子工序" prop="childGx">
<el-input v-model="formData.childGx" disabled />
<el-input v-model="formData.childGx" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备大类" prop="devCategory">
<el-input v-model="formData.devCategory" disabled />
<el-input v-model="formData.devCategory" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备小类" prop="devSubcategory">
<el-input v-model="formData.devSubcategory" disabled />
<el-input v-model="formData.devSubcategory" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备名称" prop="name">
<el-input v-model="formData.name" disabled />
<el-input v-model="formData.name" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规格型号" prop="devModel">
<el-input v-model="formData.devModel" disabled />
<el-input v-model="formData.devModel" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备编号" prop="code">
<el-input v-model="formData.code" disabled />
<el-input v-model="formData.code" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
@ -537,57 +541,57 @@
</el-col>
<el-col :span="12">
<el-form-item label="使用到期时间" prop="expireTime">
<el-input v-model="formData.expireTime" disabled />
<el-input v-model="formData.expireTime" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计数单位" prop="unitName">
<el-input v-model="formData.unitName" disabled />
<el-input v-model="formData.unitName" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="产权单位" prop="propertyCompany">
<el-input v-model="formData.propertyCompany" disabled />
<el-input v-model="formData.propertyCompany" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资产原值(万元)" prop="buyPrice">
<el-input v-model="formData.buyPrice" disabled />
<el-input v-model="formData.buyPrice" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产日期" prop="productionDate">
<el-input v-model="formData.productionDate" disabled />
<el-input v-model="formData.productionDate" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="使用年限" prop="workingHours">
<el-input v-model="formData.workingHours" disabled />
<el-input v-model="formData.workingHours" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所在项目" prop="onProject">
<el-input v-model="formData.onProject" disabled />
<el-input v-model="formData.onProject" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系人" prop="person">
<el-input v-model="formData.person" disabled />
<el-input v-model="formData.person" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式" prop="personPhone">
<el-input v-model="formData.personPhone" disabled />
<el-input v-model="formData.personPhone" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下次维保日期" prop="nextCheckTime">
<el-input v-model="formData.nextCheckTime" disabled />
<el-input v-model="formData.nextCheckTime" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产厂商" prop="brand">
<el-input v-model="formData.brand" disabled />
<el-input v-model="formData.brand" disabled/>
</el-form-item>
</el-col>
</el-row>
@ -610,42 +614,42 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="公司名称" prop="companyName">
<el-input v-model="formData.companyName" />
<el-input v-model="formData.companyName"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工主工序" prop="mainGx">
<el-input v-model="formData.mainGx" />
<el-input v-model="formData.mainGx"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工子工序" prop="childGx">
<el-input v-model="formData.childGx" />
<el-input v-model="formData.childGx"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备大类" prop="devCategory">
<el-input v-model="formData.devCategory" />
<el-input v-model="formData.devCategory"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备小类" prop="devSubcategory">
<el-input v-model="formData.devSubcategory" />
<el-input v-model="formData.devSubcategory"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备名称" prop="name">
<el-input v-model="formData.name" />
<el-input v-model="formData.name"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规格型号" prop="devModel">
<el-input v-model="formData.devModel" />
<el-input v-model="formData.devModel"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="装备编号" prop="code">
<el-input v-model="formData.code" disabled />
<el-input v-model="formData.code" disabled/>
</el-form-item>
</el-col>
<el-col :span="12">
@ -680,17 +684,17 @@
</el-col>
<el-col :span="12">
<el-form-item label="计数单位" prop="unitName">
<el-input v-model="formData.unitName" />
<el-input v-model="formData.unitName"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="产权单位" prop="propertyCompany">
<el-input v-model="formData.propertyCompany" />
<el-input v-model="formData.propertyCompany"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资产原值(万元)" prop="buyPrice">
<el-input v-model="formData.buyPrice" type="number" />
<el-input v-model="formData.buyPrice" type="number"/>
</el-form-item>
</el-col>
<el-col :span="12">
@ -706,22 +710,22 @@
</el-col>
<el-col :span="12">
<el-form-item label="使用年限" prop="workingHours">
<el-input v-model="formData.workingHours" type="number" />
<el-input v-model="formData.workingHours" type="number"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所在项目" prop="onProject">
<el-input v-model="formData.onProject" />
<el-input v-model="formData.onProject"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系人" prop="person">
<el-input v-model="formData.person" />
<el-input v-model="formData.person"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式" prop="personPhone">
<el-input v-model="formData.personPhone" />
<el-input v-model="formData.personPhone"/>
</el-form-item>
</el-col>
<el-col :span="12">
@ -737,7 +741,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="生产厂商" prop="brand">
<el-input v-model="formData.brand" />
<el-input v-model="formData.brand"/>
</el-form-item>
</el-col>
<el-col :span="12"></el-col>
@ -762,9 +766,9 @@
</el-dialog>
<!-- 弹框 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="40%">
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" append-to-body width="40%">
<el-table :data="dialogList" fit highlight-current-row style="width: 100%" height="546" stripe>
<el-table-column type="index" width="55" label="序号" align="center" />
<el-table-column type="index" width="55" label="序号" align="center"/>
<el-table-column label="附件名称" prop="fileName" align="left">
<!-- 插槽 -->
<template v-slot="{ row }">
@ -778,11 +782,38 @@
</span>
</el-dialog>
<!-- 弹框 -->
<el-dialog
:title="dialogTitle"
:visible.sync="dialogCodeVisible"
width="20%"
@opened="handleDialogOpened"
center
>
<!-- 二维码容器水平居中 -->
<div class="qrcode-box">
<QrcodeGenerator
ref="qr3"
:value="dialogRow"
errorCorrectionLevel="H"
:size="250"
/>
</div>
<!-- 底部按钮新增打印下载 -->
<span slot="footer" class="dialog-footer">
<el-button type="primary" size="mini" @click="downloadQrcode">下载二维码</el-button>
<el-button @click="dialogCodeVisible = false"> </el-button>
</span>
</el-dialog>
<!-- 报告管理 -->
<el-dialog title="报告管理" :visible.sync="openReport" width="550px" append-to-body class="center-dialog">
<el-table :data="fileDataList" width="100%" height="250px" stripe>
<el-table-column label="序号" type="index" width="55" align="center" />
<el-table-column label="报告类型" align="left" header-align="left" prop="dictLabel" :show-overflow-tooltip="true">
<el-dialog title="报告管理" :visible.sync="openReport" width="550px" class="center-dialog">
<el-table :data="fileDataList" width="100%" stripe>
<el-table-column label="序号" type="index" width="55" align="center"/>
<el-table-column label="报告类型" align="left" header-align="left" prop="dictLabel"
:show-overflow-tooltip="true"
>
<template v-slot="{ row }">
<span v-if="row.type == 1 || row.type == 2 || row.type == 3">
<span style="color: red">*</span>
@ -807,13 +838,22 @@
>
查看
</el-button>
<el-button
v-if="row.type == 5"
size="mini"
type="text"
@click="handleView(currentRow, row.type)"
>
查看
</el-button>
</div>
</template>
</el-table-column>
</el-table>
</el-dialog>
<AddEquip ref="addEquipRef" @getList="getDeviceList" />
<AddEquip ref="addEquipRef" @getList="getDeviceList"/>
</div>
</template>
@ -826,8 +866,10 @@ import {
delDevice,
updateDeviceAPI,
getDeviceDetailAPI,
getManufacturerSelectApi,
getManufacturerSelectApi
} from '@/api/EquipmentLedger/index.js'
import QrcodeGenerator from '@/components/QrcodeGenerator'
import { firstLevel, secondAndThirdLevel } from '@/api/EquipmentEntryApply'
import { getMaxFeatureAPI, getProvinceListAPI } from '@/api/EquipmentLedger/equ-out.js'
import { deptTreeSelect } from '@/api/system/user'
@ -835,7 +877,7 @@ import AddEquip from '@/views/stockManagement/entryApply/components/AddEquip'
export default {
name: 'EquipmentLedger',
components: { AddEquip },
components: { AddEquip, QrcodeGenerator },
data() {
return {
treeSearchKey: '', //
@ -864,14 +906,14 @@ export default {
featureItem: undefined, //
featureValue: undefined, //
pageNum: 1,
pageSize: 10,
pageSize: 10
},
//
queryRules: {},
//
defaultProps: {
children: 'children',
label: 'name',
label: 'name'
},
treeData: [],
defaultExpandedKeys: [], // key
@ -883,53 +925,49 @@ export default {
manufacturerList: [], //
columns2: [],
columns: [
// { key: 0, label: ``, prop: 'province', visible: true },
{ key: 1, label: `产权单位`, prop: 'propertyUnit', visible: true },
{ key: 2, label: `专业`, prop: 'major', visible: true },
{ key: 3, label: `工序`, prop: 'process', visible: true },
{ key: 4, label: `装备类目`, prop: 'devType', visible: true },
{ key: 5, label: `装备名称`, prop: 'name', visible: true },
{ key: 6, label: `规格型号`, prop: 'specificationModel', visible: true },
{ key: 7, label: `装备编码`, prop: 'code', visible: true },
{ key: 8, label: `装备状态`, prop: 'status', visible: true },
// { key: 44, label: ``, prop: 'upDownStatus', visible: true },
{ key: 9, label: `使用年限`, prop: 'serviceLife', visible: true },
{ key: 10, label: `使用项目`, prop: 'usingProject', visible: true },
{ key: 11, label: `使用到期时间`, prop: 'expirationTime', visible: true },
{ key: 12, label: `使用次数`, prop: 'usageCount', visible: true },
{ key: 13, label: `维修次数`, prop: 'repairCount', visible: true },
{ key: 14, label: `装备原始编码`, prop: 'originalCode', visible: true },
// { key: 15, label: ``, prop: 'unit', visible: true },
{ key: 16, label: `生产厂家`, prop: 'manufacturer', visible: true },
{ key: 17, label: `出厂日期`, prop: 'productionDate', visible: true },
{ key: 18, label: `采购日期`, prop: 'purchaseDate', visible: true },
{ key: 19, label: `资产原值(万元)`, prop: 'originalValue', visible: true },
{ key: 19, label: `资产净值(万元)`, prop: 'value', visible: true },
{ key: 20, label: `最大使用年限(年)`, prop: 'maxServiceLifeYears', visible: true },
{ key: 21, label: `下次维保日期`, prop: 'nextMaintenanceDate', visible: true },
{ key: 22, label: `相关配套资料`, prop: 'fileImgList', visible: true },
// { key: 22, label: ``, prop: 'appearanceImages', visible: true },
// { key: 23, label: ``, prop: 'certificates', visible: true },
// { key: 24, label: ``, prop: 'inspectionReports', visible: true },
// { key: 25, label: ``, prop: 'purchaseInvoices', visible: true },
{ key: 26, label: `特征项1`, prop: 'featureItem1', visible: true },
{ key: 27, label: `特征值1`, prop: 'featureValue1', visible: true },
{ key: 28, label: `特征项2`, prop: 'featureItem2', visible: true },
{ key: 29, label: `特征值2`, prop: 'featureValue2', visible: true },
{ key: 30, label: `特征项3`, prop: 'featureItem3', visible: true },
{ key: 31, label: `特征值3`, prop: 'featureValue3', visible: true },
{ key: 32, label: `特征项4`, prop: 'featureItem4', visible: true },
{ key: 33, label: `特征值4`, prop: 'featureValue4', visible: true },
{ key: 34, label: `特征项5`, prop: 'featureItem5', visible: true },
{ key: 35, label: `特征值5`, prop: 'featureValue5', visible: true },
{ key: 36, label: `特征项6`, prop: 'featureItem6', visible: true },
{ key: 37, label: `特征值6`, prop: 'featureValue6', visible: true },
{ key: 38, label: `特征项7`, prop: 'featureItem7', visible: true },
{ key: 39, label: `特征值7`, prop: 'featureValue7', visible: true },
{ key: 40, label: `特征项8`, prop: 'featureItem8', visible: true },
{ key: 41, label: `特征值8`, prop: 'featureValue8', visible: true },
{ key: 42, label: `特征项9`, prop: 'featureItem9', visible: true },
{ key: 43, label: `特征值9`, prop: 'featureValue9', visible: true },
{ key: 1, label: `产权单位`, prop: 'propertyUnit', visible: true, width: 150 }, //
{ key: 2, label: `专业`, prop: 'major', visible: true, width: 150 },
{ key: 3, label: `工序`, prop: 'process', visible: true, width: 180 },
{ key: 4, label: `装备类目`, prop: 'devType', visible: true, width: 180 },
{ key: 5, label: `装备名称`, prop: 'name', visible: true, fixed: 'left', width: 150 }, //
{ key: 8, label: `装备状态`, prop: 'status', visible: true, fixed: 'left', width: 100 },
{ key: 6, label: `规格型号`, prop: 'specificationModel', visible: true, width: 150 },
{ key: 7, label: `装备编码`, prop: 'code', visible: true, width: 150 },
{ key: 9, label: `使用年限`, prop: 'serviceLife', visible: true, width: 100 },
{ key: 10, label: `使用项目`, prop: 'usingProject', visible: true, width: 180 },
{ key: 11, label: `使用到期时间`, prop: 'expirationTime', visible: true, width: 120 },
{ key: 12, label: `使用次数`, prop: 'usageCount', visible: true, width: 100 },
{ key: 13, label: `维修次数`, prop: 'repairCount', visible: true, width: 100 },
{ key: 14, label: `装备原始编码`, prop: 'originalCode', visible: true, width: 150 },
{ key: 16, label: `生产厂家`, prop: 'manufacturer', visible: true, width: 150 },
{ key: 17, label: `出厂日期`, prop: 'productionDate', visible: true, width: 120 },
{ key: 18, label: `采购日期`, prop: 'purchaseDate', visible: true, width: 120 },
{ key: 19, label: `资产原值(万元)`, prop: 'originalValue', visible: true, width: 120 },
{ key: 19, label: `资产净值(万元)`, prop: 'value', visible: true, width: 120 },
{ key: 20, label: `最大使用年限(年)`, prop: 'maxServiceLifeYears', visible: true, width: 120 },
{ key: 21, label: `下次维保日期`, prop: 'nextMaintenanceDate', visible: true, width: 120 },
{ key: 22, label: `相关配套资料`, prop: 'fileImgList', visible: true, width: 150 },
// /
{ key: 26, label: `特征项1`, prop: 'featureItem1', visible: true, width: 100 },
{ key: 27, label: `特征值1`, prop: 'featureValue1', visible: true, width: 100 },
{ key: 28, label: `特征项2`, prop: 'featureItem2', visible: true, width: 100 },
{ key: 29, label: `特征值2`, prop: 'featureValue2', visible: true, width: 100 },
// /
{ key: 30, label: `特征项3`, prop: 'featureItem3', visible: true, width: 100 },
{ key: 31, label: `特征值3`, prop: 'featureValue3', visible: true, width: 100 },
{ key: 32, label: `特征项4`, prop: 'featureItem4', visible: true, width: 100 },
{ key: 33, label: `特征值4`, prop: 'featureValue4', visible: true, width: 100 },
{ key: 34, label: `特征项5`, prop: 'featureItem5', visible: true, width: 100 },
{ key: 35, label: `特征值5`, prop: 'featureValue5', visible: true, width: 100 },
{ key: 36, label: `特征项6`, prop: 'featureItem6', visible: true, width: 100 },
{ key: 37, label: `特征值6`, prop: 'featureValue6', visible: true, width: 100 },
{ key: 38, label: `特征项7`, prop: 'featureItem7', visible: true, width: 100 },
{ key: 39, label: `特征值7`, prop: 'featureValue7', visible: true, width: 100 },
{ key: 40, label: `特征项8`, prop: 'featureItem8', visible: true, width: 100 },
{ key: 41, label: `特征值8`, prop: 'featureValue8', visible: true, width: 100 },
{ key: 42, label: `特征项9`, prop: 'featureItem9', visible: true, width: 100 },
{ key: 43, label: `特征值9`, prop: 'featureValue9', visible: true, width: 100 }
],
tableData: [],
tableColumns: 0,
@ -975,18 +1013,20 @@ export default {
personPhone: '',
nextCheckTime: '',
brand: '',
propertyVoList: [],
propertyVoList: []
},
//
formRules: {
name: [{ required: true, message: '请输入装备名称', trigger: 'blur' }],
code: [{ required: true, message: '请输入装备编号', trigger: 'blur' }],
changeStatus: [{ required: true, message: '请选择装备状态', trigger: 'change' }],
changeStatus: [{ required: true, message: '请选择装备状态', trigger: 'change' }]
},
maxFeatureCount: 5, //
dialogVisible: false,
dialogCodeVisible: false,
dialogTitle: '',
dialogList: [],
dialogRow: {},
currentRow: {},
openReport: false,
fileDataList: [
@ -994,7 +1034,8 @@ export default {
{ dictLabel: '合格证', type: '2' },
{ dictLabel: '检测证书', type: '3' },
{ dictLabel: '采购发票', type: '4' },
],
{ dictLabel: '装备二维码', type: '5' }
]
}
},
computed: {
@ -1047,6 +1088,23 @@ export default {
this.propertyUnitList = this.filterTree(res.data)
console.log('🚀 ~ this.propertyUnitList:', this.propertyUnitList)
},
//
handleDialogOpened() {
// DOM 使 $nextTick
this.$nextTick(() => {
this.$refs.qr3?.refreshQrcode()
})
},
//
downloadQrcode() {
// /
const fileName = `装备二维码_${new Date().getTime()}.png`
this.$refs.qr3?.downloadQrcode(fileName)
},
//
printQrcode() {
this.$refs.qr3?.printQrcode()
},
filterTree(nodes) {
return nodes
.map((node) => {
@ -1093,7 +1151,7 @@ export default {
list.forEach((item) => {
map[item.value] = {
value: item.value.toString(),
label: item.label,
label: item.label
}
})
@ -1506,7 +1564,7 @@ export default {
personPhone: '',
nextCheckTime: '',
brand: '',
propertyVoList: [],
propertyVoList: []
}
},
@ -1526,7 +1584,7 @@ export default {
this.formData.propertyVoList.push({
propertyName: '',
propertyValue: '',
propertyValue: ''
})
},
@ -1539,7 +1597,7 @@ export default {
cancelButtonText: '取消',
type: 'warning',
center: true,
showCancelButton: this.formData.propertyVoList.length > 1, //
showCancelButton: this.formData.propertyVoList.length > 1 //
})
.then(() => {
this.formData.propertyVoList.splice(index, 1)
@ -1553,7 +1611,7 @@ export default {
* 提交编辑表单
*/
async submitEditForm() {
this.$refs.editForm.validate(async (valid) => {
this.$refs.editForm.validate(async(valid) => {
if (valid) {
try {
const res = await updateDeviceAPI(this.formData)
@ -1579,8 +1637,8 @@ export default {
this.$confirm('确定要删除该装备吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(async () => {
type: 'warning'
}).then(async() => {
try {
const res = await delDevice(row.maId)
if (res.code === 200) {
@ -1605,7 +1663,7 @@ export default {
try {
const res = await updateDeviceUpDownAPI({
devIds: this.selectedRows.map((item) => item.maId).join(','),
status: 1,
status: 1
})
this.selectedRows = []
@ -1633,7 +1691,7 @@ export default {
try {
const res = await updateDeviceUpDownAPI({
devIds: this.selectedRows.map((item) => item.maId).join(','),
status: 0,
status: 0
})
this.selectedRows = []
@ -1669,10 +1727,8 @@ export default {
this.underRepair = underRepair || 0
this.totalValue = totalValue || 0
this.retirementValue = retirementValue || 0
this.retirementValue = retirementValue || 0
} catch (error) {
this.$message.error('获取状态统计失败:' + (error.message || '未知错误'))
console.error(error)
@ -1690,22 +1746,48 @@ export default {
return type === 'Item' ? list[index].propertyName : list[index].propertyValue
},
//
handleView(row, type) {
if (type == 1) {
this.dialogTitle = '装备外观'
this.dialogList = row.appearanceImages || []
this.dialogVisible = true
} else if (type == 2) {
this.dialogTitle = '合格证'
this.dialogList = row.certificates || []
this.dialogVisible = true
} else if (type == 3) {
this.dialogTitle = '定期检验报告'
this.dialogList = row.inspectionReports || []
this.dialogVisible = true
} else if (type == 4) {
this.dialogTitle = '采购发票'
this.dialogList = row.purchaseInvoices || []
this.dialogVisible = true
} else if (type == 5) {
this.dialogTitle = '装备二维码'
const propertyList = row.propertyVoList || []
const property = propertyList
// item propertyValue
.filter(item => item && item.propertyValue)
// ":"
.map(item => `${item.propertyName}:${item.propertyValue}`)
// /线
.join(',')
//3.6.7.8.
this.dialogRow =
`装备名称:${row.name}\r\n` +
`装备编码:${row.code}\r\n` +
`规格型号:${row.specificationModel}\r\n` +
`产权单位:${row.propertyUnit}\r\n` +
`装备小类:${row.subCategory}\r\n` +
`生产厂家:${row.manufacturer}\r\n` +
`出厂日期:${row.productionDate}\r\n` +
`特征属性:{${property}}`
this.dialogCodeVisible = true
}
this.dialogVisible = true
},
handleFile(row) {
//
@ -1714,11 +1796,12 @@ export default {
handleFileListUpload(row) {
this.currentRow = row
this.openReport = true
},
}
},
async created() {
await this.getDeptTreeSelect().catch(() => {})
await this.getDeptTreeSelect().catch(() => {
})
const params = this.$route.query
this.queryParams.propertyUnitId = params?.deptId || ''
const ids = []
@ -1737,7 +1820,7 @@ export default {
//
await this.getDeviceList()
this.initDefaultExpandedKeys()
},
}
}
</script>
@ -2097,22 +2180,22 @@ export default {
width: 1.5% !important;
}
.el-button--primary{
.el-button--primary {
background-color: #2CBAB2;
border-color: #2CBAB2;
}
.el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
background-color: #2CBAB2;
border-color: #2CBAB2;
background-color: #2CBAB2;
border-color: #2CBAB2;
}
.el-tag{
.el-tag {
padding: 13px 7px;
line-height: 0;
}
.el-button--text{
.el-button--text {
color: #2CBAB2;
}
@ -2126,23 +2209,59 @@ export default {
}
::v-deep.el-tag.el-tag--info {
background-color: #F5F5F5;
border-color: #B3B3B3;
color: #B3B3B3;
background-color: #F5F5F5;
border-color: #B3B3B3;
color: #B3B3B3;
}
::v-deep.el-tag.el-tag--warn{
background-color: rgba(255,171,41,0.1);;
border: #FFAB29;
color: #FFAB29;
::v-deep.el-tag.el-tag--warn {
background-color: rgba(255, 171, 41, 0.1);;
border: #FFAB29;
color: #FFAB29;
}
::v-deep.el-tag.el-tag--success {
background-color: rgba(52,226,199,0.1);
border-color: #34E2C7;
color: #34E2C7;
background-color: rgba(52, 226, 199, 0.1);
border-color: #34E2C7;
color: #34E2C7;
}
.el-select-dropdown__item.hover, .el-select-dropdown__item:hover {
background-color: rgba(52,226,199,0.1);
background-color: rgba(52, 226, 199, 0.1);
}
/* 二维码容器水平居中 */
.qrcode-box {
text-align: center; /* 核心让inline-block的二维码居中 */
padding: 10px 0;
}
/* 底部按钮布局优化 */
.dialog-footer {
display: flex;
justify-content: center; /* 按钮水平居中 */
gap: 10px; /* 按钮间距 */
}
.cell-content-two-lines {
}
.el-table .cell {
white-space: normal !important;
overflow: visible !important;
text-overflow: unset !important;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2; /* 强制最多显示2行 */
overflow: hidden; /* 超出部分隐藏 */
text-overflow: ellipsis; /* 两行后末尾加省略号 */
word-break: break-all; /* 英文/数字换行 */
word-wrap: break-word; /* 中文换行 */
height: 36px; /* 两行文本的高度line-height:1.4 → 18px*2=36px可按需调整 */
margin: 2px 0; /* 上下边距,避免内容贴边 */
}
</style>

View File

@ -11,24 +11,24 @@
<div class="dialog-content">
<div class="page-header">
<!-- <div> -->
<!-- <i
class="el-icon-arrow-left goBack-btn"
@click="goBack"
style="
border-color: transparent;
color: #00a288;
background: transparent;
padding-left: 0;
padding-right: 0;
"
>返回</i
>
<span class="page-title">{{ pageTitle }}</span> -->
<!-- <i
class="el-icon-arrow-left goBack-btn"
@click="goBack"
style="
border-color: transparent;
color: #00a288;
background: transparent;
padding-left: 0;
padding-right: 0;
"
>返回</i
>
<span class="page-title">{{ pageTitle }}</span> -->
<!-- </div> -->
<!-- <div class="dialog-footer" style="float: right"> -->
<!-- <el-button size="medium" @click="close">取消</el-button> -->
<!-- <el-button type="primary" size="medium" @click="handleSubmit">确认</el-button>
</div> -->
<!-- <div class="dialog-footer" style="float: right"> -->
<!-- <el-button size="medium" @click="close">取消</el-button> -->
<!-- <el-button type="primary" size="medium" @click="handleSubmit">确认</el-button>
</div> -->
</div>
<el-form
@ -139,7 +139,7 @@
filterable
style="flex: 1; width: 100%"
>
<el-option v-for="item in manufacturerList" :key="item.id" :label="item.label" :value="item.id" />
<el-option v-for="item in manufacturerList" :key="item.id" :label="item.label" :value="item.id"/>
</el-select>
</div>
</el-form-item>
@ -181,7 +181,7 @@
</el-col>
<el-col :span="6">
<el-form-item label="装备原始编码" prop="originalCode">
<el-input clearable maxlength="20" placeholder="请输入装备原始编码" v-model="form.originalCode" />
<el-input clearable maxlength="20" placeholder="请输入装备原始编码" v-model="form.originalCode"/>
</el-form-item>
</el-col>
<el-col :span="6">
@ -254,7 +254,7 @@
<!-- propertyVoList -->
<el-col :span="6" v-for="(item, index) in propertyVoList" :key="index">
<el-form-item v-if="item.inputType == 1" :label="item.propertyName">
<el-input autocomplete="off" maxlength="30" v-model="item.propertyValue" clearable :disabled="isEdit" />
<el-input autocomplete="off" maxlength="30" v-model="item.propertyValue" clearable :disabled="isEdit"/>
</el-form-item>
<!-- 单选 -->
<el-form-item v-if="item.inputType == 2" :label="item.propertyName">
@ -364,6 +364,17 @@
@input="handlePurchaseInvoicesChange"
/>
</el-form-item>
<el-form-item label="装备二维码" prop="">
<div class="qrcode-box" style="width: 150px;height: 150px">
<QrcodeGenerator
ref="qr3"
:value="dialogRow"
errorCorrectionLevel="H"
:size="150"
/>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
@ -371,10 +382,10 @@
<!-- 底部按钮区固定 -->
<template slot="footer">
<div class="dialog-footer">
<el-button type="primary" size="medium" @click="handleSubmit">确认</el-button>
</div>
</template>
<div class="dialog-footer">
<el-button type="primary" size="medium" @click="handleSubmit">确认</el-button>
</div>
</template>
<!-- 地址 -->
@ -383,12 +394,12 @@
<el-row>
<el-col :span="12">
<el-form-item label="统一社会信用代码" prop="supplierCode">
<el-input v-model="supFrom.supplierCode" placeholder="请输入统一社会信用代码" maxlength="64" />
<el-input v-model="supFrom.supplierCode" placeholder="请输入统一社会信用代码" maxlength="64"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="厂家名称" prop="supplierName">
<el-input v-model="supFrom.supplierName" placeholder="请输入厂家名称" maxlength="128" />
<el-input v-model="supFrom.supplierName" placeholder="请输入厂家名称" maxlength="128"/>
</el-form-item>
</el-col>
</el-row>
@ -396,12 +407,12 @@
<el-row>
<el-col :span="12">
<el-form-item label="联系人" prop="contactPerson">
<el-input v-model="supFrom.contactPerson" placeholder="请输入联系人" maxlength="64" />
<el-input v-model="supFrom.contactPerson" placeholder="请输入联系人" maxlength="64"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="contactPhone">
<el-input v-model="supFrom.contactPhone" placeholder="请输入联系电话" maxlength="11" />
<el-input v-model="supFrom.contactPhone" placeholder="请输入联系电话" maxlength="11"/>
</el-form-item>
</el-col>
</el-row>
@ -409,12 +420,12 @@
<el-row>
<el-col :span="12">
<el-form-item label="厂家地址" prop="address">
<el-input v-model="supFrom.address" placeholder="请输入厂家地址" maxlength="255" />
<el-input v-model="supFrom.address" placeholder="请输入厂家地址" maxlength="255"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资质/执照编号" prop="qualification">
<el-input v-model="supFrom.qualification" placeholder="请输入资质信息或执照编号" maxlength="255" />
<el-input v-model="supFrom.qualification" placeholder="请输入资质信息或执照编号" maxlength="255"/>
</el-form-item>
</el-col>
</el-row>
@ -422,8 +433,8 @@
<el-col :span="12">
<el-form-item label="状态" prop="status">
<el-select v-model="supFrom.status" placeholder="请选择状态" style="width: 100%">
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
<el-option label="启用" :value="1"/>
<el-option label="停用" :value="0"/>
</el-select>
</el-form-item>
</el-col>
@ -460,7 +471,7 @@ import {
fourthToSixthLevel,
getDeviceApi,
equipmentEditApiNew,
getEquipmentPropertyTypeApi,
getEquipmentPropertyTypeApi
} from '@/api/EquipmentEntryApply'
import { getManufacturerSelectApi } from '@/api/EquipmentLedger/index.js'
import ImageUpload from '@/components/ImageUpload'
@ -485,6 +496,7 @@ export default {
maId: null,
//
majorList: [],
dialogRow: '',
processList: [],
categoryList: [],
manufacturerList: [],
@ -494,9 +506,9 @@ export default {
supplierName: [{ required: true, message: '厂家名称不能为空', trigger: 'blur' }],
contactPhone: [
{ required: false, message: '请输入联系电话', trigger: 'blur' },
{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' },
{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
],
status: [{ required: true, message: '请选择状态', trigger: 'change' }],
status: [{ required: true, message: '请选择状态', trigger: 'change' }]
},
form: {
major: '', //
@ -523,7 +535,7 @@ export default {
inspectionList: '', //
purchaseInvoices: '', //
propertyUnitIds: [], //
propertyUnitId: null, //
propertyUnitId: null //
},
propertyUnitList: [], //
//
@ -541,13 +553,13 @@ export default {
maxServiceLifeYears: [{ required: true, message: '请输入装备寿命', trigger: 'blur' }],
// manageType: [{ required: true, message: '', trigger: 'change' }],
count: [{ required: true, message: '请输入装备数量', trigger: 'blur' }],
unit: [{ required: true, message: '请输入计数单位', trigger: 'blur' }],
unit: [{ required: true, message: '请输入计数单位', trigger: 'blur' }]
// purchaseDate: [{ required: true, message: '', trigger: 'change' }],
// certificateList: [{ required: true, message: '', trigger: 'change' }],
// inspectionList: [{ required: true, message: '', trigger: 'change' }],
// mainFileList: [{ required: true, message: '', trigger: 'change' }],
},
propertyVoList: [], //
propertyVoList: [] //
}
},
created() {
@ -584,6 +596,31 @@ export default {
const res = await getDeviceApi(this.maId)
console.log('🚀 ~ getInfo ~ res:', res)
Object.assign(this.form, res.data)
if (res.data) {
let row = res.data
const propertyList = row.propertyVoList || []
const property = propertyList
// item propertyValue
.filter(item => item && item.propertyValue)
// ":"
.map(item => `${item.propertyName}:${item.propertyValue}`)
// /线
.join(',')
//3.6.7.8.
this.dialogRow =
`装备名称:${row.name}\r\n` +
`装备编码:${row.code}\r\n` +
`规格型号:${row.specificationModel}\r\n` +
`产权单位:${row.propertyUnit}\r\n` +
`装备小类:${row.subCategory}\r\n` +
`生产厂家:${row.manufacturer}\r\n` +
`出厂日期:${row.productionDate}\r\n` +
`特征属性:{${property}}`
this.$nextTick(() => {
this.$refs.qr3?.refreshQrcode()
})
}
this.form.mainFileList = res.data.appearanceImages
? res.data.appearanceImages.map((item) => item.fileUrl).join(',')
: ''
@ -611,7 +648,7 @@ export default {
this.form.category = [
String(res.data.mainCategoryId),
String(res.data.subCategoryId),
String(res.data.branchId),
String(res.data.branchId)
].filter(Boolean)
} else {
this.form.category = [String(res.data.mainCategoryId), String(res.data.subCategoryId)].filter(Boolean)
@ -624,7 +661,7 @@ export default {
if (item.propertyValue === '' || item.propertyValue === null || item.propertyValue === undefined) {
item.propertyValue = null
}
if (item.inputType == 3) {
if (item.inputType == 3 && item.propertyValue) {
item.propertyValue = item.propertyValue.split(',')
}
})
@ -716,8 +753,8 @@ export default {
query: {
orderId: this.orderId,
isAddVisible: false,
isApprovalVisible: false,
},
isApprovalVisible: false
}
})
},
close() {
@ -727,8 +764,8 @@ export default {
query: {
orderId: this.orderId,
isAddVisible: false,
isApprovalVisible: false,
},
isApprovalVisible: false
}
})
})
},
@ -770,7 +807,7 @@ export default {
*/
async handleSubmit() {
console.log('🚀 ~ handleSubmit ~ this.form:', this.form, this.propertyVoList)
this.$refs['formRef'].validate(async (valid) => {
this.$refs['formRef'].validate(async(valid) => {
if (valid) {
if (this.isSubmit) return
this.isSubmit = true
@ -797,7 +834,7 @@ export default {
const parts = item.split('/')
return {
fileName: parts[parts.length - 1],
fileUrl: item,
fileUrl: item
}
})
console.log('🚀 ~ handleSubmit ~ appearanceImages:', appearanceImages)
@ -808,7 +845,7 @@ export default {
const parts = item.split('/')
return {
fileName: parts[parts.length - 1],
fileUrl: item,
fileUrl: item
}
})
console.log('🚀 ~ handleSubmit ~ certificates:', certificates)
@ -823,7 +860,7 @@ export default {
const parts = item.split('/')
return {
fileName: parts[parts.length - 1],
fileUrl: item,
fileUrl: item
}
})
console.log('🚀 ~ handleSubmit ~ inspectionReports:', inspectionReports)
@ -838,7 +875,7 @@ export default {
const parts = item.split('/')
return {
fileName: parts[parts.length - 1],
fileUrl: item,
fileUrl: item
}
})
console.log('🚀 ~ handleSubmit ~ purchaseInvoices:', purchaseInvoices)
@ -846,7 +883,7 @@ export default {
// propertyVoList propertyValue
if (this.propertyVoList && this.propertyVoList.length > 0) {
const unfilledIndex = this.propertyVoList.findIndex(
(item) => (!item.propertyValue || item.propertyValue === '') && item.mustHave != '0',
(item) => (!item.propertyValue || item.propertyValue === '') && item.mustHave != '0'
)
if (unfilledIndex !== -1) {
this.$message.warning(`${unfilledIndex + 1} 个特征项为必填项,请填写完整`)
@ -867,7 +904,7 @@ export default {
certificates,
inspectionReports,
purchaseInvoices,
propertyVoList: this.propertyVoList,
propertyVoList: this.propertyVoList
}
if (this.maId) {
params.maId = this.maId
@ -900,7 +937,7 @@ export default {
list.forEach((item) => {
map[item.value] = {
value: item.value.toString(),
label: item.label,
label: item.label
}
})
@ -938,7 +975,7 @@ export default {
return data.split(',').map((item) => {
return {
label: item,
value: item,
value: item
}
})
},
@ -946,7 +983,7 @@ export default {
this.showHouse = true
},
submitForm() {
this.$refs['supFrom'].validate(async (valid) => {
this.$refs['supFrom'].validate(async(valid) => {
if (valid) {
addFacturer(this.supFrom).then((response) => {
this.$modal.msgSuccess('新增成功')
@ -955,8 +992,8 @@ export default {
})
}
})
},
},
}
}
}
</script>
@ -1001,6 +1038,7 @@ export default {
::v-deep .el-input-number.is-without-controls .el-input__inner {
text-align: left;
}
.select-box {
width: 100%;
height: 260px;
@ -1032,18 +1070,20 @@ export default {
}
::v-deep.el-tag.el-tag--info {
background-color: #F5F5F5;
border-color: #B3B3B3;
color: #B3B3B3;
background-color: #F5F5F5;
border-color: #B3B3B3;
color: #B3B3B3;
}
::v-deep.el-tag.el-tag--warn{
background-color: rgba(255,171,41,0.1);;
border: #FFAB29;
color: #FFAB29;
::v-deep.el-tag.el-tag--warn {
background-color: rgba(255, 171, 41, 0.1);;
border: #FFAB29;
color: #FFAB29;
}
::v-deep.el-tag.el-tag--success {
background-color: rgba(52,226,199,0.1);
border-color: #34E2C7;
color: #34E2C7;
background-color: rgba(52, 226, 199, 0.1);
border-color: #34E2C7;
color: #34E2C7;
}
</style>