homeModulesSync.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import { reactive } from 'vue';
  2. import service from '/@/utils/request';
  3. /**
  4. * 首页 S1 / S3–S7 模块指标数据。
  5. * 默认值与 Demo 对齐;页面加载后会从数据库覆盖关键指标。
  6. */
  7. /** S1 产销协同 */
  8. export const homeS1 = reactive({
  9. /** 对应首页:订单及时交付率 */
  10. reviewSatisfactionPct: 75,
  11. reviewSatisfactionTargetPct: 95,
  12. /** 对应首页:订单交付周期(天) */
  13. avgReviewCycleDays: 23,
  14. avgReviewCycleTargetDays: 20,
  15. /** 对应首页:成品库存周转天数 */
  16. finishedGoodsInventoryDays: 14,
  17. finishedGoodsInventoryTargetDays: 15,
  18. /** 关键约束 · 物料齐套率 — 与首页及时交付率同口径数值 */
  19. constraintMaterialKitPct: 75,
  20. systemPressureGaugePct: 75,
  21. /** 趋势图末点贴近首页满足率 */
  22. trendSatisfaction: [71.5, 72, 72.5, 73, 73.5, 74, 74.5, 75],
  23. trendMeanLine: 95
  24. });
  25. /** S3 供应协同(首页 liquid 与右侧两卡) */
  26. export const homeS3 = reactive({
  27. demandKitRatePct: 75,
  28. demandKitTargetPct: 95,
  29. kitCycleDays: 18,
  30. kitCycleTargetDays: 15,
  31. materialInventoryTurnoverDays: 28,
  32. materialInventoryTurnoverTargetDays: 30,
  33. mrpTrendSeries: [70, 71, 72, 73, 74, 74.5, 75],
  34. drillPrimaryEnd: 75
  35. });
  36. /** S4 采购执行 */
  37. export const homeS4 = reactive({
  38. materialDeliveryQualityPct: 97,
  39. materialDeliveryQualityTargetPct: 99,
  40. materialOnTimeDeliveryPct: 99,
  41. materialOnTimeDeliveryTargetPct: 99,
  42. materialInventoryTurnoverDays: 28,
  43. materialInventoryTurnoverTargetDays: 30,
  44. trendMaterialTurnover: [26, 26.5, 27, 27.5, 28, 28, 28],
  45. trendCategoryTurnover: [27, 27.2, 27.5, 27.8, 28, 28, 28],
  46. /**
  47. * 首页 S4 四宫格(参考设计稿;与详情页指标独立,避免强绑演示数)
  48. * trendTone: good=绿色强调 bad=红橙警示;箭头 up/down 表示环比方向
  49. */
  50. homeGridKpis: [
  51. {
  52. key: 'deliveryCycle',
  53. label: '物料交货周期',
  54. value: '3.1',
  55. unit: '天',
  56. trend: '+0.3',
  57. trendArrow: 'up',
  58. trendTone: 'good'
  59. },
  60. {
  61. key: 'deliverySat',
  62. label: '物料交货满足率',
  63. value: '93.8',
  64. unit: '%',
  65. trend: '-0.5',
  66. trendArrow: 'down',
  67. trendTone: 'bad'
  68. },
  69. {
  70. key: 'procurementEff',
  71. label: '物料采购人效',
  72. value: '852',
  73. unit: '',
  74. trend: '+1%',
  75. trendArrow: 'up',
  76. trendTone: 'good'
  77. },
  78. {
  79. key: 'inTransit',
  80. label: '采购在途周转',
  81. value: '8.5',
  82. unit: '天',
  83. trend: '-0.4',
  84. trendArrow: 'down',
  85. trendTone: 'good'
  86. }
  87. ]
  88. });
  89. /** S5 物料仓储(首页表格三行) */
  90. export const homeS5 = reactive({
  91. matchOnTimeActualPct: 99,
  92. matchOnTimeTargetPct: 98,
  93. matchLeadTimeActualHrs: 14,
  94. matchLeadTimeTargetHrs: 12,
  95. rawWarehouseHeadcount: 7,
  96. rawWarehouseHeadcountTarget: 10,
  97. /** 与首页 S3/S4 物料库存周转天数对齐,用于详情顶栏「物料库存周转」 */
  98. materialInventoryTurnoverDays: 28
  99. });
  100. /** S6 生产执行 */
  101. export const homeS6 = reactive({
  102. firstPassYieldPct: 85,
  103. firstPassYieldTargetPct: 98,
  104. manufacturingEfficiency: 2.05,
  105. woOnTimeDeliveryPct: 75,
  106. woOnTimeDeliveryTargetPct: 95,
  107. manufacturingEfficiencyTarget: 2.1
  108. });
  109. /** S7 成品仓储 */
  110. export const homeS7 = reactive({
  111. shippingDefectPct: 1.0,
  112. shippingDefectTargetPct: 0.8,
  113. shipmentPlanRatePct: 100,
  114. shipmentPlanRateTargetPct: 100,
  115. orderShipMatchCycle: 9,
  116. orderShipMatchCycleTarget: 8,
  117. laborEfficiency: 7,
  118. laborEfficiencyTarget: 10
  119. });
  120. let loaded = false;
  121. export async function loadHomeModuleMetrics(factoryId = 1): Promise<void> {
  122. if (loaded) return;
  123. try {
  124. const res = await service.get('/api/AidopKanban/home-l1', { params: { factoryId } });
  125. const list = (res.data ?? []) as Array<{
  126. moduleCode?: string;
  127. metricValue?: number;
  128. targetValue?: number;
  129. }>;
  130. const byModule = Object.fromEntries(list.map((x) => [x.moduleCode, x]));
  131. if (byModule.S1) {
  132. homeS1.reviewSatisfactionPct = Number(byModule.S1.metricValue ?? homeS1.reviewSatisfactionPct);
  133. homeS1.reviewSatisfactionTargetPct = Number(byModule.S1.targetValue ?? homeS1.reviewSatisfactionTargetPct);
  134. homeS1.constraintMaterialKitPct = homeS1.reviewSatisfactionPct;
  135. homeS1.systemPressureGaugePct = homeS1.reviewSatisfactionPct;
  136. homeS1.trendSatisfaction = [71.5, 72, 72.5, 73, 73.5, 74, 74.5, homeS1.reviewSatisfactionPct];
  137. }
  138. if (byModule.S3) {
  139. homeS3.demandKitRatePct = Number(byModule.S3.metricValue ?? homeS3.demandKitRatePct);
  140. homeS3.demandKitTargetPct = Number(byModule.S3.targetValue ?? homeS3.demandKitTargetPct);
  141. homeS3.drillPrimaryEnd = homeS3.demandKitRatePct;
  142. homeS3.mrpTrendSeries = [70, 71, 72, 73, 74, 74.5, homeS3.demandKitRatePct];
  143. }
  144. if (byModule.S4) {
  145. homeS4.materialOnTimeDeliveryPct = Number(byModule.S4.metricValue ?? homeS4.materialOnTimeDeliveryPct);
  146. homeS4.materialOnTimeDeliveryTargetPct = Number(byModule.S4.targetValue ?? homeS4.materialOnTimeDeliveryTargetPct);
  147. homeS4.homeGridKpis[1].value = `${homeS4.materialOnTimeDeliveryPct}`;
  148. }
  149. if (byModule.S5) {
  150. homeS5.matchOnTimeActualPct = Number(byModule.S5.metricValue ?? homeS5.matchOnTimeActualPct);
  151. homeS5.matchOnTimeTargetPct = Number(byModule.S5.targetValue ?? homeS5.matchOnTimeTargetPct);
  152. }
  153. if (byModule.S6) {
  154. homeS6.firstPassYieldPct = Number(byModule.S6.metricValue ?? homeS6.firstPassYieldPct);
  155. homeS6.firstPassYieldTargetPct = Number(byModule.S6.targetValue ?? homeS6.firstPassYieldTargetPct);
  156. homeS6.woOnTimeDeliveryPct = homeS6.firstPassYieldPct;
  157. }
  158. if (byModule.S7) {
  159. homeS7.shippingDefectPct = Number(byModule.S7.metricValue ?? homeS7.shippingDefectPct);
  160. homeS7.shippingDefectTargetPct = Number(byModule.S7.targetValue ?? homeS7.shippingDefectTargetPct);
  161. }
  162. loaded = true;
  163. } catch {
  164. // keep demo defaults when api unavailable
  165. }
  166. }