feat(mes): 添加定时同步可生产数量到WMS及BOM项相关标准字段
- 在main.go中添加定时任务每10分钟同步可生产数量到WMS系统 - 为BomItem实体添加relatedStandard字段及相关CRUD方法 - 为InspectionRecord实体添加reportNo、materialCode、materialName等字段 - 更新ent schema确保新字段的验证和默认值设置 - 添加必要的数据库迁移和字段映射逻辑
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user