From 23006c64e0d7478ff2e8c723f2bfda3781b65b09 Mon Sep 17 00:00:00 2001
From: zhang_12370 <z2864490065@outlook.com>
Date: 星期五, 18 七月 2025 11:59:20 +0800
Subject: [PATCH] 1、优化配煤计算器 2、优化正是库存数据渲染问题
---
src/views/warehouseManagement/index.vue | 5
src/views/calculator/index.vue | 398 +++++++++++++++++++++++---------------------------------
package.json | 2
.env.production | 4
vite.config.js | 5
5 files changed, 177 insertions(+), 237 deletions(-)
diff --git a/.env.production b/.env.production
index 52cbc80..896620d 100644
--- a/.env.production
+++ b/.env.production
@@ -5,7 +5,7 @@
VITE_APP_ENV = 'production'
# 闄曡タ鏄痉鐜繚鍨嬬叅鏈夐檺鍏徃/鐢熶骇鐜
-VITE_APP_BASE_API = '/prod-api'
-
+# VITE_APP_BASE_API = '/prod-api'
+VITE_APP_BASE_API = '/dev-api'
# 鏄惁鍦ㄦ墦鍖呮椂寮�鍚帇缂╋紝鏀寔 gzip 鍜� brotli
VITE_BUILD_COMPRESS = gzip
\ No newline at end of file
diff --git a/package.json b/package.json
index 633d6a8..ed8607f 100644
--- a/package.json
+++ b/package.json
@@ -7,7 +7,7 @@
"type": "module",
"scripts": {
"dev": "vite",
- "build:prod": "vite build",
+ "build": "vite build",
"build:stage": "vite build --mode staging",
"preview": "vite preview"
},
diff --git a/src/views/calculator/index.vue b/src/views/calculator/index.vue
index fa71e86..814e57f 100644
--- a/src/views/calculator/index.vue
+++ b/src/views/calculator/index.vue
@@ -581,92 +581,75 @@
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 {
+ if (!selectedCoal?.item?.coalValues) {
console.warn('鏈壘鍒伴�変腑鐨勭叅绉嶆暟鎹垨鏁版嵁鏍煎紡涓嶆纭�');
+ return;
}
+
+ // 鑾峰彇鐓よ川鍙傛暟鐨勯�氱敤鍑芥暟
+ const getCoalValue = (fieldName) => {
+ return selectedCoal.item.coalValues.find(
+ value => value.fieldName === fieldName
+ )?.coalValue || 0;
+ };
+
+ // 鎵归噺鏇存柊琛ㄥ崟鏁版嵁
+ Object.assign(data.coalForms[index], {
+ price: selectedCoal.item.priceExcludingTax || 0,
+ cv: getCoalValue("鍙戠儹閲�"),
+ sulfur: getCoalValue("纭垎"),
+ ash: getCoalValue("鐏板垎"),
+ moisture: getCoalValue("姘村垎")
+ });
};
const coalInfoList = ref([]);
-// onMounted
+// 鑾峰彇鐓ょ淇℃伅
const getCoalInfo = async () => {
- let result = await getCoalInfoList();
- if (result.code === 200) {
- result.data.forEach((item) => {
- let obj = {
+ try {
+ const result = await getCoalInfoList();
+ if (result.code === 200) {
+ coalInfoList.value = result.data.map(item => ({
value: item.coal,
key: item.id,
- };
- coalInfoList.value.push(obj);
- });
- } else {
+ }));
+ } else {
+ ElMessage.error("鑾峰彇鐓ょ淇℃伅澶辫触锛岃绋嶅悗閲嶈瘯");
+ }
+ } catch (error) {
ElMessage.error("鑾峰彇鐓ょ淇℃伅澶辫触锛岃绋嶅悗閲嶈瘯");
}
};
-// 琛ㄦ牸灞曠ず鐢細浼樺厛鐢� key 鍖归厤涓枃鍚嶏紝鍐嶇敤 value 鍖归厤锛屾渶鍚庡師鏍疯繑鍥�
+// 琛ㄦ牸灞曠ず鐢細鍖归厤鐓ょ鍚嶇О
const matchCoalName = (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)
+ if (!name || !coalInfoList.value?.length) return name;
+
+ // 浼樺厛鎸� key 鍖归厤锛屽啀鎸� value 鍖归厤
+ const foundCoal = coalInfoList.value.find(item =>
+ String(item.key) === String(name) || item.value === name
);
- if (byKey) return byKey.value;
- // value 鍖归厤
- const byValue = coalInfoList.value.find((item) => item.value === name);
- if (byValue) return byValue.value;
- // 鍘熸牱杩斿洖
- return name;
+
+ return foundCoal?.value || name;
};
// 鑷姩琛ュ叏鎼滅储
const querySearch = (q, cb) => {
- const res = q
- ? coalInfoList.value.filter((c) => c.value.includes(q))
+ const results = q
+ ? coalInfoList.value.filter(c => c.value.includes(q))
: coalInfoList.value;
- cb(res);
+ cb(results);
};
-// 閫夋嫨/澶辩劍鏃讹紝浼樺厛瀛� key锛屾壘涓嶅埌鍒欏瓨鍘熷��
+
+// 閫夋嫨/澶辩劍澶勭悊
const handleSelect = (item) => {
- const val = item.value || (item.target && item.target.value) || "";
- const found = coalInfoList.value.find(
- (c) => c.value === val || c.key === val
- );
+ const val = item.value || item.target?.value || "";
+ const found = coalInfoList.value.find(c => c.value === val || c.key === val);
+
result.value.optimal.props.createCoal = found ? found.key : val;
- // 鏂板锛氬鏋滃尮閰嶆垚鍔燂紝鐣欎竴涓猧d瀛楁
- if (found) {
- result.value.optimal.props.coalId = found.key;
- } else {
- result.value.optimal.props.coalId = null;
- }
- let match = matchCoalName(result.value.optimal.props.createCoal);
- if (match && match !== result.value.optimal.props.createCoal) {
- result.value.optimal.props.createCoal = match;
+ result.value.optimal.props.coalId = found?.key || null;
+
+ // 鏇存柊鏄剧ず鍚嶇О
+ const matchedName = matchCoalName(result.value.optimal.props.createCoal);
+ if (matchedName !== result.value.optimal.props.createCoal) {
+ result.value.optimal.props.createCoal = matchedName;
}
};
onMounted(async () => {
@@ -676,67 +659,51 @@
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 {
+ try {
+ const res = await getCoalBlendingList();
+ if (res.code === 200) {
+ console.log("鑾峰彇鐓ょ淇℃伅鎴愬姛", res.data);
+ infoCoals.value = res.data.map(item => ({
+ value: item.supplierCoal,
+ key: item.coalId,
+ item,
+ }));
+ } else {
+ ElMessage.error("鑾峰彇鐓ょ淇℃伅澶辫触锛岃绋嶅悗閲嶈瘯");
+ }
+ } catch (error) {
ElMessage.error("鑾峰彇鐓ょ淇℃伅澶辫触锛岃绋嶅悗閲嶈瘯");
}
};
// 绾挎�ц鍒掓眰瑙e嚱鏁�
const solveBlend = (coals, constraints) => {
// 鏁版嵁楠岃瘉
- if (constraints.maxSulfur) {
- let missingSulfur = coals.some((coal) => !coal.sulfur && coal.sulfur !== 0);
- if (missingSulfur) {
- throw new Error(
- "濡傛灉璁剧疆浜嗘渶澶х~鍒嗙害鏉燂紝鍒欐墍鏈夊弬涓庨厤姣旂殑鐓ょ閮藉繀椤绘彁渚涚~鍒嗘暟鎹��"
- );
+ const validateConstraint = (constraintValue, fieldName, coalField) => {
+ if (constraintValue && coals.some(coal => !coal[coalField] && coal[coalField] !== 0)) {
+ throw new Error(`濡傛灉璁剧疆浜�${fieldName}绾︽潫锛屽垯鎵�鏈夌叅绉嶉兘蹇呴』鎻愪緵${fieldName}鏁版嵁銆俙);
}
- }
- if (constraints.maxAsh) {
- let missingAsh = coals.some((coal) => !coal.ash && coal.ash !== 0);
- if (missingAsh) {
- throw new Error("濡傛灉璁剧疆浜嗘渶澶х伆鍒嗙害鏉燂紝鍒欐墍鏈夌叅绉嶉兘蹇呴』鎻愪緵鐏板垎鏁版嵁銆�");
- }
- }
- if (constraints.maxMoisture) {
- let missingMoisture = coals.some(
- (coal) => !coal.moisture && coal.moisture !== 0
- );
- if (missingMoisture) {
- throw new Error("濡傛灉璁剧疆浜嗘渶澶ф按鍒嗙害鏉燂紝鍒欐墍鏈夌叅绉嶉兘蹇呴』鎻愪緵姘村垎鏁版嵁銆�");
- }
- }
+ };
- // 绠�鍗曠殑绾挎�ц鍒掓眰瑙o紙鏈�灏忓寲鎴愭湰锛�
- // 杩欓噷浣跨敤绠�鍖栫殑绠楁硶锛屽疄闄呴」鐩腑鍙互闆嗘垚鏇翠笓涓氱殑姹傝В鍣�
+ validateConstraint(constraints.maxSulfur, '鏈�澶х~鍒�', 'sulfur');
+ validateConstraint(constraints.maxAsh, '鏈�澶х伆鍒�', 'ash');
+ validateConstraint(constraints.maxMoisture, '鏈�澶ф按鍒�', 'moisture');
+
try {
- // 妯℃嫙姹傝В杩囩▼
- let totalCoals = coals.length;
- let ratios = new Array(totalCoals).fill(0);
-
// 绠�鍗曠殑绛夋潈閲嶅垎閰嶄綔涓哄垵濮嬭В
- let avgRatio = 1 / totalCoals;
- ratios = ratios.map(() => avgRatio);
+ let ratios = new Array(coals.length).fill(1 / coals.length);
- // 楠岃瘉绾︽潫鏉′欢
+ // 楠岃瘉绾︽潫鏉′欢骞惰皟鏁撮厤姣�
let blendProps = calcBlendProps(coals, ratios);
if (constraints.minCalorific && blendProps.cv < constraints.minCalorific) {
- // 璋冩暣閰嶆瘮浠ユ弧瓒虫渶浣庡彂鐑噺
- let highCvCoals = coals
+ // 浼樺厛浣跨敤楂樺彂鐑噺鐓ょ
+ const sortedCoals = coals
.map((coal, i) => ({ index: i, cv: coal.cv }))
.sort((a, b) => b.cv - a.cv);
- ratios = new Array(totalCoals).fill(0);
- ratios[highCvCoals[0].index] = 0.6;
- ratios[highCvCoals[1] ? highCvCoals[1].index : 0] = 0.4;
+ ratios = new Array(coals.length).fill(0);
+ ratios[sortedCoals[0].index] = 0.6;
+ if (sortedCoals[1]) ratios[sortedCoals[1].index] = 0.4;
}
return ratios;
@@ -830,77 +797,66 @@
ElMessage.success("琛ㄥ崟宸查噸缃�");
};
const addWarehoused = () => {
+ // 楠岃瘉鍓嶇疆鏉′欢
+ const validationChecks = [
+ { condition: !result.value, message: "璇峰厛璁$畻鏈�浼橀厤姣斿悗鍐嶆坊鍔犺嚦寰呭叆搴�" },
+ { condition: !result.value.optimal, message: "璇峰厛璁$畻鏈�浼橀厤姣�" },
+ { condition: !result.value.optimal.props.createCoal, message: "璇峰厛閫夋嫨鐢熸垚鐓ょ" }
+ ];
- if (!result.value) {
- ElMessage.error("璇峰厛璁$畻鏈�浼橀厤姣斿悗鍐嶆坊鍔犺嚦寰呭叆搴�");
- return;
- }
- if (result.value.optimal === null) {
- ElMessage.error("璇峰厛璁$畻鏈�浼橀厤姣�");
- return;
- }
- if (!result.value.optimal.props.createCoal) {
- ElMessage.error("璇峰厛閫夋嫨鐢熸垚鐓ょ");
- return;
- }
- const coals = result.value.optimal.instructions.map((item) => item.coalId);
- let allFound = true;
- for (const element of coals) {
- let found = false;
- for (const item of coalInfoList.value) {
- if (item.key === element) {
- found = true;
- break;
- }
- }
- if (!found) {
- allFound = false;
- break;
+ for (const check of validationChecks) {
+ if (check.condition) {
+ ElMessage.error(check.message);
+ return;
}
}
- if (!allFound) {
+
+ // 楠岃瘉閰嶆瘮涓殑鐓ょ
+ const coals = result.value.optimal.instructions.map(item => item.coalId);
+ const allCoalsFound = coals.every(coalId =>
+ coalInfoList.value.some(item => item.key === coalId)
+ );
+
+ if (!allCoalsFound) {
ElMessage.error("閰嶆瘮涓寘鍚湭鐭ョ叅绉嶏紝璇峰厛娣诲姞鑷崇叅绉嶅垪琛�");
return;
}
- let createCoalFound = false;
- for (const item of coalInfoList.value) {
- if (item.key === result.value.optimal.props.coalId) {
- createCoalFound = true;
- break;
- }
- }
- if (!createCoalFound) {
+
+ // 楠岃瘉鐢熸垚鐓ょ
+ const createCoalExists = coalInfoList.value.some(
+ item => item.key === result.value.optimal.props.coalId
+ );
+
+ if (!createCoalExists) {
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瀛楁
+
+ // 鍑嗗鏁版嵁
+ const optimalData = result.value.optimal;
+ optimalData.props.totalTonnage = formInline.value.totalTonnage;
+ optimalData.props.cost = parseFloat(optimalData.props.cost.toFixed(2));
+
+ // 娣诲姞瀹樻柟ID
+ optimalData.instructions.forEach(item => {
+ item.officialId = item.coalId;
});
- 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],
+
+ const params = {
+ fieldsResultList: optimalData.props,
+ coalResultList: optimalData.instructions,
};
- addPendingInventory(params).then((res)=>{
- if(res.code === 200 && res.data== true){
- ElMessage.success("娣诲姞鑷冲緟鍏ュ簱鎴愬姛");
- }
- })
+
+ 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.coalId && coal.cv && coal.price
+ const validCoals = coalForms.value.filter(
+ coal => coal.coalId && coal.cv && coal.price
);
if (validCoals.length < 2) {
@@ -910,7 +866,7 @@
try {
// 姹傝В鏈�浼橀厤姣�
- let ratios = solveBlend(validCoals, constraints.value);
+ const ratios = solveBlend(validCoals, constraints.value);
if (!ratios) {
data.result.error = "鏃犲彲琛岃В锛岃妫�鏌ョ害鏉熸潯浠舵垨鐓ょ鏁版嵁";
data.result.show = true;
@@ -918,8 +874,8 @@
}
// 璁$畻缁撴灉
- let props = calcBlendProps(validCoals, ratios);
- let instructions = genInstructions(
+ const props = calcBlendProps(validCoals, ratios);
+ const instructions = genInstructions(
validCoals,
ratios,
formInline.value.totalTonnage,
@@ -928,11 +884,7 @@
data.result = {
show: true,
- optimal: {
- ratios,
- props,
- instructions,
- },
+ optimal: { ratios, props, instructions },
alternatives: [],
error: null,
};
@@ -950,57 +902,42 @@
const generateAlternatives = (coals) => {
const altList = [
- {
- desc: "鍙戠儹閲忛檷1%",
- mod: { minCalorific: constraints.value.minCalorific * 0.99 },
- },
- {
- desc: "鍙戠儹閲忛檷2%",
- mod: { minCalorific: constraints.value.minCalorific * 0.98 },
- },
- {
- desc: "纭垎鍗�1%",
- mod: { maxSulfur: constraints.value.maxSulfur * 1.01 },
- },
- {
- desc: "纭垎鍗�2%",
- mod: { maxSulfur: constraints.value.maxSulfur * 1.02 },
- },
- {
- desc: "鍙戠儹閲忛檷0.5%涓旂~鍒嗗崌0.5%",
+ { desc: "鍙戠儹閲忛檷1%", mod: { minCalorific: constraints.value.minCalorific * 0.99 } },
+ { desc: "鍙戠儹閲忛檷2%", mod: { minCalorific: constraints.value.minCalorific * 0.98 } },
+ { desc: "纭垎鍗�1%", mod: { maxSulfur: constraints.value.maxSulfur * 1.01 } },
+ { desc: "纭垎鍗�2%", mod: { maxSulfur: constraints.value.maxSulfur * 1.02 } },
+ {
+ desc: "鍙戠儹閲忛檷0.5%涓旂~鍒嗗崌0.5%",
mod: {
minCalorific: constraints.value.minCalorific * 0.995,
maxSulfur: constraints.value.maxSulfur * 1.005,
- },
+ }
},
];
- data.result.alternatives = [];
-
- for (let alt of altList) {
+ data.result.alternatives = altList.reduce((alternatives, alt) => {
try {
- let altConstraints = Object.assign({}, constraints.value, alt.mod);
- let altRatios = solveBlend(coals, altConstraints);
- if (!altRatios) continue;
+ const altConstraints = { ...constraints.value, ...alt.mod };
+ const altRatios = solveBlend(coals, altConstraints);
+
+ if (altRatios) {
+ const altProps = calcBlendProps(coals, altRatios);
+ const altInstructions = genInstructions(
+ coals, altRatios, formInline.value.totalTonnage, formInline.value.scoopWeight
+ );
- let altProps = calcBlendProps(coals, altRatios);
- let altInstructions = genInstructions(
- coals,
- altRatios,
- formInline.value.totalTonnage,
- formInline.value.scoopWeight
- );
-
- data.result.alternatives.push({
- desc: alt.desc,
- ratios: altRatios,
- props: altProps,
- instructions: altInstructions,
- });
+ alternatives.push({
+ desc: alt.desc,
+ ratios: altRatios,
+ props: altProps,
+ instructions: altInstructions,
+ });
+ }
} catch (error) {
console.warn(`澶囬�夋柟妗� ${alt.desc} 璁$畻澶辫触:`, error);
}
- }
+ return alternatives;
+ }, []);
};
const { formInline, constraints, coalForms, result } = toRefs(data);
@@ -1012,29 +949,26 @@
return;
}
- // 濡傛灉褰撳墠鏁扮粍闀垮害澶т簬鎵�闇�鏁伴噺锛屾埅鏂�
+ // 鎴柇澶氫綑鐨勬垨濉厖涓嶈冻鐨勭叅绉�
if (coalForms.value.length > num) {
coalForms.value = coalForms.value.slice(0, num);
- return;
- }
-
- // 鍚﹀垯锛屽~鍏呮柊鐨勭┖瀵硅薄
- while (coalForms.value.length < num) {
- coalForms.value.push({
- type: "鏈煡鐓�",
- coalId: `鐓�${String.fromCharCode(65 + coalForms.value.length)}`,
- cv: 0,
- price: 0,
- sulfur: "",
- ash: "",
- moisture: "",
- });
+ } else {
+ while (coalForms.value.length < num) {
+ coalForms.value.push({
+ type: "鏈煡鐓�",
+ coalId: `鐓�${String.fromCharCode(65 + coalForms.value.length)}`,
+ cv: 0,
+ price: 0,
+ sulfur: "",
+ ash: "",
+ moisture: "",
+ });
+ }
}
};
// 澶勭悊鐓ょ绫诲瀷鍙樺寲
const handleCoalTypeChange = (index) => {
- // 褰撶叅绉嶇被鍨嬫敼鍙樻椂锛屾竻绌虹叅绉嶅悕绉帮紝閬垮厤鏁版嵁娣蜂贡
coalForms.value[index].coalId = "";
};
</script>
diff --git a/src/views/warehouseManagement/index.vue b/src/views/warehouseManagement/index.vue
index 12bfcdc..b7bd8a4 100644
--- a/src/views/warehouseManagement/index.vue
+++ b/src/views/warehouseManagement/index.vue
@@ -483,7 +483,9 @@
const mergeRows = (type,row) => {
getDropdownData()
coalPlanListOptions()
- mergeVisible.value = true;
+ if (type === 'edit') {
+ mergeVisible.value = true;
+ }
operationType.value = type;
if (type !== 'merge') {
mergeForm.value = {...row}
@@ -492,6 +494,7 @@
proxy.$modal.msgWarning('璇疯嚦灏戦�夋嫨涓ゆ潯鏁版嵁')
return
}
+ mergeVisible.value = true;
filteredList.value.forEach(item => {
mergeForm.value[item.fields] = ''
})
diff --git a/vite.config.js b/vite.config.js
index ad9e39c..80e2c50 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -2,8 +2,11 @@
import path from 'path'
import createVitePlugins from './vite/plugins'
-const baseUrl = 'http://192.168.1.35:7016' // 鍚庣鎺ュ彛
+const baseUrl = 'http://114.132.189.42:7016' // 鍚庣鎺ュ彛
// const baseUrl = 'http://114.132.189.42:7016'
+// const baseUrl = 'http://10.42.128.207:7016' // 鍚庣鎺ュ彛
+// const baseUrl = 'http://192.168.1.144:7016' // 鍚庣鎺ュ彛
+// const baseUrl = 'http://10.36.17.159:7016' // 鍚庣鎺ュ彛
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
--
Gitblit v1.9.3