<template>
|
<view class="account-detail">
|
<PageHeader title="领用"
|
@back="goBack" />
|
<up-form ref="formRef"
|
:model="form"
|
label-width="110">
|
<up-form-item label="产品">
|
<up-input v-model="form.productName"
|
disabled />
|
</up-form-item>
|
<up-form-item label="规格型号">
|
<up-input v-model="form.model"
|
disabled />
|
</up-form-item>
|
<up-form-item label="单位">
|
<up-input v-model="form.unit"
|
disabled />
|
</up-form-item>
|
<up-form-item label="批号"
|
v-if="form.batchNo">
|
<up-input v-model="form.batchNo"
|
disabled />
|
</up-form-item>
|
<up-form-item label="库存类型"
|
required>
|
<u-radio-group v-model="form.type"
|
@change="onTypeChange">
|
<u-radio :customStyle="{ marginRight: '40rpx' }"
|
label="合格库存"
|
:disabled="qualifiedAvailable <= 0"
|
name="qualified"></u-radio>
|
<u-radio label="不合格库存"
|
:disabled="unqualifiedAvailable <= 0"
|
name="unqualified"></u-radio>
|
</u-radio-group>
|
</up-form-item>
|
<up-form-item label="数量"
|
required>
|
<up-number-box v-model="form.qualitity"
|
:min="1"
|
:max="maxQty"
|
:step="1" />
|
</up-form-item>
|
<up-form-item label="备注">
|
<up-textarea v-model="form.remark"
|
placeholder="选填"
|
auto-height />
|
</up-form-item>
|
</up-form>
|
<FooterButtons cancelText="取消"
|
confirmText="提交"
|
:loading="submitting"
|
@cancel="goBack"
|
@confirm="handleSubmit" />
|
</view>
|
</template>
|
|
<script setup>
|
import { onMounted, ref, computed } from "vue";
|
import PageHeader from "@/components/PageHeader.vue";
|
import FooterButtons from "@/components/FooterButtons.vue";
|
import { addStockOutRecordOnly } from "@/api/inventoryManagement/stockInventory.js";
|
import { addUnqualifiedStockOutRecordOnly } from "@/api/inventoryManagement/stockUninventory.js";
|
|
const submitting = ref(false);
|
const formRef = ref(null);
|
const maxQty = ref(1);
|
const qualifiedMax = ref(0);
|
const unqualifiedMax = ref(0);
|
const topParentProductId = ref(undefined);
|
|
const form = ref({
|
productId: undefined,
|
productModelId: undefined,
|
productName: "",
|
model: "",
|
unit: "",
|
batchNo: undefined,
|
type: "qualified",
|
qualitity: 1,
|
remark: "",
|
});
|
|
const qualifiedAvailable = computed(() => {
|
return Number(qualifiedMax.value || 0);
|
});
|
const unqualifiedAvailable = computed(() => {
|
return Number(unqualifiedMax.value || 0);
|
});
|
const currentAvailable = computed(() => {
|
return form.value.type === "qualified"
|
? qualifiedAvailable.value
|
: unqualifiedAvailable.value;
|
});
|
|
const getRequestErrorText = err => {
|
if (!err || typeof err !== "object") return "";
|
const msg = err?.msg || err?.message || err?.data?.msg || err?.data?.message;
|
return msg ? String(msg) : "";
|
};
|
|
const goBack = () => {
|
uni.navigateBack();
|
};
|
|
const syncMax = () => {
|
if (form.value.type === "qualified" && qualifiedAvailable.value <= 0 && unqualifiedAvailable.value > 0) {
|
form.value.type = "unqualified";
|
}
|
if (form.value.type === "unqualified" && unqualifiedAvailable.value <= 0 && qualifiedAvailable.value > 0) {
|
form.value.type = "qualified";
|
}
|
maxQty.value = Math.max(1, Number(currentAvailable.value || 0));
|
if (Number(form.value.qualitity) > Number(maxQty.value)) {
|
form.value.qualitity = Number(maxQty.value);
|
}
|
};
|
|
const onTypeChange = () => {
|
form.value.qualitity = 1;
|
syncMax();
|
};
|
|
const handleSubmit = () => {
|
if (!form.value.productModelId) {
|
uni.showToast({ title: "参数错误", icon: "none" });
|
return;
|
}
|
const qty = Number(form.value.qualitity);
|
const limit = form.value.type === "qualified" ? qualifiedMax.value : unqualifiedMax.value;
|
if (!qty || qty < 1) {
|
uni.showToast({ title: "数量必须大于0", icon: "none" });
|
return;
|
}
|
if (limit <= 0) {
|
uni.showToast({ title: "暂无可用库存", icon: "none" });
|
return;
|
}
|
if (qty > limit) {
|
uni.showToast({ title: "领用数量超出可用数量", icon: "none" });
|
return;
|
}
|
|
submitting.value = true;
|
const payload = { ...form.value };
|
const requestFn = payload.type === "qualified" ? addStockOutRecordOnly : addUnqualifiedStockOutRecordOnly;
|
requestFn(payload)
|
.then(() => {
|
uni.showToast({ title: "提交成功", icon: "success" });
|
uni.$emit("stockManagement:refresh", { topParentProductId: topParentProductId.value });
|
goBack();
|
})
|
.catch(err => {
|
const title = getRequestErrorText(err);
|
if (title) uni.showToast({ title, icon: "none" });
|
})
|
.finally(() => {
|
submitting.value = false;
|
});
|
};
|
|
onMounted(() => {
|
const options = getCurrentPages()?.slice(-1)?.[0]?.options || {};
|
topParentProductId.value = options.topParentProductId ? Number(options.topParentProductId) : undefined;
|
form.value.productId = options.productId ? Number(options.productId) : undefined;
|
form.value.productModelId = options.productModelId ? Number(options.productModelId) : undefined;
|
form.value.productName = decodeURIComponent(options.productName || "");
|
form.value.model = decodeURIComponent(options.model || "");
|
form.value.unit = decodeURIComponent(options.unit || "");
|
form.value.batchNo = options.batchNo ? decodeURIComponent(options.batchNo || "") : undefined;
|
qualifiedMax.value = options.qualifiedMax ? Number(options.qualifiedMax) : 0;
|
unqualifiedMax.value = options.unqualifiedMax ? Number(options.unqualifiedMax) : 0;
|
|
form.value.type = qualifiedMax.value > 0 ? "qualified" : "unqualified";
|
form.value.qualitity = 1;
|
syncMax();
|
});
|
</script>
|
|
<style scoped lang="scss">
|
@import "@/static/scss/form-common.scss";
|
</style>
|