| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <template v-if="!isStorageBound"> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="产品名称" |
| | | prop="productModelId" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: '请选择产品', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <!-- 绑定卖油台账后,产品只能从该台账明细里选(代储台账没有明细) --> |
| | | <el-select v-if="hasBoundLedger" |
| | | v-model="formState.productModelId" |
| | | placeholder="请选择台账产品" |
| | | filterable |
| | | clearable |
| | | style="width: 100%" |
| | | @change="handleLedgerProductChange"> |
| | | <el-option v-for="(item, index) in ledgerProductOptions" |
| | | :key="`${item.productModelId}-${index}`" |
| | | :label="ledgerProductLabel(item)" |
| | | :value="item.productModelId" /> |
| | | </el-select> |
| | | <el-button v-else |
| | | type="primary" |
| | | @click="showProductSelectDialog = true"> |
| | | {{ formState.productName ? formState.productName : '选择产品' }} |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="规格" |
| | | prop="model"> |
| | | <el-input v-model="formState.model" |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="单位" |
| | | prop="unit"> |
| | | <el-input v-model="formState.unit" |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </template> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="产品名称" |
| | | prop="productModelId" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: '请选择产品规格', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <!-- 绑定卖油台账后产品只能从该台账明细里选;代储台账没有明细,仍走产品选择弹窗 --> |
| | | <el-select v-if="useLedgerProducts" |
| | | v-model="formState.productModelId" |
| | | placeholder="请选择台账产品" |
| | | filterable |
| | | clearable |
| | | style="width: 100%" |
| | | @change="handleLedgerProductChange"> |
| | | <el-option v-for="(item, index) in ledgerProductOptions" |
| | | :key="`${item.productModelId}-${index}`" |
| | | :label="ledgerProductLabel(item)" |
| | | :value="item.productModelId" /> |
| | | </el-select> |
| | | <el-button v-else |
| | | type="primary" |
| | | @click="showProductSelectDialog = true"> |
| | | {{ formState.productName ? formState.productName : '选择产品' }} |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="规格" |
| | | prop="model"> |
| | | <el-input v-model="formState.model" |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="单位" |
| | | prop="unit"> |
| | | <el-input v-model="formState.unit" |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <div class="form-section-title">出库信息</div> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="8"> |
| | |
| | | <el-col :span="8"> |
| | | <el-form-item label="出库批次" |
| | | prop="batchNo" |
| | | :rules="isSalesOut |
| | | ? [{ required: true, message: '销售类出库必须选择出库批次', trigger: 'change' }] |
| | | : []"> |
| | | :rules="[{ required: true, message: '油品出库必须选择出库批次', trigger: 'change' }]"> |
| | | <el-select v-model="formState.batchNo" |
| | | placeholder="请选择" |
| | | clearable |
| | |
| | | <el-col :span="12"> |
| | | <el-form-item label="车挂牌号" |
| | | prop="trailerPlateNo" |
| | | :rules="[{ required: true, message: '请输入车挂牌号', trigger: 'blur' }]"> |
| | | :rules="isSalesOut |
| | | ? [{ required: true, message: '请输入车挂牌号', trigger: 'blur' }] |
| | | : []"> |
| | | <el-input v-model="formState.trailerPlateNo" |
| | | :readonly="!!formState.vehicleId" |
| | | placeholder="请输入" |
| | |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30" |
| | | v-if="isSalesOut"> |
| | | v-if="formState.productModelId"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="可用量"> |
| | | <div class="available-qty-tip"> |
| | |
| | | const productModelCache = ref(null); |
| | | |
| | | const hasBoundLedger = computed(() => !!formState.value.salesLedgerId); |
| | | // 绑代储台账:不用选产品,油库/储罐由台账带入 |
| | | // 绑代储台账:油库/储罐由台账带入,但产品仍要选(代储出库也要扣库存) |
| | | const isStorageBound = computed(() => boundLedgerRow.value?.ledgerType === "代储"); |
| | | // 只有卖油台账有产品明细可挑;代储台账没明细,走产品选择弹窗 |
| | | const useLedgerProducts = computed(() => hasBoundLedger.value && !isStorageBound.value); |
| | | |
| | | const fetchBatchNoOptions = () => { |
| | | batchNoOptions.value = []; |
| | |
| | | }); |
| | | }; |
| | | |
| | | // 销售类出库必须给出库批次(后端新增时即校验,且审批通过会按批次扣库存) |
| | | // 车辆只有销售类出库必填(销售类才按车算「上次剩余油量」,代储/客存残油按 0) |
| | | const isSalesOut = computed(() => formState.value.outCategory === "销售"); |
| | | |
| | | // 可用量提示:车辆 + 规格(+批次)确定后向后端取「上次剩余 / 当前库存 / 可用量」 |
| | | // 可用量提示:规格(+批次+车辆)确定后向后端取「上次剩余 / 当前库存 / 可用量」。 |
| | | // 代储/客存没有车辆,不传 vehicleId,后端按上次剩余 0 处理,可用量 = 当前库存 |
| | | const fetchAvailableQty = () => { |
| | | availableQty.value = null; |
| | | const { vehicleId, productModelId, batchNo } = formState.value; |
| | | if (!isSalesOut.value || !vehicleId || !productModelId) { |
| | | if (!productModelId) { |
| | | return; |
| | | } |
| | | getOilOutAvailableQty({ vehicleId, productModelId, batchNo }) |
| | |
| | | const handleSubmit = () => { |
| | | proxy.$refs["formRef"].validate(valid => { |
| | | if (valid) { |
| | | // 绑代储台账不用选产品(代储台账没有产品明细) |
| | | if (!formState.value.productModelId && !isStorageBound.value) { |
| | | proxy.$modal.msgError("请选择产品"); |
| | | // 销售/代储/客存都要扣库存,一律必须选规格(代储台账没明细,从产品弹窗选) |
| | | if (!formState.value.productModelId) { |
| | | proxy.$modal.msgError("请选择产品规格"); |
| | | return; |
| | | } |
| | | // 计算结果随表单提交 |