From f288ccc545f8cc32bc922c96dfb3cab9a1f92ec6 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期一, 20 四月 2026 00:49:55 +0800
Subject: [PATCH] feat: 初始化WMS前端项目并实现基础功能
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotStateManager.cs | 167 ++++++++++++++++++++++++++++++++++---------------------
1 files changed, 104 insertions(+), 63 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotStateManager.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotStateManager.cs
index 9500fd7..4aaae62 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotStateManager.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotStateManager.cs
@@ -1,123 +1,164 @@
+using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
-using WIDESEAWCS_Common;
-using WIDESEAWCS_Core.Caches;
-using WIDESEAWCS_QuartzJob;
+using WIDESEAWCS_Core.LogHelper;
+using WIDESEAWCS_ITaskInfoRepository;
+using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_Tasks
{
/// <summary>
- /// 鏈烘鎵嬬姸鎬佺鐞嗗櫒 - 璐熻矗RobotSocketState鐨勫畨鍏ㄦ洿鏂板拰鍏嬮殕
+ /// 鏈烘鎵嬬姸鎬佺鐞嗗櫒 - 璐熻矗 RobotSocketState 鐨勭嚎绋嬪畨鍏ㄦ洿鏂板拰鍏嬮殕
/// </summary>
+ /// <remarks>
+ /// 鏍稿績鍔熻兘鏄�氳繃 IRobotStateRepository 绠$悊鏁版嵁搴撲腑鐨勬満姊版墜鐘舵�併��
+ /// 鎻愪緵涔愯骞跺彂鎺у埗锛岄�氳繃 Version 瀛楁闃叉骞跺彂鏇存柊鏃剁殑鏁版嵁瑕嗙洊闂銆�
+ /// </remarks>
public class RobotStateManager
{
- private readonly ICacheService _cache;
+ /// <summary>
+ /// 浠撳偍鏈嶅姟瀹炰緥锛岀敤浜庤鍐欐暟鎹簱涓殑鐘舵�佹暟鎹�
+ /// </summary>
+ private readonly IRobotStateRepository _repository;
- public RobotStateManager(ICacheService cache)
+ /// <summary>
+ /// 鏃ュ織璁板綍鍣�
+ /// </summary>
+ private readonly ILogger _logger;
+
+ /// <summary>
+ /// 鏋勯�犲嚱鏁�
+ /// </summary>
+ /// <param name="repository">浠撳偍鏈嶅姟瀹炰緥</param>
+ /// <param name="logger">鏃ュ織璁板綍鍣�</param>
+ public RobotStateManager(IRobotStateRepository repository, ILogger logger)
{
- _cache = cache;
+ _repository = repository;
+ _logger = logger;
}
/// <summary>
- /// 瀹夊叏鏇存柊RobotSocketState缂撳瓨锛岄槻姝㈠苟鍙戣鐩�
+ /// 瀹夊叏鏇存柊 RobotSocketState锛岄槻姝㈠苟鍙戣鐩�
/// </summary>
- /// <param name="ipAddress">璁惧IP鍦板潃</param>
- /// <param name="updateAction">鏇存柊鐘舵�佺殑濮旀墭锛堜紶鍏ュ綋鍓嶇姸鎬侊紝杩斿洖淇敼鍚庣殑鏂扮姸鎬侊級</param>
- /// <returns>鏄惁鏇存柊鎴愬姛</returns>
+ /// <remarks>
+ /// 浣跨敤涔愯骞跺彂妯″紡锛氬厛璇诲彇褰撳墠 Version锛屾墽琛屾洿鏂版椂妫�鏌ョ増鏈槸鍚︿竴鑷淬��
+ /// 濡傛灉 Version 涓嶅尮閰嶏紙璇存槑鏈夊叾浠栫嚎绋嬪凡鏇存柊锛夛紝鍒欐洿鏂板け璐ヨ繑鍥� false銆�
+ /// </remarks>
+ /// <param name="ipAddress">璁惧 IP 鍦板潃</param>
+ /// <param name="updateAction">鏇存柊鐘舵�佺殑濮旀墭鍑芥暟锛屼紶鍏ュ綋鍓嶇姸鎬佸壇鏈紝杩斿洖淇敼鍚庣殑鏂扮姸鎬�</param>
+ /// <returns>鏄惁鏇存柊鎴愬姛锛沠alse 琛ㄧず鐗堟湰鍐茬獊鎴栫姸鎬佷笉瀛樺湪</returns>
public bool TryUpdateStateSafely(string ipAddress, Func<RobotSocketState, RobotSocketState> updateAction)
{
- var cacheKey = GetCacheKey(ipAddress);
- var currentState = _cache.Get<RobotSocketState>(cacheKey);
+ // 浠庢暟鎹簱鑾峰彇褰撳墠瀛樺偍鐨勭姸鎬�
+ var currentEntity = _repository.GetByIp(ipAddress);
- if (currentState == null)
+ if (currentEntity == null)
{
return false;
}
- // 浣跨敤褰撳墠瀛樺偍鐨勭増鏈彿浣滀负鏈熸湜鐗堟湰
- var expectedVersion = currentState.Version;
+ // 璁板綍褰撳墠瀛樺偍鐨� Version锛屼綔涓烘洿鏂版椂鐨勬湡鏈涚増鏈�
+ var expectedVersion = currentEntity.Version;
- // 鍒涘缓鐘舵�佸壇鏈繘琛屼慨鏀癸紙閬垮厤淇敼鍘熷璞″紩鐢級
- var stateCopy = CloneState(currentState);
+ // 鍒涘缓鐘舵�佺殑娣辨嫹璐濆壇鏈紙浣跨敤 JSON 搴忓垪鍖栧疄鐜帮級
+ var stateCopy = CloneState(_repository.ToSocketState(currentEntity));
+
+ // 鎵ц璋冪敤鑰呮彁渚涚殑鏇存柊閫昏緫锛屼紶鍏ュ壇鏈姸鎬侊紝鑾峰彇鏂扮殑鐘舵�佸璞�
var newState = updateAction(stateCopy);
- newState.Version = DateTime.UtcNow.Ticks;
- return _cache.TrySafeUpdate(
- cacheKey,
- newState,
- expectedVersion,
- s => s.Version
- );
+ // 灏嗘柊鐘舵�佽浆鎹负鏁版嵁搴撳疄浣�
+ var newEntity = _repository.ToEntity(newState);
+ newEntity.Id = currentEntity.Id;
+ newEntity.Version = expectedVersion + 1; // 鐗堟湰鑷
+
+ // 璋冪敤浠撳偍鐨勫畨鍏ㄦ洿鏂版柟娉曪紝浼犲叆鏈熸湜 Version
+ // 濡傛灉 Version 涓嶄竴鑷达紙宸茶鍏朵粬绾跨▼鏇存柊锛夛紝鍒欐洿鏂板け璐�
+ return _repository.TryUpdate(ipAddress, newEntity, expectedVersion);
}
/// <summary>
- /// 瀹夊叏鏇存柊RobotSocketState缂撳瓨锛堢畝鍗曠増鏈級
+ /// 瀹夊叏鏇存柊 RobotSocketState 鐨勯噸杞界増鏈紙鐩存帴浼犲叆鏂扮姸鎬侊級
/// </summary>
- /// <param name="ipAddress">璁惧IP鍦板潃</param>
- /// <param name="newState">鏂扮姸鎬侊紙浼氳鏇存柊Version瀛楁锛�</param>
- /// <returns>鏄惁鏇存柊鎴愬姛</returns>
+ /// <remarks>
+ /// 涓庝笂涓�涓噸杞界殑鍖哄埆锛氭鏂规硶鐩存帴鎺ユ敹瀹屾暣鐨勬柊鐘舵�佸璞★紝鑰屼笉鏄洿鏂板鎵樸��
+ /// 濡傛灉鏁版嵁搴撲腑涓嶅瓨鍦ㄨ璁惧鐨勭姸鎬侊紝鍒欏垱寤烘柊璁板綍銆�
+ /// </remarks>
+ /// <param name="ipAddress">璁惧 IP 鍦板潃</param>
+ /// <param name="newState">鏂扮姸鎬佸璞�</param>
+ /// <returns>鏄惁鏇存柊鎴愬姛锛涙柊寤鸿缃负 true</returns>
public bool TryUpdateStateSafely(string ipAddress, RobotSocketState newState)
{
- var cacheKey = GetCacheKey(ipAddress);
- var currentState = _cache.Get<RobotSocketState>(cacheKey);
+ // 浠庢暟鎹簱鑾峰彇褰撳墠瀛樺偍鐨勭姸鎬�
+ var currentEntity = _repository.GetByIp(ipAddress);
- if (currentState == null)
+ // 濡傛灉褰撳墠涓嶅瓨鍦ㄨ璁惧鐨勭姸鎬侊紝鍒涘缓鏂拌褰�
+ if (currentEntity == null)
{
- // 褰撳墠涓嶅瓨鍦紝鐩存帴娣诲姞
- newState.Version = DateTime.UtcNow.Ticks;
- _cache.AddObject(cacheKey, newState);
+ _repository.GetOrCreate(newState.IPAddress, newState.RobotCrane ?? new RobotCraneDevice());
+ _logger.LogDebug("TryUpdateStateSafely锛氬垱寤烘柊鐘舵�侊紝IP: {IpAddress}", ipAddress);
+ QuartzLogger.Debug($"鍒涘缓鏂扮姸鎬侊紝IP: {ipAddress}", ipAddress);
return true;
}
- // 浣跨敤褰撳墠瀛樺偍鐨勭増鏈彿浣滀负鏈熸湜鐗堟湰
- var expectedVersion = currentState.Version;
+ // 褰撳墠瀛樺湪鐘舵�侊紝璁板綍鏈熸湜 Version 鐢ㄤ簬涔愯閿佹鏌�
+ var expectedVersion = currentEntity.Version;
- // 鏇存柊鏂扮姸鎬佺殑鐗堟湰鍙蜂负鏈�鏂版椂闂存埑
- newState.Version = DateTime.UtcNow.Ticks;
+ // 灏嗘柊鐘舵�佽浆鎹负鏁版嵁搴撳疄浣�
+ var newEntity = _repository.ToEntity(newState);
+ newEntity.Id = currentEntity.Id;
+ newEntity.Version = expectedVersion + 1; // 鐗堟湰鑷
- return _cache.TrySafeUpdate(
- cacheKey,
- newState,
- expectedVersion,
- s => s.Version
- );
+ // 灏濊瘯瀹夊叏鏇存柊锛屽鏋滅増鏈啿绐佸垯杩斿洖 false
+ bool success = _repository.TryUpdate(ipAddress, newEntity, expectedVersion);
+
+ if (!success)
+ {
+ _logger.LogWarning("TryUpdateStateSafely锛氱増鏈啿绐侊紝鏇存柊澶辫触锛孖P: {IpAddress}锛屾湡鏈涚増鏈�: {ExpectedVersion}", ipAddress, expectedVersion);
+ QuartzLogger.Warn($"鐗堟湰鍐茬獊锛屾洿鏂板け璐ワ紝IP: {ipAddress}", ipAddress);
+ }
+
+ return success;
}
/// <summary>
- /// 鍏嬮殕RobotSocketState瀵硅薄锛堝垱寤烘繁鎷疯礉锛�
+ /// 鍏嬮殕 RobotSocketState 瀵硅薄锛堟繁鎷疯礉锛�
/// </summary>
+ /// <remarks>
+ /// 浣跨敤 JSON 搴忓垪鍖�/鍙嶅簭鍒楀寲瀹炵幇娣辨嫹璐濄��
+ /// 杩欐牱鍙互纭繚鏂板璞′笌鍘熷璞″畬鍏ㄧ嫭绔嬶紝淇敼鏂板璞′笉浼氬奖鍝嶅師瀵硅薄銆�
+ /// </remarks>
+ /// <param name="source">婧愮姸鎬佸璞�</param>
+ /// <returns>鏂扮殑鐘舵�佸璞★紝鏄簮瀵硅薄鐨勬繁鎷疯礉</returns>
public RobotSocketState CloneState(RobotSocketState source)
{
- // 浣跨敤搴忓垪鍖�/鍙嶅簭鍒楀寲杩涜娣辨嫹璐�
var json = JsonConvert.SerializeObject(source);
return JsonConvert.DeserializeObject<RobotSocketState>(json) ?? new RobotSocketState { IPAddress = source.IPAddress };
}
/// <summary>
- /// 鑾峰彇Redis缂撳瓨閿�
+ /// 浠庢暟鎹簱鑾峰彇鏈烘鎵嬬姸鎬�
/// </summary>
- public static string GetCacheKey(string ipAddress)
- {
- return $"{RedisPrefix.Code}:{RedisName.SocketDevices}:{ipAddress}";
- }
-
- /// <summary>
- /// 浠庣紦瀛樿幏鍙栫姸鎬�
- /// </summary>
+ /// <param name="ipAddress">璁惧 IP 鍦板潃</param>
+ /// <returns>濡傛灉瀛樺湪鍒欒繑鍥炵姸鎬佸璞★紝鍚﹀垯杩斿洖 null</returns>
public RobotSocketState? GetState(string ipAddress)
{
- return _cache.Get<RobotSocketState>(GetCacheKey(ipAddress));
+ var entity = _repository.GetByIp(ipAddress);
+ return entity != null ? _repository.ToSocketState(entity) : null;
}
/// <summary>
- /// 鑾峰彇鎴栧垱寤虹姸鎬�
+ /// 鑾峰彇鎴栧垱寤烘満姊版墜鐘舵��
/// </summary>
+ /// <remarks>
+ /// 濡傛灉鏁版嵁搴撲腑宸插瓨鍦ㄨ璁惧鐨勭姸鎬侊紝鐩存帴杩斿洖銆�
+ /// 濡傛灉涓嶅瓨鍦紝鍒欏垱寤烘柊鐨勭姸鎬佽褰曞苟杩斿洖銆�
+ /// </remarks>
+ /// <param name="ipAddress">璁惧 IP 鍦板潃</param>
+ /// <param name="robotCrane">鏈哄櫒浜鸿澶囦俊鎭紝鐢ㄤ簬鍒濆鍖栨柊鐘舵��</param>
+ /// <returns>璇ヨ澶囩殑鐘舵�佸璞�</returns>
public RobotSocketState GetOrCreateState(string ipAddress, RobotCraneDevice robotCrane)
{
- return _cache.GetOrAdd(GetCacheKey(ipAddress), _ => new RobotSocketState
- {
- IPAddress = ipAddress,
- RobotCrane = robotCrane
- });
+ var entity = _repository.GetOrCreate(ipAddress, robotCrane);
+ return _repository.ToSocketState(entity);
}
}
}
--
Gitblit v1.9.3