From 5b34a1458e74f8902d01ebd844c2954f554c9e74 Mon Sep 17 00:00:00 2001
From: xiazhengtongxue <133085197+xiazhengtongxue@users.noreply.github.com>
Date: 星期四, 30 四月 2026 11:05:37 +0800
Subject: [PATCH] 1

---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Task/RobotTaskController.cs       |   65 ---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs                  |   79 ++++
 Code/WMS/WIDESEA_WMSClient/src/views/Home.vue                                              |  353 ++++++++------------
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs     |   33 +
 Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json                              |    1 
 Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/extend/AddRobotTask.vue                  |  196 +++++++++--
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs                      |    2 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json                              |    4 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs      |   91 +++-
 Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_TaskStatus.cs           |    4 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs  |  118 ++++--
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs |    8 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskService.cs                |    3 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/TaskInfo/CreateTaskDto.cs                        |   35 ++
 14 files changed, 610 insertions(+), 382 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/extend/AddRobotTask.vue b/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/extend/AddRobotTask.vue
index 0146166..aecaf06 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/extend/AddRobotTask.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/extend/AddRobotTask.vue
@@ -1,26 +1,61 @@
 <template>
   <div>
-    <!-- 鎵嬪姩鍒涘缓鎹㈢洏鏈烘鎵嬩换鍔″脊绐� -->
-    <vol-box v-model="showManualCreate" :lazy="true" width="500px" :padding="15" title="鎵嬪姩鍒涘缓鎹㈢洏鏈烘鎵嬩换鍔�">
+    <!-- 鎵嬪姩鍒涘缓鏈哄櫒浜轰换鍔″脊绐� -->
+    <vol-box v-model="showManualCreate" :lazy="true" width="550px" :padding="15" title="鎵嬪姩鍒涘缓鏈哄櫒浜轰换鍔�">
       <el-form :model="manualFormData" ref="form" label-width="120px">
-        <el-form-item label="鏉ユ簮鍦板潃鎵樼洏鐮�" prop="robotSourceAddressPalletCode" required>
-          <el-input v-model="manualFormData.robotSourceAddressPalletCode" placeholder="璇疯緭鍏ユ潵婧愬湴鍧�鎵樼洏鐮�"></el-input>
+        <!-- 浠诲姟绫诲瀷閫夋嫨 -->
+        <el-form-item label="浠诲姟绫诲瀷" prop="robotRoadway" required>
+          <el-select v-model="manualFormData.robotRoadway" placeholder="璇烽�夋嫨浠诲姟绫诲瀷" @change="onTaskTypeChange">
+            <el-option label="缁勭洏浠诲姟" value="GroupPallet"></el-option>
+            <el-option label="鎹㈢洏浠诲姟" value="ChangePallet"></el-option>
+            <el-option label="鎷嗙洏浠诲姟" value="SplitPallet"></el-option>
+          </el-select>
         </el-form-item>
-        <el-form-item label="鐩爣鍦板潃鎵樼洏鐮�" prop="robotTargetAddressPalletCode" required>
-          <el-input v-model="manualFormData.robotTargetAddressPalletCode" placeholder="璇疯緭鍏ョ洰鏍囧湴鍧�鎵樼洏鐮�"></el-input>
-        </el-form-item>
-        <el-form-item label="鏂瑰悜" prop="forward" required>
-          <el-radio-group v-model="manualFormData.forward">
-            <el-radio :label="1">鍘诲寲鎴�(婧�:1鈫掔洰鏍�:3)</el-radio>
-            <el-radio :label="2">鍘诲寲鎴�(婧�:2鈫掔洰鏍�:4)</el-radio>
-            <el-radio :label="3">鍥為珮娓�(婧�:3鈫掔洰鏍�:1)</el-radio>
-            <el-radio :label="4">鍥為珮娓�(婧�:4鈫掔洰鏍�:2)</el-radio>
-          </el-radio-group>
-        </el-form-item>
+
+        <!-- 缁勭洏浠诲姟锛氫粎闇�鐩爣鍦板潃鎵樼洏鐮佸拰浠诲姟鎬绘暟 -->
+        <template v-if="manualFormData.robotRoadway === 'GroupPallet'">
+          <el-form-item label="鐩爣鍦板潃鎵樼洏鐮�" prop="robotTargetAddressPalletCode" required>
+            <el-input v-model="manualFormData.robotTargetAddressPalletCode" placeholder="璇疯緭鍏ョ洰鏍囧湴鍧�鎵樼洏鐮�"></el-input>
+          </el-form-item>
+          <el-form-item label="浠诲姟鎬绘暟" prop="robotTaskTotalNum" required>
+            <el-input-number v-model="manualFormData.robotTaskTotalNum" :min="1" :max="999" label="浠诲姟鎬绘暟"></el-input-number>
+          </el-form-item>
+        </template>
+
+        <!-- 鎹㈢洏浠诲姟锛氶渶鏉ユ簮銆佺洰鏍囨墭鐩樼爜鍜�4涓柟鍚� -->
+        <template v-if="manualFormData.robotRoadway === 'ChangePallet'">
+          <el-form-item label="鏉ユ簮鍦板潃鎵樼洏鐮�" prop="robotSourceAddressPalletCode" required>
+            <el-input v-model="manualFormData.robotSourceAddressPalletCode" placeholder="璇疯緭鍏ユ潵婧愬湴鍧�鎵樼洏鐮�"></el-input>
+          </el-form-item>
+          <el-form-item label="鐩爣鍦板潃鎵樼洏鐮�" prop="robotTargetAddressPalletCode" required>
+            <el-input v-model="manualFormData.robotTargetAddressPalletCode" placeholder="璇疯緭鍏ョ洰鏍囧湴鍧�鎵樼洏鐮�"></el-input>
+          </el-form-item>
+          <el-form-item label="鏂瑰悜" prop="forward" required>
+            <el-radio-group v-model="manualFormData.forward">
+              <el-radio :label="1">鍘诲寲鎴�1: 婧�:1(11010) 鈫� 鐩爣:3(2103)</el-radio>
+              <el-radio :label="2">鍘诲寲鎴�2: 婧�:2(11001) 鈫� 鐩爣:4(2101)</el-radio>
+              <el-radio :label="3">鍥為珮娓�3: 婧�:4(2103) 鈫� 鐩爣:2(11010)</el-radio>
+              <el-radio :label="4">鍥為珮娓�4: 婧�:4(2101) 鈫� 鐩爣:2(11001)</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="浠诲姟鎬绘暟" prop="robotTaskTotalNum" required>
+            <el-input-number v-model="manualFormData.robotTaskTotalNum" :min="1" :max="999" label="浠诲姟鎬绘暟"></el-input-number>
+          </el-form-item>
+        </template>
+
+        <!-- 鎷嗙洏浠诲姟锛氫粎闇�鏉ユ簮鍦板潃鎵樼洏鐮佸拰浠诲姟鎬绘暟 -->
+        <template v-if="manualFormData.robotRoadway === 'SplitPallet'">
+          <el-form-item label="鏉ユ簮鍦板潃鎵樼洏鐮�" prop="robotSourceAddressPalletCode" required>
+            <el-input v-model="manualFormData.robotSourceAddressPalletCode" placeholder="璇疯緭鍏ユ潵婧愬湴鍧�鎵樼洏鐮�"></el-input>
+          </el-form-item>
+          <el-form-item label="浠诲姟鎬绘暟" prop="robotTaskTotalNum" required>
+            <el-input-number v-model="manualFormData.robotTaskTotalNum" :min="1" :max="999" label="浠诲姟鎬绘暟"></el-input-number>
+          </el-form-item>
+        </template>
       </el-form>
       <template #footer>
         <el-button type="primary" size="small" @click="submitManualCreate">纭畾</el-button>
-        <el-button type="danger" size="small" @click="showManualCreate = false">鍏抽棴</el-button>
+        <el-button type="danger" size="small" @click="closeDialog">鍏抽棴</el-button>
       </template>
     </vol-box>
   </div>
