chore: 完成多系统功能迭代与优化

1. 通用优化:
   - 统一系统标题为"库房客户端"/"MES产线控制",移除北自所前缀
   - 调整内置账号密码为统一123456,优化密码校验逻辑
   - 新增数据库自动创建逻辑,简化部署流程
   - 修复日志时间格式配置,优化日志输出
   - 新增纯数字密码安全提示

2. MES系统优化:
   - 新增日排产管理功能,支持增删改查与自动算料生成备料单
   - 重构BOM模块,改为按产品编码维护而非工单维度
   - 新增工艺参数模板配置与手动报工页面
   - 新增产品类型自动编码功能
   - 优化菜单结构,调整工单管理、扫码报工等页面名称与路由
   - 新增删除日排产接口与权限保护
   - 修复物料清单查询逻辑,适配新BOM结构
   - 新增refreshToken支持,优化登录会话管理

3. WMS系统优化:
   - 新增基础数据维护页面,支持区域与物料档案管理
   - 新增工单列表下拉接口,对接MES获取未完成工单优先展示
   - 优化入库管理提示文案,替换英文提示为中文
   - 修复精密件入库校验逻辑,优化错误提示
   - 优化Excel导入功能,新增备注字段支持
   - 优化登录页面与菜单文案,统一备料台账名称
   - 新增自动打开浏览器功能,优化客户端启动体验
   - 修复备料出库页面查询提示文案
   - 新增WMS与MES对接配置,完善内部API调用逻辑

4. 其他优化:
   - 删除冗余的旧版静态资源文件,更新资源引用路径
   - 新增帮助文档,完善基础数据模块说明
   - 修复多处文案不统一、英文残留问题
