From 49cdc0884a9a4381cd968cffff65e2a332bc675a Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期六, 24 十月 2026 21:05:29 +0800
Subject: [PATCH] feat(cnas-search): 1.标准查新模块 2.印章使用记录
---
src/views/CNAS/process/method/standardNoveltyRetrieval/component/FormDialog.vue | 231 ++++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 185 insertions(+), 46 deletions(-)
diff --git a/src/views/CNAS/process/method/standardNoveltyRetrieval/component/FormDialog.vue b/src/views/CNAS/process/method/standardNoveltyRetrieval/component/FormDialog.vue
index 1f92114..5f666ba 100644
--- a/src/views/CNAS/process/method/standardNoveltyRetrieval/component/FormDialog.vue
+++ b/src/views/CNAS/process/method/standardNoveltyRetrieval/component/FormDialog.vue
@@ -1,47 +1,89 @@
<template>
<div>
- <el-dialog v-model="formDia" title="鏂板" width="80%" @close="closeDia">
- <el-form ref="form" :model="form" :rules="formRules" label-width="auto">
- <el-button size="small" type="primary" @click="addBtn">娣诲姞涓�鏉�</el-button>
+ <el-dialog v-model="formDia" title="鏂板" width="800px" @close="closeDia">
+ <el-form ref="form" :model="form" :rules="formRules" label-width="120px">
<div class="form-info">
- <div v-for="(items,index) in form.taskRel" :key="index">
- <el-col :span="12">
- <el-form-item :prop="`taskRel.${index}.newMethodName`" :rules="{required: true, message: '璇峰~鍐欐爣鍑嗗悕绉�',trigger: 'blur',}" label="鏂版爣鍑嗗悕绉帮細">
- <el-input v-model="items.newMethodName" size="small"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item :prop="`taskRel.${index}.newStandardNo`" :rules="{required: true,message: '璇峰~鍐欐爣鍑嗗彿',trigger: 'blur',}" label="鏂版爣鍑嗗彿锛�">
- <el-input v-model="items.newStandardNo" size="small"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item :prop="`taskRel.${index}.searchNewSource`" :rules="{required: true,message: '璇烽�夋嫨鏌ユ柊璁板綍鏉ユ簮',trigger: 'change',}" label="鏌ユ柊璁板綍鏉ユ簮锛�">
- <el-radio-group v-model="items.searchNewSource">
- <el-radio :value="0">鏍囧噯缃�</el-radio>
- <el-radio :value="1">濮旀墭鎯呮姤</el-radio>
- <el-radio :value="2">鏍囧噯鏁�</el-radio>
- <el-radio :value="3">鍏朵粬</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item :prop="`taskRel.${index}.remark`" :rules="{required: false,message: '璇烽�夋嫨澶囨敞',trigger: 'change',}" label="澶囨敞锛�">
- <el-select v-model="items.remark" :prop="`taskRel.${index}.remark`"
- :rules="{required: false,message: '璇烽�夋嫨澶囨敞',trigger: 'change',}"
- clearable size="small">
- <el-option :value="0" label="浣滃簾"></el-option>
- <el-option :value="1" label="鏇挎崲"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="4">
- <el-button v-if="index !== 0" circle :icon="$icon('el-icon-delete')" size="small" type="danger" @click="deleteHeaderRow(index)"></el-button>
- </el-col>
- <el-col :span="24">
- <el-divider></el-divider>
- </el-col>
+ <div v-for="(items,index) in form.taskRel" :key="index" class="record-block">
+ <div class="record-head">
+ <span class="record-title">
+ <span class="record-index">{{ index + 1 }}</span>
+ 鏌ユ柊璁板綍
+ </span>
+ <el-button v-if="index !== 0" link type="danger" :icon="$icon('el-icon-delete')"
+ @click="deleteHeaderRow(index)">鍒犻櫎鏈潯</el-button>
+ </div>
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item :prop="`taskRel.${index}.methodName`" :rules="{required: true, message: '璇峰~鍐欐爣鍑嗗悕绉�',trigger: 'blur',}" label="鏍囧噯鍚嶇О锛�">
+ <el-input v-model="items.methodName" size="small"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item :prop="`taskRel.${index}.standardNo`" :rules="{required: true,message: '璇峰~鍐欐爣鍑嗗彿',trigger: 'blur',}" label="鏍囧噯鍙凤細">
+ <el-input v-model="items.standardNo" size="small"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item :prop="`taskRel.${index}.fileNo`" :rules="{required: true,message: '璇峰~鍐欐枃浠剁紪鍙�',trigger: 'blur',}" label="鏂囦欢缂栧彿锛�">
+ <el-input v-model="items.fileNo" size="small"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item :prop="`taskRel.${index}.searchNewTime`" :rules="{required: true,message: '璇烽�夋嫨鏌ユ柊鏃ユ湡',trigger: 'change',}" label="鏌ユ柊鏃ユ湡锛�">
+ <el-date-picker v-model="items.searchNewTime" type="date" value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD" placeholder="璇烽�夋嫨鏃ユ湡" size="small"
+ style="width: 100%;" @change="refreshDefaultNextSearchDate(items)"></el-date-picker>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="涓嬫鏌ユ柊鏃ユ湡锛�">
+ <el-input v-if="isSearchRetired(items.searchNewResult)" model-value="涓嶉�傜敤" size="small" disabled />
+ <el-date-picker v-else v-model="items.nextSearchDate" type="date" value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD" placeholder="榛樿涓変釜鏈堝悗锛屽彲淇敼" size="small"
+ style="width: 100%;" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鏌ユ柊浜猴細">
+ <el-input :model-value="currentUserName" size="small" disabled></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item :prop="`taskRel.${index}.searchNewResult`" :rules="{required: true,message: '璇烽�夋嫨鏌ユ柊缁撴灉',trigger: 'change',}" label="鏌ユ柊缁撴灉锛�">
+ <el-select v-model="items.searchNewResult" placeholder="璇烽�夋嫨" style="width: 100%"
+ @change="handleSearchResultChange(items)">
+ <el-option v-for="result in searchResultOptions" :key="result" :label="result" :value="result" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="24">
+ <el-form-item :prop="`taskRel.${index}.searchNewSource`" :rules="{required: true,message: '璇烽�夋嫨鏌ユ柊璁板綍鏉ユ簮',trigger: 'change',}" label="鏌ユ柊璁板綍鏉ユ簮锛�">
+ <el-radio-group v-model="items.searchNewSource">
+ <el-radio v-for="source in searchSourceOptions" :key="source.value" :value="source.value">{{ source.label }}</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-col>
+ <el-col v-if="items.searchNewSource === 3" :span="24">
+ <el-form-item :prop="`taskRel.${index}.searchNewWebsite`"
+ label="鍏朵粬鏉ユ簮鍚嶇О锛�">
+ <el-input v-model="items.searchNewWebsite" size="small" placeholder="閫夊~锛屾棤闇�濉啓缃戝潃"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col v-if="items.searchNewResult === '宸蹭慨璁�/鏈夋柊鐗堟湰鏇夸唬'" :span="12">
+ <el-form-item :prop="`taskRel.${index}.newMethodName`" :rules="{required: true,message: '璇峰~鍐欐柊鏍囧噯鍚嶇О',trigger: 'blur',}" label="鏂版爣鍑嗗悕绉帮細">
+ <el-input v-model="items.newMethodName" size="small"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col v-if="items.searchNewResult === '宸蹭慨璁�/鏈夋柊鐗堟湰鏇夸唬'" :span="12">
+ <el-form-item :prop="`taskRel.${index}.newStandardNo`" :rules="{required: true,message: '璇峰~鍐欐柊鏍囧噯鍙�',trigger: 'blur',}" label="鏂版爣鍑嗗彿锛�">
+ <el-input v-model="items.newStandardNo" size="small"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
</div>
+ </div>
+ <div class="add-btn-wrap">
+ <el-button class="add-btn" @click="addBtn">娣诲姞涓�鏉�</el-button>
</div>
</el-form>
<template #footer><span class="dialog-footer">
@@ -54,6 +96,8 @@
<script>
import { addMethodSearchNew } from '@/api/cnas/process/method/standardNoveltyRetrieval'
+import useUserStore from '@/store/modules/user'
+import { calculateNextSearchDate, isSearchRetired, searchResultOptions, searchSourceOptions } from '../options'
export default {
name: 'FormDialog',
@@ -63,13 +107,21 @@
// 杩欓噷瀛樻斁鏁版嵁
return {
formDia: false,
+ searchResultOptions,
+ searchSourceOptions,
form: {
taskRel: [
{
+ methodName: '',
+ standardNo: '',
+ fileNo: '',
+ searchNewTime: '',
+ nextSearchDate: '',
+ searchNewResult: '',
+ searchNewWebsite: '',
+ searchNewSource: '',
newMethodName: '',
newStandardNo: '',
- searchNewSource: '',
- remark: '',
}
]
},
@@ -78,14 +130,34 @@
info: {},
};
},
+ computed: {
+ currentUserName() {
+ const user = useUserStore()
+ return user.nickName || user.name || user.userName
+ }
+ },
// 鏂规硶闆嗗悎
methods: {
+ isSearchRetired,
openDia (row) {
this.formDia = true
},
// 娣诲姞涓�鏉�
addBtn() {
- this.form.taskRel.push({ newMethodName: '', newStandardNo:'', searchNewSource: '', remark: ''});
+ this.form.taskRel.push({ methodName: '', standardNo: '', fileNo: '', searchNewTime: '',
+ nextSearchDate: '', searchNewResult: '', searchNewWebsite: '', searchNewSource: '',
+ newMethodName: '', newStandardNo: '' });
+ },
+ refreshDefaultNextSearchDate(item) {
+ item.nextSearchDate = isSearchRetired(item.searchNewResult) ? null
+ : calculateNextSearchDate(item.searchNewTime)
+ },
+ handleSearchResultChange(item) {
+ if (isSearchRetired(item.searchNewResult)) {
+ item.nextSearchDate = null
+ } else if (!item.nextSearchDate) {
+ this.refreshDefaultNextSearchDate(item)
+ }
},
// 鍒犻櫎涓�鏉�
deleteHeaderRow (index) {
@@ -95,7 +167,14 @@
this.$refs['form'].validate((valid) => {
if (valid) {
this.editLoad = true
- addMethodSearchNew(this.form.taskRel).then(res => {
+ const records = this.form.taskRel.map(item => ({
+ ...item,
+ searchNewTime: `${item.searchNewTime} 00:00:00`,
+ searchNewWebsite: item.searchNewSource === 3 ? item.searchNewWebsite : null,
+ newMethodName: item.searchNewResult === '宸蹭慨璁�/鏈夋柊鐗堟湰鏇夸唬' ? item.newMethodName : null,
+ newStandardNo: item.searchNewResult === '宸蹭慨璁�/鏈夋柊鐗堟湰鏇夸唬' ? item.newStandardNo : null
+ }))
+ addMethodSearchNew(records).then(res => {
this.editLoad = false
this.$message.success('鎿嶄綔鎴愬姛')
this.closeDia()
@@ -120,10 +199,70 @@
<style scoped>
.form-info {
- display: inline-block;
- max-height: 42em;
+ max-height: 52vh;
overflow-y: auto;
+ padding-right: 4px;
}
+
+.record-block {
+ background: #fafafa;
+ border: 1px solid #ebeef5;
+ border-radius: 6px;
+ padding: 14px 16px 0;
+ margin-bottom: 14px;
+}
+
+.record-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding-bottom: 10px;
+ margin-bottom: 14px;
+ border-bottom: 1px dashed #e4e7ed;
+}
+
+.record-title {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--el-text-color-primary);
+}
+
+.record-index {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 20px;
+ height: 20px;
+ border-radius: 50%;
+ background: var(--el-color-primary);
+ color: #fff;
+ font-size: 12px;
+}
+
+.add-btn-wrap {
+ margin-top: 4px;
+}
+
+.add-btn {
+ width: 100%;
+ color: var(--el-color-primary);
+ border: 1px dashed var(--el-color-primary);
+ background: transparent;
+}
+
+.add-btn:hover {
+ color: var(--el-color-primary);
+ border-color: var(--el-color-primary);
+ background: var(--el-color-primary-light-9);
+}
+
+:deep(.record-block .el-form-item) {
+ margin-bottom: 16px;
+}
+
:deep(.el-dialog) {
margin: 6vh auto 50px !important;
}
--
Gitblit v1.9.3