@@ -35,10 +70,25 @@
   data() {
     return {
       showManualCreate: false,
+      // 浠诲姟绫诲瀷鏄犲皠锛堢敤浜庢樉绀轰腑鏂囧悕绉帮級
+      taskTypeMap: {
+        GroupPallet: "缁勭洏浠诲姟",
+        ChangePallet: "鎹㈢洏浠诲姟",
+        SplitPallet: "鎷嗙洏浠诲姟",
+      },
+      // 鏂瑰悜鎻忚堪鏄犲皠
+      directionMap: {
+        1: "鍘诲寲鎴�1: 婧�:1(11010) 鈫� 鐩爣:3(2103)",
+        2: "鍘诲寲鎴�2: 婧�:2(11001) 鈫� 鐩爣:4(2101)",
+        3: "鍥為珮娓�3: 婧�:4(2103) 鈫� 鐩爣:2(11010)",
+        4: "鍥為珮娓�4: 婧�:4(2101) 鈫� 鐩爣:2(11001)",
+      },
       manualFormData: {
-        robotSourceAddressPalletCode: "",
-        robotTargetAddressPalletCode: "",
-        forward: 1, // 1=鍘诲寲鎴�(1鈫�3), 2=鍘诲寲鎴�(2鈫�4), 3=鍥為珮娓�(3鈫�1), 4=鍥為珮娓�(4鈫�2)
+        robotRoadway: "",               // 鏈哄櫒浜哄悕绉�/浠诲姟绫诲瀷
+        robotSourceAddressPalletCode: "", // 鏉ユ簮鍦板潃鎵樼洏鐮�
+        robotTargetAddressPalletCode: "", // 鐩爣鍦板潃鎵樼洏鐮�
+        forward: 1,                     // 鏂瑰悜锛堟崲鐩樹换鍔′娇鐢紝1-4锛�
+        robotTaskTotalNum: 1,           // 浠诲姟鎬绘暟
       },
     };
   },
@@ -48,41 +98,111 @@
       this.showManualCreate = true;
       this.resetManualForm();
     },
-    
+
+    // 鍏抽棴寮圭獥
+    closeDialog() {
+      this.showManualCreate = false;
+    },
+
     // 閲嶇疆琛ㄥ崟
     resetManualForm() {
       this.manualFormData = {
+        robotRoadway: "",
         robotSourceAddressPalletCode: "",
         robotTargetAddressPalletCode: "",
         forward: 1,
+        robotTaskTotalNum: 1,
       };
     },