This commit is contained in:
SunYF
2026-08-29 15:30:25 +08:00
parent e82b744bbd
commit ebf901ad16
124 changed files with 1815 additions and 480 deletions
+88 -16
View File
@@ -1,21 +1,52 @@
<template>
<el-card>
<el-form inline>
<el-form-item label="SN"><el-input v-model="scan.sn" style="width:170px" /></el-form-item>
<el-form-item label="工单号"><el-input v-model="scan.orderNo" style="width:170px" /></el-form-item>
<el-form-item label="工位"><el-input v-model="scan.station" style="width:90px" /></el-form-item>
<el-form-item label="类型">
<el-select v-model="scan.type" placeholder="请选择类型" style="width:130px">
<el-option label="进线ONLINE" value="ONLINE" />
<el-option label="工序PROCESS" value="PROCESS" />
<el-option label="完工DONE" value="DONE" />
<el-option label="暂存TEMP_STORE" value="TEMP_STORE" />
<el-form-item label="工位">
<el-select v-model="form.stationNo" placeholder="请选择工位" style="width:110px">
<el-option v-for="i in 12" :key="i" :value="i" :label="`工位${i}`" />
</el-select>
</el-form-item>
<el-form-item label="工序号"><el-input-number v-model="scan.processCode" :min="0" /></el-form-item>
<el-form-item><el-button type="primary" @click="report">扫码报工</el-button></el-form-item>
<el-form-item label="工件SN"><el-input v-model="form.sn" style="width:170px" @change="loadSteps" /></el-form-item>
<el-form-item label="工序号"><el-input-number v-model="form.processCode" :min="1" :max="12" @change="loadSteps" /></el-form-item>
<el-form-item><el-button type="primary" @click="loadSteps">载入参数模板</el-button></el-form-item>
</el-form>
<!-- 参数采集区按已维护的步骤模板动态渲染 -->
<el-card v-if="steps.length" shadow="never" style="margin-bottom:12px">
<div slot="header" style="display:flex;justify-content:space-between;align-items:center">
<b>工位 {{ form.stationNo }} / 工序 {{ form.processCode }} 参数采集</b>
<el-button type="primary" size="small" :loading="saving" @click="submit">提交报工</el-button>
</div>
<el-table :data="steps" border size="small">
<el-table-column prop="seq" label="步骤" width="60" align="center" />
<el-table-column prop="name" label="步骤名称" min-width="130" />
<el-table-column label="采集方式" width="130" align="center">
<template #default="{ row }">
<el-tag v-if="row.collectType === 'AUTO'" type="warning" size="small">拧紧枪自动</el-tag>
<el-tag v-else-if="row.collectType === 'MANUAL'" type="primary" size="small">手填</el-tag>
<el-tag v-else type="info" size="small">仅记录</el-tag>
</template>
</el-table-column>
<el-table-column label="采集值" min-width="180">
<template #default="{ row }">
<el-input v-if="row.collectType !== 'NONE'" v-model="row.value" placeholder="采集值(可空)" style="width:130px" />
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="判定标准" min-width="200">
<template #default="{ row }">
<template v-if="row.criteria.length">
<el-tag v-for="c in row.criteria" :key="c.id" size="small" style="margin-right:4px">
{{ c.name }}{{ critText(c) }}
</el-tag>
</template>
<span v-else style="color:#909399">未设标准</span>
</template>
</el-table-column>
</el-table>
</el-card>
<el-alert v-else type="info" :closable="false" title="请选择工位、SN 与工序号后点【载入参数模板】" />
<el-divider content-position="left">报工记录</el-divider>
<el-form inline>
<el-form-item label="SN"><el-input v-model="query.sn" clearable style="width:160px" /></el-form-item>
@@ -42,17 +73,58 @@ import request from '../utils/request'
import PageHelp from '../components/PageHelp.vue'
import { helpScan } from '../help'
const scan = reactive({ sn: '', orderNo: '', station: '', type: 'PROCESS', processCode: 0 })
const form = reactive({ stationNo: 1, sn: '', processCode: 1 })
const steps = ref([])
const saving = ref(false)
const query = reactive({ sn: '', orderNo: '' })
const list = ref([])
async function report() {
if (!scan.sn) return ElMessage.warning('请输入SN')
await request.post('/scan/report', scan)
function critText(c) {
switch (c.logic) {
case 'GE': return `${c.target}${c.unit}`
case 'LE': return `${c.target}${c.unit}`
case 'GT': return ` >${c.target}${c.unit}`
case 'LT': return ` <${c.target}${c.unit}`
case 'RANGE': return ` [${c.min},${c.max}]${c.unit}`
case 'EQUAL': return ` =${c.target}${c.unit}`
default: return c.name || ''
}
}
// 从后端步骤模板构造报工所需字段(value 挂在 row 上,提交时收集)
async function loadSteps() {
if (!form.sn) return ElMessage.warning('请先输入工件SN')
if (!form.processCode) return ElMessage.warning('请选择工序号')
try {
const data = await request.get('/process-steps', { params: { processCode: form.processCode } }) || []
steps.value = data.map(s => ({ ...s, value: '', text: '' }))
} catch { steps.value = [] }
}
async function submit() {
if (!form.sn) return ElMessage.warning('请输入SN')
if (!form.processCode) return ElMessage.warning('请选择工序号')
const stepReq = steps.value
.filter(s => s.collectType !== 'NONE' && (s.text !== '' || s.value !== ''))
.map(s => ({
stepId: s.id,
name: s.name,
value: Number(s.value) || 0,
text: s.text || String(s.value || '')
}))
// 手动报工走工序实绩 + 步骤考核
await request.post('/workpiece/process/report', {
sn: form.sn,
processCode: form.processCode,
stationNo: form.stationNo,
steps: stepReq
})
ElMessage.success('报工成功')
Object.assign(scan, { sn: '', station: '', processCode: 0 })
steps.value = []
Object.assign(form, { sn: '' })
load()
}
async function load() {
list.value = (await request.get('/scan/records', { params: query })) || []
}