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