feat&refactor: 完成多模块功能迭代与配置优化

本次提交覆盖多个业务模块的功能完善与体验优化:
1.  **鉴权与配置调整**:
    - 统一JWT滑动续签逻辑,简化Token存储,移除RefreshToken相关冗余代码
    - 调整多项目配置文件中JWT过期时间为3600秒,统一会话闲置窗口
    - 工位配置放开1~12限制,改为仅校验大于0
2.  **术语统一替换**:全链路将"精密件"替换为"电气件",修正物料管理描述
3.  **功能新增**:
    - 新增工位类型、工艺路线与产线点位台账模块
    - 添加工艺PDF预览面板、工位终端代理转发接口
    - 新增操作日志按操作人列表筛选、工位登出日志记录
    - 新增PLC移料指令与产线点位状态管理
4.  **业务流程优化**:
    - 调整BOM物料删除校验逻辑,优化工单备料计算
    - 补充物料图号、检测单号等追溯字段
    - 完善工艺流程图与工位绑定关系说明
    - 优化前端页面文案与交互细节
5.  **代码规范与维护**:
    - 新增通用工具函数与前端静态资源
    - 整理路由权限与中间件逻辑
    - 修复部分接口与配置的不兼容问题
This commit is contained in:
SunYF
2026-09-10 16:59:15 +08:00
parent 6d8bb75696
commit 0ab21b1234
202 changed files with 21397 additions and 3172 deletions
+11 -9
View File
@@ -5,7 +5,7 @@
<el-form inline>
<el-form-item label="工位">
<el-select v-model="form.stationNo" placeholder="请选择工位" style="width:120px" @change="loadSteps">
<el-option v-for="i in 12" :key="i" :value="i" :label="`工位${i}`" />
<el-option v-for="i in stationNos" :key="i" :value="i" :label="`工位${i}`" />
</el-select>
</el-form-item>
<el-form-item label="工件SN"><el-input v-model="form.sn" placeholder="扫码或手输" style="width:190px" @change="loadSteps" /></el-form-item>
@@ -47,22 +47,22 @@
</el-table>
</el-card>
<!-- 装机绑定区:该工件在本工序应装什么料(BOM 装配工序配置)→ 扫码/手录绑定,齐套后才允许报工 -->
<!-- 装机绑定区:该工件在本工序应装什么料(物料清单的装配工位配置)→ 扫码/手录绑定,齐套后才允许报工 -->
<el-card v-if="bindPanel" shadow="never" style="margin-bottom:12px;border-color:var(--el-color-primary)">
<div slot="header" style="display:flex;justify-content:space-between;align-items:center">
<b>工序 {{ form.stationNo }} 装机绑定(装配物料)</b>
<b>装配工位 {{ form.stationNo }} 装机绑定(装配物料)</b>
<el-alert v-if="bindPanel.enabled && !bindPanel.complete" type="warning" :closable="false" show-icon style="flex:1;margin-left:16px"
:title="'尚未绑齐:' + bindPanel.missing" />
<el-alert v-else-if="bindPanel.enabled && bindPanel.complete" type="success" :closable="false" show-icon style="flex:1;margin-left:16px"
title="装配物料已绑齐,可提交报工" />
<el-alert v-else type="info" :closable="false" style="flex:1;margin-left:16px"
title="该产品未在本工序配置需绑定物料(BOM「装配工序」为空),不校验" />
title="该产品未在当前装配工位配置需绑定物料(物料清单「装配工位」为空),不校验" />
</div>
<el-table v-if="bindPanel.required && bindPanel.required.length" :data="bindPanel.required" border size="small">
<el-table-column prop="materialCode" label="物料编码" min-width="110" />
<el-table-column prop="materialName" label="物料名称" min-width="120" />
<el-table-column prop="manageMode" label="管理方式" width="120">
<template #default="{row}">{{ row.manageMode === '2' ? '精密件(SN)' : '结构件(批次)' }}</template>
<template #default="{row}">{{ row.manageMode === '2' ? '电气件(SN)' : '结构件(批次)' }}</template>
</el-table-column>
<el-table-column label="已绑/需绑" width="100" align="center">
<template #default="{row}">
@@ -85,7 +85,7 @@
</el-table-column>
</el-table>
</el-card>
<el-alert v-if="!steps.length && !bindPanel" type="info" :closable="false" title="请选择工位、输入SN后点【载入工序步骤】;若提示未配置工序步骤,请到「工艺流程」为该工位启用流程并维护工序步骤" />
<el-alert v-if="!steps.length && !bindPanel" type="info" :closable="false" title="请选择工位、输入SN后点【载入工艺步骤】;若提示未配置工序步骤,请到「工艺流程」为该工位启用流程并维护工艺步骤" />
</el-tab-pane>
<el-tab-pane label="报工记录" name="records" lazy>
@@ -118,6 +118,7 @@ import request from '../utils/request'
import { can } from '../utils/perm'
import PageHelp from '../components/PageHelp.vue'
import { helpScan } from '../help'
import { loadStationNos } from '../utils/stations'
const tab = ref('entry')
const recordsPage = ref(1)
@@ -131,6 +132,7 @@ const bindPanel = ref(null)
const binding = ref(false)
const query = reactive({ sn: '', orderNo: '' })
const list = ref([])
const stationNos = ref([])
function critText(c) {
switch (c.logic) {
@@ -176,7 +178,7 @@ async function loadBindPanel() {
// 扫/录单个物料 → 立即绑定落库并刷新齐套状态(防错即时反馈)
async function bindOne(row) {
const v = (row._input || '').trim()
if (!v) return ElMessage.warning('请先输入绑定值(精密件扫码SN / 结构件批次号)')
if (!v) return ElMessage.warning('请先输入绑定值(电气件扫码SN / 结构件批次号)')
binding.value = true
try {
await request.post('/binds', {
@@ -194,7 +196,7 @@ async function bindOne(row) {
async function submit() {
if (!form.sn) return ElMessage.warning('请输入SN')
if (!steps.value.length) return ElMessage.warning('该工位未配置工序步骤,无法报工')
if (!steps.value.length) return ElMessage.warning('该工位未配置工艺步骤,无法报工')
// 报工前强校验:本工序装配物料需绑齐(后端 validateStationBinds)
if (bindPanel.value?.enabled && !bindPanel.value?.complete) {
return ElMessage.warning('装配物料未绑齐,请先完成装机绑定:' + (bindPanel.value.missing || ''))
@@ -227,5 +229,5 @@ async function load() {
recordsTotal.value = data?.total || 0
}
function onTab(name) { if (name === 'records' && !list.value.length) load() }
onMounted(() => { if (form.stationNo) loadSteps() })
onMounted(async () => { stationNos.value = await loadStationNos(); if (form.stationNo) loadSteps() })
</script>