-    
+
+    // 浠诲姟绫诲瀷鍒囨崲鏃堕噸缃浉鍏冲瓧娈�
+    onTaskTypeChange(value) {
+      this.manualFormData.robotSourceAddressPalletCode = "";
+      this.manualFormData.robotTargetAddressPalletCode = "";
+      this.manualFormData.forward = 1;
+    },
+
+    // 琛ㄥ崟楠岃瘉
+    validateForm() {
+      const data = this.manualFormData;
+
+      // 1. 蹇呴�変换鍔$被鍨�
+      if (!data.robotRoadway) {
+        this.$message.error("璇烽�夋嫨浠诲姟绫诲瀷");
+        return false;
+      }
+
+      // 2. 鏍规嵁浠诲姟绫诲瀷楠岃瘉蹇呭~瀛楁
+      const taskType = data.robotRoadway;
+
+      if (taskType === "GroupPallet") {
+        if (!data.robotTargetAddressPalletCode) {
+          this.$message.error("缁勭洏浠诲姟锛氳杈撳叆鐩爣鍦板潃鎵樼洏鐮�");
+          return false;
+        }
+      } else if (taskType === "ChangePallet") {
+        if (!data.robotSourceAddressPalletCode) {
+          this.$message.error("鎹㈢洏浠诲姟锛氳杈撳叆鏉ユ簮鍦板潃鎵樼洏鐮�");
+          return false;
+        }
+        if (!data.robotTargetAddressPalletCode) {
+          this.$message.error("鎹㈢洏浠诲姟锛氳杈撳叆鐩爣鍦板潃鎵樼洏鐮�");
+          return false;
+        }
+        // 楠岃瘉鏂瑰悜 1-4
+        if (![1, 2, 3, 4].includes(data.forward)) {
+          this.$message.error("鎹㈢洏浠诲姟锛氳閫夋嫨鏈夋晥鐨勬柟鍚�(1-4)");
+          return false;
+        }
+      } else if (taskType === "SplitPallet") {
+        if (!data.robotSourceAddressPalletCode) {
+          this.$message.error("鎷嗙洏浠诲姟锛氳杈撳叆鏉ユ簮鍦板潃鎵樼洏鐮�");
+          return false;
+        }
+      }
+
+      // 3. 楠岃瘉浠诲姟鎬绘暟
+      if (data.robotTaskTotalNum < 1) {
+        this.$message.error("浠诲姟鎬绘暟涓嶈兘灏忎簬1");
+        return false;
+      }
+
+      return true;
+    },
+
     // 鎻愪氦鎵嬪姩鍒涘缓浠诲姟
     submitManualCreate() {
       // 琛ㄥ崟楠岃瘉
-      if (!this.manualFormData.robotSourceAddressPalletCode) {
-        return this.$message.error("璇疯緭鍏ユ潵婧愬湴鍧�鎵樼洏鐮�");
-      }
-      if (!this.manualFormData.robotTargetAddressPalletCode) {
-        return this.$message.error("璇疯緭鍏ョ洰鏍囧湴鍧�鎵樼洏鐮�");
-      }
-      if (this.manualFormData.forward === undefined || this.manualFormData.forward === null) {
-        return this.$message.error("璇烽�夋嫨鏂瑰悜");
+      if (!this.validateForm()) {
+        return;
       }
 
-      // 璋冪敤鍚庣API鍒涘缓鎹㈢洏鏈烘鎵嬩换鍔�
+      // 鏋勫缓璇锋眰鍙傛暟锛堜笌鍚庣 ManualRobotTaskDto 瀵瑰簲锛�
+      const params = {
+        robotRoadway: this.manualFormData.robotRoadway,
+        robotSourceAddressPalletCode: this.manualFormData.robotSourceAddressPalletCode,
+        robotTargetAddressPalletCode: this.manualFormData.robotTargetAddressPalletCode,
+        robotTaskTotalNum: this.manualFormData.robotTaskTotalNum,
+        forward: this.manualFormData.forward,  // 鏂瑰悜锛屾暣鍨� 1-4
+      };
+
+      // 鑾峰彇浠诲姟绫诲瀷涓枃鍚嶇О鐢ㄤ簬鎻愮ず
+      const taskTypeName = this.taskTypeMap[params.robotRoadway] || "鏈哄櫒浜�";
+
+      // 鑾峰彇鏂瑰悜鎻忚堪锛堜粎鎹㈢洏浠诲姟锛�
+      let directionDesc = "";
+      if (params.robotRoadway === "ChangePallet") {
+        directionDesc = this.directionMap[params.forward] || "";
+      }
+
+      // 璋冪敤鍚庣API鍒涘缓鏈哄櫒浜轰换鍔�
       this.http
-        .post("api/RobotTask/AddRobotTask", {
-          robotSourceAddressPalletCode: this.manualFormData.robotSourceAddressPalletCode,
-          robotTargetAddressPalletCode: this.manualFormData.robotTargetAddressPalletCode,
-          forward: this.manualFormData.forward,  // 娉ㄦ剰瀛楁鍚嶆敼涓篺orward锛岀被鍨嬩负鏁存暟
-        }, "鍒涘缓鎹㈢洏鏈烘鎵嬩换鍔′腑...")
+        .post("api/RobotTask/CreateRobotTaskManually", params, `鍒涘缓${taskTypeName}${directionDesc ? ' - ' + directionDesc : ''}涓�...`)
         .then((res) => {
           if (!res.status) {
             return this.$message.error(res.message);
           }
-          this.$message.success("鎹㈢洏鏈烘鎵嬩换鍔″垱寤烘垚鍔�");
+          this.$message.success(`${taskTypeName}${directionDesc ? ' - ' + directionDesc : ''}鍒涘缓鎴愬姛`);
           this.showManualCreate = false;
           // 鍒锋柊鐖堕〉闈㈡暟鎹�
           this.$emit("parentCall", ($vue) => {
@@ -90,9 +210,9 @@
           });
         })
         .catch((err) => {
-          this.$message.error("鍒涘缓鎹㈢洏鏈烘鎵嬩换鍔″け璐ワ細" + (err.message || "鏈煡閿欒"));
+          this.$message.error(`鍒涘缓${taskTypeName}澶辫触锛歚 + (err.message || "鏈煡閿欒"));
         });
     },
   },
 };
-</script>
\ No newline at end of file
+</script>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs
index 8951739..d20678e 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs
@@ -109,7 +109,7 @@
         /// <summary>
         /// 鎷嗙洏浠诲姟
         /// </summary>
-        [Description("鎹㈢洏浠诲姟")]
+        [Description("鎷嗙洏浠诲姟")]
         SplitPallet = 520
     }
 
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/TaskInfo/CreateTaskDto.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/TaskInfo/CreateTaskDto.cs
index 22aa2a7..769bf8f 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/TaskInfo/CreateTaskDto.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/TaskInfo/CreateTaskDto.cs
@@ -1,4 +1,5 @@
-锘縰sing System;
+锘縰sing SqlSugar;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Linq;
@@ -49,5 +50,37 @@
         /// 娉ㄦ剰锛氬墠绔�氬父浼犳暟瀛楋紝鍚庣浼氳嚜鍔ㄦ槧灏勪负鏋氫妇
         /// </summary>
         public int TaskType { get; set; }
+    }
+
+    /// <summary>
+    /// 鎵嬪姩鍒涘缓鏈哄櫒浜轰换鍔�
+    /// </summary>
+    public class ManualRobotTaskDto
+    {
+        /// <summary>
+        /// 鏈哄櫒浜哄悕绉�
+        /// </summary>
+        public string RobotRoadway { get; set; }
+
+        /// <summary>
+        /// 鏈哄櫒浜烘潵婧愬湴鍧�杈撻�佺嚎鎵樼洏鍙�
+        /// </summary>
+        public String RobotSourceAddressPalletCode { get; set; }
+
+        /// <summary>
+        /// 鏈哄櫒浜虹洰鏍囧湴鍧�绾挎墭鐩樺彿
+        /// </summary>
+        public String RobotTargetAddressPalletCode { get; set; }
+
+
+        /// <summary>
+        /// 鏈哄櫒浜轰换鍔℃�绘暟
+        /// </summary>
+        public int RobotTaskTotalNum { get; set; }
+
+        /// <summary>
+        /// 鏂瑰悜
+        /// </summary>
+        public int Forward { get; set; }
     }
 }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskService.cs
index 2e8cbdf..203bf94 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/IRobotTaskService.cs
@@ -90,6 +90,7 @@
         WebResponseContent CreateLocalRobotTask(Dt_Task task);
 
         int MapWarehouseIdConfigKey(string? targetAddress);
-        string ResolveRobotRuleValue(string? targetAddress, string addressSectionName, string? fallback);
+        string ResolveRobotRuleValue(string? targetAddress, string addressSectionName, string? fallback);
+        WebResponseContent CreateRobotTaskManually(ManualRobotTaskDto request);
     }
 }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Task/RobotTaskController.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Task/RobotTaskController.cs
index 5ccc081..ee7754c 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Task/RobotTaskController.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Task/RobotTaskController.cs
@@ -3,6 +3,7 @@
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using System.Threading.Tasks;
+using WIDESEAWCS_Common.TaskEnum;
 using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseController;
 using WIDESEAWCS_Core.Enums;
@@ -30,67 +31,11 @@
             return WebResponseContent.Instance.Error();
         }
 
-        // 鏆傛椂鍒涘缓鎹㈢洏鏈烘鎵嬩换鍔�
-        [HttpGet, HttpPost, Route("AddRobotTask"), AllowAnonymous]
-        public WebResponseContent AddRobotTask([FromBody] RobotMoveRequest request) 
+        // 鎵嬪姩鏈烘鎵嬩换鍔�
+        [HttpGet, HttpPost, Route("CreateRobotTaskManually"), AllowAnonymous]
+        public WebResponseContent CreateRobotTaskManually([FromBody] ManualRobotTaskDto request) 
         {
-            try
-            {
-                Dt_RobotTask robotTask = new Dt_RobotTask();
-                robotTask.RobotTaskNum = Random.Shared.StrictNext();
-                robotTask.RobotRoadway = "鎹㈢洏鏈烘鎵�";
-                robotTask.RobotTaskType = 510;
-                robotTask.RobotTaskState = 300;
-                robotTask.RobotTaskTotalNum = 48;
-                robotTask.RobotGrade = 1;
-                robotTask.RobotDispatchertime = DateTime.Now;
-                robotTask.RobotRemark = "浜哄伐鎵嬪姩鍒涘缓";
-                robotTask.RobotSourceAddressPalletCode = request.robotSourceAddressPalletCode;
-                robotTask.RobotTargetAddressPalletCode = request.robotTargetAddressPalletCode;
-                // 鏍规嵁鏂瑰悜璁剧疆婧愬拰鐩爣
-                switch (request.Forward)
-                {
-                    case 1:
-                        robotTask.RobotSourceAddress = "1";
-                        robotTask.RobotSourceAddressLineCode = "11010";
-                        robotTask.RobotTargetAddress = "3";
-                        robotTask.RobotTargetAddressLineCode = "2103";
-                        break;
-                    case 2:
-                        robotTask.RobotSourceAddress = "2";
-                        robotTask.RobotSourceAddressLineCode = "11001";
-                        robotTask.RobotTargetAddress = "4";
-                        robotTask.RobotTargetAddressLineCode = "2101";
-                        break;
-                    case 3:
-                        robotTask.RobotSourceAddress = "3";
-                        robotTask.RobotSourceAddressLineCode = "2103";
-                        robotTask.RobotTargetAddress = "1";
-                        robotTask.RobotTargetAddressLineCode = "11010";
-                        break;
-                    case 4:
-                        robotTask.RobotSourceAddress = "4";
-                        robotTask.RobotSourceAddressLineCode = "2101";
-                        robotTask.RobotTargetAddress = "2";
-                        robotTask.RobotTargetAddressLineCode = "11001";
-                        break;
-                    default:
-                        return WebResponseContent.Instance.Error($"娣诲姞鏈哄櫒浜轰换鍔″け璐�");
-                }
-
-                return Service.AddData(robotTask);
-            }
-            catch (Exception ex)
-            {
-                return WebResponseContent.Instance.Error($"娣诲姞鏈哄櫒浜轰换鍔″け璐�: {ex.Message}");
-            }
+            return Service.CreateRobotTaskManually(request);
         }
-
     }
 }
-public class RobotMoveRequest
-{
-    public int Forward { get; set; }
-    public String robotSourceAddressPalletCode { get; set; }
-    public String robotTargetAddressPalletCode { get; set; }
-}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json
index 0b54bec..8897ce4 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json
@@ -52,7 +52,7 @@
     "EnableConsoleOutput": false, //鏄惁杈撳嚭鍒版帶鍒跺彴
     "EnableFloderByLevel": true //鏄惁鎸夋棩蹇楃骇鍒敓鎴愪笉鍚岀殑鏂囦欢澶�
   },
-  "ApiLogIgnore": "", //璁板綍鏃ュ織鏃讹紝蹇界暐鐨凙PI鍚嶇О锛屽涓敤閫楀彿鍒嗛殧锛岄厤缃殑涓嶈褰曞埌鏁版嵁搴撲腑
+  "ApiLogIgnore": "Export,Get,get", //璁板綍鏃ュ織鏃讹紝蹇界暐鐨凙PI鍚嶇О锛屽涓敤閫楀彿鍒嗛殧锛岄厤缃殑涓嶈褰曞埌鏁版嵁搴撲腑
   "ApiName": "WIDESEAWCS",
   "ExpMinutes": 120,
   "QuartzJobAutoStart": true,
@@ -112,7 +112,7 @@
   },
   "RedisConfig": {
     "Enabled": true, //鏄惁鍚敤Redis锛宖alse鏃朵粎浣跨敤鍐呭瓨缂撳瓨
-    "ConnectionString": "127.0.0.1:6379,password=P@ssw0rd,defaultDatabase=0,connectTimeout=5000,abortConnect=false", //Redis杩炴帴瀛楃涓�
+    "ConnectionString": "127.0.0.1:6379,password=,defaultDatabase=0,connectTimeout=5000,abortConnect=false", //Redis杩炴帴瀛楃涓�
     "InstanceName": "WIDESEAWCS:", //瀹炰緥鍚嶇О锛岀敤浜庡尯鍒嗕笉鍚屽簲鐢�
     "DefaultDatabase": 0, //榛樿鏁版嵁搴撶储寮曪紙0-15锛�
     "EnableSentinel": false, //鏄惁鍚敤鍝ㄥ叺妯″紡
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs
index d2468b3..cb689b9 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs
@@ -1,12 +1,14 @@
-锘縰sing System.Diagnostics.CodeAnalysis;
-using Serilog;
+锘縰sing Serilog;
+using System.Diagnostics.CodeAnalysis;
+using WIDESEA_Core;
 using WIDESEAWCS_Common.HttpEnum;
 using WIDESEAWCS_Common.TaskEnum;
-using WIDESEA_Core;
 using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.Enums;
 using WIDESEAWCS_Core.Helper;
 using WIDESEAWCS_DTO;
 using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_ITaskInfoRepository;
 using WIDESEAWCS_ITaskInfoService;
 using WIDESEAWCS_Model.Models;
 using WIDESEAWCS_QuartzJob.Models;
@@ -21,7 +23,8 @@
     /// </summary>
     public class InboundTaskFlowService : IInboundTaskFlowService
     {
-        private readonly IRouterService _routerService;
+        private readonly IRouterService _routerService;
+        private readonly ITaskRepository _taskRepository;
         private readonly HttpClientHelper _httpClientHelper;
         private readonly ILogger _logger;
 
@@ -30,9 +33,10 @@
         /// </summary>
         /// <param name="routerService">璺敱鏈嶅姟銆�</param>
         /// <param name="httpClientHelper">WMS鎺ュ彛璋冪敤甯姪绫汇��</param>
-        public InboundTaskFlowService(IRouterService routerService, HttpClientHelper httpClientHelper, ILogger logger)
+        public InboundTaskFlowService(IRouterService routerService, ITaskRepository taskRepository, HttpClientHelper httpClientHelper, ILogger logger)
         {
             _routerService = routerService;
+            _taskRepository = taskRepository;
             _httpClientHelper = httpClientHelper;
             _logger = logger;
         }
@@ -144,31 +148,58 @@
             task.TargetAddress = nextAddress;
 
             return WebResponseContent.Instance.OK();
-        }
-
-        /// <summary>
-        /// 灏嗕换鍔$姸鎬佸悓姝ュ埌WMS銆�
-        /// </summary>
-        /// <param name="task">浠诲姟瀹炰綋銆�</param>
-        /// <returns>鍚屾缁撴灉銆�</returns>
-        private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
-        {
-            string configKey = nameof(ConfigKey.UpdateTaskByStatus);
-            string requestParam = new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus, NextAddress = task.NextAddress, CurrentAddress = task.CurrentAddress }.ToJson();
-            DateTime startTime = DateTime.Now;
-
-            var result = _httpClientHelper.Post<WebResponseContent>(
-                configKey,
-                requestParam);
-
-            if (!result.IsSuccess || !result.Data.Status)
-            {
-                QuartzLogHelper.LogError(_logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆恵configKey}銆�,璇锋眰鍙傛暟:銆恵requestParam}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�", "InboundTaskFlowService");
-                return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鏇存柊浠诲姟鐘舵�佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
-            }
-
-            QuartzLogHelper.LogInfo(_logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆恵configKey}銆�,鍝嶅簲鏁版嵁:銆恵result.Data?.Data}銆�,鑰楁椂:{(DateTime.Now - startTime).TotalMilliseconds}ms", "InboundTaskFlowService");
-            return WebResponseContent.Instance.OK();
+        }
+
+        /// <summary>
+        /// 灏嗕换鍔$姸鎬佸悓姝ュ埌WMS銆�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋銆�</param>
+        /// <returns>鍚屾缁撴灉銆�</returns>
+        private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
+        {
+            DateTime startTime = DateTime.Now;
+
+            // 澶勭悊鍏ュ簱瀹屾垚鐘舵�佺殑鐗规畩鍚屾
+            if (task.TaskStatus == (int)TaskInStatusEnum.InFinish)
+            {
+                string InboundFinishKey = nameof(ConfigKey.InboundFinishTaskAsync);
+                var requestDto = new CreateTaskDto()
+                {
+                    PalletCode = task.PalletCode,
+                    SourceAddress = task.SourceAddress,
+                    TargetAddress = task.TargetAddress,
+                    Roadway = task.Roadway,
+                    TaskType = task.TaskType,
+                }.ToJson();
+
+                var resultFinish = _httpClientHelper.Post<WebResponseContent>(InboundFinishKey, requestDto);
+                if (!resultFinish.IsSuccess || !resultFinish.Data.Status)
+                {
+                    QuartzLogHelper.LogError(_logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆恵resultFinish}銆�,璇锋眰鍙傛暟:銆恵requestDto}銆�,閿欒淇℃伅:銆恵resultFinish.Data?.Message}銆�", "InboundTaskFlowService");
+                    return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鏇存柊浠诲姟鐘舵�佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵resultFinish.Data?.Message}銆�");
+                }
+
+                QuartzLogHelper.LogInfo(_logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆恵InboundFinishKey}銆�,鍝嶅簲鏁版嵁:銆恵resultFinish.Data?.Data}銆�,鑰楁椂:{(DateTime.Now - startTime).TotalMilliseconds}ms", "InboundTaskFlowService");
+                _taskRepository.DeleteAndMoveIntoHty(task, OperateTypeEnum.浜哄伐瀹屾垚);
+
+                return WebResponseContent.Instance.OK();
+            }
+
+            string configKey = nameof(ConfigKey.UpdateTaskByStatus);
+            string requestParam = new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus, NextAddress = task.NextAddress, CurrentAddress = task.CurrentAddress }.ToJson();
+
+            var result = _httpClientHelper.Post<WebResponseContent>(
+                configKey,
+                requestParam);
+
+            if (!result.IsSuccess || !result.Data.Status)
+            {
+                QuartzLogHelper.LogError(_logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆恵configKey}銆�,璇锋眰鍙傛暟:銆恵requestParam}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�", "InboundTaskFlowService");
+                return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鏇存柊浠诲姟鐘舵�佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+            }
+
+            QuartzLogHelper.LogInfo(_logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆恵configKey}銆�,鍝嶅簲鏁版嵁:銆恵result.Data?.Data}銆�,鑰楁椂:{(DateTime.Now - startTime).TotalMilliseconds}ms", "InboundTaskFlowService");
+            return WebResponseContent.Instance.OK();
         }
     }
 }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
index c34af94..192b2a5 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
@@ -1,4 +1,5 @@
-锘縰sing Newtonsoft.Json;
+锘縰sing Masuit.Tools.Hardware;
+using Newtonsoft.Json;
 using Serilog;
 using System.Diagnostics.CodeAnalysis;
 using WIDESEA_Core;
@@ -253,10 +254,36 @@
         /// <param name="task">浠诲姟瀹炰綋銆�</param>
         /// <returns>鍚屾缁撴灉銆�</returns>
         private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
-        {
+        {
+            DateTime startTime = DateTime.Now;
+            // 澶勭悊鍑哄簱瀹屾垚鐘舵�佺殑鐗规畩鍚屾
+            if (task.TaskStatus == (int)TaskOutStatusEnum.SC_OutFinish)
+            {
+                string OutboundFinishKey = nameof(ConfigKey.OutboundFinishTaskAsync);
+                var requestDto = new CreateTaskDto()
+                {
+                    PalletCode = task.PalletCode,
+                    SourceAddress = task.SourceAddress,
+                    TargetAddress = task.TargetAddress,
+                    Roadway = task.Roadway,
+                    TaskType = task.TaskType,
+                }.ToJson();
+
+                var resultFinish = _httpClientHelper.Post<WebResponseContent>(OutboundFinishKey, requestDto);
+                if (!resultFinish.IsSuccess || !resultFinish.Data.Status)
+                {
+                    QuartzLogHelper.LogError(_logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆恵resultFinish}銆�,璇锋眰鍙傛暟:銆恵requestDto}銆�,閿欒淇℃伅:銆恵resultFinish.Data?.Message}銆�", "OutboundTaskFlowService");
+                    return WebResponseContent.Instance.Error($"璋冪敤WMS鎺ュ彛鏇存柊浠诲姟鐘舵�佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵resultFinish.Data?.Message}銆�");
+                }
+
+                QuartzLogHelper.LogInfo(_logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆恵OutboundFinishKey}銆�,鍝嶅簲鏁版嵁:銆恵resultFinish.Data?.Data}銆�,鑰楁椂:{(DateTime.Now - startTime).TotalMilliseconds}ms", "OutboundTaskFlowService");
+
+                return WebResponseContent.Instance.OK();
+            }
+         
             string configKey = nameof(ConfigKey.UpdateTaskByStatus);
             string requestParam = new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus, NextAddress = task.NextAddress, CurrentAddress = task.CurrentAddress }.ToJson();
-            DateTime startTime = DateTime.Now;
+            
 
             var result = _httpClientHelper.Post<WebResponseContent>(
                 configKey,
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
index 3502c79..48c1bc2 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
@@ -17,7 +17,9 @@
 
 #endregion << 鐗� 鏈� 娉� 閲� >>
 
+using Autofac.Core;
 using MapsterMapper;
+using Masuit.Tools;
 using Microsoft.Extensions.Configuration;
 using Newtonsoft.Json;
 using Serilog;
@@ -448,5 +450,82 @@
                 .Where(x => !string.IsNullOrWhiteSpace(x.Key) && !string.IsNullOrWhiteSpace(x.Value))
                 .ToDictionary(x => x.Key.Trim(), x => x.Value!.Trim());
         }
+
+        public WebResponseContent CreateRobotTaskManually(ManualRobotTaskDto request)
+        {
+            try
+            {
+                Dt_RobotTask robotTask = new Dt_RobotTask();
+                robotTask.RobotTaskNum = Random.Shared.StrictNext();
+                robotTask.RobotRoadway = request.RobotRoadway;
+                if (request.RobotRoadway == RobotTaskTypeEnum.GroupPallet.ToString())
+                {
+                    robotTask.RobotTaskType = (int)RobotTaskTypeEnum.GroupPallet;
+                    robotTask.RobotTaskState = (int)TaskRobotStatusEnum.RobotNew;
+                    robotTask.RobotTaskTotalNum = request.RobotTaskTotalNum;
+                    robotTask.RobotDispatchertime = DateTime.Now;
+                    robotTask.RobotRemark = "浜哄伐鎵嬪姩鍒涘缓";
+                    robotTask.RobotTargetAddressPalletCode = request.RobotTargetAddressPalletCode;
+                    robotTask.RobotTargetAddressLineCode = "11068";
+                }
+                else if (request.RobotRoadway == RobotTaskTypeEnum.ChangePallet.ToString())
+                {
+                    switch (request.Forward)
+                    {
+                        case 1:
+                            robotTask.RobotSourceAddress = "1";
+                            robotTask.RobotSourceAddressLineCode = "11010";
+                            robotTask.RobotTargetAddress = "3";
+                            robotTask.RobotTargetAddressLineCode = "2103";
+                            break;
+                        case 2:
+                            robotTask.RobotSourceAddress = "2";
+                            robotTask.RobotSourceAddressLineCode = "11001";
+                            robotTask.RobotTargetAddress = "4";
+                            robotTask.RobotTargetAddressLineCode = "2101";
+                            break;
+                        case 3:
+                            robotTask.RobotSourceAddress = "3";
+                            robotTask.RobotSourceAddressLineCode = "2103";
+                            robotTask.RobotTargetAddress = "1";
+                            robotTask.RobotTargetAddressLineCode = "11010";
+                            break;
+                        case 4:
+                            robotTask.RobotSourceAddress = "4";
+                            robotTask.RobotSourceAddressLineCode = "2101";
+                            robotTask.RobotTargetAddress = "2";
+                            robotTask.RobotTargetAddressLineCode = "11001";
+                            break;
+                        default:
+                            return WebResponseContent.Instance.Error($"娣诲姞鏈哄櫒浜轰换鍔″け璐�,鏂瑰悜涓嶅");
+                    }
+                    robotTask.RobotTaskType = (int)RobotTaskTypeEnum.ChangePallet;
+                    robotTask.RobotTaskState = (int)TaskRobotStatusEnum.RobotNew;
+                    robotTask.RobotTaskTotalNum = request.RobotTaskTotalNum;
+                    robotTask.RobotDispatchertime = DateTime.Now;
+                    robotTask.RobotRemark = "浜哄伐鎵嬪姩鍒涘缓";
+                    robotTask.RobotSourceAddressPalletCode = request.RobotSourceAddressPalletCode;
+                    robotTask.RobotTargetAddressPalletCode = request.RobotTargetAddressPalletCode;
+                }
+                else if (request.RobotRoadway == RobotTaskTypeEnum.SplitPallet.ToString())
+                {
+                    robotTask.RobotTaskType = (int)RobotTaskTypeEnum.SplitPallet;
+                    robotTask.RobotTaskState = (int)TaskRobotStatusEnum.RobotNew;
+                    robotTask.RobotTaskTotalNum = request.RobotTaskTotalNum;
+                    robotTask.RobotDispatchertime = DateTime.Now;
+                    robotTask.RobotRemark = "浜哄伐鎵嬪姩鍒涘缓";
+                    robotTask.RobotSourceAddressPalletCode = request.RobotSourceAddressPalletCode;
+                }
+                else
+                {
+                    return WebResponseContent.Instance.Error($"娣诲姞鏈哄櫒浜轰换鍔″け璐ワ紝鏈哄櫒浜哄悕绉伴敊璇瘂request.RobotRoadway}");
+                }
+                return base.AddData(robotTask);
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error($"娣诲姞鏈哄櫒浜轰换鍔″け璐�: {ex.Message}");
+            }
+        }
     }
 }
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
index 01239cb..d60d160 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
@@ -206,10 +206,10 @@
                             if (state.ChangePalletPhase == 5)
                             {
                                 // FlowB 鏈�缁堥樁娈碉細鍋囩數鑺彇瀹岋紝婧愮┖鎵樼洏鍥炲簱 HCSC1
-                                //if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true, isRoadway: "HCSC1"))
-                                //{
-                                //    return false;
-                                //}
+                                if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true, isRoadway: "HCSC1"))
+                                {
+                                    return false;
+                                }
 
                                 if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true)
                                 {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/Home.vue b/Code/WMS/WIDESEA_WMSClient/src/views/Home.vue
index ea951db..9023c51 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/Home.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/Home.vue
@@ -1,26 +1,10 @@
 <template>
   <div class="dashboard-container">
-    <!-- 椤堕儴锛氭湰鏈堝嚭鍏ュ簱瓒嬪娍 (鍏ㄥ) -->
+    <!-- 鍚勪粨搴撴湀搴﹀嚭鍏ュ簱瀵规瘮鍥� -->
     <div class="chart-row full-width">
       <div class="chart-card">
-        <div class="card-title">姣忔湀鍑哄叆搴撹秼鍔�</div>
-        <div id="chart-monthly-trend" class="chart-content"></div>
-      </div>
-    </div>
-
-    <!-- 绗簩琛岋細姣忔棩鍑哄叆搴撹秼鍔� (鍏ㄥ) -->
-    <div class="chart-row full-width">
-      <div class="chart-card">
-        <div class="card-title">姣忔棩鍑哄叆搴撹秼鍔�</div>
-        <div id="chart-daily" class="chart-content"></div>
-      </div>
-    </div>
-
-    <!-- 绗洓琛岋細浠撳簱鍒嗗竷 -->
-    <div class="chart-row">
-      <div class="chart-card">
-        <div class="card-title">鍚勪粨搴撳簱瀛樺垎甯�</div>
-        <div id="chart-warehouse" class="chart-content"></div>
+        <div class="card-title">鍚勪粨搴撴湀搴﹀嚭鍏ュ簱瀵规瘮</div>
+        <div id="chart-warehouse-monthly" class="chart-content"></div>
       </div>
     </div>
   </div>
@@ -34,9 +18,8 @@
   data() {
     return {
       charts: {},
-      dailyData: [],
       monthlyData: [],
-      warehouseData: []
+      warehouseNames: ['FJSC1', 'ZJSC1', 'GWSC1', 'CWSC1', 'HCSC1']
     };
   },
   mounted() {
@@ -54,212 +37,190 @@
     },
 
     initCharts() {
-      this.charts.monthlyTrend = echarts.init(document.getElementById("chart-monthly-trend"));
-      this.charts.daily = echarts.init(document.getElementById("chart-daily"));
-      this.charts.warehouse = echarts.init(document.getElementById("chart-warehouse"));
+      this.charts.warehouseMonthly = echarts.init(document.getElementById("chart-warehouse-monthly"));
     },
 
     async loadData() {
       await this.loadMonthlyStats();
-      await this.loadDailyStats();
-      await this.loadStockByWarehouse();
     },
 
     async loadMonthlyStats() {
       try {
-        const res = await this.http.get("/api/Dashboard/MonthlyStats", { months: 12 });
-        if (res.status && res.data) {
-          console.log("姣忔湀缁熻鏁版嵁:", res.data);
-          this.monthlyData = res.data;
-          this.updateMonthlyTrendChart();
-        }
+        const promises = this.warehouseNames.map(warehouse => 
+          this.http.get("/api/Dashboard/MonthlyStats", { 
+            months: 6, 
+            Roadway: warehouse 
+          })
+        );
+        
+        const results = await Promise.all(promises);
+        
+        this.monthlyData = results.map((res, index) => ({
+          warehouse: this.warehouseNames[index],
+          warehouseName: this.getWarehouseName(this.warehouseNames[index]),
+          data: res.data || []
+        }));
+        
+        this.updateWarehouseMonthlyChart();
       } catch (e) {
         console.error("鍔犺浇姣忔湀缁熻澶辫触", e);
       }
     },
 
-    async loadDailyStats() {
-      try {
-        const res = await this.http.get("/api/Dashboard/DailyStats", { days: 30 });
-        if (res.status && res.data) {
-          console.log("姣忔棩缁熻鏁版嵁:", res.data);
-          this.dailyData = res.data;
-          this.updateDailyChart();
-        }
-      } catch (e) {
-        console.error("鍔犺浇姣忔棩缁熻澶辫触", e);
-      }
-    },
-
-    async loadStockByWarehouse() {
-      try {
-        const res = await this.http.get("/api/Dashboard/StockByWarehouse");
-        if (res.status && res.data) {
-          console.log("浠撳簱鍒嗗竷鏁版嵁:", res.data);
-          this.warehouseData = res.data.data || res.data;
-          this.updateWarehouseChart();
-        }
-      } catch (e) {
-        console.error("鍔犺浇浠撳簱鍒嗗竷澶辫触", e);
-      }
-    },
-
-    updateMonthlyTrendChart() {
-      const option = {
-        tooltip: { trigger: "axis" },
-        legend: { data: ["鍏ュ簱", "鍑哄簱"], textStyle: { color: "#fff" } },
-        xAxis: {
-          type: "category",
-          data: this.monthlyData.map(m => m.month),
-          axisLabel: { color: "#fff", rotate: 45 }
-        },
-        yAxis: [
-          {
-            type: "value",
-            name: "鏁伴噺",
-            axisLabel: { color: "#fff" }
-          }
-        ],
-        series: [
-          { name: "鍏ュ簱", type: "bar", data: this.monthlyData.map(m => m.inbound), itemStyle: { color: "#5470c6" } },
-          { name: "鍑哄簱", type: "line", data: this.monthlyData.map(m => m.outbound), itemStyle: { color: "#91cc75" } }
-        ]
+    getWarehouseName(code) {
+      const nameMap = {
+        'FJSC1': '璐熸瀬鍗�1鍙蜂粨搴�',
+        'ZJSC1': '姝f瀬鍗�1鍙蜂粨搴�',
+        'GWSC1': '楂樻俯1鍙蜂粨搴�',
+        'CWSC1': '甯告俯1鍙蜂粨搴�',
+        'HCSC1': '鍒嗗1鍙蜂粨搴�'
       };
-      this.charts.monthlyTrend.setOption(option, true);
+      return nameMap[code] || code;
     },
 
-    updateDailyChart() {
-      const option = {
-        tooltip: { trigger: "axis" },
-        legend: { data: ["鍏ュ簱", "鍑哄簱"], textStyle: { color: "#fff" } },
-        xAxis: {
-          type: "category",
-          data: this.dailyData.map(d => d.date),
-          axisLabel: { 
-            color: "#fff", 
-            interval: 0,
-            rotate: 45,
-            fontSize: 12,
-            margin: 10
-          },
-          axisTick: {
-            alignWithLabel: true
-          }
-        },
-        yAxis: {
-          type: "value",
-          axisLabel: { color: "#fff" }
-        },
-        grid: {
-          left: '3%',
-          right: '4%',
-          bottom: '15%',
-          top: '10%',
-          containLabel: true
-        },
-        series: [
-          { name: "鍏ュ簱", type: "bar", data: this.dailyData.map(d => d.inbound), itemStyle: { color: "#5470c6" } },
-          { name: "鍑哄簱", type: "bar", data: this.dailyData.map(d => d.outbound), itemStyle: { color: "#91cc75" } }
-        ]
-      };
-      this.charts.daily.setOption(option, true);
-    },
-
-    updateWarehouseChart() {
-      const warehouseNames = this.warehouseData.map(w => w.warehouse);
-      const totalStocks = this.warehouseData.map(w => w.total);
-      const hasStocks = this.warehouseData.map(w => w.hasStock);
-      const noStocks = this.warehouseData.map(w => w.noStock);
-      const hasStockPercentages = this.warehouseData.map(w => w.hasStockPercentage);
-      const noStockPercentages = this.warehouseData.map(w => w.noStockPercentage);
+    updateWarehouseMonthlyChart() {
+      // 鑾峰彇鎵�鏈夋湀浠�
+      const months = this.monthlyData[0]?.data.map(d => `${d.month}鏈坄) || [];
       
+      // 涓烘瘡涓粨搴撶敓鎴愮郴鍒楁暟鎹�
+      const series = [];
+      
+      this.monthlyData.forEach((warehouseData, index) => {
+        const data = warehouseData.data;
+        
+        series.push({
+          name: warehouseData.warehouseName,
+          type: 'bar',
+          data: data.map(d => ({
+            value: (d.inbound || 0) + (d.outbound || 0),
+            inbound: d.inbound || 0,
+            outbound: d.outbound || 0,
+            label: {
+              show: true,
+              position: 'top',
+              formatter: function(params) {
+                return `鍏�:${params.data.inbound}\n鍑�:${params.data.outbound}`;
+              },
+              fontSize: 10,
+              color: '#fff',
+              lineHeight: 15
+            }
+          })),
+          barWidth: '15%',
+          barGap: '10%',
+          itemStyle: {
+            color: this.getBarColor(index),
+            borderRadius: [3, 3, 0, 0]
+          }
+        });
+      });
+
       const option = {
+        title: {
+          text: '鍚勪粨搴撴湀搴﹀嚭鍏ュ簱瀵规瘮',
+          textStyle: {
+            color: '#00ffff',
+            fontSize: 16
+          },
+          left: 'center',
+          top: 10
+        },
         tooltip: {
           trigger: 'axis',
           axisPointer: {
             type: 'shadow'
           },
           formatter: function(params) {
-            let tip = params[0].name + '<br/>';
+            let tip = `<strong>${params[0].axisValue}</strong><br/>`;
             params.forEach(param => {
-              const dataIndex = param.dataIndex;
-              const warehouse = window.homeComponent.warehouseData[dataIndex];
-              
-              if (param.seriesName === '宸茬敤瀹归噺') {
-                tip += `${param.marker}${param.seriesName}: ${param.value} (${warehouse.hasStockPercentage})<br/>`;
-                tip += `鏈夊簱瀛�: ${warehouse.hasStock}<br/>`;
-                tip += `鏃犲簱瀛�: ${warehouse.noStock}<br/>`;
-                tip += `鎬诲閲�: ${warehouse.total}`;
-              } else if (param.seriesName === '鍓╀綑瀹归噺') {
-                tip += `${param.marker}${param.seriesName}: ${param.value} (${warehouse.noStockPercentage})<br/>`;
-                tip += `鏈夊簱瀛�: ${warehouse.hasStock}<br/>`;
-                tip += `鏃犲簱瀛�: ${warehouse.noStock}<br/>`;
-                tip += `鎬诲閲�: ${warehouse.total}`;
-              }
+              tip += `<span style="display:inline-block;width:10px;height:10px;border-radius:50%;background:${param.color};margin-right:5px;"></span>`;
+              tip += `${param.seriesName}: `;
+              tip += `鍏ュ簱:${param.data.inbound} | 鍑哄簱:${param.data.outbound} | 鎬昏:${param.value}<br/>`;
             });
             return tip;
           }
         },
         legend: {
-          data: ['宸茬敤瀹归噺', '鍓╀綑瀹归噺'],
-          textStyle: { color: '#fff' }
+          data: this.monthlyData.map(d => d.warehouseName),
+          textStyle: { color: '#fff', fontSize: 11 },
+          top: 45,
+          left: 'center',
+          type: 'scroll'
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '10%',
+          top: '20%',
+          containLabel: true
         },
         xAxis: {
           type: 'category',
-          data: warehouseNames,
-          axisLabel: { color: '#fff', rotate: 30 }
+          data: months,
+          axisLabel: {
+            color: '#fff',
+            fontSize: 11
+          },
+          axisLine: {
+            lineStyle: { color: 'rgba(255,255,255,0.3)' }
+          },
+          splitLine: {
+            show: true,
+            lineStyle: {
+              color: 'rgba(255,255,255,0.1)',
+              type: 'dashed'
+            }
+          }
         },
         yAxis: {
           type: 'value',
-          axisLabel: { color: '#fff' }
+          name: '鏁伴噺',
+          nameTextStyle: { color: '#fff' },
+          axisLabel: { color: '#fff' },
+          splitLine: {
+            lineStyle: {
+              color: 'rgba(255,255,255,0.1)',
+              type: 'dashed'
+            }
+          }
         },
-        series: [
+        dataZoom: [
           {
-            name: '宸茬敤瀹归噺',
-            type: 'bar',
-            data: hasStocks.map((value, index) => ({
-              value: value,
-              label: {
-                show: true,
-                position: 'top',
-                formatter: '{c} {a|' + hasStockPercentages[index] + '}',
-                rich: {
-                  a: {
-                    lineHeight: 20,
-                    borderColor: '#91cc75',
-                    color: '#91cc75'
-                  }
-                }
-              }
-            })),
-            itemStyle: { color: '#91cc75' }
+            type: 'inside',
+            start: 0,
+            end: 100
           },
           {
-            name: '鍓╀綑瀹归噺',
-            type: 'bar',
-            data: noStocks.map((value, index) => ({
-              value: value,
-              label: {
-                show: true,
-                position: 'top',
-                formatter: '{c} {a|' + noStockPercentages[index] + '}',
-                rich: {
-                  a: {
-                    lineHeight: 20,
-                    borderColor: '#fac858',
-                    color: '#fac858'
-                  }
-                }
-              }
-            })),
-            itemStyle: { color: '#fac858' }
+            start: 0,
+            end: 100,
+            height: 20,
+            bottom: 0,
+            borderColor: 'rgba(255,255,255,0.3)',
+            fillerColor: 'rgba(0,255,255,0.1)',
+            handleStyle: {
+              color: '#00ffff',
+              borderColor: '#00ffff'
+            },
+            textStyle: {
+              color: '#fff'
+            }
           }
-        ]
+        ],
+        series: series
       };
-      
-      window.homeComponent = this;
-      
-      this.charts.warehouse.setOption(option, true);
+
+      this.charts.warehouseMonthly.setOption(option, true);
+    },
+
+    getBarColor(index) {
+      const colors = [
+        '#5470c6', // 钃�
+        '#fac858', // 榛�
+        '#73c0de', // 澶╄摑
+        '#fc8452', // 姗�
+        '#ea7ccc'  // 绮�
+      ];
+      return colors[index] || '#5470c6';
     }
   }
 };
@@ -331,22 +292,6 @@
   box-shadow: 2px -2px 10px #00ffff, 0 0 10px rgba(0, 255, 255, 0.7);
 }
 
