diff --git a/zhican/admin/src/views/business-flow/index.vue b/zhican/admin/src/views/business-flow/index.vue index 923859a..d373b9b 100644 --- a/zhican/admin/src/views/business-flow/index.vue +++ b/zhican/admin/src/views/business-flow/index.vue @@ -8,6 +8,7 @@ 供应链主线 关联矩阵 模块详情 + 业务闭环 @@ -39,6 +40,7 @@ {{ node.label }} {{ node.badge }} + {{ node.dataSource }}
@@ -221,6 +223,29 @@ + + +
+ + + +

{{ loop.desc }}

+ + + + + + +
+ {{ page }} +
+
+
+
+
@@ -229,7 +254,7 @@ import { ref, computed } from 'vue' import { useRouter } from 'vue-router' const router = useRouter() -const viewMode = ref<'chain' | 'matrix' | 'detail'>('chain') +const viewMode = ref<'chain' | 'matrix' | 'detail' | 'loop'>('chain') const activeStage = ref('green') const hoveredNode = ref('') const hoverCell = ref('') @@ -247,49 +272,49 @@ const supplyChain = [ { id: 'green', name: '绿色种采', icon: '🌱', color: '#52c41a', nodes: [ - { key: 'land-env', label: '土地环境' }, - { key: 'planting-monitor', label: '种养监控' }, - { key: 'harvest-storage', label: '收成入库', badge: '出' }, - { key: 'supplier-mgmt', label: '供商管理' }, - { key: 'procurement-mgmt', label: '采供管理', badge: '出' }, + { key: 'land-env', label: '土地环境', dataSource: '传感器' }, + { key: 'planting-monitor', label: '种养监控', dataSource: '传感器' }, + { key: 'harvest-storage', label: '收成入库', badge: '出', dataSource: '智能秤' }, + { key: 'supplier-mgmt', label: '供商管理', dataSource: '人工录入' }, + { key: 'procurement-mgmt', label: '采购管理', badge: '出', dataSource: '系统生成' }, ], }, { id: 'hygiene', name: '卫生供应', icon: '🧪', color: '#1890ff', nodes: [ - { key: 'hygiene-test', label: '卫生检测', badge: '验' }, - { key: 'raw-storage', label: '毛菜入库', badge: '入' }, - { key: 'clean-process', label: '净菜加工' }, - { key: 'clean-storage', label: '净菜入库' }, - { key: 'clean-internal', label: '净菜内供', badge: '出' }, - { key: 'clean-external', label: '净菜外售', badge: '出' }, + { key: 'hygiene-test', label: '卫生检测', badge: '验', dataSource: '设备检测' }, + { key: 'raw-storage', label: '毛菜管理', badge: '入', dataSource: '智能秤' }, + { key: 'clean-process', label: '净菜加工', dataSource: '智能秤' }, + { key: 'clean-storage', label: '净菜入库', dataSource: '智能秤' }, + { key: 'clean-internal', label: '净菜内供', badge: '出', dataSource: '系统计算' }, + { key: 'clean-external', label: '净菜外售', badge: '出', dataSource: '人工录入' }, ], }, { id: 'health', name: '健康生产', icon: '👨‍🍳', color: '#faad14', nodes: [ - { key: 'food-safety', label: '食安监控', badge: '验' }, - { key: 'recipe-plan', label: '食谱规划' }, - { key: 'clean-order', label: '净菜订单', badge: '入' }, - { key: 'clean-cabinet', label: '净菜进柜' }, - { key: 'clean-assemble', label: '净菜组配' }, - { key: 'cook-by-order', label: '按单烹制' }, - { key: 'serving-monitor', label: '上餐监控', badge: '出' }, - { key: 'surplus-disposal', label: '余量处置' }, - { key: 'production-stats', label: '生产统计' }, + { key: 'food-safety', label: '食安监控', badge: '验', dataSource: 'AI视频' }, + { key: 'recipe-plan', label: '食谱规划', dataSource: '系统计算' }, + { key: 'clean-order', label: '净菜订单', badge: '入', dataSource: '系统生成' }, + { key: 'clean-cabinet', label: '净菜进柜', dataSource: '智能秤' }, + { key: 'clean-assemble', label: '净菜组配', dataSource: '人工录入' }, + { key: 'cook-by-order', label: '按单烹制', dataSource: '智能秤' }, + { key: 'serving-monitor', label: '上餐监控', badge: '出', dataSource: '传感器' }, + { key: 'surplus-disposal', label: '余量处置', dataSource: '智能秤' }, + { key: 'production-stats', label: '生产统计', dataSource: '系统计算' }, ], }, { id: 'nutrition', name: '营养用餐', icon: '🍽️', color: '#722ed1', nodes: [ - { key: 'nutrition-test', label: '营养检验', badge: '验' }, - { key: 'food-composition', label: '食物成分' }, - { key: 'dish-inventory', label: '餐品总库' }, - { key: 'recipe-mgmt', label: '食谱管理' }, - { key: 'nutrition-order', label: '营养点餐' }, - { key: 'pickup-mgmt', label: '取餐管理' }, - { key: 'consumption-mgmt', label: '消费管理' }, - { key: 'nutrition-mgmt', label: '营养管理' }, + { key: 'nutrition-test', label: '营养检验', badge: '验', dataSource: '设备检测' }, + { key: 'food-composition', label: '食物成分', dataSource: '人工录入' }, + { key: 'dish-inventory', label: '餐品总库', dataSource: '人工录入' }, + { key: 'recipe-mgmt', label: '食谱管理', dataSource: '人工录入' }, + { key: 'nutrition-order', label: '营养点餐', dataSource: '系统计算' }, + { key: 'pickup-mgmt', label: '取餐管理', dataSource: '硬件自动' }, + { key: 'consumption-mgmt', label: '消费管理', dataSource: '系统计算' }, + { key: 'nutrition-mgmt', label: '营养管理', dataSource: '系统计算' }, ], }, ] @@ -519,6 +544,53 @@ const moduleDetails: Record = { } const selectedModuleData = computed(() => moduleDetails[selectedModule.value]) + +function dataSourceColor(source: string) { + const map: Record = { '硬件自动': 'blue', '设备检测': 'purple', '人工录入': 'orange', '系统计算': 'cyan', '系统生成': 'cyan', 'AI视频': 'red', '智能秤': 'blue', '传感器': 'blue' } + return map[source] || 'default' +} + +const businessLoops = [ + { + title: '闭环1:食谱驱动反向采购', + color: '#1890ff', + desc: '基于食谱规划自动反算原料需求,生成采购订单,校验到货量,确保数据一致', + steps: [ + { name: '食谱规划', detail: '编排周/日食谱,系统反算净菜/毛菜需求', source: '系统计算' }, + { name: '生成采购订单', detail: '自动生成净菜采购订单推送加工端', source: '系统生成' }, + { name: '净菜进柜校验', detail: '智能秤校验订单量 vs 实收量', source: '智能秤' }, + { name: '库存动态表', detail: '送多少、用多少、产多少数据一致', source: '系统计算' }, + ], + pages: ['recipe-plan', 'clean-order', 'clean-cabinet', 'clean-assemble'], + }, + { + title: '闭环2:按单烹饪与熟重计量', + color: '#52c41a', + desc: '从生重到熟重全链路追踪,结合AI视频解析工艺动作', + steps: [ + { name: '生重称重', detail: '锅具上秤即采,自动记录生重', source: '智能秤' }, + { name: '调料时间点', detail: '采集放盐/油/花椒时刻', source: '传感器' }, + { name: '工艺动作识别', detail: '翻炒/颠勺/正反转等动作识别', source: 'AI视频' }, + { name: '熟重称重', detail: '烹饪完成自动称重', source: '智能秤' }, + { name: '上餐+温度衰减', detail: '记录上餐时间,监控温度衰减', source: '传感器' }, + { name: '开餐/加餐流转', detail: '效期预警,加餐自动触发', source: '系统计算' }, + ], + pages: ['cook-by-order', 'serving-monitor'], + }, + { + title: '闭环3:餐线调度与取餐治理', + color: '#722ed1', + desc: '以秤编号为单位,实时统计取餐量,智能补餐和双模识别', + steps: [ + { name: '秤绑定菜品序列', detail: '记录全天菜品更换序列', source: '智能秤' }, + { name: '取餐量实时统计', detail: '各时段取餐量自动汇总', source: '智能秤' }, + { name: '补餐阈值触发', detail: '存量<1/5自动触发补餐提醒', source: '系统计算' }, + { name: '时间过滤', detail: '可配置禁加餐时间', source: '系统计算' }, + { name: '双模取餐识别', detail: '人脸识别+RFID夹子绑定', source: '硬件自动' }, + ], + pages: ['meal-line', 'pickup-mgmt', 'consumption-mgmt'], + }, +] \ No newline at end of file +.trace-overview { + padding: 0; +} +.trace-title { + font-weight: 600; + margin-bottom: 6px; +} +.ingredient-item { + margin-top: 8px; + padding: 8px 12px; + background: #fafafa; + border-radius: 6px; +} + diff --git a/zhican/admin/src/views/nutrition-dining/meal-line/index.vue b/zhican/admin/src/views/nutrition-dining/meal-line/index.vue index 6461872..d4d5f9a 100644 --- a/zhican/admin/src/views/nutrition-dining/meal-line/index.vue +++ b/zhican/admin/src/views/nutrition-dining/meal-line/index.vue @@ -21,24 +21,37 @@ {{ statusMap[line.status]?.text }} - + - + + + + {{ line.canteen }} - {{ line.capacity }} + + + + + + {{ line.stockPercent < 20 ? '需补餐' : '正常' }} + + 禁加餐 + {{ line.manager }} - {{ line.equipment }} +
- 编辑 + 监控视频 查看详情
@@ -49,9 +62,14 @@