Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X
This commit is contained in:
@@ -24,8 +24,8 @@
|
||||
<span class="debug-value">{{ mergedItemsText }}</span>
|
||||
</div>
|
||||
</div> -->
|
||||
<el-row :gutter="10" class="panel-group">
|
||||
<el-col :xs="24" :sm="12" :md="12" :lg="12" class="card-panel-col" v-for="item in homeItems" :key="item.key">
|
||||
<el-row :gutter="8" class="panel-group">
|
||||
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="card-panel-col" v-for="item in homeItems" :key="item.key">
|
||||
<div class="card-panel" :class="{ 'is-add': item.isAdd }" @click="handleCardClick(item)">
|
||||
<template v-if="item.isAdd">
|
||||
<div class="card-panel-add">
|
||||
@@ -52,7 +52,7 @@
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-dialog title="配置快捷入口" :visible.sync="configVisible" width="1120px" top="5vh" custom-class="quick-access-dialog">
|
||||
<el-dialog title="配置快捷入口" :visible.sync="configVisible" width="1120px" top="5vh" custom-class="quick-access-dialog" append-to-body>
|
||||
<div class="quick-access-config-bar">
|
||||
<el-form inline size="mini">
|
||||
<el-form-item label="用户">
|
||||
@@ -1185,7 +1185,7 @@ export default {
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.quick-access {
|
||||
margin-top: 18px;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.quick-access-debug-bar {
|
||||
@@ -1395,11 +1395,11 @@ export default {
|
||||
|
||||
.panel-group {
|
||||
.card-panel-col {
|
||||
margin-bottom: 32px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.card-panel {
|
||||
height: 108px;
|
||||
height: 72px;
|
||||
cursor: pointer;
|
||||
font-size: 12px;
|
||||
position: relative;
|
||||
@@ -1408,75 +1408,78 @@ export default {
|
||||
align-items: center;
|
||||
color: #666;
|
||||
background: #fff;
|
||||
border: 1px solid rgba(0, 0, 0, 0.06);
|
||||
border: 1px solid #ebeef5;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.06);
|
||||
box-shadow: 0 2px 8px rgba(15, 23, 42, 0.04);
|
||||
transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease;
|
||||
|
||||
&:hover {
|
||||
transform: translateY(-3px);
|
||||
border-color: rgba(64, 158, 255, 0.35);
|
||||
box-shadow: 0 12px 34px rgba(0, 0, 0, 0.1);
|
||||
transform: translateY(-1px);
|
||||
border-color: rgba(64, 158, 255, 0.28);
|
||||
box-shadow: 0 10px 22px rgba(15, 23, 42, 0.08);
|
||||
|
||||
.card-panel-icon-wrapper {
|
||||
color: #fff;
|
||||
background: linear-gradient(135deg, #409eff 0%, #66b1ff 100%);
|
||||
box-shadow: 0 10px 18px rgba(64, 158, 255, 0.25);
|
||||
border-color: rgba(64, 158, 255, 0.18);
|
||||
background: linear-gradient(135deg, rgba(64, 158, 255, 0.14) 0%, rgba(64, 158, 255, 0.08) 100%);
|
||||
}
|
||||
}
|
||||
|
||||
&.is-add {
|
||||
border-style: dashed;
|
||||
background: #fafafa;
|
||||
background: linear-gradient(180deg, #fbfcfe 0%, #f7f9fc 100%);
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
&.is-add:hover {
|
||||
border-color: rgba(64, 158, 255, 0.5);
|
||||
background: rgba(64, 158, 255, 0.04);
|
||||
background: rgba(64, 158, 255, 0.03);
|
||||
|
||||
.card-panel-add-icon {
|
||||
background: linear-gradient(135deg, #409eff 0%, #66b1ff 100%);
|
||||
color: #fff;
|
||||
box-shadow: 0 10px 18px rgba(64, 158, 255, 0.25);
|
||||
border-color: rgba(64, 158, 255, 0.18);
|
||||
background: linear-gradient(135deg, rgba(64, 158, 255, 0.14) 0%, rgba(64, 158, 255, 0.08) 100%);
|
||||
}
|
||||
}
|
||||
|
||||
.card-panel-icon-wrapper {
|
||||
flex: 0 0 auto;
|
||||
margin: 0 14px 0 14px;
|
||||
padding: 16px;
|
||||
width: 34px;
|
||||
height: 34px;
|
||||
margin: 0 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: all 0.18s ease;
|
||||
border-radius: 10px;
|
||||
border-radius: 8px;
|
||||
color: #409eff;
|
||||
background: linear-gradient(135deg, rgba(64, 158, 255, 0.18) 0%, rgba(64, 158, 255, 0.08) 100%);
|
||||
box-shadow: inset 0 0 0 1px rgba(64, 158, 255, 0.1);
|
||||
border: 1px solid rgba(64, 158, 255, 0.12);
|
||||
background: linear-gradient(135deg, rgba(64, 158, 255, 0.12) 0%, rgba(64, 158, 255, 0.05) 100%);
|
||||
}
|
||||
|
||||
.card-panel-icon {
|
||||
font-size: 34px;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.card-panel-description {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
font-weight: 600;
|
||||
margin: 0 18px 0 0;
|
||||
font-weight: 500;
|
||||
margin: 0 10px 0 0;
|
||||
|
||||
.card-panel-text {
|
||||
line-height: 20px;
|
||||
line-height: 17px;
|
||||
color: rgba(0, 0, 0, 0.75);
|
||||
font-size: 16px;
|
||||
margin-bottom: 6px;
|
||||
font-size: 13px;
|
||||
margin-bottom: 1px;
|
||||
font-weight: 600;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.card-panel-subtext {
|
||||
font-size: 12px;
|
||||
color: rgba(0, 0, 0, 0.45);
|
||||
line-height: 16px;
|
||||
font-size: 10px;
|
||||
color: #909399;
|
||||
line-height: 14px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
@@ -1492,40 +1495,41 @@ export default {
|
||||
|
||||
.card-panel-add-icon {
|
||||
flex: 0 0 auto;
|
||||
width: 56px;
|
||||
height: 56px;
|
||||
margin: 0 14px 0 14px;
|
||||
border-radius: 12px;
|
||||
width: 34px;
|
||||
height: 34px;
|
||||
margin: 0 10px;
|
||||
border-radius: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 26px;
|
||||
font-size: 16px;
|
||||
color: #409eff;
|
||||
background: rgba(64, 158, 255, 0.12);
|
||||
border: 1px solid rgba(64, 158, 255, 0.12);
|
||||
background: linear-gradient(135deg, rgba(64, 158, 255, 0.12) 0%, rgba(64, 158, 255, 0.05) 100%);
|
||||
transition: all 0.18s ease;
|
||||
box-shadow: inset 0 0 0 1px rgba(64, 158, 255, 0.1);
|
||||
}
|
||||
|
||||
.card-panel-add-text {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
margin: 0 18px 0 0;
|
||||
font-weight: 600;
|
||||
margin: 0 10px 0 0;
|
||||
font-weight: 500;
|
||||
|
||||
.card-panel-text {
|
||||
line-height: 20px;
|
||||
line-height: 17px;
|
||||
color: rgba(0, 0, 0, 0.75);
|
||||
font-size: 16px;
|
||||
margin-bottom: 6px;
|
||||
font-size: 13px;
|
||||
margin-bottom: 1px;
|
||||
font-weight: 600;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.card-panel-subtext {
|
||||
font-size: 12px;
|
||||
color: rgba(0, 0, 0, 0.45);
|
||||
line-height: 16px;
|
||||
font-size: 10px;
|
||||
color: #909399;
|
||||
line-height: 14px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
@@ -1555,25 +1559,32 @@ export default {
|
||||
.panel-group {
|
||||
.card-panel {
|
||||
.card-panel-icon-wrapper {
|
||||
margin-right: 10px;
|
||||
padding: 14px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.card-panel-icon {
|
||||
font-size: 30px;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.card-panel-description {
|
||||
margin-right: 12px;
|
||||
|
||||
.card-panel-text {
|
||||
font-size: 15px;
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 1200px) {
|
||||
.panel-group {
|
||||
.card-panel-col {
|
||||
flex: 0 0 20%;
|
||||
max-width: 20%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
.quick-access-config-body {
|
||||
flex-direction: column;
|
||||
@@ -1587,26 +1598,48 @@ export default {
|
||||
|
||||
.panel-group {
|
||||
.card-panel {
|
||||
height: 92px;
|
||||
height: 68px;
|
||||
|
||||
.card-panel-icon-wrapper {
|
||||
padding: 12px;
|
||||
margin: 0 8px;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
.card-panel-icon {
|
||||
font-size: 24px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.card-panel-description {
|
||||
margin-right: 10px;
|
||||
margin-right: 8px;
|
||||
|
||||
.card-panel-text {
|
||||
font-size: 14px;
|
||||
margin-bottom: 6px;
|
||||
font-size: 12px;
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
|
||||
.card-panel-subtext {
|
||||
font-size: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.card-panel-add-icon {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
margin: 0 8px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.card-panel-add-text {
|
||||
margin-right: 8px;
|
||||
|
||||
.card-panel-text {
|
||||
font-size: 12px;
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
|
||||
.card-panel-subtext {
|
||||
font-size: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,6 +183,33 @@ export const dynamicRoutes = [
|
||||
}
|
||||
]
|
||||
},
|
||||
// APS 排产独立页面(用于产需单跳转排产单)
|
||||
{
|
||||
path: '/aps/requirement',
|
||||
component: Layout,
|
||||
hidden: true,
|
||||
children: [
|
||||
{
|
||||
path: '',
|
||||
component: () => import('@/views/wms/post/aps/requirement'),
|
||||
name: 'ApsRequirement',
|
||||
meta: { title: '产需单' }
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
path: '/aps/schedule',
|
||||
component: Layout,
|
||||
hidden: true,
|
||||
children: [
|
||||
{
|
||||
path: '',
|
||||
component: () => import('@/views/wms/post/aps/schedule'),
|
||||
name: 'ApsSchedule',
|
||||
meta: { title: '排产单' }
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
path: '/system/dict-data',
|
||||
component: Layout,
|
||||
|
||||
@@ -1,51 +1,83 @@
|
||||
<template>
|
||||
<div class="dashboard-editor-container">
|
||||
<img src="http://kelunpuzhonggong.com/upload/img/20250427091033.jpg" alt="">
|
||||
|
||||
<div class="aboutus">
|
||||
<el-row :gutter="30">
|
||||
<!-- 左栏 -->
|
||||
<el-col :span="12" :xs="24">
|
||||
<div class="aboutus-title">
|
||||
<h2>关于我们</h2>
|
||||
<p>ABOUT US</p>
|
||||
</div>
|
||||
<div class="aboutus-left">
|
||||
<p class="aboutus-desc">
|
||||
嘉祥科伦普重工有限公司是山东省重点工程项目,是济宁市工程之一,也是科伦普产品结构调整重要的工程项目。工程采用了外方技术总负责、关键设备整体引进、点采集成、国内技术总成、自主创新、单体设备引进等多种建设方案,保证了技术先进和人才的培养,确保工程投产后达产达效。
|
||||
</p>
|
||||
<p class="aboutus-desc">
|
||||
科伦普冷轧重工有限公司是设计年产量150万吨,能向广大用户提供热轧酸洗、热轧镀锌、冷硬、罩式退火、冷轧镀锌、铝锌合金、锌铝合金、锌铝镁、镀铬等各大类产品。产品覆盖东北、华北、华东、华南等地区。
|
||||
</p>
|
||||
</div>
|
||||
<div class="home-workspace">
|
||||
<div class="workspace-shell">
|
||||
<el-row :gutter="20" class="workspace-grid workspace-grid--top">
|
||||
<el-col :xs="24" :sm="24" :md="8" :lg="7" :xl="6">
|
||||
<div class="workspace-card summary-card">
|
||||
<div class="module-title">
|
||||
<h2>关于我们</h2>
|
||||
<p>ABOUT US</p>
|
||||
</div>
|
||||
<div class="aboutus-left">
|
||||
<p class="aboutus-lead">
|
||||
嘉祥科伦普重工有限公司是山东省重点工程项目,也是科伦普产品结构调整的重要工程项目,聚焦高铁装备、模具制造和涂镀新材料研发。
|
||||
</p>
|
||||
<div class="aboutus-metrics">
|
||||
<div class="metric-item">
|
||||
<span class="metric-label">成立时间</span>
|
||||
<span class="metric-value">2017年8月</span>
|
||||
</div>
|
||||
<div class="metric-item">
|
||||
<span class="metric-label">注册资金</span>
|
||||
<span class="metric-value">33100万元</span>
|
||||
</div>
|
||||
<div class="metric-item">
|
||||
<span class="metric-label">设计年产能</span>
|
||||
<span class="metric-value">150万吨</span>
|
||||
</div>
|
||||
<div class="metric-item">
|
||||
<span class="metric-label">覆盖区域</span>
|
||||
<span class="metric-value">东北 华北 华东 华南等</span>
|
||||
</div>
|
||||
</div>
|
||||
<p class="aboutus-desc">
|
||||
工程采用外方技术总负责、关键设备整体引进、国内技术总成、自主创新等多种建设方案,既保证技术先进性,也兼顾人才培养与项目达产达效。
|
||||
</p>
|
||||
<p class="aboutus-desc">
|
||||
公司设计年产量150万吨,产品覆盖热轧酸洗、热轧镀锌、冷硬、罩式退火、冷轧镀锌、铝锌合金、锌铝合金、锌铝镁、镀铬等多个大类。
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</el-col>
|
||||
|
||||
<quick-access-group />
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="16" :lg="17" :xl="18">
|
||||
<div class="workspace-card detail-card">
|
||||
<div class="module-title">
|
||||
<h2>企业介绍</h2>
|
||||
<p>COMPANY PROFILE</p>
|
||||
</div>
|
||||
<div class="aboutus-right">
|
||||
<div class="detail-section">
|
||||
<h3>企业概况</h3>
|
||||
<p class="aboutus-detail">
|
||||
嘉祥科伦普重工有限公司成立于2017年8月,注册资金33100万元,主要经营高铁设备、配件制造与销售,模具制造与销售,新材料技术研发,高性能有色金属及合金材料销售,机械零件、零部件加工与销售,金属材料制造与销售,锌铝镁新材料等。目前公司拥有10余项具有自主知识产权的发明专利技术,综合技术水平达国内领先,2024年公司主导产品国内市场占有率约占85%。2024年总资产5.98亿元,净资产4.49亿元,收入3.95亿元,公司现有员工238人,研究与试验发展人员57人,其中专职研究与试验发展人员52人,外聘专家5人。
|
||||
</p>
|
||||
</div>
|
||||
<div class="detail-section">
|
||||
<h3>项目建设</h3>
|
||||
<p class="aboutus-detail">
|
||||
2024年公司新建科伦普合金新材料研发项目,占地290亩,采用国内先进的镀层核心技术和热处理工艺,专业生产锌铝镁板材和镀铬板材。致力于打造国内工艺链条最完善、产品型号最丰富的涂镀新材料生产企业。全部投产后可实现新增销售收入80亿元,利税4.7亿元,带动就业约500人。项目主要生产的冷轧板、锌铝镁涂层板、镀铬涂层板、镀锡涂层板等产品,涵盖0.08MM-6.0MM区间60多种产品,是国内单个企业产品种类最多的项目。产品因其防锈、耐氧化、耐腐蚀、高电导、高稳定的优秀特性,广泛应用于建筑结构件、汽车制造、轻工家电、食品包装、医疗器械、电子通讯、航空航天领域。
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
|
||||
<!-- 右栏 -->
|
||||
<el-col :span="12" :xs="24">
|
||||
<img src="http://kelunpuzhonggong.com/upload/img/20251015103934.jpg" alt="">
|
||||
<!-- <div class="aboutus-right">
|
||||
<p class="aboutus-detail">
|
||||
嘉祥科伦普重工有限公司成立于2017年8月,注册资金33100万元,主要经营高铁设备、配件制造与销售,模具制造与销售,新材料技术研发,高性能有色金属及合金材料销售,机械零件、零部件加工与销售,金属材料制造与销售,锌铝镁新材料等。目前公司拥有10余项具有自主知识产权的发明专利技术,综合技术水平达国内领先,2024年公司主导产品国内市场占有率约占85%。2024年总资产5.98亿元,净资产4.49亿元,收入3.95亿元,公司现有员工238人,研究与试验发展人员57人,其中专职研究与试验发展人员52人,外聘专家5人。
|
||||
</p>
|
||||
<p class="aboutus-detail">
|
||||
2024年公司新建科伦普合金新材料研发项目,占地290亩,采用国内先进的镀层核心技术和热处理工艺,专业生产锌铝镁板材和镀铬板材。致力于打造国内工艺链条最完善、产品型号最丰富的涂镀新材料生产企业。全部投产后可实现新增销售收入80亿元,利税4.7亿元,带动就业约500人。项目主要生产的冷轧板、锌铝镁涂层板、镀铬涂层板、镀锡涂层板等产品,涵盖0.08MM-6.0MM区间60多种产品,是国内单个企业产品种类最多的项目。产品因其防锈、耐氧化、耐腐蚀、高电导、高稳定的优秀特性,广泛应用于建筑结构件、汽车制造、轻工家电、食品包装、医疗器械、电子通讯、航空航天领域。
|
||||
</p>
|
||||
</div> -->
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div class="workspace-card quick-card quick-card--full">
|
||||
<div class="module-title module-title--inline">
|
||||
<div>
|
||||
<h2>快捷入口</h2>
|
||||
<p>WORKSPACE</p>
|
||||
</div>
|
||||
<span class="module-title-tip">支持按权限自动展示,并可配置本人常用入口</span>
|
||||
</div>
|
||||
<quick-access-group />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <AllApplications />
|
||||
<el-row :gutter="10">
|
||||
<el-col :span="18">
|
||||
<el-empty description="办公模块定制开发中"></el-empty>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<mini-calendar />
|
||||
</el-col>
|
||||
</el-row> -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -67,7 +99,7 @@ export default {
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.dashboard-editor-container {
|
||||
background-color: #fff;
|
||||
background: #f5f7fa;
|
||||
position: relative;
|
||||
|
||||
img {
|
||||
@@ -82,111 +114,270 @@ export default {
|
||||
}
|
||||
}
|
||||
|
||||
// 关于我们区域样式
|
||||
.aboutus {
|
||||
padding: 20px;
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
.home-workspace {
|
||||
padding: 0 60px 32px;
|
||||
}
|
||||
|
||||
// 标题
|
||||
.aboutus-title {
|
||||
margin-bottom: 25px;
|
||||
h2 {
|
||||
font-size: 28px;
|
||||
color: #333;
|
||||
margin: 0;
|
||||
}
|
||||
p {
|
||||
font-size: 14px;
|
||||
color: #999;
|
||||
margin: 5px 0 0 0;
|
||||
}
|
||||
.workspace-shell {
|
||||
width: 100%;
|
||||
max-width: none;
|
||||
margin: 0;
|
||||
margin-top: -36px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.workspace-grid--top {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: stretch;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.workspace-grid--top > .el-col {
|
||||
display: flex;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.workspace-card {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 28px;
|
||||
background: #fff;
|
||||
border: 1px solid rgba(15, 23, 42, 0.05);
|
||||
border-radius: 18px;
|
||||
box-shadow: 0 14px 36px rgba(15, 23, 42, 0.06);
|
||||
}
|
||||
|
||||
.module-title {
|
||||
margin-bottom: 20px;
|
||||
|
||||
h2 {
|
||||
margin: 0;
|
||||
font-size: 28px;
|
||||
line-height: 36px;
|
||||
font-weight: 600;
|
||||
color: #303133;
|
||||
}
|
||||
|
||||
// 左栏
|
||||
.aboutus-left {
|
||||
text-indent: 2em;
|
||||
line-height: 2em;
|
||||
font-size: 14px;
|
||||
|
||||
.aboutus-desc {
|
||||
color: #666;
|
||||
line-height: 1.8;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
// 特色模块
|
||||
.aboutus-features {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin: 30px 0;
|
||||
|
||||
.feature-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
|
||||
.feature-icon {
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
border-radius: 50%;
|
||||
background-color: #9370db; // 截图紫色图标背景
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 10px;
|
||||
|
||||
.icon {
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
}
|
||||
}
|
||||
|
||||
.feature-text {
|
||||
font-size: 14px;
|
||||
color: #333;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 按钮
|
||||
.read-more-btn {
|
||||
border: 1px solid #333;
|
||||
background: transparent;
|
||||
padding: 8px 22px;
|
||||
font-size: 14px;
|
||||
cursor: pointer;
|
||||
transition: background 0.3s;
|
||||
|
||||
&:hover {
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 右栏
|
||||
.aboutus-right {
|
||||
.aboutus-detail {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
line-height: 1.8;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
p {
|
||||
margin: 6px 0 0;
|
||||
font-size: 13px;
|
||||
line-height: 20px;
|
||||
color: #909399;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
}
|
||||
|
||||
// 响应式适配
|
||||
@media (max-width: 1024px) {
|
||||
.dashboard-editor-container {
|
||||
.aboutus {
|
||||
padding: 20px 25px;
|
||||
.module-title--inline {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.el-row {
|
||||
.el-col:first-child {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.module-title-tip {
|
||||
flex: 0 0 auto;
|
||||
font-size: 13px;
|
||||
line-height: 20px;
|
||||
color: #909399;
|
||||
padding-top: 8px;
|
||||
}
|
||||
|
||||
.aboutus-left {
|
||||
font-size: 14px;
|
||||
line-height: 26px;
|
||||
}
|
||||
|
||||
.aboutus-lead {
|
||||
margin: 0;
|
||||
color: #303133;
|
||||
font-size: 15px;
|
||||
line-height: 28px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.aboutus-metrics {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
gap: 10px;
|
||||
margin: 18px 0;
|
||||
}
|
||||
|
||||
.metric-item {
|
||||
min-width: 0;
|
||||
padding: 12px 14px;
|
||||
border-radius: 12px;
|
||||
background: linear-gradient(180deg, #fbfcfe 0%, #f7f9fc 100%);
|
||||
border: 1px solid #eef2f7;
|
||||
}
|
||||
|
||||
.metric-label {
|
||||
display: block;
|
||||
margin-bottom: 6px;
|
||||
font-size: 12px;
|
||||
line-height: 18px;
|
||||
color: #909399;
|
||||
}
|
||||
|
||||
.metric-value {
|
||||
display: block;
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
font-weight: 600;
|
||||
color: #303133;
|
||||
}
|
||||
|
||||
.aboutus-desc,
|
||||
.aboutus-detail {
|
||||
margin: 0;
|
||||
color: #606266;
|
||||
font-size: 14px;
|
||||
line-height: 26px;
|
||||
}
|
||||
|
||||
.aboutus-desc + .aboutus-desc,
|
||||
.aboutus-detail + .aboutus-detail {
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.aboutus-right {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.quick-card {
|
||||
margin-top: 20px;
|
||||
padding: 20px 20px 16px;
|
||||
}
|
||||
|
||||
.quick-card--full {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.quick-card .module-title {
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
|
||||
.summary-card {
|
||||
min-height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.detail-card {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.detail-section + .detail-section {
|
||||
margin-top: 24px;
|
||||
padding-top: 24px;
|
||||
border-top: 1px solid #ebeef5;
|
||||
}
|
||||
|
||||
.detail-section h3 {
|
||||
margin: 0 0 10px;
|
||||
font-size: 18px;
|
||||
line-height: 26px;
|
||||
font-weight: 600;
|
||||
color: #303133;
|
||||
}
|
||||
|
||||
.detail-section .aboutus-detail {
|
||||
font-size: 15px;
|
||||
line-height: 28px;
|
||||
color: #5f6b7a;
|
||||
}
|
||||
|
||||
@media (max-width: 1024px) {
|
||||
.home-workspace {
|
||||
padding: 0 36px 28px;
|
||||
}
|
||||
|
||||
.workspace-shell {
|
||||
margin-top: -20px;
|
||||
}
|
||||
|
||||
.workspace-card {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.quick-card {
|
||||
padding: 18px 18px 14px;
|
||||
}
|
||||
|
||||
.workspace-grid--top > .el-col {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.module-title h2 {
|
||||
font-size: 24px;
|
||||
line-height: 32px;
|
||||
}
|
||||
|
||||
.aboutus-metrics {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.home-workspace {
|
||||
padding: 0 28px 24px;
|
||||
}
|
||||
|
||||
.workspace-shell {
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
.workspace-card {
|
||||
padding: 18px 16px;
|
||||
border-radius: 14px;
|
||||
}
|
||||
|
||||
.quick-card {
|
||||
padding: 16px 14px 12px;
|
||||
}
|
||||
|
||||
.workspace-grid--top {
|
||||
display: block;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.workspace-grid--top > .el-col {
|
||||
display: block;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.module-title--inline {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.module-title-tip {
|
||||
display: block;
|
||||
margin-top: 8px;
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
.detail-card {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.detail-section + .detail-section {
|
||||
margin-top: 18px;
|
||||
padding-top: 18px;
|
||||
}
|
||||
|
||||
.quick-card {
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
|
||||
.aboutus-lead {
|
||||
font-size: 14px;
|
||||
line-height: 26px;
|
||||
}
|
||||
|
||||
.detail-section .aboutus-detail {
|
||||
font-size: 14px;
|
||||
line-height: 26px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -27,16 +27,23 @@
|
||||
<div class="list-container">
|
||||
<div v-for="item in reqList" :key="item.scheduleId" class="list-item"
|
||||
:class="{ active: currentReq && currentReq.scheduleId === item.scheduleId }" @click="handleReqClick(item)">
|
||||
<div class="item-title">
|
||||
{{ item.scheduleNo }}
|
||||
<span class="badge" :class="'badge-' + statusBadgeType(item.scheduleStatus)">{{
|
||||
statusMap[item.scheduleStatus] || '未知' }}</span>
|
||||
</div>
|
||||
<div class="item-sub">
|
||||
生产日期:{{ item.prodDate || '-' }} 客户:{{ item.customerName || '-' }} 业务员:{{ item.businessUser || '-' }}
|
||||
</div>
|
||||
<div class="item-actions">
|
||||
<button class="link-btn" @click.stop="handleDelete(item)">删除</button>
|
||||
<div class="list-item-body">
|
||||
<div class="list-item-left">
|
||||
<div class="item-title">
|
||||
{{ item.scheduleNo }}
|
||||
<span class="badge" :class="'badge-' + statusBadgeType(item.scheduleStatus)">{{
|
||||
statusMap[item.scheduleStatus] || '未知' }}</span>
|
||||
</div>
|
||||
<div class="item-sub">
|
||||
生产日期:{{ item.prodDate || '-' }} 客户:{{ item.customerName || '-' }} 业务员:{{ item.businessUser || '-' }}
|
||||
</div>
|
||||
<div class="item-actions">
|
||||
<button class="link-btn" @click.stop="handleDelete(item)">删除</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="list-item-right">
|
||||
<el-button size="mini" plain @click.stop="handleJumpToSchedule(item)">跳转排产</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="reqList.length === 0 && !reqLoading" style="padding: 40px; text-align: center; color: #909399;">
|
||||
@@ -362,7 +369,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 右侧:产品内容预览 -->
|
||||
<!-- 右侧:产品内容预览 + 已绑定产需单信息 -->
|
||||
<div style="width: 55%; display: flex; flex-direction: column;">
|
||||
<div
|
||||
style="font-size:13px; font-weight:600; color:#2c3e50; margin-bottom:8px; padding-left:8px; border-left:3px solid #ff4d4f;">
|
||||
@@ -382,6 +389,25 @@
|
||||
<span>总数量:{{ bindPreviewTotalQty }} 吨</span>
|
||||
<span>含税总额:{{ bindPreviewTotalAmount }}</span>
|
||||
</div>
|
||||
<!-- 已绑定产需单信息 -->
|
||||
<div v-if="bindPreviewExistingRels.length > 0" style="margin-top:12px; padding-top:10px; border-top:1px dashed #e4e7ed;">
|
||||
<div style="font-size:12px; font-weight:600; color:#e74c3c; margin-bottom:6px;">
|
||||
该订单已绑定以下产需单:
|
||||
</div>
|
||||
<div style="display:flex; flex-wrap:wrap; gap:6px;">
|
||||
<el-tag
|
||||
v-for="rel in bindPreviewExistingRels"
|
||||
:key="rel.scheduleId"
|
||||
size="small"
|
||||
:type="rel.scheduleStatus === 3 ? 'danger' : 'info'"
|
||||
effect="plain"
|
||||
:style="rel.scheduleStatus === 2 ? 'color:#555;border-color:#ccc;background:#f5f5f5;' : ''"
|
||||
>
|
||||
{{ rel.scheduleNo }}
|
||||
<span style="margin-left:4px; opacity:0.7;">{{ bindPreviewRelStatusMap[rel.scheduleStatus] || '' }}</span>
|
||||
</el-tag>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else
|
||||
style="flex:1; display:flex; align-items:center; justify-content:center; color:#bfbfbf; font-size:13px;">
|
||||
@@ -471,6 +497,10 @@ export default {
|
||||
bindPreviewProductName: '',
|
||||
bindPreviewTotalQty: 0,
|
||||
bindPreviewTotalAmount: 0,
|
||||
// 当前预览订单已绑定的产需单列表
|
||||
bindPreviewExistingRels: [],
|
||||
// 产需单状态映射(用于展示绑定状态)
|
||||
bindPreviewRelStatusMap: { 0: '草稿', 1: '待审核', 2: '已下达', 3: '已退回' },
|
||||
|
||||
// 排产明细
|
||||
detailLoading: false,
|
||||
@@ -559,6 +589,18 @@ export default {
|
||||
this.getList()
|
||||
},
|
||||
|
||||
// 跳转到排产单页面(路由跳转)
|
||||
handleJumpToSchedule(item) {
|
||||
this.$router.push({
|
||||
path: '/aps/schedule',
|
||||
query: {
|
||||
prodDate: item.prodDate || '',
|
||||
scheduleNo: item.scheduleNo || '',
|
||||
scheduleStatus: item.scheduleStatus
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
statusBadgeType(status) {
|
||||
return this.statusBadgeMap[status] || 'gray'
|
||||
},
|
||||
@@ -738,6 +780,7 @@ export default {
|
||||
this.bindPreviewProductName = ''
|
||||
this.bindPreviewTotalQty = 0
|
||||
this.bindPreviewTotalAmount = 0
|
||||
this.bindPreviewExistingRels = []
|
||||
this.searchBindOrders()
|
||||
},
|
||||
|
||||
@@ -780,6 +823,29 @@ export default {
|
||||
this.bindPreviewTotalQty = 0
|
||||
this.bindPreviewTotalAmount = 0
|
||||
}
|
||||
// 查询该订单已关联了哪些产需单
|
||||
this.bindPreviewExistingRels = []
|
||||
listRel({ orderId: order.orderId }).then(res => {
|
||||
const rows = res.rows || []
|
||||
// 按 scheduleId 去重,并与当前已有的 reqList 匹配获取单号
|
||||
const seen = new Set()
|
||||
const reqMap = new Map()
|
||||
;(this.reqList || []).forEach(r => reqMap.set(r.scheduleId, r))
|
||||
const unique = []
|
||||
rows.forEach(r => {
|
||||
const key = r.scheduleId
|
||||
if (!key || seen.has(key)) return
|
||||
seen.add(key)
|
||||
// 从已加载的 reqList 中找单号,找不到则不展示(已删除或不在当前页)
|
||||
const match = reqMap.get(key)
|
||||
if (match) {
|
||||
unique.push({ ...r, scheduleNo: match.scheduleNo, scheduleStatus: match.scheduleStatus })
|
||||
}
|
||||
})
|
||||
this.bindPreviewExistingRels = unique
|
||||
}).catch(() => {
|
||||
this.bindPreviewExistingRels = []
|
||||
})
|
||||
},
|
||||
|
||||
confirmBind() {
|
||||
@@ -1038,6 +1104,31 @@ export default {
|
||||
transition: background 0.15s;
|
||||
}
|
||||
|
||||
.list-item-body {
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.list-item-left {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.list-item-right {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.item-actions {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.list-item:hover {
|
||||
background: $aps-silver-1;
|
||||
}
|
||||
@@ -1063,10 +1154,6 @@ export default {
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.list-item .item-actions {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
// ====== 徽标 ======
|
||||
.badge {
|
||||
|
||||
@@ -653,6 +653,13 @@ import ProcessSelect from '@/components/KLPService/ProcessSelect/index.vue'
|
||||
export default {
|
||||
name: 'ApsSchedule',
|
||||
components: { ProcessSelect },
|
||||
props: {
|
||||
// 由 flow.vue 通过 switchApsPage 传入的参数
|
||||
apsParams: {
|
||||
type: Object,
|
||||
default: null
|
||||
}
|
||||
},
|
||||
data() {
|
||||
const today = new Date()
|
||||
const y = today.getFullYear()
|
||||
@@ -726,8 +733,49 @@ export default {
|
||||
)
|
||||
}
|
||||
},
|
||||
watch: {},
|
||||
watch: {
|
||||
// 接收 flow.vue 传入的参数:设置日期并自动查询
|
||||
apsParams: {
|
||||
handler(val) {
|
||||
if (val && val.prodDate) {
|
||||
this.queryDate = val.prodDate
|
||||
}
|
||||
if (val && val.scheduleStatus !== undefined) {
|
||||
// 根据产需单状态自动切换 Tab
|
||||
// 1=待审核 2=已接收 4=已排产
|
||||
const statusToTab = { 1: 'pending', 2: 'accepted', 4: 'scheduled' }
|
||||
const tab = statusToTab[val.scheduleStatus] || 'pending'
|
||||
this.activeTab = tab
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
this.handleQuery()
|
||||
})
|
||||
},
|
||||
immediate: false
|
||||
}
|
||||
},
|
||||
created() {
|
||||
// 优先从路由参数获取(产需单点击"跳转排产"通过 $router.push 传参)
|
||||
const query = this.$route.query
|
||||
// 其次从 apsParams prop 获取(弹窗内由 flow.vue 切换组件传入)
|
||||
const params = this.apsParams
|
||||
|
||||
let hasExternal = false
|
||||
if (query && query.prodDate) {
|
||||
this.queryDate = query.prodDate
|
||||
hasExternal = true
|
||||
if (query.scheduleStatus !== undefined) {
|
||||
const statusToTab = { 1: 'pending', 2: 'accepted', 4: 'scheduled' }
|
||||
this.activeTab = statusToTab[Number(query.scheduleStatus)] || 'pending'
|
||||
}
|
||||
} else if (params && params.prodDate) {
|
||||
this.queryDate = params.prodDate
|
||||
hasExternal = true
|
||||
if (params.scheduleStatus !== undefined) {
|
||||
const statusToTab = { 1: 'pending', 2: 'accepted', 4: 'scheduled' }
|
||||
this.activeTab = statusToTab[params.scheduleStatus] || 'pending'
|
||||
}
|
||||
}
|
||||
this.handleQuery()
|
||||
},
|
||||
methods: {
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
v-if="dynamicComponent && !dialogLoading"
|
||||
:is="dynamicComponent"
|
||||
:key="dialogKey"
|
||||
:aps-params="apsDialogParams"
|
||||
/>
|
||||
</div>
|
||||
</el-dialog>
|
||||
@@ -129,8 +130,7 @@ const NODE_EVENT_CONFIG = {
|
||||
{ id: 'H', label: '选择工艺路线', handler: 'handleOpen', params: { componentPath: 'wms/post/aps/schedule' } },
|
||||
{ id: 'I', label: '自动生成排产项', handler: 'handleOpen', params: { componentPath: 'wms/post/aps/schedule' } },
|
||||
{ id: 'J', label: '已排产明细管理', handler: 'handleOpen', params: { componentPath: 'wms/post/aps/schedule' } },
|
||||
{ id: 'K', label: '按工序绑定钢卷', handler: 'handleOpen', params: { componentPath: 'wms/post/aps/compare' } },
|
||||
{ id: 'L', label: '执行生产', handler: 'handleOpen', params: { componentPath: 'wms/post/aps/schedule' } },
|
||||
{ id: 'K', label: '执行生产', handler: 'handleOpen', params: { componentPath: 'wms/post/aps/schedule' } },
|
||||
],
|
||||
equipmentRepair: [
|
||||
{ id: 'A', label: '创建维修计划', handler: 'handleOpen', params: { componentPath: 'wms/post/eqp/index' } },
|
||||
@@ -164,11 +164,14 @@ const NODE_EVENT_CONFIG = {
|
||||
|
||||
inspection: [
|
||||
{ id: 'A', label: '维护检验方案模板', handler: 'handleOpen', params: { componentPath: 'mes/qc/template/index' } },
|
||||
{ id: 'B', label: '取样/检验数据录入', handler: 'handleOpen', params: { componentPath: 'mes/qc/inspectionSample/index' } },
|
||||
{ id: 'D', label: '常规检验录入', handler: 'handleOpen', params: { componentPath: 'mes/qc/inspectionSample/index' } },
|
||||
{ id: 'B', label: '检验数据录入', handler: 'handleOpen', params: { componentPath: 'mes/qc/inspectionSample/index' } },
|
||||
{ id: 'D', label: '化学检验数据', handler: 'handleOpen', params: { componentPath: 'mes/qc/inspectionSample/index' } },
|
||||
{ id: 'E', label: '拉伸检验(专项)', handler: 'handleOpen', params: { componentPath: 'mes/qc/inspectionTensile/index' } },
|
||||
{ id: 'H', label: '生成质量证明书', handler: 'handleOpen', params: { componentPath: 'mes/qc/certificate/book' } },
|
||||
{ id: 'I', label: '触发质量评审', handler: 'handleOpen', params: { componentPath: 'mes/qc/qualityReview/index' } },
|
||||
{ id: 'F', label: '创建审批申请', handler: 'handleOpen', params: { componentPath: 'mes/qc/approval/index' } },
|
||||
{ id: 'H', label: '审批中', handler: 'handleOpen', params: { componentPath: 'mes/qc/approval/index' } },
|
||||
{ id: 'J', label: '填写检验数据', handler: 'handleOpen', params: { componentPath: 'mes/qc/approval/index' } },
|
||||
{ id: 'M', label: '生成质量证明书', handler: 'handleOpen', params: { componentPath: 'mes/qc/certificate/book' } },
|
||||
{ id: 'N', label: '触发质量评审', handler: 'handleOpen', params: { componentPath: 'mes/qc/qualityReview/index' } },
|
||||
],
|
||||
|
||||
qualityReview: [
|
||||
@@ -320,9 +323,8 @@ graph TD
|
||||
|
||||
H --> I["<b>自动生成排产项</b><br/>按工序步骤分组"]:::p7
|
||||
I --> J["<b>已排产明细管理</b><br/>按步骤查看/编辑<br/>内联修改排产状态"]:::p7
|
||||
J --> K["<b>按工序绑定钢卷</b><br/>将现存钢卷绑定到<br/>对应的排产明细"]:::p8
|
||||
K --> L["<b>执行生产</b>"]:::p9
|
||||
L --> M(["<b>排产完结</b>"]):::pend
|
||||
J --> K["<b>执行生产</b>"]:::p8
|
||||
K --> L(["<b>排产完结</b>"]):::pend
|
||||
|
||||
classDef p1 fill:#409eff,stroke:#337ecc,color:#fff,stroke-width:2px
|
||||
classDef p2 fill:#e6fffa,stroke:#13c2c2,color:#303133,stroke-width:2px
|
||||
@@ -332,7 +334,6 @@ graph TD
|
||||
classDef p6 fill:#fffbe6,stroke:#fadb14,color:#606266,stroke-width:2px
|
||||
classDef p7 fill:#fff0f6,stroke:#eb2f96,color:#303133,stroke-width:2px
|
||||
classDef p8 fill:#f6ffed,stroke:#52c41a,color:#303133,stroke-width:2px
|
||||
classDef p9 fill:#f0f5ff,stroke:#597ef7,color:#303133,stroke-width:2px
|
||||
classDef dec fill:#f9f0ff,stroke:#722ed1,color:#303133,stroke-width:2px
|
||||
classDef pend fill:#dcf7e8,stroke:#52c41a,color:#303133,stroke-width:2px,rx:10,ry:10
|
||||
linkStyle default stroke:#bfbfbf,stroke-width:2px
|
||||
@@ -427,25 +428,34 @@ graph TD
|
||||
|
||||
inspection: `
|
||||
graph TD
|
||||
A["<b>维护检验方案模板</b><br/>定义检验项/单位/标准"]:::i1
|
||||
A --> B["<b>取样/检验数据录入</b><br/>选择方案模板<br/>动态生成检验项表格"]:::i2
|
||||
B --> C{"检验项类型"}:::dec
|
||||
C -->|常规项| D["<b>常规检验录入</b><br/>直接在模板表格<br/>填写检测数据"]:::i3
|
||||
C -->|拉伸试验| E["<b>拉伸检验(专项)</b><br/>独立试验记录<br/>管理明细数据"]:::i4
|
||||
D --> F["<b>汇总检验结果</b>"]:::i5
|
||||
A["<b>维护检验方案模板</b><br/>定义检验项目/单位/标准值"]:::i1
|
||||
A --> B["<b>检验数据录入</b><br/>选择方案模板<br/>填写样品信息<br/>录入检验结果"]:::i2
|
||||
B --> C{"检验类型"}:::dec
|
||||
C -->|化学检验| D["<b>化学检验数据</b><br/>按模板动态生成<br/>检验项表格并填值"]:::i3
|
||||
C -->|物理检验| E["<b>拉伸检验(专项)</b><br/>独立试验记录<br/>管理明细数据"]:::i4
|
||||
D --> F["<b>创建审批申请</b><br/>关联检验记录<br/>填写申请信息"]:::i5
|
||||
E --> F
|
||||
F --> G{"判定"}:::dec
|
||||
G -->|合格| H["<b>生成质量证明书</b><br/>汇总全部检验数据"]:::i6
|
||||
G -->|不合格| I["<b>触发质量评审</b><br/>进入评审流程"]:::i7
|
||||
H --> J(["检验归档"]):::iend
|
||||
F --> G{"审批流转"}:::dec
|
||||
G -->|送审| H["<b>审批中</b><br/>待审批"]:::i6
|
||||
H --> I{"审批"}:::dec
|
||||
I -->|通过| J["<b>填写检验数据</b><br/>录入详细检验结果<br/>含判定"]:::i7
|
||||
I -->|驳回| K["<b>退回修改</b><br/>重新编辑后送审"]:::i8
|
||||
K --> F
|
||||
J --> L{"判定"}:::dec
|
||||
L -->|合格| M["<b>生成质量证明书</b><br/>管理/编辑/打印<br/>支持化学/物理模板"]:::i9
|
||||
L -->|不合格| N["<b>触发质量评审</b><br/>进入评审流程"]:::i10
|
||||
M --> O(["检验归档"]):::iend
|
||||
|
||||
classDef i1 fill:#409eff,stroke:#337ecc,color:#fff,stroke-width:2px
|
||||
classDef i2 fill:#e6fffa,stroke:#13c2c2,color:#303133,stroke-width:2px
|
||||
classDef i3 fill:#fff7e6,stroke:#fa8c16,color:#303133,stroke-width:2px
|
||||
classDef i4 fill:#f0f5ff,stroke:#597ef7,color:#303133,stroke-width:2px
|
||||
classDef i5 fill:#fffbe6,stroke:#fadb14,color:#303133,stroke-width:2px
|
||||
classDef i6 fill:#f6ffed,stroke:#52c41a,color:#303133,stroke-width:2px
|
||||
classDef i7 fill:#fff1f0,stroke:#f5222d,color:#303133,stroke-width:2px
|
||||
classDef i6 fill:#e6f7ff,stroke:#1890ff,color:#303133,stroke-width:2px
|
||||
classDef i7 fill:#f6ffed,stroke:#52c41a,color:#303133,stroke-width:2px
|
||||
classDef i8 fill:#fff1f0,stroke:#f5222d,color:#303133,stroke-width:2px
|
||||
classDef i9 fill:#f0f5ff,stroke:#597ef7,color:#303133,stroke-width:2px
|
||||
classDef i10 fill:#fff1f0,stroke:#f5222d,color:#303133,stroke-width:2px
|
||||
classDef dec fill:#f9f0ff,stroke:#722ed1,color:#303133,stroke-width:2px
|
||||
classDef iend fill:#dcf7e8,stroke:#52c41a,color:#303133,stroke-width:2px,rx:10,ry:10
|
||||
linkStyle default stroke:#bfbfbf,stroke-width:2px
|
||||
@@ -524,6 +534,8 @@ export default {
|
||||
dialogLoading: false,
|
||||
dynamicComponent: null,
|
||||
dialogKey: 0,
|
||||
// APS 页面切换参数(传递给子组件)
|
||||
apsDialogParams: null,
|
||||
}
|
||||
},
|
||||
|
||||
@@ -692,6 +704,7 @@ export default {
|
||||
this.dialogWidth = dialogWidth
|
||||
this.dialogLoading = true
|
||||
this.dynamicComponent = null
|
||||
this.apsDialogParams = params || null
|
||||
|
||||
this.resolveImport(componentPath)
|
||||
.then(module => {
|
||||
@@ -707,6 +720,36 @@ export default {
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* APS 页面间切换(由子组件调用 this.$parent.switchApsPage)
|
||||
* @param {string} componentPath - 相对于 @/views/ 的路径,如 'wms/post/aps/schedule'
|
||||
* @param {object} params - 传递给目标组件的参数
|
||||
* @param {string} title - 弹窗标题
|
||||
*/
|
||||
switchApsPage(componentPath, params, title) {
|
||||
if (!componentPath) {
|
||||
this.$message.warning('组件路径不能为空')
|
||||
return
|
||||
}
|
||||
|
||||
this.dialogLoading = true
|
||||
this.dynamicComponent = null
|
||||
this.apsDialogParams = params || null
|
||||
if (title) this.dialogTitle = title
|
||||
|
||||
this.resolveImport(componentPath)
|
||||
.then(module => {
|
||||
this.dynamicComponent = module.default || module
|
||||
})
|
||||
.catch(err => {
|
||||
console.error('[FlowChart] switchApsPage error:', err)
|
||||
this.$message.error('组件加载失败: ' + (err.message || '未知错误'))
|
||||
})
|
||||
.finally(() => {
|
||||
this.dialogLoading = false
|
||||
})
|
||||
},
|
||||
|
||||
resolveImport(componentPath) {
|
||||
// 与 src/store/modules/permission.js 的 loadView 同款模式
|
||||
// componentPath 相对于 @/views/,如 'crm/order/index'
|
||||
@@ -721,6 +764,7 @@ export default {
|
||||
handleDialogClosed() {
|
||||
this.dynamicComponent = null
|
||||
this.dialogKey++
|
||||
this.apsDialogParams = null
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user