| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- import { reactive } from 'vue';
- import service from '/@/utils/request';
- /**
- * 首页 S1 / S3–S7 模块指标数据。
- * 默认值与 Demo 对齐;页面加载后会从数据库覆盖关键指标。
- */
- /** S1 产销协同 */
- export const homeS1 = reactive({
- /** 对应首页:订单及时交付率 */
- reviewSatisfactionPct: 75,
- reviewSatisfactionTargetPct: 95,
- /** 对应首页:订单交付周期(天) */
- avgReviewCycleDays: 23,
- avgReviewCycleTargetDays: 20,
- /** 对应首页:成品库存周转天数 */
- finishedGoodsInventoryDays: 14,
- finishedGoodsInventoryTargetDays: 15,
- /** 关键约束 · 物料齐套率 — 与首页及时交付率同口径数值 */
- constraintMaterialKitPct: 75,
- systemPressureGaugePct: 75,
- /** 趋势图末点贴近首页满足率 */
- trendSatisfaction: [71.5, 72, 72.5, 73, 73.5, 74, 74.5, 75],
- trendMeanLine: 95
- });
- /** S3 供应协同(首页 liquid 与右侧两卡) */
- export const homeS3 = reactive({
- demandKitRatePct: 75,
- demandKitTargetPct: 95,
- kitCycleDays: 18,
- kitCycleTargetDays: 15,
- materialInventoryTurnoverDays: 28,
- materialInventoryTurnoverTargetDays: 30,
- mrpTrendSeries: [70, 71, 72, 73, 74, 74.5, 75],
- drillPrimaryEnd: 75
- });
- /** S4 采购执行 */
- export const homeS4 = reactive({
- materialDeliveryQualityPct: 97,
- materialDeliveryQualityTargetPct: 99,
- materialOnTimeDeliveryPct: 99,
- materialOnTimeDeliveryTargetPct: 99,
- materialInventoryTurnoverDays: 28,
- materialInventoryTurnoverTargetDays: 30,
- trendMaterialTurnover: [26, 26.5, 27, 27.5, 28, 28, 28],
- trendCategoryTurnover: [27, 27.2, 27.5, 27.8, 28, 28, 28],
- /**
- * 首页 S4 四宫格(参考设计稿;与详情页指标独立,避免强绑演示数)
- * trendTone: good=绿色强调 bad=红橙警示;箭头 up/down 表示环比方向
- */
- homeGridKpis: [
- {
- key: 'deliveryCycle',
- label: '物料交货周期',
- value: '3.1',
- unit: '天',
- trend: '+0.3',
- trendArrow: 'up',
- trendTone: 'good'
- },
- {
- key: 'deliverySat',
- label: '物料交货满足率',
- value: '93.8',
- unit: '%',
- trend: '-0.5',
- trendArrow: 'down',
- trendTone: 'bad'
- },
- {
- key: 'procurementEff',
- label: '物料采购人效',
- value: '852',
- unit: '',
- trend: '+1%',
- trendArrow: 'up',
- trendTone: 'good'
- },
- {
- key: 'inTransit',
- label: '采购在途周转',
- value: '8.5',
- unit: '天',
- trend: '-0.4',
- trendArrow: 'down',
- trendTone: 'good'
- }
- ]
- });
- /** S5 物料仓储(首页表格三行) */
- export const homeS5 = reactive({
- matchOnTimeActualPct: 99,
- matchOnTimeTargetPct: 98,
- matchLeadTimeActualHrs: 14,
- matchLeadTimeTargetHrs: 12,
- rawWarehouseHeadcount: 7,
- rawWarehouseHeadcountTarget: 10,
- /** 与首页 S3/S4 物料库存周转天数对齐,用于详情顶栏「物料库存周转」 */
- materialInventoryTurnoverDays: 28
- });
- /** S6 生产执行 */
- export const homeS6 = reactive({
- firstPassYieldPct: 85,
- firstPassYieldTargetPct: 98,
- manufacturingEfficiency: 2.05,
- woOnTimeDeliveryPct: 75,
- woOnTimeDeliveryTargetPct: 95,
- manufacturingEfficiencyTarget: 2.1
- });
- /** S7 成品仓储 */
- export const homeS7 = reactive({
- shippingDefectPct: 1.0,
- shippingDefectTargetPct: 0.8,
- shipmentPlanRatePct: 100,
- shipmentPlanRateTargetPct: 100,
- orderShipMatchCycle: 9,
- orderShipMatchCycleTarget: 8,
- laborEfficiency: 7,
- laborEfficiencyTarget: 10
- });
- let loaded = false;
- export async function loadHomeModuleMetrics(factoryId = 1): Promise<void> {
- if (loaded) return;
- try {
- const res = await service.get('/api/AidopKanban/home-l1', { params: { factoryId } });
- const list = (res.data ?? []) as Array<{
- moduleCode?: string;
- metricValue?: number;
- targetValue?: number;
- }>;
- const byModule = Object.fromEntries(list.map((x) => [x.moduleCode, x]));
- if (byModule.S1) {
- homeS1.reviewSatisfactionPct = Number(byModule.S1.metricValue ?? homeS1.reviewSatisfactionPct);
- homeS1.reviewSatisfactionTargetPct = Number(byModule.S1.targetValue ?? homeS1.reviewSatisfactionTargetPct);
- homeS1.constraintMaterialKitPct = homeS1.reviewSatisfactionPct;
- homeS1.systemPressureGaugePct = homeS1.reviewSatisfactionPct;
- homeS1.trendSatisfaction = [71.5, 72, 72.5, 73, 73.5, 74, 74.5, homeS1.reviewSatisfactionPct];
- }
- if (byModule.S3) {
- homeS3.demandKitRatePct = Number(byModule.S3.metricValue ?? homeS3.demandKitRatePct);
- homeS3.demandKitTargetPct = Number(byModule.S3.targetValue ?? homeS3.demandKitTargetPct);
- homeS3.drillPrimaryEnd = homeS3.demandKitRatePct;
- homeS3.mrpTrendSeries = [70, 71, 72, 73, 74, 74.5, homeS3.demandKitRatePct];
- }
- if (byModule.S4) {
- homeS4.materialOnTimeDeliveryPct = Number(byModule.S4.metricValue ?? homeS4.materialOnTimeDeliveryPct);
- homeS4.materialOnTimeDeliveryTargetPct = Number(byModule.S4.targetValue ?? homeS4.materialOnTimeDeliveryTargetPct);
- homeS4.homeGridKpis[1].value = `${homeS4.materialOnTimeDeliveryPct}`;
- }
- if (byModule.S5) {
- homeS5.matchOnTimeActualPct = Number(byModule.S5.metricValue ?? homeS5.matchOnTimeActualPct);
- homeS5.matchOnTimeTargetPct = Number(byModule.S5.targetValue ?? homeS5.matchOnTimeTargetPct);
- }
- if (byModule.S6) {
- homeS6.firstPassYieldPct = Number(byModule.S6.metricValue ?? homeS6.firstPassYieldPct);
- homeS6.firstPassYieldTargetPct = Number(byModule.S6.targetValue ?? homeS6.firstPassYieldTargetPct);
- homeS6.woOnTimeDeliveryPct = homeS6.firstPassYieldPct;
- }
- if (byModule.S7) {
- homeS7.shippingDefectPct = Number(byModule.S7.metricValue ?? homeS7.shippingDefectPct);
- homeS7.shippingDefectTargetPct = Number(byModule.S7.targetValue ?? homeS7.shippingDefectTargetPct);
- }
- loaded = true;
- } catch {
- // keep demo defaults when api unavailable
- }
- }
|