import axios from "@/utils/request"; import { deepClone } from "../../utils"; /* 状态 */ const state = { copilot: { /* 产量驾驶舱 */ yield: { ftoInvest: null, chipInvest: null, chipOutput: null, stdOutput: null, bipvOutput: null, }, /* 能源驾驶舱 */ energy: {}, /* 效率驾驶舱 */ efficiency: {}, }, home: { ftoInvest: null, chipInvest: null, chipOutput: null, stdOutput: null, bipvOutput: null, }, }; const mutations = { SET_HOME_INFO: (state, payload) => { state.home.ftoInvest = payload.ftoInvest; state.home.chipInvest = payload.chipInvest; state.home.chipOutput = payload.chipOutput; state.home.stdOutput = payload.stdOutput; state.home.bipvOutput = payload.bipvOutput; }, SET_COPILOT_INFO: (state, { type, payload }) => { switch (type) { case "yield": state.copilot.yield.ftoInvest = payload.ftoInvest; state.copilot.yield.chipInvest = payload.chipInvest; state.copilot.yield.chipOutput = payload.chipOutput; state.copilot.yield.stdOutput = payload.stdOutput; state.copilot.yield.bipvOutput = payload.bipvOutput; break; case "energy": state.copilot.energy = payload.data; break; case "efficiency": state.copilot.efficiency = payload.data; break; } }, }; const actions = { /** 初始化首页数据 */ async initHome({ commit }) { const dataArr = await getHomeInfo(); const targetArr = await getHomeTarget(); const payload = splitCurrentAndPrevious(dataArr, targetArr); commit("SET_HOME_INFO", payload); }, /** 初始化驾驶舱数据 */ async initCopilot({ commit }, { period, source }) { const fetcher = { yield: getCopilotYield, energy: getCopilotEnergy, efficiency: getCopilotEfficiency, }[source]; // 获取产量数据 let { data: factoryList, type } = await fetcher(period); let targetList = null; if (source === "yield" || source === "efficiency") { // 获取目标数据 let { data } = await fetcher(period, true); targetList = data; } const payload = splitCurrentAndPrevious(factoryList, targetList); commit("SET_COPILOT_INFO", { type, payload }); }, }; export default { namespaced: true, state, mutations, actions, }; // utils function function splitCurrentAndPrevious(factoryListResponse, targetListResponse) { const { chipInvest, ftoInvest, chipOutput, stdOutput, bipvOutput } = init(); if (factoryListResponse) { for (const factory of factoryListResponse) { const fId = getFactoryId(factory); // 获取目标值 if (targetListResponse) { const { chipYield, componentYield, bipvProductOutput } = getFactoryTargetValue(targetListResponse, fId); chipOutput.target[fId] = chipYield; stdOutput.target[fId] = componentYield; bipvOutput.target[fId] = bipvProductOutput; } // 芯片投入 chipInvest.current[fId] = factory.inputNumber; chipInvest.previous[fId] = factory.previousYearInputNumber; // FTO投入 ftoInvest.current[fId] = factory.chipInput; ftoInvest.previous[fId] = factory.previousYearChipInput; // 产出数据, 0 - (玻璃)芯片产出, 1 - 标准组件产出, 2 - BIPV产出 // 因为后端写的垃圾数据,所以这里要做一下判断 if (![0, 1, 2].includes(factory.glassType)) continue; const _t = [chipOutput, stdOutput, bipvOutput][factory.glassType]; _t.current[fId] = factory.outputNumber; _t.previous[fId] = factory.previousYearOutputNumber; // debugger; } return { chipInvest, ftoInvest, chipOutput, stdOutput, bipvOutput, }; } } function getFactoryId(factory) { return factory.factory; } function getFactoryTargetValue(targetList, factoryId) { const target = targetList.find((item) => item.factory === factoryId); if (target) { return { // 自带模拟数据了.... random_default chipYield: target.chipYield ?? random_default(), componentYield: target.componentYield ?? random_default(), bipvProductOutput: target.bipvProductOutput ?? random_default(), }; } return { chipYield: random_default(), componentYield: random_default(), bipvProductOutput: random_default(), }; } function init() { const t_ = { current: Array(7).fill(0), previous: Array(7).fill(0), }; // 芯片投入 const chipInvest = deepClone(t_); // FTO投入 const ftoInvest = deepClone(t_); // 芯片产出 const chipOutput = { ...deepClone(t_), target: Array(7).fill(0), }; // 标准组件产出 const stdOutput = deepClone(chipOutput); // BIPV产出 const bipvOutput = deepClone(chipOutput); return { chipInvest, ftoInvest, chipOutput, stdOutput, bipvOutput, }; } function random_default() { return 0; let a = Math.floor(Math.random() * 1000); while (a < 600) { a = Math.floor(Math.random() * 1000); } return a; } /* 接口 */ async function getHomeInfo() { const { code, data } = await axios.post("/ip/prod-output/query-by-date", { factorys: [], date: 4, }); if (code == 0) { return data; } console.warn("getHomeInfo failed, code: ", code); return null; } async function getHomeTarget() { const { code, data } = await axios.post("/ip/prod-target/query-by-date", { factorys: [], date: 4, }); if (code == 0) { return data; } console.warn("getHomeTarget failed, code: ", code); return null; } function getUrl(copilot_module) { let url = { // 对比数据的 URL comparison: "", // 目标数据的 URL target: "", }; switch (copilot_module) { case "yield": url.comparison = "/ip/prod-output/query-by-date"; url.target = "/ip/prod-target/query-by-date"; break; case "energy": break; case "efficiency": url.comparison = "/ip/prod-output/query-Rate-List"; url.target = "/ip/prod-target/query-rate-target"; break; } return url; } async function doFetch(copilot_module = "yield", fetch_target, params) { const url = getUrl(copilot_module); const { code, data } = await axios.post( fetch_target ? url.target : url.comparison, { ...params, } ); if (code == 0) { return data; } console.warn("[doFetch] failed, code: ", code); return null; } function getCopilotYield(period, target = false) { return getCopilotData("yield", period, target); } function getCopilotEnergy(period, target = false) { return getCopilotData("energy", period, target); } function getCopilotEfficiency(period, target = false) { return getCopilotData("efficiency", period, target); } /** * * @param {*} period 周期: 日周月年 * @param {*} target 是否获取目标数据:默认 否 * @returns */ async function getCopilotData(copilot_module, period, target = false) { if (!copilot_module) copilot_module = "yield"; // 请求参数,直接一次性获取所有工厂 let queryParams = { factorys: [], date: 4, }; switch (period) { case "日": queryParams.date = 1; break; case "周": queryParams.date = 2; break; case "月": queryParams.date = 3; break; case "年": queryParams.date = 4; break; default: queryParams.date = 1; break; } return { data: await doFetch(copilot_module, target ? true : false, queryParams), type: copilot_module, }; }