<template>
|
<view class="account-detail">
|
<PageHeader :title="pageTitle"
|
@back="goBack" />
|
<up-form ref="formRef"
|
:model="form"
|
:rules="rules"
|
label-width="110">
|
<up-form-item label="主生产计划号"
|
prop="mpsNo">
|
<up-input v-model="form.mpsNo"
|
placeholder="新增后自动生成"
|
disabled />
|
</up-form-item>
|
<up-form-item label="产品"
|
prop="productModelId"
|
required>
|
<up-input v-model="productText"
|
placeholder="请选择"
|
readonly
|
@click="goSelectProductModel" />
|
<template #right>
|
<up-icon name="arrow-right"
|
@click="goSelectProductModel"></up-icon>
|
</template>
|
</up-form-item>
|
<up-form-item label="所需数量"
|
prop="qtyRequired"
|
required>
|
<up-input v-model="form.qtyRequired"
|
type="number"
|
placeholder="请输入"
|
clearable />
|
</up-form-item>
|
<up-form-item label="单位"
|
prop="unit">
|
<up-input v-model="form.unit"
|
placeholder="自动填充"
|
disabled />
|
</up-form-item>
|
<up-form-item label="需求日期"
|
prop="requiredDate"
|
required>
|
<up-input v-model="form.requiredDate"
|
placeholder="请选择"
|
readonly
|
@click="showRequiredDatePicker = true" />
|
<template #right>
|
<up-icon name="arrow-right"
|
@click="showRequiredDatePicker = true"></up-icon>
|
</template>
|
</up-form-item>
|
<up-form-item label="承诺日期"
|
prop="promisedDeliveryDate">
|
<up-input v-model="form.promisedDeliveryDate"
|
placeholder="请选择"
|
readonly
|
@click="showPromisedDatePicker = true" />
|
<template #right>
|
<up-icon name="arrow-right"
|
@click="showPromisedDatePicker = true"></up-icon>
|
</template>
|
</up-form-item>
|
<up-form-item label="备注"
|
prop="remark">
|
<up-textarea v-model="form.remark"
|
placeholder="请输入"
|
auto-height />
|
</up-form-item>
|
</up-form>
|
<FooterButtons :loading="loading"
|
confirmText="保存"
|
@cancel="goBack"
|
@confirm="handleSubmit" />
|
<up-datetime-picker :show="showRequiredDatePicker"
|
v-model="requiredDateValue"
|
mode="date"
|
@confirm="onRequiredDateConfirm"
|
@cancel="showRequiredDatePicker = false" />
|
<up-datetime-picker :show="showPromisedDatePicker"
|
v-model="promisedDateValue"
|
mode="date"
|
@confirm="onPromisedDateConfirm"
|
@cancel="showPromisedDatePicker = false" />
|
</view>
|
</template>
|
|
<script setup>
|
import { computed, onMounted, ref } from "vue";
|
import { onLoad } from "@dcloudio/uni-app";
|
import FooterButtons from "@/components/FooterButtons.vue";
|
import PageHeader from "@/components/PageHeader.vue";
|
import { formatDateToYMD } from "@/utils/ruoyi";
|
import {
|
productionPlanAdd,
|
productionPlanUpdate,
|
} from "@/api/productionManagement/productionPlan";
|
|
const formRef = ref();
|
const loading = ref(false);
|
const editId = ref(undefined);
|
const readonly = ref(false);
|
const selectedProductRow = ref(null);
|
|
const form = ref({
|
id: undefined,
|
mpsNo: "",
|
productId: undefined,
|
productModelId: undefined,
|
productName: "",
|
model: "",
|
qtyRequired: "",
|
unit: "",
|
requiredDate: "",
|
promisedDeliveryDate: "",
|
remark: "",
|
});
|
|
const rules = {
|
qtyRequired: [{ required: true, message: "请输入数量", trigger: "blur" }],
|
requiredDate: [
|
{ required: true, message: "请选择需求日期", trigger: "change" },
|
],
|
};
|
|
const pageTitle = computed(() =>
|
editId.value ? "编辑生产计划" : "新增生产计划"
|
);
|
|
const productText = computed(() => {
|
const name = form.value.productName || "";
|
const model = form.value.model || "";
|
if (!name && !model) return "";
|
return model ? `${name} / ${model}` : name;
|
});
|
|
const showRequiredDatePicker = ref(false);
|
const showPromisedDatePicker = ref(false);
|
const requiredDateValue = ref(Date.now());
|
const promisedDateValue = ref(Date.now());
|
|
const goBack = () => {
|
uni.navigateBack();
|
};
|
|
const goSelectProductModel = () => {
|
if (readonly.value) return;
|
const onSelected = row => {
|
selectedProductRow.value = row || null;
|
const productId = row?.productId ?? row?.productMainId ?? row?.productID;
|
const productModelId =
|
row?.id ??
|
row?.productModelId ??
|
row?.productModelID ??
|
row?.materialModelId ??
|
row?.materialModelID ??
|
row?.modelId ??
|
row?.modelID;
|
form.value.productId = productId ?? undefined;
|
form.value.productModelId = productModelId ?? undefined;
|
form.value.productName = row.productName || "";
|
form.value.model = row.model || "";
|
form.value.unit = row.unit || "方";
|
};
|
uni.$once("stockManagement:selectedProductModel", onSelected);
|
uni.navigateTo({
|
url: "/pages/inventoryManagement/stockManagement/selectProductModel",
|
events: {
|
selected: onSelected,
|
},
|
});
|
};
|
|
const onRequiredDateConfirm = e => {
|
const value = e?.value ?? requiredDateValue.value;
|
form.value.requiredDate = formatDateToYMD(value);
|
showRequiredDatePicker.value = false;
|
};
|
|
const onPromisedDateConfirm = e => {
|
const value = e?.value ?? promisedDateValue.value;
|
form.value.promisedDeliveryDate = formatDateToYMD(value);
|
showPromisedDatePicker.value = false;
|
};
|
|
const handleSubmit = async () => {
|
if (readonly.value) return;
|
if (!form.value.productModelId && selectedProductRow.value) {
|
const row = selectedProductRow.value;
|
const fallback =
|
row?.id ??
|
row?.productModelId ??
|
row?.productModelID ??
|
row?.materialModelId ??
|
row?.materialModelID ??
|
row?.modelId ??
|
row?.modelID;
|
if (fallback != null) form.value.productModelId = fallback;
|
}
|
if (!form.value.productModelId) {
|
uni.showToast({ title: "请选择产品", icon: "none" });
|
return;
|
}
|
const valid = await formRef.value.validate().catch(() => false);
|
if (!valid) return;
|
|
const qty = Number(form.value.qtyRequired);
|
if (!qty || qty <= 0) {
|
uni.showToast({ title: "数量必须大于0", icon: "none" });
|
return;
|
}
|
|
loading.value = true;
|
const payload = { ...form.value, qtyRequired: qty };
|
const action = editId.value ? productionPlanUpdate : productionPlanAdd;
|
if (!editId.value) payload.id = null;
|
action(payload)
|
.then(() => {
|
uni.showToast({ title: "保存成功", icon: "success" });
|
uni.$emit("mainProductionPlan:refresh");
|
goBack();
|
})
|
.catch(err => {
|
const msg =
|
err?.msg || err?.message || err?.data?.msg || err?.data?.message;
|
uni.showToast({ title: msg ? String(msg) : "保存失败", icon: "none" });
|
})
|
.finally(() => {
|
loading.value = false;
|
});
|
};
|
|
const initFromRow = row => {
|
if (!row || typeof row !== "object") return;
|
editId.value = row.id;
|
readonly.value = Boolean(row.source === "销售" || String(row.status) !== "0");
|
form.value = {
|
...form.value,
|
id: row.id,
|
mpsNo: row.mpsNo || "",
|
productId: row.productId ?? undefined,
|
productModelId: row.productModelId ?? undefined,
|
productName: row.productName || "",
|
model: row.model || "",
|
qtyRequired: String(row.qtyRequired ?? ""),
|
unit: row.unit || "方",
|
requiredDate: row.requiredDate ? formatDateToYMD(row.requiredDate) : "",
|
promisedDeliveryDate: row.promisedDeliveryDate
|
? formatDateToYMD(row.promisedDeliveryDate)
|
: "",
|
remark: row.remark || "",
|
};
|
};
|
|
onLoad(options => {
|
if (options?.data) {
|
try {
|
const row = JSON.parse(decodeURIComponent(options.data));
|
initFromRow(row);
|
} catch {
|
uni.showToast({ title: "数据加载失败", icon: "none" });
|
}
|
}
|
});
|
|
onMounted(() => {
|
if (!editId.value) {
|
form.value.requiredDate = formatDateToYMD(Date.now());
|
}
|
});
|
</script>
|
|
<style scoped lang="scss">
|
@import "@/static/scss/form-common.scss";
|
</style>
|