|
|
|
|
@ -221,22 +221,37 @@
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="标准物料标识" prop="materialFlag">
|
|
|
|
|
<el-radio-group v-model="materialForm.materialFlag">
|
|
|
|
|
<el-radio-group v-model="materialForm.materialFlag" @change="handleMaterialFlagChange">
|
|
|
|
|
<el-radio v-for="dict in material_flag" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="产品名称" prop="productName">
|
|
|
|
|
<el-input v-model="materialForm.productName" placeholder="请输入产品名称">
|
|
|
|
|
<el-form-item label="物料名称" prop="materialName" v-if="materialForm.materialFlag === '1'">
|
|
|
|
|
<el-input v-model="materialForm.materialName" placeholder="请点击右侧图标检索物料" readonly>
|
|
|
|
|
<template #suffix>
|
|
|
|
|
<el-icon style="cursor: pointer" v-if="materialForm.materialFlag === '1'" @click="openSaleMaterialSelect">
|
|
|
|
|
<el-icon style="cursor: pointer" @click="openSaleMaterialSelect">
|
|
|
|
|
<Search />
|
|
|
|
|
</el-icon>
|
|
|
|
|
</template>
|
|
|
|
|
</el-input>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="物料编号" prop="materialCode" v-if="materialForm.materialFlag === '1'">
|
|
|
|
|
<el-input v-model="materialForm.materialCode" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="销售物料名称" prop="saleMaterialName" v-if="materialForm.materialFlag === '1'">
|
|
|
|
|
<el-input v-model="materialForm.saleMaterialName" disabled />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="产品名称" prop="productName">
|
|
|
|
|
<el-input v-model="materialForm.productName" placeholder="请输入产品名称" @input="handleMaterialProductNameInput" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="规格描述" prop="specificationDescription">
|
|
|
|
|
<el-input v-model="materialForm.specificationDescription" placeholder="请输入规格描述" />
|
|
|
|
|
@ -357,14 +372,6 @@
|
|
|
|
|
<el-divider content-position="left">供货方信息</el-divider>
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="计划标识" prop="supplierPlanFlag">
|
|
|
|
|
<el-radio-group v-model="supplierPlanFlag" @change="onSupplierPlanFlagChanged" :disabled="isView">
|
|
|
|
|
<el-radio value="1">计划内</el-radio>
|
|
|
|
|
<el-radio value="2">计划外</el-radio>
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12" v-if="supplierPlanFlag === '1'">
|
|
|
|
|
<el-form-item label="供应商" prop="supplierContactId">
|
|
|
|
|
<el-select v-model="form.supplierContactId" filterable placeholder="请选择供应商" @change="onSupplierChanged" :disabled="isView">
|
|
|
|
|
<el-option v-for="s in supplierList" :key="s.supplierId" :label="s.supplierName" :value="s.supplierId" />
|
|
|
|
|
@ -545,9 +552,8 @@ const rules = {
|
|
|
|
|
// 下拉数据
|
|
|
|
|
const customerContactList = ref<any[]>([]);
|
|
|
|
|
const supplierList = ref<any[]>([]);
|
|
|
|
|
// 供应商计划标识:1计划内,2计划外
|
|
|
|
|
const supplierPlanFlag = ref<string>('1');
|
|
|
|
|
const printTemplateList = ref<any[]>([]);
|
|
|
|
|
const DEFAULT_SUPPLIER_ID = 1;
|
|
|
|
|
|
|
|
|
|
// 单位下拉数据
|
|
|
|
|
const unitInfoList = ref<any[]>([]);
|
|
|
|
|
@ -601,17 +607,44 @@ const saleMaterialSelectCallBack = (data: any) => {
|
|
|
|
|
const list = data || [];
|
|
|
|
|
if (list.length) {
|
|
|
|
|
const m = list[0];
|
|
|
|
|
materialForm.value.materialFlag = '1';
|
|
|
|
|
materialForm.value.materialId = m.materialId;
|
|
|
|
|
materialForm.value.relationMaterialId = m.relationMaterialId;
|
|
|
|
|
materialForm.value.materialCode = m.materialCode;
|
|
|
|
|
materialForm.value.materialName = m.materialName;
|
|
|
|
|
materialForm.value.saleMaterialName = m.saleMaterialName;
|
|
|
|
|
materialForm.value.productName = m.saleMaterialName || m.materialName;
|
|
|
|
|
if (m.unitId) {
|
|
|
|
|
materialForm.value.unitId = m.unitId;
|
|
|
|
|
}
|
|
|
|
|
if (m.unitName) {
|
|
|
|
|
materialForm.value.unitName = m.unitName;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const handleMaterialFlagChange = (flag: string) => {
|
|
|
|
|
if (flag === '1') {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 切换为非标物料时清空标准物料链路字段,避免把历史 SAP/销售物料关联误当成当前业务数据提交。
|
|
|
|
|
materialForm.value.materialId = undefined;
|
|
|
|
|
materialForm.value.relationMaterialId = undefined;
|
|
|
|
|
materialForm.value.materialCode = undefined;
|
|
|
|
|
materialForm.value.materialName = undefined;
|
|
|
|
|
materialForm.value.saleMaterialName = undefined;
|
|
|
|
|
};
|
|
|
|
|
const handleMaterialProductNameInput = (value: string) => {
|
|
|
|
|
materialForm.value.productName = value;
|
|
|
|
|
if (materialForm.value.materialFlag !== '1' || !materialForm.value.materialId) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 标准物料允许人工改“产品名称”,一旦与当前销售物料名称不同,就先让旧关联失效,
|
|
|
|
|
// 保存时由后端按“物料 + 客户 + 新产品名称”重新查找或自动补建销售物料关联。
|
|
|
|
|
if (!value || value !== materialForm.value.saleMaterialName) {
|
|
|
|
|
materialForm.value.relationMaterialId = undefined;
|
|
|
|
|
materialForm.value.saleMaterialName = undefined;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const resetMaterialForm = () => {
|
|
|
|
|
materialForm.value = { ...initMaterialFormData };
|
|
|
|
|
materialFormRef.value?.resetFields();
|
|
|
|
|
@ -667,11 +700,26 @@ const handleDeleteMaterial = async (row: CrmQuoteMaterialForm) => {
|
|
|
|
|
const submitMaterialForm = () => {
|
|
|
|
|
materialFormRef.value?.validate((valid: boolean) => {
|
|
|
|
|
if (!valid) return;
|
|
|
|
|
const unitInfo = unitInfoList.value.find((item: any) => item.unitId === materialForm.value.unitId);
|
|
|
|
|
const materialData = {
|
|
|
|
|
...materialForm.value,
|
|
|
|
|
unitName: unitInfo?.unitName || materialForm.value.unitName
|
|
|
|
|
} as any;
|
|
|
|
|
if (materialData.materialFlag !== '1') {
|
|
|
|
|
// 非标物料不保留标准物料技术字段,避免后端把非标数据误识别为标准物料联动场景。
|
|
|
|
|
materialData.materialId = undefined;
|
|
|
|
|
materialData.relationMaterialId = undefined;
|
|
|
|
|
materialData.materialCode = undefined;
|
|
|
|
|
materialData.materialName = undefined;
|
|
|
|
|
materialData.saleMaterialName = undefined;
|
|
|
|
|
} else if (!materialData.relationMaterialId && materialData.productName) {
|
|
|
|
|
// 保存前的本地表格先展示用户最新输入的产品名称,真正的销售物料关联由后端保存时补齐。
|
|
|
|
|
materialData.saleMaterialName = materialData.productName;
|
|
|
|
|
}
|
|
|
|
|
if (currentMaterialIndex.value !== null && currentMaterialIndex.value >= 0) {
|
|
|
|
|
materialRows.value[currentMaterialIndex.value] = { ...materialForm.value } as any;
|
|
|
|
|
materialRows.value[currentMaterialIndex.value] = materialData;
|
|
|
|
|
} else {
|
|
|
|
|
const newItem = { ...materialForm.value } as any;
|
|
|
|
|
materialRows.value.push(newItem);
|
|
|
|
|
materialRows.value.push(materialData);
|
|
|
|
|
}
|
|
|
|
|
proxy?.$modal.msgSuccess('操作成功');
|
|
|
|
|
materialDialog.visible = false;
|
|
|
|
|
@ -787,16 +835,7 @@ const onCustomerContactChanged = (id: any) => {
|
|
|
|
|
form.customerContactPhone = c?.phoneNumber || '';
|
|
|
|
|
form.customerContactEmail = c?.email || '';
|
|
|
|
|
};
|
|
|
|
|
// 供应商计划标识变化处理
|
|
|
|
|
const onSupplierPlanFlagChanged = (flag: string) => {
|
|
|
|
|
supplierPlanFlag.value = flag;
|
|
|
|
|
// 切换计划标识时清空供应商选择
|
|
|
|
|
form.supplierContactId = undefined;
|
|
|
|
|
form.supplierContactName = '';
|
|
|
|
|
form.supplierContactPhone = '';
|
|
|
|
|
form.supplierContactEmail = '';
|
|
|
|
|
};
|
|
|
|
|
// 供应商选择变化处理(计划内供应商)
|
|
|
|
|
// 供应商选择变化处理
|
|
|
|
|
const onSupplierChanged = (supplierId: any) => {
|
|
|
|
|
const supplier = supplierList.value.find((x: any) => x.supplierId === supplierId);
|
|
|
|
|
if (supplier) {
|
|
|
|
|
@ -806,6 +845,19 @@ const onSupplierChanged = (supplierId: any) => {
|
|
|
|
|
form.supplierContactEmail = supplier.contactEmail || '';
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const applyDefaultSupplier = () => {
|
|
|
|
|
if (form.supplierContactId) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const supplier = supplierList.value.find((item: any) => item.supplierId === DEFAULT_SUPPLIER_ID);
|
|
|
|
|
if (!supplier) {
|
|
|
|
|
proxy?.$modal.msgWarning('默认供货方海威不存在,请手工选择供应商');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 新增页默认绑定海威主数据,后续若业务手工切换供应商,联系人信息仍允许按表单继续调整。
|
|
|
|
|
form.supplierContactId = supplier.supplierId;
|
|
|
|
|
onSupplierChanged(supplier.supplierId);
|
|
|
|
|
};
|
|
|
|
|
// 生成报价单编号(codeRuleCode=1004)
|
|
|
|
|
// const generateQuoteCode = async () => {
|
|
|
|
|
// if (isCodeGenerated.value) return;
|
|
|
|
|
@ -953,20 +1005,9 @@ onMounted(async () => {
|
|
|
|
|
if (!form.customerContactPhone || !form.customerContactEmail || !form.customerContactName) {
|
|
|
|
|
onCustomerContactChanged(form.customerContactId);
|
|
|
|
|
}
|
|
|
|
|
// 供应商信息回填:判断是否为计划内供应商
|
|
|
|
|
if (form.supplierContactId) {
|
|
|
|
|
const supplier = supplierList.value.find((x: any) => x.supplierId === form.supplierContactId);
|
|
|
|
|
if (supplier) {
|
|
|
|
|
// 计划内供应商
|
|
|
|
|
supplierPlanFlag.value = '1';
|
|
|
|
|
if (!form.supplierContactPhone || !form.supplierContactEmail || !form.supplierContactName) {
|
|
|
|
|
if (form.supplierContactId && (!form.supplierContactPhone || !form.supplierContactEmail || !form.supplierContactName)) {
|
|
|
|
|
onSupplierChanged(form.supplierContactId);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 计划外供应商
|
|
|
|
|
supplierPlanFlag.value = '2';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 仅使用后端VO内联返回的 itemsVo,前端不再单独请求子表接口
|
|
|
|
|
const inlineItems = (res.data as any)?.itemsVo;
|
|
|
|
|
if (inlineItems && inlineItems.length) {
|
|
|
|
|
@ -975,6 +1016,7 @@ onMounted(async () => {
|
|
|
|
|
quoteMaterialId: r.quoteMaterialId,
|
|
|
|
|
quoteId: r.quoteId,
|
|
|
|
|
itemNo: r.itemNo,
|
|
|
|
|
materialFlag: r.materialFlag,
|
|
|
|
|
materialId: r.materialId,
|
|
|
|
|
relationMaterialId: r.relationMaterialId,
|
|
|
|
|
materialCode: r.materialCode,
|
|
|
|
|
@ -997,6 +1039,7 @@ onMounted(async () => {
|
|
|
|
|
}
|
|
|
|
|
// 新增模式:如已有编号则禁用生成按钮
|
|
|
|
|
if (!id) {
|
|
|
|
|
applyDefaultSupplier();
|
|
|
|
|
isCodeGenerated.value = !!form.quoteCode;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|