-.chart-card::before,
-.chart-card::after {
-  animation: neon-flicker 2s infinite alternate;
-}
-
-@keyframes neon-flicker {
-  0%, 100% {
-    opacity: 1;
-    box-shadow: -2px -2px 10px #00ffff, 0 0 10px rgba(0, 255, 255, 0.7);
-  }
-  50% {
-    opacity: 0.8;
-    box-shadow: -2px -2px 5px #00ffff, 0 0 5px rgba(0, 255, 255, 0.5);
-  }
-}
-
 .card-title {
   color: #00ffff;
   font-size: 16px;
@@ -357,21 +302,19 @@
 }
 
 .chart-content {
-  height: 280px;
+  height: 500px;
   width: 100%;
 }
 
-/* 鍏ㄥ鍥捐〃 */
 .full-width .chart-card {
   flex: none;
   width: 100%;
 }
 
 .full-width .chart-content {
-  height: 350px;
+  height: 500px;
 }
 
-/* 娣诲姞缃戞牸绾挎晥鏋� */
 .dashboard-container::before {
   content: "";
   position: fixed;
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_TaskStatus.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_TaskStatus.cs
index 2ab0add..160c26b 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_TaskStatus.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_TaskStatus.cs
@@ -1,6 +1,10 @@
+using System.Threading.Tasks;
 using WIDESEA_Common.TaskEnum;
 using WIDESEA_Core;
+using WIDESEA_Core.Enums;
 using WIDESEA_DTO.Task;
+using WIDESEA_IStockService;
+using WIDESEA_Model.Models;
 
 namespace WIDESEA_TaskInfoService
 {
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs
index 3384bde..da08436 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs
@@ -71,10 +71,10 @@
         }
 
         /// <summary>
-        /// 姣忔棩缁熻
+        /// 姣忔棩缁熻锛堟寜宸烽亾鍙峰垎缁勶紝鎸囧畾浠撳簱锛�
         /// </summary>
         [HttpGet("DailyStats"), AllowAnonymous]
-        public async Task<WebResponseContent> DailyStats([FromQuery] int days = 30)
+        public async Task<WebResponseContent> DailyStats([FromQuery] int days = 10)
         {
             try
             {
@@ -84,9 +84,16 @@
                 var startDate = DateTime.Today.AddDays(-days + 1);
                 var endDate = DateTime.Today; // 鍖呭惈浠婂ぉ
 
+                // 鎸囧畾瑕佺粺璁$殑浠撳簱锛堝贩閬撳彿锛�
+                var specifiedRoadways = new List<string>
+        {
+            "GWSC1", "CWSC1", "HCSC1", "ZJSC1", "FJSC1"
+        };
+
                 var query = await _db.Queryable<Dt_Task_Hty>()
                     .Where(t => t.InsertTime >= startDate && t.InsertTime <= endDate)
-                    .Select(t => new { t.InsertTime, t.TaskType })
+                    .Where(t => specifiedRoadways.Contains(t.Roadway)) // 鍙煡璇㈡寚瀹氬贩閬撳彿鐨勬暟鎹�
+                    .Select(t => new { t.InsertTime, t.TaskType, t.Roadway })
                     .ToListAsync();
 
                 // 鐢熸垚鏃ユ湡鑼冨洿
@@ -96,40 +103,57 @@
                     allDates.Add(date);
                 }
 
-                // 鎸夋棩鏈熷垎缁勭粺璁�
+                // 鎸夊贩閬撳彿鍜屾棩鏈熷垎缁勭粺璁�
                 var groupedData = query
-                    .GroupBy(t => t.InsertTime.Date)
+                    .GroupBy(t => new { t.Roadway, Date = t.InsertTime.Date })
                     .Select(g => new
                     {
-                        Date = g.Key,
+                        Roadway = g.Key.Roadway,
+                        Date = g.Key.Date,
                         Inbound = g.Count(t => t.TaskType >= 200 && t.TaskType < 300),
                         Outbound = g.Count(t => t.TaskType >= 100 && t.TaskType < 200)
                     })
-                    .ToDictionary(x => x.Date, x => x);
+                    .ToList();
 
-                // 琛ュ叏缂哄け鏃ユ湡
-                var result = allDates.Select(date =>
+                // 鏋勫缓缁撴灉锛氭瘡涓寚瀹氫粨搴撳搴斾竴涓棩鏈熷垪琛�
+                var result = specifiedRoadways.Select(roadway =>
                 {
-                    if (groupedData.TryGetValue(date, out var data))
+                    // 鑾峰彇璇ュ贩閬撳彿鐨勫垎缁勬暟鎹瓧鍏�
+                    var roadwayData = groupedData
+                        .Where(g => g.Roadway == roadway)
+                        .ToDictionary(x => x.Date, x => x);
+
+                    // 琛ュ叏缂哄け鏃ユ湡锛岀‘淇濇瘡澶╅兘鏈夋暟鎹紙榛樿涓�0锛�
+                    var dailyStats = allDates.Select(date =>
                     {
-                        return new
+                        if (roadwayData.TryGetValue(date, out var data))
                         {
-                            Date = date.ToString("MM-dd"),
-                            Inbound = data.Inbound,
-                            Outbound = data.Outbound
-                        };
-                    }
-                    else
+                            return new
+                            {
+                                Date = date.ToString("MM-dd"),
+                                Inbound = data.Inbound,
+                                Outbound = data.Outbound
+                            };
+                        }
+                        else
+                        {
+                            return new
+                            {
+                                Date = date.ToString("MM-dd"),
+                                Inbound = 0,
+                                Outbound = 0
+                            };
+                        }
+                    })
+                    .OrderBy(x => x.Date)
+                    .ToList();
+
+                    return new
                     {
-                        return new
-                        {
-                            Date = date.ToString("MM-dd"),
-                            Inbound = 0,
-                            Outbound = 0
-                        };
-                    }
+                        Roadway = roadway,
+                        DailyStats = dailyStats
+                    };
                 })
