using Newtonsoft.Json; using SqlSugar; using WIDESEAWCS_Core.BaseRepository; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_Model.Models; namespace WIDESEAWCS_TaskInfoRepository { /// /// 机械手状态 SqlSugar 仓储实现 /// public class RobotStateRepository : RepositoryBase, IRobotStateRepository { public RobotStateRepository(IUnitOfWorkManage unitOfWork) : base(unitOfWork) { } public Dt_RobotState? GetByIp(string ipAddress) { return Db.Queryable() .Where(x => x.IPAddress == ipAddress) .First(); } public Dt_RobotState GetOrCreate(string ipAddress, RobotCraneDevice robotCrane) { var existing = GetByIp(ipAddress); if (existing != null) { return existing; } var newState = new Dt_RobotState { IPAddress = ipAddress, Version = DateTime.UtcNow.Ticks, RobotCraneJson = JsonConvert.SerializeObject(robotCrane), CreateDate = DateTime.Now, ModifyDate = DateTime.Now }; Db.Insertable(newState).ExecuteCommand(); return newState; } public bool TryUpdate(string ipAddress, Dt_RobotState newState, long expectedVersion) { newState.ModifyDate = DateTime.Now; // 乐观锁:WHERE IPAddress = @ip AND Version = @expectedVersion,版本匹配才更新 var affectedRows = Db.Updateable(newState) .Where(x => x.IPAddress == ipAddress && x.Version == expectedVersion) .ExecuteCommand(); return affectedRows > 0; } public RobotSocketState ToSocketState(Dt_RobotState entity) { var state = new RobotSocketState { IPAddress = entity.IPAddress, Version = entity.Version, IsEventSubscribed = entity.IsEventSubscribed, RobotRunMode = entity.RobotRunMode, RobotControlMode = entity.RobotControlMode, RobotArmObject = entity.RobotArmObject, Homed = entity.Homed, CurrentAction = entity.CurrentAction, OperStatus = entity.OperStatus, IsSplitPallet = entity.IsSplitPallet, IsGroupPallet = entity.IsGroupPallet, RobotTaskTotalNum = entity.RobotTaskTotalNum, IsInFakeBatteryMode = entity.IsInFakeBatteryMode, CurrentBatchIndex = entity.CurrentBatchIndex, ChangePalletPhase = entity.ChangePalletPhase, IsScanNG = entity.IsScanNG, BatteryArrived = entity.BatteryArrived }; // 反序列化复杂 JSON 字段 if (!string.IsNullOrEmpty(entity.RobotCraneJson)) { state.RobotCrane = JsonConvert.DeserializeObject(entity.RobotCraneJson); } if (!string.IsNullOrEmpty(entity.CurrentTaskJson)) { state.CurrentTask = JsonConvert.DeserializeObject(entity.CurrentTaskJson); } if (!string.IsNullOrEmpty(entity.LastPickPositionsJson)) { state.LastPickPositions = JsonConvert.DeserializeObject(entity.LastPickPositionsJson); } if (!string.IsNullOrEmpty(entity.LastPutPositionsJson)) { state.LastPutPositions = JsonConvert.DeserializeObject(entity.LastPutPositionsJson); } if (!string.IsNullOrEmpty(entity.CellBarcodeJson)) { state.CellBarcode = JsonConvert.DeserializeObject>(entity.CellBarcodeJson) ?? new List(); } return state; } public Dt_RobotState ToEntity(RobotSocketState state) { var entity = new Dt_RobotState { IPAddress = state.IPAddress, IsEventSubscribed = state.IsEventSubscribed, RobotRunMode = state.RobotRunMode, RobotControlMode = state.RobotControlMode, RobotArmObject = state.RobotArmObject, Homed = state.Homed, CurrentAction = state.CurrentAction, OperStatus = state.OperStatus, IsSplitPallet = state.IsSplitPallet, IsGroupPallet = state.IsGroupPallet, RobotTaskTotalNum = state.RobotTaskTotalNum, IsInFakeBatteryMode = state.IsInFakeBatteryMode, CurrentBatchIndex = state.CurrentBatchIndex, ChangePalletPhase = state.ChangePalletPhase, IsScanNG = state.IsScanNG, BatteryArrived = state.BatteryArrived }; // 序列化复杂对象为 JSON if (state.RobotCrane != null) { entity.RobotCraneJson = JsonConvert.SerializeObject(state.RobotCrane); } if (state.CurrentTask != null) { entity.CurrentTaskJson = JsonConvert.SerializeObject(state.CurrentTask); } if (state.LastPickPositions != null) { entity.LastPickPositionsJson = JsonConvert.SerializeObject(state.LastPickPositions); } if (state.LastPutPositions != null) { entity.LastPutPositionsJson = JsonConvert.SerializeObject(state.LastPutPositions); } if (state.CellBarcode != null && state.CellBarcode.Count > 0) { entity.CellBarcodeJson = JsonConvert.SerializeObject(state.CellBarcode); } return entity; } } }