From aaf943ada13005f2b22d01e3d7080b8740d9aa96 Mon Sep 17 00:00:00 2001 From: zhang_12370 <z2864490065@outlook.com> Date: 星期二, 15 七月 2025 15:09:49 +0800 Subject: [PATCH] 添加待入库功能及优化配煤计算器 --- src/views/procureMent/index.vue | 2 src/views/warehouseManagement/index.vue | 2 src/views/calculator/index.vue | 250 ++++++++++++++++++++++++++++++++++++++++++------- src/api/calculator/index.js | 10 ++ src/views/procureMent/components/ProductionDialog.vue | 15 -- 5 files changed, 230 insertions(+), 49 deletions(-) diff --git a/src/api/calculator/index.js b/src/api/calculator/index.js index f20ee1b..9cdb06e 100644 --- a/src/api/calculator/index.js +++ b/src/api/calculator/index.js @@ -8,4 +8,14 @@ method: 'get', params: query }) +} + +// /pendingInventory/addPending +// 娣诲姞寰呭叆搴撴暟鎹� +export function addPendingInventory(data) { + return request({ + url: '/pendingInventory/addPending', + method: 'post', + data + }) } \ No newline at end of file diff --git a/src/views/calculator/index.vue b/src/views/calculator/index.vue index c20d714..fa71e86 100644 --- a/src/views/calculator/index.vue +++ b/src/views/calculator/index.vue @@ -85,20 +85,21 @@ <el-form-item :label="'鐓ょ' + (index + 1)"> <div class="input-wrapper"> <el-input - v-model="item.name" + v-model="item.coalId" v-show="item.type !== '宸叉湁鐓�'" placeholder="璇疯緭鍏�" style="width: 100%" /> <el-select - v-model="item.name" + v-model="item.coalId" v-show="item.type === '宸叉湁鐓�'" placeholder="璇烽�夋嫨" style="width: 100%" + @change="handleCoalSelectChange(index, item.coalId)" > <el-option - v-for="ele in coalInfoList" + v-for="ele in infoCoals" :key="ele.key" :label="ele.value" :value="ele.key" @@ -111,12 +112,28 @@ <el-col :span="6"> <el-form-item label="鍙戠儹閲�"> <el-input + v-if="item.type !== '鏈煡鐓�'" + :value=" + infoCoals.find((coal) => coal.key === item.coalId) + ?.item.coalValues.find((value) => value.fieldName === '鍙戠儹閲�')?.coalValue || '0' + " + type="number" + style="width: 100%" + :disabled="true" + > + <template v-slot:suffix> + <i style="font-style: normal">kcal</i> + </template> + </el-input> + <el-input + v-else v-model="item.cv" type="number" + placeholder="璇疯緭鍏ュ彂鐑噺" style="width: 100%" > <template v-slot:suffix> - <i style="font-style: normal">kcal/kg</i> + <i style="font-style: normal">kcal</i> </template> </el-input> </el-form-item> @@ -124,7 +141,24 @@ <el-col :span="6"> <el-form-item label="浠锋牸"> <el-input + v-if="item.type !== '鏈煡鐓�'" + + :value=" + infoCoals.find((coal) => coal.key === item.coalId) + ?.item.priceExcludingTax || 0 + " + type="number" + style="width: 100%" + :disabled="item.type === '宸叉湁鐓�'" + > + <template v-slot:suffix> + <i style="font-style: normal">鍏�/鍚�</i> + </template> + </el-input> + <el-input + v-else v-model="item.price" + placeholder="璇疯緭鍏ヤ环鏍�" type="number" style="width: 100%" > @@ -139,6 +173,23 @@ <el-col :span="6"> <el-form-item label="纭垎"> <el-input + v-if="item.type !== '鏈煡鐓�'" + :disabled="item.type === '宸叉湁鐓�'" + v-model="item.sulfur" + :value=" + infoCoals.find((coal) => coal.key === item.coalId) + ?.item.coalValues.find((value) => value.fieldName === '纭垎')?.coalValue || '0' + " + type="number" + placeholder="鍙��" + style="width: 100%" + > + <template v-slot:suffix> + <i style="font-style: normal">%</i> + </template> + </el-input> + <el-input + v-else v-model="item.sulfur" type="number" placeholder="鍙��" @@ -153,6 +204,23 @@ <el-col :span="6"> <el-form-item label="鐏板垎"> <el-input + v-if="item.type !== '鏈煡鐓�'" + :disabled="item.type === '宸叉湁鐓�'" + v-model="item.ash" + :value=" + infoCoals.find((coal) => coal.key === item.coalId) + ?.item.coalValues.find((value) => value.fieldName === '鐏板垎')?.coalValue || '0' + " + type="number" + placeholder="鍙��" + style="width: 100%" + > + <template v-slot:suffix> + <i style="font-style: normal">%</i> + </template> + </el-input> + <el-input + v-else v-model="item.ash" type="number" placeholder="鍙��" @@ -167,6 +235,23 @@ <el-col :span="6"> <el-form-item label="姘村垎"> <el-input + v-if="item.type !== '鏈煡鐓�'" + :disabled="item.type === '宸叉湁鐓�'" + v-model="item.moisture" + :value=" + infoCoals.find((coal) => coal.key === item.coalId) + ?.item.coalValues.find((value) => value.fieldName === '姘村垎')?.coalValue || '0' + " + type="number" + placeholder="鍙��" + style="width: 100%" + > + <template v-slot:suffix> + <i style="font-style: normal">%</i> + </template> + </el-input> + <el-input + v-else v-model="item.moisture" type="number" placeholder="鍙��" @@ -202,7 +287,7 @@ style="width: 100%" > <template v-slot:suffix> - <i style="font-style: normal">kcal/kg</i> + <i style="font-style: normal">kcal</i> </template> </el-input> </el-form-item> @@ -289,17 +374,22 @@ class="result-table" style="width: 100%" > - <el-table-column prop="name" label="鐓ょ" min-width="80"> + <el-table-column prop="coalId" label="鐓ょ" min-width="80"> <template #default="scope"> - {{ matchCoalName(scope.row.name) }} + {{ + infoCoals.find((coal) => coal.key === scope.row.coalId) + ?.value || + "" || + matchCoalName(scope.row.coalId) + }} </template> </el-table-column> <el-table-column prop="ratio" label="閰嶆瘮" min-width="80"> <template #default="scope"> {{ scope.row.ratio }}% </template> </el-table-column> - <el-table-column prop="tonnage" label="鍚ㄦ暟" min-width="80"> + <el-table-column prop="quantity" label="鍚ㄦ暟" min-width="80"> <template #default="scope"> - {{ scope.row.tonnage }}鍚� + {{ scope.row.quantity }}鍚� </template> </el-table-column> <el-table-column prop="scoops" label="閾叉暟" min-width="80"> @@ -317,7 +407,7 @@ <div class="prop-item"> <span class="prop-label">鍙戠儹閲�:</span> <span class="prop-value" - >{{ result.optimal.props.cv.toFixed(2) }} kcal/kg</span + >{{ result.optimal.props.cv.toFixed(2) }} kcal</span > </div> <div class="prop-item"> @@ -382,15 +472,24 @@ class="alt-table" style="width: 100%" > - <el-table-column prop="name" label="鐓ょ" min-width="80" /> + <el-table-column prop="coalId" label="鐓ょ" min-width="80"> + <template #default="scope"> + {{ + infoCoals.find((coal) => coal.key === scope.row.coalId) + ?.value || + "" || + matchCoalName(scope.row.coalId) + }} + </template> + </el-table-column> <el-table-column prop="ratio" label="閰嶆瘮" min-width="80"> <template #default="scope"> {{ scope.row.ratio }}% </template> </el-table-column> - <el-table-column prop="tonnage" label="鍚ㄦ暟" min-width="80"> + <el-table-column prop="quantity" label="鍚ㄦ暟" min-width="80"> <template #default="scope"> - {{ scope.row.tonnage }}鍚� + {{ scope.row.quantity }}鍚� </template> </el-table-column> <el-table-column prop="scoops" label="閾叉暟" min-width="80"> @@ -402,7 +501,7 @@ </div> <div class="alt-props"> - <span>鍙戠儹閲�: {{ alt.props.cv.toFixed(2) }} kcal/kg锛�</span> + <span>鍙戠儹閲�: {{ alt.props.cv.toFixed(2) }} kcal锛�</span> <span>纭垎: {{ alt.props.sulfur.toFixed(2) }}%锛�</span> <span>鐏板垎: {{ alt.props.ash.toFixed(2) }}%锛�</span> <span>姘村垎: {{ alt.props.moisture.toFixed(2) }}%锛�</span> @@ -423,9 +522,10 @@ </template> <script setup> -import { reactive, toRefs, nextTick, onMounted } from "vue"; +import { reactive, toRefs, nextTick, onMounted, ref } from "vue"; import { ElMessage, ElMessageBox } from "element-plus"; import { getCoalInfoList } from "@/api/procureMent"; // 鍋囪鏈変竴涓狝PI鑾峰彇鐓ょ淇℃伅 +import { getCoalBlendingList,addPendingInventory } from "@/api/calculator/index.js"; const data = reactive({ formInline: { @@ -443,7 +543,7 @@ coalForms: [ { type: "鏈煡鐓�", - name: "鐓", + coalId: "鐓", cv: 6200, // 鍙戠儹閲� price: 450, // 浠锋牸 sulfur: 0.6, // 纭垎 @@ -452,7 +552,7 @@ }, { type: "鏈煡鐓�", - name: "鐓", + coalId: "鐓", cv: 5800, price: 380, sulfur: 1.0, @@ -461,7 +561,7 @@ }, { type: "鏈煡鐓�", - name: "鐓", + coalId: "鐓", cv: 5400, price: 320, sulfur: 1.4, @@ -478,6 +578,37 @@ createCoal: null, }, }); +const handleCoalSelectChange = (index, coalId) => { + const selectedCoal = infoCoals.value.find(item => item.key === coalId); + + if (selectedCoal && selectedCoal.item && selectedCoal.item.coalValues) { + console.log('閫変腑鐨勭叅绉�:', selectedCoal); + + // 瀹夊叏鍦拌幏鍙栧悇椤圭叅璐ㄥ弬鏁� + const getCoalValue = (fieldName) => { + const coalValue = selectedCoal.item.coalValues.find( + (value) => value.fieldName === fieldName + ); + return coalValue ? coalValue.coalValue : ''; + }; + + // 鏇存柊琛ㄥ崟鏁版嵁 + data.coalForms[index].price = selectedCoal.item.priceExcludingTax || 0; + data.coalForms[index].cv = getCoalValue("鍙戠儹閲�") || 0; + data.coalForms[index].sulfur = getCoalValue("纭垎") || 0; + data.coalForms[index].ash = getCoalValue("鐏板垎") || 0; + data.coalForms[index].moisture = getCoalValue("姘村垎") || 0; + + // 璁剧疆浠锋牸锛堝鏋滄湁鐨勮瘽锛� + if (selectedCoal.item.priceExcludingTax) { + data.coalForms[index].price = selectedCoal.item.priceExcludingTax; + } + + console.log('鏇存柊鍚庣殑琛ㄥ崟鏁版嵁:', data.coalForms[index]); + } else { + console.warn('鏈壘鍒伴�変腑鐨勭叅绉嶆暟鎹垨鏁版嵁鏍煎紡涓嶆纭�'); + } +}; const coalInfoList = ref([]); // onMounted const getCoalInfo = async () => { @@ -496,12 +627,19 @@ }; // 琛ㄦ牸灞曠ず鐢細浼樺厛鐢� key 鍖归厤涓枃鍚嶏紝鍐嶇敤 value 鍖归厤锛屾渶鍚庡師鏍疯繑鍥� const matchCoalName = (name) => { - if (!name || !Array.isArray(coalInfoList.value) || coalInfoList.value.length === 0) return name; + if ( + !name || + !Array.isArray(coalInfoList.value) || + coalInfoList.value.length === 0 + ) + return name; // key 鍖归厤 - const byKey = coalInfoList.value.find(item => String(item.key) === String(name)); + const byKey = coalInfoList.value.find( + (item) => String(item.key) === String(name) + ); if (byKey) return byKey.value; // value 鍖归厤 - const byValue = coalInfoList.value.find(item => item.value === name); + const byValue = coalInfoList.value.find((item) => item.value === name); if (byValue) return byValue.value; // 鍘熸牱杩斿洖 return name; @@ -522,9 +660,9 @@ result.value.optimal.props.createCoal = found ? found.key : val; // 鏂板锛氬鏋滃尮閰嶆垚鍔燂紝鐣欎竴涓猧d瀛楁 if (found) { - result.value.optimal.props.createCoalId = found.key; + result.value.optimal.props.coalId = found.key; } else { - result.value.optimal.props.createCoalId = null; + result.value.optimal.props.coalId = null; } let match = matchCoalName(result.value.optimal.props.createCoal); if (match && match !== result.value.optimal.props.createCoal) { @@ -533,7 +671,23 @@ }; onMounted(async () => { getCoalInfo(); + geInfoCoals(); }); +const infoCoals = ref([]); +// 鍒濆鍖栫叅绉嶅瓧娈� +const geInfoCoals = async () => { + let res = await getCoalBlendingList(); + if (res.code === 200) { + infoCoals.value = res.data.map((item) => ({ + value: item.supplierCoal, + key: item.coalId, + item, + })); + console.log(infoCoals.value); + } else { + ElMessage.error("鑾峰彇鐓ょ淇℃伅澶辫触锛岃绋嶅悗閲嶈瘯"); + } +}; // 绾挎�ц鍒掓眰瑙e嚱鏁� const solveBlend = (coals, constraints) => { // 鏁版嵁楠岃瘉 @@ -613,12 +767,12 @@ return coals .map((coal, i) => { if (ratios[i] < 1e-6) return null; - let tonnage = ratios[i] * total; - let scoops = tonnage / scoop; + let quantity = ratios[i] * total; + let scoops = quantity / scoop; return { - name: coal.name, + coalId: coal.coalId, ratio: (ratios[i] * 100).toFixed(2), - tonnage: tonnage.toFixed(1), + quantity: quantity.toFixed(1), scoops: scoops.toFixed(1), }; }) @@ -641,7 +795,7 @@ data.coalForms = [ { type: "鏈煡鐓�", - name: "鐓", + coalId: "鐓", cv: 6200, price: 450, sulfur: 0.6, @@ -650,7 +804,7 @@ }, { type: "鏈煡鐓�", - name: "鐓", + coalId: "鐓", cv: 5800, price: 380, sulfur: 1.0, @@ -659,7 +813,7 @@ }, { type: "鏈煡鐓�", - name: "鐓", + coalId: "鐓", cv: 5400, price: 320, sulfur: 1.4, @@ -676,7 +830,7 @@ ElMessage.success("琛ㄥ崟宸查噸缃�"); }; const addWarehoused = () => { - console.log(coalInfoList.value); + if (!result.value) { ElMessage.error("璇峰厛璁$畻鏈�浼橀厤姣斿悗鍐嶆坊鍔犺嚦寰呭叆搴�"); return; @@ -689,7 +843,7 @@ ElMessage.error("璇峰厛閫夋嫨鐢熸垚鐓ょ"); return; } - const coals = result.value.optimal.instructions.map((item) => item.name); + const coals = result.value.optimal.instructions.map((item) => item.coalId); let allFound = true; for (const element of coals) { let found = false; @@ -710,8 +864,7 @@ } let createCoalFound = false; for (const item of coalInfoList.value) { - if (item.key === result.value.optimal.props.createCoalId) { - console.log("鐢熸垚鐓ょ宸插瓨鍦�"); + if (item.key === result.value.optimal.props.coalId) { createCoalFound = true; break; } @@ -720,11 +873,34 @@ ElMessage.warning("鐢熸垚鐓ょ鏄湭鐭ョ叅绉嶏紝鏃犳硶娣诲姞鑷冲緟鍏ュ簱"); return; } + // result.value.optimal.props fieldsResultList + // result.value.optimal.instructions 琛ㄦ牸鏁版嵁coalResultList + console.log("娣诲姞鑷冲緟鍏ュ簱鏁版嵁锛�", result.value.optimal); + // cost淇濈暀涓や綅灏忔暟 + result.value.optimal.props.totalTonnage = formInline.value.totalTonnage; + result.value.optimal.instructions.forEach((item) => { + item.officialId = item.coalId; // 娣诲姞瀹樻柟ID瀛楁 + }); + result.value.optimal.props.cost = parseFloat( + result.value.optimal.props.cost.toFixed(2) + ); + result.value.optimal.props.totalTonnage = formInline.value.totalTonnage; + let arr = [result.value.optimal.props, [...result.value.optimal.instructions]]; + let params = { + fieldsResultList: arr[0], + coalResultList: arr[1], + }; + addPendingInventory(params).then((res)=>{ + if(res.code === 200 && res.data== true){ + ElMessage.success("娣诲姞鑷冲緟鍏ュ簱鎴愬姛"); + } + }) }; const submitForm = () => { + console.log("鐓ょ淇℃伅锛�", coalForms.value); // 鏁版嵁楠岃瘉 let validCoals = coalForms.value.filter( - (coal) => coal.name && coal.cv && coal.price + (coal) => coal.coalId && coal.cv && coal.price ); if (validCoals.length < 2) { @@ -846,7 +1022,7 @@ while (coalForms.value.length < num) { coalForms.value.push({ type: "鏈煡鐓�", - name: `鐓�${String.fromCharCode(65 + coalForms.value.length)}`, + coalId: `鐓�${String.fromCharCode(65 + coalForms.value.length)}`, cv: 0, price: 0, sulfur: "", @@ -859,7 +1035,7 @@ // 澶勭悊鐓ょ绫诲瀷鍙樺寲 const handleCoalTypeChange = (index) => { // 褰撶叅绉嶇被鍨嬫敼鍙樻椂锛屾竻绌虹叅绉嶅悕绉帮紝閬垮厤鏁版嵁娣蜂贡 - coalForms.value[index].name = ""; + coalForms.value[index].coalId = ""; }; </script> diff --git a/src/views/procureMent/components/ProductionDialog.vue b/src/views/procureMent/components/ProductionDialog.vue index e92ddac..4378006 100644 --- a/src/views/procureMent/components/ProductionDialog.vue +++ b/src/views/procureMent/components/ProductionDialog.vue @@ -282,20 +282,13 @@ priceExcludingTax: [ {required: true, message: "璇疯緭鍏ュ崟浠�", trigger: "blur"}, ], - totalPriceExcludingTax: [ - {required: true, message: "璇疯緭鍏ユ�讳环", trigger: "blur"}, - ], priceIncludingTax: [ {required: true, message: "璇疯緭鍏ュ惈绋庡崟浠�", trigger: "blur"}, ], - totalPriceIncludingTax: [ - {required: true, message: "璇疯緭鍏ュ惈绋庢�讳环", trigger: "blur"}, - ], - taxRate: [{required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur"}], - registrantId: [{required: true, message: "璇疯緭鍏ョ櫥璁颁汉", trigger: "blur"}], - registrationDate: [ - {required: true, message: "璇烽�夋嫨鐧昏鏃ユ湡", trigger: "change"}, - ], + taxRate:[ + {required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur"}, + {type: "number", message: "绋庣巼蹇呴』涓烘暟瀛�", trigger: "blur"}, + ] }; // 鍏抽棴寮圭獥 const handleClose = () => { diff --git a/src/views/procureMent/index.vue b/src/views/procureMent/index.vue index 24929ac..ee9d5c5 100644 --- a/src/views/procureMent/index.vue +++ b/src/views/procureMent/index.vue @@ -217,7 +217,7 @@ totalPriceExcludingTax: "", priceIncludingTax: "", totalPriceIncludingTax: "", - taxRate: "", + taxRate: "13", registrantId: userInfo.value.userId, registrationDate: new Date().toISOString().split("T")[0], }; diff --git a/src/views/warehouseManagement/index.vue b/src/views/warehouseManagement/index.vue index 6fd3887..12bfcdc 100644 --- a/src/views/warehouseManagement/index.vue +++ b/src/views/warehouseManagement/index.vue @@ -317,12 +317,14 @@ coal: [{ required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur" }], unit: [{ required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" }], coalPlanId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }], + supplierId: [{ required: true, message: "璇烽�夋嫨渚涘簲鍟�", trigger: "change" }], }, mergeRules: { supplierName: [{ required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" }], coal: [{ required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur" }], unit: [{ required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" }], coalPlanId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }], + supplierId: [{ required: true, message: "璇烽�夋嫨渚涘簲鍟�", trigger: "change" }], } }) -- Gitblit v1.9.3