feat(mes): 添加定时同步可生产数量到WMS及BOM项相关标准字段

- 在main.go中添加定时任务每10分钟同步可生产数量到WMS系统
- 为BomItem实体添加relatedStandard字段及相关CRUD方法
- 为InspectionRecord实体添加reportNo、materialCode、materialName等字段
- 更新ent schema确保新字段的验证和默认值设置
- 添加必要的数据库迁移和字段映射逻辑
This commit is contained in:
SunYF
2026-09-17 12:49:07 +08:00
parent b4b274301d
commit 1cc93795ce
191 changed files with 24504 additions and 1250 deletions
+74 -4
View File
@@ -99,9 +99,28 @@ async function queryPrep() {
}
/* ===================== 通用出库(手动,不依赖工单) ===================== */
// 出库类别:退料/退货/样品/报废/发货/其他(客户诉求 L96-108 + U5
const CATEGORY_OPTIONS = [
{ value: 'return', label: '退料' },
{ value: 'supplier_return', label: '退货' },
{ value: 'sample', label: '样品' },
{ value: 'scrap', label: '报废' },
{ value: 'deliver', label: '发货' },
{ value: 'other', label: '其他' }
]
const OWNERSHIP_OPTIONS = [
{ value: 'none', label: '无' },
{ value: 'workorder', label: '工单号' },
{ value: 'project', label: '科技项目号' },
{ value: 'other', label: '其他' }
]
// 物料下拉由 MaterialSelect 组件按需远程搜索(最近 100 条)
const zones = ref([])
const genForm = reactive({ materialCode: '', mode: 1, batchNo: '', qty: 1, zoneCode: '', boxNo: '', contractNo: '', remark: '' })
const genForm = reactive({
materialCode: '', mode: 1, batchNo: '', qty: 1, zoneCode: '',
boxNo: '', contractNo: '', remark: '',
outboundCategory: 'other', ownershipType: 'none', ownershipNo: '', targetStation: ''
})
const snInput = ref('')
const snList = ref([])
const savingGen = ref(false)
@@ -138,8 +157,20 @@ async function loadGenRows() {
async function submitGen() {
if (!genForm.materialCode) { ElMessage.warning('请选择物料'); return }
if (!genForm.outboundCategory) { ElMessage.warning('请选择出库类别'); return }
if (genForm.ownershipType !== 'none' && !genForm.ownershipNo.trim()) {
ElMessage.warning('请填写归属编号(工单号 / 科技项目号 / 其他)'); return
}
if (genForm.outboundCategory === 'other' && !genForm.remark.trim()) {
ElMessage.warning('出库类别选「其他」时,请在备注中填写具体原因'); return
}
const payload = {
materialCode: genForm.materialCode, operator,
outboundType: 'general',
outboundCategory: genForm.outboundCategory,
ownershipType: genForm.ownershipType,
ownershipNo: genForm.ownershipType !== 'none' ? genForm.ownershipNo.trim() : undefined,
targetStation: genForm.targetStation.trim() || undefined,
zoneCode: genForm.zoneCode || undefined,
boxNo: genForm.boxNo.trim() || undefined,
contractNo: genForm.contractNo.trim() || undefined,
@@ -159,7 +190,7 @@ async function submitGen() {
try {
const res = await request.post('/outbound/general', payload)
ElMessage.success(`通用出库成功:${res?.outboundNo}${res?.boxNo ? ' 箱号 ' + res.boxNo : ''}`)
Object.assign(genForm, { materialCode: '', mode: 1, batchNo: '', qty: 1, zoneCode: '', boxNo: '', contractNo: '', remark: '' })
Object.assign(genForm, { materialCode: '', mode: 1, batchNo: '', qty: 1, zoneCode: '', boxNo: '', contractNo: '', remark: '', outboundCategory: 'other', ownershipType: 'none', ownershipNo: '', targetStation: '' })
snInput.value = ''
snList.value = []
genPage.current = 1
@@ -169,7 +200,7 @@ async function submitGen() {
}
/* ===================== 出库记录(统一主表,全部 + 导出) ===================== */
const recFilters = reactive({ outboundType: '', materialCode: '', boxNo: '', dateRange: [] })
const recFilters = reactive({ outboundType: '', materialCode: '', boxNo: '', ownershipType: '', dateRange: [] })
const recRows = ref([])
const recTotal = ref(0)
const loadingRec = ref(false)
@@ -184,6 +215,7 @@ async function loadRecords() {
outboundType: recFilters.outboundType,
materialCode: recFilters.materialCode.trim(),
boxNo: recFilters.boxNo.trim(),
ownershipType: recFilters.ownershipType,
page: recPage.current, pageSize: recPage.size
}
if (Array.isArray(recFilters.dateRange) && recFilters.dateRange.length === 2) {
@@ -251,7 +283,7 @@ onMounted(loadDicts)
</template>
<el-table :data="rows" border v-loading="loadingPrep">
<el-table-column prop="orderNo" label="工单号" min-width="140" />
<el-table-column prop="materialCode" label="物料编码" min-width="150" />
<el-table-column prop="materialCode" label="图号" min-width="150" />
<el-table-column prop="materialName" label="物料名称" min-width="140">
<template #default="{ row }">{{ row.materialName || '-' }}</template>
</el-table-column>
@@ -288,6 +320,22 @@ onMounted(loadDicts)
</el-radio-group>
</el-form-item>
<el-form-item label="出库类别" required>
<el-select v-model="genForm.outboundCategory" style="width:100%">
<el-option v-for="c in CATEGORY_OPTIONS" :key="c.value" :value="c.value" :label="c.label" />
</el-select>
</el-form-item>
<el-form-item label="归属">
<el-select v-model="genForm.ownershipType" style="width:160px;margin-right:8px">
<el-option v-for="o in OWNERSHIP_OPTIONS" :key="o.value" :value="o.value" :label="o.label" />
</el-select>
<el-input v-if="genForm.ownershipType !== 'none'" v-model="genForm.ownershipNo"
placeholder="归属编号(工单号/科技项目号/其他)" clearable style="width:260px" />
</el-form-item>
<el-form-item label="目标工位">
<el-input v-model="genForm.targetStation" placeholder="选填:如 1~12 或 DOCK01" clearable style="width:100%" />
</el-form-item>
<template v-if="genForm.mode === 1">
<el-form-item label="批次号" required>
<el-input v-model="genForm.batchNo" placeholder="结构件批次号" style="width:100%" />
@@ -349,6 +397,17 @@ onMounted(loadDicts)
<template #default="{ row }">{{ row.snCodes || '-' }}</template>
</el-table-column>
<el-table-column prop="quantity" label="数量" width="80" align="center" />
<el-table-column label="归属" min-width="130">
<template #default="{ row }">
<span v-if="row.ownershipType === 'workorder'">工单号 {{ row.ownershipNo || '' }}</span>
<span v-else-if="row.ownershipType === 'project'">科技项目号 {{ row.ownershipNo || '' }}</span>
<span v-else-if="row.ownershipType === 'other'">其他 {{ row.ownershipNo || '' }}</span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="targetStation" label="目标工位" width="100" align="center">
<template #default="{ row }">{{ row.targetStation || '-' }}</template>
</el-table-column>
<el-table-column prop="boxNo" label="箱号" min-width="120">
<template #default="{ row }">{{ row.boxNo || '-' }}</template>
</el-table-column>
@@ -415,6 +474,17 @@ onMounted(loadDicts)
<template #default="{ row }">{{ row.snCodes || '-' }}</template>
</el-table-column>
<el-table-column prop="quantity" label="数量" width="70" align="center" />
<el-table-column label="归属" min-width="130">
<template #default="{ row }">
<span v-if="row.ownershipType === 'workorder'">工单号 {{ row.ownershipNo || '' }}</span>
<span v-else-if="row.ownershipType === 'project'">科技项目号 {{ row.ownershipNo || '' }}</span>
<span v-else-if="row.ownershipType === 'other'">其他 {{ row.ownershipNo || '' }}</span>
<span v-else>无</span>
</template>
</el-table-column>
<el-table-column prop="targetStation" label="目标工位" width="100" align="center">
<template #default="{ row }">{{ row.targetStation || '-' }}</template>
</el-table-column>
<el-table-column prop="boxNo" label="箱号" min-width="120">
<template #default="{ row }">{{ row.boxNo || '-' }}</template>
</el-table-column>