-                .OrderBy(x => x.Date)
                 .ToList();
 
                 return WebResponseContent.Instance.OK(null, result);
@@ -190,14 +214,11 @@
             return $"{monday.Year}-W{weekNum:D2}";
         }
 
-        /// <summary>
-        /// 姣忔湀缁熻
-        /// </summary>
         /// <remarks>
         /// 鎸夊勾鏈堢粺璁″叆绔欏拰鍑虹珯浠诲姟鏁伴噺
         /// </remarks>
         [HttpGet("MonthlyStats"), AllowAnonymous]
-        public async Task<WebResponseContent> MonthlyStats([FromQuery] int months = 12)
+        public async Task<WebResponseContent> MonthlyStats([FromQuery] int months = 12, string Roadway = null)
         {
             try
             {
@@ -206,8 +227,27 @@
                 var startDate = DateTime.Today.AddMonths(-months + 1);
                 startDate = new DateTime(startDate.Year, startDate.Month, 1);
 
-                var monthlyStats = await _db.Queryable<Dt_Task_Hty>()
-                    .Where(t => t.InsertTime >= startDate)
+                // 浠撳簱鍚嶇О鏄犲皠
+                var roadwayNames = new Dictionary<string, string>
+        {
+            { "FJSC1", "璐熸瀬鍗�1鍙蜂粨搴�" },
+            { "ZJSC1", "姝f瀬鍗�1鍙蜂粨搴�" },
+            { "GWSC1", "楂樻俯1鍙蜂粨搴�" },
+            { "CWSC1", "甯告俯1鍙蜂粨搴�" },
+            { "HCSC1", "鍒嗗1鍙蜂粨搴�" }
+        };
+
+                // 鏋勫缓鏌ヨ
+                var query = _db.Queryable<Dt_Task_Hty>()
+                    .Where(t => t.InsertTime >= startDate);
+
+                // 濡傛灉鎸囧畾浜嗛亾璺紝娣诲姞閬撹矾杩囨护鏉′欢
+                if (!string.IsNullOrEmpty(Roadway))
+                {
+                    query = query.Where(t => t.Roadway == Roadway);
+                }
+
+                var monthlyStats = await query
                     .GroupBy(t => new { t.InsertTime.Year, t.InsertTime.Month })
                     .Select(t => new
                     {
@@ -253,7 +293,11 @@
                         {
                             Month = monthKey,
                             Inbound = stat.Inbound,
-                            Outbound = stat.Outbound
+                            Outbound = stat.Outbound,
+                            Roadway = Roadway,
+                            RoadwayName = !string.IsNullOrEmpty(Roadway) && roadwayNames.ContainsKey(Roadway)
+                                ? roadwayNames[Roadway]
+                                : null
                         });
                     }
                     else
@@ -262,7 +306,11 @@
                         {
                             Month = monthKey,
                             Inbound = 0,
-                            Outbound = 0
+                            Outbound = 0,
+                            Roadway = Roadway,
+                            RoadwayName = !string.IsNullOrEmpty(Roadway) && roadwayNames.ContainsKey(Roadway)
+                                ? roadwayNames[Roadway]
+                                : null
                         });
                     }
                 }
@@ -271,13 +319,9 @@
             }
             catch (Exception ex)
             {
-                // 璁板綍寮傚父鏃ュ織锛堝疄闄呴」鐩腑寤鸿浣跨敤鏃ュ織妗嗘灦锛�
-                // _logger.LogError(ex, "姣忔湀缁熻鑾峰彇澶辫触");
-
                 return WebResponseContent.Instance.Error($"姣忔湀缁熻鑾峰彇澶辫触: {ex.Message}");
             }
         }
-
         /// <summary>
         /// 搴撳瓨搴撻緞鍒嗗竷
         /// </summary>
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
index e3428ef..fc7e7ae 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -55,6 +55,7 @@
     "EnableConsoleOutput": false, //鏄惁杈撳嚭鍒版帶鍒跺彴
     "EnableFloderByLevel": true //鏄惁鎸夋棩蹇楃骇鍒敓鎴愪笉鍚岀殑鏂囦欢澶�
   },
+  "ApiLogIgnore": "Export,Get,get",
   "LogAopEnable": false,
   "PrintSql": false, //鎵撳嵃SQL璇彞
   "ApiName": "WIDESEA",

--
Gitblit v1.9.3