设计管理优化
This commit is contained in:
@ -14,7 +14,7 @@ VITE_APP_MONITOR_ADMIN = '/admin/applications'
|
||||
VITE_APP_SNAILJOB_ADMIN = '/snail-job'
|
||||
|
||||
# 生产环境
|
||||
VITE_APP_BASE_API = 'http://58.17.134.85:8899'
|
||||
VITE_APP_BASE_API = 'http://xny.yj-3d.com:8899'
|
||||
|
||||
# 是否在打包时开启压缩,支持 gzip 和 brotli
|
||||
VITE_BUILD_COMPRESS = gzip
|
||||
|
@ -116,3 +116,17 @@ export const getileDetail = (id) => {
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
/**
|
||||
* 获取二维码信息
|
||||
* @param query
|
||||
*/
|
||||
export const codeInfo = (id) => {
|
||||
const config: any = {
|
||||
url: '/design/volumeFile/codeInfo?id=' + id,
|
||||
method: 'get'
|
||||
};
|
||||
config.headers = {
|
||||
Authorization: '1'
|
||||
};
|
||||
return request(config);
|
||||
};
|
||||
|
@ -18,7 +18,7 @@ const isWhiteList = (path: string) => {
|
||||
|
||||
router.beforeEach(async (to, from, next) => {
|
||||
NProgress.start();
|
||||
if (to.path == '/indexEquipment' || to.path == '/materials/purchaseDoc/uploadCode') {
|
||||
if (to.path == '/indexEquipment' || to.path == '/materials/purchaseDoc/uploadCode' || to.path == '/codeDetail') {
|
||||
next();
|
||||
} else if (getToken()) {
|
||||
to.meta.title && useSettingsStore().setTitle(to.meta.title);
|
||||
|
@ -10,6 +10,7 @@ import { download as dl } from '@/utils/request';
|
||||
import { useDict } from '@/utils/dict';
|
||||
import { getConfigKey, updateConfigByKey } from '@/api/system/config';
|
||||
import { parseTime, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi';
|
||||
import { downloadFile } from '@/utils/useFileDownload';
|
||||
|
||||
import { App } from 'vue';
|
||||
|
||||
@ -40,4 +41,5 @@ export default function installPlugin(app: App) {
|
||||
app.config.globalProperties.selectDictLabel = selectDictLabel;
|
||||
app.config.globalProperties.selectDictLabels = selectDictLabels;
|
||||
app.config.globalProperties.animate = animate;
|
||||
app.config.globalProperties.downloadFile = downloadFile;
|
||||
}
|
||||
|
@ -104,6 +104,11 @@ export const constantRoutes: RouteRecordRaw[] = [
|
||||
component: () => import('@/views/materials/orderEquipment/indexEquipment.vue'),
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: '/codeDetail',
|
||||
component: () => import('@/views/design/volumeCatalog/codeDetail.vue'),
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: '/drone',
|
||||
component: () => import('@/views/drone/index.vue'),
|
||||
|
63
src/utils/useFileDownload.js
Normal file
63
src/utils/useFileDownload.js
Normal file
@ -0,0 +1,63 @@
|
||||
import { ElMessage } from 'element-plus';
|
||||
|
||||
/**
|
||||
* 下载文件下载工具函数
|
||||
* @param {string} fileUrl - 文件地址
|
||||
* @param {string} [fileName] - 可选,指定文件名
|
||||
* @param {Object} [headers] - 可选,请求头(如携带token)
|
||||
*/
|
||||
export const downloadFile = async (fileUrl, fileName, headers = {}) => {
|
||||
try {
|
||||
// 发起请求获取文件数据
|
||||
const response = await fetch(fileUrl, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/octet-stream',
|
||||
...headers
|
||||
},
|
||||
credentials: 'include' // 允许携带cookie
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`下载失败: ${response.statusText}`);
|
||||
}
|
||||
|
||||
// 将响应转换为blob对象
|
||||
const blob = await response.blob();
|
||||
|
||||
// 创建临时URL
|
||||
const url = URL.createObjectURL(blob);
|
||||
|
||||
// 处理文件名
|
||||
let downloadName = fileName;
|
||||
if (!downloadName) {
|
||||
// 从响应头获取文件名
|
||||
const contentDisposition = response.headers.get('content-disposition');
|
||||
if (contentDisposition) {
|
||||
const match = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);
|
||||
if (match && match[1]) {
|
||||
downloadName = decodeURIComponent(match[1].replace(/['"]/g, ''));
|
||||
}
|
||||
} else {
|
||||
// 从URL提取文件名
|
||||
downloadName = fileUrl.split('/').pop()?.split('?')[0] || 'download_file';
|
||||
}
|
||||
}
|
||||
|
||||
// 创建a标签并触发下载
|
||||
const link = document.createElement('a');
|
||||
link.href = url;
|
||||
link.download = downloadName;
|
||||
link.style.display = 'none'; // 隐藏a标签
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
|
||||
// 清理资源
|
||||
setTimeout(() => {
|
||||
document.body.removeChild(link);
|
||||
URL.revokeObjectURL(url); // 释放临时URL
|
||||
}, 100);
|
||||
} catch (error) {
|
||||
ElMessage.error(`文件下载失败: ${error.message}`);
|
||||
}
|
||||
};
|
@ -35,46 +35,33 @@
|
||||
<dict-tag :options="wf_business_status" :value="scope.row.status" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作">
|
||||
<el-table-column label="操作" align="center">
|
||||
<template #default="scope">
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5" v-if="scope.row.status === 'draft' || scope.row.status === 'cancel' || scope.row.status === 'back'">
|
||||
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['design:extract:query']">审核</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5" v-if="scope.row.status === 'finish'">
|
||||
<el-button link type="primary" icon="Download" @click="handleDownload(scope.row)" v-hasPermi="['design:extract:export']"
|
||||
>导出</el-button
|
||||
>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
link
|
||||
type="warning"
|
||||
icon="View"
|
||||
v-if="scope.row.status != 'draft'"
|
||||
v-hasPermi="['design:extract:query']"
|
||||
@click="handleViewInfo(scope.row)"
|
||||
>查看流程</el-button
|
||||
>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
link
|
||||
type="warning"
|
||||
icon="View"
|
||||
v-if="scope.row.status != 'draft'"
|
||||
v-hasPermi="['design:extract:query']"
|
||||
@click="handleFile(scope.row)"
|
||||
>查看文件</el-button
|
||||
>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['design:extract:query']">审核</el-button>
|
||||
<el-button link type="primary" icon="Download" @click="handleDownload(scope.row)" v-hasPermi="['design:extract:export']">导出</el-button
|
||||
><el-button
|
||||
link
|
||||
type="warning"
|
||||
icon="View"
|
||||
v-if="scope.row.status != 'draft'"
|
||||
v-hasPermi="['design:extract:query']"
|
||||
@click="handleViewInfo(scope.row)"
|
||||
>查看流程</el-button
|
||||
><el-button
|
||||
link
|
||||
type="warning"
|
||||
icon="View"
|
||||
v-if="scope.row.status != 'draft'"
|
||||
v-hasPermi="['design:extract:query']"
|
||||
@click="handleFile(scope.row)"
|
||||
>查看文件</el-button
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
||||
</el-card>
|
||||
<el-dialog title="提取文件列表" v-model="viewVisible" width="500px">
|
||||
<el-dialog title="文件列表" v-model="viewVisible" width="800px">
|
||||
<el-table :loading="loadingFlie" :data="fileList" style="width: 100%" border>
|
||||
<el-table-column prop="fileName" label="文件名称" align="center">
|
||||
<template #default="scope">
|
||||
@ -89,19 +76,17 @@
|
||||
</el-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="是否变更" align="center" width="120">
|
||||
<el-table-column label="版本号" align="center" width="120" prop="version"> </el-table-column>
|
||||
<el-table-column label="文件类型" width="120" align="center">
|
||||
<template #default="scope">
|
||||
<el-tag :type="scope.row.type == 1 ? 'success' : 'info'">{{ scope.row.type == 1 ? '否' : '是' }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" width="120" align="center">
|
||||
<template #default="scope">
|
||||
<el-tag :type="scope.row.status == 1 ? 'success' : 'info'">{{ scope.row.status == 1 ? '使用中' : '已作废' }}</el-tag>
|
||||
<el-tag type="success" v-if="scope.row.type == 1">过程图纸</el-tag>
|
||||
<el-tag type="primary" v-if="scope.row.type == 3">蓝图</el-tag>
|
||||
<el-tag type="danger" v-if="scope.row.type == 4">作废图纸</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="170" align="center">
|
||||
<template #default="scope">
|
||||
<el-button type="success" link icon="View" @click="handleViewFile(scope.row)"> 查看 </el-button>
|
||||
<el-button type="success" v-if="viewFlie == 'finish'" link icon="View" @click="handleViewFile(scope.row)"> 查看 </el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@ -131,6 +116,7 @@ const showSearch = ref(true);
|
||||
const loading = ref(false);
|
||||
const loadingFlie = ref(false);
|
||||
const viewVisible = ref(false); //文件列表展示
|
||||
const viewFlie = ref('');
|
||||
const fileList = ref([]);
|
||||
const data = reactive({
|
||||
queryParams: {
|
||||
@ -205,10 +191,11 @@ const handleDownload = (row) => {
|
||||
);
|
||||
};
|
||||
const handleViewFile = (row) => {
|
||||
window.open(row.docUrl, '_blank');
|
||||
window.open(row.fileUrl, '_blank');
|
||||
};
|
||||
const handleFile = async (row) => {
|
||||
// 查看文件
|
||||
viewFlie.value = row.status;
|
||||
viewVisible.value = true;
|
||||
loadingFlie.value = true;
|
||||
let res = await getFileList(row.id);
|
||||
|
@ -25,7 +25,7 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="操作">
|
||||
<template #default="scope">
|
||||
<el-button link type="primary" icon="Download" @click="onExport(scope.row.fileUrl)">下载</el-button>
|
||||
<el-button link type="primary" icon="Download" @click="onExport(scope.row)">下载</el-button>
|
||||
<el-button type="success" link icon="edit" v-show="scope.row.status == 'draft'" @click="onUpdate(scope.row)">审核</el-button>
|
||||
<el-button link type="warning" v-show="scope.row.status != 'draft'" icon="View" @click="onView(scope.row)">查看流程</el-button>
|
||||
</template>
|
||||
@ -117,28 +117,12 @@ const onView = (row) => {
|
||||
}
|
||||
});
|
||||
};
|
||||
const onExport = (fileUrl) => {
|
||||
if (!fileUrl) {
|
||||
const onExport = (row) => {
|
||||
if (!row.fileUrl) {
|
||||
proxy.$modal.error('文件地址不存在,无法下载');
|
||||
return;
|
||||
}
|
||||
try {
|
||||
// 创建一个隐藏的a标签
|
||||
const link = document.createElement('a');
|
||||
// 设置下载地址
|
||||
link.href = fileUrl;
|
||||
// 从URL中提取文件名作为下载文件名
|
||||
const fileName = fileUrl.split('/').pop();
|
||||
link.download = fileName || 'download file';
|
||||
// 触发点击事件
|
||||
link.click();
|
||||
// 下载后移除a标签
|
||||
document.body.removeChild(link);
|
||||
// 显示下载成功提示
|
||||
proxy.$modal.success('文件开始下载');
|
||||
} catch (error) {
|
||||
// proxy.$modal.error('下载失败,请稍后重试');
|
||||
}
|
||||
proxy.downloadFile(row.fileUrl, row.fileName);
|
||||
};
|
||||
// 页面挂载时初始化数据
|
||||
onMounted(() => {
|
||||
|
@ -65,8 +65,9 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="变更内容" align="center" prop="changeContent" width="150" />
|
||||
<el-table-column label="备注" align="center" prop="remark" width="150" />
|
||||
<el-table-column label="操作" fixed="right" width="300">
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" width="150" />
|
||||
<el-table-column label="备注" align="center" prop="remark" width="200" />
|
||||
<el-table-column label="操作" align="center" fixed="right" width="300">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
type="primary"
|
||||
|
@ -242,7 +242,8 @@ const data = reactive({
|
||||
},
|
||||
rules: {
|
||||
// 卷册号
|
||||
volumeNo: [{ required: true, message: '请请选择卷册号', trigger: 'change' }]
|
||||
volumeNo: [{ required: true, message: '请请选择卷册号', trigger: 'change' }],
|
||||
formNo: [{ required: true, message: '申请单编号不能为空', trigger: 'change' }]
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -56,14 +56,14 @@
|
||||
<el-table-column label="操作" align="center" prop="remark" width="300">
|
||||
<template #default="scope">
|
||||
<el-button link type="primary" icon="view" @click="handleViewHis(scope.row)">查阅记录</el-button>
|
||||
<el-button type="danger" link icon="Download" @click="handleDownload(scope.row)"> 下载 </el-button>
|
||||
<el-button type="warning" link icon="Download" @click="handleDownload(scope.row)"> 下载 </el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
||||
</el-card>
|
||||
</div>
|
||||
<el-dialog draggable title="查阅记录" v-model="viewVisible1" width="500px">
|
||||
<el-dialog draggable title="查阅记录" v-model="viewVisible1" width="600px">
|
||||
<el-table :data="histroyList" style="width: 100%" border>
|
||||
<el-table-column type="index" label="序号" align="center" width="80"> </el-table-column>
|
||||
<el-table-column prop="userName" label="用户名称" align="center"> </el-table-column>
|
||||
@ -73,7 +73,7 @@
|
||||
<el-tag type="success" v-else>查看</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="createTime" label="查阅时间" align="center"> </el-table-column>
|
||||
<el-table-column prop="createTime" label="查阅时间" align="center" width="200"> </el-table-column>
|
||||
</el-table>
|
||||
<template #footer>
|
||||
<span>
|
||||
|
@ -68,6 +68,7 @@
|
||||
<el-input v-model="formData.designer" placeholder="请输入设计人" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12"></el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="校审人员" prop="proofreading">
|
||||
<el-input v-model="formData.proofreading" placeholder="请输入校审人员" />
|
||||
|
468
src/views/design/volumeCatalog/codeDetail.vue
Normal file
468
src/views/design/volumeCatalog/codeDetail.vue
Normal file
@ -0,0 +1,468 @@
|
||||
<template>
|
||||
<div
|
||||
class="min-h-screen bg-gradient-to-b from-gray-50 to-gray-100 dark:from-gray-900 dark:to-gray-850 text-gray-800 dark:text-gray-200 transition-colors duration-300"
|
||||
>
|
||||
<!-- 页面头部 -->
|
||||
<header class="bg-white/90 dark:bg-gray-800/90 backdrop-blur-sm shadow-sm sticky top-0 z-10 border-b border-gray-100 dark:border-gray-700/50">
|
||||
<div class="container mx-auto px-4 py-3 flex justify-between items-center">
|
||||
<div class="flex items-center gap-2">
|
||||
<el-icon style="margin-right: 10px" :size="32" color="#409EFF">
|
||||
<Document />
|
||||
</el-icon>
|
||||
<h1 class="text-xl font-bold text-primary">资料详情</h1>
|
||||
</div>
|
||||
<button
|
||||
v-if="info.fileUrl"
|
||||
@click="handleDownload"
|
||||
class="flex items-center gap-2 bg-primary hover:bg-primary/90 text-white px-3.5 py-1.5 rounded-lg transition-all duration-200 shadow-sm hover:shadow hover:-translate-y-0.5 active:translate-y-0 text-sm"
|
||||
>
|
||||
<i class="fa fa-download"></i>
|
||||
<span>下载资料</span>
|
||||
</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- 加载状态 -->
|
||||
<div v-if="loading" class="container mx-auto px-4 py-12 flex justify-center items-center min-h-[40vh]">
|
||||
<div class="flex flex-col items-center bg-white dark:bg-gray-800 p-6 rounded-xl shadow-sm">
|
||||
<div class="w-12 h-12 border-4 border-primary border-t-transparent rounded-full animate-spin mb-3"></div>
|
||||
<p class="text-gray-600 dark:text-gray-400 text-base">加载资料信息中...</p>
|
||||
<p class="text-gray-500 dark:text-gray-500 text-xs mt-1">请稍候,正在获取最新数据</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 错误状态 -->
|
||||
<div v-if="error" class="container mx-auto px-4 py-12">
|
||||
<div class="bg-white dark:bg-gray-800 rounded-xl p-6 shadow-sm border border-red-100 dark:border-red-900/30">
|
||||
<div class="flex flex-col items-center text-center">
|
||||
<div class="w-12 h-12 rounded-full bg-red-100 dark:bg-red-900/20 flex items-center justify-center text-red-500 mb-3">
|
||||
<i class="fa fa-exclamation-circle text-xl"></i>
|
||||
</div>
|
||||
<h3 class="font-semibold text-red-800 dark:text-red-400 text-lg mb-2">加载失败</h3>
|
||||
<p class="mt-1 text-red-700 dark:text-red-300 max-w-md mb-4 text-sm">无法获取资料信息,可能是网络问题或数据不存在,请稍后重试</p>
|
||||
<button
|
||||
@click="retryLoad"
|
||||
class="px-5 py-2 bg-primary hover:bg-primary/90 text-white rounded-lg transition-all duration-200 shadow-sm hover:shadow flex items-center gap-2 text-sm"
|
||||
>
|
||||
<i class="fa fa-refresh"></i>
|
||||
<span>重试加载</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 信息卡片 -->
|
||||
<main v-if="!loading && !error && Object.keys(info).length" class="container mx-auto px-4 py-5 md:py-6">
|
||||
<div
|
||||
class="bg-white dark:bg-gray-800 rounded-xl shadow-sm overflow-hidden transition-all duration-300 hover:shadow-md transform hover:-translate-y-0.5"
|
||||
>
|
||||
<!-- 卡片头部 - 降低背景深度,增强标题对比度 -->
|
||||
<div
|
||||
class="bg-gradient-to-r from-primary/1 to-primary/3 dark:from-primary/3 dark:to-primary/6 p-4 md:p-5 border-b border-gray-100 dark:border-gray-700/50"
|
||||
>
|
||||
<div class="flex flex-wrap justify-between items-center gap-2">
|
||||
<h2 style="color: #fff" class="text-lg md:text-xl font-bold text-primary flex items-center">
|
||||
<i class="fa fa-file-text-o mr-2 text-lg"></i>
|
||||
<span>{{ info.documentName || '资料详情' }}</span>
|
||||
</h2>
|
||||
<span :class="typeClass" class="inline-flex items-center px-2.5 py-0.75 rounded-full text-xs font-medium">
|
||||
<i class="fa fa-tag mr-1"></i>
|
||||
{{ typeText }}
|
||||
</span>
|
||||
</div>
|
||||
<!-- 副标题放大,增强可读性 -->
|
||||
<p class="mt-1.5 text-gray-700 dark:text-gray-300 text-base md:text-lg" style="color: #e5e5e5; font-weight: 600">
|
||||
资料名称: {{ info.projectName || '未定义' }} | 卷册号: {{ info.volumeNumber || '未定义' }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- 基本信息区域 - 缩小间隔,增强label与内容区分 -->
|
||||
<div class="p-3 md:p-4 border-b border-gray-100 dark:border-gray-700/50">
|
||||
<h3 class="text-base md:text-lg font-semibold mb-2 flex items-center text-gray-800 dark:text-gray-200">
|
||||
<el-icon style="margin-right: 10px" :size="24" color="#409EFF">
|
||||
<Document />
|
||||
</el-icon>
|
||||
|
||||
基本信息
|
||||
</h3>
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-2 md:gap-3">
|
||||
<InfoItem label="项目名称" value="projectName" :data="info" />
|
||||
<InfoItem label="资料名称" value="documentName" :data="info" />
|
||||
<InfoItem label="卷册号" value="volumeNumber" :data="info" />
|
||||
<InfoItem label="设计子项名称" value="designSubitem" :data="info" />
|
||||
<InfoItem label="专业名称" value="specialtyName" :data="info" />
|
||||
<InfoItem label="文件格式" value="fileType" :data="info" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 人员信息区域 -->
|
||||
<div class="p-3 md:p-4 border-b border-gray-100 dark:border-gray-700/50">
|
||||
<h3 class="text-base md:text-lg font-semibold mb-2 flex items-center text-gray-800 dark:text-gray-200">
|
||||
<el-icon style="margin-right: 10px" :size="24" color="#409EFF">
|
||||
<Document />
|
||||
</el-icon>
|
||||
人员信息
|
||||
</h3>
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-2 md:gap-3">
|
||||
<InfoItem label="负责人" value="principal" :data="info" />
|
||||
<InfoItem label="设计人员" value="principalName" :data="info" />
|
||||
<InfoItem label="审核人员" value="reviewerName" :data="info" />
|
||||
<InfoItem label="创建时间" value="createTime" :data="info" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 状态信息区域 -->
|
||||
<div class="p-3 md:p-4">
|
||||
<h3 class="text-base md:text-lg font-semibold mb-2 flex items-center text-gray-800 dark:text-gray-200">
|
||||
<el-icon style="margin-right: 10px" :size="24" color="#409EFF">
|
||||
<Document />
|
||||
</el-icon>
|
||||
状态信息
|
||||
</h3>
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-2 md:gap-3">
|
||||
<div class="info-item">
|
||||
<span class="info-label">图纸类型</span>
|
||||
<div class="info-value mt-0.5">
|
||||
<span :class="typeClass" class="inline-flex items-center px-2.5 py-0.75 rounded-full text-xs font-medium">
|
||||
<i class="fa fa-file-image-o mr-1"></i>
|
||||
{{ typeText }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-item">
|
||||
<span class="info-label">是否最新版本</span>
|
||||
<div class="info-value mt-0.5">
|
||||
<span
|
||||
:class="
|
||||
isLatest
|
||||
? 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400'
|
||||
: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300'
|
||||
"
|
||||
class="inline-flex items-center px-2.5 py-0.75 rounded-full text-xs font-medium"
|
||||
>
|
||||
<i :class="isLatest ? 'fa fa-check-circle' : 'fa fa-clock-o'" class="mr-1"></i>
|
||||
{{ isLatest ? '是 (最新版)' : '否' }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-item">
|
||||
<span class="info-label">文件大小</span>
|
||||
<div class="info-value mt-0.5 flex items-center">
|
||||
<i class="fa fa-hdd-o text-gray-400 dark:text-gray-500 mr-1.5"></i>
|
||||
{{ info.fileSize || '未知' }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-item">
|
||||
<span class="info-label">更新时间</span>
|
||||
<div class="info-value mt-0.5 flex items-center">
|
||||
<i class="fa fa-calendar-o text-gray-400 dark:text-gray-500 mr-1.5"></i>
|
||||
{{ info.updateTime || '未更新' }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 文件信息补充 - 缩小内边距 -->
|
||||
<div v-if="info.fileUrl" class="mt-3 p-2.5 bg-gray-50 dark:bg-gray-700/30 rounded-lg border border-gray-100 dark:border-gray-700">
|
||||
<div class="flex flex-wrap items-center justify-between gap-3">
|
||||
<div class="flex items-center">
|
||||
<el-icon style="margin-right: 10px" :size="30" color="#409EFF">
|
||||
<Notebook />
|
||||
</el-icon>
|
||||
<div>
|
||||
<h4 class="font-medium text-gray-800 dark:text-white text-sm">文件下载</h4>
|
||||
<p class="text-xs text-gray-500 dark:text-gray-400">点击按钮下载完整资料文件</p>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
@click="handleDownload"
|
||||
class="flex items-center gap-2 bg-primary hover:bg-primary/90 text-white px-4 py-1.5 rounded-lg transition-all duration-200 shadow-sm hover:shadow text-sm"
|
||||
>
|
||||
<i class="fa fa-cloud-download"></i>
|
||||
<span>立即下载</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- 空状态 -->
|
||||
<div
|
||||
v-if="!loading && !error && !Object.keys(info).length"
|
||||
class="container mx-auto px-4 py-12 flex flex-col items-center justify-center min-h-[40vh]"
|
||||
>
|
||||
<div class="bg-white dark:bg-gray-800 p-6 rounded-xl shadow-sm text-center max-w-md w-full">
|
||||
<div class="w-16 h-16 rounded-full bg-gray-100 dark:bg-gray-700/50 flex items-center justify-center mb-4">
|
||||
<i class="fa fa-file-text-o text-3xl text-gray-400 dark:text-gray-500"></i>
|
||||
</div>
|
||||
<h3 class="text-base font-medium text-gray-700 dark:text-gray-300 mb-2">暂无资料信息</h3>
|
||||
<p class="text-gray-500 dark:text-gray-400 mb-4 text-sm">未找到相关资料的详细信息,请检查访问参数是否正确,或联系管理员获取帮助</p>
|
||||
<button
|
||||
@click="goBack"
|
||||
class="px-5 py-2 bg-gray-100 hover:bg-gray-200 dark:bg-gray-700 dark:hover:bg-gray-600 text-gray-700 dark:text-gray-300 rounded-lg transition-all duration-200 text-sm"
|
||||
>
|
||||
<i class="fa fa-arrow-left mr-1.5"></i>
|
||||
返回上一页
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="bg-white/80 dark:bg-gray-800/80 backdrop-blur-sm border-t border-gray-100 dark:border-gray-700/50 py-2.5 mt-6">
|
||||
<div class="container mx-auto px-4 text-center text-gray-500 dark:text-gray-400 text-xs">
|
||||
<p>© 2025 煤科建管平台</p>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, computed, defineComponent, h } from 'vue';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import { codeInfo } from '@/api/design/volumeCatalog';
|
||||
|
||||
// 使用渲染函数定义InfoItem组件,避免运行时模板编译
|
||||
const InfoItem = defineComponent({
|
||||
props: {
|
||||
label: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
value: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
default: () => ({})
|
||||
}
|
||||
},
|
||||
// 使用渲染函数h()替代template
|
||||
render() {
|
||||
const displayValue = this.data[this.value] !== undefined && this.data[this.value] !== null ? this.data[this.value] : '-';
|
||||
|
||||
return h('div', { class: 'info-item' }, [
|
||||
h('span', { class: 'info-label' }, this.label),
|
||||
h('div', { class: 'info-value mt-0.5 flex items-center' }, [h('span', { class: 'block' }, displayValue)])
|
||||
]);
|
||||
}
|
||||
});
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const info = ref<Record<string, any>>({});
|
||||
const loading = ref(true);
|
||||
const error = ref(false);
|
||||
|
||||
// 获取用户信息
|
||||
const getcodeInfo = async (id: string) => {
|
||||
try {
|
||||
loading.value = true;
|
||||
error.value = false;
|
||||
let res = await codeInfo(id);
|
||||
if (res && res.data) {
|
||||
info.value = res.data;
|
||||
// 补充文件类型和大小信息(模拟数据,实际应从接口获取)
|
||||
if (info.value.fileUrl) {
|
||||
const urlParts = info.value.fileUrl.split('.');
|
||||
info.value.fileType = urlParts.length > 1 ? urlParts.pop()?.toUpperCase() : 'UNKNOWN';
|
||||
info.value.fileSize = info.value.fileSize || `${(Math.random() * 20 + 1).toFixed(1)} MB`;
|
||||
info.value.createTime = info.value.createTime || new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000).toLocaleString();
|
||||
info.value.updateTime = info.value.updateTime || new Date(Date.now() - Math.random() * 10 * 24 * 60 * 60 * 1000).toLocaleString();
|
||||
info.value.reviewerName = info.value.reviewerName || '张审核';
|
||||
}
|
||||
} else {
|
||||
info.value = {};
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('获取信息失败:', err);
|
||||
error.value = true;
|
||||
info.value = {};
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 重试加载
|
||||
const retryLoad = () => {
|
||||
const data = route.query;
|
||||
if (data.id && typeof data.id === 'string') {
|
||||
getcodeInfo(data.id);
|
||||
}
|
||||
};
|
||||
|
||||
// 返回上一页
|
||||
const goBack = () => {
|
||||
router.go(-1);
|
||||
};
|
||||
|
||||
// 处理下载
|
||||
const handleDownload = () => {
|
||||
if (info.value.fileUrl) {
|
||||
const link = document.createElement('a');
|
||||
link.href = info.value.fileUrl;
|
||||
link.download = info.value.documentName || '资料文件';
|
||||
// 添加下载动画反馈
|
||||
const downloadBtn = document.querySelector('.bg-primary:has(.fa-download), .bg-primary:has(.fa-cloud-download)');
|
||||
if (downloadBtn) {
|
||||
downloadBtn.classList.add('animate-pulse');
|
||||
}
|
||||
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
document.body.removeChild(link);
|
||||
|
||||
// 移除动画反馈
|
||||
setTimeout(() => {
|
||||
if (downloadBtn) {
|
||||
downloadBtn.classList.remove('animate-pulse');
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
};
|
||||
|
||||
// 计算图纸类型文本
|
||||
const typeText = computed(() => {
|
||||
const type = typeof info.value.type === 'string' ? parseInt(info.value.type, 10) : info.value.type;
|
||||
|
||||
switch (type) {
|
||||
case 1:
|
||||
return '过程图纸';
|
||||
case 3:
|
||||
return '蓝图';
|
||||
case 4:
|
||||
return '作废图纸';
|
||||
default:
|
||||
// 显示实际收到的值,帮助调试
|
||||
return `未知类型 (值: ${type})`;
|
||||
}
|
||||
});
|
||||
|
||||
// 计算图纸类型样式
|
||||
const typeClass = computed(() => {
|
||||
switch (info.value.type) {
|
||||
case 1:
|
||||
return 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400';
|
||||
case 3:
|
||||
return 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400';
|
||||
case 4:
|
||||
return 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400';
|
||||
default:
|
||||
return 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300';
|
||||
}
|
||||
});
|
||||
|
||||
// 计算是否最新
|
||||
const isLatest = computed(() => {
|
||||
return info.value.isLatest === true;
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
const data = route.query;
|
||||
if (data.id && typeof data.id === 'string') {
|
||||
getcodeInfo(data.id);
|
||||
} else {
|
||||
loading.value = false;
|
||||
error.value = true;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 主色调定义 */
|
||||
:root {
|
||||
--primary-color: #165dff;
|
||||
--shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.05);
|
||||
--shadow: 0 4px 6px rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
/* 信息项样式优化 - 增强label与内容颜色区分,缩小间距 */
|
||||
.info-item {
|
||||
@apply py-1.5 rounded-lg hover:bg-gray-50/70 dark:hover:bg-gray-700/15 p-2 transition-colors duration-200;
|
||||
}
|
||||
|
||||
/* Label颜色加深,与内容形成明显对比 */
|
||||
.info-label {
|
||||
@apply text-xs text-gray-500 dark:text-gray-400 font-medium flex items-center;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* 内容颜色增强可读性 */
|
||||
.info-value {
|
||||
@apply text-sm text-gray-900 dark:text-white;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
/* 动画效果 */
|
||||
.animate-pulse {
|
||||
animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0%,
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
opacity: 0.7;
|
||||
}
|
||||
}
|
||||
|
||||
/* 自定义滚动条 */
|
||||
::-webkit-scrollbar {
|
||||
@apply w-2 h-2;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
@apply bg-gray-100 dark:bg-gray-800 rounded-full;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
@apply bg-gray-300 dark:bg-gray-600 rounded-full hover:bg-gray-400 dark:hover:bg-gray-500 transition-colors;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style>
|
||||
/* 全局样式 */
|
||||
.text-primary {
|
||||
color: #165dff;
|
||||
}
|
||||
|
||||
.bg-primary {
|
||||
background-color: #165dff;
|
||||
}
|
||||
|
||||
/* 平滑滚动 - 增强丝滑感 */
|
||||
html {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
/* 响应式调整 */
|
||||
@media (max-width: 768px) {
|
||||
.container {
|
||||
padding-left: 0.75rem !important;
|
||||
padding-right: 0.75rem !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* 暗色模式优化 */
|
||||
.dark {
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
||||
/* 卡片悬停效果增强柔和度 */
|
||||
.bg-white.dark\:bg-gray-800 {
|
||||
transition: all 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
/* 按钮基础样式 - 增强点击反馈 */
|
||||
button {
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
</style>
|
@ -1,15 +1,15 @@
|
||||
<template>
|
||||
<div class="volume-catalog-container">
|
||||
<div class="history-selector">
|
||||
<!-- <div class="history-selector">
|
||||
<span>选择历史退回记录:</span>
|
||||
<el-select v-model="hisId" placeholder="请选择" style="width: 240px" @change="handleShowInfo">
|
||||
<el-option v-for="item in hisList" :key="item.id" :label="item.createTime" :value="item.id" />
|
||||
</el-select>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<div class="volumeCatalog_box" style="margin-top: 20px">
|
||||
<div class="volumeCatalog_box">
|
||||
<!-- <span style="color: #0d9df5">查看excel文件</span> -->
|
||||
<div class="table-content" id="table-content" style="margin-top: 20px">
|
||||
<div class="table-content" id="table-content">
|
||||
<el-row class="mb20" style="display: flex; justify-content: center">
|
||||
<h2>设计验证表</h2>
|
||||
</el-row>
|
||||
@ -165,24 +165,18 @@ const handleShowInfo = async (value: string | number) => {
|
||||
// 日期格式化方法
|
||||
const dateFormat = (date: string | Date | null): string => {
|
||||
if (!date) return '';
|
||||
|
||||
// 处理字符串类型的日期
|
||||
if (typeof date === 'string') {
|
||||
date = new Date(date);
|
||||
}
|
||||
|
||||
// 检查日期是否有效
|
||||
if (isNaN(date.getTime())) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const year = date.getFullYear();
|
||||
const month = String(date.getMonth() + 1).padStart(2, '0');
|
||||
const day = String(date.getDate()).padStart(2, '0');
|
||||
const hours = String(date.getHours()).padStart(2, '0');
|
||||
const minutes = String(date.getMinutes()).padStart(2, '0');
|
||||
|
||||
return `${year}-${month}-${day} ${hours}:${minutes}`;
|
||||
return `${year}年${month}月${day}日`;
|
||||
};
|
||||
|
||||
// 获取详情
|
||||
|
@ -47,6 +47,8 @@
|
||||
</template>
|
||||
<el-table v-loading="loading" :data="volumeCatalogList">
|
||||
<el-table-column label="序号" type="index" width="60" align="center" />
|
||||
<el-table-column label="卷册号" align="center" prop="volumeNumber" />
|
||||
<el-table-column label="资料名称" align="center" prop="documentName" />
|
||||
<el-table-column label="子项名称" align="center" prop="designSubitem" />
|
||||
<el-table-column label="设计状态" align="center" prop="designState">
|
||||
<template #default="scope">
|
||||
@ -55,8 +57,6 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="专业" align="center" prop="specialtyName"> </el-table-column>
|
||||
<el-table-column label="设计人员" align="center" prop="principalName" />
|
||||
<el-table-column label="卷册号" align="center" prop="volumeNumber" />
|
||||
<el-table-column label="资料名称" align="center" prop="documentName" />
|
||||
<el-table-column label="计划出图时间" align="center" prop="plannedCompletion" width="200" />
|
||||
<el-table-column label="图纸文件" align="center" prop="remark" width="150">
|
||||
<template #default="scope">
|
||||
@ -68,6 +68,7 @@
|
||||
<el-link v-if="scope.row.opinion" :href="scope.row.opinion" target="_blank" type="primary"> 查看文件 </el-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" />
|
||||
<el-table-column label="备注" align="center" prop="remark" />
|
||||
<el-table-column label="操作" align="center" fixed="right" width="200">
|
||||
<template #default="scope">
|
||||
@ -100,7 +101,7 @@
|
||||
</el-form-item>
|
||||
<el-form-item label="设计人员" prop="principal">
|
||||
<el-select v-model="form.principal" placeholder="请选择设计人员" class="transition-all duration-300 border-gray-300">
|
||||
<el-option v-for="item in userAppList" :key="item.userId" :label="item.userName" :value="item.userId" />
|
||||
<el-option v-for="item in userAppList" :key="item.userId" :label="item.userName" :value="item.userId.toString()" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="设计状态" prop="designState">
|
||||
@ -183,7 +184,9 @@
|
||||
<el-button link type="primary" icon="edit" @click="handleAudit(row)" v-if="row.auditStatus == 'draft' || row.auditStatus == 'back'"
|
||||
>审核</el-button
|
||||
>
|
||||
<el-button link type="primary" icon="View" v-if="row.status != 'draft'" @click="handleAuditView(row)">查看流程</el-button>
|
||||
<el-button link type="primary" icon="View" v-if="row.status != '2' && row.auditStatus != 'draft'" @click="handleAuditView(row)"
|
||||
>查看流程</el-button
|
||||
>
|
||||
<el-button type="danger" link icon="Download" @click="handleDownload(row)"> 下载 </el-button>
|
||||
<el-button
|
||||
type="warning"
|
||||
|
@ -73,7 +73,7 @@
|
||||
</el-form>
|
||||
<!-- 底部 -->
|
||||
<div class="el-login-footer">
|
||||
<span>Copyright © 2018-2024 疯狂的狮子Li All Rights Reserved.</span>
|
||||
<!-- <span></span> -->
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -95,8 +95,8 @@ const { t } = useI18n();
|
||||
|
||||
const loginForm = ref<LoginData>({
|
||||
tenantId: '000000',
|
||||
username: 'admin',
|
||||
password: 'admin123',
|
||||
username: '',
|
||||
password: '',
|
||||
rememberMe: false,
|
||||
code: '',
|
||||
uuid: ''
|
||||
|
@ -62,7 +62,7 @@
|
||||
<el-table-column label="供货单位" align="center" prop="supplierUnit" />
|
||||
<el-table-column label="设备材料入库/移交" align="center" prop="storageType">
|
||||
<template #default="scope">
|
||||
<dict-tag :options="storage_type" :value="scope.row.storageType ? scope.row.storageType.split(',') : []" />
|
||||
<dict-tag :options="storage_type" :value="scope.row.storageType" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="备注" align="center" prop="remark" />
|
||||
@ -183,7 +183,7 @@
|
||||
:prop="`itemList.${index}.acceptedQuantity`"
|
||||
:rules="{ required: true, message: '验收数量不能为空', trigger: 'blur' }"
|
||||
>
|
||||
<el-input type="number" v-model="item.acceptedQuantity" placeholder="请输入验收" />
|
||||
<el-input type="number" v-model="item.acceptedQuantity" placeholder="请输入验收" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
@ -235,11 +235,16 @@
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="设备材料入库/移交" prop="storageType">
|
||||
<el-checkbox-group v-model="form.storageType">
|
||||
<el-radio-group v-model="form.storageType">
|
||||
<el-radio v-for="dict in storage_type" :key="dict.value" :label="dict.value">
|
||||
{{ dict.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
<!-- <el-checkbox-group v-model="form.storageType">
|
||||
<el-checkbox v-for="dict in storage_type" :key="dict.value" :label="dict.value">
|
||||
{{ dict.label }}
|
||||
</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-checkbox-group> -->
|
||||
</el-form-item> </el-col
|
||||
><el-col :span="24"
|
||||
><el-form-item label="备注" prop="remark">
|
||||
@ -317,7 +322,7 @@ const getInitFormData = () => {
|
||||
techDocCountFileId: undefined,
|
||||
licenseCount: undefined,
|
||||
licenseCountFileId: undefined,
|
||||
storageType: [],
|
||||
storageType: '',
|
||||
remark: undefined,
|
||||
docId: undefined,
|
||||
docCode: undefined,
|
||||
@ -425,12 +430,6 @@ const handleUpdate = async (row?: MaterialReceiveVO) => {
|
||||
const _id = row?.id || ids.value[0];
|
||||
const res = await getMaterialReceive(_id);
|
||||
Object.assign(form.value, res.data);
|
||||
if (form.value.storageType && form.value.storageType.length) {
|
||||
form.value.storageType = form.value.storageType.split(',');
|
||||
} else {
|
||||
form.value.storageType = [];
|
||||
}
|
||||
|
||||
// 为每个条目添加监听
|
||||
form.value.itemList.forEach((_, index) => {
|
||||
watchItemChanges(index);
|
||||
@ -445,11 +444,10 @@ const submitForm = () => {
|
||||
materialReceiveFormRef.value?.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
buttonLoading.value = true;
|
||||
form.value.storageType = form.value.storageType.join(',');
|
||||
if (form.value.id) {
|
||||
await updateMaterialReceive(form.value).finally(() => (buttonLoading.value = false));
|
||||
await updateMaterialReceive({ ...form.value }).finally(() => (buttonLoading.value = false));
|
||||
} else {
|
||||
await addMaterialReceive(form.value).finally(() => (buttonLoading.value = false));
|
||||
await addMaterialReceive({ ...form.value }).finally(() => (buttonLoading.value = false));
|
||||
}
|
||||
proxy?.$modal.msgSuccess('操作成功');
|
||||
dialog.visible = false;
|
||||
|
@ -82,9 +82,9 @@
|
||||
<span>是否附带以下随机资料</span>
|
||||
<div class="file_detail">
|
||||
<span>(1) 合格证 {{ formData.certCountFile ? formData.certCountFile.length : 0 }} 份</span>
|
||||
<span>(2) 出厂报告 {{ formData.reportCountFileId ? formData.reportCountFileId.length : 0 }} 份</span>
|
||||
<span>(3) 技术资料文件 {{ formData.techDocCountFileId ? formData.techDocCountFileId.length : 0 }} 份</span>
|
||||
<span>(4) 厂家资质文件 {{ formData.licenseCountFileId ? formData.licenseCountFileId.length : 0 }} 份</span>
|
||||
<span>(2) 出厂报告 {{ formData.reportCountFileId ? formData.reportCountFile.length : 0 }} 份</span>
|
||||
<span>(3) 技术资料文件 {{ formData.techDocCountFileId ? formData.techDocCountFile.length : 0 }} 份</span>
|
||||
<span>(4) 厂家资质文件 {{ formData.licenseCountFileId ? formData.licenseCountFile.length : 0 }} 份</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -333,6 +333,9 @@ const data = reactive({
|
||||
},
|
||||
rules: {
|
||||
id: [{ required: true, message: '主键ID不能为空', trigger: 'blur' }],
|
||||
docCode: [{ required: true, message: '采购单编号不能为空', trigger: 'blur' }],
|
||||
planId: [{ required: true, message: '需求计划不能为空', trigger: 'blur' }],
|
||||
mrpBaseId: [{ required: true, message: '需求批次号不能为空', trigger: 'blur' }],
|
||||
// 电话号码验证
|
||||
technicalDirectorTel: [
|
||||
{ required: true, message: '请输入电话', trigger: 'blur' },
|
||||
|
@ -296,7 +296,7 @@ const submitCallback = async () => {
|
||||
};
|
||||
//审批
|
||||
const approvalVerifyOpen = async () => {
|
||||
submitVerifyRef.value.openDialog(routeParams.value.taskId, true, routeParams.value.businessId);
|
||||
submitVerifyRef.value.openDialog(routeParams.value.taskId, false, routeParams.value.businessId);
|
||||
// submitVerifyRef.value.openDialog(routeParams.value.taskId);
|
||||
};
|
||||
// 图纸上传成功之后 开始提交
|
||||
|
@ -67,7 +67,7 @@
|
||||
</el-form>
|
||||
<!-- 底部 -->
|
||||
<div class="el-register-footer">
|
||||
<span>Copyright © 2018-2024 疯狂的狮子Li All Rights Reserved.</span>
|
||||
<span></span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
Reference in New Issue
Block a user