Sfoglia il codice sorgente

feat(aidop): smart ops kanban, KPI master import, S4 L2+L3 detail, Docker, demo scripts (Web 2.4.46 / API 1.0.10)

aidopdev 1 giorno fa
parent
commit
9122483a21
52 ha cambiato i file con 9419 aggiunte e 163 eliminazioni
  1. 4 0
      .cursor/rules/README.md
  2. 13 0
      .dockerignore
  3. 6 0
      .gitignore
  4. 1 1
      Web/package.json
  5. 1 1
      Web/src/utils/aidopMenuDisplay.ts
  6. 170 8
      Web/src/views/aidop/api/kanbanData.ts
  7. 116 0
      Web/src/views/aidop/api/kpiMasterApi.ts
  8. 2 2
      Web/src/views/aidop/kanban/data/homeModulesSync.ts
  9. 19 11
      Web/src/views/aidop/kanban/data/operationModelSchema.ts
  10. 2 2
      Web/src/views/aidop/kanban/data/s2Kpis.ts
  11. 11 0
      Web/src/views/aidop/kanban/data/s4GraphServerMap.ts
  12. 853 0
      Web/src/views/aidop/kanban/kpiMaster.vue
  13. 609 5
      Web/src/views/aidop/kanban/s0.vue
  14. 54 0
      Web/src/views/aidop/kanban/s3.vue
  15. 163 83
      Web/src/views/aidop/kanban/s4.vue
  16. 7 0
      Web/src/views/aidop/kanban/utils/s4LayoutEvents.ts
  17. 1 2
      Web/src/views/aidop/kanban/utils/smartOpsFilterOptionsCache.ts
  18. 7 3
      Web/src/views/dashboard/data/homeModulesSync.ts
  19. 139 14
      Web/src/views/dashboard/home.vue
  20. 50 0
      ai-dop-platform/docs/db/V2__smart_ops_s4_metric_model_tables.sql
  21. 33 0
      ai-dop-platform/docs/db/smart_ops_data_model/04_试点_S4竖切方案.txt
  22. 6 0
      ai-dop-platform/docs/db/smart_ops_data_model/README.txt
  23. 62 0
      docker-compose.yml
  24. 50 0
      docker/Dockerfile.api
  25. 34 0
      docker/Dockerfile.web
  26. 60 0
      docker/nginx/default.conf
  27. 20 0
      docker/nginx/ssl/default.crt
  28. 28 0
      docker/nginx/ssl/default.key
  29. BIN
      docs/db/aidopdev_表结构汇总.xlsx
  30. 172 0
      docs/db/gen_table_excel.py
  31. 339 0
      docs/指标模型动态配置方案.md
  32. 3468 0
      scripts/demo_data.sql
  33. BIN
      scripts/demo_data_template.xlsx
  34. 414 0
      scripts/gen_demo_data.py
  35. 220 0
      scripts/gen_demo_template.py
  36. 60 0
      scripts/setup-demo-tenant.sql
  37. 17 0
      server/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs
  38. 3 3
      server/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj
  39. 9 15
      server/Admin.NET.Web.Entry/Dockerfile
  40. 562 0
      server/Plugins/Admin.NET.Plugin.AiDOP/Controllers/AdoSmartOpsKpiMasterController.cs
  41. 394 0
      server/Plugins/Admin.NET.Plugin.AiDOP/Controllers/AidopKanbanController.S4.cs
  42. 47 12
      server/Plugins/Admin.NET.Plugin.AiDOP/Controllers/AidopKanbanController.cs
  43. 97 0
      server/Plugins/Admin.NET.Plugin.AiDOP/Dto/SmartOps/AdoSmartOpsKpiMasterDtos.cs
  44. 28 0
      server/Plugins/Admin.NET.Plugin.AiDOP/Entity/AdoSmartOpsHomeModule.cs
  45. 83 0
      server/Plugins/Admin.NET.Plugin.AiDOP/Entity/AdoSmartOpsKpiMaster.cs
  46. 54 0
      server/Plugins/Admin.NET.Plugin.AiDOP/Entity/AdoSmartOpsLayoutItem.cs
  47. 761 0
      server/Plugins/Admin.NET.Plugin.AiDOP/Infrastructure/AidopKpiMasterSeed.cs
  48. 57 0
      server/Plugins/Admin.NET.Plugin.AiDOP/Infrastructure/AidopS4KpiMerge.cs
  49. 18 0
      server/Plugins/Admin.NET.Plugin.AiDOP/Infrastructure/AidopTenantHelper.cs
  50. 77 0
      server/Plugins/Admin.NET.Plugin.AiDOP/Infrastructure/AidopTenantMigration.cs
  51. 3 1
      server/Plugins/Admin.NET.Plugin.AiDOP/SeedData/SysMenuSeedData.cs
  52. 15 0
      server/Plugins/Admin.NET.Plugin.AiDOP/Startup.cs

+ 4 - 0
.cursor/rules/README.md

@@ -14,6 +14,10 @@
 | `collaboration-scope.mdc` | 改前清单待确认、跨模块影响须先预警、小问题最小改动不大重构等 |
 | `version-bump-on-commit.mdc` | 发版必升号;凡产生 Git 提交的变动须在同一次提交中递增版本号(package.json / Web.Entry.csproj) |
 
+## 业务方案索引(便于对话对齐)
+
+- **指标模型总方案**(简称「指标模型方案」):智慧运营看板「动态指标建模 + 分层中间表 + 呈现与期量差约定」的总体设计,文档目录为 [`ai-dop-platform/docs/db/smart_ops_data_model/`](../../ai-dop-platform/docs/db/smart_ops_data_model/README.txt)。对话中说「指标模型方案」即指该套约定。
+
 ## 非 Cursor 成员
 
 若使用其它编辑器或 AI 工具,请**人工对照**上述 `.mdc` 正文执行相同约定。

+ 13 - 0
.dockerignore

@@ -0,0 +1,13 @@
+.git
+.gitignore
+**/.vs
+**/.vscode
+**/bin
+**/obj
+**/node_modules
+**/dist
+**/publish
+**/logs
+**/*.user
+**/*.rsuser
+Web/public/config.js

+ 6 - 0
.gitignore

@@ -54,3 +54,9 @@ server/Admin.NET.Application/Configuration/DeepSeek.json
 /ai-dop-platform/**/node_modules/
 /ai-dop-platform/**/__pycache__/
 /ai-dop-platform/**/.venv/
+
+# Local Docker runtime data (do not commit)
+/docker/mysql/mysql/
+/docker/redis/data/
+/docker/tdengine/
+/docker/minio/data/

+ 1 - 1
Web/package.json

@@ -1,7 +1,7 @@
 {
 	"name": "admin.net",
 	"type": "module",
-	"version": "2.4.36",
+	"version": "2.4.46",
 	"packageManager": "pnpm@10.32.1",
 	"lastBuildTime": "2026.03.15",
 	"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",

+ 1 - 1
Web/src/utils/aidopMenuDisplay.ts

@@ -39,6 +39,7 @@ type AMenu = Record<string, any>;
 /** 侧栏「智慧运营看板」下 10 个看板(九宫格+S1~S9);统一查询条件仅应出现在这些 component 对应页面 */
 const SMART_OPS_CHILDREN: Array<{ path: string; title: string; component: string; name: string }> = [
 	{ path: '/aidop/smart-ops/grid', title: '九宫格智慧运营看板', component: '/dashboard/home', name: 'aidopSmartOpsGrid' },
+	{ path: '/aidop/smart-ops/modeling', title: '运营指标建模', component: '/aidop/kanban/s0', name: 'aidopSmartOpsModeling' },
 	{ path: '/aidop/smart-ops/s1', title: 'S1产销协同看板', component: '/aidop/kanban/s1', name: 'aidopSmartOpsS1' },
 	{ path: '/aidop/smart-ops/s2', title: 'S2制造协同看板', component: '/aidop/kanban/s2', name: 'aidopSmartOpsS2' },
 	{ path: '/aidop/smart-ops/s3', title: 'S3供应协同看板', component: '/aidop/kanban/s3', name: 'aidopSmartOpsS3' },
@@ -48,7 +49,6 @@ const SMART_OPS_CHILDREN: Array<{ path: string; title: string; component: string
 	{ path: '/aidop/smart-ops/s7', title: 'S7成品仓储看板', component: '/aidop/kanban/s7', name: 'aidopSmartOpsS7' },
 	{ path: '/aidop/smart-ops/s8', title: 'S8异常监控看板', component: '/aidop/kanban/s8', name: 'aidopSmartOpsS8' },
 	{ path: '/aidop/smart-ops/s9', title: 'S9运营指标看板', component: '/aidop/kanban/s9', name: 'aidopSmartOpsS9' },
-	{ path: '/aidop/smart-ops/modeling', title: '运营指标建模', component: '/aidop/kanban/s0', name: 'aidopSmartOpsModeling' },
 ];
 
 function collectPathsUnder(node: AMenu, acc: Set<string>): void {

+ 170 - 8
Web/src/views/aidop/api/kanbanData.ts

@@ -45,12 +45,11 @@ export interface SmartOpsFilterOptions {
 }
 
 export async function fetchSmartOpsFilterOptions(
-	tenantId = 1,
 	factoryId = 1
 ): Promise<SmartOpsFilterOptions> {
 	try {
 		const res = await service.get('/api/AidopKanban/smart-ops-filter-options', {
-			params: { tenantId, factoryId },
+			params: { factoryId },
 			headers: { 'X-Silent-Error': '1' },
 		});
 		const d = res.data ?? {};
@@ -65,36 +64,199 @@ export async function fetchSmartOpsFilterOptions(
 }
 
 export async function fetchHomeL1(
-	tenantId = 1,
 	factoryId = 1,
 	extra: KanbanExtraQuery = {}
 ): Promise<HomeL1Row[]> {
 	const res = await service.get('/api/AidopKanban/home-l1', {
-		params: { tenantId, factoryId, ...extra },
+		params: { factoryId, ...extra },
 	});
 	return (res.data ?? []) as HomeL1Row[];
 }
 
 export async function fetchS8Alerts(
-	tenantId = 1,
 	factoryId = 1,
 	extra: KanbanExtraQuery = {}
 ): Promise<S8AlertRow[]> {
 	const res = await service.get('/api/AidopKanban/s8-alerts', {
-		params: { tenantId, factoryId, ...extra },
+		params: { factoryId, ...extra },
 	});
 	return (res.data ?? []) as S8AlertRow[];
 }
 
+/** S4 指标模型试点(九宫格合并) */
+export interface S4HomeGridCell {
+	rowId?: string;
+	metricCode: string;
+	displayName: string;
+	unit: string;
+	currentValue: number | null;
+	targetValue: number | null;
+	gapValue: number | null;
+	gapLabel: string;
+	gapArrow: string;
+	achievementLevel: string;
+	formulaText?: string | null;
+}
+
+export interface S4HomeGridPayload {
+	layoutPattern: string;
+	bizDate: string;
+	items: S4HomeGridCell[];
+}
+
+export async function fetchS4HomeGrid(
+	factoryId = 1,
+	extra: KanbanExtraQuery = {}
+): Promise<S4HomeGridPayload | null> {
+	try {
+		const res = await service.get('/api/AidopKanban/s4-home-grid', {
+			params: { factoryId, ...extra },
+			headers: { 'X-Silent-Error': '1' },
+		});
+		const d = res.data ?? {};
+		return {
+			layoutPattern: d.layoutPattern ?? 'card_grid',
+			bizDate: d.bizDate ?? '',
+			items: Array.isArray(d.items) ? d.items : [],
+		};
+	} catch {
+		return null;
+	}
+}
+
+export interface S4CatalogRow {
+	id: number;
+	metricCode: string;
+	moduleCode: string;
+	metricLevel: number;
+	defaultName: string;
+	unit: string | null;
+	direction: string;
+	sortHint: number;
+	parentId?: number | null;
+	description?: string | null;
+	formula?: string | null;
+	calcRule?: string | null;
+	dataSource?: string | null;
+	statFrequency?: string | null;
+	department?: string | null;
+}
+
+export async function fetchS4MetricCatalog(metricLevel?: 1 | 2 | 3): Promise<S4CatalogRow[]> {
+	try {
+		const res = await service.get('/api/AidopKanban/s4-metric-catalog', {
+			params: metricLevel ? { metricLevel } : {},
+			headers: { 'X-Silent-Error': '1' },
+		});
+		return (res.data ?? []) as S4CatalogRow[];
+	} catch {
+		return [];
+	}
+}
+
+export interface S4LayoutRow {
+	rowId: string;
+	metricCode: string;
+	metricLevel: number;
+	displayName: string;
+	sortNo: number;
+	parentRowId?: string | null;
+	formulaText?: string | null;
+	panelZone?: string | null;
+	unit?: string | null;
+	direction?: string | null;
+}
+
+export interface S4OperationLayoutPayload {
+	layoutPattern: string;
+	l1: S4LayoutRow[];
+	l2: S4LayoutRow[];
+}
+
+export async function fetchS4OperationLayout(
+	factoryId = 1
+): Promise<S4OperationLayoutPayload | null> {
+	try {
+		const res = await service.get('/api/AidopKanban/s4-operation-layout', {
+			params: { factoryId },
+			headers: { 'X-Silent-Error': '1' },
+		});
+		const d = res.data ?? {};
+		return {
+			layoutPattern: d.layoutPattern ?? 'card_grid',
+			l1: Array.isArray(d.l1) ? d.l1 : [],
+			l2: Array.isArray(d.l2) ? d.l2 : [],
+		};
+	} catch {
+		return null;
+	}
+}
+
+/** 与后端 S4LayoutL1Dto / S4LayoutL2Dto 对齐(Newtonsoft 默认 PascalCase 绑定) */
+export interface S4LayoutL1SaveRow {
+	RowId?: string;
+	MetricCode: string;
+	DisplayName?: string | null;
+	SortNo: number;
+	/** 首页卡片展示的计算说明(可选) */
+	FormulaText?: string | null;
+}
+
+export interface S4LayoutL2SaveRow {
+	RowId?: string;
+	MetricCode: string;
+	DisplayName?: string | null;
+	SortNo: number;
+	/** 可选;未选首页 L1 时也可保留 L2 或暂不指定父级 */
+	ParentRowId?: string | null;
+	FormulaText?: string | null;
+	PanelZone?: string | null;
+}
+
+export async function saveS4OperationLayout(
+	body: { L1: S4LayoutL1SaveRow[]; L2: S4LayoutL2SaveRow[] },
+	factoryId = 1
+): Promise<{ ok: boolean; message?: string }> {
+	try {
+		const res = await service.put('/api/AidopKanban/s4-operation-layout', body, {
+			params: { factoryId },
+		});
+		const d = res.data as { ok?: boolean } | undefined;
+		return { ok: Boolean(d?.ok) };
+	} catch (e: any) {
+		const msg =
+			e?.response?.data?.message ??
+			(typeof e?.response?.data === 'string' ? e.response.data : undefined) ??
+			e?.message;
+		return { ok: false, message: typeof msg === 'string' ? msg : '保存失败' };
+	}
+}
+
+export async function fetchS4DetailKpis(
+	factoryId = 1,
+	panelZone?: 'left' | 'right',
+	extra: KanbanExtraQuery = {}
+): Promise<S4HomeGridCell[]> {
+	try {
+		const res = await service.get('/api/AidopKanban/s4-detail-kpis', {
+			params: { factoryId, ...(panelZone ? { panelZone } : {}), ...extra },
+			headers: { 'X-Silent-Error': '1' },
+		});
+		const d = res.data as { items?: S4HomeGridCell[] } | undefined;
+		return Array.isArray(d?.items) ? d.items : [];
+	} catch {
+		return [];
+	}
+}
+
 export async function fetchModuleDetail(
 	moduleCode: string,
-	tenantId = 1,
 	factoryId = 1,
 	extra: KanbanExtraQuery = {}
 ): Promise<ModuleDetailPayload> {
 	try {
 		const res = await service.get('/api/AidopKanban/module-detail', {
-			params: { moduleCode, tenantId, factoryId, ...extra },
+			params: { moduleCode, factoryId, ...extra },
 			headers: { 'X-Silent-Error': '1' },
 		});
 		return (res.data ?? { moduleCode, l2: [], l3: [], alerts: [] }) as ModuleDetailPayload;

+ 116 - 0
Web/src/views/aidop/api/kpiMasterApi.ts

@@ -0,0 +1,116 @@
+import service from '/@/utils/request';
+
+const BASE = '/api/AdoSmartOpsKpiMaster';
+
+// ── 类型定义 ──
+
+export interface KpiTreeNode {
+	id: number;
+	metricCode: string;
+	moduleCode: string;
+	metricLevel: number;
+	metricName: string;
+	parentId: number | null;
+	sortNo: number;
+	isEnabled: boolean;
+	children: KpiTreeNode[];
+}
+
+export interface KpiDetail {
+	id: number;
+	metricCode: string;
+	moduleCode: string;
+	metricLevel: number;
+	parentId: number | null;
+	parentName: string | null;
+	metricName: string;
+	description: string | null;
+	formula: string | null;
+	calcRule: string | null;
+	dataSource: string | null;
+	statFrequency: string | null;
+	department: string | null;
+	dopFields: string | null;
+	unit: string | null;
+	direction: string;
+	yellowThreshold: number | null;
+	redThreshold: number | null;
+	isHomePage: boolean;
+	sortNo: number;
+	remark: string | null;
+	isEnabled: boolean;
+	createdAt: string;
+	updatedAt: string | null;
+}
+
+export interface KpiUpsert {
+	moduleCode: string;
+	metricLevel: number;
+	parentId: number | null;
+	metricName: string;
+	description?: string;
+	formula?: string;
+	calcRule?: string;
+	dataSource?: string;
+	statFrequency?: string;
+	department?: string;
+	dopFields?: string;
+	unit?: string;
+	direction: string;
+	yellowThreshold?: number | null;
+	redThreshold?: number | null;
+	isHomePage: boolean;
+	sortNo: number;
+	remark?: string;
+	isEnabled: boolean;
+}
+
+// ── API ──
+
+export function getTree(params?: { moduleCode?: string; keyword?: string }) {
+	return service({ url: `${BASE}/tree`, method: 'get', params });
+}
+
+export function getDetail(id: number) {
+	return service({ url: `${BASE}/${id}`, method: 'get' });
+}
+
+export function create(data: KpiUpsert) {
+	return service({ url: BASE, method: 'post', data });
+}
+
+export function update(id: number, data: KpiUpsert) {
+	return service({ url: `${BASE}/${id}`, method: 'put', data });
+}
+
+export function remove(id: number) {
+	return service({ url: `${BASE}/${id}`, method: 'delete' });
+}
+
+export function toggleEnabled(id: number) {
+	return service({ url: `${BASE}/${id}/toggle-enabled`, method: 'patch' });
+}
+
+export function updateSort(items: { id: number; sortNo: number }[]) {
+	return service({ url: `${BASE}/sort`, method: 'put', data: items });
+}
+
+export function moveNode(id: number, data: { newParentId: number | null; newSortNo: number }) {
+	return service({ url: `${BASE}/${id}/move`, method: 'put', data });
+}
+
+export function importDemoData(file: File) {
+	const formData = new FormData();
+	formData.append('file', file);
+	return service({
+		url: `${BASE}/import-demo-data`,
+		method: 'post',
+		data: formData,
+		headers: { 'Content-Type': 'multipart/form-data' },
+		timeout: 120000,
+	});
+}
+
+export function downloadDemoTemplate() {
+	return `${BASE}/demo-template`;
+}

+ 2 - 2
Web/src/views/aidop/kanban/data/homeModulesSync.ts

@@ -127,10 +127,10 @@ export const homeS7 = reactive({
 
 let loaded = false;
 
-export async function loadHomeModuleMetrics(tenantId = 1, factoryId = 1): Promise<void> {
+export async function loadHomeModuleMetrics(factoryId = 1): Promise<void> {
   if (loaded) return;
   try {
-    const res = await service.get('/api/AidopKanban/home-l1', { params: { tenantId, factoryId } });
+    const res = await service.get('/api/AidopKanban/home-l1', { params: { factoryId } });
     const list = (res.data ?? []) as Array<{
       moduleCode?: string;
       metricValue?: number;

+ 19 - 11
Web/src/views/aidop/kanban/data/operationModelSchema.ts

@@ -133,31 +133,39 @@ export const defaultOperationModel = [
     moduleId: 'S4',
     moduleName: '采购执行',
     l1: [
-      { id: 'S4-L1-A', homeLabel: '物料交付合格率', dataRef: 'homeS4.materialDeliveryQualityPct' },
-      { id: 'S4-L1-B', homeLabel: '物料按时交付率', dataRef: 'homeS4.materialOnTimeDeliveryPct' },
-      { id: 'S4-L1-C', homeLabel: '物料库存周转天数', dataRef: 'homeS4.materialInventoryTurnoverDays' }
+      { id: 'S4-L1-A', homeLabel: '物料交货周期', dataRef: 'homeS4.deliveryCycleDays' },
+      { id: 'S4-L1-B', homeLabel: '物料交货满足率', dataRef: 'homeS4.deliverySatisfactionPct' },
+      { id: 'S4-L1-C', homeLabel: '物料采购人效', dataRef: 'homeS4.procurementEfficiency' },
+      { id: 'S4-L1-D', homeLabel: '采购在途周转', dataRef: 'homeS4.inTransitTurnoverDays' }
     ],
     l2: [
       {
         id: 'S4-L2-A',
-        detailLabel: '物料交货满足率(SKU)',
+        detailLabel: '品类物料交货周期',
         parentL1Id: 'S4-L1-A',
-        formula: '来料合格批次数 / 总批次',
-        aggregation: '与首页合格率映射'
+        formula: 'D=物料交货单收货日期-物料交货单发布日期',
+        aggregation: '品类维度'
       },
       {
         id: 'S4-L2-B',
         detailLabel: '品类物料交货满足率',
         parentL1Id: 'S4-L1-B',
-        formula: '按品类 PO 行准时到货比例',
-        aggregation: '策略层上卷'
+        formula: '按时完成交货单数量/交货单总数',
+        aggregation: '品类维度'
       },
       {
         id: 'S4-L2-C',
-        detailLabel: '采购在途周转',
+        detailLabel: '品类物料采购人效',
         parentL1Id: 'S4-L1-C',
-        formula: '在途库存 / 日均到货金额',
-        aggregation: '天 → 与首页周转对齐'
+        formula: '完成收货的物料数量/采购人数',
+        aggregation: '品类维度'
+      },
+      {
+        id: 'S4-L2-D',
+        detailLabel: '品类在途物料周转',
+        parentL1Id: 'S4-L1-D',
+        formula: 'D1/D2*30天',
+        aggregation: '品类维度'
       }
     ]
   },

+ 2 - 2
Web/src/views/aidop/kanban/data/s2Kpis.ts

@@ -87,10 +87,10 @@ export const s2TrendSeries = reactive({
 
 let loaded = false;
 
-export async function loadS2Kpis(tenantId = 1, factoryId = 1): Promise<void> {
+export async function loadS2Kpis(factoryId = 1): Promise<void> {
   if (loaded) return;
   try {
-    const res = await service.get('/api/AidopKanban/home-l1', { params: { tenantId, factoryId } });
+    const res = await service.get('/api/AidopKanban/home-l1', { params: { factoryId } });
     const list = (res.data ?? []) as Array<{ moduleCode?: string; metricValue?: number; targetValue?: number }>;
     const s2 = list.find((x) => x.moduleCode === 'S2');
     if (s2) {

+ 11 - 0
Web/src/views/aidop/kanban/data/s4GraphServerMap.ts

@@ -0,0 +1,11 @@
+/** 图谱节点 S4-L1-A/B/C/D 与 S4 字典 L1(按 sortHint 升序后的第 1~4 项)一一对应 */
+export const S4_GRAPH_L1_IDS = ['S4-L1-A', 'S4-L1-B', 'S4-L1-C', 'S4-L1-D'] as const
+
+export function resolveS4ServerMetricForGraphL1(
+	graphL1Id: string,
+	catalogL1Sorted: { metricCode: string; sortHint?: number }[]
+): string | null {
+	const idx = S4_GRAPH_L1_IDS.indexOf(graphL1Id as (typeof S4_GRAPH_L1_IDS)[number])
+	if (idx < 0) return null
+	return catalogL1Sorted[idx]?.metricCode ?? null
+}

+ 853 - 0
Web/src/views/aidop/kanban/kpiMaster.vue

@@ -0,0 +1,853 @@
+<template>
+	<div class="kpi-master">
+		<!-- 顶部 -->
+		<header class="kpi-header">
+			<div class="kpi-header__left">
+				<h2>运营指标主数据</h2>
+				<span class="kpi-header__badge">KPI Master</span>
+			</div>
+		</header>
+
+		<el-tabs v-model="activeTab" class="kpi-tabs">
+			<!-- ═══ Tab 1: 指标管理 ═══ -->
+			<el-tab-pane label="指标管理" name="manage">
+				<div class="tab-toolbar">
+					<el-input v-model="keyword" placeholder="搜索指标名称或编码" clearable size="default" style="width: 220px" @clear="loadTree" @keyup.enter="loadTree">
+						<template #prefix><el-icon><ele-Search /></el-icon></template>
+					</el-input>
+					<el-select v-model="moduleFilter" placeholder="全部模块" clearable size="default" style="width: 130px" @change="loadTree">
+						<el-option v-for="m in modules" :key="m" :label="m" :value="m" />
+					</el-select>
+					<el-button type="primary" size="default" @click="onAddRoot"><el-icon><ele-Plus /></el-icon>新增 L1</el-button>
+				</div>
+
+		<div class="kpi-body">
+			<!-- 左侧树 -->
+			<div class="kpi-tree-pane" v-loading="treeLoading">
+				<el-tree
+					ref="treeRef"
+					:data="treeData"
+					node-key="id"
+					:props="{ label: 'metricName', children: 'children' }"
+					highlight-current
+					default-expand-all
+					draggable
+					:allow-drop="allowDrop"
+					@node-click="onNodeClick"
+					@node-drop="onNodeDrop"
+					@node-contextmenu="onContextMenu"
+				>
+					<template #default="{ node, data }">
+						<div v-if="data.metricLevel === 0" class="tree-node tree-node--module">
+							<span class="tree-node__level tree-node__level--mod">{{ data.moduleCode }}</span>
+							<span class="tree-node__name tree-node__name--mod">{{ moduleNames[data.moduleCode] || data.moduleCode }}</span>
+							<span class="tree-node__count">{{ data.children?.length || 0 }} 项</span>
+						</div>
+						<div v-else class="tree-node" :class="{ 'tree-node--disabled': !data.isEnabled }">
+							<span class="tree-node__level" :class="'tree-node__level--l' + data.metricLevel">L{{ data.metricLevel }}</span>
+							<span class="tree-node__name">{{ data.metricName }}</span>
+							<span class="tree-node__code">{{ data.metricCode }}</span>
+							<span class="tree-node__actions">
+								<el-tooltip content="添加子指标" placement="top" :show-after="400">
+									<el-icon class="tree-node__btn" @click.stop="onAddChild(data)"><ele-Plus /></el-icon>
+								</el-tooltip>
+								<el-tooltip content="删除" placement="top" :show-after="400">
+									<el-icon class="tree-node__btn tree-node__btn--danger" @click.stop="onDelete(data)"><ele-Delete /></el-icon>
+								</el-tooltip>
+							</span>
+						</div>
+					</template>
+				</el-tree>
+			</div>
+
+			<!-- 右侧详情 -->
+			<div class="kpi-detail-pane" v-loading="detailLoading">
+				<template v-if="currentDetail">
+					<div class="kpi-detail__head">
+						<h3>{{ currentDetail.metricName }}</h3>
+						<div class="kpi-detail__head-actions">
+							<el-switch v-model="currentDetail.isEnabled" active-text="启用" inactive-text="禁用" @change="onToggleEnabled" />
+							<el-button type="primary" size="default" :loading="saving" @click="onSave">保存</el-button>
+						</div>
+					</div>
+
+					<el-form :model="editForm" label-width="110px" label-position="right" class="kpi-detail__form">
+						<el-row :gutter="20">
+							<el-col :span="12">
+								<el-form-item label="指标编码">
+									<el-input :model-value="currentDetail.metricCode" disabled />
+								</el-form-item>
+							</el-col>
+							<el-col :span="12">
+								<el-form-item label="所属模块">
+									<el-select v-model="editForm.moduleCode" style="width: 100%">
+										<el-option v-for="m in modules" :key="m" :label="m" :value="m" />
+									</el-select>
+								</el-form-item>
+							</el-col>
+						</el-row>
+						<el-row :gutter="20">
+							<el-col :span="12">
+								<el-form-item label="指标名称">
+									<el-input v-model="editForm.metricName" />
+								</el-form-item>
+							</el-col>
+							<el-col :span="12">
+								<el-form-item label="指标层级">
+									<el-radio-group v-model="editForm.metricLevel" disabled>
+										<el-radio :value="1">L1</el-radio>
+										<el-radio :value="2">L2</el-radio>
+										<el-radio :value="3">L3</el-radio>
+									</el-radio-group>
+								</el-form-item>
+							</el-col>
+						</el-row>
+						<el-row :gutter="20">
+							<el-col :span="12">
+								<el-form-item label="父级指标">
+									<el-input :model-value="currentDetail.parentName || '(根指标)'" disabled />
+								</el-form-item>
+							</el-col>
+							<el-col :span="12">
+								<el-form-item label="排序号">
+									<el-input-number v-model="editForm.sortNo" :min="0" :max="9999" style="width: 100%" />
+								</el-form-item>
+							</el-col>
+						</el-row>
+						<el-row :gutter="20">
+							<el-col :span="12">
+								<el-form-item label="单位">
+									<el-input v-model="editForm.unit" />
+								</el-form-item>
+							</el-col>
+							<el-col :span="12">
+								<el-form-item label="方向">
+									<el-select v-model="editForm.direction" style="width: 100%">
+										<el-option label="越高越好" value="higher_is_better" />
+										<el-option label="越低越好" value="lower_is_better" />
+									</el-select>
+								</el-form-item>
+							</el-col>
+						</el-row>
+					<el-row :gutter="20">
+						<el-col :span="12">
+							<el-form-item label="黄色阈值(%)">
+								<el-input-number v-model="editForm.yellowThreshold" :min="0" :max="999" :precision="1" style="width: 100%" />
+								<div class="form-hint">{{ editForm.direction === 'lower_is_better' ? '实际/目标 ≤ 此值为黄色(默认110)' : '实际/目标 ≥ 此值为黄色(默认95)' }}</div>
+							</el-form-item>
+						</el-col>
+						<el-col :span="12">
+							<el-form-item label="红色阈值(%)">
+								<el-input-number v-model="editForm.redThreshold" :min="0" :max="999" :precision="1" style="width: 100%" />
+								<div class="form-hint">{{ editForm.direction === 'lower_is_better' ? '实际/目标 > 此值为红色(默认120)' : '实际/目标 < 此值为红色(默认80)' }}</div>
+							</el-form-item>
+						</el-col>
+					</el-row>
+					<el-row :gutter="20">
+						<el-col :span="12">
+							<el-form-item label="统计频率">
+								<el-input v-model="editForm.statFrequency" />
+							</el-form-item>
+						</el-col>
+						<el-col :span="12">
+							<el-form-item label="责任部门">
+								<el-input v-model="editForm.department" />
+							</el-form-item>
+						</el-col>
+					</el-row>
+						<el-row :gutter="20">
+							<el-col :span="12">
+								<el-form-item label="数据来源">
+									<el-input v-model="editForm.dataSource" />
+								</el-form-item>
+							</el-col>
+							<el-col :span="12">
+								<el-form-item label="首页展示">
+									<el-switch v-model="editForm.isHomePage" />
+								</el-form-item>
+							</el-col>
+						</el-row>
+
+						<el-form-item label="KPI 描述">
+							<el-input v-model="editForm.description" type="textarea" :rows="2" />
+						</el-form-item>
+						<el-form-item label="计算公式">
+							<el-input v-model="editForm.formula" type="textarea" :rows="2" />
+						</el-form-item>
+						<el-form-item label="计算规则">
+							<el-input v-model="editForm.calcRule" type="textarea" :rows="3" />
+						</el-form-item>
+						<el-form-item label="DOP 字段">
+							<el-input v-model="editForm.dopFields" />
+						</el-form-item>
+						<el-form-item label="备注">
+							<el-input v-model="editForm.remark" type="textarea" :rows="2" />
+						</el-form-item>
+					</el-form>
+				</template>
+				<template v-else>
+					<div class="kpi-detail__empty">
+						<el-empty description="点击左侧树节点查看指标详情" />
+					</div>
+				</template>
+			</div>
+		</div>
+
+		<!-- 右键菜单 -->
+		<div v-if="ctxMenu.visible" class="kpi-ctx-menu" :style="{ left: ctxMenu.x + 'px', top: ctxMenu.y + 'px' }" @click="ctxMenu.visible = false">
+			<div class="kpi-ctx-menu__item" @click="onAddChild(ctxMenu.node)">添加子指标</div>
+			<div class="kpi-ctx-menu__item kpi-ctx-menu__item--danger" @click="onDelete(ctxMenu.node)">删除</div>
+		</div>
+			</el-tab-pane>
+
+			<!-- ═══ Tab 2: 数据导入 ═══ -->
+			<el-tab-pane label="数据导入" name="import">
+				<div class="import-tab">
+					<div class="import-tab__header">
+						<h3>Demo 数据导入</h3>
+						<p>上传 Excel 模板,系统将根据填入的目标值 / 实际值生成 30 天日值数据并写入数据库。</p>
+					</div>
+
+					<div class="import-tab__steps">
+						<div class="import-step">
+							<div class="import-step__num">1</div>
+							<div class="import-step__content">
+								<h4>下载模板</h4>
+								<p>模板已预填所有指标信息及默认阈值,只需填写「目标值」和「实际值」列。</p>
+								<el-button type="primary" plain @click="onDownloadTemplate">
+									<el-icon><ele-Download /></el-icon>下载 Excel 模板
+								</el-button>
+							</div>
+						</div>
+
+						<div class="import-step">
+							<div class="import-step__num">2</div>
+							<div class="import-step__content">
+								<h4>填写并上传</h4>
+								<p>在模板中填入数值后上传。留空的指标将由系统自动生成,并保证父子层级数值自洽。</p>
+								<el-upload
+									ref="uploadRef"
+									:auto-upload="false"
+									:limit="1"
+									accept=".xlsx,.xls"
+									:on-change="onFileChange"
+									:on-remove="onFileRemove"
+									drag
+									class="import-upload"
+								>
+									<el-icon class="el-icon--upload"><ele-UploadFilled /></el-icon>
+									<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+									<template #tip>
+										<div class="el-upload__tip">仅支持 .xlsx / .xls 格式</div>
+									</template>
+								</el-upload>
+							</div>
+						</div>
+
+						<div class="import-step">
+							<div class="import-step__num">3</div>
+							<div class="import-step__content">
+								<h4>执行导入</h4>
+								<p>导入将清除当前租户已有日值数据并重新生成。</p>
+								<el-button type="success" :loading="importing" :disabled="!importFile" @click="onImport">
+									<el-icon><ele-Upload /></el-icon>{{ importing ? '导入中...' : '开始导入' }}
+								</el-button>
+							</div>
+						</div>
+					</div>
+
+					<div v-if="importResult" class="import-tab__result" :class="importResult.ok ? 'import-tab__result--success' : 'import-tab__result--error'">
+						<el-icon v-if="importResult.ok"><ele-SuccessFilled /></el-icon>
+						<el-icon v-else><ele-CircleCloseFilled /></el-icon>
+						<span>{{ importResult.message }}</span>
+						<span v-if="importResult.detail" class="import-tab__result-detail">
+							(L1: {{ importResult.detail.l1 }} 条, L2: {{ importResult.detail.l2 }} 条, L3: {{ importResult.detail.l3 }} 条, {{ importResult.detail.days }} 天)
+						</span>
+					</div>
+				</div>
+			</el-tab-pane>
+		</el-tabs>
+	</div>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, onMounted, onBeforeUnmount } from 'vue';
+import { useRouter } from 'vue-router';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import type { NodeDropType } from 'element-plus/es/components/tree/src/tree.type';
+import type { UploadFile, UploadInstance } from 'element-plus';
+import * as api from '/@/views/aidop/api/kpiMasterApi';
+import type { KpiTreeNode, KpiDetail } from '/@/views/aidop/api/kpiMasterApi';
+
+const router = useRouter();
+
+const activeTab = ref('manage');
+const modules = ['S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8', 'S9'];
+const moduleNames: Record<string, string> = {
+	S1: '产销协同', S2: '制造协同', S3: '供应协同', S4: '采购执行',
+	S5: '物料仓储', S6: '生产执行', S7: '成品仓储', S8: '质量管理', S9: '运营看板',
+};
+
+const keyword = ref('');
+const moduleFilter = ref('');
+const treeLoading = ref(false);
+const detailLoading = ref(false);
+const saving = ref(false);
+const treeData = ref<KpiTreeNode[]>([]);
+const treeRef = ref<any>(null);
+const currentDetail = ref<KpiDetail | null>(null);
+
+const editForm = reactive({
+	moduleCode: '',
+	metricLevel: 1,
+	metricName: '',
+	unit: '',
+	direction: 'higher_is_better',
+	yellowThreshold: null as number | null,
+	redThreshold: null as number | null,
+	statFrequency: '',
+	department: '',
+	dataSource: '',
+	isHomePage: false,
+	sortNo: 0,
+	description: '',
+	formula: '',
+	calcRule: '',
+	dopFields: '',
+	remark: '',
+	isEnabled: true,
+});
+
+const ctxMenu = reactive({ visible: false, x: 0, y: 0, node: null as KpiTreeNode | null });
+
+function wrapWithModuleGroups(flatRoots: KpiTreeNode[]): KpiTreeNode[] {
+	const groups: Record<string, KpiTreeNode[]> = {};
+	for (const node of flatRoots) {
+		const m = node.moduleCode || 'OTHER';
+		if (!groups[m]) groups[m] = [];
+		groups[m].push(node);
+	}
+	const order = modules;
+	const result: KpiTreeNode[] = [];
+	for (const m of order) {
+		if (!groups[m]) continue;
+		result.push({
+			id: -modules.indexOf(m) - 1,
+			metricCode: m,
+			moduleCode: m,
+			metricLevel: 0,
+			metricName: `${m} ${moduleNames[m] || m}`,
+			parentId: null,
+			sortNo: modules.indexOf(m),
+			isEnabled: true,
+			children: groups[m],
+		} as KpiTreeNode);
+		delete groups[m];
+	}
+	for (const [m, nodes] of Object.entries(groups)) {
+		result.push({
+			id: -(result.length + 1),
+			metricCode: m,
+			moduleCode: m,
+			metricLevel: 0,
+			metricName: `${m} ${moduleNames[m] || m}`,
+			parentId: null,
+			sortNo: 999,
+			isEnabled: true,
+			children: nodes,
+		} as KpiTreeNode);
+	}
+	return result;
+}
+
+async function loadTree() {
+	treeLoading.value = true;
+	try {
+		const params: any = {};
+		if (moduleFilter.value) params.moduleCode = moduleFilter.value;
+		if (keyword.value) params.keyword = keyword.value;
+		const res = await api.getTree(params);
+		const raw: KpiTreeNode[] = (res as any).data || res;
+		treeData.value = wrapWithModuleGroups(raw);
+	} catch (e: any) {
+		ElMessage.error('加载指标树失败: ' + (e.message || e));
+	} finally {
+		treeLoading.value = false;
+	}
+}
+
+async function onNodeClick(data: KpiTreeNode) {
+	if (data.metricLevel === 0) return;
+	detailLoading.value = true;
+	try {
+		const res = await api.getDetail(data.id);
+		const d: KpiDetail = (res as any).data || res;
+		currentDetail.value = d;
+		Object.assign(editForm, {
+			moduleCode: d.moduleCode,
+			metricLevel: d.metricLevel,
+			metricName: d.metricName,
+			unit: d.unit || '',
+			direction: d.direction,
+			yellowThreshold: d.yellowThreshold,
+			redThreshold: d.redThreshold,
+			statFrequency: d.statFrequency || '',
+			department: d.department || '',
+			dataSource: d.dataSource || '',
+			isHomePage: d.isHomePage,
+			sortNo: d.sortNo,
+			description: d.description || '',
+			formula: d.formula || '',
+			calcRule: d.calcRule || '',
+			dopFields: d.dopFields || '',
+			remark: d.remark || '',
+			isEnabled: d.isEnabled,
+		});
+	} catch (e: any) {
+		ElMessage.error('加载详情失败: ' + (e.message || e));
+	} finally {
+		detailLoading.value = false;
+	}
+}
+
+async function onSave() {
+	if (!currentDetail.value) return;
+	saving.value = true;
+	try {
+		await api.update(currentDetail.value.id, {
+			...editForm,
+			parentId: currentDetail.value.parentId,
+		});
+		ElMessage.success('保存成功');
+		await loadTree();
+		await onNodeClick({ id: currentDetail.value.id } as any);
+	} catch (e: any) {
+		ElMessage.error('保存失败: ' + (e.message || e));
+	} finally {
+		saving.value = false;
+	}
+}
+
+async function onToggleEnabled() {
+	if (!currentDetail.value) return;
+	try {
+		await api.toggleEnabled(currentDetail.value.id);
+		ElMessage.success(currentDetail.value.isEnabled ? '已启用' : '已禁用');
+	} catch (e: any) {
+		ElMessage.error('操作失败: ' + (e.message || e));
+	}
+}
+
+async function onAddRoot() {
+	const { value: name } = await ElMessageBox.prompt('请输入 L1 指标名称', '新增 L1', { confirmButtonText: '确定', cancelButtonText: '取消' });
+	if (!name) return;
+	try {
+		const m = moduleFilter.value || 'S1';
+		await api.create({ moduleCode: m, metricLevel: 1, parentId: null, metricName: name, direction: 'higher_is_better', isHomePage: false, sortNo: 0, isEnabled: true });
+		ElMessage.success('已添加');
+		await loadTree();
+	} catch (e: any) {
+		ElMessage.error('添加失败: ' + (e.message || e));
+	}
+}
+
+async function onAddChild(parent: KpiTreeNode) {
+	if (parent.metricLevel === 0) {
+		const { value: name } = await ElMessageBox.prompt(`在 "${parent.metricName}" 下添加 L1 指标`, '新增 L1', { confirmButtonText: '确定', cancelButtonText: '取消' });
+		if (!name) return;
+		try {
+			await api.create({ moduleCode: parent.moduleCode, metricLevel: 1, parentId: null, metricName: name, direction: 'higher_is_better', isHomePage: false, sortNo: 0, isEnabled: true });
+			ElMessage.success('已添加');
+			await loadTree();
+		} catch (e: any) {
+			ElMessage.error('添加失败: ' + (e.message || e));
+		}
+		return;
+	}
+	if (parent.metricLevel >= 3) {
+		ElMessage.warning('L3 是最低层级,不能再添加子指标');
+		return;
+	}
+	const { value: name } = await ElMessageBox.prompt(`在 "${parent.metricName}" 下添加 L${parent.metricLevel + 1} 指标`, '新增子指标', { confirmButtonText: '确定', cancelButtonText: '取消' });
+	if (!name) return;
+	try {
+		await api.create({ moduleCode: parent.moduleCode, metricLevel: parent.metricLevel + 1, parentId: parent.id, metricName: name, direction: 'higher_is_better', isHomePage: false, sortNo: 0, isEnabled: true });
+		ElMessage.success('已添加');
+		await loadTree();
+	} catch (e: any) {
+		ElMessage.error('添加失败: ' + (e.message || e));
+	}
+}
+
+async function onDelete(node: KpiTreeNode) {
+	if (node.metricLevel === 0) { ElMessage.warning('模块节点不可删除'); return; }
+	const childCount = countChildren(node);
+	const msg = childCount > 0 ? `将同时删除 ${childCount} 个子指标,确定删除「${node.metricName}」?` : `确定删除「${node.metricName}」?`;
+	await ElMessageBox.confirm(msg, '删除确认', { type: 'warning' });
+	try {
+		await api.remove(node.id);
+		ElMessage.success('已删除');
+		if (currentDetail.value?.id === node.id) currentDetail.value = null;
+		await loadTree();
+	} catch (e: any) {
+		ElMessage.error('删除失败: ' + (e.message || e));
+	}
+}
+
+function countChildren(node: KpiTreeNode): number {
+	if (!node.children?.length) return 0;
+	return node.children.reduce((s, c) => s + 1 + countChildren(c), 0);
+}
+
+function allowDrop(dragging: any, drop: any, type: NodeDropType) {
+	if (dragging.data.metricLevel === 0 || drop.data.metricLevel === 0) return false;
+	if (type === 'inner') {
+		return drop.data.metricLevel < 3 && dragging.data.metricLevel > drop.data.metricLevel;
+	}
+	return dragging.data.metricLevel === drop.data.metricLevel;
+}
+
+async function onNodeDrop(dragging: any, drop: any, type: NodeDropType) {
+	try {
+		let newParentId: number | null = null;
+		if (type === 'inner') {
+			newParentId = drop.data.id;
+		} else {
+			newParentId = drop.data.parentId;
+		}
+		await api.moveNode(dragging.data.id, { newParentId, newSortNo: 0 });
+		ElMessage.success('移动成功');
+		await loadTree();
+	} catch (e: any) {
+		ElMessage.error('移动失败: ' + (e.message || e));
+		await loadTree();
+	}
+}
+
+function onContextMenu(event: MouseEvent, data: KpiTreeNode) {
+	event.preventDefault();
+	ctxMenu.x = event.clientX;
+	ctxMenu.y = event.clientY;
+	ctxMenu.node = data;
+	ctxMenu.visible = true;
+}
+
+function hideCtxMenu() {
+	ctxMenu.visible = false;
+}
+
+// ── 数据导入 ──
+const uploadRef = ref<UploadInstance>();
+const importFile = ref<File | null>(null);
+const importing = ref(false);
+const importResult = ref<{ ok: boolean; message: string; detail?: any } | null>(null);
+
+function onFileChange(uploadFile: UploadFile) {
+	importFile.value = uploadFile.raw || null;
+	importResult.value = null;
+}
+
+function onFileRemove() {
+	importFile.value = null;
+	importResult.value = null;
+}
+
+function onDownloadTemplate() {
+	const url = api.downloadDemoTemplate();
+	const a = document.createElement('a');
+	a.href = url;
+	a.download = 'demo_data_template.xlsx';
+	a.click();
+}
+
+async function onImport() {
+	if (!importFile.value) return;
+	importing.value = true;
+	importResult.value = null;
+	try {
+		const res = await api.importDemoData(importFile.value);
+		const data = (res as any).data || res;
+		importResult.value = { ok: true, message: data.message || '导入成功', detail: data.detail };
+		ElMessage.success('数据导入成功,即将跳转到运营看板...');
+		uploadRef.value?.clearFiles();
+		importFile.value = null;
+		setTimeout(() => {
+			router.push('/');
+		}, 1500);
+	} catch (e: any) {
+		const msg = e?.response?.data?.message || e.message || '导入失败';
+		importResult.value = { ok: false, message: msg };
+		ElMessage.error('导入失败: ' + msg);
+	} finally {
+		importing.value = false;
+	}
+}
+
+onMounted(() => {
+	loadTree();
+	document.addEventListener('click', hideCtxMenu);
+});
+
+onBeforeUnmount(() => {
+	document.removeEventListener('click', hideCtxMenu);
+});
+</script>
+
+<style scoped lang="scss">
+.kpi-master {
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	background: #f5f7fa;
+}
+.kpi-header {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 16px 20px;
+	background: #fff;
+	border-bottom: 1px solid #ebeef5;
+	&__left {
+		display: flex;
+		align-items: center;
+		gap: 10px;
+		h2 { margin: 0; font-size: 18px; }
+	}
+	&__badge {
+		background: #409eff;
+		color: #fff;
+		padding: 2px 8px;
+		border-radius: 4px;
+		font-size: 12px;
+	}
+}
+.kpi-tabs {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+	padding: 0 20px;
+	:deep(.el-tabs__content) {
+		flex: 1;
+		overflow: hidden;
+	}
+	:deep(.el-tab-pane) {
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+	}
+}
+.tab-toolbar {
+	display: flex;
+	align-items: center;
+	gap: 10px;
+	padding: 8px 0 12px;
+}
+.kpi-body {
+	flex: 1;
+	display: flex;
+	overflow: hidden;
+	padding: 12px;
+	gap: 12px;
+}
+.kpi-tree-pane {
+	width: 380px;
+	min-width: 300px;
+	background: #fff;
+	border-radius: 6px;
+	border: 1px solid #ebeef5;
+	overflow-y: auto;
+	padding: 12px;
+}
+.kpi-detail-pane {
+	flex: 1;
+	background: #fff;
+	border-radius: 6px;
+	border: 1px solid #ebeef5;
+	overflow-y: auto;
+	padding: 20px;
+}
+.kpi-detail__head {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 20px;
+	padding-bottom: 12px;
+	border-bottom: 1px solid #ebeef5;
+	h3 { margin: 0; font-size: 16px; }
+	&-actions {
+		display: flex;
+		align-items: center;
+		gap: 12px;
+	}
+}
+.kpi-detail__form {
+	max-width: 900px;
+	.form-hint {
+		font-size: 11px;
+		color: #909399;
+		line-height: 1.3;
+		margin-top: 2px;
+	}
+}
+.kpi-detail__empty {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	height: 100%;
+}
+
+// tree node
+.tree-node {
+	display: flex;
+	align-items: center;
+	gap: 6px;
+	width: 100%;
+	font-size: 13px;
+	padding: 2px 0;
+	&--disabled {
+		opacity: 0.45;
+	}
+	&--module {
+		font-weight: 600;
+		font-size: 14px;
+		padding: 4px 0;
+	}
+	&__level {
+		display: inline-block;
+		font-size: 11px;
+		font-weight: 600;
+		padding: 1px 5px;
+		border-radius: 3px;
+		color: #fff;
+		line-height: 1.4;
+		&--mod { background: #6366f1; font-size: 12px; padding: 2px 7px; }
+		&--l1 { background: #409eff; }
+		&--l2 { background: #67c23a; }
+		&--l3 { background: #e6a23c; }
+	}
+	&__name--mod {
+		font-size: 14px;
+		font-weight: 600;
+		color: #303133;
+	}
+	&__count {
+		font-size: 11px;
+		color: #909399;
+		margin-left: auto;
+		margin-right: 8px;
+	}
+	&__name {
+		flex: 1;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+	}
+	&__code {
+		color: #999;
+		font-size: 11px;
+		margin-right: 4px;
+	}
+	&__actions {
+		display: none;
+		gap: 4px;
+	}
+	&:hover &__actions {
+		display: flex;
+	}
+	&__btn {
+		cursor: pointer;
+		font-size: 14px;
+		color: #409eff;
+		&--danger {
+			color: #f56c6c;
+		}
+		&:hover {
+			opacity: 0.7;
+		}
+	}
+}
+
+// context menu
+.kpi-ctx-menu {
+	position: fixed;
+	z-index: 9999;
+	background: #fff;
+	border: 1px solid #dcdfe6;
+	border-radius: 4px;
+	box-shadow: 0 2px 12px rgba(0,0,0,.12);
+	padding: 4px 0;
+	min-width: 120px;
+	&__item {
+		padding: 8px 16px;
+		cursor: pointer;
+		font-size: 13px;
+		&:hover { background: #f5f7fa; }
+		&--danger { color: #f56c6c; }
+	}
+}
+
+// import tab
+.import-tab {
+	padding: 20px;
+	max-width: 800px;
+	&__header {
+		margin-bottom: 28px;
+		h3 { margin: 0 0 8px; font-size: 18px; color: #303133; }
+		p { margin: 0; color: #606266; font-size: 14px; }
+	}
+	&__steps {
+		display: flex;
+		flex-direction: column;
+		gap: 24px;
+	}
+	&__result {
+		margin-top: 24px;
+		padding: 12px 16px;
+		border-radius: 6px;
+		display: flex;
+		align-items: center;
+		gap: 8px;
+		font-size: 14px;
+		&--success {
+			background: #f0f9eb;
+			color: #67c23a;
+			border: 1px solid #e1f3d8;
+		}
+		&--error {
+			background: #fef0f0;
+			color: #f56c6c;
+			border: 1px solid #fde2e2;
+		}
+		&-detail {
+			font-size: 12px;
+			opacity: 0.8;
+		}
+	}
+}
+.import-step {
+	display: flex;
+	gap: 16px;
+	&__num {
+		width: 32px;
+		height: 32px;
+		border-radius: 50%;
+		background: #409eff;
+		color: #fff;
+		font-weight: 700;
+		font-size: 15px;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		flex-shrink: 0;
+	}
+	&__content {
+		flex: 1;
+		h4 { margin: 0 0 6px; font-size: 15px; color: #303133; }
+		p { margin: 0 0 10px; color: #909399; font-size: 13px; }
+	}
+}
+.import-upload {
+	max-width: 480px;
+}
+</style>

+ 609 - 5
Web/src/views/aidop/kanban/s0.vue

@@ -6,6 +6,10 @@
         <p class="s0-head__sub">
           一级指标对应<strong>系统首页</strong>各模块卡片;二级指标对应<strong>模块详情页</strong>展示名称。连线表示分解 / 上卷关系,可在右侧编辑计算说明。
         </p>
+        <p class="s0-head__steps">
+          <strong>说明:</strong>下方为<strong>全量 L1/L2 关系图谱</strong>。点 <strong>S4 模块</strong>仅配置服务端 <strong>L1</strong>;点 S4 下某个 <strong>L1 节点</strong>编辑其对应的<strong>服务端 L2</strong>;点 <strong>L2 节点</strong>编辑该指标本地说明。
+          其他模块的 L1 可在右侧编辑下级 <strong>L2(本地草稿)</strong>。「保存 S4 布局」后九宫格与采购看板会自动刷新。
+        </p>
       </div>
       <div class="s0-head__actions">
         <span class="s0-head__label">筛选模块</span>
@@ -34,10 +38,158 @@
       v-model="drawerVisible"
       :title="drawerTitle"
       direction="rtl"
-      size="380px"
+      :size="drawerWidth"
       class="s0-drawer"
     >
-      <template v-if="selectedNode">
+      <div v-if="drawerS4" v-loading="!s4PanelReady" class="s0-drawer-s4">
+        <template v-if="s4PanelReady">
+          <p class="s0-s4__desc s0-drawer-s4__intro">
+            勾选首页展示的 L1(最多 {{ MAX_S4_L1 }} 个),编辑显示名与公式说明。二级指标请在图谱中点击对应 <strong>S4 的 L1 节点</strong> 进行配置。保存后九宫格与采购看板将自动刷新。
+          </p>
+          <div class="s0-s4__actions s0-drawer-s4__actions">
+            <el-button type="primary" size="small" :loading="s4Saving" @click="saveS4LayoutClick">保存 S4 布局</el-button>
+            <el-button size="small" @click="loadS4Panel">重新加载</el-button>
+          </div>
+          <div class="s0-s4__l1">
+            <div class="s0-s4__subhd">一级指标 L1(首页九宫格 S4)</div>
+            <p class="s0-s4__hint">勾选后可编辑显示名称与计算公式说明。</p>
+            <el-table :data="catalogL1" size="small" border stripe class="s0-s4__table">
+              <el-table-column label="首页" width="56" align="center">
+                <template #default="{ row }">
+                  <el-checkbox
+                    :model-value="pickedL1.includes(row.metricCode)"
+                    :disabled="!pickedL1.includes(row.metricCode) && pickedL1.length >= MAX_S4_L1"
+                    @update:model-value="(v) => onL1Check(row.metricCode, v)"
+                  />
+                </template>
+              </el-table-column>
+              <el-table-column prop="metricCode" label="编码" width="120" />
+              <el-table-column prop="defaultName" label="字典名称" min-width="100" />
+              <el-table-column label="显示名称" min-width="120">
+                <template #default="{ row }">
+                  <el-input
+                    v-model="l1DisplayName[row.metricCode]"
+                    placeholder="留空则同字典"
+                    size="small"
+                    :disabled="!pickedL1.includes(row.metricCode)"
+                  />
+                </template>
+              </el-table-column>
+              <el-table-column label="计算公式说明" min-width="160">
+                <template #default="{ row }">
+                  <el-input
+                    v-model="l1Formula[row.metricCode]"
+                    type="textarea"
+                    :rows="2"
+                    placeholder="例:Σ准时到货行 / Σ应到货行"
+                    size="small"
+                    :disabled="!pickedL1.includes(row.metricCode)"
+                  />
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </template>
+      </div>
+      <div v-else-if="drawerS4L1" v-loading="!s4PanelReady" class="s0-drawer-s4">
+        <template v-if="s4PanelReady">
+          <p class="s0-s4__desc s0-drawer-s4__intro">
+            以下为字典中<strong>父级</strong>指向「{{ s4FocusedServerMetric || '(加载中或未映射)' }}」的 L2。勾选、指定左右栏并填写说明后,与上方共用「保存 S4 布局」。
+          </p>
+          <el-form label-position="top" size="small" class="s0-drawer-s4__l1local">
+            <el-form-item label="图谱 L1 显示名(本地草稿)">
+              <el-input v-model="editForm.name" type="textarea" :rows="2" @input="markDirty" />
+            </el-form-item>
+            <el-form-item label="数据引用(只读)">
+              <el-input :model-value="selectedNode?.dataRef || '—'" disabled />
+            </el-form-item>
+          </el-form>
+          <div class="s0-s4__actions s0-drawer-s4__actions">
+            <el-button type="primary" size="small" :loading="s4Saving" @click="saveS4LayoutClick">保存 S4 布局</el-button>
+            <el-button size="small" @click="loadS4Panel">重新加载</el-button>
+          </div>
+          <div class="s0-s4__l2">
+            <div class="s0-s4__subhd">服务端二级指标(隶属 {{ s4FocusedServerMetricTitle }})</div>
+            <el-alert
+              v-if="!catalogL2ForFocusedS4L1.length"
+              type="info"
+              :closable="false"
+              show-icon
+              class="s0-s4__empty-l2"
+              title="当前没有父级指向该 L1 的 L2。请在下方表格中打开「选用」并选择父级为上述编码;也可先在「S4 模块」里统一配置。"
+            />
+            <el-table
+              v-else
+              :data="catalogL2ForFocusedS4L1"
+              size="small"
+              border
+              stripe
+              class="s0-s4__table"
+            >
+              <el-table-column label="选用" width="56" align="center">
+                <template #default="{ row }">
+                  <el-switch
+                    :model-value="Boolean(l2On[row.metricCode])"
+                    @update:model-value="(v) => onL2Toggle(row.metricCode, v)"
+                  />
+                </template>
+              </el-table-column>
+              <el-table-column prop="metricCode" label="编码" width="120" />
+              <el-table-column prop="defaultName" label="字典名称" min-width="100" />
+              <el-table-column label="显示名称" min-width="120">
+                <template #default="{ row }">
+                  <el-input
+                    v-model="l2DisplayName[row.metricCode]"
+                    placeholder="留空则同字典"
+                    size="small"
+                    :disabled="!l2On[row.metricCode]"
+                  />
+                </template>
+              </el-table-column>
+              <el-table-column label="父级(可选)" min-width="150">
+                <template #default="{ row }">
+                  <el-select
+                    v-model="l2ParentMetric[row.metricCode]"
+                    placeholder="可不选"
+                    filterable
+                    clearable
+                    style="width: 100%"
+                    :disabled="!l2On[row.metricCode]"
+                  >
+                    <el-option
+                      v-for="c in parentOptionsForRow(row)"
+                      :key="c.metricCode"
+                      :label="parentOptionLabel(c)"
+                      :value="c.metricCode"
+                    />
+                  </el-select>
+                </template>
+              </el-table-column>
+              <el-table-column label="栏" width="88">
+                <template #default="{ row }">
+                  <el-select v-model="l2Zone[row.metricCode]" :disabled="!l2On[row.metricCode]">
+                    <el-option label="左" value="left" />
+                    <el-option label="右" value="right" />
+                  </el-select>
+                </template>
+              </el-table-column>
+              <el-table-column label="计算公式说明" min-width="140">
+                <template #default="{ row }">
+                  <el-input
+                    v-model="l2Formula[row.metricCode]"
+                    type="textarea"
+                    :rows="2"
+                    placeholder="详情主 KPI 行下方"
+                    size="small"
+                    :disabled="!l2On[row.metricCode]"
+                  />
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </template>
+      </div>
+      <template v-else-if="selectedNode">
         <el-form label-position="top" size="small">
           <el-form-item label="节点 ID(只读)">
             <el-input :model-value="selectedNode.rawId" disabled />
@@ -55,6 +207,36 @@
             <el-input :model-value="selectedNode.dataRef || '—'" disabled />
           </el-form-item>
         </el-form>
+        <template v-if="selectedNode.level === 'l1' && graphChildL2LocalRows.length">
+          <el-divider content-position="left">下级 L2 指标(本地草稿)</el-divider>
+          <div v-for="row in graphChildL2LocalRows" :key="row.id" class="s0-nested-l2">
+            <div class="s0-nested-l2__title">{{ row.id }} · {{ row.detailLabel }}</div>
+            <el-form label-position="top" size="small">
+              <el-form-item label="详情显示名">
+                <el-input
+                  :model-value="l2LocalField(row.id, 'detailLabel', row.detailLabel)"
+                  @update:model-value="(v) => patchGraphL2Local(row.id, 'detailLabel', v)"
+                />
+              </el-form-item>
+              <el-form-item label="计算模型 / 公式说明">
+                <el-input
+                  type="textarea"
+                  :rows="3"
+                  :model-value="l2LocalField(row.id, 'formula', row.formula)"
+                  @update:model-value="(v) => patchGraphL2Local(row.id, 'formula', v)"
+                />
+              </el-form-item>
+              <el-form-item label="上卷 / 聚合方式">
+                <el-input
+                  type="textarea"
+                  :rows="2"
+                  :model-value="l2LocalField(row.id, 'aggregation', row.aggregation || '')"
+                  @update:model-value="(v) => patchGraphL2Local(row.id, 'aggregation', v)"
+                />
+              </el-form-item>
+            </el-form>
+          </div>
+        </template>
       </template>
       <template v-else-if="selectedEdge">
         <el-form label-position="top" size="small">
@@ -63,13 +245,14 @@
           </el-form-item>
         </el-form>
       </template>
-      <div v-else class="s0-drawer__empty">点击图谱中的节点或连线进行编辑</div>
+      <div v-else class="s0-drawer__empty">点击图谱中的节点或连线进行编辑;点 <strong>S4</strong> 模块可配置服务端布局。</div>
     </el-drawer>
   </div>
 </template>
 
 <script setup>
-import { ref, computed, onMounted, onUnmounted, nextTick, watch } from 'vue'
+import { ref, reactive, computed, onMounted, onUnmounted, nextTick, watch } from 'vue'
+import { useRoute } from 'vue-router'
 import * as echarts from 'echarts'
 import { ElMessage } from 'element-plus'
 import {
@@ -77,11 +260,246 @@ import {
   S0_ROOT_ID,
   STORAGE_KEY
 } from './data/operationModelSchema'
+import { resolveS4ServerMetricForGraphL1 } from './data/s4GraphServerMap'
+import {
+  fetchS4MetricCatalog,
+  fetchS4OperationLayout,
+  saveS4OperationLayout
+} from '../api/kanbanData'
+import { notifyS4LayoutSaved } from './utils/s4LayoutEvents'
+
+const MAX_S4_L1 = 8
+const s4PanelReady = ref(false)
+const s4Saving = ref(false)
+const catalogL1 = ref([])
+const catalogL2 = ref([])
+const pickedL1 = ref([])
+const l2On = reactive({})
+const l2ParentMetric = reactive({})
+const l2Zone = reactive({})
+const l2Formula = reactive({})
+const l1DisplayName = reactive({})
+const l1Formula = reactive({})
+const l2DisplayName = reactive({})
 
+const route = useRoute()
 const chartRef = ref(null)
 const moduleFilter = ref('')
 let chart = null
 
+function applyModelingRouteQuery() {
+  const m = route.query.module
+  if (typeof m === 'string' && moduleOptions.value.includes(m)) {
+    moduleFilter.value = m
+    if (chart) refreshChart()
+  }
+  if (route.query.focus === 's4') {
+    nextTick(() => {
+      selectedEdge.value = null
+      drawerVisible.value = true
+      selectedNode.value = {
+        id: 'MOD-S4',
+        name: 'S4\n采购执行',
+        category: 1,
+        level: 'module',
+        rawId: 'S4',
+        dataRef: '',
+        value: 1,
+        symbolSize: 44,
+        itemStyle: { color: 'rgba(59, 130, 246, 0.3)', borderColor: '#60a5fa', borderWidth: 2 },
+        label: { color: '#eff6ff', fontSize: 10 }
+      }
+      loadS4Panel()
+    })
+  }
+}
+
+function parentRowIdToMetricCode(pid) {
+  if (!pid || typeof pid !== 'string') return ''
+  const m = pid.match(/^S4-L\d+-(.+)$/)
+  return m ? m[1] : ''
+}
+
+function l1Name(code) {
+  const c = catalogL1.value.find((x) => x.metricCode === code)
+  return c ? `${c.defaultName} (${code})` : code
+}
+
+function parentOptionsForRow(row) {
+  if (row.metricLevel >= 3) {
+    return catalogL2.value.filter((x) => x.metricLevel === 2)
+  }
+  return sortedS4CatalogL1.value
+}
+
+function parentOptionLabel(c) {
+  return `${c.defaultName} (${c.metricCode})`
+}
+
+function onL2Toggle(metricCode, on) {
+  l2On[metricCode] = on
+  if (on && !l2ParentMetric[metricCode] && pickedL1.value.length === 1) {
+    l2ParentMetric[metricCode] = pickedL1.value[0]
+  }
+}
+
+function onL1Check(metricCode, checked) {
+  if (checked) {
+    if (pickedL1.value.length >= MAX_S4_L1 && !pickedL1.value.includes(metricCode)) {
+      ElMessage.warning(`首页最多勾选 ${MAX_S4_L1} 个 L1`)
+      return
+    }
+    if (!pickedL1.value.includes(metricCode)) {
+      pickedL1.value = [...pickedL1.value, metricCode]
+    }
+  } else {
+    pickedL1.value = pickedL1.value.filter((c) => c !== metricCode)
+  }
+}
+
+function effectiveL1DisplayName(metricCode) {
+  const c = catalogL1.value.find((x) => x.metricCode === metricCode)
+  const d = String(c?.defaultName ?? '').trim()
+  const t = String(l1DisplayName[metricCode] ?? '').trim()
+  if (!t || t === d) return null
+  return t
+}
+
+function effectiveL1Formula(metricCode) {
+  const t = String(l1Formula[metricCode] ?? '').trim()
+  return t || null
+}
+
+function effectiveL2DisplayName(row) {
+  const d = String(row.defaultName ?? '').trim()
+  const t = String(l2DisplayName[row.metricCode] ?? '').trim()
+  if (!t || t === d) return null
+  return t
+}
+
+async function loadS4Panel(opts = {}) {
+  const keepVisible = Boolean(opts.keepVisible)
+  if (!keepVisible) s4PanelReady.value = false
+  try {
+    const [rawAll, layout] = await Promise.all([
+      fetchS4MetricCatalog(),
+      fetchS4OperationLayout(1, 1)
+    ])
+    const rawL1 = (rawAll || []).filter((x) => x.metricLevel === 1)
+    const rawL2 = (rawAll || []).filter((x) => x.metricLevel >= 2)
+    catalogL1.value = (rawL1 || []).slice().sort((a, b) => (a.sortHint ?? 0) - (b.sortHint ?? 0))
+    catalogL2.value = (rawL2 || []).slice().sort((a, b) => (a.sortHint ?? 0) - (b.sortHint ?? 0))
+
+    for (const row of catalogL1.value) {
+      l1DisplayName[row.metricCode] = ''
+      l1Formula[row.metricCode] = ''
+    }
+    for (const row of catalogL2.value) {
+      if (l2On[row.metricCode] === undefined) l2On[row.metricCode] = false
+      if (l2ParentMetric[row.metricCode] === undefined) l2ParentMetric[row.metricCode] = ''
+      if (l2Zone[row.metricCode] === undefined) l2Zone[row.metricCode] = 'left'
+      if (l2Formula[row.metricCode] === undefined) l2Formula[row.metricCode] = ''
+      if (l2DisplayName[row.metricCode] === undefined) l2DisplayName[row.metricCode] = ''
+    }
+
+    if (layout?.l1?.length) {
+      pickedL1.value = layout.l1
+        .slice()
+        .sort((a, b) => a.sortNo - b.sortNo)
+        .map((x) => x.metricCode)
+      for (const x of layout.l1) {
+        l1DisplayName[x.metricCode] = x.displayName ?? ''
+        l1Formula[x.metricCode] = x.formulaText ?? ''
+      }
+    } else {
+      pickedL1.value = []
+    }
+
+    const idToCode = {}
+    for (const row of [...catalogL1.value, ...catalogL2.value]) {
+      if (row.id) idToCode[row.id] = row.metricCode
+    }
+
+    for (const row of catalogL2.value) {
+      l2On[row.metricCode] = false
+      l2ParentMetric[row.metricCode] = row.parentId ? (idToCode[row.parentId] || '') : ''
+      l2Zone[row.metricCode] = 'left'
+      l2Formula[row.metricCode] = ''
+      l2DisplayName[row.metricCode] = ''
+    }
+
+    if (layout?.l2?.length) {
+      for (const row of layout.l2) {
+        l2On[row.metricCode] = true
+        const layoutParent = parentRowIdToMetricCode(row.parentRowId)
+        if (layoutParent) l2ParentMetric[row.metricCode] = layoutParent
+        const z = String(row.panelZone || 'left').toLowerCase()
+        l2Zone[row.metricCode] = z === 'right' ? 'right' : 'left'
+        l2Formula[row.metricCode] = row.formulaText ?? ''
+        l2DisplayName[row.metricCode] = row.displayName ?? ''
+      }
+    }
+
+    if (!catalogL1.value.length) {
+      ElMessage.warning('未加载到 S4 指标字典,请确认后端已初始化 KpiMaster(S4)种子数据')
+    }
+  } catch (e) {
+    console.error(e)
+    ElMessage.error('加载 S4 指标配置失败,请检查接口 /api/AidopKanban/s4-metric-catalog 与网络')
+    catalogL1.value = []
+    catalogL2.value = []
+    pickedL1.value = []
+  } finally {
+    s4PanelReady.value = true
+  }
+}
+
+async function saveS4LayoutClick() {
+  if (pickedL1.value.length > MAX_S4_L1) {
+    ElMessage.warning(`L1 最多 ${MAX_S4_L1} 个`)
+    return
+  }
+  const L1 = catalogL1.value
+    .filter((c) => pickedL1.value.includes(c.metricCode))
+    .map((c, i) => ({
+      RowId: `S4-L1-${c.metricCode}`,
+      MetricCode: c.metricCode,
+      DisplayName: effectiveL1DisplayName(c.metricCode),
+      FormulaText: effectiveL1Formula(c.metricCode),
+      SortNo: (i + 1) * 10
+    }))
+  const L2 = []
+  for (const row of catalogL2.value) {
+    if (!l2On[row.metricCode]) continue
+    const parent = String(l2ParentMetric[row.metricCode] || '').trim()
+    const lvl = row.metricLevel ?? 2
+    const parentPrefix = lvl >= 3 ? 'S4-L2-' : 'S4-L1-'
+    const parentRowId = parent ? `${parentPrefix}${parent}` : null
+    L2.push({
+      RowId: `S4-L${lvl}-${row.metricCode}`,
+      MetricCode: row.metricCode,
+      DisplayName: effectiveL2DisplayName(row),
+      SortNo: (L2.length + 1) * 10,
+      ParentRowId: parentRowId,
+      FormulaText: String(l2Formula[row.metricCode] || '').trim() || null,
+      PanelZone: l2Zone[row.metricCode] || 'left'
+    })
+  }
+  s4Saving.value = true
+  try {
+    const r = await saveS4OperationLayout({ L1, L2 }, 1, 1)
+    if (r.ok) {
+      notifyS4LayoutSaved()
+      await loadS4Panel({ keepVisible: true })
+      ElMessage.success('S4 布局已保存;首页九宫格与 S4 采购看板已自动刷新数据')
+    } else {
+      ElMessage.error(r.message || '保存失败')
+    }
+  } finally {
+    s4Saving.value = false
+  }
+}
+
 function deepClone(obj) {
   return JSON.parse(JSON.stringify(obj))
 }
@@ -98,7 +516,56 @@ const edgeForm = ref({ label: '' })
 
 const moduleOptions = computed(() => workingModel.value.map((b) => b.moduleId))
 
+const sortedS4CatalogL1 = computed(() =>
+  [...catalogL1.value].sort((a, b) => (a.sortHint ?? 0) - (b.sortHint ?? 0))
+)
+
+const s4FocusedServerMetric = computed(() => {
+  const rid = selectedNode.value?.rawId
+  if (!rid) return null
+  return resolveS4ServerMetricForGraphL1(rid, sortedS4CatalogL1.value)
+})
+
+const drawerS4 = computed(
+  () => Boolean(selectedNode.value?.level === 'module' && selectedNode.value?.rawId === 'S4')
+)
+
+const drawerS4L1 = computed(() => {
+  if (selectedNode.value?.level !== 'l1') return false
+  return Boolean(selectedNode.value.rawId?.startsWith('S4-L1-'))
+})
+
+const catalogL2ForFocusedS4L1 = computed(() => {
+  const code = s4FocusedServerMetric.value
+  if (!code) return []
+  const l1Item = catalogL1.value.find((x) => x.metricCode === code)
+  if (!l1Item) return []
+  return catalogL2.value.filter((row) => row.parentId === l1Item.id)
+})
+
+const graphChildL2LocalRows = computed(() => {
+  if (selectedNode.value?.level !== 'l1') return []
+  const rid = selectedNode.value.rawId
+  const block = workingModel.value.find((b) => b.l1.some((x) => x.id === rid))
+  if (!block || block.moduleId === 'S4') return []
+  return block.l2.filter((x) => x.parentL1Id === rid)
+})
+
+const s4FocusedServerMetricTitle = computed(() => {
+  const c = s4FocusedServerMetric.value
+  return c ? l1Name(c) : '—'
+})
+
+const drawerWidth = computed(() =>
+  drawerS4.value || drawerS4L1.value ? 'min(920px, 98vw)' : '380px'
+)
+
 const drawerTitle = computed(() => {
+  if (drawerS4.value) return 'S4 · 服务端 L1 布局(九宫格)'
+  if (drawerS4L1.value) {
+    const nm = selectedNode.value?.name?.replace(/\n/g, ' ') ?? 'L1'
+    return `S4 · 服务端 L2(${nm})`
+  }
   if (selectedNode.value) {
     const lv = selectedNode.value.level
     if (lv === 'root') return 'S0 根节点'
@@ -149,6 +616,20 @@ function markDirty() {
   dirty.value = true
 }
 
+function l2LocalField(nodeId, key, fallback) {
+  const o = overrides.value.nodes[nodeId]
+  if (!o || o[key] === undefined || o[key] === null) return fallback
+  return o[key]
+}
+
+function patchGraphL2Local(nodeId, key, val) {
+  markDirty()
+  if (!overrides.value.nodes[nodeId]) overrides.value.nodes[nodeId] = {}
+  overrides.value.nodes[nodeId][key] = val
+  applyOverridesToModel()
+  refreshChart()
+}
+
 function buildGraphOption(filterModule) {
   const nodes = []
   const links = []
@@ -423,12 +904,22 @@ function onChartClick(params) {
   selectedEdge.value = null
   if (params.dataType === 'node') {
     const d = params.data
-    if (d.level === 'root' || d.level === 'module') {
+    if (d.level === 'root') {
       drawerVisible.value = true
       selectedNode.value = { ...d, name: d.name.replace(/\n/g, ' ') }
       editForm.value = { name: d.name.replace(/\n/g, ' '), formula: '', aggregation: '' }
       return
     }
+    if (d.level === 'module') {
+      drawerVisible.value = true
+      selectedNode.value = { ...d, name: d.name.replace(/\n/g, ' ') }
+      if (d.rawId === 'S4') {
+        loadS4Panel()
+        return
+      }
+      editForm.value = { name: d.name.replace(/\n/g, ' '), formula: '', aggregation: '' }
+      return
+    }
     const block = workingModel.value.find((b) => d.id.startsWith(b.moduleId))
     const l1 = block?.l1.find((x) => x.id === d.id)
     const l2 = block?.l2.find((x) => x.id === d.id)
@@ -440,6 +931,9 @@ function onChartClick(params) {
         formula: '',
         aggregation: ''
       }
+      if (block?.moduleId === 'S4') {
+        loadS4Panel()
+      }
     } else if (l2) {
       selectedNode.value = { ...d, level: 'l2', formula: l2.formula, aggregation: l2.aggregation }
       editForm.value = {
@@ -511,10 +1005,18 @@ watch(drawerVisible, (vis) => {
   }
 })
 
+watch(
+  () => [route.query.module, route.query.focus],
+  () => {
+    nextTick(() => applyModelingRouteQuery())
+  }
+)
+
 onMounted(() => {
   loadOverrides()
   nextTick(() => {
     if (!chartRef.value) return
+    applyModelingRouteQuery()
     chart = echarts.init(chartRef.value)
     chart.setOption(buildGraphOption(moduleFilter.value))
     chart.on('click', onChartClick)
@@ -583,6 +1085,21 @@ onUnmounted(() => {
   line-height: 1.5;
 }
 
+.s0-head__steps {
+  margin: 10px 0 0;
+  max-width: 920px;
+  font-size: 12px;
+  color: #475569;
+  line-height: 1.55;
+}
+
+.s0-head__anchor {
+  color: #4f46e5;
+  font-weight: 600;
+  text-decoration: underline;
+  text-underline-offset: 2px;
+}
+
 .s0-head__actions {
   display: flex;
   flex-wrap: wrap;
@@ -595,6 +1112,93 @@ onUnmounted(() => {
   color: #64748b;
 }
 
+.s0-drawer-s4 {
+  max-height: calc(100vh - 88px);
+  overflow-x: auto;
+  overflow-y: auto;
+  padding-bottom: 8px;
+}
+
+.s0-drawer-s4__intro {
+  margin: 0 0 10px;
+}
+
+.s0-drawer-s4__actions {
+  margin-bottom: 14px;
+}
+
+.s0-drawer-s4__l1local {
+  margin-bottom: 8px;
+}
+
+.s0-s4__empty-l2 {
+  margin-bottom: 12px;
+}
+
+.s0-nested-l2 {
+  margin-bottom: 16px;
+  padding: 12px;
+  background: #f8fafc;
+  border: 1px solid #e2e8f0;
+  border-radius: 8px;
+}
+
+.s0-nested-l2__title {
+  font-size: 12px;
+  font-weight: 600;
+  color: #334155;
+  margin-bottom: 10px;
+}
+
+.s0-s4__desc {
+  margin: 4px 0 0;
+  font-size: 12px;
+  color: #64748b;
+  line-height: 1.5;
+}
+
+.s0-s4__hint {
+  margin: 0 0 10px;
+  font-size: 12px;
+  color: #64748b;
+  line-height: 1.45;
+}
+
+.s0-s4__actions {
+  display: flex;
+  gap: 8px;
+  flex-shrink: 0;
+  align-items: flex-start;
+}
+
+.s0-s4__subhd {
+  font-size: 12px;
+  font-weight: 600;
+  color: #475569;
+  margin-bottom: 8px;
+}
+
+.s0-s4__l1 {
+  margin-bottom: 14px;
+}
+
+.s0-s4__l1-group {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px 16px;
+}
+
+.s0-s4__code {
+  margin-left: 4px;
+  font-size: 11px;
+  color: #94a3b8;
+  font-weight: 500;
+}
+
+.s0-s4__table {
+  width: 100%;
+}
+
 .s0-body {
   flex: 1;
   min-height: 360px;

+ 54 - 0
Web/src/views/aidop/kanban/s3.vue

@@ -7,6 +7,10 @@
         <p class="page-desc">物料供需平衡与交货执行的核心监控节点</p>
       </div>
       <div class="header-right">
+        <div class="header-modeling-links">
+          <el-button size="small" text type="primary" @click="goModelingS3">运营指标建模</el-button>
+          <el-button size="small" text @click="goModelingS4Pilot">S4 服务端试点</el-button>
+        </div>
         <el-button size="small" class="btn-export">
           <el-icon><Download /></el-icon>
           导出报表
@@ -18,6 +22,19 @@
       </div>
     </div>
 
+    <el-alert
+      class="s3-modeling-hint"
+      type="info"
+      :closable="false"
+      show-icon
+      title="指标建模与配置入口"
+    >
+      <template #default>
+        本页为 S3 供应协同<strong>详情看板</strong>。分步建模与指标树在侧栏「运营指标建模」;进入后可用筛选器切到 <strong>S3</strong> 查看口径说明。
+        与首页九宫格联动的<strong>服务端 Catalog / 布局勾选</strong>当前仅在 <strong>S4</strong> 试点,请点击上方「S4 服务端试点」跳转配置区。
+      </template>
+    </el-alert>
+
     <!-- 供应计划:日期、物料、供应商 -->
     <DetailQueryBar
       dark
@@ -220,6 +237,15 @@ import { loadHomeModuleMetrics } from './data/homeModulesSync'
 import { fetchModuleDetail } from '../api/kanbanData'
 
 const router = useRouter()
+
+function goModelingS3() {
+  router.push({ path: '/aidop/smart-ops/modeling', query: { module: 'S3' } })
+}
+
+function goModelingS4Pilot() {
+  router.push({ path: '/aidop/smart-ops/modeling', query: { focus: 's4' } })
+}
+
 const s3HeadCount = ref('1,240')
 const s3TrendA = ref('12.5%')
 const s3TrendB = ref('4.2%')
@@ -449,9 +475,37 @@ onMounted(async () => {
 
 .header-right {
   display: flex;
+  align-items: center;
+  flex-wrap: wrap;
   gap: 10px;
 }
 
+.header-modeling-links {
+  display: flex;
+  align-items: center;
+  gap: 2px;
+  margin-right: 4px;
+  padding-right: 12px;
+  border-right: 1px solid #334155;
+}
+
+.header-modeling-links :deep(.el-button) {
+  color: #93c5fd;
+}
+
+.header-modeling-links :deep(.el-button:hover) {
+  color: #bfdbfe;
+}
+
+.s3-modeling-hint {
+  margin-bottom: 16px;
+}
+
+:deep(.s3-modeling-hint.el-alert) {
+  background: rgba(30, 58, 138, 0.2);
+  border: 1px solid #1e3a8a;
+}
+
 .btn-export {
   background: rgba(51, 65, 85, 0.6);
   border: 1px solid #334155;

+ 163 - 83
Web/src/views/aidop/kanban/s4.vue

@@ -11,6 +11,10 @@
         <span class="version">V5.0 正式版</span>
       </div>
       <div class="nav-right">
+        <div class="nav-modeling-links">
+          <el-button link type="primary" class="nav-modeling-link" @click="goModelingS4">运营指标建模</el-button>
+          <el-button link class="nav-modeling-link" @click="goModelingS4Pilot">服务端试点配置</el-button>
+        </div>
         <div class="system-time">
           <div class="time-label">当前系统时间</div>
           <div class="time-value">{{ currentTime }}</div>
@@ -56,41 +60,34 @@
           <el-icon class="panel-icon" :size="24"><Document /></el-icon>
         </div>
         <div class="panel-content">
-          <div class="metric-row">
-            <span class="metric-label">1. 物料交货周期</span>
-            <div class="metric-value">
-              <span class="value">{{ s4LeftCycle }}</span>
-              <span class="unit">天</span>
-              <span class="trend up">↑0.3</span>
-              <el-tag size="small" type="warning">警告</el-tag>
-            </div>
-          </div>
-          <div class="metric-row">
-            <span class="metric-label">2. 物料交货满足率</span>
-            <div class="metric-value">
-              <span class="value warning">{{ homeS4.materialDeliveryQualityPct }}</span>
-              <span class="unit">%</span>
-              <span class="trend down">↓</span>
-              <el-tag size="small" type="warning">未达目标</el-tag>
-            </div>
-          </div>
-          <div class="metric-row">
-            <span class="metric-label">3. 物料采购人效</span>
-            <div class="metric-value">
-              <span class="value">{{ s4LeftEfficiency }}</span>
-              <span class="unit">人/案</span>
-              <span class="trend up">↑1%</span>
-              <el-tag size="small" type="success">优秀</el-tag>
-            </div>
-          </div>
-          <div class="metric-row">
-            <span class="metric-label">4. 采购在途周转</span>
-            <div class="metric-value">
-              <span class="value">{{ homeS4.materialInventoryTurnoverDays }}</span>
-              <span class="unit">天</span>
-              <span class="trend">目标 {{ homeS4.materialInventoryTurnoverTargetDays }}天</span>
-              <el-tag size="small" :type="homeS4.materialInventoryTurnoverDays <= homeS4.materialInventoryTurnoverTargetDays ? 'success' : 'warning'">{{ homeS4.materialInventoryTurnoverDays <= homeS4.materialInventoryTurnoverTargetDays ? '达成' : '预警' }}</el-tag>
+          <template v-if="s4LeftKpis.length">
+            <div
+              v-for="(row, idx) in s4LeftKpis"
+              :key="row.rowId || row.metricCode || 'L' + idx"
+              class="metric-row"
+            >
+              <span class="metric-label">
+                <span class="metric-title">{{ idx + 1 }}. {{ row.displayName }}</span>
+                <span v-if="row.formulaText" class="metric-formula">{{ row.formulaText }}</span>
+              </span>
+              <div class="metric-value">
+                <el-tag size="small" :type="s4AchievementTagType(row.achievementLevel)">{{
+                  s4AchievementTagText(row.achievementLevel)
+                }}</el-tag>
+                <span class="value" :class="s4ValueClass(row.achievementLevel)">{{
+                  formatS4KpiNum(row.currentValue)
+                }}</span>
+                <span v-if="row.unit" class="unit">{{ row.unit }}</span>
+                <span v-if="row.targetValue != null" class="trend">目标 {{ formatS4KpiNum(row.targetValue) }}{{ row.unit === '%' ? '%' : '' }}</span>
+                <span class="trend" :class="row.gapArrow === 'up' ? 'up' : row.gapArrow === 'down' ? 'down' : ''">{{
+                  row.gapLabel
+                }}</span>
+              </div>
             </div>
+          </template>
+          <div v-else class="metric-row metric-row--empty">
+            <span class="metric-label">主 KPI(左栏)</span>
+            <div class="metric-value">暂无运营布局或未配置 left 区 L2</div>
           </div>
         </div>
       </div>
@@ -110,41 +107,34 @@
           <el-icon class="panel-icon purple" :size="24"><Connection /></el-icon>
         </div>
         <div class="panel-content">
-          <div class="metric-row">
-            <span class="metric-label">1. 品类物料交货周期</span>
-            <div class="metric-value right">
-              <el-tag size="small" :type="homeS4.materialOnTimeDeliveryPct >= homeS4.materialOnTimeDeliveryTargetPct ? 'success' : 'warning'">{{ homeS4.materialOnTimeDeliveryPct >= homeS4.materialOnTimeDeliveryTargetPct ? '优秀' : '警告' }}</el-tag>
-              <span class="value">{{ s4RightCycle }}</span>
-              <span class="unit">天</span>
-              <span class="trend down">↓0.2</span>
-            </div>
-          </div>
-          <div class="metric-row">
-            <span class="metric-label">2. 品类物料交货满足率</span>
-            <div class="metric-value right">
-              <el-tag size="small" :type="homeS4.materialOnTimeDeliveryPct >= homeS4.materialOnTimeDeliveryTargetPct ? 'success' : 'danger'">{{ homeS4.materialOnTimeDeliveryPct >= homeS4.materialOnTimeDeliveryTargetPct ? '达标' : '未达标' }}</el-tag>
-              <span class="value success">{{ homeS4.materialOnTimeDeliveryPct }}</span>
-              <span class="unit">%</span>
-              <span class="trend">目标 {{ homeS4.materialOnTimeDeliveryTargetPct }}%</span>
-            </div>
-          </div>
-          <div class="metric-row">
-            <span class="metric-label">3. 品类采购人效</span>
-            <div class="metric-value right">
-              <el-tag size="small" :type="homeS4.materialOnTimeDeliveryPct >= homeS4.materialOnTimeDeliveryTargetPct ? 'success' : 'warning'">{{ homeS4.materialOnTimeDeliveryPct >= homeS4.materialOnTimeDeliveryTargetPct ? '优秀' : '警告' }}</el-tag>
-              <span class="value">{{ s4RightEfficiency }}</span>
-              <span class="unit">人/案</span>
-              <span class="trend up">↑4.2%</span>
-            </div>
-          </div>
-          <div class="metric-row">
-            <span class="metric-label">4. 品类采购在途周转</span>
-            <div class="metric-value right">
-              <el-tag size="small" :type="homeS4.materialOnTimeDeliveryPct >= homeS4.materialOnTimeDeliveryTargetPct ? 'success' : 'warning'">{{ homeS4.materialOnTimeDeliveryPct >= homeS4.materialOnTimeDeliveryTargetPct ? '达成' : '警告' }}</el-tag>
-              <span class="value warning">{{ s4RightTurnover }}</span>
-              <span class="unit">天</span>
-              <span class="trend up">↑1.5</span>
+          <template v-if="s4RightKpis.length">
+            <div
+              v-for="(row, idx) in s4RightKpis"
+              :key="row.rowId || row.metricCode || 'R' + idx"
+              class="metric-row"
+            >
+              <span class="metric-label">
+                <span class="metric-title">{{ idx + 1 }}. {{ row.displayName }}</span>
+                <span v-if="row.formulaText" class="metric-formula">{{ row.formulaText }}</span>
+              </span>
+              <div class="metric-value right">
+                <el-tag size="small" :type="s4AchievementTagType(row.achievementLevel)">{{
+                  s4AchievementTagText(row.achievementLevel)
+                }}</el-tag>
+                <span class="value" :class="s4ValueClass(row.achievementLevel)">{{
+                  formatS4KpiNum(row.currentValue)
+                }}</span>
+                <span v-if="row.unit" class="unit">{{ row.unit }}</span>
+                <span v-if="row.targetValue != null" class="trend">目标 {{ formatS4KpiNum(row.targetValue) }}{{ row.unit === '%' ? '%' : '' }}</span>
+                <span class="trend" :class="row.gapArrow === 'up' ? 'up' : row.gapArrow === 'down' ? 'down' : ''">{{
+                  row.gapLabel
+                }}</span>
+              </div>
             </div>
+          </template>
+          <div v-else class="metric-row metric-row--empty">
+            <span class="metric-label">主 KPI(右栏)</span>
+            <div class="metric-value right">暂无运营布局或未配置 right 区 L2</div>
           </div>
         </div>
       </div>
@@ -218,7 +208,7 @@
 </template>
 
 <script setup>
-import { ref, computed, onMounted, nextTick } from 'vue'
+import { ref, computed, onMounted, onUnmounted, nextTick } from 'vue'
 import { useRouter } from 'vue-router'
 import { ElMessage } from 'element-plus'
 import DetailQueryBar from './components/DetailQueryBar.vue'
@@ -236,9 +226,20 @@ import {
 import * as echarts from 'echarts'
 import { homeS4 } from './data/homeModulesSync'
 import { loadHomeModuleMetrics } from './data/homeModulesSync'
-import { fetchModuleDetail } from '../api/kanbanData'
+import { fetchModuleDetail, fetchS4DetailKpis } from '../api/kanbanData'
+import { baseQueryToApiParams } from './utils/smartOpsBaseQuery'
+import { AIDOP_S4_LAYOUT_SAVED } from './utils/s4LayoutEvents'
 
 const router = useRouter()
+
+function goModelingS4() {
+  router.push({ path: '/aidop/smart-ops/modeling', query: { module: 'S4' } })
+}
+
+function goModelingS4Pilot() {
+  router.push({ path: '/aidop/smart-ops/modeling', query: { module: 'S4', focus: 's4' } })
+}
+
 const currentTime = ref('')
 const logItemsAll = ref([])
 
@@ -252,11 +253,53 @@ const filteredLogItems = computed(() =>
     return true
   })
 )
-const s4LeftCycle = ref('3.0')
-const s4LeftEfficiency = ref('845')
-const s4RightCycle = ref('4.2')
-const s4RightEfficiency = ref('1,022')
-const s4RightTurnover = ref('12.6')
+const s4LeftKpis = ref([])
+const s4RightKpis = ref([])
+
+function formatS4KpiNum(v) {
+  if (v == null || v === '') return '—'
+  const n = Number(v)
+  if (Number.isNaN(n)) return String(v)
+  if (Math.abs(n - Math.round(n)) < 1e-9) return `${Math.round(n)}`
+  return `${Math.round(n * 100) / 100}`
+}
+
+function s4AchievementTagType(level) {
+  const lv = String(level || '')
+  if (lv === 'green') return 'success'
+  if (lv === 'yellow') return 'warning'
+  if (lv === 'red') return 'danger'
+  return 'info'
+}
+
+function s4AchievementTagText(level) {
+  const lv = String(level || '')
+  if (lv === 'green') return '达成'
+  if (lv === 'yellow') return '部分'
+  if (lv === 'red') return '未达'
+  return '—'
+}
+
+function s4ValueClass(level) {
+  const lv = String(level || '')
+  if (lv === 'red') return 'warning'
+  if (lv === 'green') return 'success'
+  return ''
+}
+
+async function loadS4DetailKpiPanels() {
+  const extra = baseQueryToApiParams(detailQuery.value)
+  const [left, right] = await Promise.all([
+    fetchS4DetailKpis(1, 'left', extra),
+    fetchS4DetailKpis(1, 'right', extra),
+  ])
+  s4LeftKpis.value = left
+  s4RightKpis.value = right
+}
+
+function onAidopS4LayoutSaved() {
+  loadS4DetailKpiPanels()
+}
 const trendXAxis = ref(['D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7'])
 
 const detailQuery = ref({
@@ -267,11 +310,13 @@ const detailQuery = ref({
 })
 
 function onDetailQuery() {
+  loadS4DetailKpiPanels()
   ElMessage.success(`已应用采购筛选(${summarizeSmartOpsBaseQuery(detailQuery.value)})`)
 }
 
 function onDetailQueryReset() {
   detailQuery.value = { ...emptySmartOpsBaseQuery(), supplier: '', poNo: '', material: '' }
+  loadS4DetailKpiPanels()
   ElMessage.info('已重置')
 }
 let trendChart = null
@@ -434,7 +479,9 @@ const initCharts = () => {
 }
 
 onMounted(async () => {
+  window.addEventListener(AIDOP_S4_LAYOUT_SAVED, onAidopS4LayoutSaved)
   await loadHomeModuleMetrics()
+  await loadS4DetailKpiPanels()
   const detail = await fetchModuleDetail('S4')
   logItemsAll.value = (detail.alerts ?? []).slice(0, 10).map((x) => ({
     time: x.time ?? '--:--:--',
@@ -444,12 +491,6 @@ onMounted(async () => {
     tagText: String(x.level ?? 'warning').toUpperCase()
   }))
   if ((detail.l2 ?? []).length > 0) {
-    const vals = detail.l2.map((x) => Number(x.metricValue ?? 0))
-    s4LeftCycle.value = (Math.max(vals[0] ?? 30, 1) / 10).toFixed(1)
-    s4LeftEfficiency.value = String(Math.max(1, Math.round((vals[1] ?? 84.5) * 10)))
-    s4RightCycle.value = (Math.max(vals[2] ?? 42, 1) / 10).toFixed(1)
-    s4RightEfficiency.value = String(Math.max(1, Math.round((vals[3] ?? 102.2) * 10)))
-    s4RightTurnover.value = (Math.max(vals[4] ?? 126, 1) / 10).toFixed(1)
     trendXAxis.value = detail.l2.slice(0, 7).map((x, i) => (x.statDate ? String(x.statDate).slice(5, 10) : `D${i + 1}`))
     homeS4.trendMaterialTurnover = detail.l2.slice(0, 7).map((x) => Number((Math.max(Number(x.metricValue ?? 0), 1) / 3).toFixed(1)))
     homeS4.trendCategoryTurnover = homeS4.trendMaterialTurnover.map((v) => Number((v + 1).toFixed(1)))
@@ -458,6 +499,10 @@ onMounted(async () => {
   setInterval(updateTime, 1000)
   initCharts()
 })
+
+onUnmounted(() => {
+  window.removeEventListener(AIDOP_S4_LAYOUT_SAVED, onAidopS4LayoutSaved)
+})
 </script>
 
 <style scoped>
@@ -519,6 +564,19 @@ onMounted(async () => {
   gap: 15px;
 }
 
+.nav-modeling-links {
+  display: flex;
+  align-items: center;
+  gap: 4px;
+  padding-right: 12px;
+  margin-right: 4px;
+  border-right: 1px solid #334155;
+}
+
+.nav-modeling-link {
+  font-size: 13px;
+}
+
 .system-time {
   text-align: right;
   margin-right: 10px;
@@ -617,17 +675,39 @@ onMounted(async () => {
 .metric-row {
   display: flex;
   justify-content: space-between;
-  align-items: center;
+  align-items: flex-start;
+  gap: 12px;
   padding: 15px;
   background: rgba(15, 23, 42, 0.5);
   border-radius: 8px;
   border: 1px solid #1e293b;
 }
 
+.metric-row--empty {
+  opacity: 0.9;
+  font-size: 12px;
+  color: #94a3b8;
+}
+
 .metric-label {
+  display: flex;
+  flex-direction: column;
+  gap: 4px;
+  flex: 1;
+  min-width: 0;
+}
+
+.metric-title {
   font-size: 13px;
   color: #94a3b8;
-  flex: 1;
+  line-height: 1.35;
+}
+
+.metric-formula {
+  font-size: 11px;
+  color: #64748b;
+  line-height: 1.4;
+  font-weight: 400;
 }
 
 .metric-value {

+ 7 - 0
Web/src/views/aidop/kanban/utils/s4LayoutEvents.ts

@@ -0,0 +1,7 @@
+/** 保存 S4 运营布局后广播,供九宫格首页、S4 详情等页自动重新拉数 */
+export const AIDOP_S4_LAYOUT_SAVED = 'aidop-s4-layout-saved'
+
+export function notifyS4LayoutSaved() {
+	if (typeof window === 'undefined') return
+	window.dispatchEvent(new CustomEvent(AIDOP_S4_LAYOUT_SAVED))
+}

+ 1 - 2
Web/src/views/aidop/kanban/utils/smartOpsFilterOptionsCache.ts

@@ -4,11 +4,10 @@ let cache: Promise<SmartOpsFilterOptions> | null = null;
 
 /** 智慧运营基础查询下拉选项(多页共用一次请求) */
 export function loadSmartOpsFilterOptions(
-	tenantId = 1,
 	factoryId = 1
 ): Promise<SmartOpsFilterOptions> {
 	if (!cache) {
-		cache = fetchSmartOpsFilterOptions(tenantId, factoryId);
+		cache = fetchSmartOpsFilterOptions(factoryId);
 	}
 	return cache;
 }

+ 7 - 3
Web/src/views/dashboard/data/homeModulesSync.ts

@@ -57,6 +57,7 @@ export const homeS4 = reactive({
       label: '物料交货周期',
       value: '3.1',
       unit: '天',
+      targetDisplay: '3 天',
       trend: '+0.3',
       trendArrow: 'up',
       trendTone: 'good'
@@ -64,8 +65,9 @@ export const homeS4 = reactive({
     {
       key: 'deliverySat',
       label: '物料交货满足率',
-      value: '93.8',
+      value: '99',
       unit: '%',
+      targetDisplay: '99.5%',
       trend: '-0.5',
       trendArrow: 'down',
       trendTone: 'bad'
@@ -75,6 +77,7 @@ export const homeS4 = reactive({
       label: '物料采购人效',
       value: '852',
       unit: '',
+      targetDisplay: '850',
       trend: '+1%',
       trendArrow: 'up',
       trendTone: 'good'
@@ -84,9 +87,10 @@ export const homeS4 = reactive({
       label: '采购在途周转',
       value: '8.5',
       unit: '天',
-      trend: '-0.4',
+      targetDisplay: '6 天',
+      trend: '-0.5',
       trendArrow: 'down',
-      trendTone: 'good'
+      trendTone: 'bad'
     }
   ]
 });

+ 139 - 14
Web/src/views/dashboard/home.vue

@@ -219,22 +219,37 @@
           <el-icon class="dash-card__module-icon" :size="22"><ShoppingCart /></el-icon>
         </header>
         <div class="dash-card__body s4-body">
-          <div class="s4-kpi-grid">
+          <div
+            class="s4-kpi-grid"
+            :class="{ 's4-kpi-grid--dense': s4GridCells.length > 4 }"
+          >
             <div
-              v-for="cell in homeS4.homeGridKpis"
+              v-for="cell in s4GridCells"
               :key="cell.key"
               class="s4-kpi-cell"
             >
-              <div class="s4-kpi-label">{{ cell.label }}</div>
-              <div class="s4-kpi-row">
-                <span class="s4-kpi-value">{{ cell.value }}</span>
-                <span v-if="cell.unit" class="s4-kpi-unit">{{ cell.unit }}</span>
+              <el-tooltip v-if="cell.formulaText" placement="top" :show-after="200" :content="cell.formulaText">
+                <div class="s4-kpi-label s4-kpi-label--formula">{{ cell.label }}</div>
+              </el-tooltip>
+              <div v-else class="s4-kpi-label">{{ cell.label }}</div>
+              <div class="s4-kpi-body">
+                <div class="s4-kpi-main">
+                  <div class="s4-kpi-value-row">
+                    <span class="s4-kpi-value">{{ cell.value }}</span>
+                    <span v-if="cell.unit" class="s4-kpi-unit">{{ cell.unit }}</span>
+                  </div>
+                  <div v-if="cell.targetDisplay" class="s4-kpi-target">目标: {{ cell.targetDisplay }}</div>
+                </div>
                 <span
                   class="s4-kpi-trend"
-                  :class="cell.trendTone === 'bad' ? 's4-kpi-trend--bad' : 's4-kpi-trend--good'"
+                  :class="{
+                    's4-kpi-trend--good': cell.trendTone === 'good',
+                    's4-kpi-trend--warn': cell.trendTone === 'warn',
+                    's4-kpi-trend--bad': cell.trendTone === 'bad',
+                  }"
                 >
                   <span class="s4-kpi-trend__arrow" aria-hidden="true">{{
-                    cell.trendArrow === 'up' ? '▲' : '▼'
+                    cell.trendArrow === 'up' ? '▲' : cell.trendArrow === 'down' ? '▼' : '—'
                   }}</span>
                   {{ cell.trend }}
                 </span>
@@ -507,7 +522,7 @@ import {
 } from '@element-plus/icons-vue'
 import * as echarts from 'echarts'
 import { s2HomeKpiList, loadS2Kpis } from './data/s2Kpis'
-import { fetchHomeL1, fetchS8Alerts } from '../aidop/api/kanbanData'
+import { fetchHomeL1, fetchS8Alerts, fetchS4HomeGrid } from '../aidop/api/kanbanData'
 import { loadSmartOpsFilterOptions } from '../aidop/kanban/utils/smartOpsFilterOptionsCache'
 import DetailQueryBar from '../aidop/kanban/components/DetailQueryBar.vue'
 import {
@@ -525,6 +540,7 @@ import {
   homeS7
   ,loadHomeModuleMetrics
 } from './data/homeModulesSync'
+import { AIDOP_S4_LAYOUT_SAVED } from '../aidop/kanban/utils/s4LayoutEvents'
 
 const router = useRouter()
 const gridMainRef = ref(null)
@@ -571,6 +587,63 @@ const displayS8Alarms = computed(() => {
   )
 })
 
+const s4HomeApiItems = ref(null)
+
+function fmtS4HomeValue(v, unit) {
+  if (v == null || v === '') return '—'
+  const n = Number(v)
+  if (Number.isNaN(n)) return String(v)
+  if (unit === '%') return `${Math.round(n * 10) / 10}`
+  if (unit === '天') return `${Math.round(n * 10) / 10}`
+  if (Math.abs(n - Math.round(n)) < 1e-9) return `${Math.round(n)}`
+  return `${Math.round(n * 100) / 100}`
+}
+
+/** 目标行文案(与主值同单位规则),无目标时返回空串 */
+function fmtS4TargetDisplay(v, unit) {
+  if (v == null || v === '') return ''
+  const n = Number(v)
+  if (Number.isNaN(n)) return String(v)
+  const num =
+    unit === '%'
+      ? `${Math.round(n * 10) / 10}`
+      : unit === '天'
+        ? `${Math.round(n * 10) / 10}`
+        : Math.abs(n - Math.round(n)) < 1e-9
+          ? `${Math.round(n)}`
+          : `${Math.round(n * 100) / 100}`
+  if (unit === '%') return `${num}%`
+  if (unit === '天') return `${num} 天`
+  if (unit) return `${num} ${unit}`
+  return `${num}`
+}
+
+function mapS4ApiItemToGridCell(item) {
+  const arrow = item.gapArrow
+  const trendArrow = arrow === 'up' ? 'up' : arrow === 'down' ? 'down' : 'flat'
+  const lv = String(item.achievementLevel || 'green')
+  const trendTone = lv === 'red' ? 'bad' : lv === 'yellow' ? 'warn' : 'good'
+  const unit = item.unit ?? ''
+  const ft = item.formulaText != null && String(item.formulaText).trim() ? String(item.formulaText).trim() : ''
+  return {
+    key: item.rowId || item.metricCode,
+    label: item.displayName || item.metricCode,
+    formulaText: ft,
+    value: fmtS4HomeValue(item.currentValue, unit),
+    unit,
+    targetDisplay: fmtS4TargetDisplay(item.targetValue, unit),
+    trend: item.gapLabel || '—',
+    trendArrow,
+    trendTone,
+  }
+}
+
+const s4GridCells = computed(() => {
+  const api = s4HomeApiItems.value
+  if (api && api.length > 0) return api.map(mapS4ApiItemToGridCell)
+  return homeS4.homeGridKpis
+})
+
 function onDashboardQuery() {
   loadKanbanData()
   ElMessage.success(
@@ -587,7 +660,7 @@ function onDashboardReset() {
 async function loadKanbanData() {
   const extra = baseQueryToApiParams(dashboardBaseQuery.value)
   try {
-    const l1 = await fetchHomeL1(1, 1, extra)
+    const l1 = await fetchHomeL1(1, extra)
     const byModule = Object.fromEntries(l1.map((x) => [x.moduleCode, x]))
     if (byModule.S1) {
       homeS1.reviewSatisfactionPct = Number(byModule.S1.metricValue || homeS1.reviewSatisfactionPct)
@@ -616,9 +689,17 @@ async function loadKanbanData() {
   } catch {}
 
   try {
-    const alerts = await fetchS8Alerts(1, 1, extra)
+    const alerts = await fetchS8Alerts(1, extra)
     if (alerts?.length) s8TopAlarmsAll.value = alerts
   } catch {}
+
+  try {
+    const s4grid = await fetchS4HomeGrid(1, extra)
+    s4HomeApiItems.value =
+      s4grid?.items && s4grid.items.length > 0 ? s4grid.items : null
+  } catch {
+    s4HomeApiItems.value = null
+  }
 }
 
 let chartS8 = null
@@ -721,6 +802,10 @@ function onResize() {
   chartS8?.resize()
 }
 
+function onAidopS4LayoutSaved() {
+  loadKanbanData()
+}
+
 onMounted(async () => {
   filterOptionsLoading.value = true
   try {
@@ -734,6 +819,7 @@ onMounted(async () => {
   await loadHomeModuleMetrics()
   await loadS2Kpis()
   loadKanbanData()
+  window.addEventListener(AIDOP_S4_LAYOUT_SAVED, onAidopS4LayoutSaved)
   tickHeaderClock()
   headerClockTimer = window.setInterval(tickHeaderClock, 1000)
   nextTick(() => {
@@ -748,6 +834,7 @@ onMounted(async () => {
 })
 
 onUnmounted(() => {
+  window.removeEventListener(AIDOP_S4_LAYOUT_SAVED, onAidopS4LayoutSaved)
   if (headerClockTimer != null) {
     clearInterval(headerClockTimer)
     headerClockTimer = null
@@ -1635,6 +1722,11 @@ onUnmounted(() => {
   align-content: stretch;
 }
 
+.s4-kpi-grid--dense {
+  grid-template-columns: repeat(4, minmax(0, 1fr));
+  grid-template-rows: repeat(2, minmax(0, 1fr));
+}
+
 .s4-kpi-cell {
   display: flex;
   flex-direction: column;
@@ -1655,12 +1747,41 @@ onUnmounted(() => {
   font-weight: 500;
 }
 
-.s4-kpi-row {
+.s4-kpi-label--formula {
+  cursor: help;
+  border-bottom: 1px dashed rgba(148, 163, 184, 0.55);
+}
+
+.s4-kpi-body {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 8px;
+  width: 100%;
+  min-width: 0;
+}
+
+.s4-kpi-main {
+  flex: 1;
+  min-width: 0;
+  display: flex;
+  flex-direction: column;
+  align-items: flex-start;
+  gap: 3px;
+}
+
+.s4-kpi-value-row {
   display: flex;
   flex-wrap: wrap;
   align-items: baseline;
   gap: 4px 6px;
-  width: 100%;
+}
+
+.s4-kpi-target {
+  font-size: 11px;
+  font-weight: 500;
+  color: #94a3b8;
+  line-height: 1.3;
 }
 
 .s4-kpi-value {
@@ -1683,8 +1804,8 @@ onUnmounted(() => {
   gap: 2px;
   font-size: 11px;
   font-weight: 700;
-  margin-left: auto;
   flex-shrink: 0;
+  align-self: center;
 }
 
 .s4-kpi-trend__arrow {
@@ -1697,6 +1818,10 @@ onUnmounted(() => {
   color: #4ade80;
 }
 
+.s4-kpi-trend--warn {
+  color: #facc15;
+}
+
 .s4-kpi-trend--bad {
   color: #fb923c;
 }

+ 50 - 0
ai-dop-platform/docs/db/V2__smart_ops_s4_metric_model_tables.sql

@@ -0,0 +1,50 @@
+-- 智慧运营 · 指标模型 S4 试点(Catalog / 布局 / 模块呈现)
+-- 与 Admin.NET.Plugin.AiDOP 中 AdoSmartOps* 实体、SqlSugar CodeFirst 对齐。
+-- 若已随应用启动执行过 InitTables,可跳过本脚本;生产环境可用手工执行作兜底。
+-- 执行前请确认库名,并与实际库中列名核对(SHOW CREATE TABLE ado_smart_ops_metric_catalog;)。
+
+use aidopdev;
+
+CREATE TABLE IF NOT EXISTS `ado_smart_ops_metric_catalog` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `metric_code` varchar(64) NOT NULL COMMENT '指标编码',
+  `module_code` varchar(8) NOT NULL COMMENT '模块 S1-S9',
+  `metric_level` int NOT NULL COMMENT '1=L1 2=L2',
+  `default_name` varchar(256) NOT NULL COMMENT '默认中文名',
+  `unit` varchar(32) DEFAULT NULL COMMENT '单位',
+  `direction` varchar(32) NOT NULL DEFAULT 'higher_is_better' COMMENT 'higher_is_better|lower_is_better',
+  `sort_hint` int NOT NULL DEFAULT '0' COMMENT '排序提示',
+  `is_active` int NOT NULL DEFAULT '1' COMMENT '启用 0/1',
+  PRIMARY KEY (`id`),
+  KEY `idx_mod_lvl` (`module_code`,`metric_level`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='智慧运营指标字典';
+
+CREATE TABLE IF NOT EXISTS `ado_smart_ops_layout_item` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `tenant_id` bigint NOT NULL COMMENT '租户',
+  `factory_id` bigint NOT NULL COMMENT '工厂',
+  `module_code` varchar(8) NOT NULL COMMENT '模块',
+  `row_id` varchar(96) NOT NULL COMMENT '稳定行键 如 S4-L1-xxx',
+  `metric_level` int NOT NULL COMMENT '1=L1 2=L2',
+  `metric_code` varchar(64) NOT NULL COMMENT '指标编码',
+  `display_name` varchar(256) DEFAULT NULL COMMENT '展示名覆盖',
+  `sort_no` int NOT NULL COMMENT '排序',
+  `parent_row_id` varchar(96) DEFAULT NULL COMMENT 'L2 父行 RowId',
+  `formula_text` text COMMENT '公式说明',
+  `panel_zone` varchar(16) DEFAULT NULL COMMENT 'S4 详情 left|right',
+  `is_enabled` int NOT NULL DEFAULT '1' COMMENT '启用 0/1',
+  `update_time` datetime(3) NOT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`),
+  KEY `idx_tf_mod` (`tenant_id`,`factory_id`,`module_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='智慧运营布局行';
+
+CREATE TABLE IF NOT EXISTS `ado_smart_ops_home_module` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `tenant_id` bigint NOT NULL COMMENT '租户',
+  `factory_id` bigint NOT NULL COMMENT '工厂',
+  `module_code` varchar(8) NOT NULL COMMENT '模块',
+  `layout_pattern` varchar(32) NOT NULL DEFAULT 'card_grid' COMMENT 'card_grid|table_list',
+  `update_time` datetime(3) NOT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`),
+  KEY `idx_tf_mod` (`tenant_id`,`factory_id`,`module_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='九宫格模块呈现';

+ 33 - 0
ai-dop-platform/docs/db/smart_ops_data_model/04_试点_S4竖切方案.txt

@@ -0,0 +1,33 @@
+指标模型总方案 — S4 竖切试点(已确认范围,实施依据)
+
+一、与总方案关系
+  · 本文件为「指标模型总方案」在 S4 上的端到端试点;对话中说「S4 试点」「指标模型方案 S4」即指本文。
+
+二、已确认范围(2026-04 对齐)
+  1)九宫格「S4 采购执行」模块区域
+     · 呈现:卡片式(layout_pattern = card_grid),与现设计一致。
+     · 指标条数、顺序、名称、当前值/目标/期量差及绿黄红由「布局配置 + 合并接口 + 中间表」驱动。
+  2)「S4 采购执行看板」详情页
+     · 第一轮:仅打通与指标相关的主 KPI 区(数据驱动);图表/趋势区第二轮再接。
+  3)运营指标建模(S0)
+     · S4 模块:从后台指标目录(Catalog)勾选 L1、勾选 L2;保存至服务端。
+     · 目录第一期:库表种子 + API,不做完整「指标管理后台」独立页。
+  4)L1 数量上限(产品约束)
+     · 同一模块(本试点为 S4)在运营指标建模中,**L1 最多勾选 8 个**;保存时后端须校验,前端须限制勾选数量。
+
+三、本轮不做
+  · S1–S3、S5–S7、S8、S9 保持现状。
+  · 公式可执行引擎(改公式即改中间表数值)不在本试点一次完成;公式字段为说明文案 + 持久化。
+  · S4 详情页图表区:第二轮。
+
+四、实施顺序(与总方案一致,可照此排期)
+  1. 库表/种子:metric catalog(或扩展 kpi_def)、layout_item、home_module(S4 卡片);L1≤8 校验。
+  2. 只读 API:catalog(可按 moduleCode=S4 过滤)、operation-layout(S4 L1/L2)。
+  3. 合并 API:home-s4-grid(九宫格)、module-s4-detail-kpis(详情主 KPI);合并 L1/L2 日表 + 期量差三色(见 03 文档)。
+  4. 中间表演示数据:S4 多 metric_code 与 catalog 一致。
+  5. 前端:九宫格仅 S4 格 v-for;详情仅主 KPI 区 v-for。
+  6. S0:S4 勾选目录、排序、改名、公式说明、L2 挂父 L1;PUT 保存;L1≤8。
+  7. 联调:保存后刷新即变,无需发版。
+
+五、勾选交互补充(与总方案一致)
+  · L1/L2 分栏或 Tab;L2 须挂在已选 L1 下;同层级 metric_code 不重复。

+ 6 - 0
ai-dop-platform/docs/db/smart_ops_data_model/README.txt

@@ -1,10 +1,16 @@
 智慧运营看板 · 指标建模与中间表 — 数据表汇总(逻辑结构)
 
+【方案正式名称】指标模型总方案(简称「指标模型方案」)
+  · 内涵:租户可配的 L1/L2 指标与布局、metric_code 贯通、分层中间表出数、接口合并、
+    卡片式/列表式 layout_pattern、当前值/目标值/期量差与绿黄红三档等(见 03 文档)。
+  · 后续对话中可直接说「指标模型总方案」「指标模型方案」「按指标模型方案」即指本目录及关联实现约定。
+
 本目录文件(可用 Excel 直接打开 CSV):
   1) 00_表清单与分层角色.csv     — 每张表的用途、现状/规划、与其它表关系
   2) 01_字段明细_逻辑结构.csv   — 按表列出字段逻辑名、类型建议、说明、主键/索引建议
   3) 02_表间关系说明.txt        — 文字描述数据流与关联键
   4) 03_指标呈现与期量差约定.txt — 方案约定:当前值/目标值/期量差 + 绿黄红三档;九宫格单模块「卡片式 / 列表式」均由动态建模 + layout_pattern 驱动(详见该文件第五节)
+  5) 04_试点_S4竖切方案.txt — S4 端到端试点已确认范围(卡片、Catalog+勾选、详情先 KPI、L1 最多 8 个等)
 
 说明:
   · 「现状」以仓库内 AidopKanban 接口与 ai-dop-platform/docs/db 迁移脚本为准;

+ 62 - 0
docker-compose.yml

@@ -0,0 +1,62 @@
+# 企业运营 / Admin.NET 一体化编排(前后端 + 反代)
+#
+# 1. 数据库连接:默认使用镜像内打包的 Configuration(多为开发库)。
+#    生产请通过挂载覆盖,例如:
+#      volumes:
+#        - ./docker/overrides/Database.json:/app/Configuration/Database.json:ro
+#    或按 Furion 文档使用环境变量覆盖连接串。
+#
+# 2. 启动:
+#      docker compose up -d --build
+#
+# 3. 端口(固定与历史布局对齐,可被环境变量覆盖):
+#    - 9100:前端 HTTP(Nginx 80 → 静态 + /prod-api → api)
+#    - 9102:后端 API 直连(Kestrel 5005)
+#    - 9103:前端 HTTPS(Nginx 443,镜像内自签证书;浏览器会提示不受信任属正常)
+#    环境变量:WEB_PORT、WEB_HTTPS_PORT、API_HTTP_PORT(默认分别为 9100、9103、9102)
+
+services:
+  api:
+    build:
+      context: .
+      dockerfile: docker/Dockerfile.api
+    image: aidop-api:latest
+    container_name: aidop-api
+    restart: unless-stopped
+    environment:
+      ASPNETCORE_ENVIRONMENT: Production
+      ASPNETCORE_URLS: http://0.0.0.0:5005
+      TZ: Asia/Shanghai
+      # 见 Admin.NET.Core SqlSugarSetup:对已有库跳过 CodeFirst/种子,避免 “Multiple primary key” 等启动失败
+      DOCKER_SKIP_DBINIT: "1"
+    # 日志与上传持久化(按需调整宿主机路径)
+    volumes:
+      - aidop-api-logs:/app/logs
+      - aidop-api-www-upload:/app/wwwroot/upload
+    ports:
+      - "${API_HTTP_PORT:-9102}:5005"
+    networks:
+      - aidop-net
+
+  web:
+    build:
+      context: .
+      dockerfile: docker/Dockerfile.web
+    image: aidop-web:latest
+    container_name: aidop-web
+    restart: unless-stopped
+    depends_on:
+      - api
+    ports:
+      - "${WEB_PORT:-9100}:80"
+      - "${WEB_HTTPS_PORT:-9103}:443"
+    networks:
+      - aidop-net
+
+networks:
+  aidop-net:
+    driver: bridge
+
+volumes:
+  aidop-api-logs:
+  aidop-api-www-upload:

+ 50 - 0
docker/Dockerfile.api

@@ -0,0 +1,50 @@
+# 后端:.NET 10,在镜像内编译(宿主机无需安装 SDK)
+# 构建:在仓库根目录执行
+#   docker build -f docker/Dockerfile.api -t aidop-api:latest .
+#
+# ★ 优化要点:先拷项目文件做 restore,再拷源码做 publish。
+#   这样只改 .cs 时 restore 层走缓存,构建从 ~8min 降到 ~1min。
+
+FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
+WORKDIR /src/server
+
+# ── 第一步:只拷 sln + 所有 csproj → restore(此层只在依赖变更时失效) ──
+COPY server/Admin.NET.sln ./
+COPY server/Admin.NET.Core/Admin.NET.Core.csproj                                       Admin.NET.Core/
+COPY server/Admin.NET.Application/Admin.NET.Application.csproj                         Admin.NET.Application/
+COPY server/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj                               Admin.NET.Web.Core/
+COPY server/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj                             Admin.NET.Web.Entry/
+COPY server/Admin.NET.Test/Admin.NET.Test.csproj                                       Admin.NET.Test/
+COPY server/Plugins/Admin.NET.Plugin.AiDOP/Admin.NET.Plugin.AiDOP.csproj               Plugins/Admin.NET.Plugin.AiDOP/
+COPY server/Plugins/Admin.NET.Plugin.AiDOP.Tests/Admin.NET.Plugin.AiDOP.Tests.csproj   Plugins/Admin.NET.Plugin.AiDOP.Tests/
+COPY server/Plugins/Admin.NET.Plugin.ApprovalFlow/Admin.NET.Plugin.ApprovalFlow.csproj Plugins/Admin.NET.Plugin.ApprovalFlow/
+COPY server/Plugins/Admin.NET.Plugin.DingTalk/Admin.NET.Plugin.DingTalk.csproj         Plugins/Admin.NET.Plugin.DingTalk/
+COPY server/Plugins/Admin.NET.Plugin.GoView/Admin.NET.Plugin.GoView.csproj             Plugins/Admin.NET.Plugin.GoView/
+COPY server/Plugins/Admin.NET.Plugin.K3Cloud/Admin.NET.Plugin.K3Cloud.csproj           Plugins/Admin.NET.Plugin.K3Cloud/
+COPY server/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj             Plugins/Admin.NET.Plugin.ReZero/
+COPY server/Plugins/Admin.NET.Plugin.WorkWeixin/Admin.NET.Plugin.WorkWeixin.csproj     Plugins/Admin.NET.Plugin.WorkWeixin/
+
+RUN dotnet restore Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj
+
+# ── 第二步:拷全部源码 → publish(只有这层在改 .cs 时重建) ──
+COPY server/ .
+RUN dotnet publish Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj \
+    -c Release -f net10.0 \
+    -o /app/publish \
+    --no-restore
+
+# ── 运行阶段 ──
+FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final
+WORKDIR /app
+ENV LANG=zh-Hans.UTF-8 \
+    DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false \
+    TZ=Asia/Shanghai \
+    ASPNETCORE_URLS=http://0.0.0.0:5005
+
+RUN apt-get update \
+    && apt-get install -y --no-install-recommends tzdata \
+    && rm -rf /var/lib/apt/lists/*
+
+COPY --from=build /app/publish .
+EXPOSE 5005
+ENTRYPOINT ["dotnet", "Admin.NET.Web.Entry.dll"]

+ 34 - 0
docker/Dockerfile.web

@@ -0,0 +1,34 @@
+# 前端:Node 22 构建 + Nginx;与 .env.production 中 VITE_API_URL=/prod-api 配套
+# 构建:在仓库根目录执行
+#   docker build -f docker/Dockerfile.web -t aidop-web:latest .
+#
+# ★ 优化要点:先拷 package*.json 做 install,再拷源码做 build。
+#   这样只改 .vue/.ts 时 install 层走缓存,构建从 ~4min 降到 ~40s。
+
+FROM node:22-bookworm-slim AS build
+WORKDIR /web
+
+# ── 第一步:只拷依赖声明 → install(此层只在依赖变更时失效) ──
+COPY Web/package.json Web/package-lock.json ./
+
+# 去掉 prepare(git hooks),保留 @vue-office/* 等依赖的 postinstall
+RUN node -e "\
+  const fs = require('fs');\
+  const p = JSON.parse(fs.readFileSync('package.json', 'utf8'));\
+  delete p.scripts.prepare;\
+  fs.writeFileSync('package.json', JSON.stringify(p, null, '\t'));\
+"
+RUN npm config set registry https://registry.npmmirror.com && \
+    npm install --legacy-peer-deps
+
+# ── 第二步:拷全部源码 → build(只有这层在改代码时重建) ──
+COPY Web/ .
+RUN npm run build
+
+# ── 运行阶段 ──
+FROM nginx:1.27-alpine AS final
+COPY docker/nginx/ssl/default.crt /etc/nginx/ssl/default.crt
+COPY docker/nginx/ssl/default.key /etc/nginx/ssl/default.key
+COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf
+COPY --from=build /web/dist /usr/share/nginx/html
+EXPOSE 80 443

+ 60 - 0
docker/nginx/default.conf

@@ -0,0 +1,60 @@
+# HTTP:宿主机通常映射 9100 -> 80
+server {
+    listen 80;
+    server_name _;
+    root /usr/share/nginx/html;
+    index index.html;
+
+    gzip on;
+    gzip_types text/plain text/css application/json application/javascript application/xml image/svg+xml;
+
+    location / {
+        try_files $uri $uri/ /index.html;
+    }
+
+    # 与 Web/.env.production 中 VITE_API_URL=/prod-api 一致
+    location /prod-api/ {
+        proxy_pass http://api:5005/;
+        proxy_http_version 1.1;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
+        proxy_connect_timeout 60s;
+        proxy_send_timeout 120s;
+        proxy_read_timeout 120s;
+        client_max_body_size 100m;
+    }
+}
+
+# HTTPS:宿主机通常映射 9103 -> 443(镜像内自签证书,仅供联调;生产请挂载正式证书)
+server {
+    listen 443 ssl;
+    server_name _;
+    root /usr/share/nginx/html;
+    index index.html;
+
+    ssl_certificate     /etc/nginx/ssl/default.crt;
+    ssl_certificate_key /etc/nginx/ssl/default.key;
+    ssl_protocols       TLSv1.2 TLSv1.3;
+
+    gzip on;
+    gzip_types text/plain text/css application/json application/javascript application/xml image/svg+xml;
+
+    location / {
+        try_files $uri $uri/ /index.html;
+    }
+
+    location /prod-api/ {
+        proxy_pass http://api:5005/;
+        proxy_http_version 1.1;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
+        proxy_connect_timeout 60s;
+        proxy_send_timeout 120s;
+        proxy_read_timeout 120s;
+        client_max_body_size 100m;
+    }
+}

+ 20 - 0
docker/nginx/ssl/default.crt

@@ -0,0 +1,20 @@
+-----BEGIN CERTIFICATE-----
+MIIDOzCCAiOgAwIBAgIJAJTJ5HfeQ+FMMA0GCSqGSIb3DQEBCwUAMDQxFTATBgNV
+BAMMDGFpZG9wLWRvY2tlcjEOMAwGA1UECgwFYWlkb3AxCzAJBgNVBAYTAkNOMB4X
+DTI2MDQwNzE2MzMxM1oXDTM2MDQwNDE2MzMxM1owNDEVMBMGA1UEAwwMYWlkb3At
+ZG9ja2VyMQ4wDAYDVQQKDAVhaWRvcDELMAkGA1UEBhMCQ04wggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQDh+rhvDFAW6fkZXv9on9hVHb9cLI1xay87vPcc
+nsg/5+RDNW4JM1Bx3zwR60/Oz58Gfy+xaKFAgNPOAXCKOc6FXnTwPz8yhHN32dgy
+ZboMkOxlMJEIcDFDFWfrbC5LV8kglN9U4G39/vF88eO28QyNZjzwwhX/G2/khuIE
+/4CJnH3+4ivO1zBbezYsrkuSoPJBkni3UHT7i3Z7QQcrv8VpNjmww7DMGjMsqsuS
+AwAi1h48OAxbyiSE5jSIpo+ieqngpusOAACB9mY9lwgcrYlUQjXSoVlPPq4Af935
+1NBZoDs0hkxWzwm7M/I/t3XYY8cEBj/xfDvM9eadzmXpMqINAgMBAAGjUDBOMB0G
+A1UdDgQWBBQMDF8dYDq0tE7nPb22rVtgFpYNADAfBgNVHSMEGDAWgBQMDF8dYDq0
+tE7nPb22rVtgFpYNADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBp
+4eBZCUMM7gOgxuNBFskC8bMgv9FV3adrkUuU4kRhsyDH1cWCyFhmowl2Lxa7cuP6
+mVN0fb5xbu2p5AaLylogg5+ska59sh4BdYGyKc3CcVF723s1j22LrdW5CtuKMxRj
+hY47rodHscksRGy5G/esyKc4cRmQsqg5mKwp/7N1YJNqizttOBX3RqobAizqhLbA
+GERorU0k7iLx1KOCg15QMRYV+nDBNiGUyJmubO1Sv+V83JVv29TedDqeZGhZKSHF
+A5BcQmAvun+NocGEFdZ5gNtE8wt1AjzN2pS9DSCwk/FMuzf3M4ohmafDylOLiLYF
+s84skuEXb9UC6H/ottIw
+-----END CERTIFICATE-----

+ 28 - 0
docker/nginx/ssl/default.key

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDh+rhvDFAW6fkZ
+Xv9on9hVHb9cLI1xay87vPccnsg/5+RDNW4JM1Bx3zwR60/Oz58Gfy+xaKFAgNPO
+AXCKOc6FXnTwPz8yhHN32dgyZboMkOxlMJEIcDFDFWfrbC5LV8kglN9U4G39/vF8
+8eO28QyNZjzwwhX/G2/khuIE/4CJnH3+4ivO1zBbezYsrkuSoPJBkni3UHT7i3Z7
+QQcrv8VpNjmww7DMGjMsqsuSAwAi1h48OAxbyiSE5jSIpo+ieqngpusOAACB9mY9
+lwgcrYlUQjXSoVlPPq4Af9351NBZoDs0hkxWzwm7M/I/t3XYY8cEBj/xfDvM9ead
+zmXpMqINAgMBAAECggEBALevS7GASa2Ge+OCk4tgusDdEEoFMOerX1ZokFjkPBOu
+E54J1SqHWnFlKnfKVTHfE/187rB/QuuijAfcpbTFrjg8gkMytdUDUrRuD81PYP6L
+4ouSAaHhSDmmMbVsVukJL0RbnnlogB/A1lxgZl+y6igZnZl5udWGYNpaRWgYo0u2
+sJaqzZMOzgc9QKjh4xhXO8vUrTiUsKlX4mJORCrbzesFgWDQYV746hIxCVx5r+b5
+5/09XSzOBUGDAw4LeMkz2UEk4p/mPKczJ4zGDHJkKeZ3MSGpdVMaETMorl46LKJU
+7MiODKTMAY6gTTkI8WVfCRzYCDeWTY1LlE6nanvRPYUCgYEA9lvxkGOHjl4i/lkP
+BIvzqazKFCutIgnndpzxVtOzS73qIavtszIVXtfOzQFbtyWKtso6wOQQAVw7xfKg
++Am3WuTsPvA/dvDB2N9iIiB7k5YcKZ0q9o7UqS0ckjo3Q1yEptK+tU5fN1df/egQ
+bB48P4jr2938fWamEw630vnHDDMCgYEA6tKcFbLiVB+/JS9dE0wd0ORmZD3Q9jbu
+IJ9g7J//oYSkxRsmSDAbREIy2TQnm5DitEvGAk0l/U/jTcD3lG5v0rq1YeivMPWK
+7L2YYhkBtwbFSd2X/dJFGcR8eYvlEFQdlATr6O0b49m8A3u3xOKcXuNurSSA6mgY
+FUn+jgmFWL8CgYBZmBJ/6lJwKjgbvBPEGYmh2V8ces3aJTPyZR038IGyN/0gBcDK
+fJpdBasFz0qljpel5mH7qHVRqVNrp9N2oUH3Ym2wbfsGrIQy9PphYuLOR7cyQyBO
+zp70b52GaHmUm976NIZ6tWfXXoVgd7cROuW6TXdJXK/ogx4+rAmaRpBnFQKBgGzp
+GbOGsCpMPx9EBGs61mlYRZUghpZri65dvVqCKtIC71jr6ql4hmz2Nxc+dVBVto/g
+xQm0NnZyYv5hDXMudXbLWez7OqX+fFyo4tA8wOrenQpRWHlE2P/GfeTx2V/lY4KP
+dcsmjdTz25vR+b27TMNFwMNVNuWBOgpFs2a1S7+JAoGBAKL05EGA+juw4b7h/+cp
+hPZpcMtINMi9ajph73zF4VzzXFf6z8ijqHc9uL3WqPS9Pl+BZM7AX7M28U+r0v5+
+nDLT/xJ4fSObjtIJHj09oQrzYBBWdMLPsgXX9TdwjB3WupJ4gKYBN4YPbpBOeMF7
+P1Bw379meeqB6nOk0kfVYaB+
+-----END PRIVATE KEY-----

BIN
docs/db/aidopdev_表结构汇总.xlsx


+ 172 - 0
docs/db/gen_table_excel.py

@@ -0,0 +1,172 @@
+#!/usr/bin/env python3
+"""从 aidopdev 数据库导出全部表结构到 Excel,按业务分类分 Sheet。"""
+
+import pymysql
+from openpyxl import Workbook
+from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
+from collections import OrderedDict
+
+DB_CFG = dict(
+    host="123.60.180.165", port=3306,
+    user="aidopremote", password="1234567890aiDOP#",
+    database="information_schema", charset="utf8mb4",
+)
+
+CATEGORY_ORDER = OrderedDict([
+    ("系统基础(Sys)", lambda t: t.startswith("Sys")),
+    ("审批流程(Approval)", lambda t: t.startswith("Approval")),
+    ("钉钉集成(DingTalk)", lambda t: t.startswith("DingTalk") or t.startswith("ding_talk")),
+    ("GoView可视化", lambda t: t.startswith("GoView")),
+    ("S0 基础主数据", lambda t: t.startswith("ado_s0_")),
+    ("S1 产销协同", lambda t: t.startswith("ado_s1_")),
+    ("S2 生产计划", lambda t: t.startswith("ado_s2_")),
+    ("S3 物料计划", lambda t: t.startswith("ado_s3_")),
+    ("S4 采购", lambda t: t.startswith("ado_s4_")),
+    ("S5 仓储来料", lambda t: t.startswith("ado_s5_")),
+    ("S6 生产执行", lambda t: t.startswith("ado_s6_")),
+    ("S7 成品管理", lambda t: t.startswith("ado_s7_")),
+    ("S8 预警异常", lambda t: t.startswith("ado_s8_")),
+    ("S9 管理看板KPI", lambda t: t.startswith("ado_s9_")),
+    ("智慧运营(SmartOps)", lambda t: t.startswith("ado_smart_ops_")),
+    ("主数据(MD)", lambda t: t.startswith("ado_md_")),
+    ("集成(Intg)", lambda t: t.startswith("ado_intg_")),
+    ("移动端(Mobile)", lambda t: t.startswith("ado_mobile_")),
+    ("Demo表", lambda t: t in ("ado_orders", "ado_plans", "ado_work_orders")),
+    ("其他", lambda t: True),
+])
+
+HEADER_FILL = PatternFill("solid", fgColor="4472C4")
+HEADER_FONT = Font(name="微软雅黑", bold=True, color="FFFFFF", size=10)
+BODY_FONT = Font(name="微软雅黑", size=9)
+TBL_FILL = PatternFill("solid", fgColor="D9E2F3")
+TBL_FONT = Font(name="微软雅黑", bold=True, size=10)
+THIN_BORDER = Border(
+    left=Side(style="thin"), right=Side(style="thin"),
+    top=Side(style="thin"), bottom=Side(style="thin"),
+)
+WRAP = Alignment(wrap_text=True, vertical="center")
+
+
+def fetch_data():
+    conn = pymysql.connect(**DB_CFG)
+    cur = conn.cursor()
+    cur.execute(
+        "SELECT TABLE_NAME, TABLE_COMMENT, TABLE_ROWS "
+        "FROM TABLES WHERE TABLE_SCHEMA='aidopdev' ORDER BY TABLE_NAME"
+    )
+    tables = {r[0]: {"comment": r[1] or "", "rows": r[2]} for r in cur.fetchall()}
+
+    cur.execute(
+        "SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, "
+        "COLUMN_DEFAULT, COLUMN_COMMENT "
+        "FROM COLUMNS WHERE TABLE_SCHEMA='aidopdev' "
+        "ORDER BY TABLE_NAME, ORDINAL_POSITION"
+    )
+    columns = {}
+    for row in cur.fetchall():
+        columns.setdefault(row[0], []).append(row[1:])
+    cur.close()
+    conn.close()
+    return tables, columns
+
+
+def classify(tables):
+    result = OrderedDict((k, []) for k in CATEGORY_ORDER)
+    assigned = set()
+    for cat, pred in CATEGORY_ORDER.items():
+        for tname in tables:
+            if tname not in assigned and pred(tname):
+                result[cat].append(tname)
+                assigned.add(tname)
+    return result
+
+
+def write_overview(ws, tables, classified):
+    headers = ["序号", "分类", "表名", "表说明", "记录数"]
+    widths = [6, 22, 42, 36, 10]
+    for ci, (h, w) in enumerate(zip(headers, widths), 1):
+        c = ws.cell(row=1, column=ci, value=h)
+        c.font = HEADER_FONT
+        c.fill = HEADER_FILL
+        c.alignment = WRAP
+        c.border = THIN_BORDER
+        ws.column_dimensions[c.column_letter].width = w
+
+    idx = 0
+    for cat, tnames in classified.items():
+        for tname in tnames:
+            idx += 1
+            info = tables[tname]
+            vals = [idx, cat, tname, info["comment"], info["rows"]]
+            for ci, v in enumerate(vals, 1):
+                c = ws.cell(row=idx + 1, column=ci, value=v)
+                c.font = BODY_FONT
+                c.alignment = WRAP
+                c.border = THIN_BORDER
+    ws.auto_filter.ref = f"A1:E{idx + 1}"
+
+
+def write_detail_sheet(ws, cat, tnames, tables, columns):
+    headers = ["字段名", "类型", "可空", "默认值", "说明"]
+    widths = [28, 22, 6, 14, 36]
+    for ci, w in enumerate(widths, 1):
+        ws.column_dimensions[ws.cell(row=1, column=ci).column_letter].width = w
+
+    row = 1
+    for tname in tnames:
+        info = tables[tname]
+        c = ws.cell(row=row, column=1,
+                     value=f"{tname}  —  {info['comment']}  (约{info['rows'] or 0}行)")
+        c.font = TBL_FONT
+        c.fill = TBL_FILL
+        c.border = THIN_BORDER
+        for ci in range(2, 6):
+            cc = ws.cell(row=row, column=ci)
+            cc.fill = TBL_FILL
+            cc.border = THIN_BORDER
+        ws.merge_cells(start_row=row, start_column=1, end_row=row, end_column=5)
+        row += 1
+
+        for ci, (h, w) in enumerate(zip(headers, widths), 1):
+            c = ws.cell(row=row, column=ci, value=h)
+            c.font = HEADER_FONT
+            c.fill = HEADER_FILL
+            c.alignment = WRAP
+            c.border = THIN_BORDER
+        row += 1
+
+        for col_info in columns.get(tname, []):
+            col_name, col_type, nullable, default, comment = col_info
+            vals = [col_name, col_type, nullable, str(default) if default is not None else "", comment or ""]
+            for ci, v in enumerate(vals, 1):
+                c = ws.cell(row=row, column=ci, value=v)
+                c.font = BODY_FONT
+                c.alignment = WRAP
+                c.border = THIN_BORDER
+            row += 1
+        row += 1
+
+
+def main():
+    tables, columns = fetch_data()
+    classified = classify(tables)
+
+    wb = Workbook()
+    ws_overview = wb.active
+    ws_overview.title = "总览"
+    write_overview(ws_overview, tables, classified)
+
+    for cat, tnames in classified.items():
+        if not tnames:
+            continue
+        safe_title = cat[:31]
+        ws = wb.create_sheet(title=safe_title)
+        write_detail_sheet(ws, cat, tnames, tables, columns)
+
+    out = "/root/aidopdemo/docs/db/aidopdev_表结构汇总.xlsx"
+    wb.save(out)
+    print(f"Done → {out}")
+
+
+if __name__ == "__main__":
+    main()

+ 339 - 0
docs/指标模型动态配置方案.md

@@ -0,0 +1,339 @@
+# 指标模型动态配置方案
+
+> 最后更新:2026-04-12 | 状态:Phase 1–4 已完成并部署
+
+---
+
+## 1. 背景与目标
+
+### 1.1 原始问题
+
+系统原有两套独立的指标管理体系:
+
+| 体系 | 表 | 范围 | 编码格式 |
+|------|----|------|---------|
+| MetricCatalog | `ado_smart_ops_metric_catalog` | 仅 S4,12 条 | `S4_CYCLE_L1`、`S4_L2_CYCLE` 等 |
+| KpiMaster | `ado_smart_ops_kpi_master` | S1~S9,115 条 | `S4_L1_001`、`S4_L2_001` 等 |
+
+两套编码互不关联、名称不同步、字段丰富度不一致,导致"运营指标建模"(S0)和"运营指标主数据"页面各管各的。
+
+### 1.2 目标架构
+
+**KpiMaster 作为唯一指标主数据源**,废弃 MetricCatalog:
+
+```
+┌──────────────────────────────────────────────────┐
+│              KpiMaster(115 条,S1~S9)            │
+│   统一编码 S{n}_L{m}_NNN │ 父子关系 │ 公式/规则   │
+└──────────┬───────────────────────────┬────────────┘
+           │                           │
+     ┌─────▼─────┐             ┌───────▼───────┐
+     │ LayoutItem │             │ kpi_value 表  │
+     │ 租户级展示  │             │ 日值/目标值    │
+     │ 配置偏好    │             │ metric_code   │
+     └────────────┘             └───────────────┘
+```
+
+### 1.3 双向联动
+
+- **KpiMaster 页面 → 建模页面**:建模页面每次打开从 KpiMaster 实时读取,天然同步
+- **建模页面 → KpiMaster**:保存布局时,如果 DisplayName 与 MetricName 不同,自动同步回写 KpiMaster
+
+---
+
+## 2. 已完成工作
+
+### Phase 1:SQL 数据迁移 ✅
+
+将 LayoutItem、kpi_value 表中的旧 MetricCatalog 编码全部迁移为 KpiMaster 编码。
+
+**编码映射表(旧 → 新):**
+
+| 旧编码 | 新编码 | 名称 | 层级变化 |
+|--------|--------|------|---------|
+| `S4_CYCLE_L1` | `S4_L1_001` | 物料交货周期 | L1→L1 |
+| `S4_SAT_L1` | `S4_L1_002` | 物料交货满足率 | L1→L1 |
+| `S4_EFF_L1` | `S4_L1_003` | 物料采购人效 | L1→L1 |
+| `S4_TRANSIT_L1` | `S4_L1_004` | 采购在途周转 | L1→L1 |
+| `S4_L2_CYCLE` | `S4_L2_001` | 品类物料交货周期 | L2→L2 |
+| `S4_L2_SAT` | `S4_L2_002` | 品类物料交货满足率 | L2→L2 |
+| `S4_L2_EFF` | `S4_L2_003` | 品类物料采购人效 | L2→L2 |
+| `S4_L2_TRANSIT` | `S4_L2_004` | 品类在途物料周转 | L2→L2 |
+| `S4_L2_RCYCLE` | `S4_L3_001` | 供应商物料交货周期 | **L2→L3** |
+| `S4_L2_RSAT` | `S4_L3_002` | 供应商物料交货满足率 | **L2→L3** |
+| `S4_L2_REFF` | `S4_L3_003` | 供应商物料采购人效 | **L2→L3** |
+| `S4_L2_RTRANSIT` | `S4_L3_004` | 供应商在途物料周转 | **L2→L3** |
+
+**同步更新的表:**
+- `ado_smart_ops_layout_item`:MetricCode、RowId、ParentRowId、MetricLevel
+- `ado_s9_kpi_value_l1_day`:metric_code
+- `ado_s9_kpi_value_l2_day`:metric_code
+
+### Phase 2:后端重构 ✅
+
+**改动文件:**
+
+| 文件 | 变更 |
+|------|------|
+| `AidopKanbanController.S4.cs` | 5 个端点全部改为查 `AdoSmartOpsKpiMaster`;`PutS4OperationLayout` 增加双向同步逻辑;API 返回增加 `id` 字段 |
+| `Startup.cs` | 移除 MetricCatalog 的 `InitTables` 和 Seed 调用 |
+| `AdoSmartOpsMetricCatalog.cs` | **已删除** |
+| `AidopS4MetricModelSeed.cs` | **已删除** |
+
+**API 端点现状(`/api/AidopKanban/`):**
+
+| 端点 | 数据源 | 说明 |
+|------|--------|------|
+| `GET s4-metric-catalog` | KpiMaster | 返回 id、metricCode、parentId、formula、calcRule 等富字段 |
+| `GET s4-operation-layout` | LayoutItem + KpiMaster | 布局行 + KpiMaster 补充默认名/单位/方向 |
+| `PUT s4-operation-layout` | LayoutItem + KpiMaster | 保存布局 + DisplayName 变更同步回写 KpiMaster |
+| `GET s4-home-grid` | LayoutItem + KpiMaster + kpi_value_l1_day | 九宫格卡片 |
+| `GET s4-detail-kpis` | LayoutItem + KpiMaster + kpi_value_l2_day | 详情页 KPI |
+
+### Phase 3:前端适配 ✅
+
+**改动文件:**
+
+| 文件 | 变更 |
+|------|------|
+| `kanbanData.ts` | `S4CatalogRow` 增加 `id`、`parentId`、`description`、`formula`、`calcRule` 等 7 个 KpiMaster 字段 |
+| `s0.vue` | ① 一次获取全量 S4 指标按层级分组;② L2/L3 子集过滤改为 KpiMaster `parentId` 关系;③ RowId 按实际 metricLevel 区分前缀;④ L3 父级选择器自动显示 L2 选项 |
+| `operationModelSchema.ts` | S4 模块从 3 个 L1 扩展为 4 个,名称与 KpiMaster 对齐 |
+| `s4GraphServerMap.ts` | 映射数组从 3 项扩展为 4 项 |
+| `kpiMaster.vue` | 左侧树增加 S 模块分组层(S1~S9),虚拟模块节点不可拖拽/删除,样式区分 |
+
+### Phase 4:构建部署 ✅
+
+- Docker 镜像构建已优化(分层缓存),改代码后增量构建 ≤2 分钟
+- 九宫格、详情页、建模页面端到端验证通过
+
+---
+
+## 3. 当前数据架构
+
+### 3.1 KpiMaster 表结构
+
+表名:`ado_smart_ops_kpi_master`
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| Id | bigint PK | 自增主键 |
+| MetricCode | varchar(50) UK | 自动生成,格式 `S{n}_L{m}_NNN` |
+| ModuleCode | varchar(20) | S1~S9 |
+| MetricLevel | int | 1=L1, 2=L2, 3=L3 |
+| ParentId | bigint? | 父指标 ID(L1 为 null) |
+| MetricName | varchar(200) | 指标名称 |
+| Description | text | KPI 描述 |
+| Formula | text | 计算公式 |
+| CalcRule | text | 计算规则(含举例) |
+| DataSource | varchar(200) | 数据来源模块 |
+| StatFrequency | varchar(50) | 统计频率 |
+| Department | varchar(200) | 责任部门 |
+| DopFields | varchar(500) | DOP 系统字段映射 |
+| Unit | varchar(50) | 单位 |
+| Direction | varchar(20) | 优劣方向 |
+| IsHomePage | bool | 是否可上九宫格首页 |
+| SortNo | int | 同级排序号 |
+| IsEnabled | bool | 启用/禁用 |
+| TenantId | bigint | 租户 ID |
+
+**数据统计:** 115 条(S1~S9 全模块),其中 S4 有 L1×4、L2×4、L3×4 = 12 条。
+
+### 3.2 S4 指标父子关系
+
+```
+S4_L1_001 物料交货周期(天)        id=13
+  └─ S4_L2_001 品类物料交货周期      id=54, parentId=13
+       └─ S4_L3_001 供应商物料交货周期  id=99, parentId=54
+
+S4_L1_002 物料交货满足率(%)       id=14
+  └─ S4_L2_002 品类物料交货满足率     id=55, parentId=14
+       └─ S4_L3_002 供应商物料交货满足率 id=100, parentId=55
+
+S4_L1_003 物料采购人效(颗/人)     id=15
+  └─ S4_L2_003 品类物料采购人效      id=56, parentId=15
+       └─ S4_L3_003 供应商物料采购人效  id=101, parentId=56
+
+S4_L1_004 采购在途周转(天)        id=16
+  └─ S4_L2_004 品类在途物料周转      id=57, parentId=16
+       └─ S4_L3_004 供应商在途物料周转  id=102, parentId=57
+```
+
+### 3.3 LayoutItem 与 KpiMaster 的关系
+
+| 概念 | 表 | 职责 |
+|------|---|------|
+| 指标定义 | `KpiMaster` | 名称、公式、规则、单位、方向 — **单一事实源** |
+| 展示配置 | `LayoutItem` | 哪些指标上首页、显示名覆盖、排序、面板分区 — **租户级偏好** |
+| 运行数据 | `kpi_value_l*_day` | 日值、目标值 — 引用 KpiMaster 编码 |
+
+---
+
+## 4. 功能页面现状
+
+### 4.1 运营指标主数据(`/aidop/kanban/kpiMaster`)
+
+- **左侧树**:三层结构 = S 模块分组层(S1~S9)→ L1 → L2 → L3
+- **右侧详情**:编辑 KpiMaster 全部字段(名称、公式、规则、数据来源等)
+- **操作**:新增/删除/拖拽排序/启用禁用
+- **数据**:直连 `AdoSmartOpsKpiMasterController`
+
+### 4.2 运营指标建模(`/aidop/kanban/s0`)
+
+- **图谱**:ECharts 力导向图,显示 S1~S7 全模块 L1/L2 关系
+- **S4 面板**:
+  - 点击 S4 模块 → 右侧 L1 勾选表(最多 8 个上首页)
+  - 点击 S4 L1 节点 → 右侧显示该 L1 的 L2/L3 子指标(按 KpiMaster parentId 过滤)
+- **双向同步**:保存布局时 DisplayName 变更自动回写 KpiMaster
+- **数据**:S4 部分读 `AidopKanbanController` S4 端点(底层查 KpiMaster);其他模块为本地图谱草稿
+
+### 4.3 S4 采购看板(九宫格 + 详情)
+
+- **首页九宫格**:`GET s4-home-grid`,展示 L1 布局 × kpi_value_l1_day
+- **详情页**:`GET s4-detail-kpis`,展示 L2/L3 布局 × kpi_value_l2_day
+- **指标元信息**(名称、单位、方向)全部从 KpiMaster 实时读取
+
+---
+
+## 5. Docker 构建优化
+
+Dockerfile 已优化为分层缓存策略:
+
+| Dockerfile | 优化方式 | 改代码后耗时 |
+|-----------|---------|------------|
+| `Dockerfile.api` | 先拷 `*.csproj` + `sln` → `dotnet restore` → 再拷源码 → `dotnet publish` | ~38s |
+| `Dockerfile.web` | 先拷 `package*.json` → `npm install` → 再拷源码 → `npm run build` | ~1m46s |
+
+只有修改 `package.json`(加依赖)或 `.csproj`(加 NuGet 包)时才会触发 install/restore 重跑。
+
+---
+
+## 6. Demo 数据租户隔离方案
+
+> 状态:待执行
+
+### 6.1 背景与需求
+
+需要方便快速地导入用于演示的数据来展示系统功能,但不影响实际业务数据。要求:
+- 正式账号看正式数据,Demo 账号看 Demo 数据,可同时在线
+- 前端完全无感知,无需切换模式
+- Demo 数据可一键刷新
+
+### 6.2 当前问题:AiDOP 未接入 Admin.NET 多租户体系
+
+Admin.NET 框架已有完整的行级多租户隔离(`ITenantIdFilter` + SqlSugar 全局过滤),但 AiDOP 插件完全绕开了这套体系:
+
+| 问题 | 现状 |
+|------|------|
+| 实体未实现 `ITenantIdFilter` | KpiMaster/LayoutItem/HomeModule 有 TenantId 字段但无自动过滤 |
+| Controller 硬编码 tenantId | 所有 API 用 `[FromQuery] long tenantId = 1` 默认参数 |
+| TenantId 值不一致 | AiDOP 用 `1`,Admin.NET 默认租户是 `1300000000001` |
+| 前端硬传 tenantId | `kanbanData.ts` 所有请求带 `tenantId=1` |
+
+### 6.3 架构方案
+
+```
+登录入口
+├─ 正式账号 → Token.TenantId = 1300000000001
+│   └─ 后端自动识别 → WHERE TenantId=1300000000001 → 正式数据
+└─ Demo 账号 → Token.TenantId = 1300000000888
+    └─ 后端自动识别 → WHERE TenantId=1300000000888 → Demo 数据
+
+同一数据库,按 TenantId 行级隔离
+系统管理(菜单/角色/权限)共享,业务数据隔离
+```
+
+### 6.4 执行步骤
+
+**Phase 1:后端 — AiDOP 接入租户体系**
+
+- **1a** 新建 `AidopTenantHelper.cs`:从 `HttpContext.User.Claims` 取 TenantId,未登录 fallback `1300000000001`
+- **1b** 三个实体加 `ITenantIdFilter` 接口:`AdoSmartOpsKpiMaster`、`AdoSmartOpsLayoutItem`、`AdoSmartOpsHomeModule`
+- **1c** 所有 Controller 移除 `[FromQuery] long tenantId = 1`,改用 Helper 自动获取
+- **1d** `AidopKpiMasterSeed.cs` 默认值从 `1` 改为 `SqlSugarConst.DefaultTenantId`
+
+**Phase 2:数据迁移 — TenantId 从 1 改为 1300000000001**
+
+```sql
+UPDATE ado_smart_ops_kpi_master  SET TenantId=1300000000001  WHERE TenantId=1;
+UPDATE ado_smart_ops_layout_item SET TenantId=1300000000001  WHERE TenantId=1;
+UPDATE ado_smart_ops_home_module SET TenantId=1300000000001  WHERE TenantId=1;
+UPDATE ado_s9_kpi_value_l1_day   SET tenant_id=1300000000001 WHERE tenant_id=1;
+UPDATE ado_s9_kpi_value_l2_day   SET tenant_id=1300000000001 WHERE tenant_id=1;
+```
+
+**Phase 3:前端 — 去掉硬编码 tenantId**
+
+- `kanbanData.ts`:所有 API 函数移除 `tenantId` 参数
+- `s0.vue`:`loadS4Panel`/`saveS4LayoutClick` 去掉 tenantId 实参
+- `kpiMasterApi.ts`:同上
+
+**Phase 4:创建 Demo 租户 + 账号**
+
+SQL 脚本 `scripts/setup-demo-tenant.sql`:
+1. `SysTenant` 插入 Demo 租户(Id=`1300000000888`,TenantType=Id)
+2. `SysTenantMenu` 授权全部菜单
+3. `SysUser` 创建 DemoAdmin 账号
+4. `SysRole` + `SysUserRole` + `SysRoleMenu` 配权限
+
+**Phase 5:Demo 数据智能生成**
+
+Python 脚本 `scripts/gen_demo_data.py`,读取 KpiMaster 定义自动生成全套自洽数据:
+
+输入:
+- 连接数据库读取 115 条 KpiMaster 定义(层级、父子关系、direction、unit)
+- 可选:CSV 覆盖部分 L1 的 target/actual
+
+生成逻辑:
+1. 根据 unit/direction 确定合理的 target 范围(%类 90~99.5、天类 2~10、人效类 500~1000)
+2. 生成 30 天日值(带趋势 + 随机波动)
+3. L1 → L2 → L3 自动拆分,加权平均自洽(误差 <1%)
+4. 制造红/黄/绿分布(约 60%/25%/15%)
+
+自洽规则:
+- `higher_is_better`:绿 actual >= target;黄 actual >= target×0.95;红 < target×0.95
+- `lower_is_better`:绿 actual <= target;黄 actual <= target×1.1;红 > target×1.1
+- 末位 L2 做差值补偿确保加权平均 ≈ L1
+
+输出数据量:
+
+| 表 | 行数 | 说明 |
+|----|------|------|
+| `kpi_master` | 115 | 复制全套指标定义 |
+| `layout_item` | ~12 | S4 看板布局 |
+| `home_module` | 1 | S4 模块配置 |
+| `kpi_value_l1_day` | ~960 | 32 L1 × 30天 |
+| `kpi_value_l2_day` | ~1800 | 60 L2 × 30天 |
+| `kpi_value_l3_day` | ~690 | 23 L3 × 30天 |
+
+使用方式:
+```bash
+python3 scripts/gen_demo_data.py --db-host=... --demo-tenant-id=1300000000888
+mysql -h... -u... -p... aidopdev < scripts/import-demo-data.sql
+```
+
+**Phase 6:构建部署 + 验证**
+
+- Docker 构建(利用缓存 ≤3 分钟)
+- 正式账号登录 → 正式数据不受影响
+- DemoAdmin 登录 → 完整 Demo 数据
+- 两个浏览器同时在线互不干扰
+
+### 6.5 风险与注意
+
+| 项目 | 说明 |
+|------|------|
+| 旧表无 TenantId | `ado_order`/`ado_work_order`/`ado_plan` 无 TenantId 列,本期不改,后续按需加列 |
+| kpi_value 原生 SQL | S4 控制器中 raw SQL 已有 `tenant_id=@t`,需确认 @t 取自 Helper |
+| 系统管理不动 | 菜单/用户/角色的租户隔离由 Admin.NET 框架自动处理 |
+
+---
+
+## 7. 遗留与后续
+
+| 项目 | 状态 | 说明 |
+|------|------|------|
+| `S4_ONTIME` 编码 | 待确认 | 存在于 `kpi_value_l1_day` 但无对应 KpiMaster 行,可能是历史残留 |
+| 其他模块(S1~S3, S5~S9)看板 | 未接入 | 目前不走 LayoutItem/KpiMaster 看板流程,仅 S4 完成了全链路 |
+| MetricCatalog 旧表 | 可清理 | 实体和种子已删除,数据库表 `ado_smart_ops_metric_catalog` 可手动 DROP |
+| 建模页面非 S4 模块 | 本地草稿 | S1~S3、S5~S7 的图谱编辑保存在浏览器 localStorage,未接入服务端 |

+ 3468 - 0
scripts/demo_data.sql

@@ -0,0 +1,3468 @@
+-- ============================================================
+-- Demo data for tenant 1300000000888, 30 days
+-- Metrics: L1=32, L2=60, L3=23
+-- User overrides: 115 metrics from template
+-- ============================================================
+
+DELETE FROM ado_s9_kpi_value_l1_day WHERE tenant_id = 1300000000888;
+DELETE FROM ado_s9_kpi_value_l2_day WHERE tenant_id = 1300000000888;
+DELETE FROM ado_s9_kpi_value_l3_day WHERE tenant_id = 1300000000888;
+
+INSERT INTO `ado_s9_kpi_value_l1_day` (id, tenant_id, factory_id, biz_date, module_code, metric_code, metric_value, target_value, status_color, trend_flag, is_deleted, is_active) VALUES
+  (8880000001,1300000000888,1,'2026-03-14','S1','S1_L1_001',24.0581,20.0,'red','flat',0,1),
+  (8880000002,1300000000888,1,'2026-03-15','S1','S1_L1_001',23.4915,20.0,'red','down',0,1),
+  (8880000003,1300000000888,1,'2026-03-16','S1','S1_L1_001',23.0359,20.0,'red','flat',0,1),
+  (8880000004,1300000000888,1,'2026-03-17','S1','S1_L1_001',22.6401,20.0,'red','flat',0,1),
+  (8880000005,1300000000888,1,'2026-03-18','S1','S1_L1_001',22.1388,20.0,'red','down',0,1),
+  (8880000006,1300000000888,1,'2026-03-19','S1','S1_L1_001',23.1348,20.0,'red','up',0,1),
+  (8880000007,1300000000888,1,'2026-03-20','S1','S1_L1_001',22.8677,20.0,'red','flat',0,1),
+  (8880000008,1300000000888,1,'2026-03-21','S1','S1_L1_001',24.394,20.0,'red','up',0,1),
+  (8880000009,1300000000888,1,'2026-03-22','S1','S1_L1_001',22.5784,20.0,'red','down',0,1),
+  (8880000010,1300000000888,1,'2026-03-23','S1','S1_L1_001',23.2211,20.0,'red','up',0,1),
+  (8880000011,1300000000888,1,'2026-03-24','S1','S1_L1_001',21.9174,20.0,'yellow','down',0,1),
+  (8880000012,1300000000888,1,'2026-03-25','S1','S1_L1_001',22.7271,20.0,'red','up',0,1),
+  (8880000013,1300000000888,1,'2026-03-26','S1','S1_L1_001',23.1802,20.0,'red','flat',0,1),
+  (8880000014,1300000000888,1,'2026-03-27','S1','S1_L1_001',23.5685,20.0,'red','flat',0,1),
+  (8880000015,1300000000888,1,'2026-03-28','S1','S1_L1_001',23.9992,20.0,'red','flat',0,1),
+  (8880000016,1300000000888,1,'2026-03-29','S1','S1_L1_001',22.9695,20.0,'red','down',0,1),
+  (8880000017,1300000000888,1,'2026-03-30','S1','S1_L1_001',22.2291,20.0,'red','down',0,1),
+  (8880000018,1300000000888,1,'2026-03-31','S1','S1_L1_001',23.3159,20.0,'red','up',0,1),
+  (8880000019,1300000000888,1,'2026-04-01','S1','S1_L1_001',23.3567,20.0,'red','flat',0,1),
+  (8880000020,1300000000888,1,'2026-04-02','S1','S1_L1_001',23.3392,20.0,'red','flat',0,1),
+  (8880000021,1300000000888,1,'2026-04-03','S1','S1_L1_001',22.5168,20.0,'red','down',0,1),
+  (8880000022,1300000000888,1,'2026-04-04','S1','S1_L1_001',23.782,20.0,'red','up',0,1),
+  (8880000023,1300000000888,1,'2026-04-05','S1','S1_L1_001',23.0606,20.0,'red','down',0,1),
+  (8880000024,1300000000888,1,'2026-04-06','S1','S1_L1_001',23.4829,20.0,'red','flat',0,1),
+  (8880000025,1300000000888,1,'2026-04-07','S1','S1_L1_001',23.8791,20.0,'red','flat',0,1),
+  (8880000026,1300000000888,1,'2026-04-08','S1','S1_L1_001',23.4204,20.0,'red','flat',0,1),
+  (8880000027,1300000000888,1,'2026-04-09','S1','S1_L1_001',23.1977,20.0,'red','flat',0,1),
+  (8880000028,1300000000888,1,'2026-04-10','S1','S1_L1_001',24.4854,20.0,'red','up',0,1),
+  (8880000029,1300000000888,1,'2026-04-11','S1','S1_L1_001',23.1682,20.0,'red','down',0,1),
+  (8880000030,1300000000888,1,'2026-04-12','S1','S1_L1_001',22.7958,20.0,'red','flat',0,1),
+  (8880000031,1300000000888,1,'2026-03-14','S1','S1_L1_002',70.5969,95.0,'red','flat',0,1),
+  (8880000032,1300000000888,1,'2026-03-15','S1','S1_L1_002',74.9211,95.0,'red','up',0,1),
+  (8880000033,1300000000888,1,'2026-03-16','S1','S1_L1_002',78.1459,95.0,'red','up',0,1),
+  (8880000034,1300000000888,1,'2026-03-17','S1','S1_L1_002',79.7847,95.0,'red','up',0,1),
+  (8880000035,1300000000888,1,'2026-03-18','S1','S1_L1_002',76.2638,95.0,'red','down',0,1),
+  (8880000036,1300000000888,1,'2026-03-19','S1','S1_L1_002',75.6959,95.0,'red','flat',0,1),
+  (8880000037,1300000000888,1,'2026-03-20','S1','S1_L1_002',72.2095,95.0,'red','down',0,1),
+  (8880000038,1300000000888,1,'2026-03-21','S1','S1_L1_002',73.1027,95.0,'red','flat',0,1),
+  (8880000039,1300000000888,1,'2026-03-22','S1','S1_L1_002',75.1056,95.0,'red','up',0,1),
+  (8880000040,1300000000888,1,'2026-03-23','S1','S1_L1_002',76.1322,95.0,'red','flat',0,1),
+  (8880000041,1300000000888,1,'2026-03-24','S1','S1_L1_002',76.3054,95.0,'red','flat',0,1),
+  (8880000042,1300000000888,1,'2026-03-25','S1','S1_L1_002',73.924,95.0,'red','down',0,1),
+  (8880000043,1300000000888,1,'2026-03-26','S1','S1_L1_002',72.4081,95.0,'red','down',0,1),
+  (8880000044,1300000000888,1,'2026-03-27','S1','S1_L1_002',73.25,95.0,'red','flat',0,1),
+  (8880000045,1300000000888,1,'2026-03-28','S1','S1_L1_002',72.3968,95.0,'red','flat',0,1),
+  (8880000046,1300000000888,1,'2026-03-29','S1','S1_L1_002',76.4477,95.0,'red','up',0,1),
+  (8880000047,1300000000888,1,'2026-03-30','S1','S1_L1_002',69.7974,95.0,'red','down',0,1),
+  (8880000048,1300000000888,1,'2026-03-31','S1','S1_L1_002',74.2501,95.0,'red','up',0,1),
+  (8880000049,1300000000888,1,'2026-04-01','S1','S1_L1_002',76.0122,95.0,'red','up',0,1),
+  (8880000050,1300000000888,1,'2026-04-02','S1','S1_L1_002',78.4245,95.0,'red','up',0,1),
+  (8880000051,1300000000888,1,'2026-04-03','S1','S1_L1_002',75.1604,95.0,'red','down',0,1),
+  (8880000052,1300000000888,1,'2026-04-04','S1','S1_L1_002',77.2529,95.0,'red','up',0,1),
+  (8880000053,1300000000888,1,'2026-04-05','S1','S1_L1_002',74.1022,95.0,'red','down',0,1),
+  (8880000054,1300000000888,1,'2026-04-06','S1','S1_L1_002',73.3251,95.0,'red','flat',0,1),
+  (8880000055,1300000000888,1,'2026-04-07','S1','S1_L1_002',73.4826,95.0,'red','flat',0,1),
+  (8880000056,1300000000888,1,'2026-04-08','S1','S1_L1_002',78.4365,95.0,'red','up',0,1),
+  (8880000057,1300000000888,1,'2026-04-09','S1','S1_L1_002',77.237,95.0,'red','flat',0,1),
+  (8880000058,1300000000888,1,'2026-04-10','S1','S1_L1_002',76.0966,95.0,'red','flat',0,1),
+  (8880000059,1300000000888,1,'2026-04-11','S1','S1_L1_002',82.4931,95.0,'red','up',0,1),
+  (8880000060,1300000000888,1,'2026-04-12','S1','S1_L1_002',74.9272,95.0,'red','down',0,1),
+  (8880000061,1300000000888,1,'2026-03-14','S1','S1_L1_003',237.9968,251.45,'red','flat',0,1),
+  (8880000062,1300000000888,1,'2026-03-15','S1','S1_L1_003',252.2799,251.45,'green','up',0,1),
+  (8880000063,1300000000888,1,'2026-03-16','S1','S1_L1_003',256.1897,251.45,'green','flat',0,1),
+  (8880000064,1300000000888,1,'2026-03-17','S1','S1_L1_003',260.6423,251.45,'green','flat',0,1),
+  (8880000065,1300000000888,1,'2026-03-18','S1','S1_L1_003',259.9027,251.45,'green','flat',0,1),
+  (8880000066,1300000000888,1,'2026-03-19','S1','S1_L1_003',231.3601,251.45,'red','down',0,1),
+  (8880000067,1300000000888,1,'2026-03-20','S1','S1_L1_003',252.2566,251.45,'green','up',0,1),
+  (8880000068,1300000000888,1,'2026-03-21','S1','S1_L1_003',232.3901,251.45,'red','down',0,1),
+  (8880000069,1300000000888,1,'2026-03-22','S1','S1_L1_003',258.5005,251.45,'green','up',0,1),
+  (8880000070,1300000000888,1,'2026-03-23','S1','S1_L1_003',248.4388,251.45,'yellow','down',0,1),
+  (8880000071,1300000000888,1,'2026-03-24','S1','S1_L1_003',238.1236,251.45,'red','down',0,1),
+  (8880000072,1300000000888,1,'2026-03-25','S1','S1_L1_003',261.4319,251.45,'green','up',0,1),
+  (8880000073,1300000000888,1,'2026-03-26','S1','S1_L1_003',251.3282,251.45,'yellow','down',0,1),
+  (8880000074,1300000000888,1,'2026-03-27','S1','S1_L1_003',232.5761,251.45,'red','down',0,1),
+  (8880000075,1300000000888,1,'2026-03-28','S1','S1_L1_003',248.7356,251.45,'yellow','up',0,1),
+  (8880000076,1300000000888,1,'2026-03-29','S1','S1_L1_003',241.1566,251.45,'yellow','down',0,1),
+  (8880000077,1300000000888,1,'2026-03-30','S1','S1_L1_003',247.388,251.45,'yellow','up',0,1),
+  (8880000078,1300000000888,1,'2026-03-31','S1','S1_L1_003',243.1238,251.45,'yellow','flat',0,1),
+  (8880000079,1300000000888,1,'2026-04-01','S1','S1_L1_003',256.7245,251.45,'green','up',0,1),
+  (8880000080,1300000000888,1,'2026-04-02','S1','S1_L1_003',236.0368,251.45,'red','down',0,1),
+  (8880000081,1300000000888,1,'2026-04-03','S1','S1_L1_003',248.9126,251.45,'yellow','up',0,1),
+  (8880000082,1300000000888,1,'2026-04-04','S1','S1_L1_003',259.9842,251.45,'green','up',0,1),
+  (8880000083,1300000000888,1,'2026-04-05','S1','S1_L1_003',240.4478,251.45,'yellow','down',0,1),
+  (8880000084,1300000000888,1,'2026-04-06','S1','S1_L1_003',248.123,251.45,'yellow','up',0,1),
+  (8880000085,1300000000888,1,'2026-04-07','S1','S1_L1_003',248.059,251.45,'yellow','flat',0,1),
+  (8880000086,1300000000888,1,'2026-04-08','S1','S1_L1_003',241.4631,251.45,'yellow','down',0,1),
+  (8880000087,1300000000888,1,'2026-04-09','S1','S1_L1_003',251.3572,251.45,'yellow','up',0,1),
+  (8880000088,1300000000888,1,'2026-04-10','S1','S1_L1_003',247.2827,251.45,'yellow','flat',0,1),
+  (8880000089,1300000000888,1,'2026-04-11','S1','S1_L1_003',239.5838,251.45,'yellow','down',0,1),
+  (8880000090,1300000000888,1,'2026-04-12','S1','S1_L1_003',259.5983,251.45,'green','up',0,1),
+  (8880000091,1300000000888,1,'2026-03-14','S1','S1_L1_004',14.4355,15.0,'green','flat',0,1),
+  (8880000092,1300000000888,1,'2026-03-15','S1','S1_L1_004',14.2568,15.0,'green','flat',0,1),
+  (8880000093,1300000000888,1,'2026-03-16','S1','S1_L1_004',13.7454,15.0,'green','down',0,1),
+  (8880000094,1300000000888,1,'2026-03-17','S1','S1_L1_004',13.7186,15.0,'green','flat',0,1),
+  (8880000095,1300000000888,1,'2026-03-18','S1','S1_L1_004',14.292,15.0,'green','up',0,1),
+  (8880000096,1300000000888,1,'2026-03-19','S1','S1_L1_004',13.3632,15.0,'green','down',0,1),
+  (8880000097,1300000000888,1,'2026-03-20','S1','S1_L1_004',13.8603,15.0,'green','up',0,1),
+  (8880000098,1300000000888,1,'2026-03-21','S1','S1_L1_004',13.735,15.0,'green','flat',0,1),
+  (8880000099,1300000000888,1,'2026-03-22','S1','S1_L1_004',14.0293,15.0,'green','up',0,1),
+  (8880000100,1300000000888,1,'2026-03-23','S1','S1_L1_004',14.0887,15.0,'green','flat',0,1),
+  (8880000101,1300000000888,1,'2026-03-24','S1','S1_L1_004',14.0155,15.0,'green','flat',0,1),
+  (8880000102,1300000000888,1,'2026-03-25','S1','S1_L1_004',14.4766,15.0,'green','up',0,1),
+  (8880000103,1300000000888,1,'2026-03-26','S1','S1_L1_004',14.0958,15.0,'green','down',0,1),
+  (8880000104,1300000000888,1,'2026-03-27','S1','S1_L1_004',13.8677,15.0,'green','flat',0,1),
+  (8880000105,1300000000888,1,'2026-03-28','S1','S1_L1_004',13.4914,15.0,'green','down',0,1),
+  (8880000106,1300000000888,1,'2026-03-29','S1','S1_L1_004',14.3032,15.0,'green','up',0,1),
+  (8880000107,1300000000888,1,'2026-03-30','S1','S1_L1_004',14.2218,15.0,'green','flat',0,1),
+  (8880000108,1300000000888,1,'2026-03-31','S1','S1_L1_004',14.6093,15.0,'green','up',0,1),
+  (8880000109,1300000000888,1,'2026-04-01','S1','S1_L1_004',13.6861,15.0,'green','down',0,1),
+  (8880000110,1300000000888,1,'2026-04-02','S1','S1_L1_004',14.0111,15.0,'green','up',0,1),
+  (8880000111,1300000000888,1,'2026-04-03','S1','S1_L1_004',13.9753,15.0,'green','flat',0,1),
+  (8880000112,1300000000888,1,'2026-04-04','S1','S1_L1_004',13.9632,15.0,'green','flat',0,1),
+  (8880000113,1300000000888,1,'2026-04-05','S1','S1_L1_004',14.0044,15.0,'green','flat',0,1),
+  (8880000114,1300000000888,1,'2026-04-06','S1','S1_L1_004',13.2799,15.0,'green','down',0,1),
+  (8880000115,1300000000888,1,'2026-04-07','S1','S1_L1_004',14.3465,15.0,'green','up',0,1),
+  (8880000116,1300000000888,1,'2026-04-08','S1','S1_L1_004',14.2743,15.0,'green','flat',0,1),
+  (8880000117,1300000000888,1,'2026-04-09','S1','S1_L1_004',14.4748,15.0,'green','flat',0,1),
+  (8880000118,1300000000888,1,'2026-04-10','S1','S1_L1_004',14.9448,15.0,'green','up',0,1),
+  (8880000119,1300000000888,1,'2026-04-11','S1','S1_L1_004',13.866,15.0,'green','down',0,1),
+  (8880000120,1300000000888,1,'2026-04-12','S1','S1_L1_004',13.9848,15.0,'green','flat',0,1),
+  (8880000121,1300000000888,1,'2026-03-14','S2','S2_L1_001',21.6731,20.0,'yellow','flat',0,1),
+  (8880000122,1300000000888,1,'2026-03-15','S2','S2_L1_001',22.2242,20.0,'red','up',0,1),
+  (8880000123,1300000000888,1,'2026-03-16','S2','S2_L1_001',21.6623,20.0,'yellow','down',0,1),
+  (8880000124,1300000000888,1,'2026-03-17','S2','S2_L1_001',22.0702,20.0,'red','flat',0,1),
+  (8880000125,1300000000888,1,'2026-03-18','S2','S2_L1_001',21.889,20.0,'yellow','flat',0,1),
+  (8880000126,1300000000888,1,'2026-03-19','S2','S2_L1_001',21.8928,20.0,'yellow','flat',0,1),
+  (8880000127,1300000000888,1,'2026-03-20','S2','S2_L1_001',21.3309,20.0,'yellow','down',0,1),
+  (8880000128,1300000000888,1,'2026-03-21','S2','S2_L1_001',22.5256,20.0,'red','up',0,1),
+  (8880000129,1300000000888,1,'2026-03-22','S2','S2_L1_001',22.9333,20.0,'red','flat',0,1),
+  (8880000130,1300000000888,1,'2026-03-23','S2','S2_L1_001',22.1605,20.0,'red','down',0,1),
+  (8880000131,1300000000888,1,'2026-03-24','S2','S2_L1_001',22.4833,20.0,'red','flat',0,1),
+  (8880000132,1300000000888,1,'2026-03-25','S2','S2_L1_001',22.5531,20.0,'red','flat',0,1),
+  (8880000133,1300000000888,1,'2026-03-26','S2','S2_L1_001',22.6125,20.0,'red','flat',0,1),
+  (8880000134,1300000000888,1,'2026-03-27','S2','S2_L1_001',22.2002,20.0,'red','flat',0,1),
+  (8880000135,1300000000888,1,'2026-03-28','S2','S2_L1_001',22.1401,20.0,'red','flat',0,1),
+  (8880000136,1300000000888,1,'2026-03-29','S2','S2_L1_001',22.5702,20.0,'red','flat',0,1),
+  (8880000137,1300000000888,1,'2026-03-30','S2','S2_L1_001',22.0454,20.0,'red','down',0,1),
+  (8880000138,1300000000888,1,'2026-03-31','S2','S2_L1_001',21.3572,20.0,'yellow','down',0,1),
+  (8880000139,1300000000888,1,'2026-04-01','S2','S2_L1_001',22.0157,20.0,'red','up',0,1),
+  (8880000140,1300000000888,1,'2026-04-02','S2','S2_L1_001',20.7536,20.0,'yellow','down',0,1),
+  (8880000141,1300000000888,1,'2026-04-03','S2','S2_L1_001',21.9961,20.0,'yellow','up',0,1),
+  (8880000142,1300000000888,1,'2026-04-04','S2','S2_L1_001',22.2728,20.0,'red','flat',0,1),
+  (8880000143,1300000000888,1,'2026-04-05','S2','S2_L1_001',22.8157,20.0,'red','up',0,1),
+  (8880000144,1300000000888,1,'2026-04-06','S2','S2_L1_001',22.0998,20.0,'red','down',0,1),
+  (8880000145,1300000000888,1,'2026-04-07','S2','S2_L1_001',22.6126,20.0,'red','up',0,1),
+  (8880000146,1300000000888,1,'2026-04-08','S2','S2_L1_001',21.9996,20.0,'yellow','down',0,1),
+  (8880000147,1300000000888,1,'2026-04-09','S2','S2_L1_001',21.3245,20.0,'yellow','down',0,1),
+  (8880000148,1300000000888,1,'2026-04-10','S2','S2_L1_001',21.0685,20.0,'yellow','flat',0,1),
+  (8880000149,1300000000888,1,'2026-04-11','S2','S2_L1_001',21.36,20.0,'yellow','flat',0,1),
+  (8880000150,1300000000888,1,'2026-04-12','S2','S2_L1_001',21.0983,20.0,'yellow','flat',0,1),
+  (8880000151,1300000000888,1,'2026-03-14','S2','S2_L1_002',81.5848,99.0,'red','flat',0,1),
+  (8880000152,1300000000888,1,'2026-03-15','S2','S2_L1_002',85.77,99.0,'red','up',0,1),
+  (8880000153,1300000000888,1,'2026-03-16','S2','S2_L1_002',84.5541,99.0,'red','flat',0,1),
+  (8880000154,1300000000888,1,'2026-03-17','S2','S2_L1_002',85.4241,99.0,'red','flat',0,1),
+  (8880000155,1300000000888,1,'2026-03-18','S2','S2_L1_002',85.9574,99.0,'red','flat',0,1),
+  (8880000156,1300000000888,1,'2026-03-19','S2','S2_L1_002',83.6987,99.0,'red','down',0,1),
+  (8880000157,1300000000888,1,'2026-03-20','S2','S2_L1_002',86.075,99.0,'red','up',0,1),
+  (8880000158,1300000000888,1,'2026-03-21','S2','S2_L1_002',89.4311,99.0,'red','up',0,1),
+  (8880000159,1300000000888,1,'2026-03-22','S2','S2_L1_002',82.1751,99.0,'red','down',0,1),
+  (8880000160,1300000000888,1,'2026-03-23','S2','S2_L1_002',89.4304,99.0,'red','up',0,1),
+  (8880000161,1300000000888,1,'2026-03-24','S2','S2_L1_002',84.3809,99.0,'red','down',0,1),
+  (8880000162,1300000000888,1,'2026-03-25','S2','S2_L1_002',83.0451,99.0,'red','flat',0,1),
+  (8880000163,1300000000888,1,'2026-03-26','S2','S2_L1_002',91.1894,99.0,'red','up',0,1),
+  (8880000164,1300000000888,1,'2026-03-27','S2','S2_L1_002',85.3953,99.0,'red','down',0,1),
+  (8880000165,1300000000888,1,'2026-03-28','S2','S2_L1_002',88.4945,99.0,'red','up',0,1),
+  (8880000166,1300000000888,1,'2026-03-29','S2','S2_L1_002',87.0849,99.0,'red','flat',0,1),
+  (8880000167,1300000000888,1,'2026-03-30','S2','S2_L1_002',80.7145,99.0,'red','down',0,1),
+  (8880000168,1300000000888,1,'2026-03-31','S2','S2_L1_002',85.3081,99.0,'red','up',0,1),
+  (8880000169,1300000000888,1,'2026-04-01','S2','S2_L1_002',83.6604,99.0,'red','flat',0,1),
+  (8880000170,1300000000888,1,'2026-04-02','S2','S2_L1_002',81.5784,99.0,'red','down',0,1),
+  (8880000171,1300000000888,1,'2026-04-03','S2','S2_L1_002',80.4821,99.0,'red','flat',0,1),
+  (8880000172,1300000000888,1,'2026-04-04','S2','S2_L1_002',85.2608,99.0,'red','up',0,1),
+  (8880000173,1300000000888,1,'2026-04-05','S2','S2_L1_002',86.5051,99.0,'red','flat',0,1),
+  (8880000174,1300000000888,1,'2026-04-06','S2','S2_L1_002',85.9962,99.0,'red','flat',0,1),
+  (8880000175,1300000000888,1,'2026-04-07','S2','S2_L1_002',84.2201,99.0,'red','down',0,1),
+  (8880000176,1300000000888,1,'2026-04-08','S2','S2_L1_002',82.9638,99.0,'red','flat',0,1),
+  (8880000177,1300000000888,1,'2026-04-09','S2','S2_L1_002',82.4835,99.0,'red','flat',0,1),
+  (8880000178,1300000000888,1,'2026-04-10','S2','S2_L1_002',83.5843,99.0,'red','flat',0,1),
+  (8880000179,1300000000888,1,'2026-04-11','S2','S2_L1_002',82.3657,99.0,'red','flat',0,1),
+  (8880000180,1300000000888,1,'2026-04-12','S2','S2_L1_002',84.4816,99.0,'red','up',0,1),
+  (8880000181,1300000000888,1,'2026-03-14','S2','S2_L1_003',191.2539,184.06,'green','flat',0,1),
+  (8880000182,1300000000888,1,'2026-03-15','S2','S2_L1_003',178.1551,184.06,'yellow','down',0,1),
+  (8880000183,1300000000888,1,'2026-03-16','S2','S2_L1_003',193.1651,184.06,'green','up',0,1),
+  (8880000184,1300000000888,1,'2026-03-17','S2','S2_L1_003',195.9545,184.06,'green','flat',0,1),
+  (8880000185,1300000000888,1,'2026-03-18','S2','S2_L1_003',190.3272,184.06,'green','down',0,1),
+  (8880000186,1300000000888,1,'2026-03-19','S2','S2_L1_003',189.2753,184.06,'green','flat',0,1),
+  (8880000187,1300000000888,1,'2026-03-20','S2','S2_L1_003',193.1737,184.06,'green','up',0,1),
+  (8880000188,1300000000888,1,'2026-03-21','S2','S2_L1_003',194.1459,184.06,'green','flat',0,1),
+  (8880000189,1300000000888,1,'2026-03-22','S2','S2_L1_003',198.4313,184.06,'green','up',0,1),
+  (8880000190,1300000000888,1,'2026-03-23','S2','S2_L1_003',192.2309,184.06,'green','down',0,1),
+  (8880000191,1300000000888,1,'2026-03-24','S2','S2_L1_003',188.1493,184.06,'green','down',0,1),
+  (8880000192,1300000000888,1,'2026-03-25','S2','S2_L1_003',189.4663,184.06,'green','flat',0,1),
+  (8880000193,1300000000888,1,'2026-03-26','S2','S2_L1_003',193.1736,184.06,'green','flat',0,1),
+  (8880000194,1300000000888,1,'2026-03-27','S2','S2_L1_003',201.0944,184.06,'green','up',0,1),
+  (8880000195,1300000000888,1,'2026-03-28','S2','S2_L1_003',190.2789,184.06,'green','down',0,1),
+  (8880000196,1300000000888,1,'2026-03-29','S2','S2_L1_003',186.0584,184.06,'green','down',0,1),
+  (8880000197,1300000000888,1,'2026-03-30','S2','S2_L1_003',187.1098,184.06,'green','flat',0,1),
+  (8880000198,1300000000888,1,'2026-03-31','S2','S2_L1_003',180.0422,184.06,'yellow','down',0,1),
+  (8880000199,1300000000888,1,'2026-04-01','S2','S2_L1_003',194.0257,184.06,'green','up',0,1),
+  (8880000200,1300000000888,1,'2026-04-02','S2','S2_L1_003',184.2786,184.06,'green','down',0,1),
+  (8880000201,1300000000888,1,'2026-04-03','S2','S2_L1_003',185.0153,184.06,'green','flat',0,1),
+  (8880000202,1300000000888,1,'2026-04-04','S2','S2_L1_003',180.7357,184.06,'yellow','down',0,1),
+  (8880000203,1300000000888,1,'2026-04-05','S2','S2_L1_003',185.6811,184.06,'green','up',0,1),
+  (8880000204,1300000000888,1,'2026-04-06','S2','S2_L1_003',195.4011,184.06,'green','up',0,1),
+  (8880000205,1300000000888,1,'2026-04-07','S2','S2_L1_003',184.5666,184.06,'green','down',0,1),
+  (8880000206,1300000000888,1,'2026-04-08','S2','S2_L1_003',182.0404,184.06,'yellow','flat',0,1),
+  (8880000207,1300000000888,1,'2026-04-09','S2','S2_L1_003',193.1524,184.06,'green','up',0,1),
+  (8880000208,1300000000888,1,'2026-04-10','S2','S2_L1_003',190.1585,184.06,'green','flat',0,1),
+  (8880000209,1300000000888,1,'2026-04-11','S2','S2_L1_003',194.6159,184.06,'green','up',0,1),
+  (8880000210,1300000000888,1,'2026-04-12','S2','S2_L1_003',196.3933,184.06,'green','flat',0,1),
+  (8880000211,1300000000888,1,'2026-03-14','S2','S2_L1_004',22.0116,18.0,'red','flat',0,1),
+  (8880000212,1300000000888,1,'2026-03-15','S2','S2_L1_004',23.4049,18.0,'red','up',0,1),
+  (8880000213,1300000000888,1,'2026-03-16','S2','S2_L1_004',24.3415,18.0,'red','up',0,1),
+  (8880000214,1300000000888,1,'2026-03-17','S2','S2_L1_004',24.2825,18.0,'red','flat',0,1),
+  (8880000215,1300000000888,1,'2026-03-18','S2','S2_L1_004',22.6045,18.0,'red','down',0,1),
+  (8880000216,1300000000888,1,'2026-03-19','S2','S2_L1_004',22.6775,18.0,'red','flat',0,1),
+  (8880000217,1300000000888,1,'2026-03-20','S2','S2_L1_004',23.4753,18.0,'red','up',0,1),
+  (8880000218,1300000000888,1,'2026-03-21','S2','S2_L1_004',23.7323,18.0,'red','flat',0,1),
+  (8880000219,1300000000888,1,'2026-03-22','S2','S2_L1_004',22.7111,18.0,'red','down',0,1),
+  (8880000220,1300000000888,1,'2026-03-23','S2','S2_L1_004',22.9016,18.0,'red','flat',0,1),
+  (8880000221,1300000000888,1,'2026-03-24','S2','S2_L1_004',24.5228,18.0,'red','up',0,1),
+  (8880000222,1300000000888,1,'2026-03-25','S2','S2_L1_004',22.9259,18.0,'red','down',0,1),
+  (8880000223,1300000000888,1,'2026-03-26','S2','S2_L1_004',22.6651,18.0,'red','flat',0,1),
+  (8880000224,1300000000888,1,'2026-03-27','S2','S2_L1_004',23.0827,18.0,'red','flat',0,1),
+  (8880000225,1300000000888,1,'2026-03-28','S2','S2_L1_004',23.4,18.0,'red','flat',0,1),
+  (8880000226,1300000000888,1,'2026-03-29','S2','S2_L1_004',22.2951,18.0,'red','down',0,1),
+  (8880000227,1300000000888,1,'2026-03-30','S2','S2_L1_004',22.8286,18.0,'red','up',0,1),
+  (8880000228,1300000000888,1,'2026-03-31','S2','S2_L1_004',22.1952,18.0,'red','down',0,1),
+  (8880000229,1300000000888,1,'2026-04-01','S2','S2_L1_004',22.808,18.0,'red','up',0,1),
+  (8880000230,1300000000888,1,'2026-04-02','S2','S2_L1_004',24.2951,18.0,'red','up',0,1),
+  (8880000231,1300000000888,1,'2026-04-03','S2','S2_L1_004',23.5118,18.0,'red','down',0,1),
+  (8880000232,1300000000888,1,'2026-04-04','S2','S2_L1_004',22.9361,18.0,'red','down',0,1),
+  (8880000233,1300000000888,1,'2026-04-05','S2','S2_L1_004',22.3562,18.0,'red','down',0,1),
+  (8880000234,1300000000888,1,'2026-04-06','S2','S2_L1_004',22.7851,18.0,'red','flat',0,1),
+  (8880000235,1300000000888,1,'2026-04-07','S2','S2_L1_004',23.725,18.0,'red','up',0,1),
+  (8880000236,1300000000888,1,'2026-04-08','S2','S2_L1_004',22.6124,18.0,'red','down',0,1),
+  (8880000237,1300000000888,1,'2026-04-09','S2','S2_L1_004',24.0008,18.0,'red','up',0,1),
+  (8880000238,1300000000888,1,'2026-04-10','S2','S2_L1_004',22.0522,18.0,'red','down',0,1),
+  (8880000239,1300000000888,1,'2026-04-11','S2','S2_L1_004',22.7999,18.0,'red','up',0,1),
+  (8880000240,1300000000888,1,'2026-04-12','S2','S2_L1_004',24.2025,18.0,'red','up',0,1),
+  (8880000241,1300000000888,1,'2026-03-14','S3','S3_L1_001',17.9883,15.0,'red','flat',0,1),
+  (8880000242,1300000000888,1,'2026-03-15','S3','S3_L1_001',17.424,15.0,'red','down',0,1),
+  (8880000243,1300000000888,1,'2026-03-16','S3','S3_L1_001',18.6236,15.0,'red','up',0,1),
+  (8880000244,1300000000888,1,'2026-03-17','S3','S3_L1_001',18.4438,15.0,'red','flat',0,1),
+  (8880000245,1300000000888,1,'2026-03-18','S3','S3_L1_001',18.4072,15.0,'red','flat',0,1),
+  (8880000246,1300000000888,1,'2026-03-19','S3','S3_L1_001',17.5802,15.0,'red','down',0,1),
+  (8880000247,1300000000888,1,'2026-03-20','S3','S3_L1_001',17.5976,15.0,'red','flat',0,1),
+  (8880000248,1300000000888,1,'2026-03-21','S3','S3_L1_001',16.904,15.0,'red','down',0,1),
+  (8880000249,1300000000888,1,'2026-03-22','S3','S3_L1_001',18.9231,15.0,'red','up',0,1),
+  (8880000250,1300000000888,1,'2026-03-23','S3','S3_L1_001',18.2744,15.0,'red','down',0,1),
+  (8880000251,1300000000888,1,'2026-03-24','S3','S3_L1_001',17.8591,15.0,'red','down',0,1),
+  (8880000252,1300000000888,1,'2026-03-25','S3','S3_L1_001',18.5041,15.0,'red','up',0,1),
+  (8880000253,1300000000888,1,'2026-03-26','S3','S3_L1_001',18.4055,15.0,'red','flat',0,1),
+  (8880000254,1300000000888,1,'2026-03-27','S3','S3_L1_001',18.5266,15.0,'red','flat',0,1),
+  (8880000255,1300000000888,1,'2026-03-28','S3','S3_L1_001',17.1233,15.0,'red','down',0,1),
+  (8880000256,1300000000888,1,'2026-03-29','S3','S3_L1_001',17.6145,15.0,'red','up',0,1),
+  (8880000257,1300000000888,1,'2026-03-30','S3','S3_L1_001',18.1055,15.0,'red','up',0,1),
+  (8880000258,1300000000888,1,'2026-03-31','S3','S3_L1_001',18.1919,15.0,'red','flat',0,1),
+  (8880000259,1300000000888,1,'2026-04-01','S3','S3_L1_001',18.5169,15.0,'red','flat',0,1),
+  (8880000260,1300000000888,1,'2026-04-02','S3','S3_L1_001',17.4553,15.0,'red','down',0,1),
+  (8880000261,1300000000888,1,'2026-04-03','S3','S3_L1_001',18.0687,15.0,'red','up',0,1),
+  (8880000262,1300000000888,1,'2026-04-04','S3','S3_L1_001',19.1909,15.0,'red','up',0,1),
+  (8880000263,1300000000888,1,'2026-04-05','S3','S3_L1_001',18.3736,15.0,'red','down',0,1),
+  (8880000264,1300000000888,1,'2026-04-06','S3','S3_L1_001',18.4701,15.0,'red','flat',0,1),
+  (8880000265,1300000000888,1,'2026-04-07','S3','S3_L1_001',17.9896,15.0,'red','down',0,1),
+  (8880000266,1300000000888,1,'2026-04-08','S3','S3_L1_001',18.4145,15.0,'red','up',0,1),
+  (8880000267,1300000000888,1,'2026-04-09','S3','S3_L1_001',18.9742,15.0,'red','up',0,1),
+  (8880000268,1300000000888,1,'2026-04-10','S3','S3_L1_001',18.0576,15.0,'red','down',0,1),
+  (8880000269,1300000000888,1,'2026-04-11','S3','S3_L1_001',18.6609,15.0,'red','up',0,1),
+  (8880000270,1300000000888,1,'2026-04-12','S3','S3_L1_001',17.5274,15.0,'red','down',0,1),
+  (8880000271,1300000000888,1,'2026-03-14','S3','S3_L1_002',76.2058,95.0,'red','flat',0,1),
+  (8880000272,1300000000888,1,'2026-03-15','S3','S3_L1_002',74.7137,95.0,'red','flat',0,1),
+  (8880000273,1300000000888,1,'2026-03-16','S3','S3_L1_002',79.3644,95.0,'red','up',0,1),
+  (8880000274,1300000000888,1,'2026-03-17','S3','S3_L1_002',74.0676,95.0,'red','down',0,1),
+  (8880000275,1300000000888,1,'2026-03-18','S3','S3_L1_002',73.9853,95.0,'red','flat',0,1),
+  (8880000276,1300000000888,1,'2026-03-19','S3','S3_L1_002',68.7911,95.0,'red','down',0,1),
+  (8880000277,1300000000888,1,'2026-03-20','S3','S3_L1_002',78.9801,95.0,'red','up',0,1),
+  (8880000278,1300000000888,1,'2026-03-21','S3','S3_L1_002',74.1698,95.0,'red','down',0,1),
+  (8880000279,1300000000888,1,'2026-03-22','S3','S3_L1_002',72.354,95.0,'red','down',0,1),
+  (8880000280,1300000000888,1,'2026-03-23','S3','S3_L1_002',77.972,95.0,'red','up',0,1),
+  (8880000281,1300000000888,1,'2026-03-24','S3','S3_L1_002',77.7799,95.0,'red','flat',0,1),
+  (8880000282,1300000000888,1,'2026-03-25','S3','S3_L1_002',75.2437,95.0,'red','down',0,1),
+  (8880000283,1300000000888,1,'2026-03-26','S3','S3_L1_002',71.7714,95.0,'red','down',0,1),
+  (8880000284,1300000000888,1,'2026-03-27','S3','S3_L1_002',75.9427,95.0,'red','up',0,1),
+  (8880000285,1300000000888,1,'2026-03-28','S3','S3_L1_002',73.6019,95.0,'red','down',0,1),
+  (8880000286,1300000000888,1,'2026-03-29','S3','S3_L1_002',72.3658,95.0,'red','flat',0,1),
+  (8880000287,1300000000888,1,'2026-03-30','S3','S3_L1_002',77.3476,95.0,'red','up',0,1),
+  (8880000288,1300000000888,1,'2026-03-31','S3','S3_L1_002',70.2017,95.0,'red','down',0,1),
+  (8880000289,1300000000888,1,'2026-04-01','S3','S3_L1_002',76.2761,95.0,'red','up',0,1),
+  (8880000290,1300000000888,1,'2026-04-02','S3','S3_L1_002',76.0335,95.0,'red','flat',0,1),
+  (8880000291,1300000000888,1,'2026-04-03','S3','S3_L1_002',79.6148,95.0,'red','up',0,1),
+  (8880000292,1300000000888,1,'2026-04-04','S3','S3_L1_002',75.7316,95.0,'red','down',0,1),
+  (8880000293,1300000000888,1,'2026-04-05','S3','S3_L1_002',70.3685,95.0,'red','down',0,1),
+  (8880000294,1300000000888,1,'2026-04-06','S3','S3_L1_002',73.1187,95.0,'red','up',0,1),
+  (8880000295,1300000000888,1,'2026-04-07','S3','S3_L1_002',75.1455,95.0,'red','up',0,1),
+  (8880000296,1300000000888,1,'2026-04-08','S3','S3_L1_002',75.8,95.0,'red','flat',0,1),
+  (8880000297,1300000000888,1,'2026-04-09','S3','S3_L1_002',77.2068,95.0,'red','flat',0,1),
+  (8880000298,1300000000888,1,'2026-04-10','S3','S3_L1_002',70.5907,95.0,'red','down',0,1),
+  (8880000299,1300000000888,1,'2026-04-11','S3','S3_L1_002',74.2576,95.0,'red','up',0,1),
+  (8880000300,1300000000888,1,'2026-04-12','S3','S3_L1_002',77.1822,95.0,'red','up',0,1),
+  (8880000301,1300000000888,1,'2026-03-14','S3','S3_L1_003',95.0258,106.97,'red','flat',0,1),
+  (8880000302,1300000000888,1,'2026-03-15','S3','S3_L1_003',97.3446,106.97,'red','up',0,1),
+  (8880000303,1300000000888,1,'2026-03-16','S3','S3_L1_003',95.2629,106.97,'red','down',0,1),
+  (8880000304,1300000000888,1,'2026-03-17','S3','S3_L1_003',95.6649,106.97,'red','flat',0,1),
+  (8880000305,1300000000888,1,'2026-03-18','S3','S3_L1_003',94.6544,106.97,'red','flat',0,1),
+  (8880000306,1300000000888,1,'2026-03-19','S3','S3_L1_003',91.363,106.97,'red','down',0,1),
+  (8880000307,1300000000888,1,'2026-03-20','S3','S3_L1_003',94.7471,106.97,'red','up',0,1),
+  (8880000308,1300000000888,1,'2026-03-21','S3','S3_L1_003',91.6007,106.97,'red','down',0,1),
+  (8880000309,1300000000888,1,'2026-03-22','S3','S3_L1_003',95.4331,106.97,'red','up',0,1),
+  (8880000310,1300000000888,1,'2026-03-23','S3','S3_L1_003',91.4739,106.97,'red','down',0,1),
+  (8880000311,1300000000888,1,'2026-03-24','S3','S3_L1_003',97.4433,106.97,'red','up',0,1),
+  (8880000312,1300000000888,1,'2026-03-25','S3','S3_L1_003',96.9668,106.97,'red','flat',0,1),
+  (8880000313,1300000000888,1,'2026-03-26','S3','S3_L1_003',95.633,106.97,'red','flat',0,1),
+  (8880000314,1300000000888,1,'2026-03-27','S3','S3_L1_003',94.5503,106.97,'red','flat',0,1),
+  (8880000315,1300000000888,1,'2026-03-28','S3','S3_L1_003',96.0196,106.97,'red','flat',0,1),
+  (8880000316,1300000000888,1,'2026-03-29','S3','S3_L1_003',89.2447,106.97,'red','down',0,1),
+  (8880000317,1300000000888,1,'2026-03-30','S3','S3_L1_003',91.7147,106.97,'red','up',0,1),
+  (8880000318,1300000000888,1,'2026-03-31','S3','S3_L1_003',94.412,106.97,'red','up',0,1),
+  (8880000319,1300000000888,1,'2026-04-01','S3','S3_L1_003',95.8175,106.97,'red','flat',0,1),
+  (8880000320,1300000000888,1,'2026-04-02','S3','S3_L1_003',94.6093,106.97,'red','flat',0,1),
+  (8880000321,1300000000888,1,'2026-04-03','S3','S3_L1_003',91.977,106.97,'red','down',0,1),
+  (8880000322,1300000000888,1,'2026-04-04','S3','S3_L1_003',95.2149,106.97,'red','up',0,1),
+  (8880000323,1300000000888,1,'2026-04-05','S3','S3_L1_003',93.5444,106.97,'red','flat',0,1),
+  (8880000324,1300000000888,1,'2026-04-06','S3','S3_L1_003',91.795,106.97,'red','flat',0,1),
+  (8880000325,1300000000888,1,'2026-04-07','S3','S3_L1_003',95.7727,106.97,'red','up',0,1),
+  (8880000326,1300000000888,1,'2026-04-08','S3','S3_L1_003',94.2378,106.97,'red','flat',0,1),
+  (8880000327,1300000000888,1,'2026-04-09','S3','S3_L1_003',98.2393,106.97,'red','up',0,1),
+  (8880000328,1300000000888,1,'2026-04-10','S3','S3_L1_003',96.7287,106.97,'red','flat',0,1),
+  (8880000329,1300000000888,1,'2026-04-11','S3','S3_L1_003',96.9254,106.97,'red','flat',0,1),
+  (8880000330,1300000000888,1,'2026-04-12','S3','S3_L1_003',95.7504,106.97,'red','flat',0,1),
+  (8880000331,1300000000888,1,'2026-03-14','S3','S3_L1_004',29.4257,30.0,'green','flat',0,1),
+  (8880000332,1300000000888,1,'2026-03-15','S3','S3_L1_004',27.3191,30.0,'green','down',0,1),
+  (8880000333,1300000000888,1,'2026-03-16','S3','S3_L1_004',27.942,30.0,'green','up',0,1),
+  (8880000334,1300000000888,1,'2026-03-17','S3','S3_L1_004',28.5267,30.0,'green','up',0,1),
+  (8880000335,1300000000888,1,'2026-03-18','S3','S3_L1_004',27.7885,30.0,'green','down',0,1),
+  (8880000336,1300000000888,1,'2026-03-19','S3','S3_L1_004',27.3095,30.0,'green','flat',0,1),
+  (8880000337,1300000000888,1,'2026-03-20','S3','S3_L1_004',27.9503,30.0,'green','up',0,1),
+  (8880000338,1300000000888,1,'2026-03-21','S3','S3_L1_004',28.0785,30.0,'green','flat',0,1),
+  (8880000339,1300000000888,1,'2026-03-22','S3','S3_L1_004',28.7426,30.0,'green','up',0,1),
+  (8880000340,1300000000888,1,'2026-03-23','S3','S3_L1_004',27.2078,30.0,'green','down',0,1),
+  (8880000341,1300000000888,1,'2026-03-24','S3','S3_L1_004',27.6227,30.0,'green','flat',0,1),
+  (8880000342,1300000000888,1,'2026-03-25','S3','S3_L1_004',28.2713,30.0,'green','up',0,1),
+  (8880000343,1300000000888,1,'2026-03-26','S3','S3_L1_004',27.8596,30.0,'green','flat',0,1),
+  (8880000344,1300000000888,1,'2026-03-27','S3','S3_L1_004',27.8444,30.0,'green','flat',0,1),
+  (8880000345,1300000000888,1,'2026-03-28','S3','S3_L1_004',27.9857,30.0,'green','flat',0,1),
+  (8880000346,1300000000888,1,'2026-03-29','S3','S3_L1_004',27.4155,30.0,'green','down',0,1),
+  (8880000347,1300000000888,1,'2026-03-30','S3','S3_L1_004',27.3283,30.0,'green','flat',0,1),
+  (8880000348,1300000000888,1,'2026-03-31','S3','S3_L1_004',28.3702,30.0,'green','up',0,1),
+  (8880000349,1300000000888,1,'2026-04-01','S3','S3_L1_004',27.0801,30.0,'green','down',0,1),
+  (8880000350,1300000000888,1,'2026-04-02','S3','S3_L1_004',28.9789,30.0,'green','up',0,1),
+  (8880000351,1300000000888,1,'2026-04-03','S3','S3_L1_004',28.1825,30.0,'green','down',0,1),
+  (8880000352,1300000000888,1,'2026-04-04','S3','S3_L1_004',26.9277,30.0,'green','down',0,1),
+  (8880000353,1300000000888,1,'2026-04-05','S3','S3_L1_004',28.2377,30.0,'green','up',0,1),
+  (8880000354,1300000000888,1,'2026-04-06','S3','S3_L1_004',28.1405,30.0,'green','flat',0,1),
+  (8880000355,1300000000888,1,'2026-04-07','S3','S3_L1_004',28.6402,30.0,'green','flat',0,1),
+  (8880000356,1300000000888,1,'2026-04-08','S3','S3_L1_004',28.9734,30.0,'green','flat',0,1),
+  (8880000357,1300000000888,1,'2026-04-09','S3','S3_L1_004',27.6922,30.0,'green','down',0,1),
+  (8880000358,1300000000888,1,'2026-04-10','S3','S3_L1_004',27.4055,30.0,'green','flat',0,1),
+  (8880000359,1300000000888,1,'2026-04-11','S3','S3_L1_004',27.491,30.0,'green','flat',0,1),
+  (8880000360,1300000000888,1,'2026-04-12','S3','S3_L1_004',27.1759,30.0,'green','flat',0,1),
+  (8880000361,1300000000888,1,'2026-03-14','S4','S4_L1_001',10.6364,10.26,'yellow','flat',0,1),
+  (8880000362,1300000000888,1,'2026-03-15','S4','S4_L1_001',10.331,10.26,'yellow','down',0,1),
+  (8880000363,1300000000888,1,'2026-03-16','S4','S4_L1_001',10.6711,10.26,'yellow','up',0,1),
+  (8880000364,1300000000888,1,'2026-03-17','S4','S4_L1_001',10.711,10.26,'yellow','flat',0,1),
+  (8880000365,1300000000888,1,'2026-03-18','S4','S4_L1_001',10.1164,10.26,'green','down',0,1),
+  (8880000366,1300000000888,1,'2026-03-19','S4','S4_L1_001',10.2234,10.26,'green','flat',0,1),
+  (8880000367,1300000000888,1,'2026-03-20','S4','S4_L1_001',10.4336,10.26,'yellow','up',0,1),
+  (8880000368,1300000000888,1,'2026-03-21','S4','S4_L1_001',10.3804,10.26,'yellow','flat',0,1),
+  (8880000369,1300000000888,1,'2026-03-22','S4','S4_L1_001',10.5969,10.26,'yellow','up',0,1),
+  (8880000370,1300000000888,1,'2026-03-23','S4','S4_L1_001',10.1786,10.26,'green','down',0,1),
+  (8880000371,1300000000888,1,'2026-03-24','S4','S4_L1_001',10.559,10.26,'yellow','up',0,1),
+  (8880000372,1300000000888,1,'2026-03-25','S4','S4_L1_001',10.01,10.26,'green','down',0,1),
+  (8880000373,1300000000888,1,'2026-03-26','S4','S4_L1_001',9.8624,10.26,'green','flat',0,1),
+  (8880000374,1300000000888,1,'2026-03-27','S4','S4_L1_001',10.7708,10.26,'yellow','up',0,1),
+  (8880000375,1300000000888,1,'2026-03-28','S4','S4_L1_001',10.1312,10.26,'green','down',0,1),
+  (8880000376,1300000000888,1,'2026-03-29','S4','S4_L1_001',10.367,10.26,'yellow','up',0,1),
+  (8880000377,1300000000888,1,'2026-03-30','S4','S4_L1_001',10.0958,10.26,'green','down',0,1),
+  (8880000378,1300000000888,1,'2026-03-31','S4','S4_L1_001',10.0984,10.26,'green','flat',0,1),
+  (8880000379,1300000000888,1,'2026-04-01','S4','S4_L1_001',10.4179,10.26,'yellow','up',0,1),
+  (8880000380,1300000000888,1,'2026-04-02','S4','S4_L1_001',10.4144,10.26,'yellow','flat',0,1),
+  (8880000381,1300000000888,1,'2026-04-03','S4','S4_L1_001',10.8549,10.26,'yellow','up',0,1),
+  (8880000382,1300000000888,1,'2026-04-04','S4','S4_L1_001',10.6863,10.26,'yellow','flat',0,1),
+  (8880000383,1300000000888,1,'2026-04-05','S4','S4_L1_001',10.4615,10.26,'yellow','down',0,1),
+  (8880000384,1300000000888,1,'2026-04-06','S4','S4_L1_001',10.7838,10.26,'yellow','up',0,1),
+  (8880000385,1300000000888,1,'2026-04-07','S4','S4_L1_001',10.8973,10.26,'yellow','flat',0,1),
+  (8880000386,1300000000888,1,'2026-04-08','S4','S4_L1_001',10.6742,10.26,'yellow','down',0,1),
+  (8880000387,1300000000888,1,'2026-04-09','S4','S4_L1_001',10.4156,10.26,'yellow','down',0,1),
+  (8880000388,1300000000888,1,'2026-04-10','S4','S4_L1_001',10.8663,10.26,'yellow','up',0,1),
+  (8880000389,1300000000888,1,'2026-04-11','S4','S4_L1_001',11.1035,10.26,'yellow','up',0,1),
+  (8880000390,1300000000888,1,'2026-04-12','S4','S4_L1_001',10.753,10.26,'yellow','down',0,1),
+  (8880000391,1300000000888,1,'2026-03-14','S4','S4_L1_002',95.1439,99.0,'yellow','flat',0,1),
+  (8880000392,1300000000888,1,'2026-03-15','S4','S4_L1_002',94.5751,99.0,'yellow','flat',0,1),
+  (8880000393,1300000000888,1,'2026-03-16','S4','S4_L1_002',95.2153,99.0,'yellow','flat',0,1),
+  (8880000394,1300000000888,1,'2026-03-17','S4','S4_L1_002',99.1076,99.0,'green','up',0,1),
+  (8880000395,1300000000888,1,'2026-03-18','S4','S4_L1_002',97.8573,99.0,'yellow','flat',0,1),
+  (8880000396,1300000000888,1,'2026-03-19','S4','S4_L1_002',98.8296,99.0,'yellow','flat',0,1),
+  (8880000397,1300000000888,1,'2026-03-20','S4','S4_L1_002',100.1787,99.0,'green','flat',0,1),
+  (8880000398,1300000000888,1,'2026-03-21','S4','S4_L1_002',95.9154,99.0,'yellow','down',0,1),
+  (8880000399,1300000000888,1,'2026-03-22','S4','S4_L1_002',97.2325,99.0,'yellow','flat',0,1),
+  (8880000400,1300000000888,1,'2026-03-23','S4','S4_L1_002',98.566,99.0,'yellow','flat',0,1),
+  (8880000401,1300000000888,1,'2026-03-24','S4','S4_L1_002',101.9666,99.0,'green','up',0,1),
+  (8880000402,1300000000888,1,'2026-03-25','S4','S4_L1_002',99.6163,99.0,'green','down',0,1),
+  (8880000403,1300000000888,1,'2026-03-26','S4','S4_L1_002',101.0203,99.0,'green','flat',0,1),
+  (8880000404,1300000000888,1,'2026-03-27','S4','S4_L1_002',99.9652,99.0,'green','flat',0,1),
+  (8880000405,1300000000888,1,'2026-03-28','S4','S4_L1_002',100.0766,99.0,'green','flat',0,1),
+  (8880000406,1300000000888,1,'2026-03-29','S4','S4_L1_002',91.8066,99.0,'red','down',0,1),
+  (8880000407,1300000000888,1,'2026-03-30','S4','S4_L1_002',99.5633,99.0,'green','up',0,1),
+  (8880000408,1300000000888,1,'2026-03-31','S4','S4_L1_002',97.6196,99.0,'yellow','flat',0,1),
+  (8880000409,1300000000888,1,'2026-04-01','S4','S4_L1_002',97.1578,99.0,'yellow','flat',0,1),
+  (8880000410,1300000000888,1,'2026-04-02','S4','S4_L1_002',95.4657,99.0,'yellow','flat',0,1),
+  (8880000411,1300000000888,1,'2026-04-03','S4','S4_L1_002',95.7625,99.0,'yellow','flat',0,1),
+  (8880000412,1300000000888,1,'2026-04-04','S4','S4_L1_002',98.2111,99.0,'yellow','up',0,1),
+  (8880000413,1300000000888,1,'2026-04-05','S4','S4_L1_002',99.4443,99.0,'green','flat',0,1),
+  (8880000414,1300000000888,1,'2026-04-06','S4','S4_L1_002',92.6414,99.0,'red','down',0,1),
+  (8880000415,1300000000888,1,'2026-04-07','S4','S4_L1_002',97.6347,99.0,'yellow','up',0,1),
+  (8880000416,1300000000888,1,'2026-04-08','S4','S4_L1_002',95.3684,99.0,'yellow','down',0,1),
+  (8880000417,1300000000888,1,'2026-04-09','S4','S4_L1_002',94.2332,99.0,'yellow','flat',0,1),
+  (8880000418,1300000000888,1,'2026-04-10','S4','S4_L1_002',98.1425,99.0,'yellow','up',0,1),
+  (8880000419,1300000000888,1,'2026-04-11','S4','S4_L1_002',96.0434,99.0,'yellow','down',0,1),
+  (8880000420,1300000000888,1,'2026-04-12','S4','S4_L1_002',95.0822,99.0,'yellow','flat',0,1),
+  (8880000421,1300000000888,1,'2026-03-14','S4','S4_L1_003',202.4845,212.01,'yellow','flat',0,1),
+  (8880000422,1300000000888,1,'2026-03-15','S4','S4_L1_003',196.1468,212.01,'red','down',0,1),
+  (8880000423,1300000000888,1,'2026-03-16','S4','S4_L1_003',207.4057,212.01,'yellow','up',0,1),
+  (8880000424,1300000000888,1,'2026-03-17','S4','S4_L1_003',206.7886,212.01,'yellow','flat',0,1),
+  (8880000425,1300000000888,1,'2026-03-18','S4','S4_L1_003',202.9474,212.01,'yellow','flat',0,1),
+  (8880000426,1300000000888,1,'2026-03-19','S4','S4_L1_003',205.3632,212.01,'yellow','flat',0,1),
+  (8880000427,1300000000888,1,'2026-03-20','S4','S4_L1_003',194.0459,212.01,'red','down',0,1),
+  (8880000428,1300000000888,1,'2026-03-21','S4','S4_L1_003',208.7897,212.01,'yellow','up',0,1),
+  (8880000429,1300000000888,1,'2026-03-22','S4','S4_L1_003',200.6974,212.01,'red','down',0,1),
+  (8880000430,1300000000888,1,'2026-03-23','S4','S4_L1_003',204.3389,212.01,'yellow','flat',0,1),
+  (8880000431,1300000000888,1,'2026-03-24','S4','S4_L1_003',210.3618,212.01,'yellow','up',0,1),
+  (8880000432,1300000000888,1,'2026-03-25','S4','S4_L1_003',198.9312,212.01,'red','down',0,1),
+  (8880000433,1300000000888,1,'2026-03-26','S4','S4_L1_003',210.8617,212.01,'yellow','up',0,1),
+  (8880000434,1300000000888,1,'2026-03-27','S4','S4_L1_003',204.3085,212.01,'yellow','down',0,1),
+  (8880000435,1300000000888,1,'2026-03-28','S4','S4_L1_003',203.7229,212.01,'yellow','flat',0,1),
+  (8880000436,1300000000888,1,'2026-03-29','S4','S4_L1_003',206.9463,212.01,'yellow','flat',0,1),
+  (8880000437,1300000000888,1,'2026-03-30','S4','S4_L1_003',195.9358,212.01,'red','down',0,1),
+  (8880000438,1300000000888,1,'2026-03-31','S4','S4_L1_003',207.1787,212.01,'yellow','up',0,1),
+  (8880000439,1300000000888,1,'2026-04-01','S4','S4_L1_003',203.9264,212.01,'yellow','flat',0,1),
+  (8880000440,1300000000888,1,'2026-04-02','S4','S4_L1_003',209.8789,212.01,'yellow','up',0,1),
+  (8880000441,1300000000888,1,'2026-04-03','S4','S4_L1_003',202.2269,212.01,'yellow','down',0,1),
+  (8880000442,1300000000888,1,'2026-04-04','S4','S4_L1_003',201.3322,212.01,'red','flat',0,1),
+  (8880000443,1300000000888,1,'2026-04-05','S4','S4_L1_003',205.808,212.01,'yellow','up',0,1),
+  (8880000444,1300000000888,1,'2026-04-06','S4','S4_L1_003',203.1883,212.01,'yellow','flat',0,1),
+  (8880000445,1300000000888,1,'2026-04-07','S4','S4_L1_003',196.3819,212.01,'red','down',0,1),
+  (8880000446,1300000000888,1,'2026-04-08','S4','S4_L1_003',202.3664,212.01,'yellow','up',0,1),
+  (8880000447,1300000000888,1,'2026-04-09','S4','S4_L1_003',211.2916,212.01,'yellow','up',0,1),
+  (8880000448,1300000000888,1,'2026-04-10','S4','S4_L1_003',202.9823,212.01,'yellow','down',0,1),
+  (8880000449,1300000000888,1,'2026-04-11','S4','S4_L1_003',198.2353,212.01,'red','down',0,1),
+  (8880000450,1300000000888,1,'2026-04-12','S4','S4_L1_003',207.9227,212.01,'yellow','up',0,1),
+  (8880000451,1300000000888,1,'2026-03-14','S4','S4_L1_004',26.8508,30.0,'green','flat',0,1),
+  (8880000452,1300000000888,1,'2026-03-15','S4','S4_L1_004',28.5754,30.0,'green','up',0,1),
+  (8880000453,1300000000888,1,'2026-03-16','S4','S4_L1_004',27.8528,30.0,'green','down',0,1),
+  (8880000454,1300000000888,1,'2026-03-17','S4','S4_L1_004',28.1985,30.0,'green','flat',0,1),
+  (8880000455,1300000000888,1,'2026-03-18','S4','S4_L1_004',28.5363,30.0,'green','flat',0,1),
+  (8880000456,1300000000888,1,'2026-03-19','S4','S4_L1_004',27.4292,30.0,'green','down',0,1),
+  (8880000457,1300000000888,1,'2026-03-20','S4','S4_L1_004',28.673,30.0,'green','up',0,1),
+  (8880000458,1300000000888,1,'2026-03-21','S4','S4_L1_004',27.9922,30.0,'green','down',0,1),
+  (8880000459,1300000000888,1,'2026-03-22','S4','S4_L1_004',30.0259,30.0,'yellow','up',0,1),
+  (8880000460,1300000000888,1,'2026-03-23','S4','S4_L1_004',27.7444,30.0,'green','down',0,1),
+  (8880000461,1300000000888,1,'2026-03-24','S4','S4_L1_004',29.0661,30.0,'green','up',0,1),
+  (8880000462,1300000000888,1,'2026-03-25','S4','S4_L1_004',28.5436,30.0,'green','flat',0,1),
+  (8880000463,1300000000888,1,'2026-03-26','S4','S4_L1_004',27.0137,30.0,'green','down',0,1),
+  (8880000464,1300000000888,1,'2026-03-27','S4','S4_L1_004',29.1429,30.0,'green','up',0,1),
+  (8880000465,1300000000888,1,'2026-03-28','S4','S4_L1_004',27.1093,30.0,'green','down',0,1),
+  (8880000466,1300000000888,1,'2026-03-29','S4','S4_L1_004',26.1251,30.0,'green','down',0,1),
+  (8880000467,1300000000888,1,'2026-03-30','S4','S4_L1_004',28.7168,30.0,'green','up',0,1),
+  (8880000468,1300000000888,1,'2026-03-31','S4','S4_L1_004',28.8979,30.0,'green','flat',0,1),
+  (8880000469,1300000000888,1,'2026-04-01','S4','S4_L1_004',28.0437,30.0,'green','down',0,1),
+  (8880000470,1300000000888,1,'2026-04-02','S4','S4_L1_004',27.7807,30.0,'green','flat',0,1),
+  (8880000471,1300000000888,1,'2026-04-03','S4','S4_L1_004',29.3303,30.0,'green','up',0,1),
+  (8880000472,1300000000888,1,'2026-04-04','S4','S4_L1_004',28.598,30.0,'green','down',0,1),
+  (8880000473,1300000000888,1,'2026-04-05','S4','S4_L1_004',27.4491,30.0,'green','down',0,1),
+  (8880000474,1300000000888,1,'2026-04-06','S4','S4_L1_004',28.6145,30.0,'green','up',0,1),
+  (8880000475,1300000000888,1,'2026-04-07','S4','S4_L1_004',26.9556,30.0,'green','down',0,1),
+  (8880000476,1300000000888,1,'2026-04-08','S4','S4_L1_004',27.5305,30.0,'green','up',0,1),
+  (8880000477,1300000000888,1,'2026-04-09','S4','S4_L1_004',27.1171,30.0,'green','flat',0,1),
+  (8880000478,1300000000888,1,'2026-04-10','S4','S4_L1_004',26.152,30.0,'green','down',0,1),
+  (8880000479,1300000000888,1,'2026-04-11','S4','S4_L1_004',27.0111,30.0,'green','up',0,1),
+  (8880000480,1300000000888,1,'2026-04-12','S4','S4_L1_004',29.0268,30.0,'green','up',0,1),
+  (8880000481,1300000000888,1,'2026-03-14','S5','S5_L1_001',12.0972,14.0,'green','flat',0,1),
+  (8880000482,1300000000888,1,'2026-03-15','S5','S5_L1_001',11.4948,14.0,'green','down',0,1),
+  (8880000483,1300000000888,1,'2026-03-16','S5','S5_L1_001',12.3886,14.0,'green','up',0,1),
+  (8880000484,1300000000888,1,'2026-03-17','S5','S5_L1_001',12.8529,14.0,'green','up',0,1),
+  (8880000485,1300000000888,1,'2026-03-18','S5','S5_L1_001',11.2785,14.0,'green','down',0,1),
+  (8880000486,1300000000888,1,'2026-03-19','S5','S5_L1_001',12.3251,14.0,'green','up',0,1),
+  (8880000487,1300000000888,1,'2026-03-20','S5','S5_L1_001',12.1742,14.0,'green','flat',0,1),
+  (8880000488,1300000000888,1,'2026-03-21','S5','S5_L1_001',12.0632,14.0,'green','flat',0,1),
+  (8880000489,1300000000888,1,'2026-03-22','S5','S5_L1_001',12.1236,14.0,'green','flat',0,1),
+  (8880000490,1300000000888,1,'2026-03-23','S5','S5_L1_001',12.1771,14.0,'green','flat',0,1),
+  (8880000491,1300000000888,1,'2026-03-24','S5','S5_L1_001',11.7505,14.0,'green','down',0,1),
+  (8880000492,1300000000888,1,'2026-03-25','S5','S5_L1_001',12.508,14.0,'green','up',0,1),
+  (8880000493,1300000000888,1,'2026-03-26','S5','S5_L1_001',11.5142,14.0,'green','down',0,1),
+  (8880000494,1300000000888,1,'2026-03-27','S5','S5_L1_001',12.7051,14.0,'green','up',0,1),
+  (8880000495,1300000000888,1,'2026-03-28','S5','S5_L1_001',12.55,14.0,'green','flat',0,1),
+  (8880000496,1300000000888,1,'2026-03-29','S5','S5_L1_001',11.573,14.0,'green','down',0,1),
+  (8880000497,1300000000888,1,'2026-03-30','S5','S5_L1_001',11.9981,14.0,'green','up',0,1),
+  (8880000498,1300000000888,1,'2026-03-31','S5','S5_L1_001',12.5111,14.0,'green','up',0,1),
+  (8880000499,1300000000888,1,'2026-04-01','S5','S5_L1_001',11.8232,14.0,'green','down',0,1),
+  (8880000500,1300000000888,1,'2026-04-02','S5','S5_L1_001',11.9415,14.0,'green','flat',0,1),
+  (8880000501,1300000000888,1,'2026-04-03','S5','S5_L1_001',11.8551,14.0,'green','flat',0,1),
+  (8880000502,1300000000888,1,'2026-04-04','S5','S5_L1_001',12.4203,14.0,'green','up',0,1),
+  (8880000503,1300000000888,1,'2026-04-05','S5','S5_L1_001',11.7812,14.0,'green','down',0,1),
+  (8880000504,1300000000888,1,'2026-04-06','S5','S5_L1_001',11.9965,14.0,'green','flat',0,1),
+  (8880000505,1300000000888,1,'2026-04-07','S5','S5_L1_001',12.1945,14.0,'green','flat',0,1),
+  (8880000506,1300000000888,1,'2026-04-08','S5','S5_L1_001',11.9253,14.0,'green','down',0,1),
+  (8880000507,1300000000888,1,'2026-04-09','S5','S5_L1_001',11.6881,14.0,'green','flat',0,1),
+  (8880000508,1300000000888,1,'2026-04-10','S5','S5_L1_001',11.517,14.0,'green','flat',0,1),
+  (8880000509,1300000000888,1,'2026-04-11','S5','S5_L1_001',11.4534,14.0,'green','flat',0,1),
+  (8880000510,1300000000888,1,'2026-04-12','S5','S5_L1_001',11.5753,14.0,'green','flat',0,1),
+  (8880000511,1300000000888,1,'2026-03-14','S5','S5_L1_002',96.1235,99.0,'yellow','flat',0,1),
+  (8880000512,1300000000888,1,'2026-03-15','S5','S5_L1_002',95.2663,99.0,'yellow','flat',0,1),
+  (8880000513,1300000000888,1,'2026-03-16','S5','S5_L1_002',92.4522,99.0,'red','down',0,1),
+  (8880000514,1300000000888,1,'2026-03-17','S5','S5_L1_002',96.6979,99.0,'yellow','up',0,1),
+  (8880000515,1300000000888,1,'2026-03-18','S5','S5_L1_002',92.4803,99.0,'red','down',0,1),
+  (8880000516,1300000000888,1,'2026-03-19','S5','S5_L1_002',100.5582,99.0,'green','up',0,1),
+  (8880000517,1300000000888,1,'2026-03-20','S5','S5_L1_002',97.2964,99.0,'yellow','down',0,1),
+  (8880000518,1300000000888,1,'2026-03-21','S5','S5_L1_002',93.0547,99.0,'red','down',0,1),
+  (8880000519,1300000000888,1,'2026-03-22','S5','S5_L1_002',96.0198,99.0,'yellow','up',0,1),
+  (8880000520,1300000000888,1,'2026-03-23','S5','S5_L1_002',100.2196,99.0,'green','up',0,1),
+  (8880000521,1300000000888,1,'2026-03-24','S5','S5_L1_002',96.251,99.0,'yellow','down',0,1),
+  (8880000522,1300000000888,1,'2026-03-25','S5','S5_L1_002',97.1732,99.0,'yellow','flat',0,1),
+  (8880000523,1300000000888,1,'2026-03-26','S5','S5_L1_002',96.9146,99.0,'yellow','flat',0,1),
+  (8880000524,1300000000888,1,'2026-03-27','S5','S5_L1_002',97.6229,99.0,'yellow','flat',0,1),
+  (8880000525,1300000000888,1,'2026-03-28','S5','S5_L1_002',93.0027,99.0,'red','down',0,1),
+  (8880000526,1300000000888,1,'2026-03-29','S5','S5_L1_002',97.8663,99.0,'yellow','up',0,1),
+  (8880000527,1300000000888,1,'2026-03-30','S5','S5_L1_002',96.3592,99.0,'yellow','flat',0,1),
+  (8880000528,1300000000888,1,'2026-03-31','S5','S5_L1_002',106.6841,99.0,'green','up',0,1),
+  (8880000529,1300000000888,1,'2026-04-01','S5','S5_L1_002',97.3738,99.0,'yellow','down',0,1),
+  (8880000530,1300000000888,1,'2026-04-02','S5','S5_L1_002',96.6605,99.0,'yellow','flat',0,1),
+  (8880000531,1300000000888,1,'2026-04-03','S5','S5_L1_002',100.9061,99.0,'green','up',0,1),
+  (8880000532,1300000000888,1,'2026-04-04','S5','S5_L1_002',97.5413,99.0,'yellow','down',0,1),
+  (8880000533,1300000000888,1,'2026-04-05','S5','S5_L1_002',98.7448,99.0,'yellow','flat',0,1),
+  (8880000534,1300000000888,1,'2026-04-06','S5','S5_L1_002',95.4301,99.0,'yellow','down',0,1),
+  (8880000535,1300000000888,1,'2026-04-07','S5','S5_L1_002',102.5724,99.0,'green','up',0,1),
+  (8880000536,1300000000888,1,'2026-04-08','S5','S5_L1_002',96.1546,99.0,'yellow','down',0,1),
+  (8880000537,1300000000888,1,'2026-04-09','S5','S5_L1_002',99.1035,99.0,'green','up',0,1),
+  (8880000538,1300000000888,1,'2026-04-10','S5','S5_L1_002',101.3291,99.0,'green','up',0,1),
+  (8880000539,1300000000888,1,'2026-04-11','S5','S5_L1_002',97.1048,99.0,'yellow','down',0,1),
+  (8880000540,1300000000888,1,'2026-04-12','S5','S5_L1_002',97.9996,99.0,'yellow','flat',0,1),
+  (8880000541,1300000000888,1,'2026-03-14','S5','S5_L1_003',9.8462,7.0,'green','flat',0,1),
+  (8880000542,1300000000888,1,'2026-03-15','S5','S5_L1_003',10.2347,7.0,'green','up',0,1),
+  (8880000543,1300000000888,1,'2026-03-16','S5','S5_L1_003',10.066,7.0,'green','flat',0,1),
+  (8880000544,1300000000888,1,'2026-03-17','S5','S5_L1_003',9.5253,7.0,'green','down',0,1),
+  (8880000545,1300000000888,1,'2026-03-18','S5','S5_L1_003',9.7134,7.0,'green','flat',0,1),
+  (8880000546,1300000000888,1,'2026-03-19','S5','S5_L1_003',9.6386,7.0,'green','flat',0,1),
+  (8880000547,1300000000888,1,'2026-03-20','S5','S5_L1_003',9.849,7.0,'green','up',0,1),
+  (8880000548,1300000000888,1,'2026-03-21','S5','S5_L1_003',9.875,7.0,'green','flat',0,1),
+  (8880000549,1300000000888,1,'2026-03-22','S5','S5_L1_003',10.0084,7.0,'green','flat',0,1),
+  (8880000550,1300000000888,1,'2026-03-23','S5','S5_L1_003',10.3833,7.0,'green','up',0,1),
+  (8880000551,1300000000888,1,'2026-03-24','S5','S5_L1_003',10.1267,7.0,'green','down',0,1),
+  (8880000552,1300000000888,1,'2026-03-25','S5','S5_L1_003',10.7959,7.0,'green','up',0,1),
+  (8880000553,1300000000888,1,'2026-03-26','S5','S5_L1_003',9.927,7.0,'green','down',0,1),
+  (8880000554,1300000000888,1,'2026-03-27','S5','S5_L1_003',10.2368,7.0,'green','up',0,1),
+  (8880000555,1300000000888,1,'2026-03-28','S5','S5_L1_003',10.1243,7.0,'green','flat',0,1),
+  (8880000556,1300000000888,1,'2026-03-29','S5','S5_L1_003',10.452,7.0,'green','up',0,1),
+  (8880000557,1300000000888,1,'2026-03-30','S5','S5_L1_003',9.8864,7.0,'green','down',0,1),
+  (8880000558,1300000000888,1,'2026-03-31','S5','S5_L1_003',10.2536,7.0,'green','up',0,1),
+  (8880000559,1300000000888,1,'2026-04-01','S5','S5_L1_003',10.4887,7.0,'green','up',0,1),
+  (8880000560,1300000000888,1,'2026-04-02','S5','S5_L1_003',9.7838,7.0,'green','down',0,1),
+  (8880000561,1300000000888,1,'2026-04-03','S5','S5_L1_003',9.9775,7.0,'green','flat',0,1),
+  (8880000562,1300000000888,1,'2026-04-04','S5','S5_L1_003',10.1513,7.0,'green','flat',0,1),
+  (8880000563,1300000000888,1,'2026-04-05','S5','S5_L1_003',9.8696,7.0,'green','down',0,1),
+  (8880000564,1300000000888,1,'2026-04-06','S5','S5_L1_003',9.7374,7.0,'green','flat',0,1),
+  (8880000565,1300000000888,1,'2026-04-07','S5','S5_L1_003',10.5498,7.0,'green','up',0,1),
+  (8880000566,1300000000888,1,'2026-04-08','S5','S5_L1_003',9.9311,7.0,'green','down',0,1),
+  (8880000567,1300000000888,1,'2026-04-09','S5','S5_L1_003',10.5202,7.0,'green','up',0,1),
+  (8880000568,1300000000888,1,'2026-04-10','S5','S5_L1_003',9.8475,7.0,'green','down',0,1),
+  (8880000569,1300000000888,1,'2026-04-11','S5','S5_L1_003',9.9379,7.0,'green','flat',0,1),
+  (8880000570,1300000000888,1,'2026-04-12','S5','S5_L1_003',10.2391,7.0,'green','up',0,1),
+  (8880000571,1300000000888,1,'2026-03-14','S6','S6_L1_001',15.9114,14.95,'yellow','flat',0,1),
+  (8880000572,1300000000888,1,'2026-03-15','S6','S6_L1_001',16.2872,14.95,'yellow','up',0,1),
+  (8880000573,1300000000888,1,'2026-03-16','S6','S6_L1_001',16.4438,14.95,'yellow','flat',0,1),
+  (8880000574,1300000000888,1,'2026-03-17','S6','S6_L1_001',16.412,14.95,'yellow','flat',0,1),
+  (8880000575,1300000000888,1,'2026-03-18','S6','S6_L1_001',15.8607,14.95,'yellow','down',0,1),
+  (8880000576,1300000000888,1,'2026-03-19','S6','S6_L1_001',16.3194,14.95,'yellow','up',0,1),
+  (8880000577,1300000000888,1,'2026-03-20','S6','S6_L1_001',16.5338,14.95,'red','flat',0,1),
+  (8880000578,1300000000888,1,'2026-03-21','S6','S6_L1_001',16.9556,14.95,'red','up',0,1),
+  (8880000579,1300000000888,1,'2026-03-22','S6','S6_L1_001',16.3833,14.95,'yellow','down',0,1),
+  (8880000580,1300000000888,1,'2026-03-23','S6','S6_L1_001',15.6138,14.95,'yellow','down',0,1),
+  (8880000581,1300000000888,1,'2026-03-24','S6','S6_L1_001',16.2374,14.95,'yellow','up',0,1),
+  (8880000582,1300000000888,1,'2026-03-25','S6','S6_L1_001',15.9216,14.95,'yellow','flat',0,1),
+  (8880000583,1300000000888,1,'2026-03-26','S6','S6_L1_001',16.8656,14.95,'red','up',0,1),
+  (8880000584,1300000000888,1,'2026-03-27','S6','S6_L1_001',15.4082,14.95,'yellow','down',0,1),
+  (8880000585,1300000000888,1,'2026-03-28','S6','S6_L1_001',16.496,14.95,'red','up',0,1),
+  (8880000586,1300000000888,1,'2026-03-29','S6','S6_L1_001',15.7051,14.95,'yellow','down',0,1),
+  (8880000587,1300000000888,1,'2026-03-30','S6','S6_L1_001',16.8427,14.95,'red','up',0,1),
+  (8880000588,1300000000888,1,'2026-03-31','S6','S6_L1_001',16.5989,14.95,'red','flat',0,1),
+  (8880000589,1300000000888,1,'2026-04-01','S6','S6_L1_001',16.3304,14.95,'yellow','flat',0,1),
+  (8880000590,1300000000888,1,'2026-04-02','S6','S6_L1_001',16.4694,14.95,'red','flat',0,1),
+  (8880000591,1300000000888,1,'2026-04-03','S6','S6_L1_001',16.0596,14.95,'yellow','down',0,1),
+  (8880000592,1300000000888,1,'2026-04-04','S6','S6_L1_001',16.5525,14.95,'red','up',0,1),
+  (8880000593,1300000000888,1,'2026-04-05','S6','S6_L1_001',16.1994,14.95,'yellow','down',0,1),
+  (8880000594,1300000000888,1,'2026-04-06','S6','S6_L1_001',16.5795,14.95,'red','up',0,1),
+  (8880000595,1300000000888,1,'2026-04-07','S6','S6_L1_001',16.2521,14.95,'yellow','flat',0,1),
+  (8880000596,1300000000888,1,'2026-04-08','S6','S6_L1_001',15.016,14.95,'yellow','down',0,1),
+  (8880000597,1300000000888,1,'2026-04-09','S6','S6_L1_001',15.9736,14.95,'yellow','up',0,1),
+  (8880000598,1300000000888,1,'2026-04-10','S6','S6_L1_001',16.9622,14.95,'red','up',0,1),
+  (8880000599,1300000000888,1,'2026-04-11','S6','S6_L1_001',16.9306,14.95,'red','flat',0,1),
+  (8880000600,1300000000888,1,'2026-04-12','S6','S6_L1_001',16.2745,14.95,'yellow','down',0,1),
+  (8880000601,1300000000888,1,'2026-03-14','S6','S6_L1_002',85.8841,98.0,'red','flat',0,1),
+  (8880000602,1300000000888,1,'2026-03-15','S6','S6_L1_002',84.6147,98.0,'red','flat',0,1),
+  (8880000603,1300000000888,1,'2026-03-16','S6','S6_L1_002',85.5924,98.0,'red','flat',0,1),
+  (8880000604,1300000000888,1,'2026-03-17','S6','S6_L1_002',84.7382,98.0,'red','flat',0,1),
+  (8880000605,1300000000888,1,'2026-03-18','S6','S6_L1_002',81.3311,98.0,'red','down',0,1),
+  (8880000606,1300000000888,1,'2026-03-19','S6','S6_L1_002',87.3652,98.0,'red','up',0,1),
+  (8880000607,1300000000888,1,'2026-03-20','S6','S6_L1_002',85.7009,98.0,'red','flat',0,1),
+  (8880000608,1300000000888,1,'2026-03-21','S6','S6_L1_002',77.9755,98.0,'red','down',0,1),
+  (8880000609,1300000000888,1,'2026-03-22','S6','S6_L1_002',83.3794,98.0,'red','up',0,1),
+  (8880000610,1300000000888,1,'2026-03-23','S6','S6_L1_002',82.8867,98.0,'red','flat',0,1),
+  (8880000611,1300000000888,1,'2026-03-24','S6','S6_L1_002',87.5013,98.0,'red','up',0,1),
+  (8880000612,1300000000888,1,'2026-03-25','S6','S6_L1_002',84.8877,98.0,'red','down',0,1),
+  (8880000613,1300000000888,1,'2026-03-26','S6','S6_L1_002',88.7929,98.0,'red','up',0,1),
+  (8880000614,1300000000888,1,'2026-03-27','S6','S6_L1_002',80.9416,98.0,'red','down',0,1),
+  (8880000615,1300000000888,1,'2026-03-28','S6','S6_L1_002',82.2567,98.0,'red','flat',0,1),
+  (8880000616,1300000000888,1,'2026-03-29','S6','S6_L1_002',87.7211,98.0,'red','up',0,1),
+  (8880000617,1300000000888,1,'2026-03-30','S6','S6_L1_002',83.3292,98.0,'red','down',0,1),
+  (8880000618,1300000000888,1,'2026-03-31','S6','S6_L1_002',82.3005,98.0,'red','flat',0,1),
+  (8880000619,1300000000888,1,'2026-04-01','S6','S6_L1_002',83.657,98.0,'red','flat',0,1),
+  (8880000620,1300000000888,1,'2026-04-02','S6','S6_L1_002',83.0624,98.0,'red','flat',0,1),
+  (8880000621,1300000000888,1,'2026-04-03','S6','S6_L1_002',86.3753,98.0,'red','up',0,1),
+  (8880000622,1300000000888,1,'2026-04-04','S6','S6_L1_002',87.8513,98.0,'red','flat',0,1),
+  (8880000623,1300000000888,1,'2026-04-05','S6','S6_L1_002',80.9534,98.0,'red','down',0,1),
+  (8880000624,1300000000888,1,'2026-04-06','S6','S6_L1_002',84.2585,98.0,'red','up',0,1),
+  (8880000625,1300000000888,1,'2026-04-07','S6','S6_L1_002',85.0363,98.0,'red','flat',0,1),
+  (8880000626,1300000000888,1,'2026-04-08','S6','S6_L1_002',85.2096,98.0,'red','flat',0,1),
+  (8880000627,1300000000888,1,'2026-04-09','S6','S6_L1_002',87.1248,98.0,'red','up',0,1),
+  (8880000628,1300000000888,1,'2026-04-10','S6','S6_L1_002',85.3056,98.0,'red','down',0,1),
+  (8880000629,1300000000888,1,'2026-04-11','S6','S6_L1_002',83.5215,98.0,'red','down',0,1),
+  (8880000630,1300000000888,1,'2026-04-12','S6','S6_L1_002',82.1647,98.0,'red','flat',0,1),
+  (8880000631,1300000000888,1,'2026-03-14','S6','S6_L1_003',1.901,2.1,'red','flat',0,1),
+  (8880000632,1300000000888,1,'2026-03-15','S6','S6_L1_003',1.9884,2.1,'red','up',0,1),
+  (8880000633,1300000000888,1,'2026-03-16','S6','S6_L1_003',2.0191,2.1,'yellow','flat',0,1),
+  (8880000634,1300000000888,1,'2026-03-17','S6','S6_L1_003',2.0384,2.1,'yellow','flat',0,1),
+  (8880000635,1300000000888,1,'2026-03-18','S6','S6_L1_003',2.0519,2.1,'yellow','flat',0,1),
+  (8880000636,1300000000888,1,'2026-03-19','S6','S6_L1_003',2.0914,2.1,'yellow','flat',0,1),
+  (8880000637,1300000000888,1,'2026-03-20','S6','S6_L1_003',1.966,2.1,'red','down',0,1),
+  (8880000638,1300000000888,1,'2026-03-21','S6','S6_L1_003',1.9393,2.1,'red','flat',0,1),
+  (8880000639,1300000000888,1,'2026-03-22','S6','S6_L1_003',2.0655,2.1,'yellow','up',0,1),
+  (8880000640,1300000000888,1,'2026-03-23','S6','S6_L1_003',2.0278,2.1,'yellow','flat',0,1),
+  (8880000641,1300000000888,1,'2026-03-24','S6','S6_L1_003',2.0436,2.1,'yellow','flat',0,1),
+  (8880000642,1300000000888,1,'2026-03-25','S6','S6_L1_003',2.0105,2.1,'yellow','flat',0,1),
+  (8880000643,1300000000888,1,'2026-03-26','S6','S6_L1_003',2.0393,2.1,'yellow','flat',0,1),
+  (8880000644,1300000000888,1,'2026-03-27','S6','S6_L1_003',2.1414,2.1,'green','up',0,1),
+  (8880000645,1300000000888,1,'2026-03-28','S6','S6_L1_003',1.9502,2.1,'red','down',0,1),
+  (8880000646,1300000000888,1,'2026-03-29','S6','S6_L1_003',1.9746,2.1,'red','flat',0,1),
+  (8880000647,1300000000888,1,'2026-03-30','S6','S6_L1_003',2.0895,2.1,'yellow','up',0,1),
+  (8880000648,1300000000888,1,'2026-03-31','S6','S6_L1_003',2.1464,2.1,'green','up',0,1),
+  (8880000649,1300000000888,1,'2026-04-01','S6','S6_L1_003',2.0374,2.1,'yellow','down',0,1),
+  (8880000650,1300000000888,1,'2026-04-02','S6','S6_L1_003',1.9723,2.1,'red','down',0,1),
+  (8880000651,1300000000888,1,'2026-04-03','S6','S6_L1_003',1.9269,2.1,'red','down',0,1),
+  (8880000652,1300000000888,1,'2026-04-04','S6','S6_L1_003',2.066,2.1,'yellow','up',0,1),
+  (8880000653,1300000000888,1,'2026-04-05','S6','S6_L1_003',1.9732,2.1,'red','down',0,1),
+  (8880000654,1300000000888,1,'2026-04-06','S6','S6_L1_003',2.1838,2.1,'green','up',0,1),
+  (8880000655,1300000000888,1,'2026-04-07','S6','S6_L1_003',2.194,2.1,'green','flat',0,1),
+  (8880000656,1300000000888,1,'2026-04-08','S6','S6_L1_003',2.0639,2.1,'yellow','down',0,1),
+  (8880000657,1300000000888,1,'2026-04-09','S6','S6_L1_003',2.0799,2.1,'yellow','flat',0,1),
+  (8880000658,1300000000888,1,'2026-04-10','S6','S6_L1_003',2.0427,2.1,'yellow','flat',0,1),
+  (8880000659,1300000000888,1,'2026-04-11','S6','S6_L1_003',2.1202,2.1,'green','up',0,1),
+  (8880000660,1300000000888,1,'2026-04-12','S6','S6_L1_003',2.0498,2.1,'yellow','down',0,1),
+  (8880000661,1300000000888,1,'2026-03-14','S7','S7_L1_001',8.8133,8.0,'red','flat',0,1),
+  (8880000662,1300000000888,1,'2026-03-15','S7','S7_L1_001',8.6762,8.0,'yellow','flat',0,1),
+  (8880000663,1300000000888,1,'2026-03-16','S7','S7_L1_001',8.6894,8.0,'yellow','flat',0,1),
+  (8880000664,1300000000888,1,'2026-03-17','S7','S7_L1_001',9.0329,8.0,'red','up',0,1),
+  (8880000665,1300000000888,1,'2026-03-18','S7','S7_L1_001',9.3417,8.0,'red','up',0,1),
+  (8880000666,1300000000888,1,'2026-03-19','S7','S7_L1_001',9.0142,8.0,'red','down',0,1),
+  (8880000667,1300000000888,1,'2026-03-20','S7','S7_L1_001',9.3306,8.0,'red','up',0,1),
+  (8880000668,1300000000888,1,'2026-03-21','S7','S7_L1_001',9.0247,8.0,'red','down',0,1),
+  (8880000669,1300000000888,1,'2026-03-22','S7','S7_L1_001',8.8849,8.0,'red','flat',0,1),
+  (8880000670,1300000000888,1,'2026-03-23','S7','S7_L1_001',9.7347,8.0,'red','up',0,1),
+  (8880000671,1300000000888,1,'2026-03-24','S7','S7_L1_001',9.4917,8.0,'red','down',0,1),
+  (8880000672,1300000000888,1,'2026-03-25','S7','S7_L1_001',9.0532,8.0,'red','down',0,1),
+  (8880000673,1300000000888,1,'2026-03-26','S7','S7_L1_001',8.7753,8.0,'yellow','down',0,1),
+  (8880000674,1300000000888,1,'2026-03-27','S7','S7_L1_001',8.5656,8.0,'yellow','down',0,1),
+  (8880000675,1300000000888,1,'2026-03-28','S7','S7_L1_001',9.1084,8.0,'red','up',0,1),
+  (8880000676,1300000000888,1,'2026-03-29','S7','S7_L1_001',8.931,8.0,'red','flat',0,1),
+  (8880000677,1300000000888,1,'2026-03-30','S7','S7_L1_001',9.1261,8.0,'red','up',0,1),
+  (8880000678,1300000000888,1,'2026-03-31','S7','S7_L1_001',9.0872,8.0,'red','flat',0,1),
+  (8880000679,1300000000888,1,'2026-04-01','S7','S7_L1_001',9.1178,8.0,'red','flat',0,1),
+  (8880000680,1300000000888,1,'2026-04-02','S7','S7_L1_001',9.3084,8.0,'red','up',0,1),
+  (8880000681,1300000000888,1,'2026-04-03','S7','S7_L1_001',9.0848,8.0,'red','down',0,1),
+  (8880000682,1300000000888,1,'2026-04-04','S7','S7_L1_001',8.8047,8.0,'red','down',0,1),
+  (8880000683,1300000000888,1,'2026-04-05','S7','S7_L1_001',8.792,8.0,'yellow','flat',0,1),
+  (8880000684,1300000000888,1,'2026-04-06','S7','S7_L1_001',9.1574,8.0,'red','up',0,1),
+  (8880000685,1300000000888,1,'2026-04-07','S7','S7_L1_001',8.7106,8.0,'yellow','down',0,1),
+  (8880000686,1300000000888,1,'2026-04-08','S7','S7_L1_001',9.194,8.0,'red','up',0,1),
+  (8880000687,1300000000888,1,'2026-04-09','S7','S7_L1_001',9.1928,8.0,'red','flat',0,1),
+  (8880000688,1300000000888,1,'2026-04-10','S7','S7_L1_001',8.9882,8.0,'red','down',0,1),
+  (8880000689,1300000000888,1,'2026-04-11','S7','S7_L1_001',8.789,8.0,'yellow','down',0,1),
+  (8880000690,1300000000888,1,'2026-04-12','S7','S7_L1_001',8.5204,8.0,'yellow','down',0,1),
+  (8880000691,1300000000888,1,'2026-03-14','S7','S7_L1_002',102.9744,100.0,'green','flat',0,1),
+  (8880000692,1300000000888,1,'2026-03-15','S7','S7_L1_002',98.847,100.0,'yellow','down',0,1),
+  (8880000693,1300000000888,1,'2026-03-16','S7','S7_L1_002',98.1144,100.0,'yellow','flat',0,1),
+  (8880000694,1300000000888,1,'2026-03-17','S7','S7_L1_002',96.0127,100.0,'yellow','down',0,1),
+  (8880000695,1300000000888,1,'2026-03-18','S7','S7_L1_002',103.5761,100.0,'green','up',0,1),
+  (8880000696,1300000000888,1,'2026-03-19','S7','S7_L1_002',102.136,100.0,'green','flat',0,1),
+  (8880000697,1300000000888,1,'2026-03-20','S7','S7_L1_002',101.4098,100.0,'green','flat',0,1),
+  (8880000698,1300000000888,1,'2026-03-21','S7','S7_L1_002',95.4736,100.0,'yellow','down',0,1),
+  (8880000699,1300000000888,1,'2026-03-22','S7','S7_L1_002',101.5107,100.0,'green','up',0,1),
+  (8880000700,1300000000888,1,'2026-03-23','S7','S7_L1_002',100.8559,100.0,'green','flat',0,1),
+  (8880000701,1300000000888,1,'2026-03-24','S7','S7_L1_002',98.9858,100.0,'yellow','flat',0,1),
+  (8880000702,1300000000888,1,'2026-03-25','S7','S7_L1_002',95.8698,100.0,'yellow','down',0,1),
+  (8880000703,1300000000888,1,'2026-03-26','S7','S7_L1_002',99.83,100.0,'yellow','up',0,1),
+  (8880000704,1300000000888,1,'2026-03-27','S7','S7_L1_002',97.3875,100.0,'yellow','down',0,1),
+  (8880000705,1300000000888,1,'2026-03-28','S7','S7_L1_002',100.2401,100.0,'green','up',0,1),
+  (8880000706,1300000000888,1,'2026-03-29','S7','S7_L1_002',100.19,100.0,'green','flat',0,1),
+  (8880000707,1300000000888,1,'2026-03-30','S7','S7_L1_002',98.9855,100.0,'yellow','flat',0,1),
+  (8880000708,1300000000888,1,'2026-03-31','S7','S7_L1_002',102.6461,100.0,'green','up',0,1),
+  (8880000709,1300000000888,1,'2026-04-01','S7','S7_L1_002',99.8018,100.0,'yellow','down',0,1),
+  (8880000710,1300000000888,1,'2026-04-02','S7','S7_L1_002',101.5873,100.0,'green','flat',0,1),
+  (8880000711,1300000000888,1,'2026-04-03','S7','S7_L1_002',101.2552,100.0,'green','flat',0,1),
+  (8880000712,1300000000888,1,'2026-04-04','S7','S7_L1_002',103.0245,100.0,'green','flat',0,1),
+  (8880000713,1300000000888,1,'2026-04-05','S7','S7_L1_002',97.1078,100.0,'yellow','down',0,1),
+  (8880000714,1300000000888,1,'2026-04-06','S7','S7_L1_002',98.9641,100.0,'yellow','flat',0,1),
+  (8880000715,1300000000888,1,'2026-04-07','S7','S7_L1_002',102.766,100.0,'green','up',0,1),
+  (8880000716,1300000000888,1,'2026-04-08','S7','S7_L1_002',100.4606,100.0,'green','down',0,1),
+  (8880000717,1300000000888,1,'2026-04-09','S7','S7_L1_002',103.3774,100.0,'green','up',0,1),
+  (8880000718,1300000000888,1,'2026-04-10','S7','S7_L1_002',102.2357,100.0,'green','flat',0,1),
+  (8880000719,1300000000888,1,'2026-04-11','S7','S7_L1_002',98.666,100.0,'yellow','down',0,1),
+  (8880000720,1300000000888,1,'2026-04-12','S7','S7_L1_002',102.6415,100.0,'green','up',0,1),
+  (8880000721,1300000000888,1,'2026-03-14','S7','S7_L1_003',7.1664,10.0,'red','flat',0,1),
+  (8880000722,1300000000888,1,'2026-03-15','S7','S7_L1_003',6.6187,10.0,'red','down',0,1),
+  (8880000723,1300000000888,1,'2026-03-16','S7','S7_L1_003',7.1121,10.0,'red','up',0,1),
+  (8880000724,1300000000888,1,'2026-03-17','S7','S7_L1_003',6.9817,10.0,'red','flat',0,1),
+  (8880000725,1300000000888,1,'2026-03-18','S7','S7_L1_003',6.7812,10.0,'red','down',0,1),
+  (8880000726,1300000000888,1,'2026-03-19','S7','S7_L1_003',7.4601,10.0,'red','up',0,1),
+  (8880000727,1300000000888,1,'2026-03-20','S7','S7_L1_003',7.0554,10.0,'red','down',0,1),
+  (8880000728,1300000000888,1,'2026-03-21','S7','S7_L1_003',7.1738,10.0,'red','flat',0,1),
+  (8880000729,1300000000888,1,'2026-03-22','S7','S7_L1_003',7.5392,10.0,'red','up',0,1),
+  (8880000730,1300000000888,1,'2026-03-23','S7','S7_L1_003',6.878,10.0,'red','down',0,1),
+  (8880000731,1300000000888,1,'2026-03-24','S7','S7_L1_003',6.9167,10.0,'red','flat',0,1),
+  (8880000732,1300000000888,1,'2026-03-25','S7','S7_L1_003',7.3127,10.0,'red','up',0,1),
+  (8880000733,1300000000888,1,'2026-03-26','S7','S7_L1_003',6.7254,10.0,'red','down',0,1),
+  (8880000734,1300000000888,1,'2026-03-27','S7','S7_L1_003',7.0155,10.0,'red','up',0,1),
+  (8880000735,1300000000888,1,'2026-03-28','S7','S7_L1_003',7.0097,10.0,'red','flat',0,1),
+  (8880000736,1300000000888,1,'2026-03-29','S7','S7_L1_003',7.2037,10.0,'red','up',0,1),
+  (8880000737,1300000000888,1,'2026-03-30','S7','S7_L1_003',7.0851,10.0,'red','flat',0,1),
+  (8880000738,1300000000888,1,'2026-03-31','S7','S7_L1_003',6.8082,10.0,'red','down',0,1),
+  (8880000739,1300000000888,1,'2026-04-01','S7','S7_L1_003',7.2042,10.0,'red','up',0,1),
+  (8880000740,1300000000888,1,'2026-04-02','S7','S7_L1_003',7.1775,10.0,'red','flat',0,1),
+  (8880000741,1300000000888,1,'2026-04-03','S7','S7_L1_003',6.7793,10.0,'red','down',0,1),
+  (8880000742,1300000000888,1,'2026-04-04','S7','S7_L1_003',6.8556,10.0,'red','flat',0,1),
+  (8880000743,1300000000888,1,'2026-04-05','S7','S7_L1_003',6.8896,10.0,'red','flat',0,1),
+  (8880000744,1300000000888,1,'2026-04-06','S7','S7_L1_003',6.7586,10.0,'red','flat',0,1),
+  (8880000745,1300000000888,1,'2026-04-07','S7','S7_L1_003',7.2236,10.0,'red','up',0,1),
+  (8880000746,1300000000888,1,'2026-04-08','S7','S7_L1_003',6.932,10.0,'red','down',0,1),
+  (8880000747,1300000000888,1,'2026-04-09','S7','S7_L1_003',6.9417,10.0,'red','flat',0,1),
+  (8880000748,1300000000888,1,'2026-04-10','S7','S7_L1_003',6.7821,10.0,'red','down',0,1),
+  (8880000749,1300000000888,1,'2026-04-11','S7','S7_L1_003',6.9171,10.0,'red','flat',0,1),
+  (8880000750,1300000000888,1,'2026-04-12','S7','S7_L1_003',7.3118,10.0,'red','up',0,1),
+  (8880000751,1300000000888,1,'2026-03-14','S8','S8_L1_001',201.1408,176.0,'red','flat',0,1),
+  (8880000752,1300000000888,1,'2026-03-15','S8','S8_L1_001',215.83,176.0,'red','up',0,1),
+  (8880000753,1300000000888,1,'2026-03-16','S8','S8_L1_001',216.1493,176.0,'red','flat',0,1),
+  (8880000754,1300000000888,1,'2026-03-17','S8','S8_L1_001',208.2043,176.0,'red','down',0,1),
+  (8880000755,1300000000888,1,'2026-03-18','S8','S8_L1_001',214.4864,176.0,'red','up',0,1),
+  (8880000756,1300000000888,1,'2026-03-19','S8','S8_L1_001',209.9529,176.0,'red','down',0,1),
+  (8880000757,1300000000888,1,'2026-03-20','S8','S8_L1_001',202.0411,176.0,'red','down',0,1),
+  (8880000758,1300000000888,1,'2026-03-21','S8','S8_L1_001',209.1207,176.0,'red','up',0,1),
+  (8880000759,1300000000888,1,'2026-03-22','S8','S8_L1_001',202.4318,176.0,'red','down',0,1),
+  (8880000760,1300000000888,1,'2026-03-23','S8','S8_L1_001',205.6425,176.0,'red','flat',0,1),
+  (8880000761,1300000000888,1,'2026-03-24','S8','S8_L1_001',203.7259,176.0,'red','flat',0,1),
+  (8880000762,1300000000888,1,'2026-03-25','S8','S8_L1_001',211.7238,176.0,'red','up',0,1),
+  (8880000763,1300000000888,1,'2026-03-26','S8','S8_L1_001',210.8034,176.0,'red','flat',0,1),
+  (8880000764,1300000000888,1,'2026-03-27','S8','S8_L1_001',201.3312,176.0,'red','down',0,1),
+  (8880000765,1300000000888,1,'2026-03-28','S8','S8_L1_001',203.8457,176.0,'red','flat',0,1),
+  (8880000766,1300000000888,1,'2026-03-29','S8','S8_L1_001',209.6137,176.0,'red','up',0,1),
+  (8880000767,1300000000888,1,'2026-03-30','S8','S8_L1_001',212.551,176.0,'red','flat',0,1),
+  (8880000768,1300000000888,1,'2026-03-31','S8','S8_L1_001',210.0849,176.0,'red','flat',0,1),
+  (8880000769,1300000000888,1,'2026-04-01','S8','S8_L1_001',195.7523,176.0,'red','down',0,1),
+  (8880000770,1300000000888,1,'2026-04-02','S8','S8_L1_001',217.7238,176.0,'red','up',0,1),
+  (8880000771,1300000000888,1,'2026-04-03','S8','S8_L1_001',220.7765,176.0,'red','flat',0,1),
+  (8880000772,1300000000888,1,'2026-04-04','S8','S8_L1_001',219.5909,176.0,'red','flat',0,1),
+  (8880000773,1300000000888,1,'2026-04-05','S8','S8_L1_001',213.0524,176.0,'red','down',0,1),
+  (8880000774,1300000000888,1,'2026-04-06','S8','S8_L1_001',213.8567,176.0,'red','flat',0,1),
+  (8880000775,1300000000888,1,'2026-04-07','S8','S8_L1_001',205.5164,176.0,'red','down',0,1),
+  (8880000776,1300000000888,1,'2026-04-08','S8','S8_L1_001',210.8166,176.0,'red','up',0,1),
+  (8880000777,1300000000888,1,'2026-04-09','S8','S8_L1_001',202.5202,176.0,'red','down',0,1),
+  (8880000778,1300000000888,1,'2026-04-10','S8','S8_L1_001',210.3963,176.0,'red','up',0,1),
+  (8880000779,1300000000888,1,'2026-04-11','S8','S8_L1_001',200.6394,176.0,'red','down',0,1),
+  (8880000780,1300000000888,1,'2026-04-12','S8','S8_L1_001',213.3109,176.0,'red','up',0,1),
+  (8880000781,1300000000888,1,'2026-03-14','S8','S8_L1_002',89.6502,96.13,'green','flat',0,1),
+  (8880000782,1300000000888,1,'2026-03-15','S8','S8_L1_002',87.2358,96.13,'green','down',0,1),
+  (8880000783,1300000000888,1,'2026-03-16','S8','S8_L1_002',87.1171,96.13,'green','flat',0,1),
+  (8880000784,1300000000888,1,'2026-03-17','S8','S8_L1_002',91.0731,96.13,'green','up',0,1),
+  (8880000785,1300000000888,1,'2026-03-18','S8','S8_L1_002',88.0559,96.13,'green','down',0,1),
+  (8880000786,1300000000888,1,'2026-03-19','S8','S8_L1_002',93.7382,96.13,'green','up',0,1),
+  (8880000787,1300000000888,1,'2026-03-20','S8','S8_L1_002',84.7341,96.13,'green','down',0,1),
+  (8880000788,1300000000888,1,'2026-03-21','S8','S8_L1_002',87.8094,96.13,'green','up',0,1),
+  (8880000789,1300000000888,1,'2026-03-22','S8','S8_L1_002',85.4739,96.13,'green','down',0,1),
+  (8880000790,1300000000888,1,'2026-03-23','S8','S8_L1_002',86.3779,96.13,'green','flat',0,1),
+  (8880000791,1300000000888,1,'2026-03-24','S8','S8_L1_002',86.3693,96.13,'green','flat',0,1),
+  (8880000792,1300000000888,1,'2026-03-25','S8','S8_L1_002',87.19,96.13,'green','flat',0,1),
+  (8880000793,1300000000888,1,'2026-03-26','S8','S8_L1_002',90.5435,96.13,'green','up',0,1),
+  (8880000794,1300000000888,1,'2026-03-27','S8','S8_L1_002',85.43,96.13,'green','down',0,1),
+  (8880000795,1300000000888,1,'2026-03-28','S8','S8_L1_002',90.0849,96.13,'green','up',0,1),
+  (8880000796,1300000000888,1,'2026-03-29','S8','S8_L1_002',84.6418,96.13,'green','down',0,1),
+  (8880000797,1300000000888,1,'2026-03-30','S8','S8_L1_002',87.3896,96.13,'green','up',0,1),
+  (8880000798,1300000000888,1,'2026-03-31','S8','S8_L1_002',91.9686,96.13,'green','up',0,1),
+  (8880000799,1300000000888,1,'2026-04-01','S8','S8_L1_002',89.6922,96.13,'green','down',0,1),
+  (8880000800,1300000000888,1,'2026-04-02','S8','S8_L1_002',89.1885,96.13,'green','flat',0,1),
+  (8880000801,1300000000888,1,'2026-04-03','S8','S8_L1_002',90.1382,96.13,'green','flat',0,1),
+  (8880000802,1300000000888,1,'2026-04-04','S8','S8_L1_002',89.9945,96.13,'green','flat',0,1),
+  (8880000803,1300000000888,1,'2026-04-05','S8','S8_L1_002',90.1326,96.13,'green','flat',0,1),
+  (8880000804,1300000000888,1,'2026-04-06','S8','S8_L1_002',92.1912,96.13,'green','up',0,1),
+  (8880000805,1300000000888,1,'2026-04-07','S8','S8_L1_002',85.7099,96.13,'green','down',0,1),
+  (8880000806,1300000000888,1,'2026-04-08','S8','S8_L1_002',88.2782,96.13,'green','up',0,1),
+  (8880000807,1300000000888,1,'2026-04-09','S8','S8_L1_002',90.1572,96.13,'green','up',0,1),
+  (8880000808,1300000000888,1,'2026-04-10','S8','S8_L1_002',90.4554,96.13,'green','flat',0,1),
+  (8880000809,1300000000888,1,'2026-04-11','S8','S8_L1_002',89.947,96.13,'green','flat',0,1),
+  (8880000810,1300000000888,1,'2026-04-12','S8','S8_L1_002',91.9334,96.13,'green','up',0,1),
+  (8880000811,1300000000888,1,'2026-03-14','S9','S9_L1_001',8972.9349,7390.0,'red','flat',0,1),
+  (8880000812,1300000000888,1,'2026-03-15','S9','S9_L1_001',9059.1483,7390.0,'red','flat',0,1),
+  (8880000813,1300000000888,1,'2026-03-16','S9','S9_L1_001',9455.6075,7390.0,'red','up',0,1),
+  (8880000814,1300000000888,1,'2026-03-17','S9','S9_L1_001',9410.4098,7390.0,'red','flat',0,1),
+  (8880000815,1300000000888,1,'2026-03-18','S9','S9_L1_001',9216.2711,7390.0,'red','down',0,1),
+  (8880000816,1300000000888,1,'2026-03-19','S9','S9_L1_001',8866.4453,7390.0,'red','down',0,1),
+  (8880000817,1300000000888,1,'2026-03-20','S9','S9_L1_001',9135.3519,7390.0,'red','up',0,1),
+  (8880000818,1300000000888,1,'2026-03-21','S9','S9_L1_001',9028.8298,7390.0,'red','flat',0,1),
+  (8880000819,1300000000888,1,'2026-03-22','S9','S9_L1_001',9033.8049,7390.0,'red','flat',0,1),
+  (8880000820,1300000000888,1,'2026-03-23','S9','S9_L1_001',8763.5226,7390.0,'red','down',0,1),
+  (8880000821,1300000000888,1,'2026-03-24','S9','S9_L1_001',9226.9346,7390.0,'red','up',0,1),
+  (8880000822,1300000000888,1,'2026-03-25','S9','S9_L1_001',9092.1374,7390.0,'red','flat',0,1),
+  (8880000823,1300000000888,1,'2026-03-26','S9','S9_L1_001',9319.8878,7390.0,'red','up',0,1),
+  (8880000824,1300000000888,1,'2026-03-27','S9','S9_L1_001',8701.2482,7390.0,'red','down',0,1),
+  (8880000825,1300000000888,1,'2026-03-28','S9','S9_L1_001',8792.6091,7390.0,'red','flat',0,1),
+  (8880000826,1300000000888,1,'2026-03-29','S9','S9_L1_001',10095.7482,7390.0,'red','up',0,1),
+  (8880000827,1300000000888,1,'2026-03-30','S9','S9_L1_001',8860.0235,7390.0,'red','down',0,1),
+  (8880000828,1300000000888,1,'2026-03-31','S9','S9_L1_001',9178.7973,7390.0,'red','up',0,1),
+  (8880000829,1300000000888,1,'2026-04-01','S9','S9_L1_001',9219.7956,7390.0,'red','flat',0,1),
+  (8880000830,1300000000888,1,'2026-04-02','S9','S9_L1_001',8832.1397,7390.0,'red','down',0,1),
+  (8880000831,1300000000888,1,'2026-04-03','S9','S9_L1_001',9571.9362,7390.0,'red','up',0,1),
+  (8880000832,1300000000888,1,'2026-04-04','S9','S9_L1_001',9082.3698,7390.0,'red','down',0,1),
+  (8880000833,1300000000888,1,'2026-04-05','S9','S9_L1_001',9141.094,7390.0,'red','flat',0,1),
+  (8880000834,1300000000888,1,'2026-04-06','S9','S9_L1_001',9596.7197,7390.0,'red','up',0,1),
+  (8880000835,1300000000888,1,'2026-04-07','S9','S9_L1_001',8884.3292,7390.0,'red','down',0,1),
+  (8880000836,1300000000888,1,'2026-04-08','S9','S9_L1_001',8967.1545,7390.0,'red','flat',0,1),
+  (8880000837,1300000000888,1,'2026-04-09','S9','S9_L1_001',9005.9568,7390.0,'red','flat',0,1),
+  (8880000838,1300000000888,1,'2026-04-10','S9','S9_L1_001',8725.5405,7390.0,'red','down',0,1),
+  (8880000839,1300000000888,1,'2026-04-11','S9','S9_L1_001',9175.5912,7390.0,'red','up',0,1),
+  (8880000840,1300000000888,1,'2026-04-12','S9','S9_L1_001',9229.4325,7390.0,'red','flat',0,1),
+  (8880000841,1300000000888,1,'2026-03-14','S9','S9_L1_002',3.1929,3.11,'yellow','flat',0,1),
+  (8880000842,1300000000888,1,'2026-03-15','S9','S9_L1_002',3.37,3.11,'yellow','up',0,1),
+  (8880000843,1300000000888,1,'2026-03-16','S9','S9_L1_002',3.3602,3.11,'yellow','flat',0,1),
+  (8880000844,1300000000888,1,'2026-03-17','S9','S9_L1_002',3.2978,3.11,'yellow','flat',0,1),
+  (8880000845,1300000000888,1,'2026-03-18','S9','S9_L1_002',3.2478,3.11,'yellow','flat',0,1),
+  (8880000846,1300000000888,1,'2026-03-19','S9','S9_L1_002',3.3201,3.11,'yellow','up',0,1),
+  (8880000847,1300000000888,1,'2026-03-20','S9','S9_L1_002',3.4163,3.11,'yellow','up',0,1),
+  (8880000848,1300000000888,1,'2026-03-21','S9','S9_L1_002',3.2907,3.11,'yellow','down',0,1),
+  (8880000849,1300000000888,1,'2026-03-22','S9','S9_L1_002',3.4126,3.11,'yellow','up',0,1),
+  (8880000850,1300000000888,1,'2026-03-23','S9','S9_L1_002',3.3007,3.11,'yellow','down',0,1),
+  (8880000851,1300000000888,1,'2026-03-24','S9','S9_L1_002',3.5002,3.11,'red','up',0,1),
+  (8880000852,1300000000888,1,'2026-03-25','S9','S9_L1_002',3.3307,3.11,'yellow','down',0,1),
+  (8880000853,1300000000888,1,'2026-03-26','S9','S9_L1_002',3.3105,3.11,'yellow','flat',0,1),
+  (8880000854,1300000000888,1,'2026-03-27','S9','S9_L1_002',3.1672,3.11,'yellow','down',0,1),
+  (8880000855,1300000000888,1,'2026-03-28','S9','S9_L1_002',3.1855,3.11,'yellow','flat',0,1),
+  (8880000856,1300000000888,1,'2026-03-29','S9','S9_L1_002',3.3661,3.11,'yellow','up',0,1),
+  (8880000857,1300000000888,1,'2026-03-30','S9','S9_L1_002',3.3053,3.11,'yellow','flat',0,1),
+  (8880000858,1300000000888,1,'2026-03-31','S9','S9_L1_002',3.3561,3.11,'yellow','flat',0,1),
+  (8880000859,1300000000888,1,'2026-04-01','S9','S9_L1_002',3.2596,3.11,'yellow','down',0,1),
+  (8880000860,1300000000888,1,'2026-04-02','S9','S9_L1_002',3.313,3.11,'yellow','flat',0,1),
+  (8880000861,1300000000888,1,'2026-04-03','S9','S9_L1_002',3.2657,3.11,'yellow','flat',0,1),
+  (8880000862,1300000000888,1,'2026-04-04','S9','S9_L1_002',3.3575,3.11,'yellow','up',0,1),
+  (8880000863,1300000000888,1,'2026-04-05','S9','S9_L1_002',3.3062,3.11,'yellow','flat',0,1),
+  (8880000864,1300000000888,1,'2026-04-06','S9','S9_L1_002',3.5142,3.11,'red','up',0,1),
+  (8880000865,1300000000888,1,'2026-04-07','S9','S9_L1_002',3.2593,3.11,'yellow','down',0,1),
+  (8880000866,1300000000888,1,'2026-04-08','S9','S9_L1_002',3.4397,3.11,'red','up',0,1),
+  (8880000867,1300000000888,1,'2026-04-09','S9','S9_L1_002',3.2227,3.11,'yellow','down',0,1),
+  (8880000868,1300000000888,1,'2026-04-10','S9','S9_L1_002',3.2815,3.11,'yellow','flat',0,1),
+  (8880000869,1300000000888,1,'2026-04-11','S9','S9_L1_002',3.244,3.11,'yellow','flat',0,1),
+  (8880000870,1300000000888,1,'2026-04-12','S9','S9_L1_002',3.4538,3.11,'red','up',0,1),
+  (8880000871,1300000000888,1,'2026-03-14','S9','S9_L1_003',87.5872,98.0,'red','flat',0,1),
+  (8880000872,1300000000888,1,'2026-03-15','S9','S9_L1_003',90.8959,98.0,'red','up',0,1),
+  (8880000873,1300000000888,1,'2026-03-16','S9','S9_L1_003',91.0187,98.0,'red','flat',0,1),
+  (8880000874,1300000000888,1,'2026-03-17','S9','S9_L1_003',87.2348,98.0,'red','down',0,1),
+  (8880000875,1300000000888,1,'2026-03-18','S9','S9_L1_003',90.1817,98.0,'red','up',0,1),
+  (8880000876,1300000000888,1,'2026-03-19','S9','S9_L1_003',79.9069,98.0,'red','down',0,1),
+  (8880000877,1300000000888,1,'2026-03-20','S9','S9_L1_003',85.7725,98.0,'red','up',0,1),
+  (8880000878,1300000000888,1,'2026-03-21','S9','S9_L1_003',87.6517,98.0,'red','up',0,1),
+  (8880000879,1300000000888,1,'2026-03-22','S9','S9_L1_003',89.3154,98.0,'red','flat',0,1),
+  (8880000880,1300000000888,1,'2026-03-23','S9','S9_L1_003',88.1043,98.0,'red','flat',0,1),
+  (8880000881,1300000000888,1,'2026-03-24','S9','S9_L1_003',86.8537,98.0,'red','flat',0,1),
+  (8880000882,1300000000888,1,'2026-03-25','S9','S9_L1_003',85.7955,98.0,'red','flat',0,1),
+  (8880000883,1300000000888,1,'2026-03-26','S9','S9_L1_003',84.9126,98.0,'red','flat',0,1),
+  (8880000884,1300000000888,1,'2026-03-27','S9','S9_L1_003',91.9641,98.0,'red','up',0,1),
+  (8880000885,1300000000888,1,'2026-03-28','S9','S9_L1_003',89.929,98.0,'red','down',0,1),
+  (8880000886,1300000000888,1,'2026-03-29','S9','S9_L1_003',90.4133,98.0,'red','flat',0,1),
+  (8880000887,1300000000888,1,'2026-03-30','S9','S9_L1_003',87.0277,98.0,'red','down',0,1),
+  (8880000888,1300000000888,1,'2026-03-31','S9','S9_L1_003',85.605,98.0,'red','flat',0,1),
+  (8880000889,1300000000888,1,'2026-04-01','S9','S9_L1_003',88.4478,98.0,'red','up',0,1),
+  (8880000890,1300000000888,1,'2026-04-02','S9','S9_L1_003',86.9357,98.0,'red','flat',0,1),
+  (8880000891,1300000000888,1,'2026-04-03','S9','S9_L1_003',86.6657,98.0,'red','flat',0,1),
+  (8880000892,1300000000888,1,'2026-04-04','S9','S9_L1_003',86.9351,98.0,'red','flat',0,1),
+  (8880000893,1300000000888,1,'2026-04-05','S9','S9_L1_003',85.348,98.0,'red','flat',0,1),
+  (8880000894,1300000000888,1,'2026-04-06','S9','S9_L1_003',84.7256,98.0,'red','flat',0,1),
+  (8880000895,1300000000888,1,'2026-04-07','S9','S9_L1_003',86.3673,98.0,'red','flat',0,1),
+  (8880000896,1300000000888,1,'2026-04-08','S9','S9_L1_003',83.384,98.0,'red','down',0,1),
+  (8880000897,1300000000888,1,'2026-04-09','S9','S9_L1_003',88.5614,98.0,'red','up',0,1),
+  (8880000898,1300000000888,1,'2026-04-10','S9','S9_L1_003',89.1886,98.0,'red','flat',0,1),
+  (8880000899,1300000000888,1,'2026-04-11','S9','S9_L1_003',84.9915,98.0,'red','down',0,1),
+  (8880000900,1300000000888,1,'2026-04-12','S9','S9_L1_003',82.2304,98.0,'red','down',0,1),
+  (8880000901,1300000000888,1,'2026-03-14','S9','S9_L1_004',3.8061,4.0,'yellow','flat',0,1),
+  (8880000902,1300000000888,1,'2026-03-15','S9','S9_L1_004',3.4568,4.0,'red','down',0,1),
+  (8880000903,1300000000888,1,'2026-03-16','S9','S9_L1_004',3.5511,4.0,'red','up',0,1),
+  (8880000904,1300000000888,1,'2026-03-17','S9','S9_L1_004',3.4775,4.0,'red','down',0,1),
+  (8880000905,1300000000888,1,'2026-03-18','S9','S9_L1_004',3.5873,4.0,'red','up',0,1),
+  (8880000906,1300000000888,1,'2026-03-19','S9','S9_L1_004',3.3956,4.0,'red','down',0,1),
+  (8880000907,1300000000888,1,'2026-03-20','S9','S9_L1_004',3.3944,4.0,'red','flat',0,1),
+  (8880000908,1300000000888,1,'2026-03-21','S9','S9_L1_004',3.6191,4.0,'red','up',0,1),
+  (8880000909,1300000000888,1,'2026-03-22','S9','S9_L1_004',3.5208,4.0,'red','down',0,1),
+  (8880000910,1300000000888,1,'2026-03-23','S9','S9_L1_004',3.2398,4.0,'red','down',0,1),
+  (8880000911,1300000000888,1,'2026-03-24','S9','S9_L1_004',3.5025,4.0,'red','up',0,1),
+  (8880000912,1300000000888,1,'2026-03-25','S9','S9_L1_004',3.4809,4.0,'red','flat',0,1),
+  (8880000913,1300000000888,1,'2026-03-26','S9','S9_L1_004',3.5746,4.0,'red','up',0,1),
+  (8880000914,1300000000888,1,'2026-03-27','S9','S9_L1_004',3.5337,4.0,'red','flat',0,1),
+  (8880000915,1300000000888,1,'2026-03-28','S9','S9_L1_004',3.5359,4.0,'red','flat',0,1),
+  (8880000916,1300000000888,1,'2026-03-29','S9','S9_L1_004',3.5092,4.0,'red','flat',0,1),
+  (8880000917,1300000000888,1,'2026-03-30','S9','S9_L1_004',3.5305,4.0,'red','flat',0,1),
+  (8880000918,1300000000888,1,'2026-03-31','S9','S9_L1_004',3.379,4.0,'red','down',0,1),
+  (8880000919,1300000000888,1,'2026-04-01','S9','S9_L1_004',3.4144,4.0,'red','flat',0,1),
+  (8880000920,1300000000888,1,'2026-04-02','S9','S9_L1_004',3.4105,4.0,'red','flat',0,1),
+  (8880000921,1300000000888,1,'2026-04-03','S9','S9_L1_004',3.3592,4.0,'red','flat',0,1),
+  (8880000922,1300000000888,1,'2026-04-04','S9','S9_L1_004',3.5828,4.0,'red','up',0,1),
+  (8880000923,1300000000888,1,'2026-04-05','S9','S9_L1_004',3.6131,4.0,'red','flat',0,1),
+  (8880000924,1300000000888,1,'2026-04-06','S9','S9_L1_004',3.5645,4.0,'red','flat',0,1),
+  (8880000925,1300000000888,1,'2026-04-07','S9','S9_L1_004',3.4369,4.0,'red','down',0,1),
+  (8880000926,1300000000888,1,'2026-04-08','S9','S9_L1_004',3.4436,4.0,'red','flat',0,1),
+  (8880000927,1300000000888,1,'2026-04-09','S9','S9_L1_004',3.4538,4.0,'red','flat',0,1),
+  (8880000928,1300000000888,1,'2026-04-10','S9','S9_L1_004',3.6169,4.0,'red','up',0,1),
+  (8880000929,1300000000888,1,'2026-04-11','S9','S9_L1_004',3.5553,4.0,'red','flat',0,1),
+  (8880000930,1300000000888,1,'2026-04-12','S9','S9_L1_004',3.6826,4.0,'red','up',0,1),
+  (8880000931,1300000000888,1,'2026-03-14','S9','S9_L1_005',3.6035,3.0,'red','flat',0,1),
+  (8880000932,1300000000888,1,'2026-03-15','S9','S9_L1_005',3.5739,3.0,'red','flat',0,1),
+  (8880000933,1300000000888,1,'2026-03-16','S9','S9_L1_005',3.6302,3.0,'red','flat',0,1),
+  (8880000934,1300000000888,1,'2026-03-17','S9','S9_L1_005',3.5194,3.0,'red','down',0,1),
+  (8880000935,1300000000888,1,'2026-03-18','S9','S9_L1_005',3.7569,3.0,'red','up',0,1),
+  (8880000936,1300000000888,1,'2026-03-19','S9','S9_L1_005',3.6666,3.0,'red','down',0,1),
+  (8880000937,1300000000888,1,'2026-03-20','S9','S9_L1_005',3.5617,3.0,'red','down',0,1),
+  (8880000938,1300000000888,1,'2026-03-21','S9','S9_L1_005',3.58,3.0,'red','flat',0,1),
+  (8880000939,1300000000888,1,'2026-03-22','S9','S9_L1_005',3.502,3.0,'red','down',0,1),
+  (8880000940,1300000000888,1,'2026-03-23','S9','S9_L1_005',3.6284,3.0,'red','up',0,1),
+  (8880000941,1300000000888,1,'2026-03-24','S9','S9_L1_005',3.4603,3.0,'red','down',0,1),
+  (8880000942,1300000000888,1,'2026-03-25','S9','S9_L1_005',3.6003,3.0,'red','up',0,1),
+  (8880000943,1300000000888,1,'2026-03-26','S9','S9_L1_005',3.5441,3.0,'red','flat',0,1),
+  (8880000944,1300000000888,1,'2026-03-27','S9','S9_L1_005',3.6612,3.0,'red','up',0,1),
+  (8880000945,1300000000888,1,'2026-03-28','S9','S9_L1_005',3.7126,3.0,'red','flat',0,1),
+  (8880000946,1300000000888,1,'2026-03-29','S9','S9_L1_005',3.685,3.0,'red','flat',0,1),
+  (8880000947,1300000000888,1,'2026-03-30','S9','S9_L1_005',3.5868,3.0,'red','down',0,1),
+  (8880000948,1300000000888,1,'2026-03-31','S9','S9_L1_005',3.5234,3.0,'red','flat',0,1),
+  (8880000949,1300000000888,1,'2026-04-01','S9','S9_L1_005',3.5676,3.0,'red','flat',0,1),
+  (8880000950,1300000000888,1,'2026-04-02','S9','S9_L1_005',3.5982,3.0,'red','flat',0,1),
+  (8880000951,1300000000888,1,'2026-04-03','S9','S9_L1_005',3.6527,3.0,'red','flat',0,1),
+  (8880000952,1300000000888,1,'2026-04-04','S9','S9_L1_005',3.5386,3.0,'red','down',0,1),
+  (8880000953,1300000000888,1,'2026-04-05','S9','S9_L1_005',3.4955,3.0,'red','flat',0,1),
+  (8880000954,1300000000888,1,'2026-04-06','S9','S9_L1_005',3.6187,3.0,'red','up',0,1),
+  (8880000955,1300000000888,1,'2026-04-07','S9','S9_L1_005',3.7468,3.0,'red','up',0,1),
+  (8880000956,1300000000888,1,'2026-04-08','S9','S9_L1_005',3.8022,3.0,'red','flat',0,1),
+  (8880000957,1300000000888,1,'2026-04-09','S9','S9_L1_005',3.6857,3.0,'red','down',0,1),
+  (8880000958,1300000000888,1,'2026-04-10','S9','S9_L1_005',3.4931,3.0,'red','down',0,1),
+  (8880000959,1300000000888,1,'2026-04-11','S9','S9_L1_005',3.7521,3.0,'red','up',0,1),
+  (8880000960,1300000000888,1,'2026-04-12','S9','S9_L1_005',3.5087,3.0,'red','down',0,1);
+
+INSERT INTO `ado_s9_kpi_value_l2_day` (id, tenant_id, factory_id, biz_date, module_code, metric_code, metric_value, target_value, status_color, trend_flag, is_deleted, is_active) VALUES
+  (8890000001,1300000000888,1,'2026-03-14','S1','S1_L2_001',21.3234,20.4462,'yellow','flat',0,1),
+  (8890000002,1300000000888,1,'2026-03-15','S1','S1_L2_001',22.1974,20.4462,'yellow','up',0,1),
+  (8890000003,1300000000888,1,'2026-03-16','S1','S1_L2_001',21.3277,20.4462,'yellow','down',0,1),
+  (8890000004,1300000000888,1,'2026-03-17','S1','S1_L2_001',21.5831,20.4462,'yellow','flat',0,1),
+  (8890000005,1300000000888,1,'2026-03-18','S1','S1_L2_001',22.0144,20.4462,'yellow','flat',0,1),
+  (8890000006,1300000000888,1,'2026-03-19','S1','S1_L2_001',20.925,20.4462,'yellow','down',0,1),
+  (8890000007,1300000000888,1,'2026-03-20','S1','S1_L2_001',20.1512,20.4462,'green','down',0,1),
+  (8890000008,1300000000888,1,'2026-03-21','S1','S1_L2_001',21.4429,20.4462,'yellow','up',0,1),
+  (8890000009,1300000000888,1,'2026-03-22','S1','S1_L2_001',21.3985,20.4462,'yellow','flat',0,1),
+  (8890000010,1300000000888,1,'2026-03-23','S1','S1_L2_001',20.8644,20.4462,'yellow','down',0,1),
+  (8890000011,1300000000888,1,'2026-03-24','S1','S1_L2_001',21.8074,20.4462,'yellow','up',0,1),
+  (8890000012,1300000000888,1,'2026-03-25','S1','S1_L2_001',21.6394,20.4462,'yellow','flat',0,1),
+  (8890000013,1300000000888,1,'2026-03-26','S1','S1_L2_001',20.6176,20.4462,'yellow','down',0,1),
+  (8890000014,1300000000888,1,'2026-03-27','S1','S1_L2_001',21.5824,20.4462,'yellow','up',0,1),
+  (8890000015,1300000000888,1,'2026-03-28','S1','S1_L2_001',21.127,20.4462,'yellow','down',0,1),
+  (8890000016,1300000000888,1,'2026-03-29','S1','S1_L2_001',20.3065,20.4462,'green','down',0,1),
+  (8890000017,1300000000888,1,'2026-03-30','S1','S1_L2_001',21.5408,20.4462,'yellow','up',0,1),
+  (8890000018,1300000000888,1,'2026-03-31','S1','S1_L2_001',21.2232,20.4462,'yellow','flat',0,1),
+  (8890000019,1300000000888,1,'2026-04-01','S1','S1_L2_001',20.7768,20.4462,'yellow','down',0,1),
+  (8890000020,1300000000888,1,'2026-04-02','S1','S1_L2_001',21.5854,20.4462,'yellow','up',0,1),
+  (8890000021,1300000000888,1,'2026-04-03','S1','S1_L2_001',21.5632,20.4462,'yellow','flat',0,1),
+  (8890000022,1300000000888,1,'2026-04-04','S1','S1_L2_001',20.8838,20.4462,'yellow','down',0,1),
+  (8890000023,1300000000888,1,'2026-04-05','S1','S1_L2_001',21.5072,20.4462,'yellow','up',0,1),
+  (8890000024,1300000000888,1,'2026-04-06','S1','S1_L2_001',21.8992,20.4462,'yellow','flat',0,1),
+  (8890000025,1300000000888,1,'2026-04-07','S1','S1_L2_001',20.7976,20.4462,'yellow','down',0,1),
+  (8890000026,1300000000888,1,'2026-04-08','S1','S1_L2_001',21.4948,20.4462,'yellow','up',0,1),
+  (8890000027,1300000000888,1,'2026-04-09','S1','S1_L2_001',21.2538,20.4462,'yellow','flat',0,1),
+  (8890000028,1300000000888,1,'2026-04-10','S1','S1_L2_001',22.6967,20.4462,'red','up',0,1),
+  (8890000029,1300000000888,1,'2026-04-11','S1','S1_L2_001',20.0647,20.4462,'green','down',0,1),
+  (8890000030,1300000000888,1,'2026-04-12','S1','S1_L2_001',21.6953,20.4462,'yellow','up',0,1),
+  (8890000031,1300000000888,1,'2026-03-14','S1','S1_L2_002',71.3468,100.9611,'red','flat',0,1),
+  (8890000032,1300000000888,1,'2026-03-15','S1','S1_L2_002',70.6896,100.9611,'red','flat',0,1),
+  (8890000033,1300000000888,1,'2026-03-16','S1','S1_L2_002',69.5771,100.9611,'red','flat',0,1),
+  (8890000034,1300000000888,1,'2026-03-17','S1','S1_L2_002',74.9103,100.9611,'red','up',0,1),
+  (8890000035,1300000000888,1,'2026-03-18','S1','S1_L2_002',73.2091,100.9611,'red','down',0,1),
+  (8890000036,1300000000888,1,'2026-03-19','S1','S1_L2_002',67.1026,100.9611,'red','down',0,1),
+  (8890000037,1300000000888,1,'2026-03-20','S1','S1_L2_002',69.2031,100.9611,'red','up',0,1),
+  (8890000038,1300000000888,1,'2026-03-21','S1','S1_L2_002',70.9434,100.9611,'red','up',0,1),
+  (8890000039,1300000000888,1,'2026-03-22','S1','S1_L2_002',71.689,100.9611,'red','flat',0,1),
+  (8890000040,1300000000888,1,'2026-03-23','S1','S1_L2_002',67.2098,100.9611,'red','down',0,1),
+  (8890000041,1300000000888,1,'2026-03-24','S1','S1_L2_002',65.3037,100.9611,'red','down',0,1),
+  (8890000042,1300000000888,1,'2026-03-25','S1','S1_L2_002',66.0375,100.9611,'red','flat',0,1),
+  (8890000043,1300000000888,1,'2026-03-26','S1','S1_L2_002',69.8939,100.9611,'red','up',0,1),
+  (8890000044,1300000000888,1,'2026-03-27','S1','S1_L2_002',69.8264,100.9611,'red','flat',0,1),
+  (8890000045,1300000000888,1,'2026-03-28','S1','S1_L2_002',70.7687,100.9611,'red','flat',0,1),
+  (8890000046,1300000000888,1,'2026-03-29','S1','S1_L2_002',68.426,100.9611,'red','down',0,1),
+  (8890000047,1300000000888,1,'2026-03-30','S1','S1_L2_002',67.4708,100.9611,'red','flat',0,1),
+  (8890000048,1300000000888,1,'2026-03-31','S1','S1_L2_002',65.7923,100.9611,'red','down',0,1),
+  (8890000049,1300000000888,1,'2026-04-01','S1','S1_L2_002',70.735,100.9611,'red','up',0,1),
+  (8890000050,1300000000888,1,'2026-04-02','S1','S1_L2_002',70.8209,100.9611,'red','flat',0,1),
+  (8890000051,1300000000888,1,'2026-04-03','S1','S1_L2_002',72.1299,100.9611,'red','flat',0,1),
+  (8890000052,1300000000888,1,'2026-04-04','S1','S1_L2_002',71.705,100.9611,'red','flat',0,1),
+  (8890000053,1300000000888,1,'2026-04-05','S1','S1_L2_002',69.6425,100.9611,'red','down',0,1),
+  (8890000054,1300000000888,1,'2026-04-06','S1','S1_L2_002',72.8785,100.9611,'red','up',0,1),
+  (8890000055,1300000000888,1,'2026-04-07','S1','S1_L2_002',69.7568,100.9611,'red','down',0,1),
+  (8890000056,1300000000888,1,'2026-04-08','S1','S1_L2_002',68.6547,100.9611,'red','flat',0,1),
+  (8890000057,1300000000888,1,'2026-04-09','S1','S1_L2_002',68.9494,100.9611,'red','flat',0,1),
+  (8890000058,1300000000888,1,'2026-04-10','S1','S1_L2_002',68.8144,100.9611,'red','flat',0,1),
+  (8890000059,1300000000888,1,'2026-04-11','S1','S1_L2_002',65.4924,100.9611,'red','down',0,1),
+  (8890000060,1300000000888,1,'2026-04-12','S1','S1_L2_002',70.3718,100.9611,'red','up',0,1),
+  (8890000061,1300000000888,1,'2026-03-14','S1','S1_L2_003',50.1907,56.63,'red','flat',0,1),
+  (8890000062,1300000000888,1,'2026-03-15','S1','S1_L2_003',48.7806,56.63,'red','down',0,1),
+  (8890000063,1300000000888,1,'2026-03-16','S1','S1_L2_003',48.09,56.63,'red','flat',0,1),
+  (8890000064,1300000000888,1,'2026-03-17','S1','S1_L2_003',47.8728,56.63,'red','flat',0,1),
+  (8890000065,1300000000888,1,'2026-03-18','S1','S1_L2_003',50.8369,56.63,'red','up',0,1),
+  (8890000066,1300000000888,1,'2026-03-19','S1','S1_L2_003',48.811,56.63,'red','down',0,1),
+  (8890000067,1300000000888,1,'2026-03-20','S1','S1_L2_003',49.7021,56.63,'red','flat',0,1),
+  (8890000068,1300000000888,1,'2026-03-21','S1','S1_L2_003',48.7551,56.63,'red','flat',0,1),
+  (8890000069,1300000000888,1,'2026-03-22','S1','S1_L2_003',49.933,56.63,'red','up',0,1),
+  (8890000070,1300000000888,1,'2026-03-23','S1','S1_L2_003',48.8558,56.63,'red','down',0,1),
+  (8890000071,1300000000888,1,'2026-03-24','S1','S1_L2_003',50.1499,56.63,'red','up',0,1),
+  (8890000072,1300000000888,1,'2026-03-25','S1','S1_L2_003',48.7569,56.63,'red','down',0,1),
+  (8890000073,1300000000888,1,'2026-03-26','S1','S1_L2_003',50.2466,56.63,'red','up',0,1),
+  (8890000074,1300000000888,1,'2026-03-27','S1','S1_L2_003',50.0153,56.63,'red','flat',0,1),
+  (8890000075,1300000000888,1,'2026-03-28','S1','S1_L2_003',48.8549,56.63,'red','down',0,1),
+  (8890000076,1300000000888,1,'2026-03-29','S1','S1_L2_003',47.7618,56.63,'red','down',0,1),
+  (8890000077,1300000000888,1,'2026-03-30','S1','S1_L2_003',47.6437,56.63,'red','flat',0,1),
+  (8890000078,1300000000888,1,'2026-03-31','S1','S1_L2_003',47.9369,56.63,'red','flat',0,1),
+  (8890000079,1300000000888,1,'2026-04-01','S1','S1_L2_003',47.5784,56.63,'red','flat',0,1),
+  (8890000080,1300000000888,1,'2026-04-02','S1','S1_L2_003',50.2998,56.63,'red','up',0,1),
+  (8890000081,1300000000888,1,'2026-04-03','S1','S1_L2_003',48.9579,56.63,'red','down',0,1),
+  (8890000082,1300000000888,1,'2026-04-04','S1','S1_L2_003',51.3357,56.63,'red','up',0,1),
+  (8890000083,1300000000888,1,'2026-04-05','S1','S1_L2_003',52.3788,56.63,'red','up',0,1),
+  (8890000084,1300000000888,1,'2026-04-06','S1','S1_L2_003',49.062,56.63,'red','down',0,1),
+  (8890000085,1300000000888,1,'2026-04-07','S1','S1_L2_003',46.7496,56.63,'red','down',0,1),
+  (8890000086,1300000000888,1,'2026-04-08','S1','S1_L2_003',48.4654,56.63,'red','up',0,1),
+  (8890000087,1300000000888,1,'2026-04-09','S1','S1_L2_003',48.9156,56.63,'red','flat',0,1),
+  (8890000088,1300000000888,1,'2026-04-10','S1','S1_L2_003',46.8372,56.63,'red','down',0,1),
+  (8890000089,1300000000888,1,'2026-04-11','S1','S1_L2_003',48.658,56.63,'red','up',0,1),
+  (8890000090,1300000000888,1,'2026-04-12','S1','S1_L2_003',49.4484,56.63,'red','flat',0,1),
+  (8890000091,1300000000888,1,'2026-03-14','S1','S1_L2_004',21.9879,19.2801,'red','flat',0,1),
+  (8890000092,1300000000888,1,'2026-03-15','S1','S1_L2_004',23.2622,19.2801,'red','up',0,1),
+  (8890000093,1300000000888,1,'2026-03-16','S1','S1_L2_004',20.8398,19.2801,'yellow','down',0,1),
+  (8890000094,1300000000888,1,'2026-03-17','S1','S1_L2_004',22.3017,19.2801,'red','up',0,1),
+  (8890000095,1300000000888,1,'2026-03-18','S1','S1_L2_004',21.0115,19.2801,'yellow','down',0,1),
+  (8890000096,1300000000888,1,'2026-03-19','S1','S1_L2_004',20.279,19.2801,'yellow','down',0,1),
+  (8890000097,1300000000888,1,'2026-03-20','S1','S1_L2_004',20.6488,19.2801,'yellow','flat',0,1),
+  (8890000098,1300000000888,1,'2026-03-21','S1','S1_L2_004',21.0702,19.2801,'yellow','up',0,1),
+  (8890000099,1300000000888,1,'2026-03-22','S1','S1_L2_004',22.6864,19.2801,'red','up',0,1),
+  (8890000100,1300000000888,1,'2026-03-23','S1','S1_L2_004',21.4088,19.2801,'red','down',0,1),
+  (8890000101,1300000000888,1,'2026-03-24','S1','S1_L2_004',21.8314,19.2801,'red','flat',0,1),
+  (8890000102,1300000000888,1,'2026-03-25','S1','S1_L2_004',21.2141,19.2801,'red','down',0,1),
+  (8890000103,1300000000888,1,'2026-03-26','S1','S1_L2_004',22.3843,19.2801,'red','up',0,1),
+  (8890000104,1300000000888,1,'2026-03-27','S1','S1_L2_004',21.2547,19.2801,'red','down',0,1),
+  (8890000105,1300000000888,1,'2026-03-28','S1','S1_L2_004',22.8503,19.2801,'red','up',0,1),
+  (8890000106,1300000000888,1,'2026-03-29','S1','S1_L2_004',21.3265,19.2801,'red','down',0,1),
+  (8890000107,1300000000888,1,'2026-03-30','S1','S1_L2_004',21.477,19.2801,'red','flat',0,1),
+  (8890000108,1300000000888,1,'2026-03-31','S1','S1_L2_004',22.0623,19.2801,'red','up',0,1),
+  (8890000109,1300000000888,1,'2026-04-01','S1','S1_L2_004',21.9977,19.2801,'red','flat',0,1),
+  (8890000110,1300000000888,1,'2026-04-02','S1','S1_L2_004',22.9209,19.2801,'red','up',0,1),
+  (8890000111,1300000000888,1,'2026-04-03','S1','S1_L2_004',22.0608,19.2801,'red','down',0,1),
+  (8890000112,1300000000888,1,'2026-04-04','S1','S1_L2_004',21.1849,19.2801,'yellow','down',0,1),
+  (8890000113,1300000000888,1,'2026-04-05','S1','S1_L2_004',21.6119,19.2801,'red','up',0,1),
+  (8890000114,1300000000888,1,'2026-04-06','S1','S1_L2_004',21.6037,19.2801,'red','flat',0,1),
+  (8890000115,1300000000888,1,'2026-04-07','S1','S1_L2_004',22.4595,19.2801,'red','up',0,1),
+  (8890000116,1300000000888,1,'2026-04-08','S1','S1_L2_004',22.2345,19.2801,'red','flat',0,1),
+  (8890000117,1300000000888,1,'2026-04-09','S1','S1_L2_004',21.9027,19.2801,'red','flat',0,1),
+  (8890000118,1300000000888,1,'2026-04-10','S1','S1_L2_004',22.5549,19.2801,'red','up',0,1),
+  (8890000119,1300000000888,1,'2026-04-11','S1','S1_L2_004',21.6329,19.2801,'red','down',0,1),
+  (8890000120,1300000000888,1,'2026-04-12','S1','S1_L2_004',21.8916,19.2801,'red','flat',0,1),
+  (8890000121,1300000000888,1,'2026-03-14','S1','S1_L2_005',70.6762,93.8132,'red','flat',0,1),
+  (8890000122,1300000000888,1,'2026-03-15','S1','S1_L2_005',68.9256,93.8132,'red','down',0,1),
+  (8890000123,1300000000888,1,'2026-03-16','S1','S1_L2_005',70.5443,93.8132,'red','up',0,1),
+  (8890000124,1300000000888,1,'2026-03-17','S1','S1_L2_005',69.5104,93.8132,'red','flat',0,1),
+  (8890000125,1300000000888,1,'2026-03-18','S1','S1_L2_005',71.53,93.8132,'red','up',0,1),
+  (8890000126,1300000000888,1,'2026-03-19','S1','S1_L2_005',71.5636,93.8132,'red','flat',0,1),
+  (8890000127,1300000000888,1,'2026-03-20','S1','S1_L2_005',68.0148,93.8132,'red','down',0,1),
+  (8890000128,1300000000888,1,'2026-03-21','S1','S1_L2_005',68.7868,93.8132,'red','flat',0,1),
+  (8890000129,1300000000888,1,'2026-03-22','S1','S1_L2_005',68.2489,93.8132,'red','flat',0,1),
+  (8890000130,1300000000888,1,'2026-03-23','S1','S1_L2_005',65.9841,93.8132,'red','down',0,1),
+  (8890000131,1300000000888,1,'2026-03-24','S1','S1_L2_005',70.7625,93.8132,'red','up',0,1),
+  (8890000132,1300000000888,1,'2026-03-25','S1','S1_L2_005',71.8312,93.8132,'red','flat',0,1),
+  (8890000133,1300000000888,1,'2026-03-26','S1','S1_L2_005',69.3442,93.8132,'red','down',0,1),
+  (8890000134,1300000000888,1,'2026-03-27','S1','S1_L2_005',68.3314,93.8132,'red','flat',0,1),
+  (8890000135,1300000000888,1,'2026-03-28','S1','S1_L2_005',71.6275,93.8132,'red','up',0,1),
+  (8890000136,1300000000888,1,'2026-03-29','S1','S1_L2_005',64.4784,93.8132,'red','down',0,1),
+  (8890000137,1300000000888,1,'2026-03-30','S1','S1_L2_005',69.7269,93.8132,'red','up',0,1),
+  (8890000138,1300000000888,1,'2026-03-31','S1','S1_L2_005',69.6557,93.8132,'red','flat',0,1),
+  (8890000139,1300000000888,1,'2026-04-01','S1','S1_L2_005',68.1698,93.8132,'red','down',0,1),
+  (8890000140,1300000000888,1,'2026-04-02','S1','S1_L2_005',72.2531,93.8132,'red','up',0,1),
+  (8890000141,1300000000888,1,'2026-04-03','S1','S1_L2_005',71.3774,93.8132,'red','flat',0,1),
+  (8890000142,1300000000888,1,'2026-04-04','S1','S1_L2_005',68.8142,93.8132,'red','down',0,1),
+  (8890000143,1300000000888,1,'2026-04-05','S1','S1_L2_005',69.1772,93.8132,'red','flat',0,1),
+  (8890000144,1300000000888,1,'2026-04-06','S1','S1_L2_005',68.5502,93.8132,'red','flat',0,1),
+  (8890000145,1300000000888,1,'2026-04-07','S1','S1_L2_005',68.292,93.8132,'red','flat',0,1),
+  (8890000146,1300000000888,1,'2026-04-08','S1','S1_L2_005',66.6356,93.8132,'red','down',0,1),
+  (8890000147,1300000000888,1,'2026-04-09','S1','S1_L2_005',72.2289,93.8132,'red','up',0,1),
+  (8890000148,1300000000888,1,'2026-04-10','S1','S1_L2_005',71.4966,93.8132,'red','flat',0,1),
+  (8890000149,1300000000888,1,'2026-04-11','S1','S1_L2_005',71.0184,93.8132,'red','flat',0,1),
+  (8890000150,1300000000888,1,'2026-04-12','S1','S1_L2_005',67.0806,93.8132,'red','down',0,1),
+  (8890000151,1300000000888,1,'2026-03-14','S1','S1_L2_006',200.7178,212.47,'red','flat',0,1),
+  (8890000152,1300000000888,1,'2026-03-15','S1','S1_L2_006',195.4568,212.47,'red','down',0,1),
+  (8890000153,1300000000888,1,'2026-03-16','S1','S1_L2_006',199.4574,212.47,'red','up',0,1),
+  (8890000154,1300000000888,1,'2026-03-17','S1','S1_L2_006',196.2743,212.47,'red','flat',0,1),
+  (8890000155,1300000000888,1,'2026-03-18','S1','S1_L2_006',200.8288,212.47,'red','up',0,1),
+  (8890000156,1300000000888,1,'2026-03-19','S1','S1_L2_006',203.9112,212.47,'yellow','flat',0,1),
+  (8890000157,1300000000888,1,'2026-03-20','S1','S1_L2_006',201.929,212.47,'yellow','flat',0,1),
+  (8890000158,1300000000888,1,'2026-03-21','S1','S1_L2_006',203.7007,212.47,'yellow','flat',0,1),
+  (8890000159,1300000000888,1,'2026-03-22','S1','S1_L2_006',190.9012,212.47,'red','down',0,1),
+  (8890000160,1300000000888,1,'2026-03-23','S1','S1_L2_006',198.5738,212.47,'red','up',0,1),
+  (8890000161,1300000000888,1,'2026-03-24','S1','S1_L2_006',202.5232,212.47,'yellow','flat',0,1),
+  (8890000162,1300000000888,1,'2026-03-25','S1','S1_L2_006',204.7191,212.47,'yellow','flat',0,1),
+  (8890000163,1300000000888,1,'2026-03-26','S1','S1_L2_006',191.2267,212.47,'red','down',0,1),
+  (8890000164,1300000000888,1,'2026-03-27','S1','S1_L2_006',201.8149,212.47,'red','up',0,1),
+  (8890000165,1300000000888,1,'2026-03-28','S1','S1_L2_006',208.1252,212.47,'yellow','up',0,1),
+  (8890000166,1300000000888,1,'2026-03-29','S1','S1_L2_006',199.7795,212.47,'red','down',0,1),
+  (8890000167,1300000000888,1,'2026-03-30','S1','S1_L2_006',200.2847,212.47,'red','flat',0,1),
+  (8890000168,1300000000888,1,'2026-03-31','S1','S1_L2_006',203.57,212.47,'yellow','flat',0,1),
+  (8890000169,1300000000888,1,'2026-04-01','S1','S1_L2_006',202.3448,212.47,'yellow','flat',0,1),
+  (8890000170,1300000000888,1,'2026-04-02','S1','S1_L2_006',204.9208,212.47,'yellow','flat',0,1),
+  (8890000171,1300000000888,1,'2026-04-03','S1','S1_L2_006',201.292,212.47,'red','flat',0,1),
+  (8890000172,1300000000888,1,'2026-04-04','S1','S1_L2_006',201.7746,212.47,'red','flat',0,1),
+  (8890000173,1300000000888,1,'2026-04-05','S1','S1_L2_006',196.1409,212.47,'red','down',0,1),
+  (8890000174,1300000000888,1,'2026-04-06','S1','S1_L2_006',199.8287,212.47,'red','flat',0,1),
+  (8890000175,1300000000888,1,'2026-04-07','S1','S1_L2_006',208.4066,212.47,'yellow','up',0,1),
+  (8890000176,1300000000888,1,'2026-04-08','S1','S1_L2_006',199.6254,212.47,'red','down',0,1),
+  (8890000177,1300000000888,1,'2026-04-09','S1','S1_L2_006',199.84,212.47,'red','flat',0,1),
+  (8890000178,1300000000888,1,'2026-04-10','S1','S1_L2_006',197.8941,212.47,'red','flat',0,1),
+  (8890000179,1300000000888,1,'2026-04-11','S1','S1_L2_006',205.599,212.47,'yellow','up',0,1),
+  (8890000180,1300000000888,1,'2026-04-12','S1','S1_L2_006',195.7057,212.47,'red','down',0,1),
+  (8890000181,1300000000888,1,'2026-03-14','S1','S1_L2_007',23.6443,20.7567,'red','flat',0,1),
+  (8890000182,1300000000888,1,'2026-03-15','S1','S1_L2_007',22.7295,20.7567,'yellow','down',0,1),
+  (8890000183,1300000000888,1,'2026-03-16','S1','S1_L2_007',23.5625,20.7567,'red','up',0,1),
+  (8890000184,1300000000888,1,'2026-03-17','S1','S1_L2_007',24.0052,20.7567,'red','flat',0,1),
+  (8890000185,1300000000888,1,'2026-03-18','S1','S1_L2_007',23.2367,20.7567,'red','down',0,1),
+  (8890000186,1300000000888,1,'2026-03-19','S1','S1_L2_007',22.6304,20.7567,'yellow','down',0,1),
+  (8890000187,1300000000888,1,'2026-03-20','S1','S1_L2_007',24.4326,20.7567,'red','up',0,1),
+  (8890000188,1300000000888,1,'2026-03-21','S1','S1_L2_007',23.3557,20.7567,'red','down',0,1),
+  (8890000189,1300000000888,1,'2026-03-22','S1','S1_L2_007',23.3599,20.7567,'red','flat',0,1),
+  (8890000190,1300000000888,1,'2026-03-23','S1','S1_L2_007',23.6616,20.7567,'red','flat',0,1),
+  (8890000191,1300000000888,1,'2026-03-24','S1','S1_L2_007',24.3814,20.7567,'red','up',0,1),
+  (8890000192,1300000000888,1,'2026-03-25','S1','S1_L2_007',23.8373,20.7567,'red','down',0,1),
+  (8890000193,1300000000888,1,'2026-03-26','S1','S1_L2_007',23.4139,20.7567,'red','flat',0,1),
+  (8890000194,1300000000888,1,'2026-03-27','S1','S1_L2_007',24.1343,20.7567,'red','up',0,1),
+  (8890000195,1300000000888,1,'2026-03-28','S1','S1_L2_007',25.1736,20.7567,'red','up',0,1),
+  (8890000196,1300000000888,1,'2026-03-29','S1','S1_L2_007',24.6349,20.7567,'red','down',0,1),
+  (8890000197,1300000000888,1,'2026-03-30','S1','S1_L2_007',24.1277,20.7567,'red','down',0,1),
+  (8890000198,1300000000888,1,'2026-03-31','S1','S1_L2_007',22.854,20.7567,'red','down',0,1),
+  (8890000199,1300000000888,1,'2026-04-01','S1','S1_L2_007',26.3124,20.7567,'red','up',0,1),
+  (8890000200,1300000000888,1,'2026-04-02','S1','S1_L2_007',22.7998,20.7567,'yellow','down',0,1),
+  (8890000201,1300000000888,1,'2026-04-03','S1','S1_L2_007',23.3865,20.7567,'red','up',0,1),
+  (8890000202,1300000000888,1,'2026-04-04','S1','S1_L2_007',23.1537,20.7567,'red','flat',0,1),
+  (8890000203,1300000000888,1,'2026-04-05','S1','S1_L2_007',24.8046,20.7567,'red','up',0,1),
+  (8890000204,1300000000888,1,'2026-04-06','S1','S1_L2_007',23.9485,20.7567,'red','down',0,1),
+  (8890000205,1300000000888,1,'2026-04-07','S1','S1_L2_007',22.6377,20.7567,'yellow','down',0,1),
+  (8890000206,1300000000888,1,'2026-04-08','S1','S1_L2_007',23.8402,20.7567,'red','up',0,1),
+  (8890000207,1300000000888,1,'2026-04-09','S1','S1_L2_007',24.0383,20.7567,'red','flat',0,1),
+  (8890000208,1300000000888,1,'2026-04-10','S1','S1_L2_007',23.4243,20.7567,'red','down',0,1),
+  (8890000209,1300000000888,1,'2026-04-11','S1','S1_L2_007',22.7846,20.7567,'yellow','down',0,1),
+  (8890000210,1300000000888,1,'2026-04-12','S1','S1_L2_007',23.1359,20.7567,'red','flat',0,1),
+  (8890000211,1300000000888,1,'2026-03-14','S1','S1_L2_008',70.5428,90.7233,'red','flat',0,1),
+  (8890000212,1300000000888,1,'2026-03-15','S1','S1_L2_008',77.7405,90.7233,'red','up',0,1),
+  (8890000213,1300000000888,1,'2026-03-16','S1','S1_L2_008',70.8951,90.7233,'red','down',0,1),
+  (8890000214,1300000000888,1,'2026-03-17','S1','S1_L2_008',74.8614,90.7233,'red','up',0,1),
+  (8890000215,1300000000888,1,'2026-03-18','S1','S1_L2_008',74.6758,90.7233,'red','flat',0,1),
+  (8890000216,1300000000888,1,'2026-03-19','S1','S1_L2_008',76.9206,90.7233,'red','up',0,1),
+  (8890000217,1300000000888,1,'2026-03-20','S1','S1_L2_008',67.9605,90.7233,'red','down',0,1),
+  (8890000218,1300000000888,1,'2026-03-21','S1','S1_L2_008',70.7455,90.7233,'red','up',0,1),
+  (8890000219,1300000000888,1,'2026-03-22','S1','S1_L2_008',73.7897,90.7233,'red','up',0,1),
+  (8890000220,1300000000888,1,'2026-03-23','S1','S1_L2_008',75.1474,90.7233,'red','flat',0,1),
+  (8890000221,1300000000888,1,'2026-03-24','S1','S1_L2_008',73.0528,90.7233,'red','down',0,1),
+  (8890000222,1300000000888,1,'2026-03-25','S1','S1_L2_008',74.5669,90.7233,'red','up',0,1),
+  (8890000223,1300000000888,1,'2026-03-26','S1','S1_L2_008',72.3931,90.7233,'red','down',0,1),
+  (8890000224,1300000000888,1,'2026-03-27','S1','S1_L2_008',74.1607,90.7233,'red','up',0,1),
+  (8890000225,1300000000888,1,'2026-03-28','S1','S1_L2_008',73.1574,90.7233,'red','flat',0,1),
+  (8890000226,1300000000888,1,'2026-03-29','S1','S1_L2_008',75.6138,90.7233,'red','up',0,1),
+  (8890000227,1300000000888,1,'2026-03-30','S1','S1_L2_008',76.3736,90.7233,'red','flat',0,1),
+  (8890000228,1300000000888,1,'2026-03-31','S1','S1_L2_008',78.2912,90.7233,'red','up',0,1),
+  (8890000229,1300000000888,1,'2026-04-01','S1','S1_L2_008',73.5861,90.7233,'red','down',0,1),
+  (8890000230,1300000000888,1,'2026-04-02','S1','S1_L2_008',74.3482,90.7233,'red','flat',0,1),
+  (8890000231,1300000000888,1,'2026-04-03','S1','S1_L2_008',75.1718,90.7233,'red','flat',0,1),
+  (8890000232,1300000000888,1,'2026-04-04','S1','S1_L2_008',74.4002,90.7233,'red','flat',0,1),
+  (8890000233,1300000000888,1,'2026-04-05','S1','S1_L2_008',74.9472,90.7233,'red','flat',0,1),
+  (8890000234,1300000000888,1,'2026-04-06','S1','S1_L2_008',71.5464,90.7233,'red','down',0,1),
+  (8890000235,1300000000888,1,'2026-04-07','S1','S1_L2_008',75.9015,90.7233,'red','up',0,1),
+  (8890000236,1300000000888,1,'2026-04-08','S1','S1_L2_008',73.0034,90.7233,'red','down',0,1),
+  (8890000237,1300000000888,1,'2026-04-09','S1','S1_L2_008',72.9093,90.7233,'red','flat',0,1),
+  (8890000238,1300000000888,1,'2026-04-10','S1','S1_L2_008',71.488,90.7233,'red','flat',0,1),
+  (8890000239,1300000000888,1,'2026-04-11','S1','S1_L2_008',77.6788,90.7233,'red','up',0,1),
+  (8890000240,1300000000888,1,'2026-04-12','S1','S1_L2_008',74.7477,90.7233,'red','down',0,1),
+  (8890000241,1300000000888,1,'2026-03-14','S1','S1_L2_009',102.2139,105.11,'yellow','flat',0,1),
+  (8890000242,1300000000888,1,'2026-03-15','S1','S1_L2_009',103.1604,105.11,'yellow','flat',0,1),
+  (8890000243,1300000000888,1,'2026-03-16','S1','S1_L2_009',98.1701,105.11,'red','down',0,1),
+  (8890000244,1300000000888,1,'2026-03-17','S1','S1_L2_009',103.7446,105.11,'yellow','up',0,1),
+  (8890000245,1300000000888,1,'2026-03-18','S1','S1_L2_009',98.4013,105.11,'red','down',0,1),
+  (8890000246,1300000000888,1,'2026-03-19','S1','S1_L2_009',98.0097,105.11,'red','flat',0,1),
+  (8890000247,1300000000888,1,'2026-03-20','S1','S1_L2_009',100.4323,105.11,'yellow','up',0,1),
+  (8890000248,1300000000888,1,'2026-03-21','S1','S1_L2_009',106.2571,105.11,'green','up',0,1),
+  (8890000249,1300000000888,1,'2026-03-22','S1','S1_L2_009',101.3674,105.11,'yellow','down',0,1),
+  (8890000250,1300000000888,1,'2026-03-23','S1','S1_L2_009',103.2555,105.11,'yellow','flat',0,1),
+  (8890000251,1300000000888,1,'2026-03-24','S1','S1_L2_009',98.2309,105.11,'red','down',0,1),
+  (8890000252,1300000000888,1,'2026-03-25','S1','S1_L2_009',100.6694,105.11,'yellow','up',0,1),
+  (8890000253,1300000000888,1,'2026-03-26','S1','S1_L2_009',96.8908,105.11,'red','down',0,1),
+  (8890000254,1300000000888,1,'2026-03-27','S1','S1_L2_009',98.7151,105.11,'red','flat',0,1),
+  (8890000255,1300000000888,1,'2026-03-28','S1','S1_L2_009',102.9537,105.11,'yellow','up',0,1),
+  (8890000256,1300000000888,1,'2026-03-29','S1','S1_L2_009',100.3202,105.11,'yellow','down',0,1),
+  (8890000257,1300000000888,1,'2026-03-30','S1','S1_L2_009',104.8088,105.11,'yellow','up',0,1),
+  (8890000258,1300000000888,1,'2026-03-31','S1','S1_L2_009',99.826,105.11,'red','down',0,1),
+  (8890000259,1300000000888,1,'2026-04-01','S1','S1_L2_009',99.8395,105.11,'red','flat',0,1),
+  (8890000260,1300000000888,1,'2026-04-02','S1','S1_L2_009',104.2826,105.11,'yellow','up',0,1),
+  (8890000261,1300000000888,1,'2026-04-03','S1','S1_L2_009',98.4816,105.11,'red','down',0,1),
+  (8890000262,1300000000888,1,'2026-04-04','S1','S1_L2_009',95.8567,105.11,'red','down',0,1),
+  (8890000263,1300000000888,1,'2026-04-05','S1','S1_L2_009',104.3567,105.11,'yellow','up',0,1),
+  (8890000264,1300000000888,1,'2026-04-06','S1','S1_L2_009',101.6839,105.11,'yellow','down',0,1),
+  (8890000265,1300000000888,1,'2026-04-07','S1','S1_L2_009',93.912,105.11,'red','down',0,1),
+  (8890000266,1300000000888,1,'2026-04-08','S1','S1_L2_009',100.5701,105.11,'yellow','up',0,1),
+  (8890000267,1300000000888,1,'2026-04-09','S1','S1_L2_009',99.2193,105.11,'red','flat',0,1),
+  (8890000268,1300000000888,1,'2026-04-10','S1','S1_L2_009',105.6932,105.11,'green','up',0,1),
+  (8890000269,1300000000888,1,'2026-04-11','S1','S1_L2_009',98.2394,105.11,'red','down',0,1),
+  (8890000270,1300000000888,1,'2026-04-12','S1','S1_L2_009',98.686,105.11,'red','flat',0,1),
+  (8890000271,1300000000888,1,'2026-03-14','S1','S1_L2_010',26.2797,19.517,'red','flat',0,1),
+  (8890000272,1300000000888,1,'2026-03-15','S1','S1_L2_010',26.5186,19.517,'red','flat',0,1),
+  (8890000273,1300000000888,1,'2026-03-16','S1','S1_L2_010',24.8223,19.517,'red','down',0,1),
+  (8890000274,1300000000888,1,'2026-03-17','S1','S1_L2_010',25.9433,19.517,'red','up',0,1),
+  (8890000275,1300000000888,1,'2026-03-18','S1','S1_L2_010',26.4061,19.517,'red','flat',0,1),
+  (8890000276,1300000000888,1,'2026-03-19','S1','S1_L2_010',26.019,19.517,'red','flat',0,1),
+  (8890000277,1300000000888,1,'2026-03-20','S1','S1_L2_010',25.6616,19.517,'red','flat',0,1),
+  (8890000278,1300000000888,1,'2026-03-21','S1','S1_L2_010',25.74,19.517,'red','flat',0,1),
+  (8890000279,1300000000888,1,'2026-03-22','S1','S1_L2_010',24.5211,19.517,'red','down',0,1),
+  (8890000280,1300000000888,1,'2026-03-23','S1','S1_L2_010',24.0258,19.517,'red','down',0,1),
+  (8890000281,1300000000888,1,'2026-03-24','S1','S1_L2_010',25.8569,19.517,'red','up',0,1),
+  (8890000282,1300000000888,1,'2026-03-25','S1','S1_L2_010',24.8548,19.517,'red','down',0,1),
+  (8890000283,1300000000888,1,'2026-03-26','S1','S1_L2_010',25.0951,19.517,'red','flat',0,1),
+  (8890000284,1300000000888,1,'2026-03-27','S1','S1_L2_010',24.6802,19.517,'red','flat',0,1),
+  (8890000285,1300000000888,1,'2026-03-28','S1','S1_L2_010',24.8202,19.517,'red','flat',0,1),
+  (8890000286,1300000000888,1,'2026-03-29','S1','S1_L2_010',25.2917,19.517,'red','flat',0,1),
+  (8890000287,1300000000888,1,'2026-03-30','S1','S1_L2_010',24.3463,19.517,'red','down',0,1),
+  (8890000288,1300000000888,1,'2026-03-31','S1','S1_L2_010',25.1679,19.517,'red','up',0,1),
+  (8890000289,1300000000888,1,'2026-04-01','S1','S1_L2_010',25.3017,19.517,'red','flat',0,1),
+  (8890000290,1300000000888,1,'2026-04-02','S1','S1_L2_010',25.058,19.517,'red','flat',0,1),
+  (8890000291,1300000000888,1,'2026-04-03','S1','S1_L2_010',24.556,19.517,'red','down',0,1),
+  (8890000292,1300000000888,1,'2026-04-04','S1','S1_L2_010',25.709,19.517,'red','up',0,1),
+  (8890000293,1300000000888,1,'2026-04-05','S1','S1_L2_010',26.5273,19.517,'red','up',0,1),
+  (8890000294,1300000000888,1,'2026-04-06','S1','S1_L2_010',24.6633,19.517,'red','down',0,1),
+  (8890000295,1300000000888,1,'2026-04-07','S1','S1_L2_010',26.0465,19.517,'red','up',0,1),
+  (8890000296,1300000000888,1,'2026-04-08','S1','S1_L2_010',25.7864,19.517,'red','flat',0,1),
+  (8890000297,1300000000888,1,'2026-04-09','S1','S1_L2_010',23.1171,19.517,'red','down',0,1),
+  (8890000298,1300000000888,1,'2026-04-10','S1','S1_L2_010',24.5427,19.517,'red','up',0,1),
+  (8890000299,1300000000888,1,'2026-04-11','S1','S1_L2_010',24.6372,19.517,'red','flat',0,1),
+  (8890000300,1300000000888,1,'2026-04-12','S1','S1_L2_010',25.7054,19.517,'red','up',0,1),
+  (8890000301,1300000000888,1,'2026-03-14','S1','S1_L2_011',83.366,94.5024,'red','flat',0,1),
+  (8890000302,1300000000888,1,'2026-03-15','S1','S1_L2_011',83.1339,94.5024,'red','flat',0,1),
+  (8890000303,1300000000888,1,'2026-03-16','S1','S1_L2_011',81.7597,94.5024,'red','flat',0,1),
+  (8890000304,1300000000888,1,'2026-03-17','S1','S1_L2_011',92.9225,94.5024,'yellow','up',0,1),
+  (8890000305,1300000000888,1,'2026-03-18','S1','S1_L2_011',82.7649,94.5024,'red','down',0,1),
+  (8890000306,1300000000888,1,'2026-03-19','S1','S1_L2_011',84.9964,94.5024,'red','up',0,1),
+  (8890000307,1300000000888,1,'2026-03-20','S1','S1_L2_011',84.61,94.5024,'red','flat',0,1),
+  (8890000308,1300000000888,1,'2026-03-21','S1','S1_L2_011',84.8135,94.5024,'red','flat',0,1),
+  (8890000309,1300000000888,1,'2026-03-22','S1','S1_L2_011',84.0361,94.5024,'red','flat',0,1),
+  (8890000310,1300000000888,1,'2026-03-23','S1','S1_L2_011',80.7405,94.5024,'red','down',0,1),
+  (8890000311,1300000000888,1,'2026-03-24','S1','S1_L2_011',82.9734,94.5024,'red','up',0,1),
+  (8890000312,1300000000888,1,'2026-03-25','S1','S1_L2_011',81.9663,94.5024,'red','flat',0,1),
+  (8890000313,1300000000888,1,'2026-03-26','S1','S1_L2_011',85.2095,94.5024,'red','up',0,1),
+  (8890000314,1300000000888,1,'2026-03-27','S1','S1_L2_011',83.7791,94.5024,'red','flat',0,1),
+  (8890000315,1300000000888,1,'2026-03-28','S1','S1_L2_011',83.7715,94.5024,'red','flat',0,1),
+  (8890000316,1300000000888,1,'2026-03-29','S1','S1_L2_011',86.0888,94.5024,'red','up',0,1),
+  (8890000317,1300000000888,1,'2026-03-30','S1','S1_L2_011',84.0393,94.5024,'red','down',0,1),
+  (8890000318,1300000000888,1,'2026-03-31','S1','S1_L2_011',87.9266,94.5024,'red','up',0,1),
+  (8890000319,1300000000888,1,'2026-04-01','S1','S1_L2_011',84.5438,94.5024,'red','down',0,1),
+  (8890000320,1300000000888,1,'2026-04-02','S1','S1_L2_011',86.1126,94.5024,'red','flat',0,1),
+  (8890000321,1300000000888,1,'2026-04-03','S1','S1_L2_011',82.134,94.5024,'red','down',0,1),
+  (8890000322,1300000000888,1,'2026-04-04','S1','S1_L2_011',87.2204,94.5024,'red','up',0,1),
+  (8890000323,1300000000888,1,'2026-04-05','S1','S1_L2_011',84.4951,94.5024,'red','down',0,1),
+  (8890000324,1300000000888,1,'2026-04-06','S1','S1_L2_011',86.5837,94.5024,'red','up',0,1),
+  (8890000325,1300000000888,1,'2026-04-07','S1','S1_L2_011',86.3816,94.5024,'red','flat',0,1),
+  (8890000326,1300000000888,1,'2026-04-08','S1','S1_L2_011',85.0897,94.5024,'red','flat',0,1),
+  (8890000327,1300000000888,1,'2026-04-09','S1','S1_L2_011',86.0928,94.5024,'red','flat',0,1),
+  (8890000328,1300000000888,1,'2026-04-10','S1','S1_L2_011',84.5461,94.5024,'red','flat',0,1),
+  (8890000329,1300000000888,1,'2026-04-11','S1','S1_L2_011',88.989,94.5024,'red','up',0,1),
+  (8890000330,1300000000888,1,'2026-04-12','S1','S1_L2_011',87.9322,94.5024,'red','flat',0,1),
+  (8890000331,1300000000888,1,'2026-03-14','S1','S1_L2_012',202.67,252.36,'red','flat',0,1),
+  (8890000332,1300000000888,1,'2026-03-15','S1','S1_L2_012',209.0818,252.36,'red','up',0,1),
+  (8890000333,1300000000888,1,'2026-03-16','S1','S1_L2_012',207.4073,252.36,'red','flat',0,1),
+  (8890000334,1300000000888,1,'2026-03-17','S1','S1_L2_012',204.2565,252.36,'red','flat',0,1),
+  (8890000335,1300000000888,1,'2026-03-18','S1','S1_L2_012',202.7209,252.36,'red','flat',0,1),
+  (8890000336,1300000000888,1,'2026-03-19','S1','S1_L2_012',209.476,252.36,'red','up',0,1),
+  (8890000337,1300000000888,1,'2026-03-20','S1','S1_L2_012',204.1928,252.36,'red','down',0,1),
+  (8890000338,1300000000888,1,'2026-03-21','S1','S1_L2_012',200.8433,252.36,'red','flat',0,1),
+  (8890000339,1300000000888,1,'2026-03-22','S1','S1_L2_012',206.3691,252.36,'red','up',0,1),
+  (8890000340,1300000000888,1,'2026-03-23','S1','S1_L2_012',205.6674,252.36,'red','flat',0,1),
+  (8890000341,1300000000888,1,'2026-03-24','S1','S1_L2_012',200.6574,252.36,'red','down',0,1),
+  (8890000342,1300000000888,1,'2026-03-25','S1','S1_L2_012',212.4569,252.36,'red','up',0,1),
+  (8890000343,1300000000888,1,'2026-03-26','S1','S1_L2_012',212.5741,252.36,'red','flat',0,1),
+  (8890000344,1300000000888,1,'2026-03-27','S1','S1_L2_012',207.5667,252.36,'red','down',0,1),
+  (8890000345,1300000000888,1,'2026-03-28','S1','S1_L2_012',208.1274,252.36,'red','flat',0,1),
+  (8890000346,1300000000888,1,'2026-03-29','S1','S1_L2_012',210.5919,252.36,'red','flat',0,1),
+  (8890000347,1300000000888,1,'2026-03-30','S1','S1_L2_012',207.1201,252.36,'red','flat',0,1),
+  (8890000348,1300000000888,1,'2026-03-31','S1','S1_L2_012',212.8557,252.36,'red','up',0,1),
+  (8890000349,1300000000888,1,'2026-04-01','S1','S1_L2_012',217.6117,252.36,'red','up',0,1),
+  (8890000350,1300000000888,1,'2026-04-02','S1','S1_L2_012',207.813,252.36,'red','down',0,1),
+  (8890000351,1300000000888,1,'2026-04-03','S1','S1_L2_012',210.0505,252.36,'red','flat',0,1),
+  (8890000352,1300000000888,1,'2026-04-04','S1','S1_L2_012',212.7447,252.36,'red','flat',0,1),
+  (8890000353,1300000000888,1,'2026-04-05','S1','S1_L2_012',205.21,252.36,'red','down',0,1),
+  (8890000354,1300000000888,1,'2026-04-06','S1','S1_L2_012',200.2951,252.36,'red','down',0,1),
+  (8890000355,1300000000888,1,'2026-04-07','S1','S1_L2_012',212.9472,252.36,'red','up',0,1),
+  (8890000356,1300000000888,1,'2026-04-08','S1','S1_L2_012',197.5557,252.36,'red','down',0,1),
+  (8890000357,1300000000888,1,'2026-04-09','S1','S1_L2_012',218.4378,252.36,'red','up',0,1),
+  (8890000358,1300000000888,1,'2026-04-10','S1','S1_L2_012',212.7259,252.36,'red','down',0,1),
+  (8890000359,1300000000888,1,'2026-04-11','S1','S1_L2_012',208.4797,252.36,'red','flat',0,1),
+  (8890000360,1300000000888,1,'2026-04-12','S1','S1_L2_012',207.6302,252.36,'red','flat',0,1),
+  (8890000361,1300000000888,1,'2026-03-14','S2','S2_L2_001',23.1686,20.0,'red','flat',0,1),
+  (8890000362,1300000000888,1,'2026-03-15','S2','S2_L2_001',22.6116,20.0,'red','down',0,1),
+  (8890000363,1300000000888,1,'2026-03-16','S2','S2_L2_001',22.5602,20.0,'red','flat',0,1),
+  (8890000364,1300000000888,1,'2026-03-17','S2','S2_L2_001',21.2805,20.0,'yellow','down',0,1),
+  (8890000365,1300000000888,1,'2026-03-18','S2','S2_L2_001',21.2651,20.0,'yellow','flat',0,1),
+  (8890000366,1300000000888,1,'2026-03-19','S2','S2_L2_001',21.9673,20.0,'yellow','up',0,1),
+  (8890000367,1300000000888,1,'2026-03-20','S2','S2_L2_001',20.8982,20.0,'yellow','down',0,1),
+  (8890000368,1300000000888,1,'2026-03-21','S2','S2_L2_001',21.6087,20.0,'yellow','up',0,1),
+  (8890000369,1300000000888,1,'2026-03-22','S2','S2_L2_001',22.5724,20.0,'red','up',0,1),
+  (8890000370,1300000000888,1,'2026-03-23','S2','S2_L2_001',21.561,20.0,'yellow','down',0,1),
+  (8890000371,1300000000888,1,'2026-03-24','S2','S2_L2_001',22.3519,20.0,'red','up',0,1),
+  (8890000372,1300000000888,1,'2026-03-25','S2','S2_L2_001',21.1082,20.0,'yellow','down',0,1),
+  (8890000373,1300000000888,1,'2026-03-26','S2','S2_L2_001',21.6742,20.0,'yellow','up',0,1),
+  (8890000374,1300000000888,1,'2026-03-27','S2','S2_L2_001',22.6755,20.0,'red','up',0,1),
+  (8890000375,1300000000888,1,'2026-03-28','S2','S2_L2_001',22.1376,20.0,'red','down',0,1),
+  (8890000376,1300000000888,1,'2026-03-29','S2','S2_L2_001',22.1916,20.0,'red','flat',0,1),
+  (8890000377,1300000000888,1,'2026-03-30','S2','S2_L2_001',23.1251,20.0,'red','up',0,1),
+  (8890000378,1300000000888,1,'2026-03-31','S2','S2_L2_001',22.8559,20.0,'red','flat',0,1),
+  (8890000379,1300000000888,1,'2026-04-01','S2','S2_L2_001',21.4213,20.0,'yellow','down',0,1),
+  (8890000380,1300000000888,1,'2026-04-02','S2','S2_L2_001',22.8698,20.0,'red','up',0,1),
+  (8890000381,1300000000888,1,'2026-04-03','S2','S2_L2_001',21.5939,20.0,'yellow','down',0,1),
+  (8890000382,1300000000888,1,'2026-04-04','S2','S2_L2_001',21.9884,20.0,'yellow','flat',0,1),
+  (8890000383,1300000000888,1,'2026-04-05','S2','S2_L2_001',22.01,20.0,'red','flat',0,1),
+  (8890000384,1300000000888,1,'2026-04-06','S2','S2_L2_001',22.7082,20.0,'red','up',0,1),
+  (8890000385,1300000000888,1,'2026-04-07','S2','S2_L2_001',21.2547,20.0,'yellow','down',0,1),
+  (8890000386,1300000000888,1,'2026-04-08','S2','S2_L2_001',22.2982,20.0,'red','up',0,1),
+  (8890000387,1300000000888,1,'2026-04-09','S2','S2_L2_001',22.3458,20.0,'red','flat',0,1),
+  (8890000388,1300000000888,1,'2026-04-10','S2','S2_L2_001',22.5356,20.0,'red','flat',0,1),
+  (8890000389,1300000000888,1,'2026-04-11','S2','S2_L2_001',21.8611,20.0,'yellow','down',0,1),
+  (8890000390,1300000000888,1,'2026-04-12','S2','S2_L2_001',22.6623,20.0,'red','up',0,1),
+  (8890000391,1300000000888,1,'2026-03-14','S2','S2_L2_002',83.0386,99.0,'red','flat',0,1),
+  (8890000392,1300000000888,1,'2026-03-15','S2','S2_L2_002',85.7173,99.0,'red','up',0,1),
+  (8890000393,1300000000888,1,'2026-03-16','S2','S2_L2_002',84.9744,99.0,'red','flat',0,1),
+  (8890000394,1300000000888,1,'2026-03-17','S2','S2_L2_002',82.2163,99.0,'red','down',0,1),
+  (8890000395,1300000000888,1,'2026-03-18','S2','S2_L2_002',82.8555,99.0,'red','flat',0,1),
+  (8890000396,1300000000888,1,'2026-03-19','S2','S2_L2_002',84.5346,99.0,'red','up',0,1),
+  (8890000397,1300000000888,1,'2026-03-20','S2','S2_L2_002',86.0331,99.0,'red','flat',0,1),
+  (8890000398,1300000000888,1,'2026-03-21','S2','S2_L2_002',82.3232,99.0,'red','down',0,1),
+  (8890000399,1300000000888,1,'2026-03-22','S2','S2_L2_002',86.2447,99.0,'red','up',0,1),
+  (8890000400,1300000000888,1,'2026-03-23','S2','S2_L2_002',82.8988,99.0,'red','down',0,1),
+  (8890000401,1300000000888,1,'2026-03-24','S2','S2_L2_002',91.9557,99.0,'red','up',0,1),
+  (8890000402,1300000000888,1,'2026-03-25','S2','S2_L2_002',82.6004,99.0,'red','down',0,1),
+  (8890000403,1300000000888,1,'2026-03-26','S2','S2_L2_002',82.9852,99.0,'red','flat',0,1),
+  (8890000404,1300000000888,1,'2026-03-27','S2','S2_L2_002',85.4947,99.0,'red','up',0,1),
+  (8890000405,1300000000888,1,'2026-03-28','S2','S2_L2_002',82.6989,99.0,'red','down',0,1),
+  (8890000406,1300000000888,1,'2026-03-29','S2','S2_L2_002',87.1105,99.0,'red','up',0,1),
+  (8890000407,1300000000888,1,'2026-03-30','S2','S2_L2_002',89.5936,99.0,'red','up',0,1),
+  (8890000408,1300000000888,1,'2026-03-31','S2','S2_L2_002',84.0116,99.0,'red','down',0,1),
+  (8890000409,1300000000888,1,'2026-04-01','S2','S2_L2_002',85.4406,99.0,'red','flat',0,1),
+  (8890000410,1300000000888,1,'2026-04-02','S2','S2_L2_002',83.6797,99.0,'red','down',0,1),
+  (8890000411,1300000000888,1,'2026-04-03','S2','S2_L2_002',84.9999,99.0,'red','flat',0,1),
+  (8890000412,1300000000888,1,'2026-04-04','S2','S2_L2_002',88.6509,99.0,'red','up',0,1),
+  (8890000413,1300000000888,1,'2026-04-05','S2','S2_L2_002',87.2803,99.0,'red','flat',0,1),
+  (8890000414,1300000000888,1,'2026-04-06','S2','S2_L2_002',82.6942,99.0,'red','down',0,1),
+  (8890000415,1300000000888,1,'2026-04-07','S2','S2_L2_002',88.9421,99.0,'red','up',0,1),
+  (8890000416,1300000000888,1,'2026-04-08','S2','S2_L2_002',87.9633,99.0,'red','flat',0,1),
+  (8890000417,1300000000888,1,'2026-04-09','S2','S2_L2_002',86.2402,99.0,'red','flat',0,1),
+  (8890000418,1300000000888,1,'2026-04-10','S2','S2_L2_002',83.319,99.0,'red','down',0,1),
+  (8890000419,1300000000888,1,'2026-04-11','S2','S2_L2_002',85.1676,99.0,'red','up',0,1),
+  (8890000420,1300000000888,1,'2026-04-12','S2','S2_L2_002',82.9716,99.0,'red','down',0,1),
+  (8890000421,1300000000888,1,'2026-03-14','S2','S2_L2_003',234.8884,251.78,'red','flat',0,1),
+  (8890000422,1300000000888,1,'2026-03-15','S2','S2_L2_003',232.8974,251.78,'red','flat',0,1),
+  (8890000423,1300000000888,1,'2026-03-16','S2','S2_L2_003',248.6869,251.78,'yellow','up',0,1),
+  (8890000424,1300000000888,1,'2026-03-17','S2','S2_L2_003',250.0679,251.78,'yellow','flat',0,1),
+  (8890000425,1300000000888,1,'2026-03-18','S2','S2_L2_003',250.3624,251.78,'yellow','flat',0,1),
+  (8890000426,1300000000888,1,'2026-03-19','S2','S2_L2_003',242.0564,251.78,'yellow','down',0,1),
+  (8890000427,1300000000888,1,'2026-03-20','S2','S2_L2_003',247.5949,251.78,'yellow','up',0,1),
+  (8890000428,1300000000888,1,'2026-03-21','S2','S2_L2_003',238.2812,251.78,'red','down',0,1),
+  (8890000429,1300000000888,1,'2026-03-22','S2','S2_L2_003',250.3562,251.78,'yellow','up',0,1),
+  (8890000430,1300000000888,1,'2026-03-23','S2','S2_L2_003',236.6651,251.78,'red','down',0,1),
+  (8890000431,1300000000888,1,'2026-03-24','S2','S2_L2_003',247.6043,251.78,'yellow','up',0,1),
+  (8890000432,1300000000888,1,'2026-03-25','S2','S2_L2_003',250.6697,251.78,'yellow','flat',0,1),
+  (8890000433,1300000000888,1,'2026-03-26','S2','S2_L2_003',235.6108,251.78,'red','down',0,1),
+  (8890000434,1300000000888,1,'2026-03-27','S2','S2_L2_003',244.8192,251.78,'yellow','up',0,1),
+  (8890000435,1300000000888,1,'2026-03-28','S2','S2_L2_003',254.5987,251.78,'green','up',0,1),
+  (8890000436,1300000000888,1,'2026-03-29','S2','S2_L2_003',260.2756,251.78,'green','up',0,1),
+  (8890000437,1300000000888,1,'2026-03-30','S2','S2_L2_003',237.496,251.78,'red','down',0,1),
+  (8890000438,1300000000888,1,'2026-03-31','S2','S2_L2_003',251.2542,251.78,'yellow','up',0,1),
+  (8890000439,1300000000888,1,'2026-04-01','S2','S2_L2_003',239.4958,251.78,'yellow','down',0,1),
+  (8890000440,1300000000888,1,'2026-04-02','S2','S2_L2_003',238.6802,251.78,'red','flat',0,1),
+  (8890000441,1300000000888,1,'2026-04-03','S2','S2_L2_003',260.6271,251.78,'green','up',0,1),
+  (8890000442,1300000000888,1,'2026-04-04','S2','S2_L2_003',253.7036,251.78,'green','down',0,1),
+  (8890000443,1300000000888,1,'2026-04-05','S2','S2_L2_003',242.7174,251.78,'yellow','down',0,1),
+  (8890000444,1300000000888,1,'2026-04-06','S2','S2_L2_003',250.3522,251.78,'yellow','up',0,1),
+  (8890000445,1300000000888,1,'2026-04-07','S2','S2_L2_003',253.5078,251.78,'green','flat',0,1),
+  (8890000446,1300000000888,1,'2026-04-08','S2','S2_L2_003',250.0706,251.78,'yellow','flat',0,1),
+  (8890000447,1300000000888,1,'2026-04-09','S2','S2_L2_003',265.4861,251.78,'green','up',0,1),
+  (8890000448,1300000000888,1,'2026-04-10','S2','S2_L2_003',253.2379,251.78,'green','down',0,1),
+  (8890000449,1300000000888,1,'2026-04-11','S2','S2_L2_003',226.3857,251.78,'red','down',0,1),
+  (8890000450,1300000000888,1,'2026-04-12','S2','S2_L2_003',246.5526,251.78,'yellow','up',0,1),
+  (8890000451,1300000000888,1,'2026-03-14','S3','S3_L2_001',17.5521,14.7085,'red','flat',0,1),
+  (8890000452,1300000000888,1,'2026-03-15','S3','S3_L2_001',17.8504,14.7085,'red','flat',0,1),
+  (8890000453,1300000000888,1,'2026-03-16','S3','S3_L2_001',17.5178,14.7085,'red','flat',0,1),
+  (8890000454,1300000000888,1,'2026-03-17','S3','S3_L2_001',18.6212,14.7085,'red','up',0,1),
+  (8890000455,1300000000888,1,'2026-03-18','S3','S3_L2_001',18.1506,14.7085,'red','down',0,1),
+  (8890000456,1300000000888,1,'2026-03-19','S3','S3_L2_001',18.4171,14.7085,'red','flat',0,1),
+  (8890000457,1300000000888,1,'2026-03-20','S3','S3_L2_001',18.0924,14.7085,'red','flat',0,1),
+  (8890000458,1300000000888,1,'2026-03-21','S3','S3_L2_001',17.5123,14.7085,'red','down',0,1),
+  (8890000459,1300000000888,1,'2026-03-22','S3','S3_L2_001',17.6196,14.7085,'red','flat',0,1),
+  (8890000460,1300000000888,1,'2026-03-23','S3','S3_L2_001',18.6058,14.7085,'red','up',0,1),
+  (8890000461,1300000000888,1,'2026-03-24','S3','S3_L2_001',18.1186,14.7085,'red','down',0,1),
+  (8890000462,1300000000888,1,'2026-03-25','S3','S3_L2_001',18.5716,14.7085,'red','up',0,1),
+  (8890000463,1300000000888,1,'2026-03-26','S3','S3_L2_001',16.4279,14.7085,'red','down',0,1),
+  (8890000464,1300000000888,1,'2026-03-27','S3','S3_L2_001',18.7544,14.7085,'red','up',0,1),
+  (8890000465,1300000000888,1,'2026-03-28','S3','S3_L2_001',17.8809,14.7085,'red','down',0,1),
+  (8890000466,1300000000888,1,'2026-03-29','S3','S3_L2_001',19.333,14.7085,'red','up',0,1),
+  (8890000467,1300000000888,1,'2026-03-30','S3','S3_L2_001',17.8718,14.7085,'red','down',0,1),
+  (8890000468,1300000000888,1,'2026-03-31','S3','S3_L2_001',18.1653,14.7085,'red','flat',0,1),
+  (8890000469,1300000000888,1,'2026-04-01','S3','S3_L2_001',18.5095,14.7085,'red','flat',0,1),
+  (8890000470,1300000000888,1,'2026-04-02','S3','S3_L2_001',17.673,14.7085,'red','down',0,1),
+  (8890000471,1300000000888,1,'2026-04-03','S3','S3_L2_001',18.6251,14.7085,'red','up',0,1),
+  (8890000472,1300000000888,1,'2026-04-04','S3','S3_L2_001',17.7986,14.7085,'red','down',0,1),
+  (8890000473,1300000000888,1,'2026-04-05','S3','S3_L2_001',18.8518,14.7085,'red','up',0,1),
+  (8890000474,1300000000888,1,'2026-04-06','S3','S3_L2_001',18.5818,14.7085,'red','flat',0,1),
+  (8890000475,1300000000888,1,'2026-04-07','S3','S3_L2_001',18.4198,14.7085,'red','flat',0,1),
+  (8890000476,1300000000888,1,'2026-04-08','S3','S3_L2_001',17.7556,14.7085,'red','down',0,1),
+  (8890000477,1300000000888,1,'2026-04-09','S3','S3_L2_001',18.0352,14.7085,'red','flat',0,1),
+  (8890000478,1300000000888,1,'2026-04-10','S3','S3_L2_001',18.3132,14.7085,'red','flat',0,1),
+  (8890000479,1300000000888,1,'2026-04-11','S3','S3_L2_001',17.0428,14.7085,'red','down',0,1),
+  (8890000480,1300000000888,1,'2026-04-12','S3','S3_L2_001',17.8495,14.7085,'red','up',0,1),
+  (8890000481,1300000000888,1,'2026-03-14','S3','S3_L2_002',72.4776,100.007,'red','flat',0,1),
+  (8890000482,1300000000888,1,'2026-03-15','S3','S3_L2_002',74.7557,100.007,'red','up',0,1),
+  (8890000483,1300000000888,1,'2026-03-16','S3','S3_L2_002',77.1105,100.007,'red','up',0,1),
+  (8890000484,1300000000888,1,'2026-03-17','S3','S3_L2_002',76.5462,100.007,'red','flat',0,1),
+  (8890000485,1300000000888,1,'2026-03-18','S3','S3_L2_002',74.527,100.007,'red','down',0,1),
+  (8890000486,1300000000888,1,'2026-03-19','S3','S3_L2_002',74.0882,100.007,'red','flat',0,1),
+  (8890000487,1300000000888,1,'2026-03-20','S3','S3_L2_002',74.1447,100.007,'red','flat',0,1),
+  (8890000488,1300000000888,1,'2026-03-21','S3','S3_L2_002',73.2402,100.007,'red','flat',0,1),
+  (8890000489,1300000000888,1,'2026-03-22','S3','S3_L2_002',73.5887,100.007,'red','flat',0,1),
+  (8890000490,1300000000888,1,'2026-03-23','S3','S3_L2_002',78.06,100.007,'red','up',0,1),
+  (8890000491,1300000000888,1,'2026-03-24','S3','S3_L2_002',73.2019,100.007,'red','down',0,1),
+  (8890000492,1300000000888,1,'2026-03-25','S3','S3_L2_002',76.4619,100.007,'red','up',0,1),
+  (8890000493,1300000000888,1,'2026-03-26','S3','S3_L2_002',75.0052,100.007,'red','flat',0,1),
+  (8890000494,1300000000888,1,'2026-03-27','S3','S3_L2_002',81.9887,100.007,'red','up',0,1),
+  (8890000495,1300000000888,1,'2026-03-28','S3','S3_L2_002',72.3024,100.007,'red','down',0,1),
+  (8890000496,1300000000888,1,'2026-03-29','S3','S3_L2_002',76.8654,100.007,'red','up',0,1),
+  (8890000497,1300000000888,1,'2026-03-30','S3','S3_L2_002',75.657,100.007,'red','flat',0,1),
+  (8890000498,1300000000888,1,'2026-03-31','S3','S3_L2_002',74.6543,100.007,'red','flat',0,1),
+  (8890000499,1300000000888,1,'2026-04-01','S3','S3_L2_002',77.1449,100.007,'red','up',0,1),
+  (8890000500,1300000000888,1,'2026-04-02','S3','S3_L2_002',76.7789,100.007,'red','flat',0,1),
+  (8890000501,1300000000888,1,'2026-04-03','S3','S3_L2_002',73.9716,100.007,'red','down',0,1),
+  (8890000502,1300000000888,1,'2026-04-04','S3','S3_L2_002',77.3995,100.007,'red','up',0,1),
+  (8890000503,1300000000888,1,'2026-04-05','S3','S3_L2_002',77.3144,100.007,'red','flat',0,1),
+  (8890000504,1300000000888,1,'2026-04-06','S3','S3_L2_002',79.4244,100.007,'red','up',0,1),
+  (8890000505,1300000000888,1,'2026-04-07','S3','S3_L2_002',75.0237,100.007,'red','down',0,1),
+  (8890000506,1300000000888,1,'2026-04-08','S3','S3_L2_002',79.7934,100.007,'red','up',0,1),
+  (8890000507,1300000000888,1,'2026-04-09','S3','S3_L2_002',75.971,100.007,'red','down',0,1),
+  (8890000508,1300000000888,1,'2026-04-10','S3','S3_L2_002',71.8919,100.007,'red','down',0,1),
+  (8890000509,1300000000888,1,'2026-04-11','S3','S3_L2_002',77.6215,100.007,'red','up',0,1),
+  (8890000510,1300000000888,1,'2026-04-12','S3','S3_L2_002',76.2351,100.007,'red','flat',0,1),
+  (8890000511,1300000000888,1,'2026-03-14','S3','S3_L2_003',257.3492,265.43,'yellow','flat',0,1),
+  (8890000512,1300000000888,1,'2026-03-15','S3','S3_L2_003',258.0788,265.43,'yellow','flat',0,1),
+  (8890000513,1300000000888,1,'2026-03-16','S3','S3_L2_003',244.6287,265.43,'red','down',0,1),
+  (8890000514,1300000000888,1,'2026-03-17','S3','S3_L2_003',254.2762,265.43,'yellow','up',0,1),
+  (8890000515,1300000000888,1,'2026-03-18','S3','S3_L2_003',245.7268,265.43,'red','down',0,1),
+  (8890000516,1300000000888,1,'2026-03-19','S3','S3_L2_003',247.2442,265.43,'red','flat',0,1),
+  (8890000517,1300000000888,1,'2026-03-20','S3','S3_L2_003',247.98,265.43,'red','flat',0,1),
+  (8890000518,1300000000888,1,'2026-03-21','S3','S3_L2_003',262.1249,265.43,'yellow','up',0,1),
+  (8890000519,1300000000888,1,'2026-03-22','S3','S3_L2_003',265.0125,265.43,'yellow','flat',0,1),
+  (8890000520,1300000000888,1,'2026-03-23','S3','S3_L2_003',272.6668,265.43,'green','up',0,1),
+  (8890000521,1300000000888,1,'2026-03-24','S3','S3_L2_003',252.4703,265.43,'yellow','down',0,1),
+  (8890000522,1300000000888,1,'2026-03-25','S3','S3_L2_003',246.5156,265.43,'red','down',0,1),
+  (8890000523,1300000000888,1,'2026-03-26','S3','S3_L2_003',245.5439,265.43,'red','flat',0,1),
+  (8890000524,1300000000888,1,'2026-03-27','S3','S3_L2_003',265.0952,265.43,'yellow','up',0,1),
+  (8890000525,1300000000888,1,'2026-03-28','S3','S3_L2_003',241.2277,265.43,'red','down',0,1),
+  (8890000526,1300000000888,1,'2026-03-29','S3','S3_L2_003',250.4945,265.43,'red','up',0,1),
+  (8890000527,1300000000888,1,'2026-03-30','S3','S3_L2_003',248.6046,265.43,'red','flat',0,1),
+  (8890000528,1300000000888,1,'2026-03-31','S3','S3_L2_003',266.1765,265.43,'green','up',0,1),
+  (8890000529,1300000000888,1,'2026-04-01','S3','S3_L2_003',245.2111,265.43,'red','down',0,1),
+  (8890000530,1300000000888,1,'2026-04-02','S3','S3_L2_003',261.2576,265.43,'yellow','up',0,1),
+  (8890000531,1300000000888,1,'2026-04-03','S3','S3_L2_003',262.8637,265.43,'yellow','flat',0,1),
+  (8890000532,1300000000888,1,'2026-04-04','S3','S3_L2_003',251.634,265.43,'red','down',0,1),
+  (8890000533,1300000000888,1,'2026-04-05','S3','S3_L2_003',256.431,265.43,'yellow','flat',0,1),
+  (8890000534,1300000000888,1,'2026-04-06','S3','S3_L2_003',241.2251,265.43,'red','down',0,1),
+  (8890000535,1300000000888,1,'2026-04-07','S3','S3_L2_003',252.2301,265.43,'yellow','up',0,1),
+  (8890000536,1300000000888,1,'2026-04-08','S3','S3_L2_003',251.2679,265.43,'red','flat',0,1),
+  (8890000537,1300000000888,1,'2026-04-09','S3','S3_L2_003',233.3281,265.43,'red','down',0,1),
+  (8890000538,1300000000888,1,'2026-04-10','S3','S3_L2_003',256.0508,265.43,'yellow','up',0,1),
+  (8890000539,1300000000888,1,'2026-04-11','S3','S3_L2_003',255.5939,265.43,'yellow','flat',0,1),
+  (8890000540,1300000000888,1,'2026-04-12','S3','S3_L2_003',240.0517,265.43,'red','down',0,1),
+  (8890000541,1300000000888,1,'2026-03-14','S3','S3_L2_004',17.7398,15.2915,'red','flat',0,1),
+  (8890000542,1300000000888,1,'2026-03-15','S3','S3_L2_004',17.3688,15.2915,'red','down',0,1),
+  (8890000543,1300000000888,1,'2026-03-16','S3','S3_L2_004',17.4646,15.2915,'red','flat',0,1),
+  (8890000544,1300000000888,1,'2026-03-17','S3','S3_L2_004',17.9961,15.2915,'red','up',0,1),
+  (8890000545,1300000000888,1,'2026-03-18','S3','S3_L2_004',17.4934,15.2915,'red','down',0,1),
+  (8890000546,1300000000888,1,'2026-03-19','S3','S3_L2_004',17.8973,15.2915,'red','up',0,1),
+  (8890000547,1300000000888,1,'2026-03-20','S3','S3_L2_004',16.6413,15.2915,'yellow','down',0,1),
+  (8890000548,1300000000888,1,'2026-03-21','S3','S3_L2_004',17.5512,15.2915,'red','up',0,1),
+  (8890000549,1300000000888,1,'2026-03-22','S3','S3_L2_004',17.7535,15.2915,'red','flat',0,1),
+  (8890000550,1300000000888,1,'2026-03-23','S3','S3_L2_004',17.5756,15.2915,'red','flat',0,1),
+  (8890000551,1300000000888,1,'2026-03-24','S3','S3_L2_004',17.318,15.2915,'red','flat',0,1),
+  (8890000552,1300000000888,1,'2026-03-25','S3','S3_L2_004',17.377,15.2915,'red','flat',0,1),
+  (8890000553,1300000000888,1,'2026-03-26','S3','S3_L2_004',17.8879,15.2915,'red','up',0,1),
+  (8890000554,1300000000888,1,'2026-03-27','S3','S3_L2_004',18.6464,15.2915,'red','up',0,1),
+  (8890000555,1300000000888,1,'2026-03-28','S3','S3_L2_004',17.1012,15.2915,'red','down',0,1),
+  (8890000556,1300000000888,1,'2026-03-29','S3','S3_L2_004',17.7022,15.2915,'red','up',0,1),
+  (8890000557,1300000000888,1,'2026-03-30','S3','S3_L2_004',18.3733,15.2915,'red','up',0,1),
+  (8890000558,1300000000888,1,'2026-03-31','S3','S3_L2_004',18.0292,15.2915,'red','flat',0,1),
+  (8890000559,1300000000888,1,'2026-04-01','S3','S3_L2_004',17.7999,15.2915,'red','flat',0,1),
+  (8890000560,1300000000888,1,'2026-04-02','S3','S3_L2_004',17.6087,15.2915,'red','flat',0,1),
+  (8890000561,1300000000888,1,'2026-04-03','S3','S3_L2_004',17.8572,15.2915,'red','flat',0,1),
+  (8890000562,1300000000888,1,'2026-04-04','S3','S3_L2_004',17.796,15.2915,'red','flat',0,1),
+  (8890000563,1300000000888,1,'2026-04-05','S3','S3_L2_004',16.6792,15.2915,'yellow','down',0,1),
+  (8890000564,1300000000888,1,'2026-04-06','S3','S3_L2_004',17.4668,15.2915,'red','up',0,1),
+  (8890000565,1300000000888,1,'2026-04-07','S3','S3_L2_004',16.8061,15.2915,'yellow','down',0,1),
+  (8890000566,1300000000888,1,'2026-04-08','S3','S3_L2_004',18.5415,15.2915,'red','up',0,1),
+  (8890000567,1300000000888,1,'2026-04-09','S3','S3_L2_004',18.2906,15.2915,'red','flat',0,1),
+  (8890000568,1300000000888,1,'2026-04-10','S3','S3_L2_004',17.428,15.2915,'red','down',0,1),
+  (8890000569,1300000000888,1,'2026-04-11','S3','S3_L2_004',18.2811,15.2915,'red','up',0,1),
+  (8890000570,1300000000888,1,'2026-04-12','S3','S3_L2_004',19.1614,15.2915,'red','up',0,1),
+  (8890000571,1300000000888,1,'2026-03-14','S3','S3_L2_005',73.2996,89.993,'red','flat',0,1),
+  (8890000572,1300000000888,1,'2026-03-15','S3','S3_L2_005',72.8378,89.993,'red','flat',0,1),
+  (8890000573,1300000000888,1,'2026-03-16','S3','S3_L2_005',74.9697,89.993,'red','up',0,1),
+  (8890000574,1300000000888,1,'2026-03-17','S3','S3_L2_005',74.8559,89.993,'red','flat',0,1),
+  (8890000575,1300000000888,1,'2026-03-18','S3','S3_L2_005',71.4166,89.993,'red','down',0,1),
+  (8890000576,1300000000888,1,'2026-03-19','S3','S3_L2_005',75.0383,89.993,'red','up',0,1),
+  (8890000577,1300000000888,1,'2026-03-20','S3','S3_L2_005',76.2992,89.993,'red','flat',0,1),
+  (8890000578,1300000000888,1,'2026-03-21','S3','S3_L2_005',71.4701,89.993,'red','down',0,1),
+  (8890000579,1300000000888,1,'2026-03-22','S3','S3_L2_005',73.1654,89.993,'red','up',0,1),
+  (8890000580,1300000000888,1,'2026-03-23','S3','S3_L2_005',74.601,89.993,'red','flat',0,1),
+  (8890000581,1300000000888,1,'2026-03-24','S3','S3_L2_005',75.1732,89.993,'red','flat',0,1),
+  (8890000582,1300000000888,1,'2026-03-25','S3','S3_L2_005',72.6495,89.993,'red','down',0,1),
+  (8890000583,1300000000888,1,'2026-03-26','S3','S3_L2_005',72.4108,89.993,'red','flat',0,1),
+  (8890000584,1300000000888,1,'2026-03-27','S3','S3_L2_005',72.5539,89.993,'red','flat',0,1),
+  (8890000585,1300000000888,1,'2026-03-28','S3','S3_L2_005',74.4281,89.993,'red','up',0,1),
+  (8890000586,1300000000888,1,'2026-03-29','S3','S3_L2_005',74.525,89.993,'red','flat',0,1),
+  (8890000587,1300000000888,1,'2026-03-30','S3','S3_L2_005',73.5349,89.993,'red','flat',0,1),
+  (8890000588,1300000000888,1,'2026-03-31','S3','S3_L2_005',70.5665,89.993,'red','down',0,1),
+  (8890000589,1300000000888,1,'2026-04-01','S3','S3_L2_005',71.1718,89.993,'red','flat',0,1),
+  (8890000590,1300000000888,1,'2026-04-02','S3','S3_L2_005',74.9835,89.993,'red','up',0,1),
+  (8890000591,1300000000888,1,'2026-04-03','S3','S3_L2_005',70.8825,89.993,'red','down',0,1),
+  (8890000592,1300000000888,1,'2026-04-04','S3','S3_L2_005',74.0774,89.993,'red','up',0,1),
+  (8890000593,1300000000888,1,'2026-04-05','S3','S3_L2_005',72.7814,89.993,'red','flat',0,1),
+  (8890000594,1300000000888,1,'2026-04-06','S3','S3_L2_005',72.2485,89.993,'red','flat',0,1),
+  (8890000595,1300000000888,1,'2026-04-07','S3','S3_L2_005',73.6367,89.993,'red','flat',0,1),
+  (8890000596,1300000000888,1,'2026-04-08','S3','S3_L2_005',77.2781,89.993,'red','up',0,1),
+  (8890000597,1300000000888,1,'2026-04-09','S3','S3_L2_005',74.2153,89.993,'red','down',0,1),
+  (8890000598,1300000000888,1,'2026-04-10','S3','S3_L2_005',72.9252,89.993,'red','flat',0,1),
+  (8890000599,1300000000888,1,'2026-04-11','S3','S3_L2_005',70.3256,89.993,'red','down',0,1),
+  (8890000600,1300000000888,1,'2026-04-12','S3','S3_L2_005',74.7085,89.993,'red','up',0,1),
+  (8890000601,1300000000888,1,'2026-03-14','S3','S3_L2_006',177.5368,226.14,'red','flat',0,1),
+  (8890000602,1300000000888,1,'2026-03-15','S3','S3_L2_006',185.7272,226.14,'red','up',0,1),
+  (8890000603,1300000000888,1,'2026-03-16','S3','S3_L2_006',187.8994,226.14,'red','flat',0,1),
+  (8890000604,1300000000888,1,'2026-03-17','S3','S3_L2_006',193.0117,226.14,'red','up',0,1),
+  (8890000605,1300000000888,1,'2026-03-18','S3','S3_L2_006',185.6896,226.14,'red','down',0,1),
+  (8890000606,1300000000888,1,'2026-03-19','S3','S3_L2_006',200.9112,226.14,'red','up',0,1),
+  (8890000607,1300000000888,1,'2026-03-20','S3','S3_L2_006',187.3873,226.14,'red','down',0,1),
+  (8890000608,1300000000888,1,'2026-03-21','S3','S3_L2_006',185.0948,226.14,'red','flat',0,1),
+  (8890000609,1300000000888,1,'2026-03-22','S3','S3_L2_006',189.9627,226.14,'red','up',0,1),
+  (8890000610,1300000000888,1,'2026-03-23','S3','S3_L2_006',182.3495,226.14,'red','down',0,1),
+  (8890000611,1300000000888,1,'2026-03-24','S3','S3_L2_006',188.9953,226.14,'red','up',0,1),
+  (8890000612,1300000000888,1,'2026-03-25','S3','S3_L2_006',176.188,226.14,'red','down',0,1),
+  (8890000613,1300000000888,1,'2026-03-26','S3','S3_L2_006',191.6277,226.14,'red','up',0,1),
+  (8890000614,1300000000888,1,'2026-03-27','S3','S3_L2_006',188.1939,226.14,'red','flat',0,1),
+  (8890000615,1300000000888,1,'2026-03-28','S3','S3_L2_006',189.0047,226.14,'red','flat',0,1),
+  (8890000616,1300000000888,1,'2026-03-29','S3','S3_L2_006',188.6905,226.14,'red','flat',0,1),
+  (8890000617,1300000000888,1,'2026-03-30','S3','S3_L2_006',180.6412,226.14,'red','down',0,1),
+  (8890000618,1300000000888,1,'2026-03-31','S3','S3_L2_006',182.7549,226.14,'red','flat',0,1),
+  (8890000619,1300000000888,1,'2026-04-01','S3','S3_L2_006',196.6443,226.14,'red','up',0,1),
+  (8890000620,1300000000888,1,'2026-04-02','S3','S3_L2_006',190.605,226.14,'red','down',0,1),
+  (8890000621,1300000000888,1,'2026-04-03','S3','S3_L2_006',184.4529,226.14,'red','down',0,1),
+  (8890000622,1300000000888,1,'2026-04-04','S3','S3_L2_006',190.1908,226.14,'red','up',0,1),
+  (8890000623,1300000000888,1,'2026-04-05','S3','S3_L2_006',190.1155,226.14,'red','flat',0,1),
+  (8890000624,1300000000888,1,'2026-04-06','S3','S3_L2_006',198.8308,226.14,'red','up',0,1),
+  (8890000625,1300000000888,1,'2026-04-07','S3','S3_L2_006',194.0745,226.14,'red','down',0,1),
+  (8890000626,1300000000888,1,'2026-04-08','S3','S3_L2_006',190.1349,226.14,'red','down',0,1),
+  (8890000627,1300000000888,1,'2026-04-09','S3','S3_L2_006',185.2872,226.14,'red','down',0,1),
+  (8890000628,1300000000888,1,'2026-04-10','S3','S3_L2_006',197.8685,226.14,'red','up',0,1),
+  (8890000629,1300000000888,1,'2026-04-11','S3','S3_L2_006',187.246,226.14,'red','down',0,1),
+  (8890000630,1300000000888,1,'2026-04-12','S3','S3_L2_006',182.9133,226.14,'red','down',0,1),
+  (8890000631,1300000000888,1,'2026-03-14','S4','S4_L2_001',3.3073,3.31,'green','flat',0,1),
+  (8890000632,1300000000888,1,'2026-03-15','S4','S4_L2_001',3.4357,3.31,'yellow','up',0,1),
+  (8890000633,1300000000888,1,'2026-03-16','S4','S4_L2_001',3.363,3.31,'yellow','down',0,1),
+  (8890000634,1300000000888,1,'2026-03-17','S4','S4_L2_001',3.512,3.31,'yellow','up',0,1),
+  (8890000635,1300000000888,1,'2026-03-18','S4','S4_L2_001',3.1389,3.31,'green','down',0,1),
+  (8890000636,1300000000888,1,'2026-03-19','S4','S4_L2_001',3.246,3.31,'green','up',0,1),
+  (8890000637,1300000000888,1,'2026-03-20','S4','S4_L2_001',3.2115,3.31,'green','flat',0,1),
+  (8890000638,1300000000888,1,'2026-03-21','S4','S4_L2_001',3.3844,3.31,'yellow','up',0,1),
+  (8890000639,1300000000888,1,'2026-03-22','S4','S4_L2_001',3.2521,3.31,'green','down',0,1),
+  (8890000640,1300000000888,1,'2026-03-23','S4','S4_L2_001',3.3606,3.31,'yellow','up',0,1),
+  (8890000641,1300000000888,1,'2026-03-24','S4','S4_L2_001',3.1852,3.31,'green','down',0,1),
+  (8890000642,1300000000888,1,'2026-03-25','S4','S4_L2_001',3.2917,3.31,'green','up',0,1),
+  (8890000643,1300000000888,1,'2026-03-26','S4','S4_L2_001',3.5285,3.31,'yellow','up',0,1),
+  (8890000644,1300000000888,1,'2026-03-27','S4','S4_L2_001',3.4632,3.31,'yellow','flat',0,1),
+  (8890000645,1300000000888,1,'2026-03-28','S4','S4_L2_001',3.115,3.31,'green','down',0,1),
+  (8890000646,1300000000888,1,'2026-03-29','S4','S4_L2_001',3.3371,3.31,'yellow','up',0,1),
+  (8890000647,1300000000888,1,'2026-03-30','S4','S4_L2_001',3.3828,3.31,'yellow','flat',0,1),
+  (8890000648,1300000000888,1,'2026-03-31','S4','S4_L2_001',3.2521,3.31,'green','down',0,1),
+  (8890000649,1300000000888,1,'2026-04-01','S4','S4_L2_001',3.1918,3.31,'green','flat',0,1),
+  (8890000650,1300000000888,1,'2026-04-02','S4','S4_L2_001',3.3666,3.31,'yellow','up',0,1),
+  (8890000651,1300000000888,1,'2026-04-03','S4','S4_L2_001',3.311,3.31,'yellow','flat',0,1),
+  (8890000652,1300000000888,1,'2026-04-04','S4','S4_L2_001',3.3557,3.31,'yellow','flat',0,1),
+  (8890000653,1300000000888,1,'2026-04-05','S4','S4_L2_001',3.2853,3.31,'green','down',0,1),
+  (8890000654,1300000000888,1,'2026-04-06','S4','S4_L2_001',3.5319,3.31,'yellow','up',0,1),
+  (8890000655,1300000000888,1,'2026-04-07','S4','S4_L2_001',3.2105,3.31,'green','down',0,1),
+  (8890000656,1300000000888,1,'2026-04-08','S4','S4_L2_001',3.2519,3.31,'green','flat',0,1),
+  (8890000657,1300000000888,1,'2026-04-09','S4','S4_L2_001',3.352,3.31,'yellow','up',0,1),
+  (8890000658,1300000000888,1,'2026-04-10','S4','S4_L2_001',3.3735,3.31,'yellow','flat',0,1),
+  (8890000659,1300000000888,1,'2026-04-11','S4','S4_L2_001',3.1645,3.31,'green','down',0,1),
+  (8890000660,1300000000888,1,'2026-04-12','S4','S4_L2_001',3.4295,3.31,'yellow','up',0,1),
+  (8890000661,1300000000888,1,'2026-03-14','S4','S4_L2_002',93.7293,99.0,'red','flat',0,1),
+  (8890000662,1300000000888,1,'2026-03-15','S4','S4_L2_002',92.2685,99.0,'red','flat',0,1),
+  (8890000663,1300000000888,1,'2026-03-16','S4','S4_L2_002',97.0776,99.0,'yellow','up',0,1),
+  (8890000664,1300000000888,1,'2026-03-17','S4','S4_L2_002',95.7129,99.0,'yellow','flat',0,1),
+  (8890000665,1300000000888,1,'2026-03-18','S4','S4_L2_002',94.3209,99.0,'yellow','flat',0,1),
+  (8890000666,1300000000888,1,'2026-03-19','S4','S4_L2_002',99.5393,99.0,'green','up',0,1),
+  (8890000667,1300000000888,1,'2026-03-20','S4','S4_L2_002',97.3763,99.0,'yellow','down',0,1),
+  (8890000668,1300000000888,1,'2026-03-21','S4','S4_L2_002',97.1385,99.0,'yellow','flat',0,1),
+  (8890000669,1300000000888,1,'2026-03-22','S4','S4_L2_002',98.6241,99.0,'yellow','flat',0,1),
+  (8890000670,1300000000888,1,'2026-03-23','S4','S4_L2_002',100.0161,99.0,'green','flat',0,1),
+  (8890000671,1300000000888,1,'2026-03-24','S4','S4_L2_002',92.3358,99.0,'red','down',0,1),
+  (8890000672,1300000000888,1,'2026-03-25','S4','S4_L2_002',99.0564,99.0,'green','up',0,1),
+  (8890000673,1300000000888,1,'2026-03-26','S4','S4_L2_002',91.736,99.0,'red','down',0,1),
+  (8890000674,1300000000888,1,'2026-03-27','S4','S4_L2_002',94.6883,99.0,'yellow','up',0,1),
+  (8890000675,1300000000888,1,'2026-03-28','S4','S4_L2_002',99.9453,99.0,'green','up',0,1),
+  (8890000676,1300000000888,1,'2026-03-29','S4','S4_L2_002',99.0115,99.0,'green','flat',0,1),
+  (8890000677,1300000000888,1,'2026-03-30','S4','S4_L2_002',98.9344,99.0,'yellow','flat',0,1),
+  (8890000678,1300000000888,1,'2026-03-31','S4','S4_L2_002',97.5299,99.0,'yellow','flat',0,1),
+  (8890000679,1300000000888,1,'2026-04-01','S4','S4_L2_002',101.1118,99.0,'green','up',0,1),
+  (8890000680,1300000000888,1,'2026-04-02','S4','S4_L2_002',92.5163,99.0,'red','down',0,1),
+  (8890000681,1300000000888,1,'2026-04-03','S4','S4_L2_002',96.112,99.0,'yellow','up',0,1),
+  (8890000682,1300000000888,1,'2026-04-04','S4','S4_L2_002',97.1378,99.0,'yellow','flat',0,1),
+  (8890000683,1300000000888,1,'2026-04-05','S4','S4_L2_002',102.9227,99.0,'green','up',0,1),
+  (8890000684,1300000000888,1,'2026-04-06','S4','S4_L2_002',99.9873,99.0,'green','down',0,1),
+  (8890000685,1300000000888,1,'2026-04-07','S4','S4_L2_002',100.0218,99.0,'green','flat',0,1),
+  (8890000686,1300000000888,1,'2026-04-08','S4','S4_L2_002',94.7845,99.0,'yellow','down',0,1),
+  (8890000687,1300000000888,1,'2026-04-09','S4','S4_L2_002',103.5465,99.0,'green','up',0,1),
+  (8890000688,1300000000888,1,'2026-04-10','S4','S4_L2_002',98.373,99.0,'yellow','down',0,1),
+  (8890000689,1300000000888,1,'2026-04-11','S4','S4_L2_002',94.0728,99.0,'yellow','down',0,1),
+  (8890000690,1300000000888,1,'2026-04-12','S4','S4_L2_002',103.825,99.0,'green','up',0,1),
+  (8890000691,1300000000888,1,'2026-03-14','S4','S4_L2_003',119.9425,116.74,'green','flat',0,1),
+  (8890000692,1300000000888,1,'2026-03-15','S4','S4_L2_003',124.3451,116.74,'green','up',0,1),
+  (8890000693,1300000000888,1,'2026-03-16','S4','S4_L2_003',127.5985,116.74,'green','up',0,1),
+  (8890000694,1300000000888,1,'2026-03-17','S4','S4_L2_003',124.8346,116.74,'green','down',0,1),
+  (8890000695,1300000000888,1,'2026-03-18','S4','S4_L2_003',129.1786,116.74,'green','up',0,1),
+  (8890000696,1300000000888,1,'2026-03-19','S4','S4_L2_003',115.2497,116.74,'yellow','down',0,1),
+  (8890000697,1300000000888,1,'2026-03-20','S4','S4_L2_003',118.8876,116.74,'green','up',0,1),
+  (8890000698,1300000000888,1,'2026-03-21','S4','S4_L2_003',119.9104,116.74,'green','flat',0,1),
+  (8890000699,1300000000888,1,'2026-03-22','S4','S4_L2_003',119.4246,116.74,'green','flat',0,1),
+  (8890000700,1300000000888,1,'2026-03-23','S4','S4_L2_003',122.2268,116.74,'green','up',0,1),
+  (8890000701,1300000000888,1,'2026-03-24','S4','S4_L2_003',119.5413,116.74,'green','down',0,1),
+  (8890000702,1300000000888,1,'2026-03-25','S4','S4_L2_003',124.8873,116.74,'green','up',0,1),
+  (8890000703,1300000000888,1,'2026-03-26','S4','S4_L2_003',124.4472,116.74,'green','flat',0,1),
+  (8890000704,1300000000888,1,'2026-03-27','S4','S4_L2_003',122.3756,116.74,'green','flat',0,1),
+  (8890000705,1300000000888,1,'2026-03-28','S4','S4_L2_003',117.2056,116.74,'green','down',0,1),
+  (8890000706,1300000000888,1,'2026-03-29','S4','S4_L2_003',122.8611,116.74,'green','up',0,1),
+  (8890000707,1300000000888,1,'2026-03-30','S4','S4_L2_003',123.3214,116.74,'green','flat',0,1),
+  (8890000708,1300000000888,1,'2026-03-31','S4','S4_L2_003',122.1595,116.74,'green','flat',0,1),
+  (8890000709,1300000000888,1,'2026-04-01','S4','S4_L2_003',120.985,116.74,'green','flat',0,1),
+  (8890000710,1300000000888,1,'2026-04-02','S4','S4_L2_003',125.9542,116.74,'green','up',0,1),
+  (8890000711,1300000000888,1,'2026-04-03','S4','S4_L2_003',118.8876,116.74,'green','down',0,1),
+  (8890000712,1300000000888,1,'2026-04-04','S4','S4_L2_003',119.5465,116.74,'green','flat',0,1),
+  (8890000713,1300000000888,1,'2026-04-05','S4','S4_L2_003',123.2951,116.74,'green','up',0,1),
+  (8890000714,1300000000888,1,'2026-04-06','S4','S4_L2_003',122.801,116.74,'green','flat',0,1),
+  (8890000715,1300000000888,1,'2026-04-07','S4','S4_L2_003',123.968,116.74,'green','flat',0,1),
+  (8890000716,1300000000888,1,'2026-04-08','S4','S4_L2_003',119.8463,116.74,'green','down',0,1),
+  (8890000717,1300000000888,1,'2026-04-09','S4','S4_L2_003',116.1087,116.74,'yellow','down',0,1),
+  (8890000718,1300000000888,1,'2026-04-10','S4','S4_L2_003',116.3884,116.74,'yellow','flat',0,1),
+  (8890000719,1300000000888,1,'2026-04-11','S4','S4_L2_003',119.3072,116.74,'green','up',0,1),
+  (8890000720,1300000000888,1,'2026-04-12','S4','S4_L2_003',123.7498,116.74,'green','up',0,1),
+  (8890000721,1300000000888,1,'2026-03-14','S4','S4_L2_004',28.6286,30.0,'green','flat',0,1),
+  (8890000722,1300000000888,1,'2026-03-15','S4','S4_L2_004',26.6414,30.0,'green','down',0,1),
+  (8890000723,1300000000888,1,'2026-03-16','S4','S4_L2_004',27.1686,30.0,'green','flat',0,1),
+  (8890000724,1300000000888,1,'2026-03-17','S4','S4_L2_004',28.5339,30.0,'green','up',0,1),
+  (8890000725,1300000000888,1,'2026-03-18','S4','S4_L2_004',27.5816,30.0,'green','down',0,1),
+  (8890000726,1300000000888,1,'2026-03-19','S4','S4_L2_004',27.5353,30.0,'green','flat',0,1),
+  (8890000727,1300000000888,1,'2026-03-20','S4','S4_L2_004',27.2772,30.0,'green','flat',0,1),
+  (8890000728,1300000000888,1,'2026-03-21','S4','S4_L2_004',26.8819,30.0,'green','flat',0,1),
+  (8890000729,1300000000888,1,'2026-03-22','S4','S4_L2_004',28.08,30.0,'green','up',0,1),
+  (8890000730,1300000000888,1,'2026-03-23','S4','S4_L2_004',27.6806,30.0,'green','flat',0,1),
+  (8890000731,1300000000888,1,'2026-03-24','S4','S4_L2_004',28.9579,30.0,'green','up',0,1),
+  (8890000732,1300000000888,1,'2026-03-25','S4','S4_L2_004',27.944,30.0,'green','down',0,1),
+  (8890000733,1300000000888,1,'2026-03-26','S4','S4_L2_004',27.1893,30.0,'green','down',0,1),
+  (8890000734,1300000000888,1,'2026-03-27','S4','S4_L2_004',28.5828,30.0,'green','up',0,1),
+  (8890000735,1300000000888,1,'2026-03-28','S4','S4_L2_004',29.1308,30.0,'green','flat',0,1),
+  (8890000736,1300000000888,1,'2026-03-29','S4','S4_L2_004',27.382,30.0,'green','down',0,1),
+  (8890000737,1300000000888,1,'2026-03-30','S4','S4_L2_004',26.5698,30.0,'green','down',0,1),
+  (8890000738,1300000000888,1,'2026-03-31','S4','S4_L2_004',27.5977,30.0,'green','up',0,1),
+  (8890000739,1300000000888,1,'2026-04-01','S4','S4_L2_004',26.8661,30.0,'green','down',0,1),
+  (8890000740,1300000000888,1,'2026-04-02','S4','S4_L2_004',29.379,30.0,'green','up',0,1),
+  (8890000741,1300000000888,1,'2026-04-03','S4','S4_L2_004',26.8343,30.0,'green','down',0,1),
+  (8890000742,1300000000888,1,'2026-04-04','S4','S4_L2_004',27.7247,30.0,'green','up',0,1),
+  (8890000743,1300000000888,1,'2026-04-05','S4','S4_L2_004',29.2378,30.0,'green','up',0,1),
+  (8890000744,1300000000888,1,'2026-04-06','S4','S4_L2_004',28.7318,30.0,'green','flat',0,1),
+  (8890000745,1300000000888,1,'2026-04-07','S4','S4_L2_004',27.5685,30.0,'green','down',0,1),
+  (8890000746,1300000000888,1,'2026-04-08','S4','S4_L2_004',27.3422,30.0,'green','flat',0,1),
+  (8890000747,1300000000888,1,'2026-04-09','S4','S4_L2_004',27.8475,30.0,'green','flat',0,1),
+  (8890000748,1300000000888,1,'2026-04-10','S4','S4_L2_004',27.7983,30.0,'green','flat',0,1),
+  (8890000749,1300000000888,1,'2026-04-11','S4','S4_L2_004',29.257,30.0,'green','up',0,1),
+  (8890000750,1300000000888,1,'2026-04-12','S4','S4_L2_004',27.8701,30.0,'green','down',0,1),
+  (8890000751,1300000000888,1,'2026-03-14','S5','S5_L2_001',12.3076,13.2634,'green','flat',0,1),
+  (8890000752,1300000000888,1,'2026-03-15','S5','S5_L2_001',12.7262,13.2634,'green','up',0,1),
+  (8890000753,1300000000888,1,'2026-03-16','S5','S5_L2_001',12.508,13.2634,'green','flat',0,1),
+  (8890000754,1300000000888,1,'2026-03-17','S5','S5_L2_001',12.2684,13.2634,'green','flat',0,1),
+  (8890000755,1300000000888,1,'2026-03-18','S5','S5_L2_001',12.7546,13.2634,'green','up',0,1),
+  (8890000756,1300000000888,1,'2026-03-19','S5','S5_L2_001',12.002,13.2634,'green','down',0,1),
+  (8890000757,1300000000888,1,'2026-03-20','S5','S5_L2_001',12.3411,13.2634,'green','up',0,1),
+  (8890000758,1300000000888,1,'2026-03-21','S5','S5_L2_001',12.2393,13.2634,'green','flat',0,1),
+  (8890000759,1300000000888,1,'2026-03-22','S5','S5_L2_001',12.7175,13.2634,'green','up',0,1),
+  (8890000760,1300000000888,1,'2026-03-23','S5','S5_L2_001',12.4117,13.2634,'green','down',0,1),
+  (8890000761,1300000000888,1,'2026-03-24','S5','S5_L2_001',12.5407,13.2634,'green','flat',0,1),
+  (8890000762,1300000000888,1,'2026-03-25','S5','S5_L2_001',12.636,13.2634,'green','flat',0,1),
+  (8890000763,1300000000888,1,'2026-03-26','S5','S5_L2_001',11.5643,13.2634,'green','down',0,1),
+  (8890000764,1300000000888,1,'2026-03-27','S5','S5_L2_001',12.0942,13.2634,'green','up',0,1),
+  (8890000765,1300000000888,1,'2026-03-28','S5','S5_L2_001',12.4832,13.2634,'green','up',0,1),
+  (8890000766,1300000000888,1,'2026-03-29','S5','S5_L2_001',12.8178,13.2634,'green','up',0,1),
+  (8890000767,1300000000888,1,'2026-03-30','S5','S5_L2_001',12.6536,13.2634,'green','flat',0,1),
+  (8890000768,1300000000888,1,'2026-03-31','S5','S5_L2_001',12.9291,13.2634,'green','up',0,1),
+  (8890000769,1300000000888,1,'2026-04-01','S5','S5_L2_001',12.3572,13.2634,'green','down',0,1),
+  (8890000770,1300000000888,1,'2026-04-02','S5','S5_L2_001',12.4775,13.2634,'green','flat',0,1),
+  (8890000771,1300000000888,1,'2026-04-03','S5','S5_L2_001',12.2534,13.2634,'green','flat',0,1),
+  (8890000772,1300000000888,1,'2026-04-04','S5','S5_L2_001',12.2773,13.2634,'green','flat',0,1),
+  (8890000773,1300000000888,1,'2026-04-05','S5','S5_L2_001',12.13,13.2634,'green','flat',0,1),
+  (8890000774,1300000000888,1,'2026-04-06','S5','S5_L2_001',12.2371,13.2634,'green','flat',0,1),
+  (8890000775,1300000000888,1,'2026-04-07','S5','S5_L2_001',12.3688,13.2634,'green','flat',0,1),
+  (8890000776,1300000000888,1,'2026-04-08','S5','S5_L2_001',12.1967,13.2634,'green','flat',0,1),
+  (8890000777,1300000000888,1,'2026-04-09','S5','S5_L2_001',12.4498,13.2634,'green','up',0,1),
+  (8890000778,1300000000888,1,'2026-04-10','S5','S5_L2_001',11.7612,13.2634,'green','down',0,1),
+  (8890000779,1300000000888,1,'2026-04-11','S5','S5_L2_001',12.5996,13.2634,'green','up',0,1),
+  (8890000780,1300000000888,1,'2026-04-12','S5','S5_L2_001',12.5061,13.2634,'green','flat',0,1),
+  (8890000781,1300000000888,1,'2026-03-14','S5','S5_L2_002',94.9152,101.4621,'red','flat',0,1),
+  (8890000782,1300000000888,1,'2026-03-15','S5','S5_L2_002',92.4616,101.4621,'red','down',0,1),
+  (8890000783,1300000000888,1,'2026-03-16','S5','S5_L2_002',100.0418,101.4621,'yellow','up',0,1),
+  (8890000784,1300000000888,1,'2026-03-17','S5','S5_L2_002',96.3612,101.4621,'red','down',0,1),
+  (8890000785,1300000000888,1,'2026-03-18','S5','S5_L2_002',94.7773,101.4621,'red','flat',0,1),
+  (8890000786,1300000000888,1,'2026-03-19','S5','S5_L2_002',96.4669,101.4621,'yellow','flat',0,1),
+  (8890000787,1300000000888,1,'2026-03-20','S5','S5_L2_002',95.1138,101.4621,'red','flat',0,1),
+  (8890000788,1300000000888,1,'2026-03-21','S5','S5_L2_002',99.2724,101.4621,'yellow','up',0,1),
+  (8890000789,1300000000888,1,'2026-03-22','S5','S5_L2_002',98.9369,101.4621,'yellow','flat',0,1),
+  (8890000790,1300000000888,1,'2026-03-23','S5','S5_L2_002',97.2647,101.4621,'yellow','flat',0,1),
+  (8890000791,1300000000888,1,'2026-03-24','S5','S5_L2_002',97.9271,101.4621,'yellow','flat',0,1),
+  (8890000792,1300000000888,1,'2026-03-25','S5','S5_L2_002',96.4578,101.4621,'yellow','flat',0,1),
+  (8890000793,1300000000888,1,'2026-03-26','S5','S5_L2_002',99.331,101.4621,'yellow','up',0,1),
+  (8890000794,1300000000888,1,'2026-03-27','S5','S5_L2_002',89.5314,101.4621,'red','down',0,1),
+  (8890000795,1300000000888,1,'2026-03-28','S5','S5_L2_002',92.9864,101.4621,'red','up',0,1),
+  (8890000796,1300000000888,1,'2026-03-29','S5','S5_L2_002',96.2481,101.4621,'red','up',0,1),
+  (8890000797,1300000000888,1,'2026-03-30','S5','S5_L2_002',95.1682,101.4621,'red','flat',0,1),
+  (8890000798,1300000000888,1,'2026-03-31','S5','S5_L2_002',93.6156,101.4621,'red','flat',0,1),
+  (8890000799,1300000000888,1,'2026-04-01','S5','S5_L2_002',98.1558,101.4621,'yellow','up',0,1),
+  (8890000800,1300000000888,1,'2026-04-02','S5','S5_L2_002',93.5351,101.4621,'red','down',0,1),
+  (8890000801,1300000000888,1,'2026-04-03','S5','S5_L2_002',96.9919,101.4621,'yellow','up',0,1),
+  (8890000802,1300000000888,1,'2026-04-04','S5','S5_L2_002',96.7228,101.4621,'yellow','flat',0,1),
+  (8890000803,1300000000888,1,'2026-04-05','S5','S5_L2_002',96.5303,101.4621,'yellow','flat',0,1),
+  (8890000804,1300000000888,1,'2026-04-06','S5','S5_L2_002',93.9664,101.4621,'red','down',0,1),
+  (8890000805,1300000000888,1,'2026-04-07','S5','S5_L2_002',95.8051,101.4621,'red','flat',0,1),
+  (8890000806,1300000000888,1,'2026-04-08','S5','S5_L2_002',99.9105,101.4621,'yellow','up',0,1),
+  (8890000807,1300000000888,1,'2026-04-09','S5','S5_L2_002',97.9348,101.4621,'yellow','flat',0,1),
+  (8890000808,1300000000888,1,'2026-04-10','S5','S5_L2_002',99.147,101.4621,'yellow','flat',0,1),
+  (8890000809,1300000000888,1,'2026-04-11','S5','S5_L2_002',96.132,101.4621,'red','down',0,1),
+  (8890000810,1300000000888,1,'2026-04-12','S5','S5_L2_002',91.4424,101.4621,'red','down',0,1),
+  (8890000811,1300000000888,1,'2026-03-14','S5','S5_L2_003',12.3363,15.0965,'green','flat',0,1),
+  (8890000812,1300000000888,1,'2026-03-15','S5','S5_L2_003',12.5102,15.0965,'green','flat',0,1),
+  (8890000813,1300000000888,1,'2026-03-16','S5','S5_L2_003',12.5874,15.0965,'green','flat',0,1),
+  (8890000814,1300000000888,1,'2026-03-17','S5','S5_L2_003',12.3935,15.0965,'green','flat',0,1),
+  (8890000815,1300000000888,1,'2026-03-18','S5','S5_L2_003',12.1799,15.0965,'green','flat',0,1),
+  (8890000816,1300000000888,1,'2026-03-19','S5','S5_L2_003',12.718,15.0965,'green','up',0,1),
+  (8890000817,1300000000888,1,'2026-03-20','S5','S5_L2_003',12.0124,15.0965,'green','down',0,1),
+  (8890000818,1300000000888,1,'2026-03-21','S5','S5_L2_003',12.7827,15.0965,'green','up',0,1),
+  (8890000819,1300000000888,1,'2026-03-22','S5','S5_L2_003',12.1978,15.0965,'green','down',0,1),
+  (8890000820,1300000000888,1,'2026-03-23','S5','S5_L2_003',12.5503,15.0965,'green','up',0,1),
+  (8890000821,1300000000888,1,'2026-03-24','S5','S5_L2_003',12.9411,15.0965,'green','up',0,1),
+  (8890000822,1300000000888,1,'2026-03-25','S5','S5_L2_003',11.4352,15.0965,'green','down',0,1),
+  (8890000823,1300000000888,1,'2026-03-26','S5','S5_L2_003',12.198,15.0965,'green','up',0,1),
+  (8890000824,1300000000888,1,'2026-03-27','S5','S5_L2_003',12.1201,15.0965,'green','flat',0,1),
+  (8890000825,1300000000888,1,'2026-03-28','S5','S5_L2_003',12.8972,15.0965,'green','up',0,1),
+  (8890000826,1300000000888,1,'2026-03-29','S5','S5_L2_003',12.1191,15.0965,'green','down',0,1),
+  (8890000827,1300000000888,1,'2026-03-30','S5','S5_L2_003',13.2733,15.0965,'green','up',0,1),
+  (8890000828,1300000000888,1,'2026-03-31','S5','S5_L2_003',11.7064,15.0965,'green','down',0,1),
+  (8890000829,1300000000888,1,'2026-04-01','S5','S5_L2_003',12.3974,15.0965,'green','up',0,1),
+  (8890000830,1300000000888,1,'2026-04-02','S5','S5_L2_003',12.1266,15.0965,'green','down',0,1),
+  (8890000831,1300000000888,1,'2026-04-03','S5','S5_L2_003',12.4547,15.0965,'green','up',0,1),
+  (8890000832,1300000000888,1,'2026-04-04','S5','S5_L2_003',12.0608,15.0965,'green','down',0,1),
+  (8890000833,1300000000888,1,'2026-04-05','S5','S5_L2_003',12.1028,15.0965,'green','flat',0,1),
+  (8890000834,1300000000888,1,'2026-04-06','S5','S5_L2_003',11.5979,15.0965,'green','down',0,1),
+  (8890000835,1300000000888,1,'2026-04-07','S5','S5_L2_003',12.3086,15.0965,'green','up',0,1),
+  (8890000836,1300000000888,1,'2026-04-08','S5','S5_L2_003',11.7175,15.0965,'green','down',0,1),
+  (8890000837,1300000000888,1,'2026-04-09','S5','S5_L2_003',11.7868,15.0965,'green','flat',0,1),
+  (8890000838,1300000000888,1,'2026-04-10','S5','S5_L2_003',12.3008,15.0965,'green','up',0,1),
+  (8890000839,1300000000888,1,'2026-04-11','S5','S5_L2_003',12.2241,15.0965,'green','flat',0,1),
+  (8890000840,1300000000888,1,'2026-04-12','S5','S5_L2_003',12.6468,15.0965,'green','up',0,1),
+  (8890000841,1300000000888,1,'2026-03-14','S5','S5_L2_004',98.6311,105.5664,'red','flat',0,1),
+  (8890000842,1300000000888,1,'2026-03-15','S5','S5_L2_004',97.7554,105.5664,'red','flat',0,1),
+  (8890000843,1300000000888,1,'2026-03-16','S5','S5_L2_004',98.0396,105.5664,'red','flat',0,1),
+  (8890000844,1300000000888,1,'2026-03-17','S5','S5_L2_004',94.1877,105.5664,'red','down',0,1),
+  (8890000845,1300000000888,1,'2026-03-18','S5','S5_L2_004',101.4522,105.5664,'yellow','up',0,1),
+  (8890000846,1300000000888,1,'2026-03-19','S5','S5_L2_004',101.4131,105.5664,'yellow','flat',0,1),
+  (8890000847,1300000000888,1,'2026-03-20','S5','S5_L2_004',97.2546,105.5664,'red','down',0,1),
+  (8890000848,1300000000888,1,'2026-03-21','S5','S5_L2_004',97.3935,105.5664,'red','flat',0,1),
+  (8890000849,1300000000888,1,'2026-03-22','S5','S5_L2_004',99.2507,105.5664,'red','flat',0,1),
+  (8890000850,1300000000888,1,'2026-03-23','S5','S5_L2_004',96.8429,105.5664,'red','down',0,1),
+  (8890000851,1300000000888,1,'2026-03-24','S5','S5_L2_004',96.7702,105.5664,'red','flat',0,1),
+  (8890000852,1300000000888,1,'2026-03-25','S5','S5_L2_004',95.9155,105.5664,'red','flat',0,1),
+  (8890000853,1300000000888,1,'2026-03-26','S5','S5_L2_004',96.3446,105.5664,'red','flat',0,1),
+  (8890000854,1300000000888,1,'2026-03-27','S5','S5_L2_004',95.9644,105.5664,'red','flat',0,1),
+  (8890000855,1300000000888,1,'2026-03-28','S5','S5_L2_004',99.4864,105.5664,'red','up',0,1),
+  (8890000856,1300000000888,1,'2026-03-29','S5','S5_L2_004',96.396,105.5664,'red','down',0,1),
+  (8890000857,1300000000888,1,'2026-03-30','S5','S5_L2_004',96.1037,105.5664,'red','flat',0,1),
+  (8890000858,1300000000888,1,'2026-03-31','S5','S5_L2_004',95.5241,105.5664,'red','flat',0,1),
+  (8890000859,1300000000888,1,'2026-04-01','S5','S5_L2_004',92.9753,105.5664,'red','down',0,1),
+  (8890000860,1300000000888,1,'2026-04-02','S5','S5_L2_004',101.9115,105.5664,'yellow','up',0,1),
+  (8890000861,1300000000888,1,'2026-04-03','S5','S5_L2_004',98.8402,105.5664,'red','down',0,1),
+  (8890000862,1300000000888,1,'2026-04-04','S5','S5_L2_004',99.8855,105.5664,'red','flat',0,1),
+  (8890000863,1300000000888,1,'2026-04-05','S5','S5_L2_004',95.8072,105.5664,'red','down',0,1),
+  (8890000864,1300000000888,1,'2026-04-06','S5','S5_L2_004',101.6108,105.5664,'yellow','up',0,1),
+  (8890000865,1300000000888,1,'2026-04-07','S5','S5_L2_004',97.7789,105.5664,'red','down',0,1),
+  (8890000866,1300000000888,1,'2026-04-08','S5','S5_L2_004',101.5974,105.5664,'yellow','up',0,1),
+  (8890000867,1300000000888,1,'2026-04-09','S5','S5_L2_004',97.3157,105.5664,'red','down',0,1),
+  (8890000868,1300000000888,1,'2026-04-10','S5','S5_L2_004',97.2244,105.5664,'red','flat',0,1),
+  (8890000869,1300000000888,1,'2026-04-11','S5','S5_L2_004',95.8128,105.5664,'red','flat',0,1),
+  (8890000870,1300000000888,1,'2026-04-12','S5','S5_L2_004',97.5811,105.5664,'red','flat',0,1),
+  (8890000871,1300000000888,1,'2026-03-14','S5','S5_L2_005',12.6778,14.768,'green','flat',0,1),
+  (8890000872,1300000000888,1,'2026-03-15','S5','S5_L2_005',12.6195,14.768,'green','flat',0,1),
+  (8890000873,1300000000888,1,'2026-03-16','S5','S5_L2_005',12.5376,14.768,'green','flat',0,1),
+  (8890000874,1300000000888,1,'2026-03-17','S5','S5_L2_005',12.0283,14.768,'green','down',0,1),
+  (8890000875,1300000000888,1,'2026-03-18','S5','S5_L2_005',11.809,14.768,'green','flat',0,1),
+  (8890000876,1300000000888,1,'2026-03-19','S5','S5_L2_005',13.1733,14.768,'green','up',0,1),
+  (8890000877,1300000000888,1,'2026-03-20','S5','S5_L2_005',12.4486,14.768,'green','down',0,1),
+  (8890000878,1300000000888,1,'2026-03-21','S5','S5_L2_005',12.7195,14.768,'green','up',0,1),
+  (8890000879,1300000000888,1,'2026-03-22','S5','S5_L2_005',12.5033,14.768,'green','flat',0,1),
+  (8890000880,1300000000888,1,'2026-03-23','S5','S5_L2_005',12.6853,14.768,'green','flat',0,1),
+  (8890000881,1300000000888,1,'2026-03-24','S5','S5_L2_005',12.0494,14.768,'green','down',0,1),
+  (8890000882,1300000000888,1,'2026-03-25','S5','S5_L2_005',12.3624,14.768,'green','up',0,1),
+  (8890000883,1300000000888,1,'2026-03-26','S5','S5_L2_005',12.0204,14.768,'green','down',0,1),
+  (8890000884,1300000000888,1,'2026-03-27','S5','S5_L2_005',12.1212,14.768,'green','flat',0,1),
+  (8890000885,1300000000888,1,'2026-03-28','S5','S5_L2_005',12.2634,14.768,'green','flat',0,1),
+  (8890000886,1300000000888,1,'2026-03-29','S5','S5_L2_005',11.8508,14.768,'green','down',0,1),
+  (8890000887,1300000000888,1,'2026-03-30','S5','S5_L2_005',12.3565,14.768,'green','up',0,1),
+  (8890000888,1300000000888,1,'2026-03-31','S5','S5_L2_005',12.2627,14.768,'green','flat',0,1),
+  (8890000889,1300000000888,1,'2026-04-01','S5','S5_L2_005',12.084,14.768,'green','flat',0,1),
+  (8890000890,1300000000888,1,'2026-04-02','S5','S5_L2_005',12.48,14.768,'green','up',0,1),
+  (8890000891,1300000000888,1,'2026-04-03','S5','S5_L2_005',12.5256,14.768,'green','flat',0,1),
+  (8890000892,1300000000888,1,'2026-04-04','S5','S5_L2_005',12.2153,14.768,'green','down',0,1),
+  (8890000893,1300000000888,1,'2026-04-05','S5','S5_L2_005',13.2862,14.768,'green','up',0,1),
+  (8890000894,1300000000888,1,'2026-04-06','S5','S5_L2_005',12.7999,14.768,'green','down',0,1),
+  (8890000895,1300000000888,1,'2026-04-07','S5','S5_L2_005',12.9515,14.768,'green','flat',0,1),
+  (8890000896,1300000000888,1,'2026-04-08','S5','S5_L2_005',12.4065,14.768,'green','down',0,1),
+  (8890000897,1300000000888,1,'2026-04-09','S5','S5_L2_005',12.8658,14.768,'green','up',0,1),
+  (8890000898,1300000000888,1,'2026-04-10','S5','S5_L2_005',12.8177,14.768,'green','flat',0,1),
+  (8890000899,1300000000888,1,'2026-04-11','S5','S5_L2_005',12.147,14.768,'green','down',0,1),
+  (8890000900,1300000000888,1,'2026-04-12','S5','S5_L2_005',12.2735,14.768,'green','flat',0,1),
+  (8890000901,1300000000888,1,'2026-03-14','S5','S5_L2_006',9.3406,7.0687,'green','flat',0,1),
+  (8890000902,1300000000888,1,'2026-03-15','S5','S5_L2_006',9.5553,7.0687,'green','up',0,1),
+  (8890000903,1300000000888,1,'2026-03-16','S5','S5_L2_006',9.2566,7.0687,'green','down',0,1),
+  (8890000904,1300000000888,1,'2026-03-17','S5','S5_L2_006',9.2114,7.0687,'green','flat',0,1),
+  (8890000905,1300000000888,1,'2026-03-18','S5','S5_L2_006',9.5756,7.0687,'green','up',0,1),
+  (8890000906,1300000000888,1,'2026-03-19','S5','S5_L2_006',9.5235,7.0687,'green','flat',0,1),
+  (8890000907,1300000000888,1,'2026-03-20','S5','S5_L2_006',9.4724,7.0687,'green','flat',0,1),
+  (8890000908,1300000000888,1,'2026-03-21','S5','S5_L2_006',9.1775,7.0687,'green','down',0,1),
+  (8890000909,1300000000888,1,'2026-03-22','S5','S5_L2_006',9.6772,7.0687,'green','up',0,1),
+  (8890000910,1300000000888,1,'2026-03-23','S5','S5_L2_006',9.5385,7.0687,'green','flat',0,1),
+  (8890000911,1300000000888,1,'2026-03-24','S5','S5_L2_006',9.8844,7.0687,'green','up',0,1),
+  (8890000912,1300000000888,1,'2026-03-25','S5','S5_L2_006',9.7793,7.0687,'green','flat',0,1),
+  (8890000913,1300000000888,1,'2026-03-26','S5','S5_L2_006',9.2418,7.0687,'green','down',0,1),
+  (8890000914,1300000000888,1,'2026-03-27','S5','S5_L2_006',9.7346,7.0687,'green','up',0,1),
+  (8890000915,1300000000888,1,'2026-03-28','S5','S5_L2_006',9.4476,7.0687,'green','down',0,1),
+  (8890000916,1300000000888,1,'2026-03-29','S5','S5_L2_006',10.0627,7.0687,'green','up',0,1),
+  (8890000917,1300000000888,1,'2026-03-30','S5','S5_L2_006',9.6119,7.0687,'green','down',0,1),
+  (8890000918,1300000000888,1,'2026-03-31','S5','S5_L2_006',9.4751,7.0687,'green','flat',0,1),
+  (8890000919,1300000000888,1,'2026-04-01','S5','S5_L2_006',9.5031,7.0687,'green','flat',0,1),
+  (8890000920,1300000000888,1,'2026-04-02','S5','S5_L2_006',9.1872,7.0687,'green','down',0,1),
+  (8890000921,1300000000888,1,'2026-04-03','S5','S5_L2_006',9.9882,7.0687,'green','up',0,1),
+  (8890000922,1300000000888,1,'2026-04-04','S5','S5_L2_006',10.2321,7.0687,'green','up',0,1),
+  (8890000923,1300000000888,1,'2026-04-05','S5','S5_L2_006',9.1212,7.0687,'green','down',0,1),
+  (8890000924,1300000000888,1,'2026-04-06','S5','S5_L2_006',9.5477,7.0687,'green','up',0,1),
+  (8890000925,1300000000888,1,'2026-04-07','S5','S5_L2_006',9.5885,7.0687,'green','flat',0,1),
+  (8890000926,1300000000888,1,'2026-04-08','S5','S5_L2_006',9.4489,7.0687,'green','flat',0,1),
+  (8890000927,1300000000888,1,'2026-04-09','S5','S5_L2_006',9.9718,7.0687,'green','up',0,1),
+  (8890000928,1300000000888,1,'2026-04-10','S5','S5_L2_006',9.9804,7.0687,'green','flat',0,1),
+  (8890000929,1300000000888,1,'2026-04-11','S5','S5_L2_006',9.5496,7.0687,'green','down',0,1),
+  (8890000930,1300000000888,1,'2026-04-12','S5','S5_L2_006',10.2182,7.0687,'green','up',0,1),
+  (8890000931,1300000000888,1,'2026-03-14','S5','S5_L2_007',10.845,13.3931,'green','flat',0,1),
+  (8890000932,1300000000888,1,'2026-03-15','S5','S5_L2_007',11.244,13.3931,'green','up',0,1),
+  (8890000933,1300000000888,1,'2026-03-16','S5','S5_L2_007',10.6419,13.3931,'green','down',0,1),
+  (8890000934,1300000000888,1,'2026-03-17','S5','S5_L2_007',11.3686,13.3931,'green','up',0,1),
+  (8890000935,1300000000888,1,'2026-03-18','S5','S5_L2_007',11.0837,13.3931,'green','down',0,1),
+  (8890000936,1300000000888,1,'2026-03-19','S5','S5_L2_007',11.2345,13.3931,'green','flat',0,1),
+  (8890000937,1300000000888,1,'2026-03-20','S5','S5_L2_007',10.8274,13.3931,'green','down',0,1),
+  (8890000938,1300000000888,1,'2026-03-21','S5','S5_L2_007',11.3835,13.3931,'green','up',0,1),
+  (8890000939,1300000000888,1,'2026-03-22','S5','S5_L2_007',11.2725,13.3931,'green','flat',0,1),
+  (8890000940,1300000000888,1,'2026-03-23','S5','S5_L2_007',10.9806,13.3931,'green','down',0,1),
+  (8890000941,1300000000888,1,'2026-03-24','S5','S5_L2_007',11.4164,13.3931,'green','up',0,1),
+  (8890000942,1300000000888,1,'2026-03-25','S5','S5_L2_007',10.2156,13.3931,'green','down',0,1),
+  (8890000943,1300000000888,1,'2026-03-26','S5','S5_L2_007',11.2223,13.3931,'green','up',0,1),
+  (8890000944,1300000000888,1,'2026-03-27','S5','S5_L2_007',11.0658,13.3931,'green','flat',0,1),
+  (8890000945,1300000000888,1,'2026-03-28','S5','S5_L2_007',10.8368,13.3931,'green','down',0,1),
+  (8890000946,1300000000888,1,'2026-03-29','S5','S5_L2_007',11.1606,13.3931,'green','up',0,1),
+  (8890000947,1300000000888,1,'2026-03-30','S5','S5_L2_007',11.2681,13.3931,'green','flat',0,1),
+  (8890000948,1300000000888,1,'2026-03-31','S5','S5_L2_007',10.8562,13.3931,'green','down',0,1),
+  (8890000949,1300000000888,1,'2026-04-01','S5','S5_L2_007',11.0618,13.3931,'green','flat',0,1),
+  (8890000950,1300000000888,1,'2026-04-02','S5','S5_L2_007',11.0878,13.3931,'green','flat',0,1),
+  (8890000951,1300000000888,1,'2026-04-03','S5','S5_L2_007',11.2325,13.3931,'green','flat',0,1),
+  (8890000952,1300000000888,1,'2026-04-04','S5','S5_L2_007',11.5102,13.3931,'green','up',0,1),
+  (8890000953,1300000000888,1,'2026-04-05','S5','S5_L2_007',10.9471,13.3931,'green','down',0,1),
+  (8890000954,1300000000888,1,'2026-04-06','S5','S5_L2_007',11.5402,13.3931,'green','up',0,1),
+  (8890000955,1300000000888,1,'2026-04-07','S5','S5_L2_007',10.6672,13.3931,'green','down',0,1),
+  (8890000956,1300000000888,1,'2026-04-08','S5','S5_L2_007',11.2018,13.3931,'green','up',0,1),
+  (8890000957,1300000000888,1,'2026-04-09','S5','S5_L2_007',10.5289,13.3931,'green','down',0,1),
+  (8890000958,1300000000888,1,'2026-04-10','S5','S5_L2_007',11.1255,13.3931,'green','up',0,1),
+  (8890000959,1300000000888,1,'2026-04-11','S5','S5_L2_007',11.3421,13.3931,'green','flat',0,1),
+  (8890000960,1300000000888,1,'2026-04-12','S5','S5_L2_007',11.7753,13.3931,'green','up',0,1),
+  (8890000961,1300000000888,1,'2026-03-14','S5','S5_L2_008',11.5712,13.5866,'green','flat',0,1),
+  (8890000962,1300000000888,1,'2026-03-15','S5','S5_L2_008',11.2947,13.5866,'green','down',0,1),
+  (8890000963,1300000000888,1,'2026-03-16','S5','S5_L2_008',11.9099,13.5866,'green','up',0,1),
+  (8890000964,1300000000888,1,'2026-03-17','S5','S5_L2_008',11.5684,13.5866,'green','down',0,1),
+  (8890000965,1300000000888,1,'2026-03-18','S5','S5_L2_008',11.5882,13.5866,'green','flat',0,1),
+  (8890000966,1300000000888,1,'2026-03-19','S5','S5_L2_008',11.872,13.5866,'green','up',0,1),
+  (8890000967,1300000000888,1,'2026-03-20','S5','S5_L2_008',11.9329,13.5866,'green','flat',0,1),
+  (8890000968,1300000000888,1,'2026-03-21','S5','S5_L2_008',10.9537,13.5866,'green','down',0,1),
+  (8890000969,1300000000888,1,'2026-03-22','S5','S5_L2_008',11.572,13.5866,'green','up',0,1),
+  (8890000970,1300000000888,1,'2026-03-23','S5','S5_L2_008',11.5484,13.5866,'green','flat',0,1),
+  (8890000971,1300000000888,1,'2026-03-24','S5','S5_L2_008',11.1834,13.5866,'green','down',0,1),
+  (8890000972,1300000000888,1,'2026-03-25','S5','S5_L2_008',10.9912,13.5866,'green','flat',0,1),
+  (8890000973,1300000000888,1,'2026-03-26','S5','S5_L2_008',11.5309,13.5866,'green','up',0,1),
+  (8890000974,1300000000888,1,'2026-03-27','S5','S5_L2_008',11.3934,13.5866,'green','flat',0,1),
+  (8890000975,1300000000888,1,'2026-03-28','S5','S5_L2_008',11.3029,13.5866,'green','flat',0,1),
+  (8890000976,1300000000888,1,'2026-03-29','S5','S5_L2_008',11.5065,13.5866,'green','flat',0,1),
+  (8890000977,1300000000888,1,'2026-03-30','S5','S5_L2_008',11.4324,13.5866,'green','flat',0,1),
+  (8890000978,1300000000888,1,'2026-03-31','S5','S5_L2_008',11.5602,13.5866,'green','flat',0,1),
+  (8890000979,1300000000888,1,'2026-04-01','S5','S5_L2_008',12.1007,13.5866,'green','up',0,1),
+  (8890000980,1300000000888,1,'2026-04-02','S5','S5_L2_008',11.5437,13.5866,'green','down',0,1),
+  (8890000981,1300000000888,1,'2026-04-03','S5','S5_L2_008',12.2059,13.5866,'green','up',0,1),
+  (8890000982,1300000000888,1,'2026-04-04','S5','S5_L2_008',11.9853,13.5866,'green','flat',0,1),
+  (8890000983,1300000000888,1,'2026-04-05','S5','S5_L2_008',11.8895,13.5866,'green','flat',0,1),
+  (8890000984,1300000000888,1,'2026-04-06','S5','S5_L2_008',11.3016,13.5866,'green','down',0,1),
+  (8890000985,1300000000888,1,'2026-04-07','S5','S5_L2_008',11.4524,13.5866,'green','flat',0,1),
+  (8890000986,1300000000888,1,'2026-04-08','S5','S5_L2_008',11.2353,13.5866,'green','flat',0,1),
+  (8890000987,1300000000888,1,'2026-04-09','S5','S5_L2_008',11.6983,13.5866,'green','up',0,1),
+  (8890000988,1300000000888,1,'2026-04-10','S5','S5_L2_008',11.5309,13.5866,'green','flat',0,1),
+  (8890000989,1300000000888,1,'2026-04-11','S5','S5_L2_008',11.7072,13.5866,'green','flat',0,1),
+  (8890000990,1300000000888,1,'2026-04-12','S5','S5_L2_008',11.659,13.5866,'green','flat',0,1),
+  (8890000991,1300000000888,1,'2026-03-14','S5','S5_L2_009',94.5006,95.2757,'yellow','flat',0,1),
+  (8890000992,1300000000888,1,'2026-03-15','S5','S5_L2_009',93.0203,95.2757,'yellow','flat',0,1),
+  (8890000993,1300000000888,1,'2026-03-16','S5','S5_L2_009',91.2825,95.2757,'yellow','flat',0,1),
+  (8890000994,1300000000888,1,'2026-03-17','S5','S5_L2_009',92.7812,95.2757,'yellow','flat',0,1),
+  (8890000995,1300000000888,1,'2026-03-18','S5','S5_L2_009',96.0485,95.2757,'green','up',0,1),
+  (8890000996,1300000000888,1,'2026-03-19','S5','S5_L2_009',93.5648,95.2757,'yellow','down',0,1),
+  (8890000997,1300000000888,1,'2026-03-20','S5','S5_L2_009',93.8578,95.2757,'yellow','flat',0,1),
+  (8890000998,1300000000888,1,'2026-03-21','S5','S5_L2_009',96.475,95.2757,'green','up',0,1),
+  (8890000999,1300000000888,1,'2026-03-22','S5','S5_L2_009',95.4025,95.2757,'green','flat',0,1),
+  (8890001000,1300000000888,1,'2026-03-23','S5','S5_L2_009',89.8669,95.2757,'red','down',0,1),
+  (8890001001,1300000000888,1,'2026-03-24','S5','S5_L2_009',93.8003,95.2757,'yellow','up',0,1),
+  (8890001002,1300000000888,1,'2026-03-25','S5','S5_L2_009',91.5693,95.2757,'yellow','down',0,1),
+  (8890001003,1300000000888,1,'2026-03-26','S5','S5_L2_009',93.8743,95.2757,'yellow','up',0,1),
+  (8890001004,1300000000888,1,'2026-03-27','S5','S5_L2_009',95.128,95.2757,'yellow','flat',0,1),
+  (8890001005,1300000000888,1,'2026-03-28','S5','S5_L2_009',95.4641,95.2757,'green','flat',0,1),
+  (8890001006,1300000000888,1,'2026-03-29','S5','S5_L2_009',98.7203,95.2757,'green','up',0,1),
+  (8890001007,1300000000888,1,'2026-03-30','S5','S5_L2_009',92.6144,95.2757,'yellow','down',0,1),
+  (8890001008,1300000000888,1,'2026-03-31','S5','S5_L2_009',93.1951,95.2757,'yellow','flat',0,1),
+  (8890001009,1300000000888,1,'2026-04-01','S5','S5_L2_009',95.6463,95.2757,'green','up',0,1),
+  (8890001010,1300000000888,1,'2026-04-02','S5','S5_L2_009',96.7407,95.2757,'green','flat',0,1),
+  (8890001011,1300000000888,1,'2026-04-03','S5','S5_L2_009',91.1176,95.2757,'yellow','down',0,1),
+  (8890001012,1300000000888,1,'2026-04-04','S5','S5_L2_009',95.9642,95.2757,'green','up',0,1),
+  (8890001013,1300000000888,1,'2026-04-05','S5','S5_L2_009',95.9043,95.2757,'green','flat',0,1),
+  (8890001014,1300000000888,1,'2026-04-06','S5','S5_L2_009',93.603,95.2757,'yellow','down',0,1),
+  (8890001015,1300000000888,1,'2026-04-07','S5','S5_L2_009',93.2342,95.2757,'yellow','flat',0,1),
+  (8890001016,1300000000888,1,'2026-04-08','S5','S5_L2_009',96.0938,95.2757,'green','up',0,1),
+  (8890001017,1300000000888,1,'2026-04-09','S5','S5_L2_009',95.2321,95.2757,'yellow','flat',0,1),
+  (8890001018,1300000000888,1,'2026-04-10','S5','S5_L2_009',95.1574,95.2757,'yellow','flat',0,1),
+  (8890001019,1300000000888,1,'2026-04-11','S5','S5_L2_009',91.9628,95.2757,'yellow','down',0,1),
+  (8890001020,1300000000888,1,'2026-04-12','S5','S5_L2_009',89.1688,95.2757,'red','down',0,1),
+  (8890001021,1300000000888,1,'2026-03-14','S5','S5_L2_010',10.6065,7.0947,'green','flat',0,1),
+  (8890001022,1300000000888,1,'2026-03-15','S5','S5_L2_010',10.55,7.0947,'green','flat',0,1),
+  (8890001023,1300000000888,1,'2026-03-16','S5','S5_L2_010',10.7827,7.0947,'green','up',0,1),
+  (8890001024,1300000000888,1,'2026-03-17','S5','S5_L2_010',10.3925,7.0947,'green','down',0,1),
+  (8890001025,1300000000888,1,'2026-03-18','S5','S5_L2_010',10.839,7.0947,'green','up',0,1),
+  (8890001026,1300000000888,1,'2026-03-19','S5','S5_L2_010',10.7672,7.0947,'green','flat',0,1),
+  (8890001027,1300000000888,1,'2026-03-20','S5','S5_L2_010',10.4003,7.0947,'green','down',0,1),
+  (8890001028,1300000000888,1,'2026-03-21','S5','S5_L2_010',10.9381,7.0947,'green','up',0,1),
+  (8890001029,1300000000888,1,'2026-03-22','S5','S5_L2_010',10.5271,7.0947,'green','down',0,1),
+  (8890001030,1300000000888,1,'2026-03-23','S5','S5_L2_010',10.4143,7.0947,'green','flat',0,1),
+  (8890001031,1300000000888,1,'2026-03-24','S5','S5_L2_010',10.7166,7.0947,'green','up',0,1),
+  (8890001032,1300000000888,1,'2026-03-25','S5','S5_L2_010',10.6318,7.0947,'green','flat',0,1),
+  (8890001033,1300000000888,1,'2026-03-26','S5','S5_L2_010',10.3477,7.0947,'green','down',0,1),
+  (8890001034,1300000000888,1,'2026-03-27','S5','S5_L2_010',10.8344,7.0947,'green','up',0,1),
+  (8890001035,1300000000888,1,'2026-03-28','S5','S5_L2_010',10.6336,7.0947,'green','flat',0,1),
+  (8890001036,1300000000888,1,'2026-03-29','S5','S5_L2_010',10.3946,7.0947,'green','down',0,1),
+  (8890001037,1300000000888,1,'2026-03-30','S5','S5_L2_010',10.0768,7.0947,'green','down',0,1),
+  (8890001038,1300000000888,1,'2026-03-31','S5','S5_L2_010',10.7726,7.0947,'green','up',0,1),
+  (8890001039,1300000000888,1,'2026-04-01','S5','S5_L2_010',10.6681,7.0947,'green','flat',0,1),
+  (8890001040,1300000000888,1,'2026-04-02','S5','S5_L2_010',10.6746,7.0947,'green','flat',0,1),
+  (8890001041,1300000000888,1,'2026-04-03','S5','S5_L2_010',11.0758,7.0947,'green','up',0,1),
+  (8890001042,1300000000888,1,'2026-04-04','S5','S5_L2_010',9.8418,7.0947,'green','down',0,1),
+  (8890001043,1300000000888,1,'2026-04-05','S5','S5_L2_010',11.0415,7.0947,'green','up',0,1),
+  (8890001044,1300000000888,1,'2026-04-06','S5','S5_L2_010',11.0717,7.0947,'green','flat',0,1),
+  (8890001045,1300000000888,1,'2026-04-07','S5','S5_L2_010',10.3238,7.0947,'green','down',0,1),
+  (8890001046,1300000000888,1,'2026-04-08','S5','S5_L2_010',10.9603,7.0947,'green','up',0,1),
+  (8890001047,1300000000888,1,'2026-04-09','S5','S5_L2_010',10.3774,7.0947,'green','down',0,1),
+  (8890001048,1300000000888,1,'2026-04-10','S5','S5_L2_010',10.3038,7.0947,'green','flat',0,1),
+  (8890001049,1300000000888,1,'2026-04-11','S5','S5_L2_010',10.6041,7.0947,'green','up',0,1),
+  (8890001050,1300000000888,1,'2026-04-12','S5','S5_L2_010',11.2197,7.0947,'green','up',0,1),
+  (8890001051,1300000000888,1,'2026-03-14','S5','S5_L2_011',12.9898,13.3526,'green','flat',0,1),
+  (8890001052,1300000000888,1,'2026-03-15','S5','S5_L2_011',12.8696,13.3526,'green','flat',0,1),
+  (8890001053,1300000000888,1,'2026-03-16','S5','S5_L2_011',13.1918,13.3526,'green','up',0,1),
+  (8890001054,1300000000888,1,'2026-03-17','S5','S5_L2_011',12.6104,13.3526,'green','down',0,1),
+  (8890001055,1300000000888,1,'2026-03-18','S5','S5_L2_011',13.4277,13.3526,'yellow','up',0,1),
+  (8890001056,1300000000888,1,'2026-03-19','S5','S5_L2_011',13.4559,13.3526,'yellow','flat',0,1),
+  (8890001057,1300000000888,1,'2026-03-20','S5','S5_L2_011',13.0159,13.3526,'green','down',0,1),
+  (8890001058,1300000000888,1,'2026-03-21','S5','S5_L2_011',12.5465,13.3526,'green','down',0,1),
+  (8890001059,1300000000888,1,'2026-03-22','S5','S5_L2_011',13.2637,13.3526,'green','up',0,1),
+  (8890001060,1300000000888,1,'2026-03-23','S5','S5_L2_011',12.964,13.3526,'green','down',0,1),
+  (8890001061,1300000000888,1,'2026-03-24','S5','S5_L2_011',13.0985,13.3526,'green','flat',0,1),
+  (8890001062,1300000000888,1,'2026-03-25','S5','S5_L2_011',13.2886,13.3526,'green','flat',0,1),
+  (8890001063,1300000000888,1,'2026-03-26','S5','S5_L2_011',13.0187,13.3526,'green','down',0,1),
+  (8890001064,1300000000888,1,'2026-03-27','S5','S5_L2_011',12.5025,13.3526,'green','down',0,1),
+  (8890001065,1300000000888,1,'2026-03-28','S5','S5_L2_011',13.4249,13.3526,'yellow','up',0,1),
+  (8890001066,1300000000888,1,'2026-03-29','S5','S5_L2_011',12.9581,13.3526,'green','down',0,1),
+  (8890001067,1300000000888,1,'2026-03-30','S5','S5_L2_011',12.9754,13.3526,'green','flat',0,1),
+  (8890001068,1300000000888,1,'2026-03-31','S5','S5_L2_011',13.0875,13.3526,'green','flat',0,1),
+  (8890001069,1300000000888,1,'2026-04-01','S5','S5_L2_011',12.9706,13.3526,'green','flat',0,1),
+  (8890001070,1300000000888,1,'2026-04-02','S5','S5_L2_011',13.1387,13.3526,'green','flat',0,1),
+  (8890001071,1300000000888,1,'2026-04-03','S5','S5_L2_011',12.9265,13.3526,'green','flat',0,1),
+  (8890001072,1300000000888,1,'2026-04-04','S5','S5_L2_011',12.7819,13.3526,'green','flat',0,1),
+  (8890001073,1300000000888,1,'2026-04-05','S5','S5_L2_011',12.6383,13.3526,'green','flat',0,1),
+  (8890001074,1300000000888,1,'2026-04-06','S5','S5_L2_011',12.6533,13.3526,'green','flat',0,1),
+  (8890001075,1300000000888,1,'2026-04-07','S5','S5_L2_011',12.7393,13.3526,'green','flat',0,1),
+  (8890001076,1300000000888,1,'2026-04-08','S5','S5_L2_011',13.2318,13.3526,'green','up',0,1),
+  (8890001077,1300000000888,1,'2026-04-09','S5','S5_L2_011',12.7205,13.3526,'green','down',0,1),
+  (8890001078,1300000000888,1,'2026-04-10','S5','S5_L2_011',12.8076,13.3526,'green','flat',0,1),
+  (8890001079,1300000000888,1,'2026-04-11','S5','S5_L2_011',12.8114,13.3526,'green','flat',0,1),
+  (8890001080,1300000000888,1,'2026-04-12','S5','S5_L2_011',13.0562,13.3526,'green','flat',0,1),
+  (8890001081,1300000000888,1,'2026-03-14','S5','S5_L2_012',11.8709,14.8431,'green','flat',0,1),
+  (8890001082,1300000000888,1,'2026-03-15','S5','S5_L2_012',12.3339,14.8431,'green','up',0,1),
+  (8890001083,1300000000888,1,'2026-03-16','S5','S5_L2_012',11.1576,14.8431,'green','down',0,1),
+  (8890001084,1300000000888,1,'2026-03-17','S5','S5_L2_012',11.5646,14.8431,'green','up',0,1),
+  (8890001085,1300000000888,1,'2026-03-18','S5','S5_L2_012',11.8444,14.8431,'green','up',0,1),
+  (8890001086,1300000000888,1,'2026-03-19','S5','S5_L2_012',11.0555,14.8431,'green','down',0,1),
+  (8890001087,1300000000888,1,'2026-03-20','S5','S5_L2_012',12.2525,14.8431,'green','up',0,1),
+  (8890001088,1300000000888,1,'2026-03-21','S5','S5_L2_012',11.6036,14.8431,'green','down',0,1),
+  (8890001089,1300000000888,1,'2026-03-22','S5','S5_L2_012',11.3668,14.8431,'green','down',0,1),
+  (8890001090,1300000000888,1,'2026-03-23','S5','S5_L2_012',11.9833,14.8431,'green','up',0,1),
+  (8890001091,1300000000888,1,'2026-03-24','S5','S5_L2_012',10.8764,14.8431,'green','down',0,1),
+  (8890001092,1300000000888,1,'2026-03-25','S5','S5_L2_012',11.7183,14.8431,'green','up',0,1),
+  (8890001093,1300000000888,1,'2026-03-26','S5','S5_L2_012',11.2978,14.8431,'green','down',0,1),
+  (8890001094,1300000000888,1,'2026-03-27','S5','S5_L2_012',11.639,14.8431,'green','up',0,1),
+  (8890001095,1300000000888,1,'2026-03-28','S5','S5_L2_012',11.7749,14.8431,'green','flat',0,1),
+  (8890001096,1300000000888,1,'2026-03-29','S5','S5_L2_012',11.9211,14.8431,'green','flat',0,1),
+  (8890001097,1300000000888,1,'2026-03-30','S5','S5_L2_012',11.7879,14.8431,'green','flat',0,1),
+  (8890001098,1300000000888,1,'2026-03-31','S5','S5_L2_012',12.373,14.8431,'green','up',0,1),
+  (8890001099,1300000000888,1,'2026-04-01','S5','S5_L2_012',11.6659,14.8431,'green','down',0,1),
+  (8890001100,1300000000888,1,'2026-04-02','S5','S5_L2_012',11.5248,14.8431,'green','flat',0,1),
+  (8890001101,1300000000888,1,'2026-04-03','S5','S5_L2_012',12.0725,14.8431,'green','up',0,1),
+  (8890001102,1300000000888,1,'2026-04-04','S5','S5_L2_012',11.6214,14.8431,'green','down',0,1),
+  (8890001103,1300000000888,1,'2026-04-05','S5','S5_L2_012',11.7903,14.8431,'green','flat',0,1),
+  (8890001104,1300000000888,1,'2026-04-06','S5','S5_L2_012',10.2688,14.8431,'green','down',0,1),
+  (8890001105,1300000000888,1,'2026-04-07','S5','S5_L2_012',11.8025,14.8431,'green','up',0,1),
+  (8890001106,1300000000888,1,'2026-04-08','S5','S5_L2_012',11.6181,14.8431,'green','flat',0,1),
+  (8890001107,1300000000888,1,'2026-04-09','S5','S5_L2_012',11.4923,14.8431,'green','flat',0,1),
+  (8890001108,1300000000888,1,'2026-04-10','S5','S5_L2_012',11.4149,14.8431,'green','flat',0,1),
+  (8890001109,1300000000888,1,'2026-04-11','S5','S5_L2_012',11.9597,14.8431,'green','up',0,1),
+  (8890001110,1300000000888,1,'2026-04-12','S5','S5_L2_012',10.931,14.8431,'green','down',0,1),
+  (8890001111,1300000000888,1,'2026-03-14','S5','S5_L2_013',114.104,93.6958,'green','flat',0,1),
+  (8890001112,1300000000888,1,'2026-03-15','S5','S5_L2_013',107.8643,93.6958,'green','down',0,1),
+  (8890001113,1300000000888,1,'2026-03-16','S5','S5_L2_013',105.4112,93.6958,'green','down',0,1),
+  (8890001114,1300000000888,1,'2026-03-17','S5','S5_L2_013',110.1983,93.6958,'green','up',0,1),
+  (8890001115,1300000000888,1,'2026-03-18','S5','S5_L2_013',105.1136,93.6958,'green','down',0,1),
+  (8890001116,1300000000888,1,'2026-03-19','S5','S5_L2_013',101.4555,93.6958,'green','down',0,1),
+  (8890001117,1300000000888,1,'2026-03-20','S5','S5_L2_013',107.4669,93.6958,'green','up',0,1),
+  (8890001118,1300000000888,1,'2026-03-21','S5','S5_L2_013',99.1377,93.6958,'green','down',0,1),
+  (8890001119,1300000000888,1,'2026-03-22','S5','S5_L2_013',106.1314,93.6958,'green','up',0,1),
+  (8890001120,1300000000888,1,'2026-03-23','S5','S5_L2_013',108.0018,93.6958,'green','flat',0,1),
+  (8890001121,1300000000888,1,'2026-03-24','S5','S5_L2_013',105.9278,93.6958,'green','flat',0,1),
+  (8890001122,1300000000888,1,'2026-03-25','S5','S5_L2_013',99.7158,93.6958,'green','down',0,1),
+  (8890001123,1300000000888,1,'2026-03-26','S5','S5_L2_013',104.8961,93.6958,'green','up',0,1),
+  (8890001124,1300000000888,1,'2026-03-27','S5','S5_L2_013',103.8696,93.6958,'green','flat',0,1),
+  (8890001125,1300000000888,1,'2026-03-28','S5','S5_L2_013',101.9332,93.6958,'green','flat',0,1),
+  (8890001126,1300000000888,1,'2026-03-29','S5','S5_L2_013',97.0236,93.6958,'green','down',0,1),
+  (8890001127,1300000000888,1,'2026-03-30','S5','S5_L2_013',100.5468,93.6958,'green','up',0,1),
+  (8890001128,1300000000888,1,'2026-03-31','S5','S5_L2_013',102.6885,93.6958,'green','up',0,1),
+  (8890001129,1300000000888,1,'2026-04-01','S5','S5_L2_013',107.7749,93.6958,'green','up',0,1),
+  (8890001130,1300000000888,1,'2026-04-02','S5','S5_L2_013',112.8655,93.6958,'green','up',0,1),
+  (8890001131,1300000000888,1,'2026-04-03','S5','S5_L2_013',106.9343,93.6958,'green','down',0,1),
+  (8890001132,1300000000888,1,'2026-04-04','S5','S5_L2_013',101.7892,93.6958,'green','down',0,1),
+  (8890001133,1300000000888,1,'2026-04-05','S5','S5_L2_013',102.9377,93.6958,'green','flat',0,1),
+  (8890001134,1300000000888,1,'2026-04-06','S5','S5_L2_013',107.6393,93.6958,'green','up',0,1),
+  (8890001135,1300000000888,1,'2026-04-07','S5','S5_L2_013',106.1743,93.6958,'green','flat',0,1),
+  (8890001136,1300000000888,1,'2026-04-08','S5','S5_L2_013',105.4772,93.6958,'green','flat',0,1),
+  (8890001137,1300000000888,1,'2026-04-09','S5','S5_L2_013',104.9993,93.6958,'green','flat',0,1),
+  (8890001138,1300000000888,1,'2026-04-10','S5','S5_L2_013',108.0056,93.6958,'green','up',0,1),
+  (8890001139,1300000000888,1,'2026-04-11','S5','S5_L2_013',111.2478,93.6958,'green','up',0,1),
+  (8890001140,1300000000888,1,'2026-04-12','S5','S5_L2_013',104.2846,93.6958,'green','down',0,1),
+  (8890001141,1300000000888,1,'2026-03-14','S5','S5_L2_014',9.7895,6.8366,'green','flat',0,1),
+  (8890001142,1300000000888,1,'2026-03-15','S5','S5_L2_014',9.8905,6.8366,'green','flat',0,1),
+  (8890001143,1300000000888,1,'2026-03-16','S5','S5_L2_014',9.608,6.8366,'green','down',0,1),
+  (8890001144,1300000000888,1,'2026-03-17','S5','S5_L2_014',9.1022,6.8366,'green','down',0,1),
+  (8890001145,1300000000888,1,'2026-03-18','S5','S5_L2_014',9.8874,6.8366,'green','up',0,1),
+  (8890001146,1300000000888,1,'2026-03-19','S5','S5_L2_014',9.5287,6.8366,'green','down',0,1),
+  (8890001147,1300000000888,1,'2026-03-20','S5','S5_L2_014',10.1279,6.8366,'green','up',0,1),
+  (8890001148,1300000000888,1,'2026-03-21','S5','S5_L2_014',9.7964,6.8366,'green','down',0,1),
+  (8890001149,1300000000888,1,'2026-03-22','S5','S5_L2_014',10.1808,6.8366,'green','up',0,1),
+  (8890001150,1300000000888,1,'2026-03-23','S5','S5_L2_014',9.4924,6.8366,'green','down',0,1),
+  (8890001151,1300000000888,1,'2026-03-24','S5','S5_L2_014',10.0737,6.8366,'green','up',0,1),
+  (8890001152,1300000000888,1,'2026-03-25','S5','S5_L2_014',9.2662,6.8366,'green','down',0,1),
+  (8890001153,1300000000888,1,'2026-03-26','S5','S5_L2_014',10.0172,6.8366,'green','up',0,1),
+  (8890001154,1300000000888,1,'2026-03-27','S5','S5_L2_014',9.6738,6.8366,'green','down',0,1),
+  (8890001155,1300000000888,1,'2026-03-28','S5','S5_L2_014',10.0171,6.8366,'green','up',0,1),
+  (8890001156,1300000000888,1,'2026-03-29','S5','S5_L2_014',9.6384,6.8366,'green','down',0,1),
+  (8890001157,1300000000888,1,'2026-03-30','S5','S5_L2_014',9.9426,6.8366,'green','up',0,1),
+  (8890001158,1300000000888,1,'2026-03-31','S5','S5_L2_014',9.89,6.8366,'green','flat',0,1),
+  (8890001159,1300000000888,1,'2026-04-01','S5','S5_L2_014',9.8551,6.8366,'green','flat',0,1),
+  (8890001160,1300000000888,1,'2026-04-02','S5','S5_L2_014',9.8725,6.8366,'green','flat',0,1),
+  (8890001161,1300000000888,1,'2026-04-03','S5','S5_L2_014',10.2343,6.8366,'green','up',0,1),
+  (8890001162,1300000000888,1,'2026-04-04','S5','S5_L2_014',9.579,6.8366,'green','down',0,1),
+  (8890001163,1300000000888,1,'2026-04-05','S5','S5_L2_014',10.1533,6.8366,'green','up',0,1),
+  (8890001164,1300000000888,1,'2026-04-06','S5','S5_L2_014',9.6396,6.8366,'green','down',0,1),
+  (8890001165,1300000000888,1,'2026-04-07','S5','S5_L2_014',10.0959,6.8366,'green','up',0,1),
+  (8890001166,1300000000888,1,'2026-04-08','S5','S5_L2_014',10.427,6.8366,'green','up',0,1),
+  (8890001167,1300000000888,1,'2026-04-09','S5','S5_L2_014',9.5098,6.8366,'green','down',0,1),
+  (8890001168,1300000000888,1,'2026-04-10','S5','S5_L2_014',9.1129,6.8366,'green','down',0,1),
+  (8890001169,1300000000888,1,'2026-04-11','S5','S5_L2_014',9.791,6.8366,'green','up',0,1),
+  (8890001170,1300000000888,1,'2026-04-12','S5','S5_L2_014',9.5409,6.8366,'green','down',0,1),
+  (8890001171,1300000000888,1,'2026-03-14','S5','S5_L2_015',11.4277,13.6967,'green','flat',0,1),
+  (8890001172,1300000000888,1,'2026-03-15','S5','S5_L2_015',11.4964,13.6967,'green','flat',0,1),
+  (8890001173,1300000000888,1,'2026-03-16','S5','S5_L2_015',11.4252,13.6967,'green','flat',0,1),
+  (8890001174,1300000000888,1,'2026-03-17','S5','S5_L2_015',12.1096,13.6967,'green','up',0,1),
+  (8890001175,1300000000888,1,'2026-03-18','S5','S5_L2_015',12.0031,13.6967,'green','flat',0,1),
+  (8890001176,1300000000888,1,'2026-03-19','S5','S5_L2_015',12.0149,13.6967,'green','flat',0,1),
+  (8890001177,1300000000888,1,'2026-03-20','S5','S5_L2_015',12.4165,13.6967,'green','up',0,1),
+  (8890001178,1300000000888,1,'2026-03-21','S5','S5_L2_015',11.3426,13.6967,'green','down',0,1),
+  (8890001179,1300000000888,1,'2026-03-22','S5','S5_L2_015',10.7414,13.6967,'green','down',0,1),
+  (8890001180,1300000000888,1,'2026-03-23','S5','S5_L2_015',12.316,13.6967,'green','up',0,1),
+  (8890001181,1300000000888,1,'2026-03-24','S5','S5_L2_015',11.6983,13.6967,'green','down',0,1),
+  (8890001182,1300000000888,1,'2026-03-25','S5','S5_L2_015',11.5917,13.6967,'green','flat',0,1),
+  (8890001183,1300000000888,1,'2026-03-26','S5','S5_L2_015',10.9831,13.6967,'green','down',0,1),
+  (8890001184,1300000000888,1,'2026-03-27','S5','S5_L2_015',11.1403,13.6967,'green','flat',0,1),
+  (8890001185,1300000000888,1,'2026-03-28','S5','S5_L2_015',11.8521,13.6967,'green','up',0,1),
+  (8890001186,1300000000888,1,'2026-03-29','S5','S5_L2_015',11.5612,13.6967,'green','down',0,1),
+  (8890001187,1300000000888,1,'2026-03-30','S5','S5_L2_015',10.8612,13.6967,'green','down',0,1),
+  (8890001188,1300000000888,1,'2026-03-31','S5','S5_L2_015',11.2835,13.6967,'green','up',0,1),
+  (8890001189,1300000000888,1,'2026-04-01','S5','S5_L2_015',11.9765,13.6967,'green','up',0,1),
+  (8890001190,1300000000888,1,'2026-04-02','S5','S5_L2_015',12.0565,13.6967,'green','flat',0,1),
+  (8890001191,1300000000888,1,'2026-04-03','S5','S5_L2_015',11.6857,13.6967,'green','down',0,1),
+  (8890001192,1300000000888,1,'2026-04-04','S5','S5_L2_015',12.5983,13.6967,'green','up',0,1),
+  (8890001193,1300000000888,1,'2026-04-05','S5','S5_L2_015',11.9687,13.6967,'green','down',0,1),
+  (8890001194,1300000000888,1,'2026-04-06','S5','S5_L2_015',12.2417,13.6967,'green','up',0,1),
+  (8890001195,1300000000888,1,'2026-04-07','S5','S5_L2_015',12.0755,13.6967,'green','flat',0,1),
+  (8890001196,1300000000888,1,'2026-04-08','S5','S5_L2_015',11.9006,13.6967,'green','flat',0,1),
+  (8890001197,1300000000888,1,'2026-04-09','S5','S5_L2_015',11.1446,13.6967,'green','down',0,1),
+  (8890001198,1300000000888,1,'2026-04-10','S5','S5_L2_015',11.0536,13.6967,'green','flat',0,1),
+  (8890001199,1300000000888,1,'2026-04-11','S5','S5_L2_015',11.3529,13.6967,'green','up',0,1),
+  (8890001200,1300000000888,1,'2026-04-12','S5','S5_L2_015',11.7011,13.6967,'green','up',0,1),
+  (8890001201,1300000000888,1,'2026-03-14','S6','S6_L2_001',2.9145,3.18,'green','flat',0,1),
+  (8890001202,1300000000888,1,'2026-03-15','S6','S6_L2_001',2.9472,3.18,'green','flat',0,1),
+  (8890001203,1300000000888,1,'2026-03-16','S6','S6_L2_001',2.9127,3.18,'green','flat',0,1),
+  (8890001204,1300000000888,1,'2026-03-17','S6','S6_L2_001',2.9562,3.18,'green','flat',0,1),
+  (8890001205,1300000000888,1,'2026-03-18','S6','S6_L2_001',3.0007,3.18,'green','flat',0,1),
+  (8890001206,1300000000888,1,'2026-03-19','S6','S6_L2_001',2.9151,3.18,'green','down',0,1),
+  (8890001207,1300000000888,1,'2026-03-20','S6','S6_L2_001',2.8892,3.18,'green','flat',0,1),
+  (8890001208,1300000000888,1,'2026-03-21','S6','S6_L2_001',2.6852,3.18,'green','down',0,1),
+  (8890001209,1300000000888,1,'2026-03-22','S6','S6_L2_001',2.9907,3.18,'green','up',0,1),
+  (8890001210,1300000000888,1,'2026-03-23','S6','S6_L2_001',2.8468,3.18,'green','down',0,1),
+  (8890001211,1300000000888,1,'2026-03-24','S6','S6_L2_001',2.8349,3.18,'green','flat',0,1),
+  (8890001212,1300000000888,1,'2026-03-25','S6','S6_L2_001',2.9903,3.18,'green','up',0,1),
+  (8890001213,1300000000888,1,'2026-03-26','S6','S6_L2_001',2.9947,3.18,'green','flat',0,1),
+  (8890001214,1300000000888,1,'2026-03-27','S6','S6_L2_001',2.9739,3.18,'green','flat',0,1),
+  (8890001215,1300000000888,1,'2026-03-28','S6','S6_L2_001',2.9977,3.18,'green','flat',0,1),
+  (8890001216,1300000000888,1,'2026-03-29','S6','S6_L2_001',2.8187,3.18,'green','down',0,1),
+  (8890001217,1300000000888,1,'2026-03-30','S6','S6_L2_001',2.8944,3.18,'green','up',0,1),
+  (8890001218,1300000000888,1,'2026-03-31','S6','S6_L2_001',2.8663,3.18,'green','flat',0,1),
+  (8890001219,1300000000888,1,'2026-04-01','S6','S6_L2_001',3.0656,3.18,'green','up',0,1),
+  (8890001220,1300000000888,1,'2026-04-02','S6','S6_L2_001',2.9899,3.18,'green','down',0,1),
+  (8890001221,1300000000888,1,'2026-04-03','S6','S6_L2_001',2.8931,3.18,'green','down',0,1),
+  (8890001222,1300000000888,1,'2026-04-04','S6','S6_L2_001',2.988,3.18,'green','up',0,1),
+  (8890001223,1300000000888,1,'2026-04-05','S6','S6_L2_001',2.9472,3.18,'green','flat',0,1),
+  (8890001224,1300000000888,1,'2026-04-06','S6','S6_L2_001',2.9041,3.18,'green','flat',0,1),
+  (8890001225,1300000000888,1,'2026-04-07','S6','S6_L2_001',2.9552,3.18,'green','flat',0,1),
+  (8890001226,1300000000888,1,'2026-04-08','S6','S6_L2_001',2.9888,3.18,'green','flat',0,1),
+  (8890001227,1300000000888,1,'2026-04-09','S6','S6_L2_001',2.902,3.18,'green','down',0,1),
+  (8890001228,1300000000888,1,'2026-04-10','S6','S6_L2_001',2.8051,3.18,'green','down',0,1),
+  (8890001229,1300000000888,1,'2026-04-11','S6','S6_L2_001',2.9454,3.18,'green','up',0,1),
+  (8890001230,1300000000888,1,'2026-04-12','S6','S6_L2_001',2.8913,3.18,'green','flat',0,1),
+  (8890001231,1300000000888,1,'2026-03-14','S6','S6_L2_002',82.0794,98.0,'red','flat',0,1),
+  (8890001232,1300000000888,1,'2026-03-15','S6','S6_L2_002',83.041,98.0,'red','flat',0,1),
+  (8890001233,1300000000888,1,'2026-03-16','S6','S6_L2_002',84.3639,98.0,'red','flat',0,1),
+  (8890001234,1300000000888,1,'2026-03-17','S6','S6_L2_002',85.0693,98.0,'red','flat',0,1),
+  (8890001235,1300000000888,1,'2026-03-18','S6','S6_L2_002',86.4323,98.0,'red','flat',0,1),
+  (8890001236,1300000000888,1,'2026-03-19','S6','S6_L2_002',84.4582,98.0,'red','down',0,1),
+  (8890001237,1300000000888,1,'2026-03-20','S6','S6_L2_002',86.1473,98.0,'red','flat',0,1),
+  (8890001238,1300000000888,1,'2026-03-21','S6','S6_L2_002',84.0479,98.0,'red','down',0,1),
+  (8890001239,1300000000888,1,'2026-03-22','S6','S6_L2_002',86.3914,98.0,'red','up',0,1),
+  (8890001240,1300000000888,1,'2026-03-23','S6','S6_L2_002',86.0278,98.0,'red','flat',0,1),
+  (8890001241,1300000000888,1,'2026-03-24','S6','S6_L2_002',86.4514,98.0,'red','flat',0,1),
+  (8890001242,1300000000888,1,'2026-03-25','S6','S6_L2_002',88.6647,98.0,'red','up',0,1),
+  (8890001243,1300000000888,1,'2026-03-26','S6','S6_L2_002',84.2788,98.0,'red','down',0,1),
+  (8890001244,1300000000888,1,'2026-03-27','S6','S6_L2_002',80.9372,98.0,'red','down',0,1),
+  (8890001245,1300000000888,1,'2026-03-28','S6','S6_L2_002',84.8014,98.0,'red','up',0,1),
+  (8890001246,1300000000888,1,'2026-03-29','S6','S6_L2_002',87.0641,98.0,'red','up',0,1),
+  (8890001247,1300000000888,1,'2026-03-30','S6','S6_L2_002',85.0636,98.0,'red','down',0,1),
+  (8890001248,1300000000888,1,'2026-03-31','S6','S6_L2_002',85.8112,98.0,'red','flat',0,1),
+  (8890001249,1300000000888,1,'2026-04-01','S6','S6_L2_002',80.6072,98.0,'red','down',0,1),
+  (8890001250,1300000000888,1,'2026-04-02','S6','S6_L2_002',82.8729,98.0,'red','up',0,1),
+  (8890001251,1300000000888,1,'2026-04-03','S6','S6_L2_002',86.3737,98.0,'red','up',0,1),
+  (8890001252,1300000000888,1,'2026-04-04','S6','S6_L2_002',86.9834,98.0,'red','flat',0,1),
+  (8890001253,1300000000888,1,'2026-04-05','S6','S6_L2_002',83.0864,98.0,'red','down',0,1),
+  (8890001254,1300000000888,1,'2026-04-06','S6','S6_L2_002',85.9359,98.0,'red','up',0,1),
+  (8890001255,1300000000888,1,'2026-04-07','S6','S6_L2_002',83.1869,98.0,'red','down',0,1),
+  (8890001256,1300000000888,1,'2026-04-08','S6','S6_L2_002',82.0613,98.0,'red','flat',0,1),
+  (8890001257,1300000000888,1,'2026-04-09','S6','S6_L2_002',85.1811,98.0,'red','up',0,1),
+  (8890001258,1300000000888,1,'2026-04-10','S6','S6_L2_002',85.5534,98.0,'red','flat',0,1),
+  (8890001259,1300000000888,1,'2026-04-11','S6','S6_L2_002',86.0108,98.0,'red','flat',0,1),
+  (8890001260,1300000000888,1,'2026-04-12','S6','S6_L2_002',86.8616,98.0,'red','flat',0,1),
+  (8890001261,1300000000888,1,'2026-03-14','S6','S6_L2_003',2.1531,2.1,'green','flat',0,1),
+  (8890001262,1300000000888,1,'2026-03-15','S6','S6_L2_003',2.1083,2.1,'green','down',0,1),
+  (8890001263,1300000000888,1,'2026-03-16','S6','S6_L2_003',2.0278,2.1,'yellow','down',0,1),
+  (8890001264,1300000000888,1,'2026-03-17','S6','S6_L2_003',2.1078,2.1,'green','up',0,1),
+  (8890001265,1300000000888,1,'2026-03-18','S6','S6_L2_003',1.9597,2.1,'red','down',0,1),
+  (8890001266,1300000000888,1,'2026-03-19','S6','S6_L2_003',2.0562,2.1,'yellow','up',0,1),
+  (8890001267,1300000000888,1,'2026-03-20','S6','S6_L2_003',2.1148,2.1,'green','up',0,1),
+  (8890001268,1300000000888,1,'2026-03-21','S6','S6_L2_003',2.0918,2.1,'yellow','flat',0,1),
+  (8890001269,1300000000888,1,'2026-03-22','S6','S6_L2_003',2.1009,2.1,'green','flat',0,1),
+  (8890001270,1300000000888,1,'2026-03-23','S6','S6_L2_003',2.1675,2.1,'green','up',0,1),
+  (8890001271,1300000000888,1,'2026-03-24','S6','S6_L2_003',2.0044,2.1,'yellow','down',0,1),
+  (8890001272,1300000000888,1,'2026-03-25','S6','S6_L2_003',2.0989,2.1,'yellow','up',0,1),
+  (8890001273,1300000000888,1,'2026-03-26','S6','S6_L2_003',2.0443,2.1,'yellow','down',0,1),
+  (8890001274,1300000000888,1,'2026-03-27','S6','S6_L2_003',2.1186,2.1,'green','up',0,1),
+  (8890001275,1300000000888,1,'2026-03-28','S6','S6_L2_003',2.0572,2.1,'yellow','down',0,1),
+  (8890001276,1300000000888,1,'2026-03-29','S6','S6_L2_003',2.0981,2.1,'yellow','flat',0,1),
+  (8890001277,1300000000888,1,'2026-03-30','S6','S6_L2_003',2.1451,2.1,'green','up',0,1),
+  (8890001278,1300000000888,1,'2026-03-31','S6','S6_L2_003',2.0888,2.1,'yellow','down',0,1),
+  (8890001279,1300000000888,1,'2026-04-01','S6','S6_L2_003',2.0371,2.1,'yellow','down',0,1),
+  (8890001280,1300000000888,1,'2026-04-02','S6','S6_L2_003',2.0274,2.1,'yellow','flat',0,1),
+  (8890001281,1300000000888,1,'2026-04-03','S6','S6_L2_003',2.0073,2.1,'yellow','flat',0,1),
+  (8890001282,1300000000888,1,'2026-04-04','S6','S6_L2_003',2.1138,2.1,'green','up',0,1),
+  (8890001283,1300000000888,1,'2026-04-05','S6','S6_L2_003',2.1307,2.1,'green','flat',0,1),
+  (8890001284,1300000000888,1,'2026-04-06','S6','S6_L2_003',2.035,2.1,'yellow','down',0,1),
+  (8890001285,1300000000888,1,'2026-04-07','S6','S6_L2_003',1.9387,2.1,'red','down',0,1),
+  (8890001286,1300000000888,1,'2026-04-08','S6','S6_L2_003',2.011,2.1,'yellow','up',0,1),
+  (8890001287,1300000000888,1,'2026-04-09','S6','S6_L2_003',2.0767,2.1,'yellow','up',0,1),
+  (8890001288,1300000000888,1,'2026-04-10','S6','S6_L2_003',1.9918,2.1,'red','down',0,1),
+  (8890001289,1300000000888,1,'2026-04-11','S6','S6_L2_003',1.9296,2.1,'red','down',0,1),
+  (8890001290,1300000000888,1,'2026-04-12','S6','S6_L2_003',2.0227,2.1,'yellow','up',0,1),
+  (8890001291,1300000000888,1,'2026-03-14','S6','S6_L2_004',2.746,2.83,'green','flat',0,1),
+  (8890001292,1300000000888,1,'2026-03-15','S6','S6_L2_004',2.9536,2.83,'yellow','up',0,1),
+  (8890001293,1300000000888,1,'2026-03-16','S6','S6_L2_004',2.8898,2.83,'yellow','down',0,1),
+  (8890001294,1300000000888,1,'2026-03-17','S6','S6_L2_004',2.9303,2.83,'yellow','flat',0,1),
+  (8890001295,1300000000888,1,'2026-03-18','S6','S6_L2_004',3.0388,2.83,'yellow','up',0,1),
+  (8890001296,1300000000888,1,'2026-03-19','S6','S6_L2_004',2.8453,2.83,'yellow','down',0,1),
+  (8890001297,1300000000888,1,'2026-03-20','S6','S6_L2_004',2.7365,2.83,'green','down',0,1),
+  (8890001298,1300000000888,1,'2026-03-21','S6','S6_L2_004',2.9225,2.83,'yellow','up',0,1),
+  (8890001299,1300000000888,1,'2026-03-22','S6','S6_L2_004',2.9662,2.83,'yellow','flat',0,1),
+  (8890001300,1300000000888,1,'2026-03-23','S6','S6_L2_004',2.7996,2.83,'green','down',0,1),
+  (8890001301,1300000000888,1,'2026-03-24','S6','S6_L2_004',2.8927,2.83,'yellow','up',0,1),
+  (8890001302,1300000000888,1,'2026-03-25','S6','S6_L2_004',2.8945,2.83,'yellow','flat',0,1),
+  (8890001303,1300000000888,1,'2026-03-26','S6','S6_L2_004',2.9274,2.83,'yellow','flat',0,1),
+  (8890001304,1300000000888,1,'2026-03-27','S6','S6_L2_004',2.871,2.83,'yellow','flat',0,1),
+  (8890001305,1300000000888,1,'2026-03-28','S6','S6_L2_004',3.1587,2.83,'red','up',0,1),
+  (8890001306,1300000000888,1,'2026-03-29','S6','S6_L2_004',2.902,2.83,'yellow','down',0,1),
+  (8890001307,1300000000888,1,'2026-03-30','S6','S6_L2_004',2.9414,2.83,'yellow','flat',0,1),
+  (8890001308,1300000000888,1,'2026-03-31','S6','S6_L2_004',2.8825,2.83,'yellow','down',0,1),
+  (8890001309,1300000000888,1,'2026-04-01','S6','S6_L2_004',2.6931,2.83,'green','down',0,1),
+  (8890001310,1300000000888,1,'2026-04-02','S6','S6_L2_004',3.0462,2.83,'yellow','up',0,1),
+  (8890001311,1300000000888,1,'2026-04-03','S6','S6_L2_004',2.648,2.83,'green','down',0,1),
+  (8890001312,1300000000888,1,'2026-04-04','S6','S6_L2_004',3.0441,2.83,'yellow','up',0,1),
+  (8890001313,1300000000888,1,'2026-04-05','S6','S6_L2_004',2.809,2.83,'green','down',0,1),
+  (8890001314,1300000000888,1,'2026-04-06','S6','S6_L2_004',2.8058,2.83,'green','flat',0,1),
+  (8890001315,1300000000888,1,'2026-04-07','S6','S6_L2_004',2.9154,2.83,'yellow','up',0,1),
+  (8890001316,1300000000888,1,'2026-04-08','S6','S6_L2_004',3.1177,2.83,'red','up',0,1),
+  (8890001317,1300000000888,1,'2026-04-09','S6','S6_L2_004',2.953,2.83,'yellow','down',0,1),
+  (8890001318,1300000000888,1,'2026-04-10','S6','S6_L2_004',2.9082,2.83,'yellow','flat',0,1),
+  (8890001319,1300000000888,1,'2026-04-11','S6','S6_L2_004',2.8576,2.83,'yellow','flat',0,1),
+  (8890001320,1300000000888,1,'2026-04-12','S6','S6_L2_004',2.9821,2.83,'yellow','up',0,1),
+  (8890001321,1300000000888,1,'2026-03-14','S7','S7_L2_001',8.9527,8.2326,'yellow','flat',0,1),
+  (8890001322,1300000000888,1,'2026-03-15','S7','S7_L2_001',9.2471,8.2326,'red','up',0,1),
+  (8890001323,1300000000888,1,'2026-03-16','S7','S7_L2_001',8.5199,8.2326,'yellow','down',0,1),
+  (8890001324,1300000000888,1,'2026-03-17','S7','S7_L2_001',9.1967,8.2326,'red','up',0,1),
+  (8890001325,1300000000888,1,'2026-03-18','S7','S7_L2_001',9.1396,8.2326,'red','flat',0,1),
+  (8890001326,1300000000888,1,'2026-03-19','S7','S7_L2_001',8.6838,8.2326,'yellow','down',0,1),
+  (8890001327,1300000000888,1,'2026-03-20','S7','S7_L2_001',8.7727,8.2326,'yellow','flat',0,1),
+  (8890001328,1300000000888,1,'2026-03-21','S7','S7_L2_001',9.0132,8.2326,'yellow','up',0,1),
+  (8890001329,1300000000888,1,'2026-03-22','S7','S7_L2_001',8.9211,8.2326,'yellow','flat',0,1),
+  (8890001330,1300000000888,1,'2026-03-23','S7','S7_L2_001',9.132,8.2326,'red','up',0,1),
+  (8890001331,1300000000888,1,'2026-03-24','S7','S7_L2_001',8.6635,8.2326,'yellow','down',0,1),
+  (8890001332,1300000000888,1,'2026-03-25','S7','S7_L2_001',8.813,8.2326,'yellow','flat',0,1),
+  (8890001333,1300000000888,1,'2026-03-26','S7','S7_L2_001',9.6274,8.2326,'red','up',0,1),
+  (8890001334,1300000000888,1,'2026-03-27','S7','S7_L2_001',8.8244,8.2326,'yellow','down',0,1),
+  (8890001335,1300000000888,1,'2026-03-28','S7','S7_L2_001',8.9375,8.2326,'yellow','flat',0,1),
+  (8890001336,1300000000888,1,'2026-03-29','S7','S7_L2_001',9.0051,8.2326,'yellow','flat',0,1),
+  (8890001337,1300000000888,1,'2026-03-30','S7','S7_L2_001',8.9776,8.2326,'yellow','flat',0,1),
+  (8890001338,1300000000888,1,'2026-03-31','S7','S7_L2_001',9.381,8.2326,'red','up',0,1),
+  (8890001339,1300000000888,1,'2026-04-01','S7','S7_L2_001',8.8978,8.2326,'yellow','down',0,1),
+  (8890001340,1300000000888,1,'2026-04-02','S7','S7_L2_001',9.2854,8.2326,'red','up',0,1),
+  (8890001341,1300000000888,1,'2026-04-03','S7','S7_L2_001',8.8209,8.2326,'yellow','down',0,1),
+  (8890001342,1300000000888,1,'2026-04-04','S7','S7_L2_001',9.2632,8.2326,'red','up',0,1),
+  (8890001343,1300000000888,1,'2026-04-05','S7','S7_L2_001',8.9951,8.2326,'yellow','down',0,1),
+  (8890001344,1300000000888,1,'2026-04-06','S7','S7_L2_001',9.0057,8.2326,'yellow','flat',0,1),
+  (8890001345,1300000000888,1,'2026-04-07','S7','S7_L2_001',9.0291,8.2326,'yellow','flat',0,1),
+  (8890001346,1300000000888,1,'2026-04-08','S7','S7_L2_001',9.2026,8.2326,'red','flat',0,1),
+  (8890001347,1300000000888,1,'2026-04-09','S7','S7_L2_001',8.7291,8.2326,'yellow','down',0,1),
+  (8890001348,1300000000888,1,'2026-04-10','S7','S7_L2_001',8.7896,8.2326,'yellow','flat',0,1),
+  (8890001349,1300000000888,1,'2026-04-11','S7','S7_L2_001',9.6065,8.2326,'red','up',0,1),
+  (8890001350,1300000000888,1,'2026-04-12','S7','S7_L2_001',9.1908,8.2326,'red','down',0,1),
+  (8890001351,1300000000888,1,'2026-03-14','S7','S7_L2_002',101.1165,96.7751,'green','flat',0,1),
+  (8890001352,1300000000888,1,'2026-03-15','S7','S7_L2_002',104.1923,96.7751,'green','up',0,1),
+  (8890001353,1300000000888,1,'2026-03-16','S7','S7_L2_002',102.0388,96.7751,'green','down',0,1),
+  (8890001354,1300000000888,1,'2026-03-17','S7','S7_L2_002',95.3188,96.7751,'yellow','down',0,1),
+  (8890001355,1300000000888,1,'2026-03-18','S7','S7_L2_002',102.718,96.7751,'green','up',0,1),
+  (8890001356,1300000000888,1,'2026-03-19','S7','S7_L2_002',101.8494,96.7751,'green','flat',0,1),
+  (8890001357,1300000000888,1,'2026-03-20','S7','S7_L2_002',103.2939,96.7751,'green','flat',0,1),
+  (8890001358,1300000000888,1,'2026-03-21','S7','S7_L2_002',99.8473,96.7751,'green','down',0,1),
+  (8890001359,1300000000888,1,'2026-03-22','S7','S7_L2_002',101.5471,96.7751,'green','flat',0,1),
+  (8890001360,1300000000888,1,'2026-03-23','S7','S7_L2_002',105.7258,96.7751,'green','up',0,1),
+  (8890001361,1300000000888,1,'2026-03-24','S7','S7_L2_002',101.7606,96.7751,'green','down',0,1),
+  (8890001362,1300000000888,1,'2026-03-25','S7','S7_L2_002',100.9077,96.7751,'green','flat',0,1),
+  (8890001363,1300000000888,1,'2026-03-26','S7','S7_L2_002',103.3427,96.7751,'green','up',0,1),
+  (8890001364,1300000000888,1,'2026-03-27','S7','S7_L2_002',101.0144,96.7751,'green','down',0,1),
+  (8890001365,1300000000888,1,'2026-03-28','S7','S7_L2_002',105.498,96.7751,'green','up',0,1),
+  (8890001366,1300000000888,1,'2026-03-29','S7','S7_L2_002',101.688,96.7751,'green','down',0,1),
+  (8890001367,1300000000888,1,'2026-03-30','S7','S7_L2_002',103.3375,96.7751,'green','flat',0,1),
+  (8890001368,1300000000888,1,'2026-03-31','S7','S7_L2_002',100.0639,96.7751,'green','down',0,1),
+  (8890001369,1300000000888,1,'2026-04-01','S7','S7_L2_002',98.3966,96.7751,'green','flat',0,1),
+  (8890001370,1300000000888,1,'2026-04-02','S7','S7_L2_002',104.4291,96.7751,'green','up',0,1),
+  (8890001371,1300000000888,1,'2026-04-03','S7','S7_L2_002',103.0267,96.7751,'green','flat',0,1),
+  (8890001372,1300000000888,1,'2026-04-04','S7','S7_L2_002',104.178,96.7751,'green','flat',0,1),
+  (8890001373,1300000000888,1,'2026-04-05','S7','S7_L2_002',104.4824,96.7751,'green','flat',0,1),
+  (8890001374,1300000000888,1,'2026-04-06','S7','S7_L2_002',97.7174,96.7751,'green','down',0,1),
+  (8890001375,1300000000888,1,'2026-04-07','S7','S7_L2_002',102.5905,96.7751,'green','up',0,1),
+  (8890001376,1300000000888,1,'2026-04-08','S7','S7_L2_002',96.072,96.7751,'yellow','down',0,1),
+  (8890001377,1300000000888,1,'2026-04-09','S7','S7_L2_002',103.8159,96.7751,'green','up',0,1),
+  (8890001378,1300000000888,1,'2026-04-10','S7','S7_L2_002',98.8939,96.7751,'green','down',0,1),
+  (8890001379,1300000000888,1,'2026-04-11','S7','S7_L2_002',103.6563,96.7751,'green','up',0,1),
+  (8890001380,1300000000888,1,'2026-04-12','S7','S7_L2_002',104.4495,96.7751,'green','flat',0,1),
+  (8890001381,1300000000888,1,'2026-03-14','S7','S7_L2_003',6.9202,10.4458,'red','flat',0,1),
+  (8890001382,1300000000888,1,'2026-03-15','S7','S7_L2_003',7.0291,10.4458,'red','flat',0,1),
+  (8890001383,1300000000888,1,'2026-03-16','S7','S7_L2_003',7.2919,10.4458,'red','up',0,1),
+  (8890001384,1300000000888,1,'2026-03-17','S7','S7_L2_003',6.685,10.4458,'red','down',0,1),
+  (8890001385,1300000000888,1,'2026-03-18','S7','S7_L2_003',7.1698,10.4458,'red','up',0,1),
+  (8890001386,1300000000888,1,'2026-03-19','S7','S7_L2_003',7.059,10.4458,'red','flat',0,1),
+  (8890001387,1300000000888,1,'2026-03-20','S7','S7_L2_003',7.2341,10.4458,'red','up',0,1),
+  (8890001388,1300000000888,1,'2026-03-21','S7','S7_L2_003',6.6854,10.4458,'red','down',0,1),
+  (8890001389,1300000000888,1,'2026-03-22','S7','S7_L2_003',7.0347,10.4458,'red','up',0,1),
+  (8890001390,1300000000888,1,'2026-03-23','S7','S7_L2_003',7.267,10.4458,'red','up',0,1),
+  (8890001391,1300000000888,1,'2026-03-24','S7','S7_L2_003',7.3208,10.4458,'red','flat',0,1),
+  (8890001392,1300000000888,1,'2026-03-25','S7','S7_L2_003',6.8717,10.4458,'red','down',0,1),
+  (8890001393,1300000000888,1,'2026-03-26','S7','S7_L2_003',6.975,10.4458,'red','flat',0,1),
+  (8890001394,1300000000888,1,'2026-03-27','S7','S7_L2_003',7.4226,10.4458,'red','up',0,1),
+  (8890001395,1300000000888,1,'2026-03-28','S7','S7_L2_003',6.7344,10.4458,'red','down',0,1),
+  (8890001396,1300000000888,1,'2026-03-29','S7','S7_L2_003',7.0243,10.4458,'red','up',0,1),
+  (8890001397,1300000000888,1,'2026-03-30','S7','S7_L2_003',7.0714,10.4458,'red','flat',0,1),
+  (8890001398,1300000000888,1,'2026-03-31','S7','S7_L2_003',7.0709,10.4458,'red','flat',0,1),
+  (8890001399,1300000000888,1,'2026-04-01','S7','S7_L2_003',6.8369,10.4458,'red','down',0,1),
+  (8890001400,1300000000888,1,'2026-04-02','S7','S7_L2_003',7.2375,10.4458,'red','up',0,1),
+  (8890001401,1300000000888,1,'2026-04-03','S7','S7_L2_003',7.2215,10.4458,'red','flat',0,1),
+  (8890001402,1300000000888,1,'2026-04-04','S7','S7_L2_003',7.4172,10.4458,'red','up',0,1),
+  (8890001403,1300000000888,1,'2026-04-05','S7','S7_L2_003',6.8667,10.4458,'red','down',0,1),
+  (8890001404,1300000000888,1,'2026-04-06','S7','S7_L2_003',6.9324,10.4458,'red','flat',0,1),
+  (8890001405,1300000000888,1,'2026-04-07','S7','S7_L2_003',7.2654,10.4458,'red','up',0,1),
+  (8890001406,1300000000888,1,'2026-04-08','S7','S7_L2_003',7.4171,10.4458,'red','up',0,1),
+  (8890001407,1300000000888,1,'2026-04-09','S7','S7_L2_003',7.0319,10.4458,'red','down',0,1),
+  (8890001408,1300000000888,1,'2026-04-10','S7','S7_L2_003',6.7116,10.4458,'red','down',0,1),
+  (8890001409,1300000000888,1,'2026-04-11','S7','S7_L2_003',6.9884,10.4458,'red','up',0,1),
+  (8890001410,1300000000888,1,'2026-04-12','S7','S7_L2_003',7.2376,10.4458,'red','up',0,1),
+  (8890001411,1300000000888,1,'2026-03-14','S7','S7_L2_004',9.3902,7.7015,'red','flat',0,1),
+  (8890001412,1300000000888,1,'2026-03-15','S7','S7_L2_004',9.5103,7.7015,'red','flat',0,1),
+  (8890001413,1300000000888,1,'2026-03-16','S7','S7_L2_004',9.7345,7.7015,'red','up',0,1),
+  (8890001414,1300000000888,1,'2026-03-17','S7','S7_L2_004',9.0839,7.7015,'red','down',0,1),
+  (8890001415,1300000000888,1,'2026-03-18','S7','S7_L2_004',8.9533,7.7015,'red','flat',0,1),
+  (8890001416,1300000000888,1,'2026-03-19','S7','S7_L2_004',8.8709,7.7015,'red','flat',0,1),
+  (8890001417,1300000000888,1,'2026-03-20','S7','S7_L2_004',9.1691,7.7015,'red','up',0,1),
+  (8890001418,1300000000888,1,'2026-03-21','S7','S7_L2_004',9.4844,7.7015,'red','up',0,1),
+  (8890001419,1300000000888,1,'2026-03-22','S7','S7_L2_004',9.6799,7.7015,'red','up',0,1),
+  (8890001420,1300000000888,1,'2026-03-23','S7','S7_L2_004',9.2634,7.7015,'red','down',0,1),
+  (8890001421,1300000000888,1,'2026-03-24','S7','S7_L2_004',9.2071,7.7015,'red','flat',0,1),
+  (8890001422,1300000000888,1,'2026-03-25','S7','S7_L2_004',9.1663,7.7015,'red','flat',0,1),
+  (8890001423,1300000000888,1,'2026-03-26','S7','S7_L2_004',9.5416,7.7015,'red','up',0,1),
+  (8890001424,1300000000888,1,'2026-03-27','S7','S7_L2_004',8.9926,7.7015,'red','down',0,1),
+  (8890001425,1300000000888,1,'2026-03-28','S7','S7_L2_004',9.174,7.7015,'red','up',0,1),
+  (8890001426,1300000000888,1,'2026-03-29','S7','S7_L2_004',9.1816,7.7015,'red','flat',0,1),
+  (8890001427,1300000000888,1,'2026-03-30','S7','S7_L2_004',9.1955,7.7015,'red','flat',0,1),
+  (8890001428,1300000000888,1,'2026-03-31','S7','S7_L2_004',9.7022,7.7015,'red','up',0,1),
+  (8890001429,1300000000888,1,'2026-04-01','S7','S7_L2_004',8.9567,7.7015,'red','down',0,1),
+  (8890001430,1300000000888,1,'2026-04-02','S7','S7_L2_004',9.8809,7.7015,'red','up',0,1),
+  (8890001431,1300000000888,1,'2026-04-03','S7','S7_L2_004',9.0221,7.7015,'red','down',0,1),
+  (8890001432,1300000000888,1,'2026-04-04','S7','S7_L2_004',8.9765,7.7015,'red','flat',0,1),
+  (8890001433,1300000000888,1,'2026-04-05','S7','S7_L2_004',9.0205,7.7015,'red','flat',0,1),
+  (8890001434,1300000000888,1,'2026-04-06','S7','S7_L2_004',9.3821,7.7015,'red','up',0,1),
+  (8890001435,1300000000888,1,'2026-04-07','S7','S7_L2_004',9.1991,7.7015,'red','flat',0,1),
+  (8890001436,1300000000888,1,'2026-04-08','S7','S7_L2_004',9.5126,7.7015,'red','up',0,1),
+  (8890001437,1300000000888,1,'2026-04-09','S7','S7_L2_004',8.9756,7.7015,'red','down',0,1),
+  (8890001438,1300000000888,1,'2026-04-10','S7','S7_L2_004',8.741,7.7015,'red','down',0,1),
+  (8890001439,1300000000888,1,'2026-04-11','S7','S7_L2_004',9.1006,7.7015,'red','up',0,1),
+  (8890001440,1300000000888,1,'2026-04-12','S7','S7_L2_004',9.2802,7.7015,'red','flat',0,1),
+  (8890001441,1300000000888,1,'2026-03-14','S7','S7_L2_005',8.5134,7.5028,'red','flat',0,1),
+  (8890001442,1300000000888,1,'2026-03-15','S7','S7_L2_005',8.8776,7.5028,'red','up',0,1),
+  (8890001443,1300000000888,1,'2026-03-16','S7','S7_L2_005',9.0492,7.5028,'red','flat',0,1),
+  (8890001444,1300000000888,1,'2026-03-17','S7','S7_L2_005',8.6906,7.5028,'red','down',0,1),
+  (8890001445,1300000000888,1,'2026-03-18','S7','S7_L2_005',8.6859,7.5028,'red','flat',0,1),
+  (8890001446,1300000000888,1,'2026-03-19','S7','S7_L2_005',8.6135,7.5028,'red','flat',0,1),
+  (8890001447,1300000000888,1,'2026-03-20','S7','S7_L2_005',8.8678,7.5028,'red','up',0,1),
+  (8890001448,1300000000888,1,'2026-03-21','S7','S7_L2_005',9.028,7.5028,'red','flat',0,1),
+  (8890001449,1300000000888,1,'2026-03-22','S7','S7_L2_005',9.6402,7.5028,'red','up',0,1),
+  (8890001450,1300000000888,1,'2026-03-23','S7','S7_L2_005',9.2174,7.5028,'red','down',0,1),
+  (8890001451,1300000000888,1,'2026-03-24','S7','S7_L2_005',8.569,7.5028,'red','down',0,1),
+  (8890001452,1300000000888,1,'2026-03-25','S7','S7_L2_005',8.4955,7.5028,'red','flat',0,1),
+  (8890001453,1300000000888,1,'2026-03-26','S7','S7_L2_005',8.8766,7.5028,'red','up',0,1),
+  (8890001454,1300000000888,1,'2026-03-27','S7','S7_L2_005',9.3261,7.5028,'red','up',0,1),
+  (8890001455,1300000000888,1,'2026-03-28','S7','S7_L2_005',9.0817,7.5028,'red','down',0,1),
+  (8890001456,1300000000888,1,'2026-03-29','S7','S7_L2_005',8.7652,7.5028,'red','down',0,1),
+  (8890001457,1300000000888,1,'2026-03-30','S7','S7_L2_005',9.1737,7.5028,'red','up',0,1),
+  (8890001458,1300000000888,1,'2026-03-31','S7','S7_L2_005',9.2741,7.5028,'red','flat',0,1),
+  (8890001459,1300000000888,1,'2026-04-01','S7','S7_L2_005',9.2967,7.5028,'red','flat',0,1),
+  (8890001460,1300000000888,1,'2026-04-02','S7','S7_L2_005',8.6212,7.5028,'red','down',0,1),
+  (8890001461,1300000000888,1,'2026-04-03','S7','S7_L2_005',9.023,7.5028,'red','up',0,1),
+  (8890001462,1300000000888,1,'2026-04-04','S7','S7_L2_005',8.5638,7.5028,'red','down',0,1),
+  (8890001463,1300000000888,1,'2026-04-05','S7','S7_L2_005',8.6909,7.5028,'red','flat',0,1),
+  (8890001464,1300000000888,1,'2026-04-06','S7','S7_L2_005',8.5645,7.5028,'red','flat',0,1),
+  (8890001465,1300000000888,1,'2026-04-07','S7','S7_L2_005',8.8361,7.5028,'red','up',0,1),
+  (8890001466,1300000000888,1,'2026-04-08','S7','S7_L2_005',8.5224,7.5028,'red','down',0,1),
+  (8890001467,1300000000888,1,'2026-04-09','S7','S7_L2_005',9.1131,7.5028,'red','up',0,1),
+  (8890001468,1300000000888,1,'2026-04-10','S7','S7_L2_005',8.9028,7.5028,'red','down',0,1),
+  (8890001469,1300000000888,1,'2026-04-11','S7','S7_L2_005',8.6751,7.5028,'red','down',0,1),
+  (8890001470,1300000000888,1,'2026-04-12','S7','S7_L2_005',9.0358,7.5028,'red','up',0,1),
+  (8890001471,1300000000888,1,'2026-03-14','S7','S7_L2_006',98.7826,101.7435,'yellow','flat',0,1),
+  (8890001472,1300000000888,1,'2026-03-15','S7','S7_L2_006',95.424,101.7435,'red','down',0,1),
+  (8890001473,1300000000888,1,'2026-03-16','S7','S7_L2_006',92.7917,101.7435,'red','down',0,1),
+  (8890001474,1300000000888,1,'2026-03-17','S7','S7_L2_006',93.6411,101.7435,'red','flat',0,1),
+  (8890001475,1300000000888,1,'2026-03-18','S7','S7_L2_006',94.1504,101.7435,'red','flat',0,1),
+  (8890001476,1300000000888,1,'2026-03-19','S7','S7_L2_006',92.4577,101.7435,'red','flat',0,1),
+  (8890001477,1300000000888,1,'2026-03-20','S7','S7_L2_006',89.5955,101.7435,'red','down',0,1),
+  (8890001478,1300000000888,1,'2026-03-21','S7','S7_L2_006',93.373,101.7435,'red','up',0,1),
+  (8890001479,1300000000888,1,'2026-03-22','S7','S7_L2_006',97.9665,101.7435,'yellow','up',0,1),
+  (8890001480,1300000000888,1,'2026-03-23','S7','S7_L2_006',92.1015,101.7435,'red','down',0,1),
+  (8890001481,1300000000888,1,'2026-03-24','S7','S7_L2_006',88.9761,101.7435,'red','down',0,1),
+  (8890001482,1300000000888,1,'2026-03-25','S7','S7_L2_006',94.1938,101.7435,'red','up',0,1),
+  (8890001483,1300000000888,1,'2026-03-26','S7','S7_L2_006',97.5701,101.7435,'yellow','up',0,1),
+  (8890001484,1300000000888,1,'2026-03-27','S7','S7_L2_006',89.5651,101.7435,'red','down',0,1),
+  (8890001485,1300000000888,1,'2026-03-28','S7','S7_L2_006',94.9838,101.7435,'red','up',0,1),
+  (8890001486,1300000000888,1,'2026-03-29','S7','S7_L2_006',95.6112,101.7435,'red','flat',0,1),
+  (8890001487,1300000000888,1,'2026-03-30','S7','S7_L2_006',95.9665,101.7435,'red','flat',0,1),
+  (8890001488,1300000000888,1,'2026-03-31','S7','S7_L2_006',96.0239,101.7435,'red','flat',0,1),
+  (8890001489,1300000000888,1,'2026-04-01','S7','S7_L2_006',96.1685,101.7435,'red','flat',0,1),
+  (8890001490,1300000000888,1,'2026-04-02','S7','S7_L2_006',89.9575,101.7435,'red','down',0,1),
+  (8890001491,1300000000888,1,'2026-04-03','S7','S7_L2_006',96.1909,101.7435,'red','up',0,1),
+  (8890001492,1300000000888,1,'2026-04-04','S7','S7_L2_006',98.3484,101.7435,'yellow','up',0,1),
+  (8890001493,1300000000888,1,'2026-04-05','S7','S7_L2_006',93.8174,101.7435,'red','down',0,1),
+  (8890001494,1300000000888,1,'2026-04-06','S7','S7_L2_006',95.4978,101.7435,'red','flat',0,1),
+  (8890001495,1300000000888,1,'2026-04-07','S7','S7_L2_006',91.5712,101.7435,'red','down',0,1),
+  (8890001496,1300000000888,1,'2026-04-08','S7','S7_L2_006',98.1372,101.7435,'yellow','up',0,1),
+  (8890001497,1300000000888,1,'2026-04-09','S7','S7_L2_006',92.6933,101.7435,'red','down',0,1),
+  (8890001498,1300000000888,1,'2026-04-10','S7','S7_L2_006',99.119,101.7435,'yellow','up',0,1),
+  (8890001499,1300000000888,1,'2026-04-11','S7','S7_L2_006',93.3689,101.7435,'red','down',0,1),
+  (8890001500,1300000000888,1,'2026-04-12','S7','S7_L2_006',96.3658,101.7435,'red','up',0,1),
+  (8890001501,1300000000888,1,'2026-03-14','S7','S7_L2_007',6.6942,9.2009,'red','flat',0,1),
+  (8890001502,1300000000888,1,'2026-03-15','S7','S7_L2_007',7.1863,9.2009,'red','up',0,1),
+  (8890001503,1300000000888,1,'2026-03-16','S7','S7_L2_007',6.4006,9.2009,'red','down',0,1),
+  (8890001504,1300000000888,1,'2026-03-17','S7','S7_L2_007',6.8785,9.2009,'red','up',0,1),
+  (8890001505,1300000000888,1,'2026-03-18','S7','S7_L2_007',6.3787,9.2009,'red','down',0,1),
+  (8890001506,1300000000888,1,'2026-03-19','S7','S7_L2_007',6.5572,9.2009,'red','up',0,1),
+  (8890001507,1300000000888,1,'2026-03-20','S7','S7_L2_007',7.1892,9.2009,'red','up',0,1),
+  (8890001508,1300000000888,1,'2026-03-21','S7','S7_L2_007',6.9884,9.2009,'red','down',0,1),
+  (8890001509,1300000000888,1,'2026-03-22','S7','S7_L2_007',6.3928,9.2009,'red','down',0,1),
+  (8890001510,1300000000888,1,'2026-03-23','S7','S7_L2_007',6.8019,9.2009,'red','up',0,1),
+  (8890001511,1300000000888,1,'2026-03-24','S7','S7_L2_007',6.6766,9.2009,'red','flat',0,1),
+  (8890001512,1300000000888,1,'2026-03-25','S7','S7_L2_007',6.9194,9.2009,'red','up',0,1),
+  (8890001513,1300000000888,1,'2026-03-26','S7','S7_L2_007',7.1808,9.2009,'red','up',0,1),
+  (8890001514,1300000000888,1,'2026-03-27','S7','S7_L2_007',6.9366,9.2009,'red','down',0,1),
+  (8890001515,1300000000888,1,'2026-03-28','S7','S7_L2_007',6.8918,9.2009,'red','flat',0,1),
+  (8890001516,1300000000888,1,'2026-03-29','S7','S7_L2_007',6.9068,9.2009,'red','flat',0,1),
+  (8890001517,1300000000888,1,'2026-03-30','S7','S7_L2_007',6.5801,9.2009,'red','down',0,1),
+  (8890001518,1300000000888,1,'2026-03-31','S7','S7_L2_007',6.9462,9.2009,'red','up',0,1),
+  (8890001519,1300000000888,1,'2026-04-01','S7','S7_L2_007',6.9911,9.2009,'red','flat',0,1),
+  (8890001520,1300000000888,1,'2026-04-02','S7','S7_L2_007',6.6781,9.2009,'red','down',0,1),
+  (8890001521,1300000000888,1,'2026-04-03','S7','S7_L2_007',6.672,9.2009,'red','flat',0,1),
+  (8890001522,1300000000888,1,'2026-04-04','S7','S7_L2_007',7.099,9.2009,'red','up',0,1),
+  (8890001523,1300000000888,1,'2026-04-05','S7','S7_L2_007',6.8458,9.2009,'red','down',0,1),
+  (8890001524,1300000000888,1,'2026-04-06','S7','S7_L2_007',6.571,9.2009,'red','down',0,1),
+  (8890001525,1300000000888,1,'2026-04-07','S7','S7_L2_007',6.7165,9.2009,'red','up',0,1),
+  (8890001526,1300000000888,1,'2026-04-08','S7','S7_L2_007',6.7097,9.2009,'red','flat',0,1),
+  (8890001527,1300000000888,1,'2026-04-09','S7','S7_L2_007',6.7899,9.2009,'red','flat',0,1),
+  (8890001528,1300000000888,1,'2026-04-10','S7','S7_L2_007',6.7883,9.2009,'red','flat',0,1),
+  (8890001529,1300000000888,1,'2026-04-11','S7','S7_L2_007',6.7522,9.2009,'red','flat',0,1),
+  (8890001530,1300000000888,1,'2026-04-12','S7','S7_L2_007',7.1447,9.2009,'red','up',0,1),
+  (8890001531,1300000000888,1,'2026-03-14','S7','S7_L2_008',9.8945,7.9408,'red','flat',0,1),
+  (8890001532,1300000000888,1,'2026-03-15','S7','S7_L2_008',10.083,7.9408,'red','flat',0,1),
+  (8890001533,1300000000888,1,'2026-03-16','S7','S7_L2_008',9.1627,7.9408,'red','down',0,1),
+  (8890001534,1300000000888,1,'2026-03-17','S7','S7_L2_008',9.6857,7.9408,'red','up',0,1),
+  (8890001535,1300000000888,1,'2026-03-18','S7','S7_L2_008',9.9937,7.9408,'red','up',0,1),
+  (8890001536,1300000000888,1,'2026-03-19','S7','S7_L2_008',9.8636,7.9408,'red','flat',0,1),
+  (8890001537,1300000000888,1,'2026-03-20','S7','S7_L2_008',9.4568,7.9408,'red','down',0,1),
+  (8890001538,1300000000888,1,'2026-03-21','S7','S7_L2_008',9.4346,7.9408,'red','flat',0,1),
+  (8890001539,1300000000888,1,'2026-03-22','S7','S7_L2_008',9.9315,7.9408,'red','up',0,1),
+  (8890001540,1300000000888,1,'2026-03-23','S7','S7_L2_008',9.592,7.9408,'red','down',0,1),
+  (8890001541,1300000000888,1,'2026-03-24','S7','S7_L2_008',9.8413,7.9408,'red','up',0,1),
+  (8890001542,1300000000888,1,'2026-03-25','S7','S7_L2_008',9.6989,7.9408,'red','flat',0,1),
+  (8890001543,1300000000888,1,'2026-03-26','S7','S7_L2_008',9.6194,7.9408,'red','flat',0,1),
+  (8890001544,1300000000888,1,'2026-03-27','S7','S7_L2_008',9.6884,7.9408,'red','flat',0,1),
+  (8890001545,1300000000888,1,'2026-03-28','S7','S7_L2_008',9.4132,7.9408,'red','down',0,1),
+  (8890001546,1300000000888,1,'2026-03-29','S7','S7_L2_008',10.1462,7.9408,'red','up',0,1),
+  (8890001547,1300000000888,1,'2026-03-30','S7','S7_L2_008',9.8123,7.9408,'red','down',0,1),
+  (8890001548,1300000000888,1,'2026-03-31','S7','S7_L2_008',10.0588,7.9408,'red','up',0,1),
+  (8890001549,1300000000888,1,'2026-04-01','S7','S7_L2_008',9.5002,7.9408,'red','down',0,1),
+  (8890001550,1300000000888,1,'2026-04-02','S7','S7_L2_008',9.497,7.9408,'red','flat',0,1),
+  (8890001551,1300000000888,1,'2026-04-03','S7','S7_L2_008',9.561,7.9408,'red','flat',0,1),
+  (8890001552,1300000000888,1,'2026-04-04','S7','S7_L2_008',9.404,7.9408,'red','flat',0,1),
+  (8890001553,1300000000888,1,'2026-04-05','S7','S7_L2_008',9.8499,7.9408,'red','up',0,1),
+  (8890001554,1300000000888,1,'2026-04-06','S7','S7_L2_008',9.8598,7.9408,'red','flat',0,1),
+  (8890001555,1300000000888,1,'2026-04-07','S7','S7_L2_008',9.5049,7.9408,'red','down',0,1),
+  (8890001556,1300000000888,1,'2026-04-08','S7','S7_L2_008',9.5609,7.9408,'red','flat',0,1),
+  (8890001557,1300000000888,1,'2026-04-09','S7','S7_L2_008',9.7626,7.9408,'red','up',0,1),
+  (8890001558,1300000000888,1,'2026-04-10','S7','S7_L2_008',9.4355,7.9408,'red','down',0,1),
+  (8890001559,1300000000888,1,'2026-04-11','S7','S7_L2_008',9.535,7.9408,'red','flat',0,1),
+  (8890001560,1300000000888,1,'2026-04-12','S7','S7_L2_008',10.1054,7.9408,'red','up',0,1),
+  (8890001561,1300000000888,1,'2026-03-14','S7','S7_L2_009',8.4654,8.4811,'green','flat',0,1),
+  (8890001562,1300000000888,1,'2026-03-15','S7','S7_L2_009',8.525,8.4811,'yellow','flat',0,1),
+  (8890001563,1300000000888,1,'2026-03-16','S7','S7_L2_009',9.31,8.4811,'yellow','up',0,1),
+  (8890001564,1300000000888,1,'2026-03-17','S7','S7_L2_009',8.1069,8.4811,'green','down',0,1),
+  (8890001565,1300000000888,1,'2026-03-18','S7','S7_L2_009',8.3516,8.4811,'green','up',0,1),
+  (8890001566,1300000000888,1,'2026-03-19','S7','S7_L2_009',9.1262,8.4811,'yellow','up',0,1),
+  (8890001567,1300000000888,1,'2026-03-20','S7','S7_L2_009',8.5529,8.4811,'yellow','down',0,1),
+  (8890001568,1300000000888,1,'2026-03-21','S7','S7_L2_009',8.7891,8.4811,'yellow','up',0,1),
+  (8890001569,1300000000888,1,'2026-03-22','S7','S7_L2_009',9.2099,8.4811,'yellow','up',0,1),
+  (8890001570,1300000000888,1,'2026-03-23','S7','S7_L2_009',8.473,8.4811,'green','down',0,1),
+  (8890001571,1300000000888,1,'2026-03-24','S7','S7_L2_009',8.5056,8.4811,'yellow','flat',0,1),
+  (8890001572,1300000000888,1,'2026-03-25','S7','S7_L2_009',8.766,8.4811,'yellow','up',0,1),
+  (8890001573,1300000000888,1,'2026-03-26','S7','S7_L2_009',8.6396,8.4811,'yellow','flat',0,1),
+  (8890001574,1300000000888,1,'2026-03-27','S7','S7_L2_009',8.5229,8.4811,'yellow','flat',0,1),
+  (8890001575,1300000000888,1,'2026-03-28','S7','S7_L2_009',8.6247,8.4811,'yellow','flat',0,1),
+  (8890001576,1300000000888,1,'2026-03-29','S7','S7_L2_009',8.3143,8.4811,'green','down',0,1),
+  (8890001577,1300000000888,1,'2026-03-30','S7','S7_L2_009',8.7803,8.4811,'yellow','up',0,1),
+  (8890001578,1300000000888,1,'2026-03-31','S7','S7_L2_009',8.8761,8.4811,'yellow','flat',0,1),
+  (8890001579,1300000000888,1,'2026-04-01','S7','S7_L2_009',8.6174,8.4811,'yellow','down',0,1),
+  (8890001580,1300000000888,1,'2026-04-02','S7','S7_L2_009',8.6012,8.4811,'yellow','flat',0,1),
+  (8890001581,1300000000888,1,'2026-04-03','S7','S7_L2_009',8.8019,8.4811,'yellow','up',0,1),
+  (8890001582,1300000000888,1,'2026-04-04','S7','S7_L2_009',8.5195,8.4811,'yellow','down',0,1),
+  (8890001583,1300000000888,1,'2026-04-05','S7','S7_L2_009',8.5793,8.4811,'yellow','flat',0,1),
+  (8890001584,1300000000888,1,'2026-04-06','S7','S7_L2_009',8.6415,8.4811,'yellow','flat',0,1),
+  (8890001585,1300000000888,1,'2026-04-07','S7','S7_L2_009',9.0417,8.4811,'yellow','up',0,1),
+  (8890001586,1300000000888,1,'2026-04-08','S7','S7_L2_009',8.6465,8.4811,'yellow','down',0,1),
+  (8890001587,1300000000888,1,'2026-04-09','S7','S7_L2_009',8.6298,8.4811,'yellow','flat',0,1),
+  (8890001588,1300000000888,1,'2026-04-10','S7','S7_L2_009',8.6167,8.4811,'yellow','flat',0,1),
+  (8890001589,1300000000888,1,'2026-04-11','S7','S7_L2_009',8.5596,8.4811,'yellow','flat',0,1),
+  (8890001590,1300000000888,1,'2026-04-12','S7','S7_L2_009',8.4086,8.4811,'green','flat',0,1),
+  (8890001591,1300000000888,1,'2026-03-14','S7','S7_L2_010',97.8554,104.2002,'red','flat',0,1),
+  (8890001592,1300000000888,1,'2026-03-15','S7','S7_L2_010',103.2274,104.2002,'yellow','up',0,1),
+  (8890001593,1300000000888,1,'2026-03-16','S7','S7_L2_010',98.912,104.2002,'red','down',0,1),
+  (8890001594,1300000000888,1,'2026-03-17','S7','S7_L2_010',100.9089,104.2002,'yellow','up',0,1),
+  (8890001595,1300000000888,1,'2026-03-18','S7','S7_L2_010',99.1923,104.2002,'yellow','flat',0,1),
+  (8890001596,1300000000888,1,'2026-03-19','S7','S7_L2_010',96.6213,104.2002,'red','down',0,1),
+  (8890001597,1300000000888,1,'2026-03-20','S7','S7_L2_010',99.2271,104.2002,'yellow','up',0,1),
+  (8890001598,1300000000888,1,'2026-03-21','S7','S7_L2_010',104.8473,104.2002,'green','up',0,1),
+  (8890001599,1300000000888,1,'2026-03-22','S7','S7_L2_010',99.3785,104.2002,'yellow','down',0,1),
+  (8890001600,1300000000888,1,'2026-03-23','S7','S7_L2_010',98.5882,104.2002,'red','flat',0,1),
+  (8890001601,1300000000888,1,'2026-03-24','S7','S7_L2_010',99.3384,104.2002,'yellow','flat',0,1),
+  (8890001602,1300000000888,1,'2026-03-25','S7','S7_L2_010',99.6199,104.2002,'yellow','flat',0,1),
+  (8890001603,1300000000888,1,'2026-03-26','S7','S7_L2_010',101.3199,104.2002,'yellow','flat',0,1),
+  (8890001604,1300000000888,1,'2026-03-27','S7','S7_L2_010',99.3874,104.2002,'yellow','flat',0,1),
+  (8890001605,1300000000888,1,'2026-03-28','S7','S7_L2_010',100.3355,104.2002,'yellow','flat',0,1),
+  (8890001606,1300000000888,1,'2026-03-29','S7','S7_L2_010',99.1481,104.2002,'yellow','flat',0,1),
+  (8890001607,1300000000888,1,'2026-03-30','S7','S7_L2_010',101.7094,104.2002,'yellow','up',0,1),
+  (8890001608,1300000000888,1,'2026-03-31','S7','S7_L2_010',101.5698,104.2002,'yellow','flat',0,1),
+  (8890001609,1300000000888,1,'2026-04-01','S7','S7_L2_010',101.2692,104.2002,'yellow','flat',0,1),
+  (8890001610,1300000000888,1,'2026-04-02','S7','S7_L2_010',102.5415,104.2002,'yellow','flat',0,1),
+  (8890001611,1300000000888,1,'2026-04-03','S7','S7_L2_010',100.3305,104.2002,'yellow','down',0,1),
+  (8890001612,1300000000888,1,'2026-04-04','S7','S7_L2_010',104.2919,104.2002,'green','up',0,1),
+  (8890001613,1300000000888,1,'2026-04-05','S7','S7_L2_010',102.0375,104.2002,'yellow','down',0,1),
+  (8890001614,1300000000888,1,'2026-04-06','S7','S7_L2_010',105.1217,104.2002,'green','up',0,1),
+  (8890001615,1300000000888,1,'2026-04-07','S7','S7_L2_010',100.3895,104.2002,'yellow','down',0,1),
+  (8890001616,1300000000888,1,'2026-04-08','S7','S7_L2_010',101.4516,104.2002,'yellow','flat',0,1),
+  (8890001617,1300000000888,1,'2026-04-09','S7','S7_L2_010',98.5707,104.2002,'red','down',0,1),
+  (8890001618,1300000000888,1,'2026-04-10','S7','S7_L2_010',100.6773,104.2002,'yellow','up',0,1),
+  (8890001619,1300000000888,1,'2026-04-11','S7','S7_L2_010',103.0996,104.2002,'yellow','up',0,1),
+  (8890001620,1300000000888,1,'2026-04-12','S7','S7_L2_010',99.5267,104.2002,'yellow','down',0,1),
+  (8890001621,1300000000888,1,'2026-03-14','S7','S7_L2_011',7.8155,9.2312,'red','flat',0,1),
+  (8890001622,1300000000888,1,'2026-03-15','S7','S7_L2_011',7.4864,9.2312,'red','down',0,1),
+  (8890001623,1300000000888,1,'2026-03-16','S7','S7_L2_011',7.8359,9.2312,'red','up',0,1),
+  (8890001624,1300000000888,1,'2026-03-17','S7','S7_L2_011',7.2452,9.2312,'red','down',0,1),
+  (8890001625,1300000000888,1,'2026-03-18','S7','S7_L2_011',7.4185,9.2312,'red','up',0,1),
+  (8890001626,1300000000888,1,'2026-03-19','S7','S7_L2_011',7.3692,9.2312,'red','flat',0,1),
+  (8890001627,1300000000888,1,'2026-03-20','S7','S7_L2_011',7.7074,9.2312,'red','up',0,1),
+  (8890001628,1300000000888,1,'2026-03-21','S7','S7_L2_011',7.6247,9.2312,'red','flat',0,1),
+  (8890001629,1300000000888,1,'2026-03-22','S7','S7_L2_011',7.4635,9.2312,'red','down',0,1),
+  (8890001630,1300000000888,1,'2026-03-23','S7','S7_L2_011',7.3783,9.2312,'red','flat',0,1),
+  (8890001631,1300000000888,1,'2026-03-24','S7','S7_L2_011',7.4746,9.2312,'red','flat',0,1),
+  (8890001632,1300000000888,1,'2026-03-25','S7','S7_L2_011',7.6432,9.2312,'red','up',0,1),
+  (8890001633,1300000000888,1,'2026-03-26','S7','S7_L2_011',7.6682,9.2312,'red','flat',0,1),
+  (8890001634,1300000000888,1,'2026-03-27','S7','S7_L2_011',7.4672,9.2312,'red','down',0,1),
+  (8890001635,1300000000888,1,'2026-03-28','S7','S7_L2_011',7.3803,9.2312,'red','flat',0,1),
+  (8890001636,1300000000888,1,'2026-03-29','S7','S7_L2_011',7.5035,9.2312,'red','flat',0,1),
+  (8890001637,1300000000888,1,'2026-03-30','S7','S7_L2_011',7.5096,9.2312,'red','flat',0,1),
+  (8890001638,1300000000888,1,'2026-03-31','S7','S7_L2_011',7.5373,9.2312,'red','flat',0,1),
+  (8890001639,1300000000888,1,'2026-04-01','S7','S7_L2_011',7.3788,9.2312,'red','down',0,1),
+  (8890001640,1300000000888,1,'2026-04-02','S7','S7_L2_011',7.8712,9.2312,'red','up',0,1),
+  (8890001641,1300000000888,1,'2026-04-03','S7','S7_L2_011',7.3395,9.2312,'red','down',0,1),
+  (8890001642,1300000000888,1,'2026-04-04','S7','S7_L2_011',7.82,9.2312,'red','up',0,1),
+  (8890001643,1300000000888,1,'2026-04-05','S7','S7_L2_011',7.7934,9.2312,'red','flat',0,1),
+  (8890001644,1300000000888,1,'2026-04-06','S7','S7_L2_011',7.6931,9.2312,'red','flat',0,1),
+  (8890001645,1300000000888,1,'2026-04-07','S7','S7_L2_011',7.9012,9.2312,'red','up',0,1),
+  (8890001646,1300000000888,1,'2026-04-08','S7','S7_L2_011',7.6053,9.2312,'red','down',0,1),
+  (8890001647,1300000000888,1,'2026-04-09','S7','S7_L2_011',7.4095,9.2312,'red','down',0,1),
+  (8890001648,1300000000888,1,'2026-04-10','S7','S7_L2_011',7.3632,9.2312,'red','flat',0,1),
+  (8890001649,1300000000888,1,'2026-04-11','S7','S7_L2_011',7.33,9.2312,'red','flat',0,1),
+  (8890001650,1300000000888,1,'2026-04-12','S7','S7_L2_011',7.6685,9.2312,'red','up',0,1),
+  (8890001651,1300000000888,1,'2026-03-14','S7','S7_L2_012',8.1581,8.0008,'yellow','flat',0,1),
+  (8890001652,1300000000888,1,'2026-03-15','S7','S7_L2_012',8.173,8.0008,'yellow','flat',0,1),
+  (8890001653,1300000000888,1,'2026-03-16','S7','S7_L2_012',8.9298,8.0008,'red','up',0,1),
+  (8890001654,1300000000888,1,'2026-03-17','S7','S7_L2_012',8.7967,8.0008,'yellow','flat',0,1),
+  (8890001655,1300000000888,1,'2026-03-18','S7','S7_L2_012',8.6434,8.0008,'yellow','flat',0,1),
+  (8890001656,1300000000888,1,'2026-03-19','S7','S7_L2_012',8.7738,8.0008,'yellow','flat',0,1),
+  (8890001657,1300000000888,1,'2026-03-20','S7','S7_L2_012',8.7356,8.0008,'yellow','flat',0,1),
+  (8890001658,1300000000888,1,'2026-03-21','S7','S7_L2_012',8.4894,8.0008,'yellow','down',0,1),
+  (8890001659,1300000000888,1,'2026-03-22','S7','S7_L2_012',8.1612,8.0008,'yellow','down',0,1),
+  (8890001660,1300000000888,1,'2026-03-23','S7','S7_L2_012',8.8659,8.0008,'red','up',0,1),
+  (8890001661,1300000000888,1,'2026-03-24','S7','S7_L2_012',8.6516,8.0008,'yellow','down',0,1),
+  (8890001662,1300000000888,1,'2026-03-25','S7','S7_L2_012',8.1848,8.0008,'yellow','down',0,1),
+  (8890001663,1300000000888,1,'2026-03-26','S7','S7_L2_012',8.5737,8.0008,'yellow','up',0,1),
+  (8890001664,1300000000888,1,'2026-03-27','S7','S7_L2_012',8.4173,8.0008,'yellow','flat',0,1),
+  (8890001665,1300000000888,1,'2026-03-28','S7','S7_L2_012',8.5078,8.0008,'yellow','flat',0,1),
+  (8890001666,1300000000888,1,'2026-03-29','S7','S7_L2_012',8.4533,8.0008,'yellow','flat',0,1),
+  (8890001667,1300000000888,1,'2026-03-30','S7','S7_L2_012',8.6785,8.0008,'yellow','up',0,1),
+  (8890001668,1300000000888,1,'2026-03-31','S7','S7_L2_012',8.4839,8.0008,'yellow','down',0,1),
+  (8890001669,1300000000888,1,'2026-04-01','S7','S7_L2_012',8.2415,8.0008,'yellow','down',0,1),
+  (8890001670,1300000000888,1,'2026-04-02','S7','S7_L2_012',8.7097,8.0008,'yellow','up',0,1),
+  (8890001671,1300000000888,1,'2026-04-03','S7','S7_L2_012',8.6617,8.0008,'yellow','flat',0,1),
+  (8890001672,1300000000888,1,'2026-04-04','S7','S7_L2_012',8.1721,8.0008,'yellow','down',0,1),
+  (8890001673,1300000000888,1,'2026-04-05','S7','S7_L2_012',8.6421,8.0008,'yellow','up',0,1),
+  (8890001674,1300000000888,1,'2026-04-06','S7','S7_L2_012',8.7646,8.0008,'yellow','flat',0,1),
+  (8890001675,1300000000888,1,'2026-04-07','S7','S7_L2_012',8.4982,8.0008,'yellow','down',0,1),
+  (8890001676,1300000000888,1,'2026-04-08','S7','S7_L2_012',8.5854,8.0008,'yellow','flat',0,1),
+  (8890001677,1300000000888,1,'2026-04-09','S7','S7_L2_012',8.3415,8.0008,'yellow','down',0,1),
+  (8890001678,1300000000888,1,'2026-04-10','S7','S7_L2_012',8.0891,8.0008,'yellow','down',0,1),
+  (8890001679,1300000000888,1,'2026-04-11','S7','S7_L2_012',8.671,8.0008,'yellow','up',0,1),
+  (8890001680,1300000000888,1,'2026-04-12','S7','S7_L2_012',8.5148,8.0008,'yellow','flat',0,1),
+  (8890001681,1300000000888,1,'2026-03-14','S7','S7_L2_013',9.6564,8.5282,'red','flat',0,1),
+  (8890001682,1300000000888,1,'2026-03-15','S7','S7_L2_013',9.4664,8.5282,'red','flat',0,1),
+  (8890001683,1300000000888,1,'2026-03-16','S7','S7_L2_013',9.459,8.5282,'red','flat',0,1),
+  (8890001684,1300000000888,1,'2026-03-17','S7','S7_L2_013',9.5799,8.5282,'red','flat',0,1),
+  (8890001685,1300000000888,1,'2026-03-18','S7','S7_L2_013',9.5154,8.5282,'red','flat',0,1),
+  (8890001686,1300000000888,1,'2026-03-19','S7','S7_L2_013',9.7813,8.5282,'red','up',0,1),
+  (8890001687,1300000000888,1,'2026-03-20','S7','S7_L2_013',9.4123,8.5282,'red','down',0,1),
+  (8890001688,1300000000888,1,'2026-03-21','S7','S7_L2_013',9.1204,8.5282,'yellow','down',0,1),
+  (8890001689,1300000000888,1,'2026-03-22','S7','S7_L2_013',9.5747,8.5282,'red','up',0,1),
+  (8890001690,1300000000888,1,'2026-03-23','S7','S7_L2_013',9.1608,8.5282,'yellow','down',0,1),
+  (8890001691,1300000000888,1,'2026-03-24','S7','S7_L2_013',8.8088,8.5282,'yellow','down',0,1),
+  (8890001692,1300000000888,1,'2026-03-25','S7','S7_L2_013',9.2198,8.5282,'yellow','up',0,1),
+  (8890001693,1300000000888,1,'2026-03-26','S7','S7_L2_013',9.4081,8.5282,'red','up',0,1),
+  (8890001694,1300000000888,1,'2026-03-27','S7','S7_L2_013',9.3059,8.5282,'yellow','flat',0,1),
+  (8890001695,1300000000888,1,'2026-03-28','S7','S7_L2_013',9.094,8.5282,'yellow','down',0,1),
+  (8890001696,1300000000888,1,'2026-03-29','S7','S7_L2_013',9.4693,8.5282,'red','up',0,1),
+  (8890001697,1300000000888,1,'2026-03-30','S7','S7_L2_013',9.8814,8.5282,'red','up',0,1),
+  (8890001698,1300000000888,1,'2026-03-31','S7','S7_L2_013',9.7707,8.5282,'red','flat',0,1),
+  (8890001699,1300000000888,1,'2026-04-01','S7','S7_L2_013',9.5359,8.5282,'red','down',0,1),
+  (8890001700,1300000000888,1,'2026-04-02','S7','S7_L2_013',9.7969,8.5282,'red','up',0,1),
+  (8890001701,1300000000888,1,'2026-04-03','S7','S7_L2_013',9.4075,8.5282,'red','down',0,1),
+  (8890001702,1300000000888,1,'2026-04-04','S7','S7_L2_013',9.2812,8.5282,'yellow','flat',0,1),
+  (8890001703,1300000000888,1,'2026-04-05','S7','S7_L2_013',9.7275,8.5282,'red','up',0,1),
+  (8890001704,1300000000888,1,'2026-04-06','S7','S7_L2_013',9.2236,8.5282,'yellow','down',0,1),
+  (8890001705,1300000000888,1,'2026-04-07','S7','S7_L2_013',9.629,8.5282,'red','up',0,1),
+  (8890001706,1300000000888,1,'2026-04-08','S7','S7_L2_013',9.5262,8.5282,'red','flat',0,1),
+  (8890001707,1300000000888,1,'2026-04-09','S7','S7_L2_013',9.4298,8.5282,'red','flat',0,1),
+  (8890001708,1300000000888,1,'2026-04-10','S7','S7_L2_013',9.4025,8.5282,'red','flat',0,1),
+  (8890001709,1300000000888,1,'2026-04-11','S7','S7_L2_013',9.8588,8.5282,'red','up',0,1),
+  (8890001710,1300000000888,1,'2026-04-12','S7','S7_L2_013',9.0789,8.5282,'yellow','down',0,1),
+  (8890001711,1300000000888,1,'2026-03-14','S7','S7_L2_014',103.5301,97.2812,'green','flat',0,1),
+  (8890001712,1300000000888,1,'2026-03-15','S7','S7_L2_014',101.8122,97.2812,'green','flat',0,1),
+  (8890001713,1300000000888,1,'2026-03-16','S7','S7_L2_014',100.417,97.2812,'green','flat',0,1),
+  (8890001714,1300000000888,1,'2026-03-17','S7','S7_L2_014',102.8213,97.2812,'green','up',0,1),
+  (8890001715,1300000000888,1,'2026-03-18','S7','S7_L2_014',103.6743,97.2812,'green','flat',0,1),
+  (8890001716,1300000000888,1,'2026-03-19','S7','S7_L2_014',102.5166,97.2812,'green','flat',0,1),
+  (8890001717,1300000000888,1,'2026-03-20','S7','S7_L2_014',103.4563,97.2812,'green','flat',0,1),
+  (8890001718,1300000000888,1,'2026-03-21','S7','S7_L2_014',107.0605,97.2812,'green','up',0,1),
+  (8890001719,1300000000888,1,'2026-03-22','S7','S7_L2_014',100.8499,97.2812,'green','down',0,1),
+  (8890001720,1300000000888,1,'2026-03-23','S7','S7_L2_014',103.989,97.2812,'green','up',0,1),
+  (8890001721,1300000000888,1,'2026-03-24','S7','S7_L2_014',97.3446,97.2812,'green','down',0,1),
+  (8890001722,1300000000888,1,'2026-03-25','S7','S7_L2_014',104.1092,97.2812,'green','up',0,1),
+  (8890001723,1300000000888,1,'2026-03-26','S7','S7_L2_014',96.9492,97.2812,'yellow','down',0,1),
+  (8890001724,1300000000888,1,'2026-03-27','S7','S7_L2_014',104.6466,97.2812,'green','up',0,1),
+  (8890001725,1300000000888,1,'2026-03-28','S7','S7_L2_014',101.2373,97.2812,'green','down',0,1),
+  (8890001726,1300000000888,1,'2026-03-29','S7','S7_L2_014',103.207,97.2812,'green','flat',0,1),
+  (8890001727,1300000000888,1,'2026-03-30','S7','S7_L2_014',98.2169,97.2812,'green','down',0,1),
+  (8890001728,1300000000888,1,'2026-03-31','S7','S7_L2_014',102.7753,97.2812,'green','up',0,1),
+  (8890001729,1300000000888,1,'2026-04-01','S7','S7_L2_014',105.2401,97.2812,'green','up',0,1),
+  (8890001730,1300000000888,1,'2026-04-02','S7','S7_L2_014',104.6111,97.2812,'green','flat',0,1),
+  (8890001731,1300000000888,1,'2026-04-03','S7','S7_L2_014',102.6482,97.2812,'green','flat',0,1),
+  (8890001732,1300000000888,1,'2026-04-04','S7','S7_L2_014',102.6814,97.2812,'green','flat',0,1),
+  (8890001733,1300000000888,1,'2026-04-05','S7','S7_L2_014',106.2304,97.2812,'green','up',0,1),
+  (8890001734,1300000000888,1,'2026-04-06','S7','S7_L2_014',104.9689,97.2812,'green','flat',0,1),
+  (8890001735,1300000000888,1,'2026-04-07','S7','S7_L2_014',100.7764,97.2812,'green','down',0,1),
+  (8890001736,1300000000888,1,'2026-04-08','S7','S7_L2_014',100.9148,97.2812,'green','flat',0,1),
+  (8890001737,1300000000888,1,'2026-04-09','S7','S7_L2_014',100.6066,97.2812,'green','flat',0,1),
+  (8890001738,1300000000888,1,'2026-04-10','S7','S7_L2_014',102.5915,97.2812,'green','flat',0,1),
+  (8890001739,1300000000888,1,'2026-04-11','S7','S7_L2_014',99.1252,97.2812,'green','down',0,1),
+  (8890001740,1300000000888,1,'2026-04-12','S7','S7_L2_014',96.0513,97.2812,'yellow','down',0,1),
+  (8890001741,1300000000888,1,'2026-03-14','S7','S7_L2_015',6.6385,11.1221,'red','flat',0,1),
+  (8890001742,1300000000888,1,'2026-03-15','S7','S7_L2_015',6.733,11.1221,'red','flat',0,1),
+  (8890001743,1300000000888,1,'2026-03-16','S7','S7_L2_015',6.7197,11.1221,'red','flat',0,1),
+  (8890001744,1300000000888,1,'2026-03-17','S7','S7_L2_015',6.8998,11.1221,'red','up',0,1),
+  (8890001745,1300000000888,1,'2026-03-18','S7','S7_L2_015',6.4232,11.1221,'red','down',0,1),
+  (8890001746,1300000000888,1,'2026-03-19','S7','S7_L2_015',6.5794,11.1221,'red','up',0,1),
+  (8890001747,1300000000888,1,'2026-03-20','S7','S7_L2_015',6.3931,11.1221,'red','down',0,1),
+  (8890001748,1300000000888,1,'2026-03-21','S7','S7_L2_015',6.7316,11.1221,'red','up',0,1),
+  (8890001749,1300000000888,1,'2026-03-22','S7','S7_L2_015',6.6613,11.1221,'red','flat',0,1),
+  (8890001750,1300000000888,1,'2026-03-23','S7','S7_L2_015',6.5859,11.1221,'red','flat',0,1),
+  (8890001751,1300000000888,1,'2026-03-24','S7','S7_L2_015',6.6906,11.1221,'red','flat',0,1),
+  (8890001752,1300000000888,1,'2026-03-25','S7','S7_L2_015',6.5406,11.1221,'red','down',0,1),
+  (8890001753,1300000000888,1,'2026-03-26','S7','S7_L2_015',6.4774,11.1221,'red','flat',0,1),
+  (8890001754,1300000000888,1,'2026-03-27','S7','S7_L2_015',6.9991,11.1221,'red','up',0,1),
+  (8890001755,1300000000888,1,'2026-03-28','S7','S7_L2_015',6.8447,11.1221,'red','down',0,1),
+  (8890001756,1300000000888,1,'2026-03-29','S7','S7_L2_015',6.6454,11.1221,'red','down',0,1),
+  (8890001757,1300000000888,1,'2026-03-30','S7','S7_L2_015',6.3733,11.1221,'red','down',0,1),
+  (8890001758,1300000000888,1,'2026-03-31','S7','S7_L2_015',6.6393,11.1221,'red','up',0,1),
+  (8890001759,1300000000888,1,'2026-04-01','S7','S7_L2_015',6.7974,11.1221,'red','up',0,1),
+  (8890001760,1300000000888,1,'2026-04-02','S7','S7_L2_015',6.7164,11.1221,'red','flat',0,1),
+  (8890001761,1300000000888,1,'2026-04-03','S7','S7_L2_015',6.8846,11.1221,'red','up',0,1),
+  (8890001762,1300000000888,1,'2026-04-04','S7','S7_L2_015',6.9283,11.1221,'red','flat',0,1),
+  (8890001763,1300000000888,1,'2026-04-05','S7','S7_L2_015',6.6654,11.1221,'red','down',0,1),
+  (8890001764,1300000000888,1,'2026-04-06','S7','S7_L2_015',6.5885,11.1221,'red','flat',0,1),
+  (8890001765,1300000000888,1,'2026-04-07','S7','S7_L2_015',6.5832,11.1221,'red','flat',0,1),
+  (8890001766,1300000000888,1,'2026-04-08','S7','S7_L2_015',6.5994,11.1221,'red','flat',0,1),
+  (8890001767,1300000000888,1,'2026-04-09','S7','S7_L2_015',6.8636,11.1221,'red','up',0,1),
+  (8890001768,1300000000888,1,'2026-04-10','S7','S7_L2_015',6.5973,11.1221,'red','down',0,1),
+  (8890001769,1300000000888,1,'2026-04-11','S7','S7_L2_015',6.3454,11.1221,'red','down',0,1),
+  (8890001770,1300000000888,1,'2026-04-12','S7','S7_L2_015',6.7755,11.1221,'red','up',0,1),
+  (8890001771,1300000000888,1,'2026-03-14','S7','S7_L2_016',8.429,7.6122,'red','flat',0,1),
+  (8890001772,1300000000888,1,'2026-03-15','S7','S7_L2_016',8.3356,7.6122,'yellow','flat',0,1),
+  (8890001773,1300000000888,1,'2026-03-16','S7','S7_L2_016',7.9561,7.6122,'yellow','down',0,1),
+  (8890001774,1300000000888,1,'2026-03-17','S7','S7_L2_016',8.7509,7.6122,'red','up',0,1),
+  (8890001775,1300000000888,1,'2026-03-18','S7','S7_L2_016',8.6307,7.6122,'red','flat',0,1),
+  (8890001776,1300000000888,1,'2026-03-19','S7','S7_L2_016',8.1658,7.6122,'yellow','down',0,1),
+  (8890001777,1300000000888,1,'2026-03-20','S7','S7_L2_016',8.4926,7.6122,'red','up',0,1),
+  (8890001778,1300000000888,1,'2026-03-21','S7','S7_L2_016',8.1792,7.6122,'yellow','down',0,1),
+  (8890001779,1300000000888,1,'2026-03-22','S7','S7_L2_016',8.109,7.6122,'yellow','flat',0,1),
+  (8890001780,1300000000888,1,'2026-03-23','S7','S7_L2_016',7.9218,7.6122,'yellow','down',0,1),
+  (8890001781,1300000000888,1,'2026-03-24','S7','S7_L2_016',8.6518,7.6122,'red','up',0,1),
+  (8890001782,1300000000888,1,'2026-03-25','S7','S7_L2_016',8.6773,7.6122,'red','flat',0,1),
+  (8890001783,1300000000888,1,'2026-03-26','S7','S7_L2_016',8.3755,7.6122,'red','down',0,1),
+  (8890001784,1300000000888,1,'2026-03-27','S7','S7_L2_016',8.4389,7.6122,'red','flat',0,1),
+  (8890001785,1300000000888,1,'2026-03-28','S7','S7_L2_016',8.8992,7.6122,'red','up',0,1),
+  (8890001786,1300000000888,1,'2026-03-29','S7','S7_L2_016',8.2625,7.6122,'yellow','down',0,1),
+  (8890001787,1300000000888,1,'2026-03-30','S7','S7_L2_016',8.1536,7.6122,'yellow','flat',0,1),
+  (8890001788,1300000000888,1,'2026-03-31','S7','S7_L2_016',8.4864,7.6122,'red','up',0,1),
+  (8890001789,1300000000888,1,'2026-04-01','S7','S7_L2_016',8.5935,7.6122,'red','flat',0,1),
+  (8890001790,1300000000888,1,'2026-04-02','S7','S7_L2_016',8.3788,7.6122,'red','down',0,1),
+  (8890001791,1300000000888,1,'2026-04-03','S7','S7_L2_016',8.0924,7.6122,'yellow','down',0,1),
+  (8890001792,1300000000888,1,'2026-04-04','S7','S7_L2_016',8.2595,7.6122,'yellow','up',0,1),
+  (8890001793,1300000000888,1,'2026-04-05','S7','S7_L2_016',8.6278,7.6122,'red','up',0,1),
+  (8890001794,1300000000888,1,'2026-04-06','S7','S7_L2_016',8.6354,7.6122,'red','flat',0,1),
+  (8890001795,1300000000888,1,'2026-04-07','S7','S7_L2_016',8.0304,7.6122,'yellow','down',0,1),
+  (8890001796,1300000000888,1,'2026-04-08','S7','S7_L2_016',8.144,7.6122,'yellow','flat',0,1),
+  (8890001797,1300000000888,1,'2026-04-09','S7','S7_L2_016',8.2042,7.6122,'yellow','flat',0,1),
+  (8890001798,1300000000888,1,'2026-04-10','S7','S7_L2_016',8.4476,7.6122,'red','up',0,1),
+  (8890001799,1300000000888,1,'2026-04-11','S7','S7_L2_016',9.0138,7.6122,'red','up',0,1),
+  (8890001800,1300000000888,1,'2026-04-12','S7','S7_L2_016',8.3816,7.6122,'red','down',0,1);
+
+INSERT INTO `ado_s9_kpi_value_l3_day` (id, tenant_id, factory_id, biz_date, module_code, metric_code, metric_value, target_value, status_color, trend_flag, is_deleted, is_active) VALUES
+  (8900000001,1300000000888,1,'2026-03-14','S2','S2_L3_001',20.5963,19.4888,'yellow','flat',0,1),
+  (8900000002,1300000000888,1,'2026-03-15','S2','S2_L3_001',20.7248,19.4888,'yellow','flat',0,1),
+  (8900000003,1300000000888,1,'2026-03-16','S2','S2_L3_001',21.9732,19.4888,'red','up',0,1),
+  (8900000004,1300000000888,1,'2026-03-17','S2','S2_L3_001',20.782,19.4888,'yellow','down',0,1),
+  (8900000005,1300000000888,1,'2026-03-18','S2','S2_L3_001',22.1848,19.4888,'red','up',0,1),
+  (8900000006,1300000000888,1,'2026-03-19','S2','S2_L3_001',20.5116,19.4888,'yellow','down',0,1),
+  (8900000007,1300000000888,1,'2026-03-20','S2','S2_L3_001',21.0059,19.4888,'yellow','up',0,1),
+  (8900000008,1300000000888,1,'2026-03-21','S2','S2_L3_001',20.4812,19.4888,'yellow','down',0,1),
+  (8900000009,1300000000888,1,'2026-03-22','S2','S2_L3_001',20.3566,19.4888,'yellow','flat',0,1),
+  (8900000010,1300000000888,1,'2026-03-23','S2','S2_L3_001',20.8263,19.4888,'yellow','up',0,1),
+  (8900000011,1300000000888,1,'2026-03-24','S2','S2_L3_001',20.6111,19.4888,'yellow','flat',0,1),
+  (8900000012,1300000000888,1,'2026-03-25','S2','S2_L3_001',20.9136,19.4888,'yellow','flat',0,1),
+  (8900000013,1300000000888,1,'2026-03-26','S2','S2_L3_001',19.4746,19.4888,'green','down',0,1),
+  (8900000014,1300000000888,1,'2026-03-27','S2','S2_L3_001',22.0361,19.4888,'red','up',0,1),
+  (8900000015,1300000000888,1,'2026-03-28','S2','S2_L3_001',20.6832,19.4888,'yellow','down',0,1),
+  (8900000016,1300000000888,1,'2026-03-29','S2','S2_L3_001',21.8742,19.4888,'red','up',0,1),
+  (8900000017,1300000000888,1,'2026-03-30','S2','S2_L3_001',20.1592,19.4888,'yellow','down',0,1),
+  (8900000018,1300000000888,1,'2026-03-31','S2','S2_L3_001',20.9697,19.4888,'yellow','up',0,1),
+  (8900000019,1300000000888,1,'2026-04-01','S2','S2_L3_001',22.761,19.4888,'red','up',0,1),
+  (8900000020,1300000000888,1,'2026-04-02','S2','S2_L3_001',20.2449,19.4888,'yellow','down',0,1),
+  (8900000021,1300000000888,1,'2026-04-03','S2','S2_L3_001',19.8548,19.4888,'yellow','flat',0,1),
+  (8900000022,1300000000888,1,'2026-04-04','S2','S2_L3_001',20.4465,19.4888,'yellow','up',0,1),
+  (8900000023,1300000000888,1,'2026-04-05','S2','S2_L3_001',21.082,19.4888,'yellow','up',0,1),
+  (8900000024,1300000000888,1,'2026-04-06','S2','S2_L3_001',21.2197,19.4888,'yellow','flat',0,1),
+  (8900000025,1300000000888,1,'2026-04-07','S2','S2_L3_001',21.592,19.4888,'red','flat',0,1),
+  (8900000026,1300000000888,1,'2026-04-08','S2','S2_L3_001',20.627,19.4888,'yellow','down',0,1),
+  (8900000027,1300000000888,1,'2026-04-09','S2','S2_L3_001',19.7881,19.4888,'yellow','down',0,1),
+  (8900000028,1300000000888,1,'2026-04-10','S2','S2_L3_001',20.516,19.4888,'yellow','up',0,1),
+  (8900000029,1300000000888,1,'2026-04-11','S2','S2_L3_001',21.5607,19.4888,'red','up',0,1),
+  (8900000030,1300000000888,1,'2026-04-12','S2','S2_L3_001',21.0777,19.4888,'yellow','down',0,1),
+  (8900000031,1300000000888,1,'2026-03-14','S2','S2_L3_002',83.3982,106.2423,'red','flat',0,1),
+  (8900000032,1300000000888,1,'2026-03-15','S2','S2_L3_002',81.8781,106.2423,'red','flat',0,1),
+  (8900000033,1300000000888,1,'2026-03-16','S2','S2_L3_002',81.005,106.2423,'red','flat',0,1),
+  (8900000034,1300000000888,1,'2026-03-17','S2','S2_L3_002',83.701,106.2423,'red','up',0,1),
+  (8900000035,1300000000888,1,'2026-03-18','S2','S2_L3_002',87.0413,106.2423,'red','up',0,1),
+  (8900000036,1300000000888,1,'2026-03-19','S2','S2_L3_002',82.8727,106.2423,'red','down',0,1),
+  (8900000037,1300000000888,1,'2026-03-20','S2','S2_L3_002',81.5171,106.2423,'red','flat',0,1),
+  (8900000038,1300000000888,1,'2026-03-21','S2','S2_L3_002',81.3089,106.2423,'red','flat',0,1),
+  (8900000039,1300000000888,1,'2026-03-22','S2','S2_L3_002',82.6045,106.2423,'red','flat',0,1),
+  (8900000040,1300000000888,1,'2026-03-23','S2','S2_L3_002',79.6369,106.2423,'red','down',0,1),
+  (8900000041,1300000000888,1,'2026-03-24','S2','S2_L3_002',82.4666,106.2423,'red','up',0,1),
+  (8900000042,1300000000888,1,'2026-03-25','S2','S2_L3_002',82.9296,106.2423,'red','flat',0,1),
+  (8900000043,1300000000888,1,'2026-03-26','S2','S2_L3_002',87.3586,106.2423,'red','up',0,1),
+  (8900000044,1300000000888,1,'2026-03-27','S2','S2_L3_002',85.1207,106.2423,'red','down',0,1),
+  (8900000045,1300000000888,1,'2026-03-28','S2','S2_L3_002',85.3455,106.2423,'red','flat',0,1),
+  (8900000046,1300000000888,1,'2026-03-29','S2','S2_L3_002',81.0072,106.2423,'red','down',0,1),
+  (8900000047,1300000000888,1,'2026-03-30','S2','S2_L3_002',84.4413,106.2423,'red','up',0,1),
+  (8900000048,1300000000888,1,'2026-03-31','S2','S2_L3_002',79.9482,106.2423,'red','down',0,1),
+  (8900000049,1300000000888,1,'2026-04-01','S2','S2_L3_002',83.5524,106.2423,'red','up',0,1),
+  (8900000050,1300000000888,1,'2026-04-02','S2','S2_L3_002',83.8176,106.2423,'red','flat',0,1),
+  (8900000051,1300000000888,1,'2026-04-03','S2','S2_L3_002',80.8745,106.2423,'red','down',0,1),
+  (8900000052,1300000000888,1,'2026-04-04','S2','S2_L3_002',87.7428,106.2423,'red','up',0,1),
+  (8900000053,1300000000888,1,'2026-04-05','S2','S2_L3_002',84.1867,106.2423,'red','down',0,1),
+  (8900000054,1300000000888,1,'2026-04-06','S2','S2_L3_002',78.0526,106.2423,'red','down',0,1),
+  (8900000055,1300000000888,1,'2026-04-07','S2','S2_L3_002',84.1506,106.2423,'red','up',0,1),
+  (8900000056,1300000000888,1,'2026-04-08','S2','S2_L3_002',81.766,106.2423,'red','down',0,1),
+  (8900000057,1300000000888,1,'2026-04-09','S2','S2_L3_002',82.7811,106.2423,'red','flat',0,1),
+  (8900000058,1300000000888,1,'2026-04-10','S2','S2_L3_002',83.9343,106.2423,'red','flat',0,1),
+  (8900000059,1300000000888,1,'2026-04-11','S2','S2_L3_002',83.7475,106.2423,'red','flat',0,1),
+  (8900000060,1300000000888,1,'2026-04-12','S2','S2_L3_002',77.7138,106.2423,'red','down',0,1),
+  (8900000061,1300000000888,1,'2026-03-14','S2','S2_L3_003',60.7943,73.19,'red','flat',0,1),
+  (8900000062,1300000000888,1,'2026-03-15','S2','S2_L3_003',60.2228,73.19,'red','flat',0,1),
+  (8900000063,1300000000888,1,'2026-03-16','S2','S2_L3_003',60.2407,73.19,'red','flat',0,1),
+  (8900000064,1300000000888,1,'2026-03-17','S2','S2_L3_003',64.948,73.19,'red','up',0,1),
+  (8900000065,1300000000888,1,'2026-03-18','S2','S2_L3_003',61.3487,73.19,'red','down',0,1),
+  (8900000066,1300000000888,1,'2026-03-19','S2','S2_L3_003',60.1091,73.19,'red','down',0,1),
+  (8900000067,1300000000888,1,'2026-03-20','S2','S2_L3_003',60.9543,73.19,'red','flat',0,1),
+  (8900000068,1300000000888,1,'2026-03-21','S2','S2_L3_003',63.4088,73.19,'red','up',0,1),
+  (8900000069,1300000000888,1,'2026-03-22','S2','S2_L3_003',60.3777,73.19,'red','down',0,1),
+  (8900000070,1300000000888,1,'2026-03-23','S2','S2_L3_003',62.535,73.19,'red','up',0,1),
+  (8900000071,1300000000888,1,'2026-03-24','S2','S2_L3_003',62.99,73.19,'red','flat',0,1),
+  (8900000072,1300000000888,1,'2026-03-25','S2','S2_L3_003',63.0293,73.19,'red','flat',0,1),
+  (8900000073,1300000000888,1,'2026-03-26','S2','S2_L3_003',64.2324,73.19,'red','flat',0,1),
+  (8900000074,1300000000888,1,'2026-03-27','S2','S2_L3_003',60.6259,73.19,'red','down',0,1),
+  (8900000075,1300000000888,1,'2026-03-28','S2','S2_L3_003',63.7387,73.19,'red','up',0,1),
+  (8900000076,1300000000888,1,'2026-03-29','S2','S2_L3_003',60.1777,73.19,'red','down',0,1),
+  (8900000077,1300000000888,1,'2026-03-30','S2','S2_L3_003',60.9106,73.19,'red','flat',0,1),
+  (8900000078,1300000000888,1,'2026-03-31','S2','S2_L3_003',63.8558,73.19,'red','up',0,1),
+  (8900000079,1300000000888,1,'2026-04-01','S2','S2_L3_003',63.1647,73.19,'red','flat',0,1),
+  (8900000080,1300000000888,1,'2026-04-02','S2','S2_L3_003',61.6478,73.19,'red','down',0,1),
+  (8900000081,1300000000888,1,'2026-04-03','S2','S2_L3_003',59.4406,73.19,'red','down',0,1),
+  (8900000082,1300000000888,1,'2026-04-04','S2','S2_L3_003',62.6826,73.19,'red','up',0,1),
+  (8900000083,1300000000888,1,'2026-04-05','S2','S2_L3_003',60.4781,73.19,'red','down',0,1),
+  (8900000084,1300000000888,1,'2026-04-06','S2','S2_L3_003',59.9353,73.19,'red','flat',0,1),
+  (8900000085,1300000000888,1,'2026-04-07','S2','S2_L3_003',60.4453,73.19,'red','flat',0,1),
+  (8900000086,1300000000888,1,'2026-04-08','S2','S2_L3_003',62.0997,73.19,'red','up',0,1),
+  (8900000087,1300000000888,1,'2026-04-09','S2','S2_L3_003',57.7214,73.19,'red','down',0,1),
+  (8900000088,1300000000888,1,'2026-04-10','S2','S2_L3_003',62.3111,73.19,'red','up',0,1),
+  (8900000089,1300000000888,1,'2026-04-11','S2','S2_L3_003',61.9655,73.19,'red','flat',0,1),
+  (8900000090,1300000000888,1,'2026-04-12','S2','S2_L3_003',60.5629,73.19,'red','down',0,1),
+  (8900000091,1300000000888,1,'2026-03-14','S2','S2_L3_004',23.3386,20.5112,'red','flat',0,1),
+  (8900000092,1300000000888,1,'2026-03-15','S2','S2_L3_004',24.2769,20.5112,'red','up',0,1),
+  (8900000093,1300000000888,1,'2026-03-16','S2','S2_L3_004',23.1441,20.5112,'red','down',0,1),
+  (8900000094,1300000000888,1,'2026-03-17','S2','S2_L3_004',22.9684,20.5112,'red','flat',0,1),
+  (8900000095,1300000000888,1,'2026-03-18','S2','S2_L3_004',22.4844,20.5112,'yellow','down',0,1),
+  (8900000096,1300000000888,1,'2026-03-19','S2','S2_L3_004',23.6905,20.5112,'red','up',0,1),
+  (8900000097,1300000000888,1,'2026-03-20','S2','S2_L3_004',22.8035,20.5112,'red','down',0,1),
+  (8900000098,1300000000888,1,'2026-03-21','S2','S2_L3_004',23.452,20.5112,'red','up',0,1),
+  (8900000099,1300000000888,1,'2026-03-22','S2','S2_L3_004',21.8885,20.5112,'yellow','down',0,1),
+  (8900000100,1300000000888,1,'2026-03-23','S2','S2_L3_004',23.9392,20.5112,'red','up',0,1),
+  (8900000101,1300000000888,1,'2026-03-24','S2','S2_L3_004',22.2852,20.5112,'yellow','down',0,1),
+  (8900000102,1300000000888,1,'2026-03-25','S2','S2_L3_004',22.6714,20.5112,'red','flat',0,1),
+  (8900000103,1300000000888,1,'2026-03-26','S2','S2_L3_004',23.9499,20.5112,'red','up',0,1),
+  (8900000104,1300000000888,1,'2026-03-27','S2','S2_L3_004',22.2834,20.5112,'yellow','down',0,1),
+  (8900000105,1300000000888,1,'2026-03-28','S2','S2_L3_004',23.1574,20.5112,'red','up',0,1),
+  (8900000106,1300000000888,1,'2026-03-29','S2','S2_L3_004',23.2644,20.5112,'red','flat',0,1),
+  (8900000107,1300000000888,1,'2026-03-30','S2','S2_L3_004',22.5173,20.5112,'yellow','down',0,1),
+  (8900000108,1300000000888,1,'2026-03-31','S2','S2_L3_004',24.1479,20.5112,'red','up',0,1),
+  (8900000109,1300000000888,1,'2026-04-01','S2','S2_L3_004',24.2564,20.5112,'red','flat',0,1),
+  (8900000110,1300000000888,1,'2026-04-02','S2','S2_L3_004',21.8397,20.5112,'yellow','down',0,1),
+  (8900000111,1300000000888,1,'2026-04-03','S2','S2_L3_004',22.2037,20.5112,'yellow','flat',0,1),
+  (8900000112,1300000000888,1,'2026-04-04','S2','S2_L3_004',23.7755,20.5112,'red','up',0,1),
+  (8900000113,1300000000888,1,'2026-04-05','S2','S2_L3_004',22.3053,20.5112,'yellow','down',0,1),
+  (8900000114,1300000000888,1,'2026-04-06','S2','S2_L3_004',22.9421,20.5112,'red','up',0,1),
+  (8900000115,1300000000888,1,'2026-04-07','S2','S2_L3_004',23.3029,20.5112,'red','flat',0,1),
+  (8900000116,1300000000888,1,'2026-04-08','S2','S2_L3_004',23.6945,20.5112,'red','flat',0,1),
+  (8900000117,1300000000888,1,'2026-04-09','S2','S2_L3_004',23.0572,20.5112,'red','down',0,1),
+  (8900000118,1300000000888,1,'2026-04-10','S2','S2_L3_004',23.279,20.5112,'red','flat',0,1),
+  (8900000119,1300000000888,1,'2026-04-11','S2','S2_L3_004',22.6718,20.5112,'red','down',0,1),
+  (8900000120,1300000000888,1,'2026-04-12','S2','S2_L3_004',24.1127,20.5112,'red','up',0,1),
+  (8900000121,1300000000888,1,'2026-03-14','S2','S2_L3_005',92.6672,91.7577,'green','flat',0,1),
+  (8900000122,1300000000888,1,'2026-03-15','S2','S2_L3_005',92.4037,91.7577,'green','flat',0,1),
+  (8900000123,1300000000888,1,'2026-03-16','S2','S2_L3_005',87.7144,91.7577,'yellow','down',0,1),
+  (8900000124,1300000000888,1,'2026-03-17','S2','S2_L3_005',84.8563,91.7577,'red','down',0,1),
+  (8900000125,1300000000888,1,'2026-03-18','S2','S2_L3_005',84.9551,91.7577,'red','flat',0,1),
+  (8900000126,1300000000888,1,'2026-03-19','S2','S2_L3_005',88.3175,91.7577,'yellow','up',0,1),
+  (8900000127,1300000000888,1,'2026-03-20','S2','S2_L3_005',84.8332,91.7577,'red','down',0,1),
+  (8900000128,1300000000888,1,'2026-03-21','S2','S2_L3_005',87.1328,91.7577,'red','up',0,1),
+  (8900000129,1300000000888,1,'2026-03-22','S2','S2_L3_005',90.0709,91.7577,'yellow','up',0,1),
+  (8900000130,1300000000888,1,'2026-03-23','S2','S2_L3_005',83.2794,91.7577,'red','down',0,1),
+  (8900000131,1300000000888,1,'2026-03-24','S2','S2_L3_005',92.4706,91.7577,'green','up',0,1),
+  (8900000132,1300000000888,1,'2026-03-25','S2','S2_L3_005',91.3219,91.7577,'yellow','flat',0,1),
+  (8900000133,1300000000888,1,'2026-03-26','S2','S2_L3_005',83.9853,91.7577,'red','down',0,1),
+  (8900000134,1300000000888,1,'2026-03-27','S2','S2_L3_005',83.5233,91.7577,'red','flat',0,1),
+  (8900000135,1300000000888,1,'2026-03-28','S2','S2_L3_005',86.4807,91.7577,'red','up',0,1),
+  (8900000136,1300000000888,1,'2026-03-29','S2','S2_L3_005',84.5241,91.7577,'red','down',0,1),
+  (8900000137,1300000000888,1,'2026-03-30','S2','S2_L3_005',86.5322,91.7577,'red','up',0,1),
+  (8900000138,1300000000888,1,'2026-03-31','S2','S2_L3_005',80.4682,91.7577,'red','down',0,1),
+  (8900000139,1300000000888,1,'2026-04-01','S2','S2_L3_005',86.6239,91.7577,'red','up',0,1),
+  (8900000140,1300000000888,1,'2026-04-02','S2','S2_L3_005',91.9398,91.7577,'green','up',0,1),
+  (8900000141,1300000000888,1,'2026-04-03','S2','S2_L3_005',84.3005,91.7577,'red','down',0,1),
+  (8900000142,1300000000888,1,'2026-04-04','S2','S2_L3_005',86.5078,91.7577,'red','up',0,1),
+  (8900000143,1300000000888,1,'2026-04-05','S2','S2_L3_005',83.3245,91.7577,'red','down',0,1),
+  (8900000144,1300000000888,1,'2026-04-06','S2','S2_L3_005',88.8924,91.7577,'yellow','up',0,1),
+  (8900000145,1300000000888,1,'2026-04-07','S2','S2_L3_005',86.6327,91.7577,'red','down',0,1),
+  (8900000146,1300000000888,1,'2026-04-08','S2','S2_L3_005',92.3006,91.7577,'green','up',0,1),
+  (8900000147,1300000000888,1,'2026-04-09','S2','S2_L3_005',87.7635,91.7577,'yellow','down',0,1),
+  (8900000148,1300000000888,1,'2026-04-10','S2','S2_L3_005',86.2484,91.7577,'red','flat',0,1),
+  (8900000149,1300000000888,1,'2026-04-11','S2','S2_L3_005',88.6622,91.7577,'yellow','up',0,1),
+  (8900000150,1300000000888,1,'2026-04-12','S2','S2_L3_005',85.8977,91.7577,'red','down',0,1),
+  (8900000151,1300000000888,1,'2026-03-14','S2','S2_L3_006',257.9546,261.87,'yellow','flat',0,1),
+  (8900000152,1300000000888,1,'2026-03-15','S2','S2_L3_006',244.0378,261.87,'red','down',0,1),
+  (8900000153,1300000000888,1,'2026-03-16','S2','S2_L3_006',243.1278,261.87,'red','flat',0,1),
+  (8900000154,1300000000888,1,'2026-03-17','S2','S2_L3_006',252.6472,261.87,'yellow','up',0,1),
+  (8900000155,1300000000888,1,'2026-03-18','S2','S2_L3_006',252.0765,261.87,'yellow','flat',0,1),
+  (8900000156,1300000000888,1,'2026-03-19','S2','S2_L3_006',253.3374,261.87,'yellow','flat',0,1),
+  (8900000157,1300000000888,1,'2026-03-20','S2','S2_L3_006',259.0999,261.87,'yellow','up',0,1),
+  (8900000158,1300000000888,1,'2026-03-21','S2','S2_L3_006',247.9886,261.87,'red','down',0,1),
+  (8900000159,1300000000888,1,'2026-03-22','S2','S2_L3_006',254.4329,261.87,'yellow','up',0,1),
+  (8900000160,1300000000888,1,'2026-03-23','S2','S2_L3_006',244.2424,261.87,'red','down',0,1),
+  (8900000161,1300000000888,1,'2026-03-24','S2','S2_L3_006',260.5811,261.87,'yellow','up',0,1),
+  (8900000162,1300000000888,1,'2026-03-25','S2','S2_L3_006',255.8601,261.87,'yellow','flat',0,1),
+  (8900000163,1300000000888,1,'2026-03-26','S2','S2_L3_006',255.1374,261.87,'yellow','flat',0,1),
+  (8900000164,1300000000888,1,'2026-03-27','S2','S2_L3_006',252.5112,261.87,'yellow','flat',0,1),
+  (8900000165,1300000000888,1,'2026-03-28','S2','S2_L3_006',245.1781,261.87,'red','down',0,1),
+  (8900000166,1300000000888,1,'2026-03-29','S2','S2_L3_006',248.6299,261.87,'red','flat',0,1),
+  (8900000167,1300000000888,1,'2026-03-30','S2','S2_L3_006',254.8757,261.87,'yellow','up',0,1),
+  (8900000168,1300000000888,1,'2026-03-31','S2','S2_L3_006',250.9514,261.87,'yellow','flat',0,1),
+  (8900000169,1300000000888,1,'2026-04-01','S2','S2_L3_006',252.0281,261.87,'yellow','flat',0,1),
+  (8900000170,1300000000888,1,'2026-04-02','S2','S2_L3_006',240.8525,261.87,'red','down',0,1),
+  (8900000171,1300000000888,1,'2026-04-03','S2','S2_L3_006',252.4601,261.87,'yellow','up',0,1),
+  (8900000172,1300000000888,1,'2026-04-04','S2','S2_L3_006',245.8837,261.87,'red','down',0,1),
+  (8900000173,1300000000888,1,'2026-04-05','S2','S2_L3_006',242.9353,261.87,'red','flat',0,1),
+  (8900000174,1300000000888,1,'2026-04-06','S2','S2_L3_006',249.9307,261.87,'yellow','up',0,1),
+  (8900000175,1300000000888,1,'2026-04-07','S2','S2_L3_006',237.1111,261.87,'red','down',0,1),
+  (8900000176,1300000000888,1,'2026-04-08','S2','S2_L3_006',256.3581,261.87,'yellow','up',0,1),
+  (8900000177,1300000000888,1,'2026-04-09','S2','S2_L3_006',257.514,261.87,'yellow','flat',0,1),
+  (8900000178,1300000000888,1,'2026-04-10','S2','S2_L3_006',250.6934,261.87,'yellow','down',0,1),
+  (8900000179,1300000000888,1,'2026-04-11','S2','S2_L3_006',243.6099,261.87,'red','down',0,1),
+  (8900000180,1300000000888,1,'2026-04-12','S2','S2_L3_006',243.9746,261.87,'red','flat',0,1),
+  (8900000181,1300000000888,1,'2026-03-14','S4','S4_L3_001',2.9446,3.04,'green','flat',0,1),
+  (8900000182,1300000000888,1,'2026-03-15','S4','S4_L3_001',2.9857,3.04,'green','flat',0,1),
+  (8900000183,1300000000888,1,'2026-03-16','S4','S4_L3_001',2.9372,3.04,'green','flat',0,1),
+  (8900000184,1300000000888,1,'2026-03-17','S4','S4_L3_001',3.0495,3.04,'yellow','up',0,1),
+  (8900000185,1300000000888,1,'2026-03-18','S4','S4_L3_001',2.8987,3.04,'green','down',0,1),
+  (8900000186,1300000000888,1,'2026-03-19','S4','S4_L3_001',2.8287,3.04,'green','down',0,1),
+  (8900000187,1300000000888,1,'2026-03-20','S4','S4_L3_001',2.9175,3.04,'green','up',0,1),
+  (8900000188,1300000000888,1,'2026-03-21','S4','S4_L3_001',3.1044,3.04,'yellow','up',0,1),
+  (8900000189,1300000000888,1,'2026-03-22','S4','S4_L3_001',2.9324,3.04,'green','down',0,1),
+  (8900000190,1300000000888,1,'2026-03-23','S4','S4_L3_001',3.1932,3.04,'yellow','up',0,1),
+  (8900000191,1300000000888,1,'2026-03-24','S4','S4_L3_001',3.0277,3.04,'green','down',0,1),
+  (8900000192,1300000000888,1,'2026-03-25','S4','S4_L3_001',2.8795,3.04,'green','down',0,1),
+  (8900000193,1300000000888,1,'2026-03-26','S4','S4_L3_001',2.909,3.04,'green','flat',0,1),
+  (8900000194,1300000000888,1,'2026-03-27','S4','S4_L3_001',3.0055,3.04,'green','up',0,1),
+  (8900000195,1300000000888,1,'2026-03-28','S4','S4_L3_001',2.8783,3.04,'green','down',0,1),
+  (8900000196,1300000000888,1,'2026-03-29','S4','S4_L3_001',3.1963,3.04,'yellow','up',0,1),
+  (8900000197,1300000000888,1,'2026-03-30','S4','S4_L3_001',2.895,3.04,'green','down',0,1),
+  (8900000198,1300000000888,1,'2026-03-31','S4','S4_L3_001',3.0447,3.04,'yellow','up',0,1),
+  (8900000199,1300000000888,1,'2026-04-01','S4','S4_L3_001',3.1144,3.04,'yellow','up',0,1),
+  (8900000200,1300000000888,1,'2026-04-02','S4','S4_L3_001',2.9739,3.04,'green','down',0,1),
+  (8900000201,1300000000888,1,'2026-04-03','S4','S4_L3_001',2.8946,3.04,'green','down',0,1),
+  (8900000202,1300000000888,1,'2026-04-04','S4','S4_L3_001',2.9593,3.04,'green','up',0,1),
+  (8900000203,1300000000888,1,'2026-04-05','S4','S4_L3_001',3.0161,3.04,'green','flat',0,1),
+  (8900000204,1300000000888,1,'2026-04-06','S4','S4_L3_001',3.0621,3.04,'yellow','flat',0,1),
+  (8900000205,1300000000888,1,'2026-04-07','S4','S4_L3_001',2.9888,3.04,'green','down',0,1),
+  (8900000206,1300000000888,1,'2026-04-08','S4','S4_L3_001',2.8584,3.04,'green','down',0,1),
+  (8900000207,1300000000888,1,'2026-04-09','S4','S4_L3_001',2.9875,3.04,'green','up',0,1),
+  (8900000208,1300000000888,1,'2026-04-10','S4','S4_L3_001',2.9234,3.04,'green','down',0,1),
+  (8900000209,1300000000888,1,'2026-04-11','S4','S4_L3_001',2.7883,3.04,'green','down',0,1),
+  (8900000210,1300000000888,1,'2026-04-12','S4','S4_L3_001',2.9213,3.04,'green','up',0,1),
+  (8900000211,1300000000888,1,'2026-03-14','S4','S4_L3_002',100.345,99.0,'green','flat',0,1),
+  (8900000212,1300000000888,1,'2026-03-15','S4','S4_L3_002',97.7924,99.0,'yellow','down',0,1),
+  (8900000213,1300000000888,1,'2026-03-16','S4','S4_L3_002',92.0432,99.0,'red','down',0,1),
+  (8900000214,1300000000888,1,'2026-03-17','S4','S4_L3_002',93.8464,99.0,'red','flat',0,1),
+  (8900000215,1300000000888,1,'2026-03-18','S4','S4_L3_002',99.2056,99.0,'green','up',0,1),
+  (8900000216,1300000000888,1,'2026-03-19','S4','S4_L3_002',94.7719,99.0,'yellow','down',0,1),
+  (8900000217,1300000000888,1,'2026-03-20','S4','S4_L3_002',93.8271,99.0,'red','flat',0,1),
+  (8900000218,1300000000888,1,'2026-03-21','S4','S4_L3_002',96.478,99.0,'yellow','up',0,1),
+  (8900000219,1300000000888,1,'2026-03-22','S4','S4_L3_002',96.485,99.0,'yellow','flat',0,1),
+  (8900000220,1300000000888,1,'2026-03-23','S4','S4_L3_002',94.0555,99.0,'yellow','down',0,1),
+  (8900000221,1300000000888,1,'2026-03-24','S4','S4_L3_002',96.0509,99.0,'yellow','up',0,1),
+  (8900000222,1300000000888,1,'2026-03-25','S4','S4_L3_002',95.6076,99.0,'yellow','flat',0,1),
+  (8900000223,1300000000888,1,'2026-03-26','S4','S4_L3_002',89.4631,99.0,'red','down',0,1),
+  (8900000224,1300000000888,1,'2026-03-27','S4','S4_L3_002',98.4628,99.0,'yellow','up',0,1),
+  (8900000225,1300000000888,1,'2026-03-28','S4','S4_L3_002',94.6389,99.0,'yellow','down',0,1),
+  (8900000226,1300000000888,1,'2026-03-29','S4','S4_L3_002',100.7959,99.0,'green','up',0,1),
+  (8900000227,1300000000888,1,'2026-03-30','S4','S4_L3_002',93.6531,99.0,'red','down',0,1),
+  (8900000228,1300000000888,1,'2026-03-31','S4','S4_L3_002',92.4034,99.0,'red','flat',0,1),
+  (8900000229,1300000000888,1,'2026-04-01','S4','S4_L3_002',100.456,99.0,'green','up',0,1),
+  (8900000230,1300000000888,1,'2026-04-02','S4','S4_L3_002',92.3875,99.0,'red','down',0,1),
+  (8900000231,1300000000888,1,'2026-04-03','S4','S4_L3_002',95.1487,99.0,'yellow','up',0,1),
+  (8900000232,1300000000888,1,'2026-04-04','S4','S4_L3_002',98.7382,99.0,'yellow','up',0,1),
+  (8900000233,1300000000888,1,'2026-04-05','S4','S4_L3_002',96.0407,99.0,'yellow','down',0,1),
+  (8900000234,1300000000888,1,'2026-04-06','S4','S4_L3_002',92.1826,99.0,'red','down',0,1),
+  (8900000235,1300000000888,1,'2026-04-07','S4','S4_L3_002',97.5472,99.0,'yellow','up',0,1),
+  (8900000236,1300000000888,1,'2026-04-08','S4','S4_L3_002',96.4345,99.0,'yellow','flat',0,1),
+  (8900000237,1300000000888,1,'2026-04-09','S4','S4_L3_002',100.736,99.0,'green','up',0,1),
+  (8900000238,1300000000888,1,'2026-04-10','S4','S4_L3_002',98.713,99.0,'yellow','down',0,1),
+  (8900000239,1300000000888,1,'2026-04-11','S4','S4_L3_002',105.8339,99.0,'green','up',0,1),
+  (8900000240,1300000000888,1,'2026-04-12','S4','S4_L3_002',92.2104,99.0,'red','down',0,1),
+  (8900000241,1300000000888,1,'2026-03-14','S4','S4_L3_003',120.3799,142.55,'red','flat',0,1),
+  (8900000242,1300000000888,1,'2026-03-15','S4','S4_L3_003',119.8465,142.55,'red','flat',0,1),
+  (8900000243,1300000000888,1,'2026-03-16','S4','S4_L3_003',121.1592,142.55,'red','flat',0,1),
+  (8900000244,1300000000888,1,'2026-03-17','S4','S4_L3_003',118.4287,142.55,'red','down',0,1),
+  (8900000245,1300000000888,1,'2026-03-18','S4','S4_L3_003',119.9314,142.55,'red','flat',0,1),
+  (8900000246,1300000000888,1,'2026-03-19','S4','S4_L3_003',117.7951,142.55,'red','flat',0,1),
+  (8900000247,1300000000888,1,'2026-03-20','S4','S4_L3_003',118.2009,142.55,'red','flat',0,1),
+  (8900000248,1300000000888,1,'2026-03-21','S4','S4_L3_003',117.9692,142.55,'red','flat',0,1),
+  (8900000249,1300000000888,1,'2026-03-22','S4','S4_L3_003',121.825,142.55,'red','up',0,1),
+  (8900000250,1300000000888,1,'2026-03-23','S4','S4_L3_003',121.2216,142.55,'red','flat',0,1),
+  (8900000251,1300000000888,1,'2026-03-24','S4','S4_L3_003',119.2064,142.55,'red','flat',0,1),
+  (8900000252,1300000000888,1,'2026-03-25','S4','S4_L3_003',125.5357,142.55,'red','up',0,1),
+  (8900000253,1300000000888,1,'2026-03-26','S4','S4_L3_003',123.5815,142.55,'red','flat',0,1),
+  (8900000254,1300000000888,1,'2026-03-27','S4','S4_L3_003',122.1562,142.55,'red','flat',0,1),
+  (8900000255,1300000000888,1,'2026-03-28','S4','S4_L3_003',122.0374,142.55,'red','flat',0,1),
+  (8900000256,1300000000888,1,'2026-03-29','S4','S4_L3_003',129.674,142.55,'red','up',0,1),
+  (8900000257,1300000000888,1,'2026-03-30','S4','S4_L3_003',124.6504,142.55,'red','down',0,1),
+  (8900000258,1300000000888,1,'2026-03-31','S4','S4_L3_003',125.525,142.55,'red','flat',0,1),
+  (8900000259,1300000000888,1,'2026-04-01','S4','S4_L3_003',114.1586,142.55,'red','down',0,1),
+  (8900000260,1300000000888,1,'2026-04-02','S4','S4_L3_003',121.3328,142.55,'red','up',0,1),
+  (8900000261,1300000000888,1,'2026-04-03','S4','S4_L3_003',115.6995,142.55,'red','down',0,1),
+  (8900000262,1300000000888,1,'2026-04-04','S4','S4_L3_003',122.1776,142.55,'red','up',0,1),
+  (8900000263,1300000000888,1,'2026-04-05','S4','S4_L3_003',125.146,142.55,'red','up',0,1),
+  (8900000264,1300000000888,1,'2026-04-06','S4','S4_L3_003',121.2565,142.55,'red','down',0,1),
+  (8900000265,1300000000888,1,'2026-04-07','S4','S4_L3_003',125.6855,142.55,'red','up',0,1),
+  (8900000266,1300000000888,1,'2026-04-08','S4','S4_L3_003',119.9627,142.55,'red','down',0,1),
+  (8900000267,1300000000888,1,'2026-04-09','S4','S4_L3_003',125.8978,142.55,'red','up',0,1),
+  (8900000268,1300000000888,1,'2026-04-10','S4','S4_L3_003',117.9918,142.55,'red','down',0,1),
+  (8900000269,1300000000888,1,'2026-04-11','S4','S4_L3_003',122.7884,142.55,'red','up',0,1),
+  (8900000270,1300000000888,1,'2026-04-12','S4','S4_L3_003',125.3187,142.55,'red','up',0,1),
+  (8900000271,1300000000888,1,'2026-03-14','S4','S4_L3_004',28.1583,30.0,'green','flat',0,1),
+  (8900000272,1300000000888,1,'2026-03-15','S4','S4_L3_004',28.3985,30.0,'green','flat',0,1),
+  (8900000273,1300000000888,1,'2026-03-16','S4','S4_L3_004',28.5345,30.0,'green','flat',0,1),
+  (8900000274,1300000000888,1,'2026-03-17','S4','S4_L3_004',27.2449,30.0,'green','down',0,1),
+  (8900000275,1300000000888,1,'2026-03-18','S4','S4_L3_004',27.3729,30.0,'green','flat',0,1),
+  (8900000276,1300000000888,1,'2026-03-19','S4','S4_L3_004',26.9728,30.0,'green','flat',0,1),
+  (8900000277,1300000000888,1,'2026-03-20','S4','S4_L3_004',27.857,30.0,'green','up',0,1),
+  (8900000278,1300000000888,1,'2026-03-21','S4','S4_L3_004',27.9,30.0,'green','flat',0,1),
+  (8900000279,1300000000888,1,'2026-03-22','S4','S4_L3_004',28.1438,30.0,'green','flat',0,1),
+  (8900000280,1300000000888,1,'2026-03-23','S4','S4_L3_004',27.3891,30.0,'green','down',0,1),
+  (8900000281,1300000000888,1,'2026-03-24','S4','S4_L3_004',28.7615,30.0,'green','up',0,1),
+  (8900000282,1300000000888,1,'2026-03-25','S4','S4_L3_004',28.7704,30.0,'green','flat',0,1),
+  (8900000283,1300000000888,1,'2026-03-26','S4','S4_L3_004',29.2991,30.0,'green','flat',0,1),
+  (8900000284,1300000000888,1,'2026-03-27','S4','S4_L3_004',28.5975,30.0,'green','down',0,1),
+  (8900000285,1300000000888,1,'2026-03-28','S4','S4_L3_004',28.1558,30.0,'green','flat',0,1),
+  (8900000286,1300000000888,1,'2026-03-29','S4','S4_L3_004',28.5648,30.0,'green','flat',0,1),
+  (8900000287,1300000000888,1,'2026-03-30','S4','S4_L3_004',28.5122,30.0,'green','flat',0,1),
+  (8900000288,1300000000888,1,'2026-03-31','S4','S4_L3_004',27.4525,30.0,'green','down',0,1),
+  (8900000289,1300000000888,1,'2026-04-01','S4','S4_L3_004',29.0831,30.0,'green','up',0,1),
+  (8900000290,1300000000888,1,'2026-04-02','S4','S4_L3_004',29.4436,30.0,'green','flat',0,1),
+  (8900000291,1300000000888,1,'2026-04-03','S4','S4_L3_004',29.6606,30.0,'green','flat',0,1),
+  (8900000292,1300000000888,1,'2026-04-04','S4','S4_L3_004',28.0296,30.0,'green','down',0,1),
+  (8900000293,1300000000888,1,'2026-04-05','S4','S4_L3_004',28.2724,30.0,'green','flat',0,1),
+  (8900000294,1300000000888,1,'2026-04-06','S4','S4_L3_004',28.3497,30.0,'green','flat',0,1),
+  (8900000295,1300000000888,1,'2026-04-07','S4','S4_L3_004',27.9979,30.0,'green','flat',0,1),
+  (8900000296,1300000000888,1,'2026-04-08','S4','S4_L3_004',28.5202,30.0,'green','flat',0,1),
+  (8900000297,1300000000888,1,'2026-04-09','S4','S4_L3_004',27.8982,30.0,'green','down',0,1),
+  (8900000298,1300000000888,1,'2026-04-10','S4','S4_L3_004',27.8372,30.0,'green','flat',0,1),
+  (8900000299,1300000000888,1,'2026-04-11','S4','S4_L3_004',29.4775,30.0,'green','up',0,1),
+  (8900000300,1300000000888,1,'2026-04-12','S4','S4_L3_004',28.1384,30.0,'green','down',0,1),
+  (8900000301,1300000000888,1,'2026-03-14','S6','S6_L3_001',7.1246,7.19,'green','flat',0,1),
+  (8900000302,1300000000888,1,'2026-03-15','S6','S6_L3_001',6.7743,7.19,'green','down',0,1),
+  (8900000303,1300000000888,1,'2026-03-16','S6','S6_L3_001',6.7913,7.19,'green','flat',0,1),
+  (8900000304,1300000000888,1,'2026-03-17','S6','S6_L3_001',6.883,7.19,'green','flat',0,1),
+  (8900000305,1300000000888,1,'2026-03-18','S6','S6_L3_001',6.9713,7.19,'green','flat',0,1),
+  (8900000306,1300000000888,1,'2026-03-19','S6','S6_L3_001',7.1173,7.19,'green','up',0,1),
+  (8900000307,1300000000888,1,'2026-03-20','S6','S6_L3_001',6.834,7.19,'green','down',0,1),
+  (8900000308,1300000000888,1,'2026-03-21','S6','S6_L3_001',7.2709,7.19,'yellow','up',0,1),
+  (8900000309,1300000000888,1,'2026-03-22','S6','S6_L3_001',7.0237,7.19,'green','down',0,1),
+  (8900000310,1300000000888,1,'2026-03-23','S6','S6_L3_001',6.5988,7.19,'green','down',0,1),
+  (8900000311,1300000000888,1,'2026-03-24','S6','S6_L3_001',6.9228,7.19,'green','up',0,1),
+  (8900000312,1300000000888,1,'2026-03-25','S6','S6_L3_001',6.4782,7.19,'green','down',0,1),
+  (8900000313,1300000000888,1,'2026-03-26','S6','S6_L3_001',6.8645,7.19,'green','up',0,1),
+  (8900000314,1300000000888,1,'2026-03-27','S6','S6_L3_001',6.9072,7.19,'green','flat',0,1),
+  (8900000315,1300000000888,1,'2026-03-28','S6','S6_L3_001',6.8943,7.19,'green','flat',0,1),
+  (8900000316,1300000000888,1,'2026-03-29','S6','S6_L3_001',6.9544,7.19,'green','flat',0,1),
+  (8900000317,1300000000888,1,'2026-03-30','S6','S6_L3_001',6.9399,7.19,'green','flat',0,1),
+  (8900000318,1300000000888,1,'2026-03-31','S6','S6_L3_001',6.8978,7.19,'green','flat',0,1),
+  (8900000319,1300000000888,1,'2026-04-01','S6','S6_L3_001',7.3395,7.19,'yellow','up',0,1),
+  (8900000320,1300000000888,1,'2026-04-02','S6','S6_L3_001',7.2789,7.19,'yellow','flat',0,1),
+  (8900000321,1300000000888,1,'2026-04-03','S6','S6_L3_001',6.7823,7.19,'green','down',0,1),
+  (8900000322,1300000000888,1,'2026-04-04','S6','S6_L3_001',7.2871,7.19,'yellow','up',0,1),
+  (8900000323,1300000000888,1,'2026-04-05','S6','S6_L3_001',6.6813,7.19,'green','down',0,1),
+  (8900000324,1300000000888,1,'2026-04-06','S6','S6_L3_001',6.8513,7.19,'green','up',0,1),
+  (8900000325,1300000000888,1,'2026-04-07','S6','S6_L3_001',7.3442,7.19,'yellow','up',0,1),
+  (8900000326,1300000000888,1,'2026-04-08','S6','S6_L3_001',6.5511,7.19,'green','down',0,1),
+  (8900000327,1300000000888,1,'2026-04-09','S6','S6_L3_001',7.144,7.19,'green','up',0,1),
+  (8900000328,1300000000888,1,'2026-04-10','S6','S6_L3_001',6.7588,7.19,'green','down',0,1),
+  (8900000329,1300000000888,1,'2026-04-11','S6','S6_L3_001',6.9926,7.19,'green','up',0,1),
+  (8900000330,1300000000888,1,'2026-04-12','S6','S6_L3_001',6.9849,7.19,'green','flat',0,1),
+  (8900000331,1300000000888,1,'2026-03-14','S6','S6_L3_002',94.6304,105.3865,'red','flat',0,1),
+  (8900000332,1300000000888,1,'2026-03-15','S6','S6_L3_002',87.3544,105.3865,'red','down',0,1),
+  (8900000333,1300000000888,1,'2026-03-16','S6','S6_L3_002',86.7773,105.3865,'red','flat',0,1),
+  (8900000334,1300000000888,1,'2026-03-17','S6','S6_L3_002',88.2933,105.3865,'red','flat',0,1),
+  (8900000335,1300000000888,1,'2026-03-18','S6','S6_L3_002',89.2005,105.3865,'red','flat',0,1),
+  (8900000336,1300000000888,1,'2026-03-19','S6','S6_L3_002',87.192,105.3865,'red','down',0,1),
+  (8900000337,1300000000888,1,'2026-03-20','S6','S6_L3_002',90.3216,105.3865,'red','up',0,1),
+  (8900000338,1300000000888,1,'2026-03-21','S6','S6_L3_002',90.2733,105.3865,'red','flat',0,1),
+  (8900000339,1300000000888,1,'2026-03-22','S6','S6_L3_002',87.7115,105.3865,'red','down',0,1),
+  (8900000340,1300000000888,1,'2026-03-23','S6','S6_L3_002',94.2304,105.3865,'red','up',0,1),
+  (8900000341,1300000000888,1,'2026-03-24','S6','S6_L3_002',86.1519,105.3865,'red','down',0,1),
+  (8900000342,1300000000888,1,'2026-03-25','S6','S6_L3_002',86.463,105.3865,'red','flat',0,1),
+  (8900000343,1300000000888,1,'2026-03-26','S6','S6_L3_002',90.9211,105.3865,'red','up',0,1),
+  (8900000344,1300000000888,1,'2026-03-27','S6','S6_L3_002',89.347,105.3865,'red','flat',0,1),
+  (8900000345,1300000000888,1,'2026-03-28','S6','S6_L3_002',91.0333,105.3865,'red','flat',0,1),
+  (8900000346,1300000000888,1,'2026-03-29','S6','S6_L3_002',88.2371,105.3865,'red','down',0,1),
+  (8900000347,1300000000888,1,'2026-03-30','S6','S6_L3_002',87.1195,105.3865,'red','flat',0,1),
+  (8900000348,1300000000888,1,'2026-03-31','S6','S6_L3_002',88.1654,105.3865,'red','flat',0,1),
+  (8900000349,1300000000888,1,'2026-04-01','S6','S6_L3_002',88.0628,105.3865,'red','flat',0,1),
+  (8900000350,1300000000888,1,'2026-04-02','S6','S6_L3_002',91.3226,105.3865,'red','up',0,1),
+  (8900000351,1300000000888,1,'2026-04-03','S6','S6_L3_002',88.6121,105.3865,'red','down',0,1),
+  (8900000352,1300000000888,1,'2026-04-04','S6','S6_L3_002',91.9603,105.3865,'red','up',0,1),
+  (8900000353,1300000000888,1,'2026-04-05','S6','S6_L3_002',91.4928,105.3865,'red','flat',0,1),
+  (8900000354,1300000000888,1,'2026-04-06','S6','S6_L3_002',92.7133,105.3865,'red','flat',0,1),
+  (8900000355,1300000000888,1,'2026-04-07','S6','S6_L3_002',92.336,105.3865,'red','flat',0,1),
+  (8900000356,1300000000888,1,'2026-04-08','S6','S6_L3_002',92.0222,105.3865,'red','flat',0,1),
+  (8900000357,1300000000888,1,'2026-04-09','S6','S6_L3_002',91.983,105.3865,'red','flat',0,1),
+  (8900000358,1300000000888,1,'2026-04-10','S6','S6_L3_002',88.513,105.3865,'red','down',0,1),
+  (8900000359,1300000000888,1,'2026-04-11','S6','S6_L3_002',89.2002,105.3865,'red','flat',0,1),
+  (8900000360,1300000000888,1,'2026-04-12','S6','S6_L3_002',84.9704,105.3865,'red','down',0,1),
+  (8900000361,1300000000888,1,'2026-03-14','S6','S6_L3_003',2.0062,2.1,'yellow','flat',0,1),
+  (8900000362,1300000000888,1,'2026-03-15','S6','S6_L3_003',2.1205,2.1,'green','up',0,1),
+  (8900000363,1300000000888,1,'2026-03-16','S6','S6_L3_003',2.0717,2.1,'yellow','down',0,1),
+  (8900000364,1300000000888,1,'2026-03-17','S6','S6_L3_003',1.9639,2.1,'red','down',0,1),
+  (8900000365,1300000000888,1,'2026-03-18','S6','S6_L3_003',2.0751,2.1,'yellow','up',0,1),
+  (8900000366,1300000000888,1,'2026-03-19','S6','S6_L3_003',2.061,2.1,'yellow','flat',0,1),
+  (8900000367,1300000000888,1,'2026-03-20','S6','S6_L3_003',2.0281,2.1,'yellow','flat',0,1),
+  (8900000368,1300000000888,1,'2026-03-21','S6','S6_L3_003',2.0047,2.1,'yellow','flat',0,1),
+  (8900000369,1300000000888,1,'2026-03-22','S6','S6_L3_003',2.0352,2.1,'yellow','flat',0,1),
+  (8900000370,1300000000888,1,'2026-03-23','S6','S6_L3_003',1.9613,2.1,'red','down',0,1),
+  (8900000371,1300000000888,1,'2026-03-24','S6','S6_L3_003',2.154,2.1,'green','up',0,1),
+  (8900000372,1300000000888,1,'2026-03-25','S6','S6_L3_003',1.9806,2.1,'red','down',0,1),
+  (8900000373,1300000000888,1,'2026-03-26','S6','S6_L3_003',2.0093,2.1,'yellow','flat',0,1),
+  (8900000374,1300000000888,1,'2026-03-27','S6','S6_L3_003',2.1204,2.1,'green','up',0,1),
+  (8900000375,1300000000888,1,'2026-03-28','S6','S6_L3_003',2.086,2.1,'yellow','flat',0,1),
+  (8900000376,1300000000888,1,'2026-03-29','S6','S6_L3_003',2.0943,2.1,'yellow','flat',0,1),
+  (8900000377,1300000000888,1,'2026-03-30','S6','S6_L3_003',2.1433,2.1,'green','up',0,1),
+  (8900000378,1300000000888,1,'2026-03-31','S6','S6_L3_003',2.0308,2.1,'yellow','down',0,1),
+  (8900000379,1300000000888,1,'2026-04-01','S6','S6_L3_003',1.9856,2.1,'red','down',0,1),
+  (8900000380,1300000000888,1,'2026-04-02','S6','S6_L3_003',2.1019,2.1,'green','up',0,1),
+  (8900000381,1300000000888,1,'2026-04-03','S6','S6_L3_003',2.099,2.1,'yellow','flat',0,1),
+  (8900000382,1300000000888,1,'2026-04-04','S6','S6_L3_003',2.0299,2.1,'yellow','down',0,1),
+  (8900000383,1300000000888,1,'2026-04-05','S6','S6_L3_003',1.9722,2.1,'red','down',0,1),
+  (8900000384,1300000000888,1,'2026-04-06','S6','S6_L3_003',2.1262,2.1,'green','up',0,1),
+  (8900000385,1300000000888,1,'2026-04-07','S6','S6_L3_003',2.0854,2.1,'yellow','flat',0,1),
+  (8900000386,1300000000888,1,'2026-04-08','S6','S6_L3_003',1.9655,2.1,'red','down',0,1),
+  (8900000387,1300000000888,1,'2026-04-09','S6','S6_L3_003',2.098,2.1,'yellow','up',0,1),
+  (8900000388,1300000000888,1,'2026-04-10','S6','S6_L3_003',1.9614,2.1,'red','down',0,1),
+  (8900000389,1300000000888,1,'2026-04-11','S6','S6_L3_003',2.0203,2.1,'yellow','up',0,1),
+  (8900000390,1300000000888,1,'2026-04-12','S6','S6_L3_003',1.9809,2.1,'red','flat',0,1),
+  (8900000391,1300000000888,1,'2026-03-14','S6','S6_L3_004',3.8941,3.43,'red','flat',0,1),
+  (8900000392,1300000000888,1,'2026-03-15','S6','S6_L3_004',3.8037,3.43,'red','down',0,1),
+  (8900000393,1300000000888,1,'2026-03-16','S6','S6_L3_004',3.5827,3.43,'yellow','down',0,1),
+  (8900000394,1300000000888,1,'2026-03-17','S6','S6_L3_004',3.9469,3.43,'red','up',0,1),
+  (8900000395,1300000000888,1,'2026-03-18','S6','S6_L3_004',3.8623,3.43,'red','down',0,1),
+  (8900000396,1300000000888,1,'2026-03-19','S6','S6_L3_004',3.9644,3.43,'red','up',0,1),
+  (8900000397,1300000000888,1,'2026-03-20','S6','S6_L3_004',3.8245,3.43,'red','down',0,1),
+  (8900000398,1300000000888,1,'2026-03-21','S6','S6_L3_004',3.8619,3.43,'red','flat',0,1),
+  (8900000399,1300000000888,1,'2026-03-22','S6','S6_L3_004',3.9687,3.43,'red','up',0,1),
+  (8900000400,1300000000888,1,'2026-03-23','S6','S6_L3_004',3.8849,3.43,'red','down',0,1),
+  (8900000401,1300000000888,1,'2026-03-24','S6','S6_L3_004',3.8734,3.43,'red','flat',0,1),
+  (8900000402,1300000000888,1,'2026-03-25','S6','S6_L3_004',4.2105,3.43,'red','up',0,1),
+  (8900000403,1300000000888,1,'2026-03-26','S6','S6_L3_004',3.8207,3.43,'red','down',0,1),
+  (8900000404,1300000000888,1,'2026-03-27','S6','S6_L3_004',3.8597,3.43,'red','flat',0,1),
+  (8900000405,1300000000888,1,'2026-03-28','S6','S6_L3_004',4.04,3.43,'red','up',0,1),
+  (8900000406,1300000000888,1,'2026-03-29','S6','S6_L3_004',3.7475,3.43,'yellow','down',0,1),
+  (8900000407,1300000000888,1,'2026-03-30','S6','S6_L3_004',3.7203,3.43,'yellow','flat',0,1),
+  (8900000408,1300000000888,1,'2026-03-31','S6','S6_L3_004',3.6752,3.43,'yellow','flat',0,1),
+  (8900000409,1300000000888,1,'2026-04-01','S6','S6_L3_004',3.9017,3.43,'red','up',0,1),
+  (8900000410,1300000000888,1,'2026-04-02','S6','S6_L3_004',3.9123,3.43,'red','flat',0,1),
+  (8900000411,1300000000888,1,'2026-04-03','S6','S6_L3_004',3.9256,3.43,'red','flat',0,1),
+  (8900000412,1300000000888,1,'2026-04-04','S6','S6_L3_004',3.6843,3.43,'yellow','down',0,1),
+  (8900000413,1300000000888,1,'2026-04-05','S6','S6_L3_004',3.9561,3.43,'red','up',0,1),
+  (8900000414,1300000000888,1,'2026-04-06','S6','S6_L3_004',3.9781,3.43,'red','flat',0,1),
+  (8900000415,1300000000888,1,'2026-04-07','S6','S6_L3_004',3.829,3.43,'red','down',0,1),
+  (8900000416,1300000000888,1,'2026-04-08','S6','S6_L3_004',3.844,3.43,'red','flat',0,1),
+  (8900000417,1300000000888,1,'2026-04-09','S6','S6_L3_004',3.918,3.43,'red','flat',0,1),
+  (8900000418,1300000000888,1,'2026-04-10','S6','S6_L3_004',3.8825,3.43,'red','flat',0,1),
+  (8900000419,1300000000888,1,'2026-04-11','S6','S6_L3_004',3.9142,3.43,'red','flat',0,1),
+  (8900000420,1300000000888,1,'2026-04-12','S6','S6_L3_004',3.7151,3.43,'yellow','down',0,1),
+  (8900000421,1300000000888,1,'2026-03-14','S6','S6_L3_005',15.786,14.97,'yellow','flat',0,1),
+  (8900000422,1300000000888,1,'2026-03-15','S6','S6_L3_005',16.0438,14.97,'yellow','flat',0,1),
+  (8900000423,1300000000888,1,'2026-03-16','S6','S6_L3_005',16.1492,14.97,'yellow','flat',0,1),
+  (8900000424,1300000000888,1,'2026-03-17','S6','S6_L3_005',15.8274,14.97,'yellow','flat',0,1),
+  (8900000425,1300000000888,1,'2026-03-18','S6','S6_L3_005',15.6173,14.97,'yellow','flat',0,1),
+  (8900000426,1300000000888,1,'2026-03-19','S6','S6_L3_005',16.803,14.97,'red','up',0,1),
+  (8900000427,1300000000888,1,'2026-03-20','S6','S6_L3_005',16.432,14.97,'yellow','down',0,1),
+  (8900000428,1300000000888,1,'2026-03-21','S6','S6_L3_005',15.8179,14.97,'yellow','down',0,1),
+  (8900000429,1300000000888,1,'2026-03-22','S6','S6_L3_005',16.4718,14.97,'red','up',0,1),
+  (8900000430,1300000000888,1,'2026-03-23','S6','S6_L3_005',16.4697,14.97,'red','flat',0,1),
+  (8900000431,1300000000888,1,'2026-03-24','S6','S6_L3_005',16.7564,14.97,'red','flat',0,1),
+  (8900000432,1300000000888,1,'2026-03-25','S6','S6_L3_005',15.6316,14.97,'yellow','down',0,1),
+  (8900000433,1300000000888,1,'2026-03-26','S6','S6_L3_005',16.5204,14.97,'red','up',0,1),
+  (8900000434,1300000000888,1,'2026-03-27','S6','S6_L3_005',15.8484,14.97,'yellow','down',0,1),
+  (8900000435,1300000000888,1,'2026-03-28','S6','S6_L3_005',16.7021,14.97,'red','up',0,1),
+  (8900000436,1300000000888,1,'2026-03-29','S6','S6_L3_005',16.0495,14.97,'yellow','down',0,1),
+  (8900000437,1300000000888,1,'2026-03-30','S6','S6_L3_005',15.0425,14.97,'yellow','down',0,1),
+  (8900000438,1300000000888,1,'2026-03-31','S6','S6_L3_005',16.1598,14.97,'yellow','up',0,1),
+  (8900000439,1300000000888,1,'2026-04-01','S6','S6_L3_005',15.2787,14.97,'yellow','down',0,1),
+  (8900000440,1300000000888,1,'2026-04-02','S6','S6_L3_005',16.0375,14.97,'yellow','up',0,1),
+  (8900000441,1300000000888,1,'2026-04-03','S6','S6_L3_005',16.1145,14.97,'yellow','flat',0,1),
+  (8900000442,1300000000888,1,'2026-04-04','S6','S6_L3_005',15.9484,14.97,'yellow','flat',0,1),
+  (8900000443,1300000000888,1,'2026-04-05','S6','S6_L3_005',15.4226,14.97,'yellow','down',0,1),
+  (8900000444,1300000000888,1,'2026-04-06','S6','S6_L3_005',15.6024,14.97,'yellow','flat',0,1),
+  (8900000445,1300000000888,1,'2026-04-07','S6','S6_L3_005',15.7337,14.97,'yellow','flat',0,1),
+  (8900000446,1300000000888,1,'2026-04-08','S6','S6_L3_005',16.0225,14.97,'yellow','flat',0,1),
+  (8900000447,1300000000888,1,'2026-04-09','S6','S6_L3_005',16.7667,14.97,'red','up',0,1),
+  (8900000448,1300000000888,1,'2026-04-10','S6','S6_L3_005',16.4861,14.97,'red','flat',0,1),
+  (8900000449,1300000000888,1,'2026-04-11','S6','S6_L3_005',15.914,14.97,'yellow','down',0,1),
+  (8900000450,1300000000888,1,'2026-04-12','S6','S6_L3_005',16.7596,14.97,'red','up',0,1),
+  (8900000451,1300000000888,1,'2026-03-14','S6','S6_L3_006',90.4784,90.34,'green','flat',0,1),
+  (8900000452,1300000000888,1,'2026-03-15','S6','S6_L3_006',84.6537,90.34,'red','down',0,1),
+  (8900000453,1300000000888,1,'2026-03-16','S6','S6_L3_006',91.3784,90.34,'green','up',0,1),
+  (8900000454,1300000000888,1,'2026-03-17','S6','S6_L3_006',86.343,90.34,'yellow','down',0,1),
+  (8900000455,1300000000888,1,'2026-03-18','S6','S6_L3_006',88.8552,90.34,'yellow','up',0,1),
+  (8900000456,1300000000888,1,'2026-03-19','S6','S6_L3_006',84.9719,90.34,'red','down',0,1),
+  (8900000457,1300000000888,1,'2026-03-20','S6','S6_L3_006',89.2806,90.34,'yellow','up',0,1),
+  (8900000458,1300000000888,1,'2026-03-21','S6','S6_L3_006',89.2234,90.34,'yellow','flat',0,1),
+  (8900000459,1300000000888,1,'2026-03-22','S6','S6_L3_006',91.0019,90.34,'green','flat',0,1),
+  (8900000460,1300000000888,1,'2026-03-23','S6','S6_L3_006',91.5766,90.34,'green','flat',0,1),
+  (8900000461,1300000000888,1,'2026-03-24','S6','S6_L3_006',91.3112,90.34,'green','flat',0,1),
+  (8900000462,1300000000888,1,'2026-03-25','S6','S6_L3_006',88.5534,90.34,'yellow','down',0,1),
+  (8900000463,1300000000888,1,'2026-03-26','S6','S6_L3_006',84.7647,90.34,'red','down',0,1),
+  (8900000464,1300000000888,1,'2026-03-27','S6','S6_L3_006',91.4966,90.34,'green','up',0,1),
+  (8900000465,1300000000888,1,'2026-03-28','S6','S6_L3_006',84.5588,90.34,'red','down',0,1),
+  (8900000466,1300000000888,1,'2026-03-29','S6','S6_L3_006',86.8436,90.34,'yellow','up',0,1),
+  (8900000467,1300000000888,1,'2026-03-30','S6','S6_L3_006',89.9478,90.34,'yellow','up',0,1),
+  (8900000468,1300000000888,1,'2026-03-31','S6','S6_L3_006',89.1728,90.34,'yellow','flat',0,1),
+  (8900000469,1300000000888,1,'2026-04-01','S6','S6_L3_006',92.2076,90.34,'green','up',0,1),
+  (8900000470,1300000000888,1,'2026-04-02','S6','S6_L3_006',87.9911,90.34,'yellow','down',0,1),
+  (8900000471,1300000000888,1,'2026-04-03','S6','S6_L3_006',83.5399,90.34,'red','down',0,1),
+  (8900000472,1300000000888,1,'2026-04-04','S6','S6_L3_006',87.2751,90.34,'yellow','up',0,1),
+  (8900000473,1300000000888,1,'2026-04-05','S6','S6_L3_006',88.4613,90.34,'yellow','flat',0,1),
+  (8900000474,1300000000888,1,'2026-04-06','S6','S6_L3_006',87.0762,90.34,'yellow','flat',0,1),
+  (8900000475,1300000000888,1,'2026-04-07','S6','S6_L3_006',91.7308,90.34,'green','up',0,1),
+  (8900000476,1300000000888,1,'2026-04-08','S6','S6_L3_006',87.3481,90.34,'yellow','down',0,1),
+  (8900000477,1300000000888,1,'2026-04-09','S6','S6_L3_006',84.2111,90.34,'red','down',0,1),
+  (8900000478,1300000000888,1,'2026-04-10','S6','S6_L3_006',89.2341,90.34,'yellow','up',0,1),
+  (8900000479,1300000000888,1,'2026-04-11','S6','S6_L3_006',84.9718,90.34,'red','down',0,1),
+  (8900000480,1300000000888,1,'2026-04-12','S6','S6_L3_006',92.4896,90.34,'green','up',0,1),
+  (8900000481,1300000000888,1,'2026-03-14','S6','S6_L3_007',75.0509,98.2735,'red','flat',0,1),
+  (8900000482,1300000000888,1,'2026-03-15','S6','S6_L3_007',79.2499,98.2735,'red','up',0,1),
+  (8900000483,1300000000888,1,'2026-03-16','S6','S6_L3_007',76.0008,98.2735,'red','down',0,1),
+  (8900000484,1300000000888,1,'2026-03-17','S6','S6_L3_007',79.4434,98.2735,'red','up',0,1),
+  (8900000485,1300000000888,1,'2026-03-18','S6','S6_L3_007',76.9003,98.2735,'red','down',0,1),
+  (8900000486,1300000000888,1,'2026-03-19','S6','S6_L3_007',78.8269,98.2735,'red','up',0,1),
+  (8900000487,1300000000888,1,'2026-03-20','S6','S6_L3_007',78.6631,98.2735,'red','flat',0,1),
+  (8900000488,1300000000888,1,'2026-03-21','S6','S6_L3_007',78.1859,98.2735,'red','flat',0,1),
+  (8900000489,1300000000888,1,'2026-03-22','S6','S6_L3_007',74.7047,98.2735,'red','down',0,1),
+  (8900000490,1300000000888,1,'2026-03-23','S6','S6_L3_007',79.2187,98.2735,'red','up',0,1),
+  (8900000491,1300000000888,1,'2026-03-24','S6','S6_L3_007',77.1419,98.2735,'red','down',0,1),
+  (8900000492,1300000000888,1,'2026-03-25','S6','S6_L3_007',81.7223,98.2735,'red','up',0,1),
+  (8900000493,1300000000888,1,'2026-03-26','S6','S6_L3_007',78.1986,98.2735,'red','down',0,1),
+  (8900000494,1300000000888,1,'2026-03-27','S6','S6_L3_007',78.8288,98.2735,'red','flat',0,1),
+  (8900000495,1300000000888,1,'2026-03-28','S6','S6_L3_007',75.3226,98.2735,'red','down',0,1),
+  (8900000496,1300000000888,1,'2026-03-29','S6','S6_L3_007',76.1523,98.2735,'red','flat',0,1),
+  (8900000497,1300000000888,1,'2026-03-30','S6','S6_L3_007',77.3153,98.2735,'red','flat',0,1),
+  (8900000498,1300000000888,1,'2026-03-31','S6','S6_L3_007',74.3846,98.2735,'red','down',0,1),
+  (8900000499,1300000000888,1,'2026-04-01','S6','S6_L3_007',74.385,98.2735,'red','flat',0,1),
+  (8900000500,1300000000888,1,'2026-04-02','S6','S6_L3_007',76.8405,98.2735,'red','up',0,1),
+  (8900000501,1300000000888,1,'2026-04-03','S6','S6_L3_007',76.9115,98.2735,'red','flat',0,1),
+  (8900000502,1300000000888,1,'2026-04-04','S6','S6_L3_007',77.5589,98.2735,'red','flat',0,1),
+  (8900000503,1300000000888,1,'2026-04-05','S6','S6_L3_007',79.6752,98.2735,'red','up',0,1),
+  (8900000504,1300000000888,1,'2026-04-06','S6','S6_L3_007',76.1657,98.2735,'red','down',0,1),
+  (8900000505,1300000000888,1,'2026-04-07','S6','S6_L3_007',78.6663,98.2735,'red','up',0,1),
+  (8900000506,1300000000888,1,'2026-04-08','S6','S6_L3_007',76.7571,98.2735,'red','down',0,1),
+  (8900000507,1300000000888,1,'2026-04-09','S6','S6_L3_007',76.6429,98.2735,'red','flat',0,1),
+  (8900000508,1300000000888,1,'2026-04-10','S6','S6_L3_007',77.6861,98.2735,'red','flat',0,1),
+  (8900000509,1300000000888,1,'2026-04-11','S6','S6_L3_007',72.3095,98.2735,'red','down',0,1),
+  (8900000510,1300000000888,1,'2026-04-12','S6','S6_L3_007',77.2451,98.2735,'red','up',0,1),
+  (8900000511,1300000000888,1,'2026-03-14','S6','S6_L3_008',12.3414,12.3,'yellow','flat',0,1),
+  (8900000512,1300000000888,1,'2026-03-15','S6','S6_L3_008',12.5977,12.3,'yellow','up',0,1),
+  (8900000513,1300000000888,1,'2026-03-16','S6','S6_L3_008',12.6828,12.3,'yellow','flat',0,1),
+  (8900000514,1300000000888,1,'2026-03-17','S6','S6_L3_008',12.769,12.3,'yellow','flat',0,1),
+  (8900000515,1300000000888,1,'2026-03-18','S6','S6_L3_008',12.517,12.3,'yellow','flat',0,1),
+  (8900000516,1300000000888,1,'2026-03-19','S6','S6_L3_008',12.4977,12.3,'yellow','flat',0,1),
+  (8900000517,1300000000888,1,'2026-03-20','S6','S6_L3_008',13.0059,12.3,'yellow','up',0,1),
+  (8900000518,1300000000888,1,'2026-03-21','S6','S6_L3_008',12.7037,12.3,'yellow','down',0,1),
+  (8900000519,1300000000888,1,'2026-03-22','S6','S6_L3_008',12.8461,12.3,'yellow','flat',0,1),
+  (8900000520,1300000000888,1,'2026-03-23','S6','S6_L3_008',12.7986,12.3,'yellow','flat',0,1),
+  (8900000521,1300000000888,1,'2026-03-24','S6','S6_L3_008',13.0642,12.3,'yellow','up',0,1),
+  (8900000522,1300000000888,1,'2026-03-25','S6','S6_L3_008',12.8278,12.3,'yellow','flat',0,1),
+  (8900000523,1300000000888,1,'2026-03-26','S6','S6_L3_008',13.2205,12.3,'yellow','up',0,1),
+  (8900000524,1300000000888,1,'2026-03-27','S6','S6_L3_008',12.9272,12.3,'yellow','down',0,1),
+  (8900000525,1300000000888,1,'2026-03-28','S6','S6_L3_008',13.2311,12.3,'yellow','up',0,1),
+  (8900000526,1300000000888,1,'2026-03-29','S6','S6_L3_008',13.3695,12.3,'yellow','flat',0,1),
+  (8900000527,1300000000888,1,'2026-03-30','S6','S6_L3_008',12.3227,12.3,'yellow','down',0,1),
+  (8900000528,1300000000888,1,'2026-03-31','S6','S6_L3_008',13.2439,12.3,'yellow','up',0,1),
+  (8900000529,1300000000888,1,'2026-04-01','S6','S6_L3_008',13.5767,12.3,'red','up',0,1),
+  (8900000530,1300000000888,1,'2026-04-02','S6','S6_L3_008',12.5114,12.3,'yellow','down',0,1),
+  (8900000531,1300000000888,1,'2026-04-03','S6','S6_L3_008',12.8751,12.3,'yellow','up',0,1),
+  (8900000532,1300000000888,1,'2026-04-04','S6','S6_L3_008',12.7493,12.3,'yellow','flat',0,1),
+  (8900000533,1300000000888,1,'2026-04-05','S6','S6_L3_008',13.0578,12.3,'yellow','up',0,1),
+  (8900000534,1300000000888,1,'2026-04-06','S6','S6_L3_008',13.0884,12.3,'yellow','flat',0,1),
+  (8900000535,1300000000888,1,'2026-04-07','S6','S6_L3_008',12.6286,12.3,'yellow','down',0,1),
+  (8900000536,1300000000888,1,'2026-04-08','S6','S6_L3_008',13.3949,12.3,'yellow','up',0,1),
+  (8900000537,1300000000888,1,'2026-04-09','S6','S6_L3_008',12.5562,12.3,'yellow','down',0,1),
+  (8900000538,1300000000888,1,'2026-04-10','S6','S6_L3_008',12.8339,12.3,'yellow','up',0,1),
+  (8900000539,1300000000888,1,'2026-04-11','S6','S6_L3_008',13.2831,12.3,'yellow','up',0,1),
+  (8900000540,1300000000888,1,'2026-04-12','S6','S6_L3_008',13.6426,12.3,'red','up',0,1),
+  (8900000541,1300000000888,1,'2026-03-14','S5','S5_L3_001',11.972,12.549,'yellow','flat',0,1),
+  (8900000542,1300000000888,1,'2026-03-15','S5','S5_L3_001',12.6755,12.549,'green','up',0,1),
+  (8900000543,1300000000888,1,'2026-03-16','S5','S5_L3_001',12.3327,12.549,'yellow','down',0,1),
+  (8900000544,1300000000888,1,'2026-03-17','S5','S5_L3_001',12.1134,12.549,'yellow','flat',0,1),
+  (8900000545,1300000000888,1,'2026-03-18','S5','S5_L3_001',11.7952,12.549,'red','down',0,1),
+  (8900000546,1300000000888,1,'2026-03-19','S5','S5_L3_001',11.9965,12.549,'yellow','flat',0,1),
+  (8900000547,1300000000888,1,'2026-03-20','S5','S5_L3_001',12.0555,12.549,'yellow','flat',0,1),
+  (8900000548,1300000000888,1,'2026-03-21','S5','S5_L3_001',11.3524,12.549,'red','down',0,1),
+  (8900000549,1300000000888,1,'2026-03-22','S5','S5_L3_001',12.3941,12.549,'yellow','up',0,1),
+  (8900000550,1300000000888,1,'2026-03-23','S5','S5_L3_001',12.0822,12.549,'yellow','down',0,1),
+  (8900000551,1300000000888,1,'2026-03-24','S5','S5_L3_001',12.3681,12.549,'yellow','up',0,1),
+  (8900000552,1300000000888,1,'2026-03-25','S5','S5_L3_001',12.0466,12.549,'yellow','down',0,1),
+  (8900000553,1300000000888,1,'2026-03-26','S5','S5_L3_001',13.2974,12.549,'green','up',0,1),
+  (8900000554,1300000000888,1,'2026-03-27','S5','S5_L3_001',11.5934,12.549,'red','down',0,1),
+  (8900000555,1300000000888,1,'2026-03-28','S5','S5_L3_001',11.8585,12.549,'red','up',0,1),
+  (8900000556,1300000000888,1,'2026-03-29','S5','S5_L3_001',12.4581,12.549,'yellow','up',0,1),
+  (8900000557,1300000000888,1,'2026-03-30','S5','S5_L3_001',13.0632,12.549,'green','up',0,1),
+  (8900000558,1300000000888,1,'2026-03-31','S5','S5_L3_001',11.8368,12.549,'red','down',0,1),
+  (8900000559,1300000000888,1,'2026-04-01','S5','S5_L3_001',12.8695,12.549,'green','up',0,1),
+  (8900000560,1300000000888,1,'2026-04-02','S5','S5_L3_001',11.8644,12.549,'red','down',0,1),
+  (8900000561,1300000000888,1,'2026-04-03','S5','S5_L3_001',12.6734,12.549,'green','up',0,1),
+  (8900000562,1300000000888,1,'2026-04-04','S5','S5_L3_001',12.2276,12.549,'yellow','down',0,1),
+  (8900000563,1300000000888,1,'2026-04-05','S5','S5_L3_001',13.0162,12.549,'green','up',0,1),
+  (8900000564,1300000000888,1,'2026-04-06','S5','S5_L3_001',12.8522,12.549,'green','flat',0,1),
+  (8900000565,1300000000888,1,'2026-04-07','S5','S5_L3_001',11.9629,12.549,'yellow','down',0,1),
+  (8900000566,1300000000888,1,'2026-04-08','S5','S5_L3_001',13.2745,12.549,'green','up',0,1),
+  (8900000567,1300000000888,1,'2026-04-09','S5','S5_L3_001',11.7886,12.549,'red','down',0,1),
+  (8900000568,1300000000888,1,'2026-04-10','S5','S5_L3_001',12.0852,12.549,'yellow','up',0,1),
+  (8900000569,1300000000888,1,'2026-04-11','S5','S5_L3_001',12.8617,12.549,'green','up',0,1),
+  (8900000570,1300000000888,1,'2026-04-12','S5','S5_L3_001',11.9311,12.549,'yellow','down',0,1),
+  (8900000571,1300000000888,1,'2026-03-14','S5','S5_L3_002',13.1122,13.9777,'green','flat',0,1),
+  (8900000572,1300000000888,1,'2026-03-15','S5','S5_L3_002',12.9108,13.9777,'green','flat',0,1),
+  (8900000573,1300000000888,1,'2026-03-16','S5','S5_L3_002',13.1233,13.9777,'green','flat',0,1),
+  (8900000574,1300000000888,1,'2026-03-17','S5','S5_L3_002',12.8611,13.9777,'green','flat',0,1),
+  (8900000575,1300000000888,1,'2026-03-18','S5','S5_L3_002',12.184,13.9777,'green','down',0,1),
+  (8900000576,1300000000888,1,'2026-03-19','S5','S5_L3_002',12.6627,13.9777,'green','up',0,1),
+  (8900000577,1300000000888,1,'2026-03-20','S5','S5_L3_002',12.8795,13.9777,'green','flat',0,1),
+  (8900000578,1300000000888,1,'2026-03-21','S5','S5_L3_002',12.9541,13.9777,'green','flat',0,1),
+  (8900000579,1300000000888,1,'2026-03-22','S5','S5_L3_002',12.4922,13.9777,'green','down',0,1),
+  (8900000580,1300000000888,1,'2026-03-23','S5','S5_L3_002',12.6557,13.9777,'green','flat',0,1),
+  (8900000581,1300000000888,1,'2026-03-24','S5','S5_L3_002',12.819,13.9777,'green','flat',0,1),
+  (8900000582,1300000000888,1,'2026-03-25','S5','S5_L3_002',13.1634,13.9777,'green','up',0,1),
+  (8900000583,1300000000888,1,'2026-03-26','S5','S5_L3_002',13.0622,13.9777,'green','flat',0,1),
+  (8900000584,1300000000888,1,'2026-03-27','S5','S5_L3_002',12.9257,13.9777,'green','flat',0,1),
+  (8900000585,1300000000888,1,'2026-03-28','S5','S5_L3_002',12.8305,13.9777,'green','flat',0,1),
+  (8900000586,1300000000888,1,'2026-03-29','S5','S5_L3_002',12.2898,13.9777,'green','down',0,1),
+  (8900000587,1300000000888,1,'2026-03-30','S5','S5_L3_002',12.261,13.9777,'green','flat',0,1),
+  (8900000588,1300000000888,1,'2026-03-31','S5','S5_L3_002',12.6449,13.9777,'green','up',0,1),
+  (8900000589,1300000000888,1,'2026-04-01','S5','S5_L3_002',13.076,13.9777,'green','up',0,1),
+  (8900000590,1300000000888,1,'2026-04-02','S5','S5_L3_002',12.8302,13.9777,'green','flat',0,1),
+  (8900000591,1300000000888,1,'2026-04-03','S5','S5_L3_002',12.8932,13.9777,'green','flat',0,1),
+  (8900000592,1300000000888,1,'2026-04-04','S5','S5_L3_002',12.1086,13.9777,'green','down',0,1),
+  (8900000593,1300000000888,1,'2026-04-05','S5','S5_L3_002',12.1238,13.9777,'green','flat',0,1),
+  (8900000594,1300000000888,1,'2026-04-06','S5','S5_L3_002',13.1058,13.9777,'green','up',0,1),
+  (8900000595,1300000000888,1,'2026-04-07','S5','S5_L3_002',12.6666,13.9777,'green','down',0,1),
+  (8900000596,1300000000888,1,'2026-04-08','S5','S5_L3_002',12.1801,13.9777,'green','down',0,1),
+  (8900000597,1300000000888,1,'2026-04-09','S5','S5_L3_002',13.0154,13.9777,'green','up',0,1),
+  (8900000598,1300000000888,1,'2026-04-10','S5','S5_L3_002',12.778,13.9777,'green','flat',0,1),
+  (8900000599,1300000000888,1,'2026-04-11','S5','S5_L3_002',13.8025,13.9777,'green','up',0,1),
+  (8900000600,1300000000888,1,'2026-04-12','S5','S5_L3_002',13.1553,13.9777,'green','down',0,1),
+  (8900000601,1300000000888,1,'2026-03-14','S5','S5_L3_003',12.1688,15.2341,'red','flat',0,1),
+  (8900000602,1300000000888,1,'2026-03-15','S5','S5_L3_003',12.3044,15.2341,'red','flat',0,1),
+  (8900000603,1300000000888,1,'2026-03-16','S5','S5_L3_003',12.4932,15.2341,'red','flat',0,1),
+  (8900000604,1300000000888,1,'2026-03-17','S5','S5_L3_003',12.9212,15.2341,'red','up',0,1),
+  (8900000605,1300000000888,1,'2026-03-18','S5','S5_L3_003',12.9772,15.2341,'red','flat',0,1),
+  (8900000606,1300000000888,1,'2026-03-19','S5','S5_L3_003',13.0674,15.2341,'red','flat',0,1),
+  (8900000607,1300000000888,1,'2026-03-20','S5','S5_L3_003',12.6892,15.2341,'red','down',0,1),
+  (8900000608,1300000000888,1,'2026-03-21','S5','S5_L3_003',12.9463,15.2341,'red','up',0,1),
+  (8900000609,1300000000888,1,'2026-03-22','S5','S5_L3_003',13.4873,15.2341,'red','up',0,1),
+  (8900000610,1300000000888,1,'2026-03-23','S5','S5_L3_003',12.9761,15.2341,'red','down',0,1),
+  (8900000611,1300000000888,1,'2026-03-24','S5','S5_L3_003',13.2386,15.2341,'red','up',0,1),
+  (8900000612,1300000000888,1,'2026-03-25','S5','S5_L3_003',12.0588,15.2341,'red','down',0,1),
+  (8900000613,1300000000888,1,'2026-03-26','S5','S5_L3_003',12.3501,15.2341,'red','up',0,1),
+  (8900000614,1300000000888,1,'2026-03-27','S5','S5_L3_003',12.3466,15.2341,'red','flat',0,1),
+  (8900000615,1300000000888,1,'2026-03-28','S5','S5_L3_003',11.6168,15.2341,'red','down',0,1),
+  (8900000616,1300000000888,1,'2026-03-29','S5','S5_L3_003',12.6591,15.2341,'red','up',0,1),
+  (8900000617,1300000000888,1,'2026-03-30','S5','S5_L3_003',13.1588,15.2341,'red','up',0,1),
+  (8900000618,1300000000888,1,'2026-03-31','S5','S5_L3_003',12.4283,15.2341,'red','down',0,1),
+  (8900000619,1300000000888,1,'2026-04-01','S5','S5_L3_003',12.7053,15.2341,'red','up',0,1),
+  (8900000620,1300000000888,1,'2026-04-02','S5','S5_L3_003',12.3076,15.2341,'red','down',0,1),
+  (8900000621,1300000000888,1,'2026-04-03','S5','S5_L3_003',12.4449,15.2341,'red','flat',0,1),
+  (8900000622,1300000000888,1,'2026-04-04','S5','S5_L3_003',12.7393,15.2341,'red','up',0,1),
+  (8900000623,1300000000888,1,'2026-04-05','S5','S5_L3_003',12.1781,15.2341,'red','down',0,1),
+  (8900000624,1300000000888,1,'2026-04-06','S5','S5_L3_003',13.0761,15.2341,'red','up',0,1),
+  (8900000625,1300000000888,1,'2026-04-07','S5','S5_L3_003',11.9041,15.2341,'red','down',0,1),
+  (8900000626,1300000000888,1,'2026-04-08','S5','S5_L3_003',12.7533,15.2341,'red','up',0,1),
+  (8900000627,1300000000888,1,'2026-04-09','S5','S5_L3_003',12.445,15.2341,'red','down',0,1),
+  (8900000628,1300000000888,1,'2026-04-10','S5','S5_L3_003',13.1955,15.2341,'red','up',0,1),
+  (8900000629,1300000000888,1,'2026-04-11','S5','S5_L3_003',12.9199,15.2341,'red','down',0,1),
+  (8900000630,1300000000888,1,'2026-04-12','S5','S5_L3_003',11.8414,15.2341,'red','down',0,1),
+  (8900000631,1300000000888,1,'2026-03-14','S5','S5_L3_004',11.3856,14.959,'green','flat',0,1),
+  (8900000632,1300000000888,1,'2026-03-15','S5','S5_L3_004',11.9087,14.959,'green','up',0,1),
+  (8900000633,1300000000888,1,'2026-03-16','S5','S5_L3_004',11.7967,14.959,'green','flat',0,1),
+  (8900000634,1300000000888,1,'2026-03-17','S5','S5_L3_004',11.6536,14.959,'green','flat',0,1),
+  (8900000635,1300000000888,1,'2026-03-18','S5','S5_L3_004',12.3112,14.959,'green','up',0,1),
+  (8900000636,1300000000888,1,'2026-03-19','S5','S5_L3_004',11.0681,14.959,'green','down',0,1),
+  (8900000637,1300000000888,1,'2026-03-20','S5','S5_L3_004',11.6454,14.959,'green','up',0,1),
+  (8900000638,1300000000888,1,'2026-03-21','S5','S5_L3_004',11.5839,14.959,'green','flat',0,1),
+  (8900000639,1300000000888,1,'2026-03-22','S5','S5_L3_004',12.2189,14.959,'green','up',0,1),
+  (8900000640,1300000000888,1,'2026-03-23','S5','S5_L3_004',12.4602,14.959,'green','flat',0,1),
+  (8900000641,1300000000888,1,'2026-03-24','S5','S5_L3_004',12.1834,14.959,'green','down',0,1),
+  (8900000642,1300000000888,1,'2026-03-25','S5','S5_L3_004',12.4048,14.959,'green','flat',0,1),
+  (8900000643,1300000000888,1,'2026-03-26','S5','S5_L3_004',11.1118,14.959,'green','down',0,1),
+  (8900000644,1300000000888,1,'2026-03-27','S5','S5_L3_004',11.9648,14.959,'green','up',0,1),
+  (8900000645,1300000000888,1,'2026-03-28','S5','S5_L3_004',11.4124,14.959,'green','down',0,1),
+  (8900000646,1300000000888,1,'2026-03-29','S5','S5_L3_004',11.7725,14.959,'green','up',0,1),
+  (8900000647,1300000000888,1,'2026-03-30','S5','S5_L3_004',11.9938,14.959,'green','flat',0,1),
+  (8900000648,1300000000888,1,'2026-03-31','S5','S5_L3_004',11.9402,14.959,'green','flat',0,1),-- 从模板读取了 115 条用户填入的基准值
+
+  (8900000649,1300000000888,1,'2026-04-01','S5','S5_L3_004',12.3978,14.959,'green','up',0,1),
+  (8900000650,1300000000888,1,'2026-04-02','S5','S5_L3_004',11.1996,14.959,'green','down',0,1),
+  (8900000651,1300000000888,1,'2026-04-03','S5','S5_L3_004',11.6079,14.959,'green','up',0,1),
+  (8900000652,1300000000888,1,'2026-04-04','S5','S5_L3_004',11.3775,14.959,'green','flat',0,1),
+  (8900000653,1300000000888,1,'2026-04-05','S5','S5_L3_004',11.321,14.959,'green','flat',0,1),
+  (8900000654,1300000000888,1,'2026-04-06','S5','S5_L3_004',12.2657,14.959,'green','up',0,1),
+  (8900000655,1300000000888,1,'2026-04-07','S5','S5_L3_004',11.9716,14.959,'green','down',0,1),
+  (8900000656,1300000000888,1,'2026-04-08','S5','S5_L3_004',12.4624,14.959,'green','up',0,1),
+  (8900000657,1300000000888,1,'2026-04-09','S5','S5_L3_004',12.3297,14.959,'green','flat',0,1),
+  (8900000658,1300000000888,1,'2026-04-10','S5','S5_L3_004',11.9307,14.959,'green','down',0,1),
+  (8900000659,1300000000888,1,'2026-04-11','S5','S5_L3_004',11.5601,14.959,'green','down',0,1),
+  (8900000660,1300000000888,1,'2026-04-12','S5','S5_L3_004',12.2607,14.959,'green','up',0,1),
+  (8900000661,1300000000888,1,'2026-03-14','S5','S5_L3_005',11.9935,14.768,'red','flat',0,1),
+  (8900000662,1300000000888,1,'2026-03-15','S5','S5_L3_005',12.2034,14.768,'red','flat',0,1),
+  (8900000663,1300000000888,1,'2026-03-16','S5','S5_L3_005',12.4419,14.768,'red','flat',0,1),
+  (8900000664,1300000000888,1,'2026-03-17','S5','S5_L3_005',12.1614,14.768,'red','down',0,1),
+  (8900000665,1300000000888,1,'2026-03-18','S5','S5_L3_005',12.7281,14.768,'red','up',0,1),
+  (8900000666,1300000000888,1,'2026-03-19','S5','S5_L3_005',12.6339,14.768,'red','flat',0,1),
+  (8900000667,1300000000888,1,'2026-03-20','S5','S5_L3_005',12.5726,14.768,'red','flat',0,1),
+  (8900000668,1300000000888,1,'2026-03-21','S5','S5_L3_005',13.2418,14.768,'red','up',0,1),
+  (8900000669,1300000000888,1,'2026-03-22','S5','S5_L3_005',11.9157,14.768,'red','down',0,1),
+  (8900000670,1300000000888,1,'2026-03-23','S5','S5_L3_005',13.0435,14.768,'red','up',0,1),
+  (8900000671,1300000000888,1,'2026-03-24','S5','S5_L3_005',12.2199,14.768,'red','down',0,1),
+  (8900000672,1300000000888,1,'2026-03-25','S5','S5_L3_005',13.0795,14.768,'red','up',0,1),
+  (8900000673,1300000000888,1,'2026-03-26','S5','S5_L3_005',13.2461,14.768,'red','flat',0,1),
+  (8900000674,1300000000888,1,'2026-03-27','S5','S5_L3_005',13.395,14.768,'red','flat',0,1),
+  (8900000675,1300000000888,1,'2026-03-28','S5','S5_L3_005',12.4583,14.768,'red','down',0,1),
+  (8900000676,1300000000888,1,'2026-03-29','S5','S5_L3_005',12.0926,14.768,'red','down',0,1),
+  (8900000677,1300000000888,1,'2026-03-30','S5','S5_L3_005',12.6532,14.768,'red','up',0,1),
+  (8900000678,1300000000888,1,'2026-03-31','S5','S5_L3_005',12.5098,14.768,'red','flat',0,1),
+  (8900000679,1300000000888,1,'2026-04-01','S5','S5_L3_005',11.8673,14.768,'red','down',0,1),
+  (8900000680,1300000000888,1,'2026-04-02','S5','S5_L3_005',12.8064,14.768,'red','up',0,1),
+  (8900000681,1300000000888,1,'2026-04-03','S5','S5_L3_005',12.1831,14.768,'red','down',0,1),
+  (8900000682,1300000000888,1,'2026-04-04','S5','S5_L3_005',13.0719,14.768,'red','up',0,1),
+  (8900000683,1300000000888,1,'2026-04-05','S5','S5_L3_005',12.8927,14.768,'red','flat',0,1),
+  (8900000684,1300000000888,1,'2026-04-06','S5','S5_L3_005',12.4241,14.768,'red','down',0,1),
+  (8900000685,1300000000888,1,'2026-04-07','S5','S5_L3_005',12.5435,14.768,'red','flat',0,1),
+  (8900000686,1300000000888,1,'2026-04-08','S5','S5_L3_005',12.4387,14.768,'red','flat',0,1),
+  (8900000687,1300000000888,1,'2026-04-09','S5','S5_L3_005',12.358,14.768,'red','flat',0,1),
+  (8900000688,1300000000888,1,'2026-04-10','S5','S5_L3_005',13.6945,14.768,'red','up',0,1),
+  (8900000689,1300000000888,1,'2026-04-11','S5','S5_L3_005',12.178,14.768,'red','down',0,1),
+  (8900000690,1300000000888,1,'2026-04-12','S5','S5_L3_005',12.5507,14.768,'red','up',0,1);
+
+-- Done.

BIN
scripts/demo_data_template.xlsx


+ 414 - 0
scripts/gen_demo_data.py

@@ -0,0 +1,414 @@
+#!/usr/bin/env python3
+"""
+Demo 数据智能生成脚本
+====================
+为 Demo 租户生成 30 天 KPI 值数据。支持从 Excel 模板导入用户填入的基准值,
+未填入的自动生成,并保证父子层级数值逻辑自洽。
+
+用法:
+  # 全自动生成
+  python3 scripts/gen_demo_data.py > scripts/demo_data.sql
+
+  # 使用 Excel 模板(用户填入了部分基准值)
+  python3 scripts/gen_demo_data.py --template scripts/demo_data_template.xlsx > scripts/demo_data.sql
+
+  # 导入
+  mysql -h... -u... -p... aidopdev < scripts/demo_data.sql
+
+依赖: pip install pymysql openpyxl
+"""
+
+import argparse
+import random
+import sys
+from datetime import date, timedelta
+
+DEMO_TENANT_ID = 1300000000888
+FACTORY_ID = 1
+DAYS = 30
+ID_BASE_L1 = 8880000000
+ID_BASE_L2 = 8890000000
+ID_BASE_L3 = 8900000000
+
+DB_CONFIG = dict(
+    host="123.60.180.165",
+    port=3306,
+    user="aidopremote",
+    password="1234567890aiDOP#",
+    database="aidopdev",
+)
+
+random.seed(42)
+
+
+# ── DB ──────────────────────────────────────────────
+
+
+def connect_db():
+    try:
+        import pymysql
+        return pymysql.connect(**DB_CONFIG)
+    except ImportError:
+        pass
+    try:
+        import mysql.connector
+        return mysql.connector.connect(**DB_CONFIG)
+    except ImportError:
+        pass
+    print("ERROR: 需要 pymysql 或 mysql-connector-python", file=sys.stderr)
+    sys.exit(1)
+
+
+def load_kpi_master(conn):
+    cur = conn.cursor()
+    cur.execute(
+        "SELECT MetricCode, ModuleCode, MetricLevel, Direction, Unit, ParentId, Id "
+        "FROM ado_smart_ops_kpi_master WHERE TenantId = %s ORDER BY SortNo",
+        (DEMO_TENANT_ID,),
+    )
+    rows = cur.fetchall()
+    cur.close()
+    return [
+        dict(
+            metric_code=r[0],
+            module_code=r[1],
+            metric_level=r[2],
+            direction=r[3] or "higher_is_better",
+            unit=r[4] or "",
+            parent_id=r[5],
+            id=r[6],
+        )
+        for r in rows
+    ]
+
+
+# ── Excel 模板读取 ──────────────────────────────────
+
+
+def load_template(path):
+    """读取 Excel 模板,返回 {metric_code: {target, actual, yellow_threshold, red_threshold}}"""
+    from openpyxl import load_workbook
+
+    wb = load_workbook(path, data_only=True)
+    ws = wb.active
+    overrides = {}
+    for row in ws.iter_rows(min_row=2, values_only=True):
+        if not row or not row[0]:
+            continue
+        code = str(row[0]).strip()
+        if not code or not code.startswith("S"):
+            continue
+        target = row[7] if len(row) > 7 else None
+        actual = row[8] if len(row) > 8 else None
+        yellow_th = row[9] if len(row) > 9 else None
+        red_th = row[10] if len(row) > 10 else None
+        entry = {}
+        if target is not None:
+            entry["target"] = float(target)
+        if actual is not None:
+            entry["actual"] = float(actual)
+        if yellow_th is not None:
+            entry["yellow_threshold"] = float(yellow_th)
+        if red_th is not None:
+            entry["red_threshold"] = float(red_th)
+        if entry:
+            overrides[code] = entry
+    return overrides
+
+
+# ── 自动生成基准值 ──────────────────────────────────
+
+
+def auto_target(kpi):
+    unit = kpi.get("unit", "").strip()
+    if unit == "%":
+        return round(random.uniform(80, 98), 2)
+    elif unit in ("天",):
+        return round(random.uniform(2, 15), 2)
+    elif "PPM" in unit:
+        return round(random.uniform(3000, 8000), 0)
+    elif "/" in unit:
+        return round(random.uniform(50, 300), 2)
+    elif unit in ("个", "颗/人", "家/人", "小时"):
+        return round(random.uniform(5, 200), 0)
+    else:
+        return round(random.uniform(50, 200), 2)
+
+
+def auto_actual(target, direction):
+    if direction == "higher_is_better":
+        factor = random.uniform(0.82, 1.05)
+    else:
+        factor = random.uniform(0.90, 1.25)
+    return round(target * factor, 4)
+
+
+# ── 父子自洽逻辑 ──────────────────────────────────
+
+
+def resolve_baselines(masters, overrides):
+    """
+    决定每个指标的 (target, actual) 基准值。
+    优先级: 用户填入 > 从父级拆分 / 从子级汇总 > 全自动生成。
+    保证父子层级加权平均自洽。
+    """
+    id_map = {m["id"]: m for m in masters}
+    code_map = {m["metric_code"]: m for m in masters}
+
+    children_of = {}
+    for m in masters:
+        pid = m["parent_id"]
+        if pid:
+            children_of.setdefault(pid, []).append(m)
+
+    baselines = {}
+
+    def get_or_gen(m):
+        code = m["metric_code"]
+        if code in baselines:
+            return baselines[code]
+
+        ov = overrides.get(code, {})
+        user_target = ov.get("target")
+        user_actual = ov.get("actual")
+        kids = children_of.get(m["id"], [])
+
+        if user_target is not None and user_actual is not None:
+            baselines[code] = (user_target, user_actual)
+            _propagate_to_children(m, user_target, user_actual, kids, overrides)
+            return baselines[code]
+
+        if user_target is not None:
+            actual = auto_actual(user_target, m["direction"])
+            baselines[code] = (user_target, actual)
+            _propagate_to_children(m, user_target, actual, kids, overrides)
+            return baselines[code]
+
+        if user_actual is not None:
+            tgt = _infer_target_from_actual(user_actual, m["direction"])
+            baselines[code] = (tgt, user_actual)
+            _propagate_to_children(m, tgt, user_actual, kids, overrides)
+            return baselines[code]
+
+        if kids:
+            kid_baselines = [get_or_gen(k) for k in kids]
+            any_kid_has_user = any(
+                overrides.get(k["metric_code"], {}).get("target") is not None
+                or overrides.get(k["metric_code"], {}).get("actual") is not None
+                for k in kids
+            )
+            if any_kid_has_user:
+                avg_t = sum(b[0] for b in kid_baselines) / len(kid_baselines)
+                avg_a = sum(b[1] for b in kid_baselines) / len(kid_baselines)
+                baselines[code] = (round(avg_t, 4), round(avg_a, 4))
+                return baselines[code]
+
+        tgt = auto_target(m)
+        actual = auto_actual(tgt, m["direction"])
+        baselines[code] = (tgt, actual)
+        _propagate_to_children(m, tgt, actual, kids, overrides)
+        return baselines[code]
+
+    def _propagate_to_children(parent_m, p_target, p_actual, kids, overrides):
+        if not kids:
+            return
+        n = len(kids)
+        for i, k in enumerate(kids):
+            kcode = k["metric_code"]
+            if kcode in baselines:
+                continue
+            kov = overrides.get(kcode, {})
+            if kov.get("target") is not None or kov.get("actual") is not None:
+                continue
+
+            if i < n - 1:
+                noise_t = random.uniform(-0.08, 0.08)
+                noise_a = random.uniform(-0.08, 0.08)
+                ct = p_target * (1 + noise_t)
+                ca = p_actual * (1 + noise_a)
+            else:
+                already = [baselines[kids[j]["metric_code"]] for j in range(i) if kids[j]["metric_code"] in baselines]
+                if already:
+                    sum_t = sum(b[0] for b in already)
+                    sum_a = sum(b[1] for b in already)
+                    ct = p_target * n - sum_t
+                    ca = p_actual * n - sum_a
+                    ct = max(ct, p_target * 0.7)
+                    ca = max(ca, p_actual * 0.5)
+                else:
+                    ct = p_target
+                    ca = p_actual
+
+            baselines[kcode] = (round(ct, 4), round(ca, 4))
+            grandkids = children_of.get(k["id"], [])
+            _propagate_to_children(k, ct, ca, grandkids, overrides)
+
+    def _infer_target_from_actual(actual, direction):
+        if direction == "higher_is_better":
+            return round(actual / random.uniform(0.85, 1.02), 4)
+        else:
+            return round(actual / random.uniform(0.95, 1.20), 4)
+
+    for m in masters:
+        if m["metric_level"] == 1:
+            get_or_gen(m)
+
+    for m in masters:
+        if m["metric_code"] not in baselines:
+            get_or_gen(m)
+
+    return baselines
+
+
+# ── 日值生成 ──────────────────────────────────────
+
+
+def gen_daily_values(baseline_actual, direction, days=DAYS):
+    """以 baseline_actual 为中心生成 30 天日值,带轻微波动但均值 ≈ baseline。"""
+    vals = []
+    for i in range(days):
+        noise = random.gauss(0, 0.03)
+        vals.append(round(max(0, baseline_actual * (1 + noise)), 4))
+    return vals
+
+
+def status_color(val, target, direction, yellow_th=None, red_th=None):
+    if target == 0:
+        return "green"
+    if direction == "higher_is_better":
+        y_pct = (yellow_th or 95) / 100.0
+        r_pct = (red_th or 80) / 100.0
+        if val >= target:
+            return "green"
+        elif val >= target * y_pct:
+            return "yellow"
+        else:
+            return "red"
+    else:
+        y_pct = (yellow_th or 110) / 100.0
+        r_pct = (red_th or 120) / 100.0
+        if val <= target:
+            return "green"
+        elif val <= target * y_pct:
+            return "yellow"
+        else:
+            return "red"
+
+
+def trend_flag(vals, idx):
+    if idx == 0:
+        return "flat"
+    prev = vals[idx - 1]
+    cur = vals[idx]
+    if prev == 0:
+        return "up" if cur > 0 else "flat"
+    change = (cur - prev) / prev
+    if change > 0.02:
+        return "up"
+    elif change < -0.02:
+        return "down"
+    return "flat"
+
+
+def esc(s):
+    if s is None:
+        return "NULL"
+    return "'" + str(s).replace("\\", "\\\\").replace("'", "\\'") + "'"
+
+
+# ── 主流程 ────────────────────────────────────────
+
+
+def main():
+    parser = argparse.ArgumentParser(description="Demo 数据智能生成")
+    parser.add_argument(
+        "--template", "-t",
+        help="Excel 模板路径(含用户填入的基准值),不提供则全自动生成",
+    )
+    args = parser.parse_args()
+
+    conn = connect_db()
+    masters = load_kpi_master(conn)
+    conn.close()
+
+    if not masters:
+        print(f"-- ERROR: 租户 {DEMO_TENANT_ID} 无 KpiMaster 数据", file=sys.stderr)
+        sys.exit(1)
+
+    overrides = {}
+    if args.template:
+        overrides = load_template(args.template)
+        print(f"-- 从模板读取了 {len(overrides)} 条用户填入的基准值", file=sys.stderr)
+
+    baselines = resolve_baselines(masters, overrides)
+
+    today = date.today()
+    start_date = today - timedelta(days=DAYS - 1)
+
+    l1s = [m for m in masters if m["metric_level"] == 1]
+    l2s = [m for m in masters if m["metric_level"] == 2]
+    l3s = [m for m in masters if m["metric_level"] == 3]
+
+    daily_vals = {}
+    targets = {}
+    for m in masters:
+        code = m["metric_code"]
+        tgt, actual_base = baselines[code]
+        targets[code] = tgt
+        daily_vals[code] = gen_daily_values(actual_base, m["direction"])
+
+    print("-- ============================================================")
+    print(f"-- Demo data for tenant {DEMO_TENANT_ID}, {DAYS} days")
+    print(f"-- Metrics: L1={len(l1s)}, L2={len(l2s)}, L3={len(l3s)}")
+    if overrides:
+        print(f"-- User overrides: {len(overrides)} metrics from template")
+    print("-- ============================================================")
+    print()
+
+    print(f"DELETE FROM ado_s9_kpi_value_l1_day WHERE tenant_id = {DEMO_TENANT_ID};")
+    print(f"DELETE FROM ado_s9_kpi_value_l2_day WHERE tenant_id = {DEMO_TENANT_ID};")
+    print(f"DELETE FROM ado_s9_kpi_value_l3_day WHERE tenant_id = {DEMO_TENANT_ID};")
+    print()
+
+    def emit_inserts(level_list, table, id_base):
+        if not level_list:
+            return
+        print(
+            f"INSERT INTO `{table}` "
+            f"(id, tenant_id, factory_id, biz_date, module_code, metric_code, "
+            f"metric_value, target_value, status_color, trend_flag, is_deleted, is_active) VALUES"
+        )
+        rows = []
+        seq = 0
+        for m in level_list:
+            code = m["metric_code"]
+            tgt = targets[code]
+            vals = daily_vals[code]
+            ov = overrides.get(code, {})
+            y_th = ov.get("yellow_threshold")
+            r_th = ov.get("red_threshold")
+            for i in range(DAYS):
+                seq += 1
+                d = start_date + timedelta(days=i)
+                v = vals[i]
+                sc = status_color(v, tgt, m["direction"], y_th, r_th)
+                tf = trend_flag(vals, i)
+                row_id = id_base + seq
+                rows.append(
+                    f"({row_id},{DEMO_TENANT_ID},{FACTORY_ID},'{d}',"
+                    f"'{m['module_code']}','{code}',{v},{tgt},{esc(sc)},{esc(tf)},0,1)"
+                )
+        for idx, r in enumerate(rows):
+            sep = "," if idx < len(rows) - 1 else ";"
+            print(f"  {r}{sep}")
+        print()
+
+    emit_inserts(l1s, "ado_s9_kpi_value_l1_day", ID_BASE_L1)
+    emit_inserts(l2s, "ado_s9_kpi_value_l2_day", ID_BASE_L2)
+    emit_inserts(l3s, "ado_s9_kpi_value_l3_day", ID_BASE_L3)
+
+    print("-- Done.")
+
+
+if __name__ == "__main__":
+    main()

+ 220 - 0
scripts/gen_demo_template.py

@@ -0,0 +1,220 @@
+#!/usr/bin/env python3
+"""
+生成 Demo 数据 Excel 导入模板
+===============================
+从数据库读取 KpiMaster 指标定义,生成一个带格式的 Excel 模板。
+用户可在 target_value / actual_value 列填入数值,未填的由 gen_demo_data.py 自动生成。
+
+用法:
+  python3 scripts/gen_demo_template.py
+  # 输出: scripts/demo_data_template.xlsx
+"""
+
+import sys
+
+DB_CONFIG = dict(
+    host="123.60.180.165",
+    port=3306,
+    user="aidopremote",
+    password="1234567890aiDOP#",
+    database="aidopdev",
+)
+DEMO_TENANT_ID = 1300000000888
+OUTPUT_PATH = "scripts/demo_data_template.xlsx"
+
+MODULE_NAMES = {
+    "S1": "S1 产销协同",
+    "S2": "S2 运作协同",
+    "S3": "S3 供应协同",
+    "S4": "S4 采购执行",
+    "S5": "S5 原材料仓储",
+    "S6": "S6 制造运作",
+    "S7": "S7 成品仓储",
+    "S8": "S8 工厂监控",
+    "S9": "S9 运营指标",
+}
+
+LEVEL_LABELS = {1: "L1", 2: "L2", 3: "L3"}
+
+
+def connect_db():
+    try:
+        import pymysql
+        return pymysql.connect(**DB_CONFIG)
+    except ImportError:
+        pass
+    try:
+        import mysql.connector
+        return mysql.connector.connect(**DB_CONFIG)
+    except ImportError:
+        pass
+    print("ERROR: 需要 pymysql 或 mysql-connector-python", file=sys.stderr)
+    sys.exit(1)
+
+
+def load_kpi_master(conn):
+    cur = conn.cursor()
+    cur.execute(
+        "SELECT MetricCode, ModuleCode, MetricLevel, MetricName, Unit, Direction, ParentId, Id "
+        "FROM ado_smart_ops_kpi_master WHERE TenantId = %s "
+        "ORDER BY ModuleCode, MetricLevel, SortNo",
+        (DEMO_TENANT_ID,),
+    )
+    rows = cur.fetchall()
+    cur.close()
+    return [
+        dict(
+            metric_code=r[0],
+            module_code=r[1],
+            metric_level=r[2],
+            metric_name=r[3],
+            unit=r[4] or "",
+            direction=r[5] or "higher_is_better",
+            parent_id=r[6],
+            id=r[7],
+        )
+        for r in rows
+    ]
+
+
+def build_template(masters):
+    from openpyxl import Workbook
+    from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
+
+    wb = Workbook()
+    ws = wb.active
+    ws.title = "Demo数据模板"
+
+    header_font = Font(name="微软雅黑", bold=True, size=11, color="FFFFFF")
+    header_fill = PatternFill("solid", fgColor="4472C4")
+    l1_fill = PatternFill("solid", fgColor="D6E4F0")
+    l2_fill = PatternFill("solid", fgColor="E8F0FE")
+    l3_fill = PatternFill("solid", fgColor="F5F5F5")
+    level_fills = {1: l1_fill, 2: l2_fill, 3: l3_fill}
+
+    input_fill = PatternFill("solid", fgColor="FFFFCC")
+    thin_border = Border(
+        left=Side(style="thin"),
+        right=Side(style="thin"),
+        top=Side(style="thin"),
+        bottom=Side(style="thin"),
+    )
+
+    headers = [
+        ("metric_code", "指标编码", 18),
+        ("module_code", "模块", 8),
+        ("module_name", "模块名称", 16),
+        ("metric_level", "层级", 6),
+        ("metric_name", "指标名称", 30),
+        ("unit", "单位", 10),
+        ("direction", "方向", 18),
+        ("target_value", "目标值 ★", 14),
+        ("actual_value", "实际值 ★", 14),
+        ("yellow_threshold", "黄色阈值% ★", 14),
+        ("red_threshold", "红色阈值% ★", 14),
+    ]
+
+    for col_idx, (_, title, width) in enumerate(headers, 1):
+        cell = ws.cell(row=1, column=col_idx, value=title)
+        cell.font = header_font
+        cell.fill = header_fill
+        cell.alignment = Alignment(horizontal="center", vertical="center")
+        cell.border = thin_border
+        ws.column_dimensions[cell.column_letter].width = width
+
+    id_map = {m["id"]: m for m in masters}
+
+    row = 2
+    prev_module = None
+    for m in masters:
+        if m["module_code"] != prev_module:
+            if prev_module is not None:
+                row += 1
+            prev_module = m["module_code"]
+
+        level = m["metric_level"]
+        fill = level_fills.get(level, l3_fill)
+        indent = "  " * (level - 1)
+
+        default_yellow = 110 if m["direction"] == "lower_is_better" else 95
+        default_red = 120 if m["direction"] == "lower_is_better" else 80
+
+        values = [
+            m["metric_code"],
+            m["module_code"],
+            MODULE_NAMES.get(m["module_code"], m["module_code"]),
+            LEVEL_LABELS.get(level, f"L{level}"),
+            indent + m["metric_name"],
+            m["unit"],
+            "越高越好" if m["direction"] == "higher_is_better" else "越低越好",
+            None,
+            None,
+            default_yellow,
+            default_red,
+        ]
+
+        for col_idx, val in enumerate(values, 1):
+            cell = ws.cell(row=row, column=col_idx, value=val)
+            cell.border = thin_border
+            if col_idx <= 7:
+                cell.fill = fill
+            elif col_idx <= 9:
+                cell.fill = input_fill
+            else:
+                cell.fill = input_fill
+            if level == 1:
+                cell.font = Font(name="微软雅黑", bold=True, size=10)
+            else:
+                cell.font = Font(name="微软雅黑", size=10)
+
+        row += 1
+
+    note_row = row + 1
+    ws.cell(row=note_row, column=1, value="★ 填写说明:").font = Font(
+        bold=True, color="C00000", size=10
+    )
+    ws.cell(
+        row=note_row + 1,
+        column=1,
+        value="1. 在「目标值」和「实际值」列填入数值,留空则由系统自动生成。",
+    )
+    ws.cell(
+        row=note_row + 2,
+        column=1,
+        value="2. 支持任意层级填入:可只填 L1,也可填 L2/L3,系统会自动保证父子层级数值自洽。",
+    )
+    ws.cell(
+        row=note_row + 3,
+        column=1,
+        value="3. 若同时填了父/子指标,以实际填入值为准;系统仅对未填的指标自动生成补全。",
+    )
+    ws.cell(
+        row=note_row + 4,
+        column=1,
+        value="4.「实际值」为 30 天日均基准,脚本会在此基础上加每日波动。",
+    )
+    ws.cell(
+        row=note_row + 5,
+        column=1,
+        value="5.「黄色阈值%」「红色阈值%」控制期量差的颜色判定,已预填默认值(越高越好: 95/80,越低越好: 110/120)。",
+    )
+
+    ws.freeze_panes = "A2"
+    ws.auto_filter.ref = f"A1:K{row - 1}"
+
+    wb.save(OUTPUT_PATH)
+    print(f"模板已生成: {OUTPUT_PATH}  ({row - 2} 条指标)")
+
+
+def main():
+    conn = connect_db()
+    masters = load_kpi_master(conn)
+    conn.close()
+    if not masters:
+        print(f"ERROR: 租户 {DEMO_TENANT_ID} 无 KpiMaster 数据", file=sys.stderr)
+        sys.exit(1)
+    build_template(masters)
+
+
+if __name__ == "__main__":
+    main()

+ 60 - 0
scripts/setup-demo-tenant.sql

@@ -0,0 +1,60 @@
+-- ============================================================
+-- Demo 租户初始化脚本(幂等,可重复执行)
+-- 租户 ID: 1300000000888
+-- Demo 管理员账号: DemoAdmin (密码同主租户 Admin.NET)
+-- ============================================================
+
+SET @demo_tid   = 1300000000888;
+SET @demo_orgid = 1300000000888;
+SET @demo_uid   = 1300000000888;
+SET @demo_rid   = 1300000000888;
+
+-- 复用主租户 Admin.NET 的密码哈希
+SET @pwd_hash = (SELECT Password FROM SysUser WHERE Account = 'Admin.NET' AND TenantId = 1300000000001 LIMIT 1);
+
+-- 预读主租户的连接信息
+SET @main_conn   = (SELECT Connection FROM (SELECT Connection FROM SysTenant WHERE Id = 1300000000001) t);
+SET @main_cfgid  = (SELECT ConfigId  FROM (SELECT ConfigId  FROM SysTenant WHERE Id = 1300000000001) t);
+
+-- ── 1. 租户 ──
+INSERT IGNORE INTO SysTenant (Id, UserId, OrgId, Host, TenantType, DbType, Connection, ConfigId,
+    Logo, Title, ViceTitle, ViceDesc, Watermark, Copyright, Icp, IcpUrl,
+    OrderNo, Remark, Status, CreateTime)
+VALUES (@demo_tid, @demo_uid, @demo_orgid, '', 0, 0,
+    @main_conn, @main_cfgid,
+    '/upload/logo.png', 'Demo 演示租户', 'AiDOP Demo', '演示数据隔离', 'DEMO',
+    'Demo Only', '', '', 10, 'Demo 租户,数据与正式隔离', 1, NOW());
+
+-- ── 2. 组织 ──
+INSERT IGNORE INTO SysOrg (Id, Pid, Name, Code, Level, OrderNo, Status, Remark, TenantId, CreateTime)
+VALUES (@demo_orgid, 0, 'Demo默认组织', 'DEMO01', 1, 100, 1, 'Demo 租户根组织', @demo_tid, NOW());
+
+-- ── 3. 角色(系统管理员) ──
+INSERT IGNORE INTO SysRole (Id, Name, Code, OrderNo, DataScope, Remark, Status, TenantId, CreateTime)
+VALUES (@demo_rid, '系统管理员', 'demo_admin', 100, 1, 'Demo 管理员角色', 1, @demo_tid, NOW());
+
+-- ── 4. 角色菜单(复制主租户管理员的菜单权限) ──
+DELETE FROM SysRoleMenu WHERE RoleId = @demo_rid;
+SET @rn = 0;
+INSERT INTO SysRoleMenu (Id, RoleId, MenuId)
+SELECT 1300000888000 + (@rn := @rn + 1), @demo_rid, MenuId
+FROM SysRoleMenu WHERE RoleId = 1300000000101;
+
+-- ── 5. 租户菜单(复制主租户的菜单授权) ──
+DELETE FROM SysTenantMenu WHERE TenantId = @demo_tid;
+SET @tn = 0;
+INSERT INTO SysTenantMenu (Id, TenantId, MenuId)
+SELECT 1300008880000 + (@tn := @tn + 1), @demo_tid, MenuId
+FROM SysTenantMenu WHERE TenantId = 1300000000001;
+
+-- ── 6. 用户 ──
+INSERT IGNORE INTO SysUser (Id, Account, Password, RealName, NickName, Sex, Age, CardType, OrderNo,
+    Status, AccountType, OrgId, PosId, TenantId, CreateTime)
+VALUES (@demo_uid, 'DemoAdmin', @pwd_hash, 'Demo管理员', 'Demo管理员',
+    0, 0, 0, 100, 1, 888, @demo_orgid, 0, @demo_tid, NOW());
+
+-- ── 7. 用户角色关联 ──
+INSERT IGNORE INTO SysUserRole (UserId, RoleId)
+VALUES (@demo_uid, @demo_rid);
+
+SELECT 'Demo tenant setup complete.' AS result;

+ 17 - 0
server/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -40,6 +40,23 @@ public static class SqlSugarSetup
         };
 
         var dbOptions = App.GetConfig<DbConnectionOptions>("DbConnection", true);
+        // Docker 等对已有库部署:避免每次启动跑 CodeFirst/全量种子导致冲突(见 docker-compose 环境变量 DOCKER_SKIP_DBINIT)
+        if (string.Equals(Environment.GetEnvironmentVariable("DOCKER_SKIP_DBINIT"), "1", StringComparison.Ordinal)
+            && dbOptions.ConnectionConfigs != null)
+        {
+            foreach (var c in dbOptions.ConnectionConfigs)
+            {
+                if (c.DbSettings != null)
+                {
+                    c.DbSettings.EnableInitDb = false;
+                    c.DbSettings.EnableInitView = false;
+                }
+                if (c.TableSettings != null)
+                    c.TableSettings.EnableInitTable = false;
+                if (c.SeedSettings != null)
+                    c.SeedSettings.EnableInitSeed = false;
+            }
+        }
         dbOptions.ConnectionConfigs.ForEach(SetDbConfig);
 
         SqlSugarScope sqlSugar = new(dbOptions.ConnectionConfigs.Adapt<List<ConnectionConfig>>(), db =>

+ 3 - 3
server/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

@@ -11,9 +11,9 @@
     <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
     <Copyright>Admin.NET</Copyright>
     <Description>Admin.NET 通用权限开发平台</Description>
-    <AssemblyVersion>1.0.2</AssemblyVersion>
-    <FileVersion>1.0.2</FileVersion>
-    <Version>1.0.2</Version>
+    <AssemblyVersion>1.0.10</AssemblyVersion>
+    <FileVersion>1.0.10</FileVersion>
+    <Version>1.0.10</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 9 - 15
server/Admin.NET.Web.Entry/Dockerfile

@@ -1,18 +1,12 @@
-FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
+# 可选:在已执行 dotnet publish -f net8.0 的「输出目录」内放本文件后构建运行时镜像:
+#   docker build -t aidop-api:local .
+# 推荐:使用仓库根目录多阶段构建(无需本机 SDK):
+#   docker build -f docker/Dockerfile.api -t aidop-api:latest ..
+
+FROM mcr.microsoft.com/dotnet/aspnet:8.0-bookworm-slim
 WORKDIR /app
 EXPOSE 5005
-
+ENV ASPNETCORE_URLS=http://0.0.0.0:5005 \
+    LANG=zh-Hans.UTF-8
 COPY . .
-
-# 设置语言/区域设置环境变量
-ENV LANG zh-Hans
-
-# 使用阿里云的镜像源进行更新
-# .NET6使用
-RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/' /etc/apt/sources.list
-# .NET8使用
-# RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/' /etc/apt/sources.list.d/debian.sources
-# 更新包管理器并安装free命令
-RUN apt-get update && apt-get install -y procps
-
-ENTRYPOINT ["dotnet", "Admin.NET.Web.Entry.dll"]
+ENTRYPOINT ["dotnet", "Admin.NET.Web.Entry.dll"]

+ 562 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Controllers/AdoSmartOpsKpiMasterController.cs

@@ -0,0 +1,562 @@
+using Admin.NET.Core;
+using Admin.NET.Plugin.AiDOP.Dto.SmartOps;
+using Admin.NET.Plugin.AiDOP.Entity;
+using Admin.NET.Plugin.AiDOP.Infrastructure;
+using Microsoft.AspNetCore.Http;
+using MiniExcelLibs;
+using SqlSugar;
+
+namespace Admin.NET.Plugin.AiDOP.Controllers;
+
+[ApiController]
+[Route("api/[controller]")]
+[AllowAnonymous]
+[NonUnify]
+public class AdoSmartOpsKpiMasterController : ControllerBase
+{
+    private readonly ISqlSugarClient _db;
+
+    public AdoSmartOpsKpiMasterController(ISqlSugarClient db)
+    {
+        _db = db;
+    }
+
+    /// <summary>获取树形结构(左侧树用)</summary>
+    [HttpGet("tree")]
+    public async Task<IActionResult> GetTree([FromQuery] string? moduleCode = null, [FromQuery] string? keyword = null)
+    {
+        var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
+        var q = _db.Queryable<AdoSmartOpsKpiMaster>().Where(x => x.TenantId == tenantId);
+        if (!string.IsNullOrWhiteSpace(moduleCode))
+            q = q.Where(x => x.ModuleCode == moduleCode);
+        if (!string.IsNullOrWhiteSpace(keyword))
+            q = q.Where(x => x.MetricName.Contains(keyword) || x.MetricCode.Contains(keyword));
+
+        var all = await q.OrderBy(x => x.SortNo).ToListAsync();
+        var nodes = all.Select(x => new KpiMasterTreeNodeDto
+        {
+            Id = x.Id,
+            MetricCode = x.MetricCode,
+            ModuleCode = x.ModuleCode,
+            MetricLevel = x.MetricLevel,
+            MetricName = x.MetricName,
+            ParentId = x.ParentId,
+            SortNo = x.SortNo,
+            IsEnabled = x.IsEnabled
+        }).ToList();
+
+        if (!string.IsNullOrWhiteSpace(keyword))
+        {
+            var matchIds = new HashSet<long>(nodes.Select(n => n.Id));
+            var allForAncestor = await _db.Queryable<AdoSmartOpsKpiMaster>()
+                .Where(x => x.TenantId == tenantId)
+                .WhereIF(!string.IsNullOrWhiteSpace(moduleCode), x => x.ModuleCode == moduleCode)
+                .ToListAsync();
+            var byId = allForAncestor.ToDictionary(x => x.Id);
+            var needed = new HashSet<long>(matchIds);
+            foreach (var id in matchIds)
+            {
+                var cur = byId.GetValueOrDefault(id);
+                while (cur?.ParentId != null && needed.Add(cur.ParentId.Value))
+                    cur = byId.GetValueOrDefault(cur.ParentId.Value);
+            }
+            var extra = allForAncestor.Where(x => needed.Contains(x.Id) && !matchIds.Contains(x.Id));
+            foreach (var x in extra)
+                nodes.Add(new KpiMasterTreeNodeDto
+                {
+                    Id = x.Id, MetricCode = x.MetricCode, ModuleCode = x.ModuleCode,
+                    MetricLevel = x.MetricLevel, MetricName = x.MetricName,
+                    ParentId = x.ParentId, SortNo = x.SortNo, IsEnabled = x.IsEnabled
+                });
+        }
+
+        var tree = BuildTree(nodes);
+        return Ok(tree);
+    }
+
+    /// <summary>获取单条详情(右侧面板用)</summary>
+    [HttpGet("{id:long}")]
+    public async Task<IActionResult> GetDetail(long id)
+    {
+        var e = await _db.Queryable<AdoSmartOpsKpiMaster>().FirstAsync(x => x.Id == id);
+        if (e == null) return NotFound();
+
+        string? parentName = null;
+        if (e.ParentId.HasValue)
+        {
+            var p = await _db.Queryable<AdoSmartOpsKpiMaster>().FirstAsync(x => x.Id == e.ParentId.Value);
+            parentName = p?.MetricName;
+        }
+
+        return Ok(new KpiMasterDetailDto
+        {
+            Id = e.Id, MetricCode = e.MetricCode, ModuleCode = e.ModuleCode,
+            MetricLevel = e.MetricLevel, ParentId = e.ParentId, ParentName = parentName,
+            MetricName = e.MetricName, Description = e.Description, Formula = e.Formula,
+            CalcRule = e.CalcRule, DataSource = e.DataSource, StatFrequency = e.StatFrequency,
+            Department = e.Department, DopFields = e.DopFields, Unit = e.Unit,
+            Direction = e.Direction,
+            YellowThreshold = e.YellowThreshold, RedThreshold = e.RedThreshold,
+            IsHomePage = e.IsHomePage, SortNo = e.SortNo,
+            Remark = e.Remark, IsEnabled = e.IsEnabled, TenantId = e.TenantId.GetValueOrDefault(),
+            CreatedAt = e.CreatedAt, UpdatedAt = e.UpdatedAt
+        });
+    }
+
+    /// <summary>新增指标(MetricCode 自动生成)</summary>
+    [HttpPost]
+    public async Task<IActionResult> Create([FromBody] KpiMasterUpsertDto dto)
+    {
+        if (string.IsNullOrWhiteSpace(dto.MetricName))
+            return BadRequest(new { message = "指标名称不能为空" });
+        if (dto.MetricLevel < 1 || dto.MetricLevel > 3)
+            return BadRequest(new { message = "层级必须为 1/2/3" });
+        if (dto.MetricLevel > 1 && dto.ParentId == null)
+            return BadRequest(new { message = "L2/L3 必须指定父指标" });
+
+        var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
+        var code = await GenerateMetricCodeAsync(dto.ModuleCode, dto.MetricLevel, tenantId);
+
+        var entity = new AdoSmartOpsKpiMaster
+        {
+            MetricCode = code,
+            ModuleCode = dto.ModuleCode,
+            MetricLevel = dto.MetricLevel,
+            ParentId = dto.ParentId,
+            MetricName = dto.MetricName,
+            Description = dto.Description,
+            Formula = dto.Formula,
+            CalcRule = dto.CalcRule,
+            DataSource = dto.DataSource,
+            StatFrequency = dto.StatFrequency,
+            Department = dto.Department,
+            DopFields = dto.DopFields,
+            Unit = dto.Unit,
+            Direction = dto.Direction,
+            YellowThreshold = dto.YellowThreshold,
+            RedThreshold = dto.RedThreshold,
+            IsHomePage = dto.IsHomePage,
+            SortNo = dto.SortNo,
+            Remark = dto.Remark,
+            IsEnabled = dto.IsEnabled,
+            TenantId = tenantId,
+            CreatedAt = DateTime.Now
+        };
+
+        var newId = await _db.Insertable(entity).ExecuteReturnBigIdentityAsync();
+        entity.Id = newId;
+        return Ok(new { id = newId, metricCode = code });
+    }
+
+    /// <summary>编辑指标</summary>
+    [HttpPut("{id:long}")]
+    public async Task<IActionResult> Update(long id, [FromBody] KpiMasterUpsertDto dto)
+    {
+        var entity = await _db.Queryable<AdoSmartOpsKpiMaster>().FirstAsync(x => x.Id == id);
+        if (entity == null) return NotFound();
+
+        entity.ModuleCode = dto.ModuleCode;
+        entity.MetricLevel = dto.MetricLevel;
+        entity.ParentId = dto.ParentId;
+        entity.MetricName = dto.MetricName;
+        entity.Description = dto.Description;
+        entity.Formula = dto.Formula;
+        entity.CalcRule = dto.CalcRule;
+        entity.DataSource = dto.DataSource;
+        entity.StatFrequency = dto.StatFrequency;
+        entity.Department = dto.Department;
+        entity.DopFields = dto.DopFields;
+        entity.Unit = dto.Unit;
+        entity.Direction = dto.Direction;
+        entity.YellowThreshold = dto.YellowThreshold;
+        entity.RedThreshold = dto.RedThreshold;
+        entity.IsHomePage = dto.IsHomePage;
+        entity.SortNo = dto.SortNo;
+        entity.Remark = dto.Remark;
+        entity.IsEnabled = dto.IsEnabled;
+        entity.UpdatedAt = DateTime.Now;
+
+        await _db.Updateable(entity).ExecuteCommandAsync();
+        return Ok(new { ok = true });
+    }
+
+    /// <summary>删除指标(含子节点级联删除)</summary>
+    [HttpDelete("{id:long}")]
+    public async Task<IActionResult> Delete(long id)
+    {
+        var entity = await _db.Queryable<AdoSmartOpsKpiMaster>().FirstAsync(x => x.Id == id);
+        if (entity == null) return NotFound();
+
+        var idsToDelete = new List<long> { id };
+        await CollectChildIds(id, idsToDelete);
+
+        await _db.Deleteable<AdoSmartOpsKpiMaster>().Where(x => idsToDelete.Contains(x.Id)).ExecuteCommandAsync();
+        return Ok(new { ok = true, deletedCount = idsToDelete.Count });
+    }
+
+    /// <summary>启用/禁用</summary>
+    [HttpPatch("{id:long}/toggle-enabled")]
+    public async Task<IActionResult> ToggleEnabled(long id)
+    {
+        var entity = await _db.Queryable<AdoSmartOpsKpiMaster>().FirstAsync(x => x.Id == id);
+        if (entity == null) return NotFound();
+
+        entity.IsEnabled = !entity.IsEnabled;
+        entity.UpdatedAt = DateTime.Now;
+        await _db.Updateable(entity).UpdateColumns(x => new { x.IsEnabled, x.UpdatedAt }).ExecuteCommandAsync();
+        return Ok(new { ok = true, isEnabled = entity.IsEnabled });
+    }
+
+    /// <summary>批量更新排序</summary>
+    [HttpPut("sort")]
+    public async Task<IActionResult> UpdateSort([FromBody] List<KpiMasterSortItemDto> items)
+    {
+        if (items == null || items.Count == 0)
+            return BadRequest(new { message = "排序列表不能为空" });
+
+        foreach (var item in items)
+        {
+            await _db.Updateable<AdoSmartOpsKpiMaster>()
+                .SetColumns(x => new AdoSmartOpsKpiMaster { SortNo = item.SortNo, UpdatedAt = DateTime.Now })
+                .Where(x => x.Id == item.Id)
+                .ExecuteCommandAsync();
+        }
+        return Ok(new { ok = true });
+    }
+
+    /// <summary>拖拽移动(变更 ParentId + SortNo)</summary>
+    [HttpPut("{id:long}/move")]
+    public async Task<IActionResult> Move(long id, [FromBody] KpiMasterMoveDto dto)
+    {
+        var entity = await _db.Queryable<AdoSmartOpsKpiMaster>().FirstAsync(x => x.Id == id);
+        if (entity == null) return NotFound();
+
+        if (dto.NewParentId.HasValue)
+        {
+            var parent = await _db.Queryable<AdoSmartOpsKpiMaster>().FirstAsync(x => x.Id == dto.NewParentId.Value);
+            if (parent == null) return BadRequest(new { message = "目标父节点不存在" });
+            if (parent.MetricLevel >= entity.MetricLevel)
+                return BadRequest(new { message = "不能移动到同级或更低层级下" });
+            entity.ParentId = dto.NewParentId;
+            entity.MetricLevel = parent.MetricLevel + 1;
+        }
+        else
+        {
+            entity.ParentId = null;
+            entity.MetricLevel = 1;
+        }
+
+        entity.SortNo = dto.NewSortNo;
+        entity.UpdatedAt = DateTime.Now;
+        await _db.Updateable(entity).ExecuteCommandAsync();
+        return Ok(new { ok = true });
+    }
+
+    /// <summary>导入 Demo 数据(上传 Excel,解析后生成 30 天日值写入 DB)</summary>
+    [HttpPost("import-demo-data")]
+    public async Task<IActionResult> ImportDemoData(IFormFile file)
+    {
+        if (file == null || file.Length == 0)
+            return BadRequest(new { message = "请上传 Excel 文件" });
+
+        var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
+        const int DAYS = 30;
+        var today = DateTime.Today;
+        var startDate = today.AddDays(-(DAYS - 1));
+
+        using var stream = new MemoryStream();
+        await file.CopyToAsync(stream);
+        stream.Position = 0;
+
+        var rows = stream.Query(useHeaderRow: true).ToList();
+
+        var masters = await _db.Queryable<AdoSmartOpsKpiMaster>()
+            .Where(x => x.TenantId == tenantId)
+            .ToListAsync();
+        var masterByCode = masters.ToDictionary(m => m.MetricCode, m => m);
+
+        var excelOverrides = new Dictionary<string, DemoImportRow>();
+        foreach (IDictionary<string, object> row in rows)
+        {
+            object? Val(string key) => row.TryGetValue(key, out var v) ? v : null;
+
+            var code = Val("指标编码")?.ToString()?.Trim();
+            if (string.IsNullOrEmpty(code) || !code.StartsWith("S")) continue;
+            if (!masterByCode.TryGetValue(code, out var master)) continue;
+
+            decimal? target = TryDecimal(Val("目标值 ★"));
+            decimal? actual = TryDecimal(Val("实际值 ★"));
+            decimal? yellowTh = TryDecimal(Val("黄色阈值% ★"));
+            decimal? redTh = TryDecimal(Val("红色阈值% ★"));
+
+            excelOverrides[code] = new DemoImportRow
+            {
+                MetricCode = code,
+                Master = master,
+                Target = target ?? 0,
+                Actual = actual ?? 0,
+                HasTarget = target != null,
+                HasActual = actual != null,
+                YellowThreshold = yellowTh,
+                RedThreshold = redTh,
+            };
+        }
+
+        var rng = new Random(42);
+        var parsed = new List<DemoImportRow>();
+        foreach (var m in masters)
+        {
+            if (excelOverrides.TryGetValue(m.MetricCode, out var ov))
+            {
+                var tgt = ov.HasTarget ? ov.Target : ov.HasActual ? ov.Actual * 1.05m : AutoTarget(m, rng);
+                var act = ov.HasActual ? ov.Actual : ov.HasTarget ? ov.Target * AutoActualFactor(m, rng) : AutoActual(AutoTarget(m, rng), m, rng);
+                parsed.Add(new DemoImportRow
+                {
+                    MetricCode = m.MetricCode, Master = m,
+                    Target = tgt, Actual = act,
+                    HasTarget = true, HasActual = true,
+                    YellowThreshold = ov.YellowThreshold, RedThreshold = ov.RedThreshold,
+                });
+            }
+            else
+            {
+                var tgt = AutoTarget(m, rng);
+                var act = AutoActual(tgt, m, rng);
+                parsed.Add(new DemoImportRow
+                {
+                    MetricCode = m.MetricCode, Master = m,
+                    Target = tgt, Actual = act,
+                    HasTarget = true, HasActual = true,
+                    YellowThreshold = null, RedThreshold = null,
+                });
+            }
+        }
+
+        foreach (var p in parsed)
+        {
+            if (p.YellowThreshold != null || p.RedThreshold != null)
+            {
+                var m = p.Master;
+                if (p.YellowThreshold != null) m.YellowThreshold = p.YellowThreshold;
+                if (p.RedThreshold != null) m.RedThreshold = p.RedThreshold;
+                m.UpdatedAt = DateTime.Now;
+                await _db.Updateable(m)
+                    .UpdateColumns(x => new { x.YellowThreshold, x.RedThreshold, x.UpdatedAt })
+                    .ExecuteCommandAsync();
+            }
+        }
+
+        var l1 = parsed.Where(p => p.Master.MetricLevel == 1).ToList();
+        var l2 = parsed.Where(p => p.Master.MetricLevel == 2).ToList();
+        var l3 = parsed.Where(p => p.Master.MetricLevel == 3).ToList();
+
+        await _db.Ado.ExecuteCommandAsync(
+            $"DELETE FROM ado_s9_kpi_value_l1_day WHERE tenant_id = {tenantId}");
+        await _db.Ado.ExecuteCommandAsync(
+            $"DELETE FROM ado_s9_kpi_value_l2_day WHERE tenant_id = {tenantId}");
+        await _db.Ado.ExecuteCommandAsync(
+            $"DELETE FROM ado_s9_kpi_value_l3_day WHERE tenant_id = {tenantId}");
+
+        long seq = 0;
+        async Task InsertLevel(List<DemoImportRow> items, string table)
+        {
+            if (items.Count == 0) return;
+            var levelRng = new Random(42);
+            var batchValues = new List<string>();
+            foreach (var p in items)
+            {
+                var dir = p.Master.Direction ?? "higher_is_better";
+                var yTh = p.YellowThreshold ?? p.Master.YellowThreshold;
+                var rTh = p.RedThreshold ?? p.Master.RedThreshold;
+                decimal prevVal = p.Actual;
+
+                for (int i = 0; i < DAYS; i++)
+                {
+                    seq++;
+                    var d = startDate.AddDays(i);
+                    decimal val;
+                    if (i == DAYS - 1)
+                        val = p.Actual;
+                    else
+                    {
+                        var noise = (decimal)(levelRng.NextDouble() * 0.06 - 0.03);
+                        val = Math.Max(0, p.Actual * (1 + noise));
+                    }
+                    val = Math.Round(val, 4);
+                    var sc = AidopS4KpiMerge.AchievementLevel(val, p.Target, dir, yTh, rTh);
+                    var tf = "flat";
+                    if (i > 0)
+                    {
+                        var change = prevVal == 0 ? 0 : (val - prevVal) / prevVal;
+                        tf = change > 0.02m ? "up" : change < -0.02m ? "down" : "flat";
+                    }
+                    prevVal = val;
+
+                    batchValues.Add(
+                        $"({seq},{tenantId},1,'{d:yyyy-MM-dd}'," +
+                        $"'{p.Master.ModuleCode}','{p.MetricCode}',{val},{p.Target},'{sc}','{tf}',0,1)");
+                }
+            }
+
+            const int BATCH = 500;
+            for (int i = 0; i < batchValues.Count; i += BATCH)
+            {
+                var chunk = batchValues.Skip(i).Take(BATCH);
+                var sql = $"INSERT INTO `{table}` " +
+                    "(id,tenant_id,factory_id,biz_date,module_code,metric_code," +
+                    "metric_value,target_value,status_color,trend_flag,is_deleted,is_active) VALUES\n" +
+                    string.Join(",\n", chunk);
+                await _db.Ado.ExecuteCommandAsync(sql);
+            }
+        }
+
+        await InsertLevel(l1, "ado_s9_kpi_value_l1_day");
+        await InsertLevel(l2, "ado_s9_kpi_value_l2_day");
+        await InsertLevel(l3, "ado_s9_kpi_value_l3_day");
+
+        var fromExcel = excelOverrides.Values.Count(v => v.HasTarget || v.HasActual);
+        return Ok(new
+        {
+            ok = true,
+            message = $"导入成功:Excel 填入 {fromExcel} 条,自动补全 {parsed.Count - fromExcel} 条,共 {parsed.Count} 条指标 × {DAYS} 天",
+            detail = new { l1 = l1.Count, l2 = l2.Count, l3 = l3.Count, days = DAYS, fromExcel, autoGen = parsed.Count - fromExcel }
+        });
+    }
+
+    /// <summary>下载 Demo 数据 Excel 模板</summary>
+    [HttpGet("demo-template")]
+    public async Task<IActionResult> DownloadDemoTemplate()
+    {
+        var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
+        var masters = await _db.Queryable<AdoSmartOpsKpiMaster>()
+            .Where(x => x.TenantId == tenantId)
+            .OrderBy(x => x.ModuleCode).OrderBy(x => x.MetricLevel).OrderBy(x => x.SortNo)
+            .ToListAsync();
+
+        var templateRows = masters.Select(m => new Dictionary<string, object>
+        {
+            ["指标编码"] = m.MetricCode,
+            ["模块"] = m.ModuleCode,
+            ["层级"] = $"L{m.MetricLevel}",
+            ["指标名称"] = m.MetricName,
+            ["单位"] = m.Unit ?? "",
+            ["方向"] = m.Direction == "lower_is_better" ? "越低越好" : "越高越好",
+            ["目标值 ★"] = (object)null!,
+            ["实际值 ★"] = (object)null!,
+            ["黄色阈值% ★"] = (object)(m.YellowThreshold ?? (m.Direction == "lower_is_better" ? 110m : 95m)),
+            ["红色阈值% ★"] = (object)(m.RedThreshold ?? (m.Direction == "lower_is_better" ? 120m : 80m)),
+        }).ToList();
+
+        var ms = new MemoryStream();
+        await ms.SaveAsAsync(templateRows);
+        ms.Position = 0;
+
+        return new FileStreamResult(ms, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
+        {
+            FileDownloadName = $"demo_data_template_{DateTime.Now:yyyyMMdd}.xlsx"
+        };
+    }
+
+    private static decimal? TryDecimal(object? val)
+    {
+        if (val == null) return null;
+        var s = val.ToString()?.Trim();
+        if (string.IsNullOrEmpty(s)) return null;
+        return decimal.TryParse(s, out var d) ? d : null;
+    }
+
+    private sealed class DemoImportRow
+    {
+        public string MetricCode { get; set; } = "";
+        public AdoSmartOpsKpiMaster Master { get; set; } = null!;
+        public decimal Target { get; set; }
+        public decimal Actual { get; set; }
+        public bool HasTarget { get; set; }
+        public bool HasActual { get; set; }
+        public decimal? YellowThreshold { get; set; }
+        public decimal? RedThreshold { get; set; }
+    }
+
+    private static decimal AutoTarget(AdoSmartOpsKpiMaster m, Random rng)
+    {
+        var unit = (m.Unit ?? "").Trim();
+        if (unit == "%") return Math.Round((decimal)(rng.NextDouble() * 18 + 80), 2);
+        if (unit == "天") return Math.Round((decimal)(rng.NextDouble() * 13 + 2), 2);
+        if (unit.Contains("PPM")) return Math.Round((decimal)(rng.NextDouble() * 5000 + 3000), 0);
+        if (unit.Contains("/")) return Math.Round((decimal)(rng.NextDouble() * 250 + 50), 2);
+        if (unit is "个" or "颗/人" or "家/人" or "小时" or "颗/人" or "人")
+            return Math.Round((decimal)(rng.NextDouble() * 195 + 5), 0);
+        return Math.Round((decimal)(rng.NextDouble() * 150 + 50), 2);
+    }
+
+    private static decimal AutoActual(decimal target, AdoSmartOpsKpiMaster m, Random rng)
+    {
+        var factor = (m.Direction == "lower_is_better")
+            ? (decimal)(rng.NextDouble() * 0.35 + 0.90)
+            : (decimal)(rng.NextDouble() * 0.23 + 0.82);
+        return Math.Round(target * factor, 4);
+    }
+
+    private static decimal AutoActualFactor(AdoSmartOpsKpiMaster m, Random rng)
+    {
+        return (m.Direction == "lower_is_better")
+            ? (decimal)(rng.NextDouble() * 0.35 + 0.90)
+            : (decimal)(rng.NextDouble() * 0.23 + 0.82);
+    }
+
+    // ── 私有方法 ──
+
+    private async Task<string> GenerateMetricCodeAsync(string moduleCode, int level, long tenantId)
+    {
+        var prefix = $"{moduleCode}_L{level}_";
+        var maxCode = await _db.Queryable<AdoSmartOpsKpiMaster>()
+            .Where(x => x.TenantId == tenantId && x.ModuleCode == moduleCode && x.MetricLevel == level)
+            .OrderByDescending(x => x.MetricCode)
+            .Select(x => x.MetricCode)
+            .FirstAsync();
+
+        var seq = 1;
+        if (!string.IsNullOrEmpty(maxCode) && maxCode.StartsWith(prefix) && int.TryParse(maxCode[prefix.Length..], out var n))
+            seq = n + 1;
+
+        return $"{prefix}{seq:D3}";
+    }
+
+    private async Task CollectChildIds(long parentId, List<long> result)
+    {
+        var children = await _db.Queryable<AdoSmartOpsKpiMaster>()
+            .Where(x => x.ParentId == parentId)
+            .Select(x => x.Id)
+            .ToListAsync();
+        foreach (var cid in children)
+        {
+            result.Add(cid);
+            await CollectChildIds(cid, result);
+        }
+    }
+
+    private static List<KpiMasterTreeNodeDto> BuildTree(List<KpiMasterTreeNodeDto> flat)
+    {
+        var byId = flat.ToDictionary(n => n.Id);
+        var roots = new List<KpiMasterTreeNodeDto>();
+        foreach (var n in flat)
+        {
+            if (n.ParentId.HasValue && byId.TryGetValue(n.ParentId.Value, out var parent))
+                parent.Children.Add(n);
+            else
+                roots.Add(n);
+        }
+        SortChildren(roots);
+        return roots;
+    }
+
+    private static void SortChildren(List<KpiMasterTreeNodeDto> nodes)
+    {
+        nodes.Sort((a, b) => a.SortNo.CompareTo(b.SortNo));
+        foreach (var n in nodes)
+        {
+            if (n.Children.Count > 0)
+                SortChildren(n.Children);
+        }
+    }
+}

+ 394 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Controllers/AidopKanbanController.S4.cs

@@ -0,0 +1,394 @@
+using Admin.NET.Plugin.AiDOP.Entity;
+using Admin.NET.Plugin.AiDOP.Infrastructure;
+using SqlSugar;
+
+namespace Admin.NET.Plugin.AiDOP.Controllers;
+
+public partial class AidopKanbanController
+{
+    public const int MaxL1PerModule = 8;
+
+    /// <summary>S4 指标列表(从 KpiMaster 读取,可按层级过滤)。</summary>
+    [HttpGet("s4-metric-catalog")]
+    public async Task<IActionResult> GetS4MetricCatalog([FromQuery] int? metricLevel = null)
+    {
+        var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
+        var q = _db.Queryable<AdoSmartOpsKpiMaster>()
+            .Where(x => x.TenantId == tenantId && x.ModuleCode == "S4" && x.IsEnabled);
+        if (metricLevel is > 0)
+            q = q.Where(x => x.MetricLevel == metricLevel);
+        var list = await q.OrderBy(x => x.SortNo).ToListAsync();
+        return Ok(list.Select(x => new
+        {
+            id = x.Id,
+            metricCode = x.MetricCode,
+            moduleCode = x.ModuleCode,
+            metricLevel = x.MetricLevel,
+            defaultName = x.MetricName,
+            unit = x.Unit,
+            direction = x.Direction,
+            sortHint = x.SortNo,
+            parentId = x.ParentId,
+            description = x.Description,
+            formula = x.Formula,
+            calcRule = x.CalcRule,
+            dataSource = x.DataSource,
+            statFrequency = x.StatFrequency,
+            department = x.Department
+        }));
+    }
+
+    /// <summary>S4 运营布局(L1/L2/L3 + 九宫格模块行)。</summary>
+    [HttpGet("s4-operation-layout")]
+    public async Task<IActionResult> GetS4OperationLayout([FromQuery] long factoryId = 1)
+    {
+        var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
+        var hm = (await _db.Queryable<AdoSmartOpsHomeModule>()
+            .Where(x => x.TenantId == tenantId && x.FactoryId == factoryId && x.ModuleCode == "S4")
+            .ToListAsync()).FirstOrDefault();
+        var items = await _db.Queryable<AdoSmartOpsLayoutItem>()
+            .Where(x => x.TenantId == tenantId && x.FactoryId == factoryId && x.ModuleCode == "S4" && x.IsEnabled == 1)
+            .OrderBy(x => x.SortNo)
+            .ToListAsync();
+        var kpi = await _db.Queryable<AdoSmartOpsKpiMaster>().Where(x => x.TenantId == tenantId && x.ModuleCode == "S4").ToListAsync();
+        var kpiByCode = kpi.ToDictionary(x => x.MetricCode, StringComparer.OrdinalIgnoreCase);
+
+        object Row(AdoSmartOpsLayoutItem r)
+        {
+            kpiByCode.TryGetValue(r.MetricCode, out var k);
+            return new
+            {
+                rowId = r.RowId,
+                metricCode = r.MetricCode,
+                metricLevel = r.MetricLevel,
+                displayName = string.IsNullOrWhiteSpace(r.DisplayName) ? k?.MetricName : r.DisplayName,
+                sortNo = r.SortNo,
+                parentRowId = r.ParentRowId,
+                formulaText = r.FormulaText,
+                panelZone = r.PanelZone,
+                unit = k?.Unit,
+                direction = k?.Direction
+            };
+        }
+
+        return Ok(new
+        {
+            layoutPattern = hm?.LayoutPattern ?? "card_grid",
+            l1 = items.Where(x => x.MetricLevel == 1).Select(Row).ToList(),
+            l2 = items.Where(x => x.MetricLevel >= 2).Select(Row).ToList()
+        });
+    }
+
+    public class S4LayoutSaveDto
+    {
+        public List<S4LayoutL1Dto>? L1 { get; set; }
+        public List<S4LayoutL2Dto>? L2 { get; set; }
+    }
+
+    public class S4LayoutL1Dto
+    {
+        public string? RowId { get; set; }
+        public string? MetricCode { get; set; }
+        public string? DisplayName { get; set; }
+        public int SortNo { get; set; }
+        public string? FormulaText { get; set; }
+    }
+
+    public class S4LayoutL2Dto
+    {
+        public string? RowId { get; set; }
+        public string? MetricCode { get; set; }
+        public string? DisplayName { get; set; }
+        public int SortNo { get; set; }
+        public string? ParentRowId { get; set; }
+        public string? FormulaText { get; set; }
+        public string? PanelZone { get; set; }
+    }
+
+    /// <summary>保存 S4 布局并同步更新 KpiMaster;L1 最多 8 条。</summary>
+    [HttpPut("s4-operation-layout")]
+    public async Task<IActionResult> PutS4OperationLayout([FromBody] S4LayoutSaveDto? body, [FromQuery] long factoryId = 1)
+    {
+        var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
+        if (body?.L1 == null || body.L2 == null)
+            return BadRequest(new { message = "L1/L2 不能为空" });
+        if (body.L1.Count > MaxL1PerModule)
+            return BadRequest(new { message = $"L1 最多 {MaxL1PerModule} 个" });
+
+        var kpiAll = await _db.Queryable<AdoSmartOpsKpiMaster>()
+            .Where(x => x.TenantId == tenantId && x.ModuleCode == "S4" && x.IsEnabled)
+            .ToListAsync();
+        var kpiByCode = kpiAll.ToDictionary(x => x.MetricCode, StringComparer.OrdinalIgnoreCase);
+
+        foreach (var r in body.L1)
+        {
+            if (string.IsNullOrWhiteSpace(r.MetricCode) || !kpiByCode.TryGetValue(r.MetricCode.Trim(), out var k) || k.MetricLevel != 1)
+                return BadRequest(new { message = $"无效的 L1 指标: {r.MetricCode}" });
+        }
+
+        var l1Ids = new HashSet<string>(StringComparer.Ordinal);
+        foreach (var r in body.L1)
+        {
+            var rid = string.IsNullOrWhiteSpace(r.RowId) ? $"S4-L1-{r.MetricCode!.Trim()}" : r.RowId.Trim();
+            if (!l1Ids.Add(rid))
+                return BadRequest(new { message = $"重复的 L1 RowId: {rid}" });
+        }
+
+        foreach (var r in body.L2)
+        {
+            if (string.IsNullOrWhiteSpace(r.MetricCode) || !kpiByCode.TryGetValue(r.MetricCode.Trim(), out var k) || k.MetricLevel < 2)
+                return BadRequest(new { message = $"无效的 L2/L3 指标: {r.MetricCode}" });
+        }
+
+        var now = DateTime.Now;
+        try
+        {
+            _db.Ado.BeginTran();
+
+            // -- 保存 LayoutItem --
+            await _db.Deleteable<AdoSmartOpsLayoutItem>()
+                .Where(x => x.TenantId == tenantId && x.FactoryId == factoryId && x.ModuleCode == "S4")
+                .ExecuteCommandAsync();
+
+            var rows = new List<AdoSmartOpsLayoutItem>();
+            foreach (var r in body.L1)
+            {
+                var rid = string.IsNullOrWhiteSpace(r.RowId) ? $"S4-L1-{r.MetricCode!.Trim()}" : r.RowId.Trim();
+                rows.Add(new AdoSmartOpsLayoutItem
+                {
+                    TenantId = tenantId, FactoryId = factoryId, ModuleCode = "S4",
+                    RowId = rid, MetricLevel = 1, MetricCode = r.MetricCode!.Trim(),
+                    DisplayName = string.IsNullOrWhiteSpace(r.DisplayName) ? null : r.DisplayName.Trim(),
+                    SortNo = r.SortNo, ParentRowId = null,
+                    FormulaText = string.IsNullOrWhiteSpace(r.FormulaText) ? null : r.FormulaText.Trim(),
+                    PanelZone = null, IsEnabled = 1, UpdateTime = now
+                });
+            }
+
+            foreach (var r in body.L2)
+            {
+                var code = r.MetricCode!.Trim();
+                var level = kpiByCode.TryGetValue(code, out var kk) ? kk.MetricLevel : 2;
+                var prefix = $"S4-L{level}-";
+                var rid = string.IsNullOrWhiteSpace(r.RowId) ? $"{prefix}{code}" : r.RowId.Trim();
+                var p = string.IsNullOrWhiteSpace(r.ParentRowId) ? null : r.ParentRowId.Trim();
+                rows.Add(new AdoSmartOpsLayoutItem
+                {
+                    TenantId = tenantId, FactoryId = factoryId, ModuleCode = "S4",
+                    RowId = rid, MetricLevel = level, MetricCode = code,
+                    DisplayName = string.IsNullOrWhiteSpace(r.DisplayName) ? null : r.DisplayName.Trim(),
+                    SortNo = r.SortNo, ParentRowId = p,
+                    FormulaText = string.IsNullOrWhiteSpace(r.FormulaText) ? null : r.FormulaText,
+                    PanelZone = string.IsNullOrWhiteSpace(r.PanelZone) ? null : r.PanelZone.Trim(),
+                    IsEnabled = 1, UpdateTime = now
+                });
+            }
+
+            if (rows.Count > 0)
+                await _db.Insertable(rows).ExecuteCommandAsync();
+
+            // -- 同步 KpiMaster:如果 DisplayName 有值且与 MetricName 不同,更新 MetricName --
+            foreach (var r in body.L1.Concat<object>(body.L2).Cast<dynamic>())
+            {
+                string? code = (string?)r.MetricCode?.Trim();
+                string? dn = (string?)r.DisplayName?.Trim();
+                if (string.IsNullOrWhiteSpace(code) || string.IsNullOrWhiteSpace(dn)) continue;
+                if (!kpiByCode.TryGetValue(code, out var kpi)) continue;
+                if (!string.Equals(kpi.MetricName, dn, StringComparison.Ordinal))
+                {
+                    await _db.Updateable<AdoSmartOpsKpiMaster>()
+                        .SetColumns(x => new AdoSmartOpsKpiMaster { MetricName = dn, UpdatedAt = now })
+                        .Where(x => x.Id == kpi.Id)
+                        .ExecuteCommandAsync();
+                }
+            }
+
+            var hmRows = await _db.Updateable<AdoSmartOpsHomeModule>()
+                .SetColumns(x => new AdoSmartOpsHomeModule { UpdateTime = now })
+                .Where(x => x.TenantId == tenantId && x.FactoryId == factoryId && x.ModuleCode == "S4")
+                .ExecuteCommandAsync();
+            if (hmRows == 0)
+            {
+                await _db.Insertable(new AdoSmartOpsHomeModule
+                {
+                    TenantId = tenantId, FactoryId = factoryId, ModuleCode = "S4",
+                    LayoutPattern = "card_grid", UpdateTime = now
+                }).ExecuteCommandAsync();
+            }
+
+            _db.Ado.CommitTran();
+        }
+        catch (Exception ex)
+        {
+            _db.Ado.RollbackTran();
+            return BadRequest(new { message = ex.Message });
+        }
+
+        return Ok(new { ok = true });
+    }
+
+    /// <summary>九宫格 S4:合并 L1 布局与日表。</summary>
+    [HttpGet("s4-home-grid")]
+    public async Task<IActionResult> GetS4HomeGrid([FromQuery] long factoryId = 1)
+    {
+        var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
+        var layout = await _db.Queryable<AdoSmartOpsLayoutItem>()
+            .Where(x => x.TenantId == tenantId && x.FactoryId == factoryId && x.ModuleCode == "S4" && x.IsEnabled == 1 && x.MetricLevel == 1)
+            .OrderBy(x => x.SortNo)
+            .ToListAsync();
+        var kpi = await _db.Queryable<AdoSmartOpsKpiMaster>().Where(x => x.TenantId == tenantId && x.ModuleCode == "S4").ToListAsync();
+        var kpiBy = kpi.ToDictionary(x => x.MetricCode, StringComparer.OrdinalIgnoreCase);
+
+        var bizDate = await ResolveMaxBizDateAsync("ado_s9_kpi_value_l1_day", tenantId, factoryId);
+
+        const string valSql = """
+SELECT metric_code AS MetricCode, metric_value AS MetricValue, target_value AS TargetValue
+FROM ado_s9_kpi_value_l1_day
+WHERE tenant_id=@t AND factory_id=@f AND module_code='S4' AND is_deleted=0 AND biz_date=@d
+""";
+        var vals = await _db.Ado.SqlQueryAsync<S4ValRow>(valSql, new { t = tenantId, f = factoryId, d = bizDate });
+        var valBy = vals.ToDictionary(x => x.MetricCode ?? "", StringComparer.OrdinalIgnoreCase);
+
+        var hm = (await _db.Queryable<AdoSmartOpsHomeModule>()
+            .Where(x => x.TenantId == tenantId && x.FactoryId == factoryId && x.ModuleCode == "S4")
+            .ToListAsync()).FirstOrDefault();
+
+        var items = new List<object>();
+        foreach (var row in layout)
+        {
+            kpiBy.TryGetValue(row.MetricCode, out var k);
+            valBy.TryGetValue(row.MetricCode, out var v);
+            var cur = v?.MetricValue;
+            var tgt = v?.TargetValue;
+            var dir = k?.Direction ?? "higher_is_better";
+            var level = AidopS4KpiMerge.AchievementLevel(cur, tgt, dir, k?.YellowThreshold, k?.RedThreshold);
+            var gap = AidopS4KpiMerge.GapValue(cur, tgt);
+            var arrow = AidopS4KpiMerge.GapArrow(gap);
+            var label = FormatGapLabel(gap, k?.Unit);
+            items.Add(new
+            {
+                rowId = row.RowId,
+                metricCode = row.MetricCode,
+                displayName = string.IsNullOrWhiteSpace(row.DisplayName) ? k?.MetricName : row.DisplayName,
+                unit = k?.Unit ?? "",
+                currentValue = cur,
+                targetValue = tgt,
+                gapValue = gap,
+                gapLabel = label,
+                gapArrow = arrow,
+                achievementLevel = level,
+                formulaText = row.FormulaText
+            });
+        }
+
+        return Ok(new
+        {
+            layoutPattern = hm?.LayoutPattern ?? "card_grid",
+            bizDate = bizDate.ToString("yyyy-MM-dd"),
+            items
+        });
+    }
+
+    /// <summary>S4 详情主 KPI:合并 L2 布局与日表,可按 panelZone 过滤。</summary>
+    [HttpGet("s4-detail-kpis")]
+    public async Task<IActionResult> GetS4DetailKpis([FromQuery] long factoryId = 1, [FromQuery] string? panelZone = null)
+    {
+        var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
+        var q = _db.Queryable<AdoSmartOpsLayoutItem>()
+            .Where(x => x.TenantId == tenantId && x.FactoryId == factoryId && x.ModuleCode == "S4" && x.IsEnabled == 1 && x.MetricLevel >= 2);
+        if (!string.IsNullOrWhiteSpace(panelZone))
+            q = q.Where(x => x.PanelZone == panelZone);
+        var layout = await q.OrderBy(x => x.SortNo).ToListAsync();
+
+        var kpi = await _db.Queryable<AdoSmartOpsKpiMaster>().Where(x => x.TenantId == tenantId && x.ModuleCode == "S4").ToListAsync();
+        var kpiBy = kpi.ToDictionary(x => x.MetricCode, StringComparer.OrdinalIgnoreCase);
+
+        var bizDateL2 = await ResolveMaxBizDateAsync("ado_s9_kpi_value_l2_day", tenantId, factoryId);
+        var bizDateL3 = await ResolveMaxBizDateAsync("ado_s9_kpi_value_l3_day", tenantId, factoryId);
+        var bizDate = bizDateL2 >= bizDateL3 ? bizDateL2 : bizDateL3;
+
+        const string valSqlL2 = """
+SELECT metric_code AS MetricCode, metric_value AS MetricValue, target_value AS TargetValue
+FROM ado_s9_kpi_value_l2_day
+WHERE tenant_id=@t AND factory_id=@f AND module_code='S4' AND is_deleted=0 AND biz_date=@d
+""";
+        const string valSqlL3 = """
+SELECT metric_code AS MetricCode, metric_value AS MetricValue, target_value AS TargetValue
+FROM ado_s9_kpi_value_l3_day
+WHERE tenant_id=@t AND factory_id=@f AND module_code='S4' AND is_deleted=0 AND biz_date=@d
+""";
+        var valsL2 = await _db.Ado.SqlQueryAsync<S4ValRow>(valSqlL2, new { t = tenantId, f = factoryId, d = bizDateL2 });
+        var valsL3 = await _db.Ado.SqlQueryAsync<S4ValRow>(valSqlL3, new { t = tenantId, f = factoryId, d = bizDateL3 });
+        var valBy = new Dictionary<string, S4ValRow>(StringComparer.OrdinalIgnoreCase);
+        foreach (var r in valsL2)
+            if (!string.IsNullOrEmpty(r.MetricCode))
+                valBy[r.MetricCode] = r;
+        foreach (var r in valsL3)
+            if (!string.IsNullOrEmpty(r.MetricCode))
+                valBy[r.MetricCode] = r;
+
+        var items = new List<object>();
+        foreach (var row in layout)
+        {
+            kpiBy.TryGetValue(row.MetricCode, out var k);
+            valBy.TryGetValue(row.MetricCode, out var v);
+            var cur = v?.MetricValue;
+            var tgt = v?.TargetValue;
+            var dir = k?.Direction ?? "higher_is_better";
+            var level = AidopS4KpiMerge.AchievementLevel(cur, tgt, dir, k?.YellowThreshold, k?.RedThreshold);
+            var gap = AidopS4KpiMerge.GapValue(cur, tgt);
+            var arrow = AidopS4KpiMerge.GapArrow(gap);
+            items.Add(new
+            {
+                rowId = row.RowId,
+                metricCode = row.MetricCode,
+                displayName = string.IsNullOrWhiteSpace(row.DisplayName) ? k?.MetricName : row.DisplayName,
+                unit = k?.Unit ?? "",
+                currentValue = cur,
+                targetValue = tgt,
+                gapValue = gap,
+                gapLabel = FormatGapLabel(gap, k?.Unit),
+                gapArrow = arrow,
+                achievementLevel = level,
+                formulaText = row.FormulaText,
+                parentRowId = row.ParentRowId,
+                panelZone = row.PanelZone
+            });
+        }
+
+        return Ok(new { bizDate = bizDate.ToString("yyyy-MM-dd"), items });
+    }
+
+    private async Task<DateTime> ResolveMaxBizDateAsync(string table, long tenantId, long factoryId)
+    {
+        var sql = $"""
+SELECT MAX(biz_date) AS MaxBiz FROM {table}
+WHERE tenant_id=@t AND factory_id=@f AND module_code='S4' AND is_deleted=0
+""";
+        var rows = await _db.Ado.SqlQueryAsync<S4MaxDateRow>(sql, new { t = tenantId, f = factoryId });
+        return rows.FirstOrDefault()?.MaxBiz ?? DateTime.Today;
+    }
+
+    private sealed class S4MaxDateRow
+    {
+        public DateTime? MaxBiz { get; set; }
+    }
+
+    private static string FormatGapLabel(decimal? gap, string? unit)
+    {
+        if (gap == null) return "—";
+        var g = gap.Value;
+        var sign = g >= 0 ? "+" : "";
+        var s = $"{sign}{Math.Round(g, 2)}";
+        if (unit == "%")
+            return s + "%";
+        return s;
+    }
+
+    private sealed class S4ValRow
+    {
+        public string? MetricCode { get; set; }
+        public decimal? MetricValue { get; set; }
+        public decimal? TargetValue { get; set; }
+    }
+}

+ 47 - 12
server/Plugins/Admin.NET.Plugin.AiDOP/Controllers/AidopKanbanController.cs

@@ -1,4 +1,6 @@
+using Admin.NET.Core;
 using Admin.NET.Plugin.AiDOP.Entity;
+using Admin.NET.Plugin.AiDOP.Infrastructure;
 using SqlSugar;
 
 namespace Admin.NET.Plugin.AiDOP.Controllers;
@@ -7,7 +9,7 @@ namespace Admin.NET.Plugin.AiDOP.Controllers;
 [Route("api/[controller]")]
 [AllowAnonymous]
 [NonUnify]
-public class AidopKanbanController : ControllerBase
+public partial class AidopKanbanController : ControllerBase
 {
     private readonly ISqlSugarClient _db;
 
@@ -17,22 +19,42 @@ public class AidopKanbanController : ControllerBase
     }
 
     [HttpGet("home-l1")]
-    public async Task<IActionResult> GetHomeL1([FromQuery] long tenantId = 1, [FromQuery] long factoryId = 1)
+    public async Task<IActionResult> GetHomeL1([FromQuery] long factoryId = 1)
     {
+        var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
         const string sql = """
-SELECT module_code AS ModuleCode, metric_code AS MetricCode, metric_value AS MetricValue,
-       target_value AS TargetValue, status_color AS StatusColor, trend_flag AS TrendFlag
-FROM ado_s9_kpi_value_l1_day
-WHERE tenant_id=@tenantId AND factory_id=@factoryId AND is_deleted=0
-ORDER BY module_code
+SELECT v.module_code AS ModuleCode, v.metric_code AS MetricCode,
+       v.metric_value AS MetricValue, v.target_value AS TargetValue,
+       v.status_color AS StatusColor, v.trend_flag AS TrendFlag,
+       k.Direction, k.YellowThreshold, k.RedThreshold
+FROM ado_s9_kpi_value_l1_day v
+LEFT JOIN ado_smart_ops_kpi_master k
+  ON k.MetricCode = v.metric_code COLLATE utf8mb4_general_ci AND k.TenantId = v.tenant_id
+WHERE v.tenant_id=@tenantId AND v.factory_id=@factoryId AND v.is_deleted=0
+  AND v.biz_date = (SELECT MAX(biz_date) FROM ado_s9_kpi_value_l1_day
+                    WHERE tenant_id=@tenantId AND factory_id=@factoryId AND is_deleted=0)
+ORDER BY v.module_code
 """;
-        var rows = await _db.Ado.SqlQueryAsync<HomeL1Dto>(sql, new { tenantId, factoryId });
+        var raw = await _db.Ado.SqlQueryAsync<HomeL1RawDto>(sql, new { tenantId, factoryId });
+        var rows = raw.Select(r => new HomeL1Dto
+        {
+            ModuleCode = r.ModuleCode,
+            MetricCode = r.MetricCode,
+            MetricValue = r.MetricValue,
+            TargetValue = r.TargetValue,
+            TrendFlag = r.TrendFlag,
+            StatusColor = AidopS4KpiMerge.AchievementLevel(
+                r.MetricValue, r.TargetValue,
+                r.Direction ?? "higher_is_better",
+                r.YellowThreshold, r.RedThreshold)
+        }).ToList();
         return Ok(rows);
     }
 
     [HttpGet("s8-alerts")]
-    public async Task<IActionResult> GetS8Alerts([FromQuery] long tenantId = 1, [FromQuery] long factoryId = 1)
+    public async Task<IActionResult> GetS8Alerts([FromQuery] long factoryId = 1)
     {
+        var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
         const string sql = """
 SELECT DATE_FORMAT(alert_time, '%H:%i') AS Time,
        IFNULL(SUBSTRING_INDEX(metric_code, '_', 1), 'S8') AS Module,
@@ -61,8 +83,9 @@ LIMIT 6
     }
 
     [HttpGet("module-detail")]
-    public async Task<IActionResult> GetModuleDetail([FromQuery] string moduleCode = "S1", [FromQuery] long tenantId = 1, [FromQuery] long factoryId = 1)
+    public async Task<IActionResult> GetModuleDetail([FromQuery] string moduleCode = "S1", [FromQuery] long factoryId = 1)
     {
+        var tenantId = AidopTenantHelper.GetTenantId(HttpContext);
         moduleCode = string.IsNullOrWhiteSpace(moduleCode) ? "S1" : moduleCode.ToUpperInvariant();
         const string l2Sql = """
 SELECT module_code AS ModuleCode, metric_code AS MetricCode, metric_code AS MetricName, metric_value AS MetricValue,
@@ -133,9 +156,8 @@ LIMIT 60
     /// 智慧运营看板基础查询下拉:产品、订单号、产线(来自 Demo 业务表;无租户列时忽略 tenant/factory)。
     /// </summary>
     [HttpGet("smart-ops-filter-options")]
-    public async Task<IActionResult> GetSmartOpsFilterOptions([FromQuery] long tenantId = 1, [FromQuery] long factoryId = 1)
+    public async Task<IActionResult> GetSmartOpsFilterOptions([FromQuery] long factoryId = 1)
     {
-        _ = tenantId;
         _ = factoryId;
 
         var products = new HashSet<string>(StringComparer.Ordinal);
@@ -228,6 +250,19 @@ LIMIT 60
         public string? TrendFlag { get; set; }
     }
 
+    private sealed class HomeL1RawDto
+    {
+        public string? ModuleCode { get; set; }
+        public string? MetricCode { get; set; }
+        public decimal? MetricValue { get; set; }
+        public decimal? TargetValue { get; set; }
+        public string? StatusColor { get; set; }
+        public string? TrendFlag { get; set; }
+        public string? Direction { get; set; }
+        public decimal? YellowThreshold { get; set; }
+        public decimal? RedThreshold { get; set; }
+    }
+
     private sealed class S8AlertDto
     {
         public string? Time { get; set; }

+ 97 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Dto/SmartOps/AdoSmartOpsKpiMasterDtos.cs

@@ -0,0 +1,97 @@
+namespace Admin.NET.Plugin.AiDOP.Dto.SmartOps;
+
+// ── 查询 ──
+
+public class KpiMasterQueryDto
+{
+    public string? ModuleCode { get; set; }
+    public string? Keyword { get; set; }
+    public int? MetricLevel { get; set; }
+}
+
+// ── 新增 / 编辑 ──
+
+public class KpiMasterUpsertDto
+{
+    public string ModuleCode { get; set; } = string.Empty;
+    public int MetricLevel { get; set; }
+    public long? ParentId { get; set; }
+    public string MetricName { get; set; } = string.Empty;
+    public string? Description { get; set; }
+    public string? Formula { get; set; }
+    public string? CalcRule { get; set; }
+    public string? DataSource { get; set; }
+    public string? StatFrequency { get; set; }
+    public string? Department { get; set; }
+    public string? DopFields { get; set; }
+    public string? Unit { get; set; }
+    public string Direction { get; set; } = "higher_is_better";
+    public decimal? YellowThreshold { get; set; }
+    public decimal? RedThreshold { get; set; }
+    public bool IsHomePage { get; set; }
+    public int SortNo { get; set; }
+    public string? Remark { get; set; }
+    public bool IsEnabled { get; set; } = true;
+}
+
+// ── 树节点(前端左侧树用) ──
+
+public class KpiMasterTreeNodeDto
+{
+    public long Id { get; set; }
+    public string MetricCode { get; set; } = string.Empty;
+    public string ModuleCode { get; set; } = string.Empty;
+    public int MetricLevel { get; set; }
+    public string MetricName { get; set; } = string.Empty;
+    public long? ParentId { get; set; }
+    public int SortNo { get; set; }
+    public bool IsEnabled { get; set; }
+    public List<KpiMasterTreeNodeDto> Children { get; set; } = new();
+}
+
+// ── 详情(右侧面板用) ──
+
+public class KpiMasterDetailDto
+{
+    public long Id { get; set; }
+    public string MetricCode { get; set; } = string.Empty;
+    public string ModuleCode { get; set; } = string.Empty;
+    public int MetricLevel { get; set; }
+    public long? ParentId { get; set; }
+    public string? ParentName { get; set; }
+    public string MetricName { get; set; } = string.Empty;
+    public string? Description { get; set; }
+    public string? Formula { get; set; }
+    public string? CalcRule { get; set; }
+    public string? DataSource { get; set; }
+    public string? StatFrequency { get; set; }
+    public string? Department { get; set; }
+    public string? DopFields { get; set; }
+    public string? Unit { get; set; }
+    public string Direction { get; set; } = string.Empty;
+    public decimal? YellowThreshold { get; set; }
+    public decimal? RedThreshold { get; set; }
+    public bool IsHomePage { get; set; }
+    public int SortNo { get; set; }
+    public string? Remark { get; set; }
+    public bool IsEnabled { get; set; }
+    public long TenantId { get; set; }
+    public DateTime CreatedAt { get; set; }
+    public DateTime? UpdatedAt { get; set; }
+}
+
+// ── 排序 ──
+
+public class KpiMasterSortItemDto
+{
+    public long Id { get; set; }
+    public int SortNo { get; set; }
+}
+
+// ── 移动(拖拽) ──
+
+public class KpiMasterMoveDto
+{
+    public long? NewParentId { get; set; }
+    public int NewSortNo { get; set; }
+}

+ 28 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Entity/AdoSmartOpsHomeModule.cs

@@ -0,0 +1,28 @@
+using Admin.NET.Core;
+
+namespace Admin.NET.Plugin.AiDOP.Entity;
+
+/// <summary>
+/// 九宫格单模块呈现模板(card_grid / table_list)。
+/// </summary>
+[SugarTable("ado_smart_ops_home_module", "九宫格模块呈现")]
+public class AdoSmartOpsHomeModule : ITenantIdFilter
+{
+    [SugarColumn(ColumnDescription = "主键", IsPrimaryKey = true, IsIdentity = true)]
+    public long Id { get; set; }
+
+    [SugarColumn(ColumnDescription = "租户")]
+    public long? TenantId { get; set; }
+
+    [SugarColumn(ColumnDescription = "工厂")]
+    public long FactoryId { get; set; }
+
+    [SugarColumn(ColumnDescription = "模块", Length = 8)]
+    public string ModuleCode { get; set; } = string.Empty;
+
+    [SugarColumn(ColumnDescription = "布局 card_grid|table_list", Length = 32)]
+    public string LayoutPattern { get; set; } = "card_grid";
+
+    [SugarColumn(ColumnDescription = "更新时间")]
+    public DateTime UpdateTime { get; set; }
+}

+ 83 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Entity/AdoSmartOpsKpiMaster.cs

@@ -0,0 +1,83 @@
+using Admin.NET.Core;
+
+namespace Admin.NET.Plugin.AiDOP.Entity;
+
+/// <summary>
+/// 运营指标主数据(KPI Master),完整的指标定义含公式、规则、父子关系。
+/// </summary>
+[SugarTable("ado_smart_ops_kpi_master", "运营指标主数据")]
+[SugarIndex("uk_kpi_master_code_tenant", nameof(MetricCode), OrderByType.Asc, nameof(TenantId), OrderByType.Asc, true)]
+public class AdoSmartOpsKpiMaster : ITenantIdFilter
+{
+    [SugarColumn(ColumnDescription = "主键", IsPrimaryKey = true, IsIdentity = true, ColumnDataType = "bigint")]
+    public long Id { get; set; }
+
+    [SugarColumn(ColumnDescription = "指标编码(自动生成 S1_L1_001)", Length = 50)]
+    public string MetricCode { get; set; } = string.Empty;
+
+    [SugarColumn(ColumnDescription = "模块 S1~S9", Length = 20)]
+    public string ModuleCode { get; set; } = string.Empty;
+
+    [SugarColumn(ColumnDescription = "层级 1=L1 2=L2 3=L3")]
+    public int MetricLevel { get; set; }
+
+    [SugarColumn(ColumnDescription = "父指标 ID(L1 为 null)", ColumnDataType = "bigint", IsNullable = true)]
+    public long? ParentId { get; set; }
+
+    [SugarColumn(ColumnDescription = "指标名称", Length = 200)]
+    public string MetricName { get; set; } = string.Empty;
+
+    [SugarColumn(ColumnDescription = "KPI 描述", ColumnDataType = "text", IsNullable = true)]
+    public string? Description { get; set; }
+
+    [SugarColumn(ColumnDescription = "计算公式", ColumnDataType = "text", IsNullable = true)]
+    public string? Formula { get; set; }
+
+    [SugarColumn(ColumnDescription = "计算规则(含举例)", ColumnDataType = "text", IsNullable = true)]
+    public string? CalcRule { get; set; }
+
+    [SugarColumn(ColumnDescription = "数据来源模块", Length = 200, IsNullable = true)]
+    public string? DataSource { get; set; }
+
+    [SugarColumn(ColumnDescription = "统计频率", Length = 50, IsNullable = true)]
+    public string? StatFrequency { get; set; }
+
+    [SugarColumn(ColumnDescription = "责任部门", Length = 200, IsNullable = true)]
+    public string? Department { get; set; }
+
+    [SugarColumn(ColumnDescription = "DOP 系统字段映射", Length = 500, IsNullable = true)]
+    public string? DopFields { get; set; }
+
+    [SugarColumn(ColumnDescription = "单位", Length = 50, IsNullable = true)]
+    public string? Unit { get; set; }
+
+    [SugarColumn(ColumnDescription = "优劣方向 higher_is_better/lower_is_better", Length = 20)]
+    public string Direction { get; set; } = "higher_is_better";
+
+    [SugarColumn(ColumnDescription = "黄色阈值(达标比例%,higher: actual/target>=此值为黄,lower: actual/target<=此值为黄)", IsNullable = true)]
+    public decimal? YellowThreshold { get; set; }
+
+    [SugarColumn(ColumnDescription = "红色阈值(未达标比例%,higher: actual/target<此值为红,lower: actual/target>此值为红)", IsNullable = true)]
+    public decimal? RedThreshold { get; set; }
+
+    [SugarColumn(ColumnDescription = "是否可上九宫格首页")]
+    public bool IsHomePage { get; set; }
+
+    [SugarColumn(ColumnDescription = "同级排序号")]
+    public int SortNo { get; set; }
+
+    [SugarColumn(ColumnDescription = "备注", ColumnDataType = "text", IsNullable = true)]
+    public string? Remark { get; set; }
+
+    [SugarColumn(ColumnDescription = "启用")]
+    public bool IsEnabled { get; set; } = true;
+
+    [SugarColumn(ColumnDescription = "租户 ID", ColumnDataType = "bigint")]
+    public long? TenantId { get; set; }
+
+    [SugarColumn(ColumnDescription = "创建时间")]
+    public DateTime CreatedAt { get; set; } = DateTime.Now;
+
+    [SugarColumn(ColumnDescription = "更新时间", IsNullable = true)]
+    public DateTime? UpdatedAt { get; set; }
+}

+ 54 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Entity/AdoSmartOpsLayoutItem.cs

@@ -0,0 +1,54 @@
+using Admin.NET.Core;
+
+namespace Admin.NET.Plugin.AiDOP.Entity;
+
+/// <summary>
+/// 租户运营指标布局行(L1/L2),与 Catalog 中 metric_code 绑定。
+/// </summary>
+[SugarTable("ado_smart_ops_layout_item", "智慧运营布局行")]
+public class AdoSmartOpsLayoutItem : ITenantIdFilter
+{
+    [SugarColumn(ColumnDescription = "主键", IsPrimaryKey = true, IsIdentity = true)]
+    public long Id { get; set; }
+
+    [SugarColumn(ColumnDescription = "租户")]
+    public long? TenantId { get; set; }
+
+    [SugarColumn(ColumnDescription = "工厂")]
+    public long FactoryId { get; set; }
+
+    [SugarColumn(ColumnDescription = "模块", Length = 8)]
+    public string ModuleCode { get; set; } = string.Empty;
+
+    /// <summary>稳定行键,如 S4-L1-S4_CYCLE_L1</summary>
+    [SugarColumn(ColumnDescription = "行ID", Length = 96)]
+    public string RowId { get; set; } = string.Empty;
+
+    [SugarColumn(ColumnDescription = "1=L1 2=L2")]
+    public int MetricLevel { get; set; }
+
+    [SugarColumn(ColumnDescription = "指标编码", Length = 64)]
+    public string MetricCode { get; set; } = string.Empty;
+
+    [SugarColumn(ColumnDescription = "展示名覆盖", Length = 256, IsNullable = true)]
+    public string? DisplayName { get; set; }
+
+    [SugarColumn(ColumnDescription = "排序")]
+    public int SortNo { get; set; }
+
+    [SugarColumn(ColumnDescription = "L2 父行 RowId", Length = 96, IsNullable = true)]
+    public string? ParentRowId { get; set; }
+
+    [SugarColumn(ColumnDescription = "公式说明", ColumnDataType = "text", IsNullable = true)]
+    public string? FormulaText { get; set; }
+
+    /// <summary>S4 详情左右栏:left / right,其它模块可空</summary>
+    [SugarColumn(ColumnDescription = "详情分区", Length = 16, IsNullable = true)]
+    public string? PanelZone { get; set; }
+
+    [SugarColumn(ColumnDescription = "启用 0/1")]
+    public int IsEnabled { get; set; } = 1;
+
+    [SugarColumn(ColumnDescription = "更新时间")]
+    public DateTime UpdateTime { get; set; }
+}

+ 761 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Infrastructure/AidopKpiMasterSeed.cs

@@ -0,0 +1,761 @@
+using System.Diagnostics;
+using Admin.NET.Core;
+using Admin.NET.Plugin.AiDOP.Entity;
+using SqlSugar;
+
+namespace Admin.NET.Plugin.AiDOP.Infrastructure;
+
+/// <summary>
+/// 运营指标主数据种子:从 KPI 清单 Excel 灌入 115 条指标(L1=32, L2=60, L3=23)。
+/// </summary>
+public static class AidopKpiMasterSeed
+{
+    public static void EnsureSeed(ISqlSugarClient db, long tenantId = 0)
+    {
+        if (tenantId <= 0)
+            tenantId = SqlSugarConst.DefaultTenantId;
+        try
+        {
+            if (db.Queryable<AdoSmartOpsKpiMaster>().Where(x => x.TenantId == tenantId).Any())
+                return;
+            SeedAll(db, tenantId);
+        }
+        catch (Exception ex)
+        {
+            Trace.TraceWarning("KpiMaster seed: " + ex);
+        }
+    }
+
+    private static void SeedAll(ISqlSugarClient db, long tenantId)
+    {
+        // ── L1 ──
+        var l1_s1_1 = Ins(db, tenantId, "S1_L1_001", "S1", 1, null, "订单评审周期(天)", "天", "lower_is_better", 1, true,
+            "从订单下达到交期确认的时长",
+            "每个订单的评审周期=D2-D1",
+            "1、订单评审周期=统计期间订单评审时长合计/统计期订单总数\n2、例如:3月有20个订单,订单评审时长合计30天,订单评审周期=30/20=1.5天",
+            "S1-订单管理", "天", "供应链/计划部",
+            "rdate", "销售订单-下单日期(系统还需记录订单交期确认日期,此功能待开发)");
+        var l1_s1_2 = Ins(db, tenantId, "S1_L1_002", "S1", 1, null, "订单评审满足率(%)", "%", "higher_is_better", 2, true,
+            "规定时间内交期确认的订单占总订单的比例",
+            "规定时间内交期确认的订单数量/订单总数",
+            "1、规定时间内交期确认的订单数量=从订单下达之日起3天内完成交期确认的订单数量,规定时间可配置\n2、例如:4月30个订单,3天内交期确认25个订单,评审满足率=25/30=83%",
+            "S1-订单管理", "天", "供应链/计划部",
+            "", "");
+        var l1_s1_3 = Ins(db, tenantId, "S1_L1_003", "S1", 1, null, "主计划人效(行/人)", "行/人", "higher_is_better", 3, true,
+            "统计期内交期确认的订单行数比主计划人数",
+            "统计期内交期确认的订单行数/主计划人数",
+            "1、统计期内交期确认的订单行数量=某月完成交期确认的订单行数量\n2、例如:5月完成交期确认的订单有300行主计划3人,主计划人效=300/3=100行/人",
+            "S1-订单管理", "天", "供应链/计划部",
+            "", "");
+        var l1_s1_4 = Ins(db, tenantId, "S1_L1_004", "S1", 1, null, "成品库存周转(天)", "天", "lower_is_better", 4, true,
+            "成品库存周转天数",
+            "(D2/D1)*30天",
+            "1、成品库存周转天数计算:月均销售成本指当月成品销售成本,月初和月末库存指计算日所在月度的期初和期末库存金额,例如:6月30日计算日,D1=(6月销售成本)=100万,D2=(6月1日库存+6月30日库存)/2=200万,成品库存周转天数=200/100=2*30天=60天\n2、每个SKU的在库库存周转天数计算:月平均库存数量/月销售出库数量,例如:5月30日计算日,D1=(5月销售出库数量)=50个,D2=5月平均库存数量=150个,SKU库存周转天数=150/50*30天=90天\n3、月度销售成本=成品BOM物料*单价*销售出库数量,库存成本=成品BOM物料*单价*库存数量",
+            "S7-成品仓储", "天", "供应链/计划部",
+            "", "");
+        var l1_s2_1 = Ins(db, tenantId, "S2_L1_001", "S2", 1, null, "订单排程周期(天)", "天", "lower_is_better", 5, true,
+            "从订单交期确认到完成订单生产排程的时长",
+            "每个订单的排程周期=D2-D1",
+            "1、订单排程周期=∑(订单行对应工单排程完成日期-订单交期确认日期)/订单行数\n2、例如:订单有3行,订单排程周期=(1+2+2)/3=1.6天",
+            "S2-生产排程", "天", "供应链/计划部",
+            "", "");
+        var l1_s2_2 = Ins(db, tenantId, "S2_L1_002", "S2", 1, null, "订单排程满足率(%)", "%", "higher_is_better", 6, true,
+            "规定时间内完成生产排程的订单占总订单的比例",
+            "规定时间内完成生产排程的订单数量/订单总数",
+            "1、规定时间内完成排程的订单数量=从订单下达之日起3天内完成完成排程的订单数量,规定时间可配置\n2、例如:4月有30个订单,8小时内完成排程20个订单,订单排程满足率=20/30=67%",
+            "S2-生产排程", "天", "供应链/计划部",
+            "", "");
+        var l1_s2_3 = Ins(db, tenantId, "S2_L1_003", "S2", 1, null, "订单排程人效(行/人)", "行/人", "higher_is_better", 7, true,
+            "统计期内完成生产排程的订单行数比生产计划人数",
+            "统计期内完成生产排程的订单行数/生产计划人数",
+            "1、统计期内完成排程的订单行数量=某月完成完成排程的订单行数量\n2、例如:5月完成完成排程的订单有300行生产计划5人,订单排程人效=300/5=60行/人",
+            "S2-生产排程", "天", "供应链/计划部",
+            "", "");
+        var l1_s2_4 = Ins(db, tenantId, "S2_L1_004", "S2", 1, null, "在制库存周转(天)", "天", "lower_is_better", 8, true,
+            "在制库存的周转天数\n(衡量在制品库存健康度,以较少的生产投入满足交付需求,提高资金周转效率)",
+            "D1/D2*30天",
+            "1、在制库存周转天数计算:月度工单入库成本指当月生产工单合格入库的成本金额,月平均在制库存指统计月度期初和期末库存金额的平均值,例如:6月30日计算日,D1=(6月1日在制库存+6月30日在制库存)/2=50万,D2=(6月生产工单入库成本)=100万,在制库存周转天数=50/100=0.5*30天=15天\n2、SKU的在制库存周转天数计算:月平均在制库存数量/月入库数量,例如:5月30日计算日,D1=(5月平均在制库存数量)=50个,D2=5月入库数量=150个,SKU在制库存周转天数=50/150*30天=10天",
+            "S6-生产执行", "天", "供应链/计划部\n生产部",
+            "QtyOrder、QtyComplete、QtyChangeAdvance、QtyChangeOut、createTime", "工单在制数量、进出存-出库-入库-交易时间");
+        var l1_s3_1 = Ins(db, tenantId, "S3_L1_001", "S3", 1, null, "物料计划周期(天)", "天", "lower_is_better", 9, true,
+            "从订单生产排程完成到物料交货计划发布的时长",
+            "每个订单的物料计划周期=D2-D1",
+            "1、物料计划周期=统计期间物料计划时长合计/统计期订单总数\n2、例如:3月有20个订单,物料计划时长合计60天,物料计划周期=60/20=3天",
+            "S3-物料计划", "天", "供应链/计划部",
+            "", "");
+        var l1_s3_2 = Ins(db, tenantId, "S3_L1_002", "S3", 1, null, "物料计划满足率(%)", "%", "higher_is_better", 10, true,
+            "规定时间内完成物料计划的工单占总工单的比例",
+            "规定时间内完成物料计划的工单数量/工单总数",
+            "1、规定时间内完成物料计划的工单数量=从工单下达之日起3天内完成完成物料计划的工单数量,规定时间可配置\n2、例如:4月有30个工单,规定时间内完成完成物料计划有20个工单,物料计划满足率=20/30=",
+            "S3-物料计划", "天", "供应链/计划部",
+            "", "");
+        var l1_s3_3 = Ins(db, tenantId, "S3_L1_003", "S3", 1, null, "物料计划人效(行/人)", "行/人", "higher_is_better", 11, true,
+            "统计期内完成物料计划的行数比物料计划人数",
+            "统计期内完成物料计划的行数/物料计划人数",
+            "1、统计期内完成物料计划的工单行数量=某月完成完成物料计划的工单行数量\n2、例如:5月完成完成物料计划的行数有500行物料计划5人,物料计划人效=500/5=100行/人",
+            "S3-物料计划", "天", "供应链/计划部",
+            "", "");
+        var l1_s3_4 = Ins(db, tenantId, "S3_L1_004", "S3", 1, null, "物料库存周转(天)", "天", "lower_is_better", 12, true,
+            "从物料收货到配送至线边的库存(含半成品)周转天数\n(衡量物料计划和采购掌控物料供应链的能力,以较少的物料库存资金占用满足生产需求)",
+            "D1/D2*30天",
+            "1、物料库存周转天数计算:当月出库成本指当月出库物料成本金额,月平均库存指月度期初和期末库存金额的平均值,例如:6月,D1=(6月1日物料库存+6月30日物料库存)/2=600万,D2=(6月生产物料出库成本)=200万,物料库存周转=600/200=3*30天=90天,每个SKU的库存周转天数={(月初库存数量+月末库存数量)/2}/过去30天平均每天出库数量\n2、出库成本=物料单价*出库数量;库存金额=物料单价*库存数量",
+            "S5-物料仓储", "天", "供应链/计划部",
+            "UpdateTime、QtyRct、AvailStatusQty、Assay", "生产领料单-修改日期、已发数量\n日库存记录-非限制库存+质检库存、创建时间");
+        var l1_s4_1 = Ins(db, tenantId, "S4_L1_001", "S4", 1, null, "物料交货周期(天)", "天", "lower_is_better", 13, true,
+            "用于度量从物料交货计划发布到物料收货之间的天数。\n(衡量物料交付周期,识别瓶颈物料缩短交付周期)",
+            "D=物料交货单收货日期-物料交货单发布日期",
+            "1、每月统计当月物料的平均交付周期。\n2、例如:3月交付的物料共3次,则该物料的平均交货周期=(10+8+7)/3=8.3天。",
+            "S4-交货管理", "天", "采购部",
+            "submitdate\njhshrq\nsuppliercode", "交货单-发布日期\n交货单-收货日期");
+        var l1_s4_2 = Ins(db, tenantId, "S4_L1_002", "S4", 1, null, "物料交货满足率(%)", "%", "higher_is_better", 14, true,
+            "用于度量按时完成交货的交货单比例。\n(衡量物料交付满足率,识别瓶颈物料提高满足率)",
+            "S=按时完成物料交货单数量/物料交货单总数",
+            "1、每月统计当月物料的平均交付周期。\n2、例如:3月交付的物料共3次,则该物料的平均交付周期=(100%+80%+70%)/3=83.3%。",
+            "S4-交货管理", "天", "采购部",
+            "submitdate\njhshrq\nsuppliercode", "交货单-发布日期\n交货单-收货日期");
+        var l1_s4_3 = Ins(db, tenantId, "S4_L1_003", "S4", 1, null, "物料采购人效(颗/人)", "颗/人", "higher_is_better", 15, true,
+            "统计期内完成收货的物料数量比物料采购人数\n(衡量物料采购工作效率)",
+            "H=完成收货的物料数量/物料采购人数",
+            "1、每月统计当月物料采购人效。\n2、例如:3月交付的物料数量1000颗/采购人数4人,则物料采购人效=1000/4=250颗/人。",
+            "S4-交货管理", "天", "采购部",
+            "", "");
+        var l1_s4_4 = Ins(db, tenantId, "S4_L1_004", "S4", 1, null, "采购在途周转(天)", "天", "lower_is_better", 16, true,
+            "采购在途周转天数\n(分析从供应商发出物料到收货,以较少的采购资金占用满足生产物料需求)",
+            "D1/D2*30天",
+            "1、采购在途周转天数计算:当月入库成本指当月物料入库金额,月平均物料成本指物料采购在途金额,例如:6月,D1=6月30日物料采购在途金额=300万,D2=(6月物料入库成本)=200万,物料库存周转=300/200=1.5*30天=45天,每个SKU的在途库存周转天数={(月初库存数量+月末库存数量)/2}/过去30天平均每天入库数量\n2、入库成本=物料单价*入库数量;库存金额=物料单价*在途数量",
+            "S4-交货管理", "天", "采购部",
+            "", "");
+        var l1_s5_1 = Ins(db, tenantId, "S5_L1_001", "S5", 1, null, "物料上线周期(天)", "天", "lower_is_better", 17, true,
+            "物料从收货到物料配送到生产线完成的时长\n(衡量工单物料配送到生产线的时效)",
+            "物料上线周期=(物料配送到生产线日期-物料收货日期)",
+            "1、物料上线周期=物料发到生产线日期-物料收货日期,例如:某工单物料上线周期=3月5日-3月1日=4天;\n2、物料X批次上线周期计算:分别计算每个周期,然后计算平均值,例如:6月份5个工单,则6月份的物料上线周期=(2+3+3+2+4)/5=2.8天;",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "是否可以用工单投产日期=物料配送到生产线日期");
+        var l1_s5_2 = Ins(db, tenantId, "S5_L1_002", "S5", 1, null, "物料上线满足率(%)", "%", "higher_is_better", 18, true,
+            "用于度量按时完成上线的工单物料比例。\n(衡量物料上线满足率,识别瓶颈物料提高满足率)",
+            "S=工单开工日期前完成物料上线行数/工单物料总行数",
+            "1、每月统计当月工单物料的平均上线满足率。\n2、例如:3月工单物料共100行,工单计划开工日期前=(100%+80%+70%)/3=83.3%。",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l1_s5_3 = Ins(db, tenantId, "S5_L1_003", "S5", 1, null, "物料仓储人效(个/人)", "个/人", "higher_is_better", 19, true,
+            "统计期内完成物料上线的工单物料数量比物料仓储人数\n(衡量物料仓储工作效率)",
+            "H=完成上线的工单物料数量/物料仓储人数",
+            "1、每月统计当月物料仓储人效。\n2、例如:3月上线的工单物料共10000个/仓储人数4人,则该物料仓储人效=10000/4=2500个/人。",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l1_s6_1 = Ins(db, tenantId, "S6_L1_001", "S6", 1, null, "订单制造周期(天)", "天", "lower_is_better", 20, true,
+            "从订单投产到订单完工的时长",
+            "每个订单的制造周期=D2-D1",
+            "1、订单制造周期=最晚一行物料的完工日期-最早一行物料的投产日期\n2、例如:订单有5行物料,最晚一行物料的完工日期是12月31日,最早一行物料的投产日期是12月1日,则订单制造周期=12月31日-12月1日=30天",
+            "S6-生产执行", "天", "生产部",
+            "", "");
+        var l1_s6_2 = Ins(db, tenantId, "S6_L1_002", "S6", 1, null, "订单制造满足率(%)", "%", "higher_is_better", 21, true,
+            "计划时间内完成制造的订单占总订单的比例",
+            "计划时间内完成制造的订单数量/订单总数",
+            "1、计划时间内完成制造的订单数量=按订单的物料行数分别统计\n2、例如:订单有3行物料,则订单制造满足率=(100+120+150)/(120+150+200)=79%",
+            "S6-生产执行", "天", "生产部",
+            "", "");
+        var l1_s6_3 = Ins(db, tenantId, "S6_L1_003", "S6", 1, null, "订单制造人效(个/人)", "个/人", "higher_is_better", 22, true,
+            "统计期内完成制造的订单数量比生产人数",
+            "统计期内完成制造的订单数量/生产人数",
+            "1、统计期内完成制造的订单数量=某订单有5个工单合计完成制造的数量\n2、例如:5月完成制造的订单数量10000个,生产10人,订单制造人效=10000/10=1000个/人",
+            "S6-生产执行", "天", "生产部",
+            "", "");
+        var l1_s7_1 = Ins(db, tenantId, "S7_L1_001", "S7", 1, null, "订单发货周期(天)", "天", "lower_is_better", 23, true,
+            "销售订单从FQC报检到完成发货的天数\n(衡量销售订单发货时效)",
+            "订单发货周期=(订单最后一行物料发货日期-订单最先一行物料FQC报检日期)",
+            "1、订单发货周期=最晚一行物料的发货日期-最早一行物料的FQC报检日期\n2、例如:订单有5行物料,最晚一行物料的发货日期是12月31日,最早一行物料的FQC报检日期是12月11日,则订单发货周期=12月31日-12月11日=20天",
+            "S7-FQC检验\nS7-发货管理", "天", "质量部\n仓储物流部",
+            "", "");
+        var l1_s7_2 = Ins(db, tenantId, "S7_L1_002", "S7", 1, null, "订单发货满足率(%)", "%", "higher_is_better", 24, true,
+            "按订单确认的交货日期完成发货的行数占比\n(衡量仓库发货能力指标,更好服务销售)",
+            "(D1/D2)*100%",
+            "1、订单发货满足率=在确认交期前发货的行数/该订单总行数*100%,例如:订单共10行,8行在交期前全部发货,2行未发货,则订单发货满足率=80%;\n2、例如:6月份10个订单共100行,其中在交货日期前完成发货的共80行,则6月份的订单发货满足率=80/100*100%=80%;",
+            "S7-发货管理", "天", "仓储物流部",
+            "", "");
+        var l1_s7_3 = Ins(db, tenantId, "S7_L1_003", "S7", 1, null, "成品仓储人效(个/人)", "个/人", "higher_is_better", 25, true,
+            "统计期内完成发货订单数量比成品仓储人数\n(衡量成品仓储工作效率)",
+            "H=完成发货的订单物料数量/成品仓储人数",
+            "1、每月统计当月成品仓储人效。\n2、例如:3月订单发货成品共20000个/仓储人数4人,则成品仓储人效=20000/4=5000个/人。",
+            "S7-发货管理", "天", "仓储物流部",
+            "", "");
+        var l1_s8_1 = Ins(db, tenantId, "S8_L1_001", "S8", 1, null, "各类异常事件数量(个)", "个", "lower_is_better", 26, true,
+            "统计期内各类异常事件数量\n(测量各类型异常事件发生频率,识别改善机会)",
+            "按预设的异常事件类型,分别统计异常事件的数量",
+            "例如:设备异常,实时监控设备异常,累计设备异常发生的次数;物料异常,物料未按期交货;质量异常,实时监控质量问题;交付异常,未按销售通知单发货日期发货;",
+            "S8-异常管理", "实时", "经营管理部",
+            "", "");
+        var l1_s8_2 = Ins(db, tenantId, "S8_L1_002", "S8", 1, null, "各类异常事件处理时效(小时)", "", "lower_is_better", 27, true,
+            "统计期内各类异常事件数量处理时效\n(测量各类型异常事件处理效率,识别改善机会)",
+            "按预设的异常事件类型,分别统计异常事件处理花费的时间",
+            "例如:设备异常,统计每次设备异常处理的时间,累计总时间;物料异常,从触发异常到收货处理时间;质量异常,从触发异常到质量问题关闭;交付异常,从触发异常到发货;",
+            "S8-异常管理", "实时", "经营管理部",
+            "", "");
+        var l1_s9_1 = Ins(db, tenantId, "S9_L1_001", "S9", 1, null, "质量退货率(PPM)", "PPM", "lower_is_better", 28, true,
+            "客户因质量问题退货数量占发货数量比率\n(衡量客户质量表现)",
+            "质量退货率=累计客户因质量问题退货数量/累计总发货数量",
+            "1、可以分解到每月和累计,再分解到每个订单统计质量退货率;\n2、例如:3月累计共发货数量1000件,累计客户因质量问题退货10件,则3月质量退货率=10/1000=1%=10000PPM,高于目标5000PPM,自动报警",
+            "S7-退货管理", "天", "经营管理部",
+            "", "");
+        var l1_s9_2 = Ins(db, tenantId, "S9_L1_002", "S9", 1, null, "订单交付周期(天)", "天", "lower_is_better", 29, true,
+            "从订单评审到订单发货的时效\n(衡量整个供应链交付能力)",
+            "订单交付周期=订单评审+订单排程+物料计划+物料上线+工单制造+订单发货",
+            "系统自动监控每个订单执行关键节点计划时间和实际时间的差异,并实时预警\n例如:某订单的物料齐套上线的日期迟于工单计划开工日期,自动报警",
+            "S9-运营指标", "天", "经营管理部",
+            "", "");
+        var l1_s9_3 = Ins(db, tenantId, "S9_L1_003", "S9", 1, null, "订单交付满足率(%)", "%", "higher_is_better", 30, true,
+            "齐套发货的订单行占订单总行数的比例\n(衡量整个供应链交付能力)",
+            "订单交付满足率=齐套发货的订单行数/订单总行数",
+            "系统自动监控每个订单物料上线、工单制造、订单发货的满足率,并实时预警\n例如:某订单按照销售发货通知单发货日期前完成齐套发货的订单行数是25行,订单总行数是50行,则订单交付满足率=25/50=50%,自动报警",
+            "S9-运营指标", "天", "经营管理部",
+            "", "");
+        var l1_s9_4 = Ins(db, tenantId, "S9_L1_004", "S9", 1, null, "生产效率(%)", "%", "higher_is_better", 31, true,
+            "生产效率\n(衡量生产效率的能力)",
+            "生产效率=有效产出工时/投入总生产工时",
+            "例如:某天生产投入总工时12小时,异常停机2小时,有效产出工时10小时,生产效率=10/12=83%,低于目标95%,自动报警",
+            "S9-运营指标", "天", "经营管理部",
+            "", "");
+        var l1_s9_5 = Ins(db, tenantId, "S9_L1_005", "S9", 1, null, "全库存周转(天)", "天", "lower_is_better", 32, true,
+            "全库存周转天数\n(衡量全库存周转速度,现金流健康程度)",
+            "全库存周转天数=成品库存周转+在制工单周转+物料库存周转",
+            "全库存周转天数由成品周转、在制周转和物料周转构成,可以进一步按照状态分解为在途、在库、自制、收货、检验、上架、备货等,当全库存周转天数高于目标时,自动报警",
+            "S9-运营指标", "天", "经营管理部",
+            "", "");
+
+        // ── L2 ──
+        var l2_s1_1 = Ins(db, tenantId, "S1_L2_001", "S1", 2, l1_s1_1, "合同评审周期(天)", "天", "lower_is_better", 1, false,
+            "从通知下达到合同签订的时长",
+            "每个合同的评审周期=D2-D1",
+            "1、合同评审周期=统计期间合同评审时长合计/统计期合同总数\n2、例如:3月有10个合同,合同评审时长合计30天,合同评审周期=30/10=3天",
+            "S1-产销协同", "天", "商务部",
+            "", "");
+        var l2_s1_2 = Ins(db, tenantId, "S1_L2_002", "S1", 2, l1_s1_2, "合同评审满足率(%)", "%", "higher_is_better", 2, false,
+            "规定时间内合同确认的数量占合同总数的比例",
+            "规定时间内合同签订数量/合同总数",
+            "1、规定时间内合同签订的合同数量=从合同下达之日起3天内完成合同签订的合同数量,规定时间可配置\n2、例如:4月有30个合同,规定时间内完成合同签订有20个合同,合同评审满足率=20/30=66.7%",
+            "S1-产销协同", "天", "商务部",
+            "", "");
+        var l2_s1_3 = Ins(db, tenantId, "S1_L2_003", "S1", 2, l1_s1_3, "合同评审人效(个/人)", "个/人", "higher_is_better", 3, false,
+            "统计期内合同签订数量比销售人数",
+            "统计期内合同签订数量/销售人数",
+            "1、统计期内合同签订的合同行数量=某月完成合同签订的合同行数量\n2、例如:5月完成合同签订的合同有300行合同工程师3人,合同工程师人效=300/3=100个/人",
+            "S1-产销协同", "天", "商务部",
+            "", "");
+        var l2_s1_4 = Ins(db, tenantId, "S1_L2_004", "S1", 2, l1_s1_1, "BOM评审周期(天)", "天", "lower_is_better", 4, false,
+            "从订单下达到BOM确认的时长",
+            "每个BOM的评审周期=D2-D1",
+            "1、BOM评审周期=统计期间BOM评审时长合计/统计期BOM总数\n2、例如:3月有20个BOM,BOM评审时长合计30天,BOM评审周期=30/20=1.5天",
+            "S1-产销协同", "天", "工程部",
+            "", "");
+        var l2_s1_5 = Ins(db, tenantId, "S1_L2_005", "S1", 2, l1_s1_2, "BOM评审满足率(%)", "%", "higher_is_better", 5, false,
+            "规定时间内BOM确认的订单占总订单的比例",
+            "规定时间内BOM确认的订单数量/订单总数",
+            "1、规定时间内BOM确认的订单数量=从订单下达之日起3天内完成BOM确认的订单数量,规定时间可配置\n2、例如:4月有30个订单,规定时间内完成BOM确认有20个订单,订单评审满足率=20/30=66.7%",
+            "S1-产销协同", "天", "工程部",
+            "", "");
+        var l2_s1_6 = Ins(db, tenantId, "S1_L2_006", "S1", 2, l1_s1_3, "BOM设计人效(个/人)", "个/人", "higher_is_better", 6, false,
+            "统计期内BOM确认的订单行数比BOM工程师人数",
+            "统计期内BOM确认的订单行数/BOM工程师人数",
+            "1、统计期内BOM确认的订单行数量=某月完成BOM确认的订单行数量\n2、例如:5月完成BOM确认的订单有300行BOM工程师3人,BOM工程师人效=300/3=100个/人",
+            "S1-产销协同", "天", "工程部",
+            "", "");
+        var l2_s1_7 = Ins(db, tenantId, "S1_L2_007", "S1", 2, l1_s1_1, "工艺评审周期(天)", "天", "lower_is_better", 7, false,
+            "从订单下达到工艺确认的时长",
+            "每个工艺的评审周期=D2-D1",
+            "1、工艺评审周期=统计期间工艺评审时长合计/统计期工艺总数\n2、例如:3月有20个工艺,工艺评审时长合计30天,工艺评审周期=30/20=1.5天",
+            "S1-产销协同", "天", "工程部",
+            "", "");
+        var l2_s1_8 = Ins(db, tenantId, "S1_L2_008", "S1", 2, l1_s1_2, "工艺评审满足率(%)", "%", "higher_is_better", 8, false,
+            "规定时间内工艺确认的订单占总订单的比例",
+            "规定时间内工艺确认的订单数量/订单总数",
+            "1、规定时间内工艺确认的订单数量=从订单下达之日起3天内完成工艺确认的订单数量,规定时间可配置\n2、例如:4月有30个订单,规定时间内完成工艺确认有20个订单,订单评审满足率=20/30=66.7%",
+            "S1-产销协同", "天", "工程部",
+            "", "");
+        var l2_s1_9 = Ins(db, tenantId, "S1_L2_009", "S1", 2, l1_s1_3, "工艺设计人效(个/人)", "个/人", "higher_is_better", 9, false,
+            "统计期内工艺确认的订单行数比工艺工程师人数",
+            "统计期内工艺确认的订单行数/工艺工程师人数",
+            "1、统计期内工艺确认的订单行数量=某月完成工艺确认的订单行数量\n2、例如:5月完成工艺确认的订单有300行工艺工程师3人,工艺工程师人效=300/3=100个/人",
+            "S1-产销协同", "天", "工程部",
+            "", "");
+        var l2_s1_10 = Ins(db, tenantId, "S1_L2_010", "S1", 2, l1_s1_1, "交期评审周期(天)", "天", "lower_is_better", 10, false,
+            "从订单下达到交期确认的时长",
+            "每个交期的评审周期=D2-D1",
+            "1、交期评审周期=统计期间交期评审时长合计/统计期交期总数\n2、例如:3月有20个交期,交期评审时长合计30天,交期评审周期=30/20=1.5天",
+            "S1-产销协同", "天", "供应链/计划部",
+            "rdate", "销售交期-下单日期(系统还需记录交期交期确认日期,此功能待开发)");
+        var l2_s1_11 = Ins(db, tenantId, "S1_L2_011", "S1", 2, l1_s1_2, "交期评审满足率(%)", "%", "higher_is_better", 11, false,
+            "规定时间内交期确认的交期占总订单的比例",
+            "规定时间内交期确认的订单数量/交期总数",
+            "1、规定时间内交期确认的订单数量=从交期下达之日起3天内完成交期确认的订单数量,规定时间可配置\n2、例如:4月有30个订单,规定时间内完成交期确认有20个订单,交期评审满足率=20/30=66.7%",
+            "S1-产销协同", "天", "供应链/计划部",
+            "rdate", "销售交期-下单日期(系统还需记录交期交期确认日期,此功能待开发)");
+        var l2_s1_12 = Ins(db, tenantId, "S1_L2_012", "S1", 2, l1_s1_3, "主计划人效(行/人)", "行/人", "higher_is_better", 12, false,
+            "统计期内交期确认的订单行数比主计划人数",
+            "统计期内交期确认的订单行数/主计划人数",
+            "1、统计期内交期确认的订单行数量=某月完成交期确认的订单行数量\n2、例如:5月完成交期确认的订单有300行主计划3人,主计划人效=300/3=100行/人",
+            "S1-产销协同", "天", "供应链/计划部",
+            "", "");
+        var l2_s2_1 = Ins(db, tenantId, "S2_L2_001", "S2", 2, l1_s2_1, "工单排程周期(天)", "天", "lower_is_better", 13, false,
+            "从工单下达到完成工单排程的时长",
+            "每个工单的排程周期=D2-D1",
+            "1、工单排程周期=统计期间工单排程时长合计/统计期工单总数\n2、例如:3月有20个工单,工单排程时长合计60天,工单排程周期=60/20=3天",
+            "S2-生产排程", "天", "供应链/计划部",
+            "", "");
+        var l2_s2_2 = Ins(db, tenantId, "S2_L2_002", "S2", 2, l1_s2_2, "工单排程满足率(%)", "%", "higher_is_better", 14, false,
+            "规定时间内完成排程的工单占总工单的比例",
+            "规定时间内完成排程的工单数量/工单总数",
+            "1、规定时间内完成排程的工单数量=从工单下达之日起3天内完成完成排程的工单数量,规定时间可配置\n2、例如:4月有30个工单,规定时间内完成完成排程有20个工单,工单排程满足率=20/30=",
+            "S2-生产排程", "天", "供应链/计划部",
+            "", "");
+        var l2_s2_3 = Ins(db, tenantId, "S2_L2_003", "S2", 2, l1_s2_3, "工单排程人效(行/人)", "行/人", "higher_is_better", 15, false,
+            "统计期内完成排程的工单行数比生产计划人数",
+            "统计期内完成排程的工单行数/生产计划人数",
+            "1、统计期内完成排程的工单行数量=某月完成完成排程的工单行数量\n2、例如:5月完成完成排程的工单有300行生产计划5人,工单排程人效=300/5=60行/人",
+            "S2-生产排程", "天", "供应链/计划部",
+            "", "");
+        var l2_s3_1 = Ins(db, tenantId, "S3_L2_001", "S3", 2, l1_s3_1, "物料需求计划周期(天)", "天", "lower_is_better", 16, false,
+            "从工单创建到完成物料需求计划的时长",
+            "每个工单的物料需求计划周期=D2-D1",
+            "1、物料需求计划周期=统计期间物料需求计划时长合计/统计期工单总数\n2、例如:3月有20个工单,物料需求计划时长合计60天,物料需求计划周期=60/20=3天",
+            "S3-物料需求计划", "天", "供应链/计划部",
+            "", "");
+        var l2_s3_2 = Ins(db, tenantId, "S3_L2_002", "S3", 2, l1_s3_2, "物料需求计划满足率(%)", "%", "higher_is_better", 17, false,
+            "规定时间内完成物料需求计划的工单占总工单的比例",
+            "规定时间内完成物料需求计划的工单数量/工单总数",
+            "1、规定时间内完成物料需求计划的工单数量=从工单下达之日起3天内完成完成物料需求计划的工单数量,规定时间可配置\n2、例如:4月有30个工单,规定时间内完成完成物料需求计划有20个工单,物料需求计划满足率=20/30=",
+            "S3-物料需求计划", "天", "供应链/计划部",
+            "", "");
+        var l2_s3_3 = Ins(db, tenantId, "S3_L2_003", "S3", 2, l1_s3_3, "物料需求计划人效(行/人)", "行/人", "higher_is_better", 18, false,
+            "统计期内完成物料需求计划的行数比物料需求计划人数",
+            "统计期内完成物料需求计划的行数/物料需求计划人数",
+            "1、统计期内完成物料需求计划的工单行数量=某月完成完成物料需求计划的工单行数量\n2、例如:5月完成完成物料需求计划的行数有500行物料需求计划5人,物料需求计划人效=500/5=100行/人",
+            "S3-物料需求计划", "天", "供应链/计划部",
+            "", "");
+        var l2_s3_4 = Ins(db, tenantId, "S3_L2_004", "S3", 2, l1_s3_1, "物料交货计划周期(天)", "天", "lower_is_better", 19, false,
+            "从物料需求计划完成到物料交货计划完成的时长",
+            "每个工单的物料交货计划周期=D2-D1",
+            "1、物料交货计划周期=统计期间物料交货计划时长合计/统计期工单总数\n2、例如:3月有20个工单,物料交货计划时长合计60天,物料交货计划周期=60/20=3天",
+            "S3-物料交货计划", "天", "供应链/计划部",
+            "", "");
+        var l2_s3_5 = Ins(db, tenantId, "S3_L2_005", "S3", 2, l1_s3_2, "物料交货计划满足率(%)", "%", "higher_is_better", 20, false,
+            "规定时间内完成物料交货计划的行数占需求计划总行数的比例",
+            "规定时间内完成物料交货计划的行数/需求总行数,1行物料需求对应1行以上交货计划合并为1行",
+            "1、规定时间内完成物料交货计划的工单数量=从需求计划生成之日起3天内完成完成物料交货计划,规定时间可配置\n2、例如:4月物料需求计划有300行物料,规定时间内完成完成物料交货计划有240行物料,物料交货计划满足率=240/300=80%",
+            "S3-物料交货计划", "天", "供应链/计划部",
+            "", "");
+        var l2_s3_6 = Ins(db, tenantId, "S3_L2_006", "S3", 2, l1_s3_3, "物料交货计划人效(行/人)", "行/人", "higher_is_better", 21, false,
+            "统计期内完成物料交货计划的行数比物料交货计划人数",
+            "统计期内完成物料交货计划的行数/物料交货计划人数",
+            "1、统计期内完成物料交货计划的工单行数量=某月完成完成物料交货计划的工单行数量\n2、例如:5月完成完成物料交货计划的行数有500行物料交货计划5人,物料交货计划人效=500/5=100行/人",
+            "S3-物料交货计划", "天", "供应链/计划部",
+            "", "");
+        var l2_s4_1 = Ins(db, tenantId, "S4_L2_001", "S4", 2, l1_s4_1, "品类物料交货周期(天)", "天", "lower_is_better", 22, false,
+            "用于度量按品类统计的物料交货计划发布到物料收货之间的天数。\n(衡量物料交付周期,识别瓶颈物料缩短交付周期)",
+            "D=品类物料交货单收货日期-品类物料交货单发布日期",
+            "1、每月统计当月物料的平均交付周期。\n2、例如:3月交付的物料共3次,则该物料的平均交货周期=(10+8+7)/3=8.3天。",
+            "S4-交货管理", "天", "采购部",
+            "", "");
+        var l2_s4_2 = Ins(db, tenantId, "S4_L2_002", "S4", 2, l1_s4_2, "品类物料交货满足率(%)", "%", "higher_is_better", 23, false,
+            "用于度量按品类统计按时完成交货的交货单比例。\n(衡量物料交付满足率,识别瓶颈物料提高满足率)",
+            "S=按时完成品类物料交货单数量/品类物料交货单总数",
+            "1、每月统计当月物料的平均交付周期。\n2、例如:3月交付的物料共3次,则该物料的平均交付周期=(100%+80%+70%)/3=83.3%。",
+            "S4-交货管理", "天", "采购部",
+            "", "");
+        var l2_s4_3 = Ins(db, tenantId, "S4_L2_003", "S4", 2, l1_s4_3, "品类物料采购人效(个/人)", "个/人", "higher_is_better", 24, false,
+            "统计期内按品类统计完成物料收货的交货单的数量比品类物料采购人数\n(衡量品类物料采购工作效率)",
+            "H=完成收货的品类数量/品类采购人数",
+            "1、每月统计当月物料采购人效。\n2、例如:3月交付的品类12个/品类人数4人,则品类采购人效=12/4=3个/人。",
+            "S4-交货管理", "天", "采购部",
+            "", "");
+        var l2_s4_4 = Ins(db, tenantId, "S4_L2_004", "S4", 2, l1_s4_4, "品类在途物料周转(天)", "天", "lower_is_better", 25, false,
+            "品类在途物料库存周转天数\n(按品类分析从供应商发出物料到物料收货,以较少的物料库存资金占用满足生产物料需求)",
+            "D1/D2*30天",
+            "1、品类在途物料周转天数计算:当月物料入库金额,物料在途金额,例如:6月,D1=6月品类物料在途金额=100万,D2=(6月品类物料入库成本)=50万,品类物料在途周转=100/50=2*30天=60天,每个SKU的在途周转天数=在途物料数量/过去30天平均入库数量",
+            "S4-交货管理", "天", "采购部",
+            "", "");
+        var l2_s5_1 = Ins(db, tenantId, "S5_L2_001", "S5", 2, l1_s5_1, "物料收货周期(天)", "天", "lower_is_better", 26, false,
+            "从清点物料到物料IQC报检的时长\n(衡量工单物料收货的时效)",
+            "物料收货周期=(物料IQC报检日期-物料收货日期)",
+            "1、物料收货周期=物料IQC报检日期-物料收货日期,例如:某工单物料收货周期=3月5日-3月1日=4天;\n2、物料X批次收货周期计算:分别计算每个周期,然后计算平均值,例如:6月份5个工单,则6月份的物料收货周期=(2+3+3+2+4)/5=2.8天;",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_2 = Ins(db, tenantId, "S5_L2_002", "S5", 2, l1_s5_2, "物料收货满足率(%)", "%", "higher_is_better", 27, false,
+            "用于度量按时完成收货的工单物料比例。\n(衡量物料收货满足率,识别瓶颈物料提高满足率)",
+            "S=工单开工日期前完成物料收货行数/工单物料总行数",
+            "1、每月统计当月工单物料的平均收货满足率。\n2、例如:3月工单物料共100行,工单计划开工日期前=(100%+80%+70%)/3=83.3%。",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_3 = Ins(db, tenantId, "S5_L2_003", "S5", 2, l1_s5_1, "物料检验周期(天)", "天", "lower_is_better", 28, false,
+            "从物料IQC报检到物料IQC检验完成的时长\n(衡量工单物料检验的时效)",
+            "物料检验周期=(物料IQC完成日期-物料报检日期)",
+            "1、物料检验周期=物料IQC完成日期-物料报检日期,例如:某工单物料检验周期=3月5日-3月1日=4天;\n2、物料X批次检验周期计算:分别计算每个周期,然后计算平均值,例如:6月份5个工单,则6月份的物料检验周期=(2+3+3+2+4)/5=2.8天;",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_4 = Ins(db, tenantId, "S5_L2_004", "S5", 2, l1_s5_2, "物料检验满足率(%)", "%", "higher_is_better", 29, false,
+            "用于度量按时完成检验的工单物料比例。\n(衡量物料检验满足率,识别瓶颈物料提高满足率)",
+            "S=工单开工日期前完成物料检验行数/工单物料总行数",
+            "1、每月统计当月工单物料的平均检验满足率。\n2、例如:3月工单物料共100行,工单计划开工日期前=(100%+80%+70%)/3=83.3%。",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_5 = Ins(db, tenantId, "S5_L2_005", "S5", 2, l1_s5_1, "物料上架周期(天)", "天", "lower_is_better", 30, false,
+            "从IQC检验完成到物料上架入库的时长\n(衡量工单物料上架入库的时效)",
+            "物料上架周期=(物料上架入库日期-物料IQC检验完成日期)",
+            "1、物料上架周期=物料上架入库日期-物料IQC完成日期,例如:某工单物料上架周期=3月5日-3月1日=4天;\n2、物料X批次上架周期计算:分别计算每个周期,然后计算平均值,例如:6月份5个工单,则6月份的物料上架周期=(2+3+3+2+4)/5=2.8天;",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_6 = Ins(db, tenantId, "S5_L2_006", "S5", 2, l1_s5_3, "物料上架人效(批次/人)", "批次/人", "higher_is_better", 31, false,
+            "统计期内完成物料上架的物料批次比物料上架人数\n(衡量物料上架工作效率)",
+            "H=完成上架的物料批次/物料上架人数",
+            "1、每月统计当月物料仓储人效。\n2、例如:3月上架的工单物料共1000批次/上架人数4人,则该物料上架人效=1000/4=250批次/人。",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_7 = Ins(db, tenantId, "S5_L2_007", "S5", 2, l1_s5_1, "上架物料周转(天)", "天", "lower_is_better", 32, false,
+            "物料在上架区周转天数\n(衡量仓库上架效率)",
+            "上架物料周转=上架区物料库存成本/物料入库成本",
+            "1、上架物料周转天数计算:当月物料入库金额,物料上架区金额,例如:6月,D1=6月物料上架区金额=5万,D2=(6月物料入库成本)=50万,上架物料周转=5/50=0.1*30天=3天",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_8 = Ins(db, tenantId, "S5_L2_008", "S5", 2, l1_s5_1, "物料备货周期(天)", "天", "lower_is_better", 33, false,
+            "从上架入库完成到物料备货出库的时长\n(衡量工单物料备货出库的时效,识别滞留风险物料)",
+            "物料备货周期=(物料备货出库日期-物料上架入库日期)",
+            "1、物料备货周期=物料备货出库日期-物料上架入库日期,例如:某工单物料备货周期=3月5日-3月1日=4天;\n2、物料X批次备货周期计算:分别计算每个周期,然后计算平均值,例如:6月份5个工单,则6月份的物料备货周期=(2+3+3+2+4)/5=2.8天;",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_9 = Ins(db, tenantId, "S5_L2_009", "S5", 2, l1_s5_2, "物料备货满足率(%)", "%", "higher_is_better", 34, false,
+            "用于度量按时完成备货的工单物料比例。\n(衡量物料备货满足率,识别瓶颈物料提高满足率)",
+            "S=工单开工日期前完成物料备货行数/工单物料总行数",
+            "1、每月统计当月工单物料的平均备货满足率。\n2、例如:3月工单物料共100行,工单计划开工日期前=(100%+80%+70%)/3=83.3%。",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_10 = Ins(db, tenantId, "S5_L2_010", "S5", 2, l1_s5_3, "物料备货人效(批次/人)", "批次/人", "higher_is_better", 35, false,
+            "统计期内完成物料备货的物料批次比物料备货人数\n(衡量物料备货工作效率)",
+            "H=完成备货的物料批次/物料备货人数",
+            "1、每月统计当月物料仓储人效。\n2、例如:3月备货的工单物料共1000批次/备货人数4人,则该物料备货人效=1000/4=250批次/人。",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_11 = Ins(db, tenantId, "S5_L2_011", "S5", 2, l1_s5_1, "备货物料周转(天)", "天", "lower_is_better", 36, false,
+            "物料在备货(货架)区周转天数\n(衡量仓库备货效率,识别呆滞物料)",
+            "备货物料周转=备货区物料库存成本/物料出库成本",
+            "1、备货物料周转天数计算:当月物料出库金额,物料备货区金额,例如:6月,D1=6月物料备货区金额=500万,D2=(6月物料出库成本)=250万,备货物料周转=500/250=2*30天=60天",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_12 = Ins(db, tenantId, "S5_L2_012", "S5", 2, l1_s5_1, "物料发货周期(天)", "天", "lower_is_better", 37, false,
+            "从备货出库到物料上线的时长\n(衡量工单物料发货的时效,识别滞留线边物料)",
+            "物料发货周期=(物料上线日期-物料出库日期)",
+            "1、物料发货周期=物料上线日期-物料出库日期,例如:某工单物料发货周期=3月5日-3月1日=4天;\n2、物料X批次发货周期计算:分别计算每个周期,然后计算平均值,例如:6月份5个工单,则6月份的物料发货周期=(2+3+3+2+4)/5=2.8天;",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "物料上线日期=工单投产日期");
+        var l2_s5_13 = Ins(db, tenantId, "S5_L2_013", "S5", 2, l1_s5_2, "物料发货满足率(%)", "%", "higher_is_better", 38, false,
+            "用于度量按时完成发货的工单物料比例。\n(衡量物料发货满足率,识别瓶颈物料提高满足率)",
+            "S=工单开工日期前完成物料发货行数/工单物料总行数",
+            "1、每月统计当月工单物料的平均发货满足率。\n2、例如:3月工单物料共100行,工单计划开工日期前=(100%+80%+70%)/3=83.3%。",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_14 = Ins(db, tenantId, "S5_L2_014", "S5", 2, l1_s5_3, "物料发货人效(批次/人)", "批次/人", "higher_is_better", 39, false,
+            "统计期内完成物料发货的物料批次比物料发货人数\n(衡量物料发货工作效率)",
+            "H=完成发货的物料批次/物料发货人数",
+            "1、每月统计当月物料仓储人效。\n2、例如:3月发货的工单物料共1000批次/发货人数4人,则该物料发货人效=1000/4=250批次/人。",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s5_15 = Ins(db, tenantId, "S5_L2_015", "S5", 2, l1_s5_1, "发货物料周转(天)", "天", "lower_is_better", 40, false,
+            "物料在发货(线边)区周转天数\n(衡量仓库发货效率)",
+            "发货物料周转=发货区物料库存成本/物料出库成本",
+            "1、发货物料周转天数计算:当月物料出库金额,物料发货区金额,例如:6月,D1=6月物料发货区金额=15万,D2=(6月物料出库成本)=250万,发货物料周转=25/250=0.1*30天=3天",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s6_1 = Ins(db, tenantId, "S6_L2_001", "S6", 2, l1_s6_1, "工单制造周期(天)", "天", "lower_is_better", 41, false,
+            "从工单投产到工单完工的时长",
+            "每个工单的制造周期=D2-D1",
+            "1、工单制造周期=最晚一行物料的完工日期-最早一行物料的投产日期\n2、例如:工单有5行物料,最晚一行物料的完工日期是12月31日,最早一行物料的投产日期是12月1日,则工单制造周期=12月31日-12月1日=30天",
+            "S6-生产执行", "天", "生产部",
+            "", "");
+        var l2_s6_2 = Ins(db, tenantId, "S6_L2_002", "S6", 2, l1_s6_2, "工单制造满足率(%)", "%", "higher_is_better", 42, false,
+            "计划时间内完成制造的工单占总工单的比例",
+            "计划时间内完成制造的工单数量/工单总数",
+            "1、计划时间内完成制造的工单数量=按工单的物料行数分别统计\n2、例如:工单有3行物料,则工单制造满足率=(100+120+150)/(120+150+200)=79%",
+            "S6-生产执行", "天", "生产部",
+            "", "");
+        var l2_s6_3 = Ins(db, tenantId, "S6_L2_003", "S6", 2, l1_s6_3, "工单制造人效(个/人)", "个/人", "higher_is_better", 43, false,
+            "统计期内完成制造的工单数量比生产人数",
+            "统计期内完成制造的工单数量/生产人数",
+            "1、统计期内完成制造的工单数量=某工单有5个工单合计完成制造的数量\n2、例如:5月完成制造的工单数量10000个,生产10人,工单制造人效=10000/10=1000个/人",
+            "S6-生产执行", "天", "生产部",
+            "", "");
+        var l2_s6_4 = Ins(db, tenantId, "S6_L2_004", "S6", 2, l1_s6_1, "工单在制周转(天)", "天", "lower_is_better", 44, false,
+            "工单在制周转的天数\n(衡量每个工单在制库存,以较少的生产投入满足交付需求,提高资金周转效率)",
+            "工单在制周转=在制工单成本/工单入库成本*30天",
+            "1、工单在制周转天数计算:处于在制状态的工单成本,比已完工的工单成本,例如:6月30日计算日,D1=在制工单成本=30万,D2=(6月工单完工成本)=60万,在制周转天数=30/60*30天=15天\n2、SKU:5月30日计算日,D1=(5月在制库存数量)=50个,D2=5月入库数量=150个,SKU在制库存周转天数=50/150*30天=10天",
+            "S6生产执行", "天", "生产部",
+            "QtyOrder、QtyComplete、QtyChangeAdvance、QtyChangeOut、createTime", "工单在制数量、进出存-出库-入库-交易时间");
+        var l2_s7_1 = Ins(db, tenantId, "S7_L2_001", "S7", 2, l1_s7_1, "成品检验周期(天)", "天", "lower_is_better", 45, false,
+            "从成品FQC报检到成品FQC检验完成的时长\n(衡量工单成品检验的时效)",
+            "成品检验周期=(成品FQC完成日期-成品报检日期)",
+            "1、成品检验周期=成品FQC完成日期-成品报检日期,例如:某工单成品检验周期=3月5日-3月1日=4天;\n2、成品X批次检验周期计算:分别计算每个周期,然后计算平均值,例如:6月份5个工单,则6月份的成品检验周期=(2+3+3+2+4)/5=2.8天;",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_2 = Ins(db, tenantId, "S7_L2_002", "S7", 2, l1_s7_2, "成品检验满足率(%)", "%", "higher_is_better", 46, false,
+            "用于度量按时完成检验的成品比例。\n(衡量成品检验满足率,识别瓶颈成品提高满足率)",
+            "S=要求日期前完成成品检验行数/FQC报检单总行数",
+            "1、每月统计当月FQC成品的平均检验满足率。\n2、例如:3月成品共100行,FQC完成率=90/100=90%。",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_3 = Ins(db, tenantId, "S7_L2_003", "S7", 2, l1_s7_3, "成品检验人效(批次/人)", "批次/人", "higher_is_better", 47, false,
+            "统计期内完成成品检验的成品批次比成品检验人数\n(衡量成品检验工作效率)",
+            "H=完成检验的成品批次/成品检验人数",
+            "1、每月统计当月成品仓储人效。\n2、例如:3月检验的工单成品共1000批次/检验人数4人,则该成品检验人效=1000/4=250批次/人。",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_4 = Ins(db, tenantId, "S7_L2_004", "S7", 2, l1_s7_1, "检验成品周转(天)", "天", "lower_is_better", 48, false,
+            "成品在检验区周转天数\n(衡量仓库检验效率)",
+            "检验成品周转=检验区成品库存成本/成品入库成本",
+            "1、检验成品周转天数计算:当月成品入库金额,成品检验区金额,例如:6月,D1=6月成品检验区金额=12万,D2=(6月成品入库成本)=50万,检验成品周转=12/50=0.24*30天=7.2天",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_5 = Ins(db, tenantId, "S7_L2_005", "S7", 2, l1_s7_1, "成品上架周期(天)", "天", "lower_is_better", 49, false,
+            "从FQC检验完成到成品上架入库的时长\n(衡量工单成品上架的时效)",
+            "成品上架周期=(成品上架日期-FQC检验完成日期)",
+            "1、成品上架周期=成品上架日期-成品FQC完成日期,例如:某工单成品上架周期=3月5日-3月1日=4天;\n2、成品X批次上架周期计算:分别计算每个周期,然后计算平均值,例如:6月份5个工单,则6月份的成品上架周期=(2+3+3+2+4)/5=2.8天;",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_6 = Ins(db, tenantId, "S7_L2_006", "S7", 2, l1_s7_2, "成品上架满足率(%)", "%", "higher_is_better", 50, false,
+            "用于度量按时完成上架的成品比例。\n(衡量成品上架满足率,识别瓶颈成品提高满足率)",
+            "S=完成上架行数/FQC总行数",
+            "1、每月统计当月成品的平均上架满足率。\n2、例如:3月FQC共100行,99行完成上架,成品上架满足率=99/100=99%。",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_7 = Ins(db, tenantId, "S7_L2_007", "S7", 2, l1_s7_3, "成品上架人效(批次/人)", "批次/人", "higher_is_better", 51, false,
+            "统计期内完成成品上架的成品批次比成品上架人数\n(衡量成品上架工作效率)",
+            "H=完成上架的成品批次/成品上架人数",
+            "1、每月统计当月成品仓储人效。\n2、例如:3月上架的工单成品共1000批次/上架人数4人,则该成品上架人效=1000/4=250批次/人。",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_8 = Ins(db, tenantId, "S7_L2_008", "S7", 2, l1_s7_1, "上架成品周转(天)", "天", "lower_is_better", 52, false,
+            "成品在上架区周转天数\n(衡量成品库存健康度)",
+            "上架成品周转=上架区成品库存成本/成品入库成本",
+            "1、上架成品周转天数计算:当月成品入库金额,成品上架区金额,例如:6月,D1=6月成品上架区金额=5万,D2=(6月成品入库成本)=50万,上架成品周转=5/50=0.1*30天=3天",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_9 = Ins(db, tenantId, "S7_L2_009", "S7", 2, l1_s7_1, "成品备货周期(天)", "天", "lower_is_better", 53, false,
+            "从上架入库完成到成品备货出库的时长\n(衡量工单成品备货出库的时效,识别滞留风险成品)",
+            "成品备货周期=(成品备货出库日期-成品上架入库日期)",
+            "1、成品备货周期=成品备货出库日期-成品上架入库日期,例如:某工单成品备货周期=3月5日-3月1日=4天;\n2、成品X批次备货周期计算:分别计算每个周期,然后计算平均值,例如:6月份5个工单,则6月份的成品备货周期=(2+3+3+2+4)/5=2.8天;",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_10 = Ins(db, tenantId, "S7_L2_010", "S7", 2, l1_s7_2, "成品备货满足率(%)", "%", "higher_is_better", 54, false,
+            "用于度量按时完成备货的工单成品比例。\n(衡量成品备货满足率,识别瓶颈成品提高满足率)",
+            "S=工单开工日期前完成成品备货行数/工单成品总行数",
+            "1、每月统计当月工单成品的平均备货满足率。\n2、例如:3月工单成品共100行,工单计划开工日期前=(100%+80%+70%)/3=83.3%。",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_11 = Ins(db, tenantId, "S7_L2_011", "S7", 2, l1_s7_3, "成品备货人效(批次/人)", "批次/人", "higher_is_better", 55, false,
+            "统计期内完成成品备货的成品批次比成品备货人数\n(衡量成品备货工作效率)",
+            "H=完成备货的成品批次/成品备货人数",
+            "1、每月统计当月成品仓储人效。\n2、例如:3月备货的工单成品共1000批次/备货人数4人,则该成品备货人效=1000/4=250批次/人。",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_12 = Ins(db, tenantId, "S7_L2_012", "S7", 2, l1_s7_1, "在库成品周转(天)", "天", "lower_is_better", 56, false,
+            "成品在备货(货架)区周转天数\n(衡量仓库备货效率、识别呆滞成品)",
+            "备货成品周转=备货区成品库存成本/成品出库成本",
+            "1、备货成品周转天数计算:当月成品出库金额,成品备货区金额,例如:6月,D1=6月成品备货区金额=500万,D2=(6月成品出库成本)=250万,备货成品周转=500/250=2*30天=60天",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_13 = Ins(db, tenantId, "S7_L2_013", "S7", 2, l1_s7_1, "成品发货周期(天)", "天", "lower_is_better", 57, false,
+            "从备货出库到成品上线的时长\n(衡量工单成品发货的时效,识别滞留线边成品)",
+            "成品发货周期=(成品上线日期-成品出库日期)",
+            "1、成品发货周期=成品上线日期-成品出库日期,例如:某工单成品发货周期=3月5日-3月1日=4天;\n2、成品X批次发货周期计算:分别计算每个周期,然后计算平均值,例如:6月份5个工单,则6月份的成品发货周期=(2+3+3+2+4)/5=2.8天;",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_14 = Ins(db, tenantId, "S7_L2_014", "S7", 2, l1_s7_2, "成品发货满足率(%)", "%", "higher_is_better", 58, false,
+            "用于度量按时完成发货的成品比例。\n(衡量成品发货满足率,识别瓶颈成品提高满足率)",
+            "S=销售通知单日期前完成发货行数/销售通知单总行数",
+            "1、每月统计当月成品的平均发货满足率。\n2、例如:3月销售通知单共200行,要求发货日期前180行,发货满足率=180/200=90%",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_15 = Ins(db, tenantId, "S7_L2_015", "S7", 2, l1_s7_3, "成品发货人效(批次/人)", "批次/人", "higher_is_better", 59, false,
+            "统计期内完成成品发货的成品批次比成品发货人数\n(衡量成品发货工作效率)",
+            "H=完成发货的成品批次/成品发货人数",
+            "1、每月统计当月成品仓储人效。\n2、例如:3月发货的工单成品共1000批次/发货人数4人,则该成品发货人效=1000/4=250批次/人。",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+        var l2_s7_16 = Ins(db, tenantId, "S7_L2_016", "S7", 2, l1_s7_1, "在途成品周转(天)", "天", "lower_is_better", 60, false,
+            "成品从销售发货出库到客户签收周转天数\n(衡量销售验收服务效率)",
+            "在途成品周转=待客户签收成品成本/客户已签收成品成本",
+            "1、销售在途成品周转天数计算:6月成品待签收金额=100万,客户已签收金额=50万,销售在途成品周转=100/50=2*30天=60天",
+            "S7-成品仓储", "天", "仓储物流部",
+            "", "");
+
+        // ── L3 ──
+        Ins(db, tenantId, "S2_L3_001", "S2", 3, l2_s2_1, "工序排程周期(天)", "天", "lower_is_better", 1, false,
+            "从工单下达到完成工序排程的时长",
+            "每个工序的排程周期=D2-D1",
+            "1、工序排程周期=统计期间工序排程时长合计/统计期工序总数\n2、例如:3月有20个工序,工序排程时长合计60天,工序排程周期=60/20=3天",
+            "S2-生产排程", "天", "供应链/计划部",
+            "", "");
+        Ins(db, tenantId, "S2_L3_002", "S2", 3, l2_s2_2, "工序排程满足率(%)", "%", "higher_is_better", 2, false,
+            "规定时间内完成排程的工序占总工序的比例",
+            "规定时间内完成排程的工序数量/工序总数",
+            "1、规定时间内完成排程的工序数量=从工序下达之日起3天内完成完成排程的工序数量,规定时间可配置\n2、例如:4月有30个工序,规定时间内完成完成排程有20个工序,工序排程满足率=20/30=",
+            "S2-生产排程", "天", "供应链/计划部",
+            "", "");
+        Ins(db, tenantId, "S2_L3_003", "S2", 3, l2_s2_3, "工序排程人效(道/人)", "道/人", "higher_is_better", 3, false,
+            "统计期内完成排程的工序道数比生产计划人数",
+            "统计期内完成排程的工序道数/生产计划人数",
+            "1、统计期内完成排程的工序行数量=某月完成完成排程的工序行数量\n2、例如:5月完成完成排程的工序有300道生产计划5人,工序排程人效=300/5=60道/人",
+            "S2-生产排程", "天", "供应链/计划部",
+            "", "");
+        Ins(db, tenantId, "S2_L3_004", "S2", 3, l2_s2_1, "设备排程周期(天)", "天", "lower_is_better", 4, false,
+            "从工单下达到完成设备排程的时长",
+            "每个设备的排程周期=D2-D1",
+            "1、设备排程周期=统计期间设备排程时长合计/统计期设备总数\n2、例如:3月有20个设备,设备排程时长合计60天,设备排程周期=60/20=3天",
+            "S2-生产排程", "天", "供应链/计划部",
+            "", "");
+        Ins(db, tenantId, "S2_L3_005", "S2", 3, l2_s2_2, "设备排程满足率(%)", "%", "higher_is_better", 5, false,
+            "规定时间内完成排程的设备占总设备的比例",
+            "规定时间内完成排程的设备数量/设备总数",
+            "1、规定时间内完成排程的设备数量=从设备下达之日起3天内完成完成排程的设备数量,规定时间可配置\n2、例如:4月有30个设备,规定时间内完成完成排程有20个设备,设备排程满足率=20/30=",
+            "S2-生产排程", "天", "供应链/计划部",
+            "", "");
+        Ins(db, tenantId, "S2_L3_006", "S2", 3, l2_s2_3, "设备排程人效(台/人)", "台/人", "higher_is_better", 6, false,
+            "统计期内完成排程的设备数量比生产计划人数",
+            "统计期内完成排程的设备数量/生产计划人数",
+            "1、统计期内完成排程的设备行数量=某月完成完成排程的设备行数量\n2、例如:5月完成完成排程的设备有300行生产计划5人,设备排程人效=300/5=60台/人",
+            "S2-生产排程", "天", "供应链/计划部",
+            "", "");
+        Ins(db, tenantId, "S4_L3_001", "S4", 3, l2_s4_1, "供应商物料交货周期(天)", "天", "lower_is_better", 7, false,
+            "用于度量按供应商统计的物料交货计划发布到物料收货之间的天数。\n(衡量物料交付周期,识别瓶颈物料缩短交付周期)",
+            "D=供应商物料交货单收货日期-供应商物料交货单发布日期",
+            "1、每月统计当月物料的平均交付周期。\n2、例如:3月交付的物料共3次,则该物料的平均交货周期=(10+8+7)/3=8.3天。",
+            "S4-交货管理", "天", "采购部",
+            "", "");
+        Ins(db, tenantId, "S4_L3_002", "S4", 3, l2_s4_2, "供应商物料交货满足率(%)", "%", "higher_is_better", 8, false,
+            "用于度量按供应商统计按时完成交货的交货单比例。\n(衡量物料交付满足率,识别瓶颈物料提高满足率)",
+            "S=按时完成供应商物料交货单数量/供应商物料交货单总数",
+            "1、每月统计当月物料的平均交付周期。\n2、例如:3月交付的物料共3次,则该物料的平均交付周期=(100%+80%+70%)/3=83.3%。",
+            "S4-交货管理", "天", "采购部",
+            "", "");
+        Ins(db, tenantId, "S4_L3_003", "S4", 3, l2_s4_3, "供应商物料采购人效(家/人)", "家/人", "higher_is_better", 9, false,
+            "统计期内按供应商的数量比采购人数\n(衡量供应商采购工作效率)",
+            "H=完成收货的供应商数量/采购人数",
+            "1、每月统计当月采购人效。\n2、例如:3月交付的供应商80家/采购人数4人,则该采购人效=80/4=20家/人。",
+            "S4-交货管理", "天", "采购部",
+            "", "");
+        Ins(db, tenantId, "S4_L3_004", "S4", 3, l2_s4_4, "供应商在途物料周转(天)", "天", "lower_is_better", 10, false,
+            "供应商在途物料库存周转天数\n(按供应商分析从供应商发出物料到物料收货,以较少的物料库存资金占用满足生产物料需求)",
+            "D1/D2*30天",
+            "1、供应商在途物料周转天数计算:当月物料入库金额,物料在途金额,例如:6月,D1=6月供应商物料在途金额=100万,D2=(6月供应商物料入库成本)=50万,供应商物料在途周转=100/50=2*30天=60天,每个SKU的在途周转天数=在途物料数量/过去30天平均入库数量",
+            "S4-交货管理", "天", "采购部",
+            "", "");
+        Ins(db, tenantId, "S6_L3_001", "S6", 3, l2_s6_1, "工序制造周期(天)", "天", "lower_is_better", 11, false,
+            "每道从工序开工到工序完工的时长",
+            "每个工序的制造周期=D2-D1",
+            "1、工序制造周期=工序完工日期-工序开工日期\n2、例如:完工日期是12月31日,投产日期是12月28日,则工序制造周期=12月31日-12月28日=3天",
+            "S6-生产执行", "天", "生产部",
+            "", "");
+        Ins(db, tenantId, "S6_L3_002", "S6", 3, l2_s6_2, "工序制造满足率(%)", "%", "higher_is_better", 12, false,
+            "每道工序计划时间内完成数量占工序排产数量的比例",
+            "计划时间内完成制造的数量/工序排产数量",
+            "1、工序制造满足率=工序完工数量/工序排产数量\n2、例如:计划时间内,工序完工110件,工序排产120件,则工序制造满足率=110/120=92%",
+            "S6-生产执行", "天", "生产部",
+            "", "");
+        Ins(db, tenantId, "S6_L3_003", "S6", 3, l2_s6_3, "工序制造人效(个/人)", "个/人", "higher_is_better", 13, false,
+            "统计期内完成制造的工序数量比生产人数",
+            "统计期内完成制造的工序数量/生产人数",
+            "1、统计期内完成制造的工序数量=某工序完成报工的数量\n2、例如:某工序完成数量1000个,生产0.5人,工序制造人效=1000/0.5=2000个/人",
+            "S6-生产执行", "天", "生产部",
+            "", "");
+        Ins(db, tenantId, "S6_L3_004", "S6", 3, l2_s6_4, "工序在制周转(天)", "天", "lower_is_better", 14, false,
+            "每道工序在制周转的天数\n(衡量每个工序在制库存,识别瓶颈工序,提高资金周转效率)",
+            "工序在制周转=在制工序成本/工序入库成本*30天",
+            "1、工序在制周转天数计算:处于在制状态的工序成本,比已完工的工序成本,例如:6月30日计算日,D1=在制工序成本=30万,D2=(6月工序完工成本)=60万,在制周转天数=30/60*30天=15天\n2、SKU:5月30日计算日,D1=(5月在制库存数量)=50个,D2=5月入库数量=150个,SKU在制库存周转天数=50/150*30天=10天",
+            "S6生产执行", "天", "生产部",
+            "QtyOrder、QtyComplete、QtyChangeAdvance、QtyChangeOut、createTime", "工序在制数量、进出存-出库-入库-交易时间");
+        Ins(db, tenantId, "S6_L3_005", "S6", 3, l2_s6_1, "设备制造周期(天)", "天", "lower_is_better", 15, false,
+            "每台设备开工到完工的时长",
+            "每个设备的制造周期=D2-D1",
+            "1、设备制造周期=设备完工日期-设备开工日期\n2、例如:完工日期是12月31日,投产日期是12月28日,则设备制造周期=12月31日-12月28日=3天",
+            "S6-生产执行", "天", "生产部",
+            "", "");
+        Ins(db, tenantId, "S6_L3_006", "S6", 3, l2_s6_2, "设备制造满足率(%)", "%", "higher_is_better", 16, false,
+            "每台设备计划时间内完成数量占设备排产数量的比例",
+            "计划时间内完成制造的数量/设备排产数量",
+            "1、设备制造满足率=设备完工数量/设备排产数量\n2、例如:计划时间内,设备完工110件,设备排产120件,则设备制造满足率=110/120=92%",
+            "S6-生产执行", "天", "生产部",
+            "", "");
+        Ins(db, tenantId, "S6_L3_007", "S6", 3, l2_s6_2, "OEE设备综合效率(%)", "%", "higher_is_better", 17, false,
+            "衡量每台设备效率及质量的综合指标\n(用于识别设备精益生产改善机会)",
+            "OEE=时间稼动率*性能稼动率*良品率\n=稼动时间/负荷时间*标准C/T*生产数/稼动时间*良品数/生产数\n=标准C/T*良品数/负荷时间\n(如设备生产多个产品则累计计算)",
+            "设某设备某天工作时间为10H,计划停机10MIN,故障停机30MIN,设备调整35MIN,产品的理论加工周期为1min/件,一天共加工产品500件,有20件废品,这台设备OEE=1*(500-20)/(10*60-10)=480/590=81%",
+            "S6-生产执行", "天", "生产部",
+            "", "");
+        Ins(db, tenantId, "S6_L3_008", "S6", 3, l2_s6_4, "设备在制周转(天)", "天", "lower_is_better", 18, false,
+            "每台设备在制周转的天数\n(衡量每个设备在制库存,识别瓶颈设备,提高资金周转效率)",
+            "设备在制周转=设备待加工数量/设备完工数量",
+            "1、设备在制周转天数计算:设备待加工=1000件,当天设备完工数量=500件,设备在制周转天数=1000/500=2天",
+            "S6生产执行", "天", "生产部",
+            "", "");
+        Ins(db, tenantId, "S5_L3_001", "S5", 3, l2_s5_1, "物料收货人效(批次/人)", "批次/人", "higher_is_better", 19, false,
+            "统计期内完成物料收货的物料批次比物料收货人数\n(衡量物料收货工作效率)",
+            "H=完成收货的物料批次/物料收货人数",
+            "1、每月统计当月物料仓储人效。\n2、例如:3月收货的工单物料共1000批次/收货人数4人,则该物料收货人效=1000/4=250批次/人。",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        Ins(db, tenantId, "S5_L3_002", "S5", 3, l2_s5_1, "收货物料周转(天)", "天", "lower_is_better", 20, false,
+            "物料在收货区周转天数\n(衡量仓库收货效率)",
+            "收货物料周转=收货区物料库存成本/物料入库成本",
+            "1、收货物料周转天数计算:当月物料入库金额,物料收货区金额,例如:6月,D1=6月物料收货区金额=10万,D2=(6月物料入库成本)=50万,收货物料周转=10/50=0.2*30天=6天",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        Ins(db, tenantId, "S5_L3_003", "S5", 3, l2_s5_3, "物料检验人效(批次/人)", "批次/人", "higher_is_better", 21, false,
+            "统计期内完成物料检验的物料批次比物料检验人数\n(衡量物料检验工作效率)",
+            "H=完成检验的物料批次/物料检验人数",
+            "1、每月统计当月物料仓储人效。\n2、例如:3月检验的工单物料共1000批次/检验人数4人,则该物料检验人效=1000/4=250批次/人。",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        Ins(db, tenantId, "S5_L3_004", "S5", 3, l2_s5_3, "检验物料周转(天)", "天", "lower_is_better", 22, false,
+            "物料在检验区周转天数\n(衡量仓库检验效率)",
+            "检验物料周转=检验区物料库存成本/物料入库成本",
+            "1、检验物料周转天数计算:当月物料入库金额,物料检验区金额,例如:6月,D1=6月物料检验区金额=12万,D2=(6月物料入库成本)=50万,检验物料周转=12/50=0.24*30天=7.2天",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+        Ins(db, tenantId, "S5_L3_005", "S5", 3, l2_s5_5, "物料上架满足率(%)", "%", "higher_is_better", 23, false,
+            "用于度量按时完成上架的工单物料比例。\n(衡量物料上架满足率,识别瓶颈物料提高满足率)",
+            "S=工单开工日期前完成物料上架行数/工单物料总行数",
+            "1、每月统计当月工单物料的平均上架满足率。\n2、例如:3月工单物料共100行,工单计划开工日期前=(100%+80%+70%)/3=83.3%。",
+            "S5-物料仓储", "天", "仓储物流部",
+            "", "");
+    }
+
+    private static long Ins(ISqlSugarClient db, long tenantId, string code, string module, int level, long? parentId,
+        string name, string unit, string direction, int sortNo, bool isHomePage,
+        string desc, string formula, string calcRule,
+        string dataSource, string statFreq, string dept,
+        string dopFields, string remark)
+    {
+        var e = new AdoSmartOpsKpiMaster
+        {
+            MetricCode = code,
+            ModuleCode = module,
+            MetricLevel = level,
+            ParentId = parentId,
+            MetricName = name,
+            Unit = string.IsNullOrEmpty(unit) ? null : unit,
+            Direction = direction,
+            SortNo = sortNo,
+            IsHomePage = isHomePage,
+            Description = string.IsNullOrEmpty(desc) ? null : desc,
+            Formula = string.IsNullOrEmpty(formula) ? null : formula,
+            CalcRule = string.IsNullOrEmpty(calcRule) ? null : calcRule,
+            DataSource = string.IsNullOrEmpty(dataSource) ? null : dataSource,
+            StatFrequency = string.IsNullOrEmpty(statFreq) ? null : statFreq,
+            Department = string.IsNullOrEmpty(dept) ? null : dept,
+            DopFields = string.IsNullOrEmpty(dopFields) ? null : dopFields,
+            Remark = string.IsNullOrEmpty(remark) ? null : remark,
+            YellowThreshold = direction == "lower_is_better" ? 110m : 95m,
+            RedThreshold = direction == "lower_is_better" ? 120m : 80m,
+            IsEnabled = true,
+            TenantId = tenantId,
+            CreatedAt = DateTime.Now
+        };
+        return db.Insertable(e).ExecuteReturnBigIdentity();
+    }
+}

+ 57 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Infrastructure/AidopS4KpiMerge.cs

@@ -0,0 +1,57 @@
+namespace Admin.NET.Plugin.AiDOP.Infrastructure;
+
+/// <summary>
+/// L1/L2 合并:期量差与绿黄红(指标模型总方案 03)。
+/// 阈值含义(以达标比例%表示):
+///   higher_is_better: 绿 actual/target >= 100%;黄 >= yellowPct;红 &lt; redPct
+///   lower_is_better:  绿 actual/target &lt;= 100%;黄 &lt;= yellowPct;红 > redPct
+/// 默认值:higher (95/80)  lower (110/120)
+/// </summary>
+public static class AidopS4KpiMerge
+{
+    public const string Green = "green";
+    public const string Yellow = "yellow";
+    public const string Red = "red";
+
+    public static string AchievementLevel(
+        decimal? current, decimal? target, string direction,
+        decimal? yellowThreshold = null, decimal? redThreshold = null)
+    {
+        if (current == null || target == null)
+            return Yellow;
+        var c = current.Value;
+        var t = target.Value;
+        if (t == 0) return Yellow;
+
+        if (direction == "lower_is_better")
+        {
+            var yPct = yellowThreshold ?? 110m;
+            var rPct = redThreshold ?? 120m;
+            if (c <= t) return Green;
+            if (c <= t * yPct / 100m) return Yellow;
+            return Red;
+        }
+
+        // higher_is_better
+        {
+            var yPct = yellowThreshold ?? 95m;
+            var rPct = redThreshold ?? 80m;
+            if (c >= t) return Green;
+            if (c >= t * yPct / 100m) return Yellow;
+            return Red;
+        }
+    }
+
+    /// <summary>期量差数值(当前−目标);展示用箭头与符号在调用方处理。</summary>
+    public static decimal? GapValue(decimal? current, decimal? target)
+    {
+        if (current == null || target == null) return null;
+        return current.Value - target.Value;
+    }
+
+    public static string GapArrow(decimal? gap)
+    {
+        if (gap == null) return "flat";
+        return gap.Value >= 0 ? "up" : "down";
+    }
+}

+ 18 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Infrastructure/AidopTenantHelper.cs

@@ -0,0 +1,18 @@
+using Admin.NET.Core;
+using Microsoft.AspNetCore.Http;
+
+namespace Admin.NET.Plugin.AiDOP.Infrastructure;
+
+/// <summary>
+/// 从当前 HTTP 请求中提取 TenantId;匿名请求回退到框架默认租户。
+/// </summary>
+public static class AidopTenantHelper
+{
+    public static long GetTenantId(HttpContext? ctx)
+    {
+        var claim = ctx?.User?.FindFirst(ClaimConst.TenantId)?.Value;
+        if (!string.IsNullOrWhiteSpace(claim) && long.TryParse(claim, out var tid) && tid > 0)
+            return tid;
+        return SqlSugarConst.DefaultTenantId;
+    }
+}

+ 77 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Infrastructure/AidopTenantMigration.cs

@@ -0,0 +1,77 @@
+using System.Diagnostics;
+using Admin.NET.Core;
+using SqlSugar;
+
+namespace Admin.NET.Plugin.AiDOP.Infrastructure;
+
+/// <summary>
+/// 一次性迁移:将历史 TenantId=1 的 AiDOP 业务数据更新为框架默认租户。
+/// 幂等——若已无 TenantId=1 的行则不做任何事。
+/// </summary>
+public static class AidopTenantMigration
+{
+    private static readonly string[] Tables =
+    {
+        "ado_smart_ops_kpi_master",
+        "ado_smart_ops_layout_item",
+        "ado_smart_ops_home_module",
+        "ado_s9_kpi_value_l1_day",
+        "ado_s9_kpi_value_l2_day",
+        "ado_s9_kpi_value_l3_day"
+    };
+
+    public static void MigrateOldTenantId(ISqlSugarClient db)
+    {
+        var target = SqlSugarConst.DefaultTenantId;
+        if (target == 1) return;
+
+        foreach (var tbl in Tables)
+        {
+            try
+            {
+                db.Ado.ExecuteCommand(
+                    $"UPDATE `{tbl}` SET `TenantId` = @target WHERE `TenantId` = 1",
+                    new { target });
+            }
+            catch (Exception ex)
+            {
+                Trace.TraceWarning($"AidopTenantMigration [{tbl}]: {ex.Message}");
+            }
+        }
+
+        DropOldUniqueIndex(db);
+        BackfillThresholds(db);
+    }
+
+    private static void BackfillThresholds(ISqlSugarClient db)
+    {
+        try
+        {
+            db.Ado.ExecuteCommand(
+                "UPDATE ado_smart_ops_kpi_master SET YellowThreshold=95, RedThreshold=80 " +
+                "WHERE YellowThreshold IS NULL AND Direction='higher_is_better'");
+            db.Ado.ExecuteCommand(
+                "UPDATE ado_smart_ops_kpi_master SET YellowThreshold=110, RedThreshold=120 " +
+                "WHERE YellowThreshold IS NULL AND Direction='lower_is_better'");
+        }
+        catch (Exception ex)
+        {
+            Trace.TraceWarning($"AidopTenantMigration backfill thresholds: {ex.Message}");
+        }
+    }
+
+    private static void DropOldUniqueIndex(ISqlSugarClient db)
+    {
+        try
+        {
+            var rows = db.Ado.SqlQuery<dynamic>(
+                "SHOW INDEX FROM ado_smart_ops_kpi_master WHERE Key_name = 'uk_kpi_master_code'");
+            if (rows != null && rows.Count > 0)
+                db.Ado.ExecuteCommand("ALTER TABLE ado_smart_ops_kpi_master DROP INDEX uk_kpi_master_code");
+        }
+        catch (Exception ex)
+        {
+            Trace.TraceWarning($"AidopTenantMigration drop old index: {ex.Message}");
+        }
+    }
+}

+ 3 - 1
server/Plugins/Admin.NET.Plugin.AiDOP/SeedData/SysMenuSeedData.cs

@@ -128,9 +128,12 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             OrderNo = 252,
             Remark = "Ai-DOP 智慧运营看板分组"
         };
+        // OrderNo:建模紧接九宫格之后,避免在侧栏最底部不易发现;已落库环境需在菜单管理调序或改库
         var children = new (long Id, string Path, string Name, string Title, string Component, int Order)[]
         {
             (1320990000301L, "/aidop/smart-ops/grid", "aidopSmartOpsGrid", "九宫格智慧运营看板", "/dashboard/home", 100),
+            (1320990000311L, "/aidop/smart-ops/modeling", "aidopSmartOpsModeling", "运营指标建模", "/aidop/kanban/s0", 105),
+            (1320990000312L, "/aidop/smart-ops/kpi-master", "aidopSmartOpsKpiMaster", "运营指标主数据", "/aidop/kanban/kpiMaster", 106),
             (1320990000302L, "/aidop/smart-ops/s1", "aidopSmartOpsS1", "S1产销协同看板", "/aidop/kanban/s1", 110),
             (1320990000303L, "/aidop/smart-ops/s2", "aidopSmartOpsS2", "S2制造协同看板", "/aidop/kanban/s2", 120),
             (1320990000304L, "/aidop/smart-ops/s3", "aidopSmartOpsS3", "S3供应协同看板", "/aidop/kanban/s3", 130),
@@ -140,7 +143,6 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             (1320990000308L, "/aidop/smart-ops/s7", "aidopSmartOpsS7", "S7成品仓储看板", "/aidop/kanban/s7", 170),
             (1320990000309L, "/aidop/smart-ops/s8", "aidopSmartOpsS8", "S8异常监控看板", "/aidop/kanban/s8", 180),
             (1320990000310L, "/aidop/smart-ops/s9", "aidopSmartOpsS9", "S9运营指标看板", "/aidop/kanban/s9", 190),
-            (1320990000311L, "/aidop/smart-ops/modeling", "aidopSmartOpsModeling", "运营指标建模", "/aidop/kanban/s0", 200),
         };
         foreach (var (id, path, name, title, component, order) in children)
         {

+ 15 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Startup.cs

@@ -44,6 +44,21 @@ public class Startup : AppStartup
             Trace.TraceWarning("Ai-DOP AidopMenuLinkSync: " + ex);
         }
 
+        try
+        {
+            using var scopeS4 = app.ApplicationServices.CreateScope();
+            var dbS4 = scopeS4.ServiceProvider.GetRequiredService<ISqlSugarClient>();
+            dbS4.CodeFirst.InitTables(typeof(AdoSmartOpsLayoutItem), typeof(AdoSmartOpsHomeModule), typeof(AdoSmartOpsKpiMaster));
+
+            AidopTenantMigration.MigrateOldTenantId(dbS4);
+            AidopKpiMasterSeed.EnsureSeed(dbS4);
+            AidopKpiMasterSeed.EnsureSeed(dbS4, 1300000000888);
+        }
+        catch (Exception ex)
+        {
+            Trace.TraceWarning("Ai-DOP CodeFirst/S4 seed: " + ex);
+        }
+
         if (!env.IsDevelopment())
             return;