From b4c2cbc7825fe4732fb6333447fdada9567bcb97 Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期一, 12 十月 2026 17:48:36 +0800
Subject: [PATCH] 资源需求(标准物质相关)模块调整;新增统一附件组件并接入供应商管理与客户满意度;客户满意度表单改客户卡片下拉并关联已完成委托单;预览、图表、导航栏等组件调整
---
src/views/CNAS/resourceDemand/standardMaterialAccept/component/AddRecord.vue | 457 ++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 309 insertions(+), 148 deletions(-)
diff --git a/src/views/CNAS/resourceDemand/standardMaterialAccept/component/AddRecord.vue b/src/views/CNAS/resourceDemand/standardMaterialAccept/component/AddRecord.vue
index b89e152..8cdb9d3 100644
--- a/src/views/CNAS/resourceDemand/standardMaterialAccept/component/AddRecord.vue
+++ b/src/views/CNAS/resourceDemand/standardMaterialAccept/component/AddRecord.vue
@@ -1,107 +1,190 @@
<template>
<el-dialog v-model="dialogVisible" title="鏍囧噯鐗╄川楠屾敹璁板綍" width="72%" v-loading="loading">
- <el-form :model="acceptance" ref="acceptance" label-width="140px" size="small">
- <el-col :span="12">
- <el-form-item label="鍘傚浠h〃" prop="producer">
- <el-input v-model="acceptance.producer"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐩稿叧闄勪欢" prop="file">
- <div class="table-between">
- <el-input v-model="acceptance.file" style="width: 80%;" disabled></el-input>
- <el-upload
- ref="upload"
- style="float: right;"
- :headers="uploadHeader"
- :action="action"
- :show-file-list="false"
- :on-success="onSuccess"
+ <el-form ref="form" :model="form" :rules="rules" label-width="140px" size="small">
+ <div class="section-title">鏍囧噯鐗╄川淇℃伅</div>
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鏍囧噯鐗╄川鍚嶇О" prop="substance.name">
+ <el-input v-model="form.substance.name" clearable></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="瑙勬牸鍨嬪彿" prop="substance.model">
+ <el-input v-model="form.substance.model" clearable></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鐢熶骇鍘傚" prop="substance.factoryManufacturer">
+ <el-input v-model="form.substance.factoryManufacturer" clearable></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="渚涘簲鍟�" prop="substance.supplier">
+ <el-select v-model="form.substance.supplier" clearable filterable placeholder="璇烽�夋嫨" style="width: 100%" @change="onSupplierChange">
+ <el-option v-for="item in supplierOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鍑哄巶缂栧彿" prop="substance.factoryNum">
+ <el-input v-model="form.substance.factoryNum" clearable></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="绠$悊缂栧彿" prop="substance.manageNum">
+ <el-input v-model="form.substance.manageNum" clearable></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="涓嶇‘瀹氬害" prop="substance.uncertainty">
+ <el-input v-model="form.substance.uncertainty" clearable></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="鏁伴噺" prop="substance.quantity">
+ <el-input v-model="form.substance.quantity" clearable></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="鍗曚綅" prop="substance.unit">
+ <el-input v-model="form.substance.unit" clearable></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="璐疆鏃ユ湡" prop="substance.acquisitionDate">
+ <el-date-picker
+ v-model="form.substance.acquisitionDate"
+ clearable
+ type="datetime"
+ format="YYYY-MM-DD HH:mm:ss"
+ value-format="YYYY-MM-DD HH:mm:ss"
+ placeholder="閫夋嫨鏃ユ湡"
+ style="width: 100%">
+ </el-date-picker>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鏈夋晥鏈�" prop="substance.effectiveDate">
+ <el-date-picker
+ v-model="form.substance.effectiveDate"
+ clearable
+ type="datetime"
+ format="YYYY-MM-DD HH:mm:ss"
+ value-format="YYYY-MM-DD HH:mm:ss"
+ placeholder="閫夋嫨鏃ユ湡"
+ style="width: 100%">
+ </el-date-picker>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妗f缂栧彿" prop="substance.fileNum">
+ <el-input v-model="form.substance.fileNum" clearable></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="瀛樻斁浣嶇疆" prop="substance.position">
+ <el-input v-model="form.substance.position" clearable></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="24">
+ <el-form-item label="澶囨敞" prop="substance.remark">
+ <el-input v-model="form.substance.remark" clearable></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <div class="section-title">楠屾敹淇℃伅</div>
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鍒拌揣鏃ユ湡" prop="acceptance.arriveDate">
+ <el-date-picker
+ v-model="form.acceptance.arriveDate"
+ type="date"
+ placeholder="閫夋嫨鏃ユ湡"
+ style="width: 100%"
+ value-format="YYYY-MM-DD"
>
- <el-button type="primary">
- 闄勪欢涓婁紶
- </el-button>
- </el-upload>
- </div>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鎺ユ敹浜�" prop="recipient">
- <el-input v-model="acceptance.recipient"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鎺ュ彈绛惧瓧" prop="signature">
- <el-input v-model="acceptance.signature"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="楠屾敹鎯呭喌" prop="situation">
- <el-input v-model="acceptance.situation"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹夎璋冭瘯鎯呭喌" prop="installation">
- <el-input v-model="acceptance.installation"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="娓呭崟" prop="substanceId"
- :rule="[{ required: true, message: '璇烽�夋嫨娓呭崟', trigger: 'change' }]">
- <el-select v-model="acceptance.substanceId" placeholder="璇烽�夋嫨" style="width: 100%">
- <el-option
- v-for="item in options"
- :key="item.value"
- :label="item.name"
- :value="item.id">
- </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍒拌揣鏃ユ湡" prop="arriveDate">
- <el-date-picker
- v-model="acceptance.arriveDate"
- align="right"
- type="date"
- placeholder="閫夋嫨鏃ユ湡"
- style="width: 100%"
- value-format="YYYY-MM-DD"
- >
- </el-date-picker>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="缁翠慨鍗曚綅" prop="maintenanceUnit">
- <el-input v-model="acceptance.maintenanceUnit"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="澶囦欢纭">
- <el-button type="primary" style="float: right;" @click="addSpareTable">澧炲姞琛�</el-button>
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <lims-table :tableData="list" :column="spareColumns" height="300">
- <template #name="{ row, index }">
- <el-input v-if="row.isEdit" size="small" v-model="row.name"></el-input>
- <span v-else>{{ row.name }}</span>
- </template>
- <template #number="{ row, index }">
- <el-input v-if="row.isEdit" size="small" v-model="row.number"></el-input>
- <span v-else>{{ row.number }}</span>
- </template>
- <template #action="{ row, index }">
- <div v-if="row.isEdit">
- <el-button link type="primary" @click="save(index)">淇濆瓨</el-button>
- <el-button link type="primary">鍙栨秷</el-button>
+ </el-date-picker>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鍘傚浠h〃" prop="acceptance.producer">
+ <el-input v-model="form.acceptance.producer"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎺ユ敹浜�" prop="acceptance.recipient">
+ <el-input v-model="form.acceptance.recipient"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎺ュ彈绛惧瓧" prop="acceptance.signature">
+ <el-input v-model="form.acceptance.signature"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="楠屾敹鎯呭喌" prop="acceptance.situation">
+ <el-input v-model="form.acceptance.situation"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="瀹夎璋冭瘯鎯呭喌" prop="acceptance.installation">
+ <el-input v-model="form.acceptance.installation"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="缁翠慨鍗曚綅" prop="acceptance.maintenanceUnit">
+ <el-input v-model="form.acceptance.maintenanceUnit"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鐩稿叧闄勪欢" prop="acceptance.file">
+ <div class="table-between">
+ <el-input v-model="form.acceptance.file" style="width: 80%;" disabled></el-input>
+ <el-upload
+ ref="upload"
+ style="float: right;"
+ :headers="uploadHeader"
+ :action="action"
+ :show-file-list="false"
+ :on-success="onSuccess"
+ >
+ <el-button type="primary">
+ 闄勪欢涓婁紶
+ </el-button>
+ </el-upload>
</div>
- <div v-else>
- <el-button link type="primary" @click="edit(index)">淇敼</el-button>
- </div>
- </template>
- </lims-table>
- </el-col>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <div class="section-title">澶囦欢纭</div>
+ <el-row :gutter="20">
+ <el-col :span="24" class="spare-toolbar">
+ <el-button type="primary" size="small" @click="addSpareTable">澧炲姞琛�</el-button>
+ </el-col>
+ <el-col :span="24">
+ <lims-table :tableData="list" :column="spareColumns" height="300">
+ <template #name="{ row, index }">
+ <el-input v-if="row.isEdit" size="small" v-model="row.name"></el-input>
+ <span v-else>{{ row.name }}</span>
+ </template>
+ <template #number="{ row, index }">
+ <el-input v-if="row.isEdit" size="small" v-model="row.number"></el-input>
+ <span v-else>{{ row.number }}</span>
+ </template>
+ <template #action="{ row, index }">
+ <div v-if="row.isEdit">
+ <el-button link type="primary" @click="save(index)">淇濆瓨</el-button>
+ <el-button link type="primary">鍙栨秷</el-button>
+ </div>
+ <div v-else>
+ <el-button link type="primary" @click="edit(index)">淇敼</el-button>
+ </div>
+ </template>
+ </lims-table>
+ </el-col>
+ </el-row>
</el-form>
<template #footer><span class="dialog-footer">
<el-button @click="closeDialog">鍙� 娑�</el-button>
@@ -114,9 +197,45 @@
import limsTable from "@/components/Table/lims-table.vue";
import {
addAcceptance, getAcceptanceDetails,
- getStandardSubstanceAll,
updateAcceptance
} from "@/api/cnas/resourceDemand/standardMaterialAccept/standardMaterialAccept";
+import { selectQualifiedSupplierManagementPage } from "@/api/cnas/externalService/supplierManage/supplierManage";
+
+function defaultSubstance() {
+ return {
+ id: undefined,
+ name: undefined,
+ model: undefined,
+ factoryManufacturer: undefined,
+ supplier: undefined,
+ factoryNum: undefined,
+ manageNum: undefined,
+ uncertainty: undefined,
+ quantity: undefined,
+ unit: undefined,
+ acquisitionDate: undefined,
+ effectiveDate: undefined,
+ fileNum: undefined,
+ position: undefined,
+ remark: undefined,
+ }
+}
+
+function defaultAcceptance() {
+ return {
+ id: undefined,
+ producer: undefined, // 鍘傚浠h〃
+ file: undefined, // 鐩稿叧闄勪欢
+ recipient: undefined, // 鎺ユ敹浜�
+ signature: undefined, // 鎺ュ彈绛惧瓧
+ situation: undefined, // 楠屾敹鎯呭喌
+ installation: undefined, // 瀹夎璋冭瘯鎯呭喌
+ substanceId: undefined, // 娓呭崟
+ arriveDate: undefined, // 鍒拌揣鏃ユ湡
+ maintenanceUnit: undefined, // 缁翠慨鍗曚綅
+ }
+}
+
export default {
components: {
limsTable,
@@ -126,19 +245,23 @@
dialogVisible: false,
loading: false,
submitLoading: false,
- acceptance: {
- id: undefined,
- producer: undefined, // 鍘傚浠h〃
- file: undefined, // 鐩稿叧闄勪欢
- recipient: undefined, // 鎺ユ敹浜�
- signature: undefined, // 鎺ュ彈绛惧瓧
- situation: undefined, // 楠屾敹鎯呭喌
- installation: undefined, // 瀹夎璋冭瘯鎯呭喌
- substanceId: undefined, // 娓呭崟
- arriveDate: undefined, // 鍒拌揣鏃ユ湡
- maintenanceUnit: undefined, // 缁翠慨鍗曚綅
- list: [],
+ form: {
+ substance: defaultSubstance(),
+ acceptance: defaultAcceptance(),
},
+ rules: {
+ 'substance.name': [{required: true, message: '璇峰~鍐欐爣鍑嗙墿璐ㄥ悕绉�', trigger: 'blur'}],
+ 'substance.model': [{required: true, message: '璇峰~鍐欒鏍煎瀷鍙�', trigger: 'blur'}],
+ 'substance.factoryNum': [{required: true, message: '璇峰~鍐欏嚭鍘傜紪鍙�', trigger: 'blur'}],
+ 'substance.manageNum': [{required: true, message: '璇峰~鍐欑鐞嗙紪鍙�', trigger: 'blur'}],
+ 'substance.uncertainty': [{required: true, message: '璇峰~鍐欎笉纭畾搴�', trigger: 'blur'}],
+ 'substance.quantity': [{required: true, message: '璇峰~鍐欐暟閲�', trigger: 'blur'}],
+ 'substance.acquisitionDate': [{required: true, message: '璇烽�夋嫨璐疆鏃ユ湡', trigger: 'change'}],
+ 'substance.effectiveDate': [{required: true, message: '璇烽�夋嫨鏈夋晥鏈�', trigger: 'change'}],
+ 'substance.fileNum': [{required: true, message: '璇峰~鍐欐。妗堢紪鍙�', trigger: 'blur'}],
+ 'substance.position': [{required: true, message: '璇峰~鍐欏瓨鏀句綅缃�', trigger: 'blur'}],
+ },
+ supplierOptions: [],
list: [],
spareColumns: [
{
@@ -161,46 +284,52 @@
width: 150
}
],
- options: []
}
- },
- mounted() {
- this.getStand()
},
methods: {
openDialog(id) {
- if(id) {
+ this.loadSuppliers()
+ if (id) {
this.getDetail(id)
} else {
this.clearForm()
}
this.dialogVisible = true
},
+ loadSuppliers() {
+ selectQualifiedSupplierManagementPage({ current: 1, size: 999 }).then(res => {
+ if (res.code === 200) {
+ this.supplierOptions = (res.data.records || []).map(item => ({
+ label: item.supplierName,
+ value: item.supplierName
+ }))
+ }
+ })
+ },
+ onSupplierChange(val) {
+ this.form.acceptance.producer = val || ''
+ },
getDetail(id) {
this.loading = true
- getAcceptanceDetails({id: id}).then(res => {
- this.acceptance = res.data.acceptance
- this.list = res.data.list
+ getAcceptanceDetails({ id: id }).then(res => {
+ this.form.acceptance = res.data.acceptance || defaultAcceptance()
+ this.form.substance = res.data.substance || defaultSubstance()
+ this.list = res.data.list || []
this.loading = false
}).catch(err => {
this.loading = false
})
},
- getStand() {
- getStandardSubstanceAll().then(res => {
- this.options = res.data
- })
- },
addSpareTable() {
this.list.push({
- acceptanceId: this.acceptance.id,
+ acceptanceId: this.form.acceptance.id,
name: '',
number: '',
isEdit: true
})
},
onSuccess(response) {
- this.acceptance.file = response.data
+ this.form.acceptance.file = response.data
},
save(index) {
this.list[index]['isEdit'] = false
@@ -209,39 +338,41 @@
this.list[index]['isEdit'] = true
},
clearForm() {
+ this.form.substance = defaultSubstance()
+ this.form.acceptance = defaultAcceptance()
this.list = []
- this.resetForm('acceptance')
+ this.$nextTick(() => {
+ if (this.$refs.form) {
+ this.$refs.form.clearValidate()
+ }
+ })
},
closeDialog() {
this.clearForm()
- this.resetForm('acceptance')
this.dialogVisible = false
},
submit() {
- if (!this.acceptance.substanceId) {
- this.$message.warning('璇烽�夋嫨娓呭崟')
- return
- }
- this.acceptance.list = this.HaveJson(this.list)
- this.submitLoading = true
- if(this.acceptance.id) {
- updateAcceptance({acceptance: this.acceptance, list: this.list}).then(res => {
- this.$message.success('缂栬緫鎴愬姛')
+ this.$refs.form.validate((valid) => {
+ if (!valid) {
+ return false
+ }
+ const isEdit = !!this.form.acceptance.id
+ this.submitLoading = true
+ const payload = {
+ acceptance: this.form.acceptance,
+ substance: this.form.substance,
+ list: this.HaveJson(this.list)
+ }
+ const request = isEdit ? updateAcceptance : addAcceptance
+ request(payload).then(res => {
this.submitLoading = false
+ this.$message.success(isEdit ? '缂栬緫鎴愬姛' : '鏂板鎴愬姛')
this.closeDialog()
this.$emit('submit')
}).catch((e) => {
this.submitLoading = false
})
- } else {
- addAcceptance({acceptance: this.acceptance, list: this.list}).then(res => {
- this.$message.success('鏂板鎴愬姛')
- this.closeDialog()
- this.$emit('submit')
- }).catch((e) => {
- this.submitLoading = false
- })
- }
+ })
},
},
computed: {
@@ -258,4 +389,34 @@
height: 580px;
overflow-y: auto;
}
+
+.section-title {
+ display: flex;
+ align-items: center;
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--lims-text);
+ padding-bottom: 8px;
+ border-bottom: 1px solid var(--lims-divider);
+ margin: 8px 0 16px;
+}
+
+.section-title:not(:first-child) {
+ margin-top: 24px;
+}
+
+.section-title::before {
+ content: '';
+ display: inline-block;
+ width: 3px;
+ height: 14px;
+ border-radius: 2px;
+ background: var(--el-color-primary);
+ margin-right: 8px;
+}
+
+.spare-toolbar {
+ text-align: right;
+ margin-bottom: 8px;
+}
</style>
--
Gitblit v1.9.3