refactor: simplify cost calculation to 3 fields, drop manual_cost
Co-authored-by: aider (openai/DeepSeek-V3.2-Thinking) <aider@aider.chat>
This commit is contained in:
@ -467,7 +467,8 @@ import {
|
||||
searchMaterialBase,
|
||||
searchBom,
|
||||
getFilterOptions,
|
||||
getManagerHistory // [新增]
|
||||
getManagerHistory, // [新增]
|
||||
calculateBomCost
|
||||
} from '@/api/inbound/product'
|
||||
import { uploadFile, deleteFile } from '@/api/inbound/buy'
|
||||
import WebRtcCamera from '@/components/Camera/WebRtcCamera.vue'
|
||||
@ -657,7 +658,7 @@ const handleSearchBom = async (query: string) => {
|
||||
bomOptions.value = res.data || []
|
||||
} finally { bomSearchLoading.value = false }
|
||||
}
|
||||
const handleBomSelect = (val: string) => {
|
||||
const handleBomSelect = async (val: string) => {
|
||||
if (!val) {
|
||||
form.bom_code = ''
|
||||
form.bom_version = ''
|
||||
@ -666,6 +667,17 @@ const handleBomSelect = (val: string) => {
|
||||
const [code, version] = val.split('###')
|
||||
form.bom_code = code
|
||||
form.bom_version = version
|
||||
// 自动计算 BOM 成本并填入 raw_material_cost 和 unit_total_cost
|
||||
try {
|
||||
const res: any = await calculateBomCost({ bom_code: code, bom_version: version })
|
||||
if (res.code === 200 && typeof res.data === 'number') {
|
||||
form.raw_material_cost = res.data
|
||||
form.unit_total_cost = res.data
|
||||
}
|
||||
} catch (e) {
|
||||
// 计算失败不影响现有输入
|
||||
console.warn('BOM 成本计算失败', e)
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------
|
||||
@ -1087,4 +1099,4 @@ onMounted(() => {
|
||||
.product-dropdown { width: 580px !important; }
|
||||
.product-dropdown .el-select-dropdown__wrap { max-height: 320px !important; }
|
||||
.product-dropdown .el-input__suffix { z-index: 10; }
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@ -473,13 +473,13 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="单件总成本">
|
||||
<el-input-number v-model="form.manual_cost" :precision="2" :controls="false" style="width:100%" placeholder="请输入"/>
|
||||
<el-form-item label="单件成本">
|
||||
<el-input-number v-model="form.unit_total_cost" :precision="2" :controls="false" style="width:100%" placeholder="请输入"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="总成本">
|
||||
<el-input-number v-model="form.unit_total_cost" :precision="2" :controls="false" style="width:100%" placeholder="自动计算" disabled/>
|
||||
<el-input-number v-model="form.total_price" :precision="2" :controls="false" style="width:100%" placeholder="自动计算" disabled/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
@ -539,7 +539,8 @@ import {
|
||||
searchMaterialBase,
|
||||
searchBom,
|
||||
getFilterOptions,
|
||||
getManagerHistory // [新增]
|
||||
getManagerHistory, // [新增]
|
||||
calculateBomCost
|
||||
} from '@/api/inbound/semi'
|
||||
import { uploadFile, deleteFile } from '@/api/inbound/buy'
|
||||
import WebRtcCamera from '@/components/Camera/WebRtcCamera.vue'
|
||||
@ -731,13 +732,11 @@ const form = reactive({
|
||||
production_manager: '', production_time_range: [] as string[], arrival_photo: [] as string[], quality_report_link: [] as string[], detail_link: ''
|
||||
})
|
||||
|
||||
// === 新增:监听计算总成本 ===
|
||||
watch([() => form.in_quantity, () => form.manual_cost], ([qty, manual_cost]) => {
|
||||
if (manual_cost !== undefined && manual_cost !== null) {
|
||||
form.unit_total_cost = Number((qty * manual_cost).toFixed(2))
|
||||
} else {
|
||||
form.unit_total_cost = undefined
|
||||
}
|
||||
// === 监听计算总成本 ===
|
||||
watch([() => form.unit_total_cost, () => form.in_quantity], ([unit, qty]) => {
|
||||
const unitNum = Number(unit || 0)
|
||||
const qtyNum = Number(qty || 1)
|
||||
form.total_price = Number((unitNum * qtyNum).toFixed(2))
|
||||
})
|
||||
|
||||
// ------------------------------------
|
||||
@ -750,7 +749,7 @@ const handleSearchBom = async (query: string) => {
|
||||
bomOptions.value = res.data || []
|
||||
} finally { bomSearchLoading.value = false }
|
||||
}
|
||||
const handleBomSelect = (val: string) => {
|
||||
const handleBomSelect = async (val: string) => {
|
||||
// val 格式为 bom_no###version
|
||||
if (!val) {
|
||||
form.bom_code = ''
|
||||
@ -760,6 +759,17 @@ const handleBomSelect = (val: string) => {
|
||||
const [code, version] = val.split('###')
|
||||
form.bom_code = code
|
||||
form.bom_version = version
|
||||
// 自动计算 BOM 成本并填入 raw_material_cost 和 unit_total_cost
|
||||
try {
|
||||
const res: any = await calculateBomCost({ bom_code: code, bom_version: version })
|
||||
if (res.code === 200 && typeof res.data === 'number') {
|
||||
form.raw_material_cost = res.data
|
||||
form.unit_total_cost = res.data
|
||||
}
|
||||
} catch (e) {
|
||||
// 计算失败不影响现有输入
|
||||
console.warn('BOM 成本计算失败', e)
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------
|
||||
@ -1221,4 +1231,4 @@ onMounted(() => {
|
||||
.long-dropdown { width: 580px !important; }
|
||||
.long-dropdown .el-select-dropdown__wrap { max-height: 320px !important; }
|
||||
.long-dropdown .el-input__suffix { z-index: 10; }
|
||||
</style>
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user