public ActionResult SearchAll(QueryParams queryParams) { EquipmentResult result = new EquipmentResult(); try { //查询该教室 Z_Room room = ZRoomService.GetEntity(u => u.F_RoomNo == queryParams.classroom).FirstOrDefault(); if (room == null) //没有该教室 { result.Message = "教室地址有误!"; } else { ClassRoom classRoom = PortService.Search(room, ref result); //PortService.CloseConnect(); result.AppendData = classRoom; } } catch (Exception exception) { result.ErrorData = exception.ToString(); result.Message = "查询设备信息失败"; } return(Json(result, JsonRequestBehavior.AllowGet)); }
public ActionResult ControlBuildingEquipment(string buildingName, string equipmentType, string onoff) { EquipmentResult equipmentResult = new EquipmentResult(); try { var classroom = ZRoomService.GetRoomsForBuildingName(buildingName); //查找出所有教室里的所有该设备编码的设备 var equis = ZEquipmentService.GetEntity(e => classroom.Any(r => e.F_RoomId == r.F_Id)).Where(e => e.F_EquipmentType == equipmentType); //筛选出教室编码和设备编码 var val = (from c in classroom join e in equis on c.F_Id equals e.F_RoomId select new EquipmentDto { F_RoomNo = c.F_RoomNo, F_EquipmentNo = e.F_EquipmentNo }).ToList(); PortService.ControlMultiEquipment(val, onoff, equipmentType); equipmentResult.Message = "控制整栋楼层设备成功"; equipmentResult.ResultCode = ResultCode.Ok; equipmentResult.Status = true; } catch (Exception ex) { equipmentResult.Message = "控制整栋楼层设备失败"; equipmentResult.ResultCode = ResultCode.Error; equipmentResult.Status = false; equipmentResult.ErrorData = ex.Message; } return(Json(equipmentResult)); }
/// <summary> /// 发送转换后的查询命令 /// </summary> /// <param name="fun"></param> /// <param name="classroom"></param> /// <param name="nodeAdd"></param> /// <param name="onoff"></param> /// <returns></returns> public EquipmentResult SendConvertSearchCmd(byte fun, string classroom) { classroom = string.IsNullOrEmpty(classroom) ? "00" : classroom; EquipmentResult oa = new EquipmentResult(); try { byte[] cmd = { 0x55, 0x02, 0, 0, fun, 0, 0x01, 0 }; byte[] bclassroom = classroom.StrToHexByte(); byte[] bnodeAdd = "00".StrToHexByte(); bclassroom.CopyTo(cmd, 2); bnodeAdd.CopyTo(cmd, 5); cmd = cmd.ActuatorCommand(); SendSearchCmd(cmd); ClassRoom classRoom = null; classRoom = Init(classRoom); oa.Status = true; oa.ResultCode = ResultCode.Ok; } catch (Exception exception) { oa.Status = false; oa.ErrorData = exception.Message; oa.ResultCode = ResultCode.Error; ExceptionHelper.AddException(exception); } return(oa); }
/// <summary> /// 初始化设备节点 /// </summary> /// <param name="classroom">教室地址</param> /// <returns></returns> public ActionResult Init(string classroom) { byte b = 0x00; byte fun = 0x1f; EResult = PortService.SendConvertCmd(fun, classroom, "00", b); EResult.Message = EResult.Status ? "查询设备信息成功" : "查询设备信息失败"; ClassRoom classRoom = PortService.GetReturnData(classroom); var list = classRoom.SonserList; List <Z_Equipment> zeList = new List <Z_Equipment>(); Z_Room room = ZRoomService.GetEntity(u => u.F_RoomNo == classroom).FirstOrDefault(); ZEquipmentService.DeleteEntitys(ZEquipmentService.GetEntity(u => u.F_RoomId == room.F_Id).ToList()); if (room != null) { foreach (var item in list) { var zEquipment = new Z_Equipment { F_Id = Guid.NewGuid().ToString(), F_RoomId = room.F_Id, F_FullName = item.Name, F_EquipmentType = item.Type + "", F_EnabledMark = true, F_EquipmentNo = item.Id.IndexOf('_') != -1 ? item.Id.Split('_')[0] : item.Id }; zeList.Add(zEquipment); } } ZEquipmentService.AddEntitys(zeList); EResult.AppendData = list; return(Json(EResult, JsonRequestBehavior.AllowGet)); }
public ActionResult SearchTest(QueryParams queryParams) { EquipmentResult result = new EquipmentResult(); Z_Room room = ZRoomService.GetEntity(u => u.F_RoomNo == queryParams.classroom).FirstOrDefault(); //获取该教室所有的设备 var zeList = ZEquipmentService.GetEntity(u => u.F_RoomId == room.F_Id).ToList(); byte fun = (byte)Convert.ToInt32(AppSettingUtils.GetValue("Search")); ClassRoom classRoom = PortService.GetReturnDataTest(queryParams.classroom); if (classRoom != null) { classRoom.Name = room?.F_FullName; classRoom.ClassNo = room.F_EnCode; //教室编码 classRoom.Id = room.F_RoomNo; var list = classRoom.SonserList; classRoom.AbnormalSonserList = classRoom.SonserList.Where(u => u.Online == StateType.Offline).ToList(); classRoom.NormalSonserList = classRoom.SonserList.Where(u => u.Online == StateType.Online).ToList(); result.Count = zeList.Count; result.ExceptionCount = classRoom.AbnormalSonserList.Count; result.NormalCount = classRoom.NormalSonserList.Count; result.AppendData = classRoom; } else { result.Message = "查询设备信息失败!请重试"; } return(Json(result)); }
/// <summary> /// 设置风机 /// </summary> /// <param name="classroom">教室地址</param> /// <param name="nodeAdd">节点地址</param> /// <param name="onoff">开关</param> /// <returns></returns> public ActionResult SetFan(ControlParams controlParams) { byte fun = (byte)Convert.ToInt32(AppSettingUtils.GetValue("Fan")); byte b = (byte)(controlParams.onoff == StateType.OPEN ? 0x01 : 0x00); EResult = PortService.SendConvertCmd(fun, controlParams.classroom, controlParams.nodeAdd, b); EResult.Message = EResult.Status ? "设置风机成功" : "设置风机失败"; return(Json(EResult, JsonRequestBehavior.AllowGet)); }
public ActionResult SetProjectionScreen(ControlParams controlParams) { byte fun = (byte)Convert.ToInt32(AppSettingUtils.GetValue("ProjectionScreen")); byte b = (byte)(controlParams.onoff == StateType.OPEN ? 0x01 : 0x00); EResult = PortService.SendConvertCmd(fun, controlParams.classroom, controlParams.nodeAdd, b); EResult.Message = EResult.Status ? "设置投影屏成功" : "设置投影屏失败"; return(Json(EResult)); }
public ActionResult SetCurtain(ControlParams controlParams) { byte fun = (byte)Convert.ToInt32(AppSettingUtils.GetValue("Curtain")); byte b = (byte)(controlParams.onoff == StateType.OPEN ? 0x04 : (controlParams.onoff == StateType.STOP ? 0x05 : 0x00)); EResult = PortService.SendConvertCmd(fun, controlParams.classroom, controlParams.nodeAdd, b); EResult.Message = EResult.Status ? "设置窗帘成功" : "设置窗帘失败"; return(Json(EResult)); }
/// <summary> /// 操作后 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); if (!isCheck) { return; } string token; token = filterContext.HttpContext.Request.Headers["Access"]; token = token ?? filterContext.HttpContext.Request["Access"]; token = token ?? filterContext.HttpContext.Request.Cookies["Access"]?.Value; var payload = Cache.GetCache <Payload>(token); //操作日志记录 JsonResult jsonResult = filterContext.Result as JsonResult; string roomId = filterContext.HttpContext.Request["classroom"]; string nodeId = filterContext.HttpContext.Request["nodeAdd"] ?? "00"; if (nodeId?.IndexOf("_") != -1) { nodeId = nodeId.Split('_')[0]; } string onoff = filterContext.HttpContext.Request["onoff"]; onoff = string.IsNullOrEmpty(onoff) ? "" : onoff; EquipmentResult equipmentResult = jsonResult?.Data as EquipmentResult; if (equipmentResult != null) { //开启线程处理后续日志操作 ThreadPool.QueueUserWorkItem(oo => { Z_EquipmentLog zEquipmentLog = new Z_EquipmentLog(); zEquipmentLog.F_Id = Guid.NewGuid().ToString(); zEquipmentLog.F_Account = payload.Account; zEquipmentLog.F_Date = DateTime.Now; zEquipmentLog.F_RoomNo = roomId; string roomName = ZRoomService.GetEntity(z => z.F_RoomNo.ToLower() == roomId.ToLower()).Select(z => z.F_FullName).FirstOrDefault(); string nodeName = ZEquipmentService.GetEntity(e => e.F_EquipmentNo.ToLower() == nodeId.ToLower()) .Select(e => e.F_FullName).FirstOrDefault(); var user = SysUserService.GetEntity(u => u.F_Account == payload.Account).Select(o => new { o.F_NickName, o.F_RealName }) .FirstOrDefault(); zEquipmentLog.F_EquipmentNo = nodeId; zEquipmentLog.F_Description = equipmentResult.Message; zEquipmentLog.F_EquipmentLogType = onoff == StateType.OPEN ? EQUOPEN : onoff == StateType.CLOSE ? EQUCLOSE : EQUSEARCH; zEquipmentLog.F_RoomName = roomName; zEquipmentLog.F_EquipmentName = nodeName; zEquipmentLog.F_NickName = user?.F_NickName; zEquipmentLog.F_FullName = user?.F_RealName; ZEquipmentLogService.AddEntity(zEquipmentLog); }); } }
public ActionResult SetElectronicClock(string classroom, string nodeAdd) { EquipmentResult oa = new EquipmentResult(); try { byte fun = (byte)Convert.ToInt32(AppSettingUtils.GetValue("Clock")); byte[] classAddr = classroom.StrToHexByte(); byte[] nodeAddr = nodeAdd.StrToHexByte(); //获取当前时间 DateTime currentTime = Convert.ToDateTime(DatetimeExtened.GetNetDateTime()); //转换时间格式 string year = (currentTime.Year % 100).ToString(); string month = currentTime.Month < 10 ? "0" + currentTime.Month : currentTime.Month.ToString(); string day = currentTime.Day < 10 ? "0" + currentTime.Day : currentTime.Day.ToString(); string hour = currentTime.Hour < 10 ? "0" + currentTime.Hour : currentTime.Hour.ToString(); string minute = currentTime.Minute < 10 ? "0" + currentTime.Minute : currentTime.Minute.ToString(); string second = currentTime.Second < 10 ? "0" + currentTime.Second : currentTime.Second.ToString(); string date = $"{year} {month} {day}"; //日期部分 byte[] yMd = date.StrToHexByte(); //将日期部分转为byte[]类型 string time = $"{hour} {minute} {second}"; //时间部分 byte[] hms = time.StrToHexByte(); //将时间部分转为byte[]类型 byte week = (byte)(Convert.ToInt32(currentTime.DayOfWeek.ToString("d"))); byte[] cmd = { 0x55, 0x02, 0, 0, fun, 0, 0x0D, 0, 0, 0, week, 0, 0, 0, 0x23, 0, 0, 0x70, 0, 0 }; classAddr.CopyTo(cmd, 2); nodeAddr.CopyTo(cmd, 5); yMd.CopyTo(cmd, 7); hms.CopyTo(cmd, 11); cmd = cmd.ActuatorCommand(); PortService.SendCmd(cmd); oa.Status = true; oa.Message = "时间同步成功"; oa.ResultCode = ResultCode.Ok; } catch (Exception exception) { ExceptionHelper.AddException(exception); oa.Status = false; oa.ResultCode = ResultCode.Error; oa.Message = "时间同步失败"; oa.ErrorData = exception.Message; } return(Json(oa)); }
public ActionResult SetAirConditioning(AirControlParams airControlParams) { byte height = (byte)(airControlParams.onoff == StateType.OPEN ? 1 << 7 : 0 << 7); Int16 m = Convert.ToInt16(airControlParams.model); height |= (byte)(m << 4); Int16 s = Convert.ToInt16(airControlParams.speed); height |= (byte)(s << 2); height |= (byte)(Convert.ToInt16(airControlParams.SweepWind) << 1); byte low = (byte)Convert.ToInt16(airControlParams.wd); byte fun = (byte)Convert.ToInt32(AppSettingUtils.GetValue("Air")); EResult = PortService.SendConvertCmd(fun, airControlParams.classroom, airControlParams.nodeAdd, height: height, low: low); EResult.Message = EResult.Status ? "设置空调成功" : "设置空调失败"; return(Json(EResult)); }
/// <summary> /// 设置灯 /// </summary> /// <param name="controlParams"></param> /// <returns></returns> public ActionResult SetLamp(ControlParams controlParams) { byte fun = (byte)Convert.ToInt32(AppSettingUtils.GetValue("Lamp")); int res = controlParams.nodeAdd.IndexOf('_'); if (res != -1) //表示一个灯节点控制多个灯 { int state = Cache.GetCache <int>(controlParams.classroom); string[] node = controlParams.nodeAdd.Split('_'); //下滑线后面表示控制第几个灯 if (node[1] == "1") //控制第1个灯 { if (controlParams.onoff == StateType.CLOSE) { state &= ~0x02; } else { state |= 0x02; } } else if (node[1] == "0") //控制第0个灯 { if (controlParams.onoff == StateType.CLOSE) { state &= ~0x01; } else { state |= 0x01; } } state = state | 1 << 7; Cache.SetCache(controlParams.classroom, state); EResult = PortService.SendConvertCmd(fun, controlParams.classroom, node[0], (byte)state); } else //表示一个灯节点控制一个灯 { byte b = (byte)(controlParams.onoff == StateType.OPEN ? 0x01 : 0x00); EResult = PortService.SendConvertCmd(fun, controlParams.classroom, controlParams.nodeAdd, b); } EResult.Message = EResult.Status ? "设置灯成功" : "设置灯失败"; return(Json(EResult)); }
/// <summary> /// 发送转换后的执行命令 /// </summary> /// <param name="fun">功能码</param> /// <param name="classroom">教室地址</param> /// <param name="nodeAdd">节点地址</param> /// <param name="onoff">开关</param> /// <param name="height">高位</param> /// <param name="low">低位</param> /// <returns></returns> public EquipmentResult SendConvertCmd(byte fun, string classroom, string nodeAdd, byte onoff = 0, byte?height = null, byte?low = null) { EquipmentResult oa = new EquipmentResult(); try { if (nodeAdd != "00") { if (!ZEquipmentService.CheckClassEquipment(classroom, nodeAdd)) { throw new EquipmentNoFindException("没有查询到该教室有该ID的设备"); } } byte[] bclassroom = classroom.StrToHexByte(); byte[] bnodeAdd = nodeAdd.StrToHexByte(); byte[] cmd; if (height == null || low == null) //控制其他非空调控制器 { cmd = new byte[] { 0x55, 0x02, 0, 0, fun, 0, 0x01, onoff }; } else //控制空调控制器 { cmd = new byte[] { 0x55, 0x02, 0, 0, fun, 0, 0x02, (byte)height, (byte)low }; } bclassroom.CopyTo(cmd, 2); bnodeAdd.CopyTo(cmd, 5); cmd = cmd.ActuatorCommand(); SendCmd(cmd); oa.Status = true; oa.ResultCode = ResultCode.Ok; } catch (Exception exception) { oa.Status = false; oa.ErrorData = exception.Message; oa.ResultCode = ResultCode.Error; } return(oa); }
/// <summary> /// 查询的教室设备节点信息 /// </summary> /// <param name="classroom">教室</param> /// <param name="result">记录结果</param> /// <returns>返回记录结果</returns> public ClassRoom Search(Z_Room room, ref EquipmentResult result) { //获取该教室所有的设备 var zeList = ZEquipmentService.GetEntity(u => u.F_RoomId == room.F_Id).ToList(); byte fun = (byte)Convert.ToInt32(AppSettingUtils.GetValue("Search")); //向串口发送查询指令 result = SendConvertSearchCmd(fun, room.F_RoomNo); ClassRoom classRoom = GetReturnData(room.F_RoomNo); if (classRoom == null) //没有数据就重新发一次 { Thread.Sleep(300); //向串口发送指令 result = SendConvertSearchCmd(fun, room.F_RoomNo); classRoom = GetReturnData(room.F_RoomNo); } if (classRoom != null) { classRoom.Name = room.F_FullName; classRoom.ClassNo = room.F_EnCode; //教室编码 classRoom.Id = room.F_RoomNo; classRoom.AbnormalSonserList = classRoom.SonserList.Where(u => u.Online == StateType.Offline).ToList(); classRoom.NormalSonserList = classRoom.SonserList.Where(u => u.Online == StateType.Online).ToList(); result.Count = zeList.Count; result.ExceptionCount = zeList.Count - classRoom.NormalSonserList.Count; result.NormalCount = classRoom.NormalSonserList.Count; result.Message = "查询设备信息成功"; } else { result.Status = false; result.ResultCode = ResultCode.Error; result.Message = "查询设备信息失败!请重试"; } return(classRoom); }
public ActionResult ControlFloorEquipment(string buildingName, string floorName, string equipmentType, string onoff) { EquipmentResult equipmentResult = new EquipmentResult(); try { //Z_Room room = ZRoomService.GetEntity(u => u.F_FullName == buildingName).FirstOrDefault();//查找该楼栋 //var floor = ZRoomService.GetEntity(u => u.F_ParentId == room.F_Id).Where(u => u.F_FullName == floorName); //该楼栋的该楼层 //var classroom = ZRoomService.GetEntity(u => floor.Any(f => f.F_Id == u.F_ParentId)); //楼层中所有教室 var classroom = ZRoomService.GetRoomsForBuildingName(buildingName, floorName); //查询该楼层下的该设备型号的所有设备 var equis = ZEquipmentService.GetEntity(e => classroom.Any(r => e.F_RoomId == r.F_Id)).Where(e => e.F_EquipmentType == equipmentType); //筛选出教室编码和设备编码 var val = (from c in classroom join e in equis on c.F_Id equals e.F_RoomId select new EquipmentDto() { F_RoomNo = c.F_RoomNo, F_EquipmentNo = e.F_EquipmentNo }).ToList(); PortService.ControlMultiEquipment(val, onoff, equipmentType); PortService.ControlMultiEquipment(val, onoff, equipmentType); equipmentResult.Message = "控制整栋楼层设备成功"; equipmentResult.ResultCode = ResultCode.Ok; equipmentResult.Status = true; } catch (Exception ex) { equipmentResult.Message = "控制整栋楼层设备失败"; equipmentResult.ResultCode = ResultCode.Error; equipmentResult.Status = false; equipmentResult.ErrorData = ex.Message; } return(Json(equipmentResult)); }
public async Task <IActionResult> PostHerosLocations([FromBody] PassedGameData <int?> passedData) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } DateTime now = DateTime.UtcNow; if (passedData.UserToken == null || passedData.ActionToken == null) { return(BadRequest(new DataError("securityErr", "No authorization controll."))); } UserToken dbtoken = Security.CheckUserToken(this._context, passedData.UserToken); if (dbtoken == null) { return(BadRequest(new DataError("securityErr", "Your data has probably been stolen or modified manually. We suggest password's change."))); } else { if (!dbtoken.IsTimeValid(now)) { return(BadRequest(new DataError("timeoutErr", "You have been too long inactive. Relogin is required."))); } else { dbtoken.UpdateToken(now); } } Heros hero = _context.Heros.FirstOrDefault(e => e.Name == passedData.ActionToken.HeroName); ActionToken gametoken = Security.CheckActionToken(_context, passedData.ActionToken, hero.HeroId); if (gametoken == null) { return(BadRequest(new DataError("securityErr", "Your data has probably been stolen or modified manually. We suggest password's change."))); } else { if (!gametoken.IsTimeValid(now)) { return(BadRequest(new DataError("timeoutErr", "You have been too long inactive. Relogin is required."))); } else { gametoken.UpdateToken(now); } } try { await _context.SaveChangesAsync(); } catch (DbUpdateException) { return(BadRequest(new DataError("databaseErr", "Failed to update tokens."))); } // can do stuff var Equipment = _context.Equipment.FirstOrDefault(e => e.HeroId == hero.HeroId); if (Equipment == null) { return(BadRequest(new DataError("equipmentErr", "Hero is without equipment."))); } List <int?> used = new List <int?> { Equipment.Armour, Equipment.Bracelet, Equipment.FirstHand, Equipment.Gloves, Equipment.Neckles, Equipment.Ring1, Equipment.Ring2, Equipment.SecondHand, Equipment.Shoes, Equipment.Trousers }; var ItemsOn = used.Where(e => e.HasValue).Select(e => e.Value).ToList(); var Backpack = _context.Backpack.Where(e => e.HeroId == hero.HeroId); var UsedItems = Backpack.Select(e => e.ItemId).Distinct().ToList(); UsedItems.AddRange(ItemsOn); UsedItems = UsedItems.Distinct().OrderBy(e => e).ToList(); var ItemsInUse = _context.Items.Join(UsedItems, e => e.ItemId, e => e, (a, b) => a).ToArray(); EquipmentResult EQ = Equipment.GenResult(ItemsInUse.ToArray(), Backpack.ToList()); return(Ok(new { success = true, equipment = EQ })); }
/// <summary> /// 可疊數量如果歸0->不刪除紀錄,直接更新成0(背包計算上已處理這塊) /// 不可疊->直接砍掉該筆紀錄 /// </summary> /// <param name="uid"></param> /// <param name="items"></param> /// <param name="fromType"></param> /// <param name="from"></param> /// <returns></returns> public static async ETTask <EquipmentResult> DeleteEquipment(long uid, List <EquipmentInfo> items, EquipmentFrom fromType, int from, bool deleteAnyhow = false) { // 回傳結構 var equipmentResult = new EquipmentResult(); // 抓取使用者背包限制資料 User user = await UserDataHelper.FindOneUser(uid); // 無使用者? if (user == null) { equipmentResult.error = ErrorCode.ERR_AccountDoesntExist; return(equipmentResult); } // 先把相關資料搜尋出來 var eids = items.Select(e => e.ConfigId).ToList(); var results = await dbProxy.Query <Equipment>(entity => entity.uid == uid && eids.Contains(entity.configId)); var equipments = results.OfType <Equipment>().ToList(); // 用企劃表id進行分組 var dictConfigId = OtherHelper.Group(equipments, entity => entity.configId); //// 用企劃表type進行分組(TODO:記得擋背包類型下最大存放數) //var dictConfigType = OtherHelper.Group(equipments, entity => entity.configType); // 批處理 var saveBatch = new List <ComponentWithId>(); var logBatch = new List <ComponentWithId>(); var deleteBatch = new List <long>(); var refreshBagType = new List <int>(); for (int i = 0; i < items.Count; i++) { var item = items[i]; if (item.Count <= 0) { equipmentResult.error = ErrorCode.ERR_EquipmentInvalidCount; return(equipmentResult); } if (TryGetEquipmentConfig(item.ConfigId, out CharacterConfig equipmentConfig)) { // 道具是否可用? if (!equipmentConfig.IsAvailable()) { equipmentResult.error = ErrorCode.ERR_EquipmentUnavailable; return(equipmentResult); } if (!dictConfigId.TryGetValue(equipmentConfig.Id, out var userEqs)) { userEqs = new List <Equipment>(0); } // 道具是否可疊加? if (equipmentConfig.IsStackEquipment()) { var maxCount = equipmentConfig.MaxCountOnSlot; // 可疊不該有兩筆以上的記錄 if (userEqs.Count > 1) { // 記在ErrorLog裡 Log.Error(new Exception($"ERR_EquipmentRecordError> Uid:{uid}, Type:{equipmentConfig.Type}, ConfigId:{equipmentConfig.Id}")); await _MergeEquipment(uid, userEqs.ToArray()); // 合併資料後用遞迴再跑一次 return(await DeleteEquipment(uid, items.Skip(i).ToList(), fromType, from)); } // 判斷有無記錄? else if (userEqs.Count == 0) { equipmentResult.error = ErrorCode.ERR_EquipmentBagIsEmpty; return(equipmentResult); } // 存在一筆紀錄了 else { var userEq = userEqs[0]; if (userEq.count < item.Count) { equipmentResult.error = ErrorCode.ERR_EquipmentNotEnough; return(equipmentResult); } userEq.count -= item.Count; saveBatch.Add(userEq); var log = ComponentFactory.Create <EquipmentLog>(); log.from = from; log.fromType = fromType; log.count = item.Count; var dbLog = _GetSaveEquipmentDBLog(uid, userEq, log, DBLog.LogType.SubtractEquipment); logBatch.Add(dbLog); } } else { if (deleteAnyhow) { var configs = userEqs; if (configs.Count < item.Count) { equipmentResult.error = ErrorCode.ERR_EquipmentNotEnough; return(equipmentResult); } for (int k = 0; k < item.Count; k++) { var config = configs[k]; if (!deleteBatch.Contains(config.Id)) { deleteBatch.Add(config.Id); } } } else { if (!deleteBatch.Contains(item.Id)) { deleteBatch.Add(item.Id); } } } if (!refreshBagType.Contains(equipmentConfig.Type)) { refreshBagType.Add(equipmentConfig.Type); } } else { equipmentResult.error = ErrorCode.ERR_EquipmentNotDefined; return(equipmentResult); } } var result = new RepeatedField <EquipmentInfo>(); // 批刪除 // 不可疊加就根據Id直接砍,Log額外再紀錄 if (deleteBatch.Count != 0) { foreach (var v in dictConfigId) { var dels = OtherHelper.SearchAll(v.Value, entity => deleteBatch.Contains(entity.Id)); var delLog = ComponentFactory.Create <EquipmentLog>(); delLog.from = from; delLog.fromType = fromType; var dbLog = _GetDeleteBatchNoStackEquipmentDBLog(uid, dels, delLog); logBatch.Add(dbLog); } await dbProxy.DeleteJson <Equipment>(entity => deleteBatch.Contains(entity.Id)); foreach (var id in deleteBatch) { result.Add(new EquipmentInfo { Id = id, Count = 0, }); } } // 批儲存資料 if (saveBatch.Count != 0) { await dbProxy.SaveBatch(saveBatch); foreach (var item in saveBatch) { result.Add(((Equipment)item).ToEquipmentInfo()); } } // 批儲存Log if (logBatch.Count != 0) { await dbProxy.SaveBatch(logBatch); } if (refreshBagType.Count != 0) { await user.RecalculateBagCount(refreshBagType); } equipmentResult.error = ErrorCode.ERR_Success; equipmentResult.equipmentInfos = result; equipmentResult.userBagInfo = ToUserBagCapacity(user.userBagCapacity); return(equipmentResult); }
public static async ETTask <EquipmentResult> CreateEquipment(long uid, List <EquipmentInfo> items, EquipmentFrom fromType, int from) { // 回傳結構 var equipmentResult = new EquipmentResult(); // 抓取使用者背包限制資料 User user = await UserDataHelper.FindOneUser(uid); // 無使用者? if (user == null) { equipmentResult.error = ErrorCode.ERR_AccountDoesntExist; return(equipmentResult); } // 先把相關資料搜尋出來 var eids = items.Select(e => e.ConfigId).ToList(); var ret = await dbProxy.Query <Equipment>(entity => entity.uid == uid && eids.Contains(entity.configId)); var results = ret.OfType <Equipment>().ToList(); // 用企劃表id進行分組 var dictConfigId = OtherHelper.Group(results, entity => entity.configId); // 用企劃表type進行分組(TODO:記得擋背包類型下最大存放數) //var dictConfigType = OtherHelper.Group(results, entity => entity.configType); // 批處理 var saveBatch = new List <ComponentWithId>(); var logBatch = new List <ComponentWithId>(); var refreshBagType = new List <int>(); for (int i = 0; i < items.Count; i++) { var item = items[i]; if (item.Count <= 0) { equipmentResult.error = ErrorCode.ERR_EquipmentInvalidCount; return(equipmentResult); } if (TryGetEquipmentConfig(item.ConfigId, out CharacterConfig equipmentConfig)) { // 道具是否可用? if (!equipmentConfig.IsAvailable()) { equipmentResult.error = ErrorCode.ERR_EquipmentUnavailable; return(equipmentResult); } if (!dictConfigId.TryGetValue(equipmentConfig.Id, out var userEqs)) { userEqs = new List <Equipment>(0); } // 道具是否可疊加? if (equipmentConfig.IsStackEquipment()) { var maxCount = equipmentConfig.MaxCountOnSlot; // 可疊不該有兩筆以上的記錄 if (userEqs.Count > 1) { // 記在ErrorLog裡 Log.Error(new Exception($"ERR_EquipmentRecordError> Uid:{uid}, Type:{equipmentConfig.Type}, ConfigId:{equipmentConfig.Id}")); await _MergeEquipment(uid, userEqs.ToArray()); // 合併資料後用遞迴再跑一次 return(await CreateEquipment(uid, items.Skip(i).ToList(), fromType, from)); } // 判斷有無記錄? else if (userEqs.Count == 0) { // 判斷背包容量 if (user.IsOverOrEqualBagMaxSlotCount((Equipment.EquipmentType)equipmentConfig.Type)) { equipmentResult.error = ErrorCode.ERR_EquipmentBagOverLimit; return(equipmentResult); } else { if (equipmentConfig.IsOverOwnedEquipmentLimit(item.Count)) { equipmentResult.error = ErrorCode.ERR_EquipmentOverOwnedLimit; return(equipmentResult); } var userEq = ComponentFactory.CreateWithId <Equipment>(IdGenerater.GenerateId()); userEq.uid = uid; userEq.configType = equipmentConfig.Type; userEq.configId = item.ConfigId; userEq.count = item.Count; saveBatch.Add(userEq); var log = ComponentFactory.Create <EquipmentLog>(); log.from = from; log.fromType = fromType; log.count = item.Count; var dbLog = _GetSaveEquipmentDBLog(uid, userEq, log, DBLog.LogType.AddEquipment); logBatch.Add(dbLog); } } // 存在一筆紀錄了 else { var userEq = userEqs[0]; userEq.count += item.Count; if (equipmentConfig.IsOverOwnedEquipmentLimit(userEq.count)) { equipmentResult.error = ErrorCode.ERR_EquipmentOverOwnedLimit; return(equipmentResult); } saveBatch.Add(userEq); var log = ComponentFactory.Create <EquipmentLog>(); log.from = from; log.fromType = fromType; log.count = item.Count; var dbLog = _GetSaveEquipmentDBLog(uid, userEq, log, DBLog.LogType.AddEquipment); logBatch.Add(dbLog); } } else { // 不可疊加就直接創,Log額外再紀錄 if (equipmentConfig.IsOverOwnedEquipmentLimit(userEqs.Count + item.Count)) { equipmentResult.error = ErrorCode.ERR_EquipmentOverOwnedLimit; return(equipmentResult); } var equipments = new List <Equipment>(); for (int j = 0; j < item.Count; j++) { var userEq = ComponentFactory.CreateWithId <Equipment>(IdGenerater.GenerateId()); userEq.uid = uid; userEq.configType = equipmentConfig.Type; userEq.configId = equipmentConfig.Id; userEq.count = 1; equipments.Add(userEq); } saveBatch.AddRange(equipments); var log = ComponentFactory.Create <EquipmentLog>(); log.from = from; log.fromType = fromType; var dbLog = _GetSaveBatchEquipmentDBLog(uid, equipments, log); logBatch.Add(dbLog); } if (!refreshBagType.Contains(equipmentConfig.Type)) { refreshBagType.Add(equipmentConfig.Type); } } else { equipmentResult.error = ErrorCode.ERR_EquipmentNotDefined; return(equipmentResult); } } // 批儲存 if (saveBatch.Count != 0) { await dbProxy.SaveBatch(saveBatch); await dbProxy.SaveBatch(logBatch); } if (refreshBagType.Count != 0) { await user.RecalculateBagCount(refreshBagType); } equipmentResult.error = ErrorCode.ERR_Success; equipmentResult.userBagInfo = ToUserBagCapacity(user.userBagCapacity); equipmentResult.equipmentInfos = saveBatch.Aggregate(new RepeatedField <EquipmentInfo>(), (list, item) => { list.Add(((Equipment)item).ToEquipmentInfo()); return(list); }); return(equipmentResult); }
/// <summary> /// 通过楼栋查询所有教室设备信息 /// </summary> /// <param name="buildingName"></param> /// <param name="room"></param> /// <returns></returns> public Buildings SearchBuildingAllRoomEquipmentInfo1(string buildingName, Z_Room room) { Buildings buid = new Buildings(); //查询到该楼栋 var building = room; buid.Name = building.F_FullName; //查询到该楼栋下所有楼层 var floors = ZRoomService.GetEntity(u => u.F_ParentId == building.F_Id); //查询该楼栋下所有楼层的教室 var rooms = ZRoomService.GetEntity(r => floors.Any(f => r.F_ParentId == f.F_Id)).ToList(); foreach (var floor in floors) { Floors fl = new Floors(); foreach (var item in rooms) { if (item.F_ParentId == floor.F_Id) { EquipmentResult result = new EquipmentResult(); Debug.WriteLine($"开始查询教室地址:{item.F_RoomNo}"); ClassRoom classRoom = PortService.Search(item, ref result); if (classRoom != null) { Debug.WriteLine("查询成功"); AutoMapperConfig.Map(building, classRoom); AutoMapperConfig.Map(floor, classRoom); AutoMapperConfig.Map(item, classRoom); if (classRoom.AbnormalSonserList.Count > 0) { buid.ExceptionCount += 1; buid.AbnormalEquipment = true; fl.ExceptionCount += 1; fl.AbnormalEquipment = true; classRoom.AbnormalEquipment = true; classRoom.ExceptionCount = classRoom.AbnormalSonserList.Count; } } else { Debug.WriteLine("没有查询到结果"); classRoom = new ClassRoom(); AutoMapperConfig.Map(building, classRoom); AutoMapperConfig.Map(floor, classRoom); AutoMapperConfig.Map(item, classRoom); } fl.ClassRooms.Add(classRoom); result.AppendData = classRoom; } } if (fl.ClassRooms.Count == 0) { fl.Name = floor.F_FullName + " (没有教室)"; } else { fl.Name = floor.F_FullName; } buid.Floors.Add(fl); } return(buid); }
public async Task <IActionResult> PostHeros([FromBody] PassedData <string> passedData) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } DateTime now = DateTime.UtcNow; if (passedData.UserToken == null) { return(BadRequest(new DataError("securityErr", "No authorization controll."))); } UserToken dbtoken = Security.CheckUserToken(this._context, passedData.UserToken); if (dbtoken == null) { return(BadRequest(new DataError("securityErr", "Your data has probably been stolen or modified manually. We suggest password's change."))); } else { if (!dbtoken.IsTimeValid(now)) { return(BadRequest(new DataError("timeoutErr", "You have been too long inactive. Relogin is required."))); } else { dbtoken.UpdateToken(now); } } Heros hero = _context.Heros.Where(e => e.Name == passedData.Data).Join(_context.UsersHeros.Where(e => e.UserName == dbtoken.UserName), e => e.HeroId, e => e.HeroId, (a, b) => a).FirstOrDefault(); if (hero == null) { return(BadRequest(new DataError("noHeroErr", "Hero is not available."))); } ActionToken actionToken = Security.GenerateActionToken(hero.HeroId, _context); ActionTokenResult tokenResult = new ActionTokenResult() { HeroName = hero.Name, Token = actionToken.HashedToken, }; try { await _context.SaveChangesAsync(); } catch (DbUpdateException) { return(BadRequest(new DataError("databaseErr", "Failed to update tokens."))); } try { var heroStatus = LocationHandler.GetHeroGeneralStatus(_context, hero, now); // equipment generation var Equipment = _context.Equipment.FirstOrDefault(e => e.HeroId == hero.HeroId); if (Equipment == null) { return(BadRequest(new DataError("equipmentErr", "Hero is without equipment."))); } List <int?> used = new List <int?> { Equipment.Armour, Equipment.Bracelet, Equipment.FirstHand, Equipment.Gloves, Equipment.Helmet, Equipment.Neckles, Equipment.Ring1, Equipment.Ring2, Equipment.SecondHand, Equipment.Shoes, Equipment.Trousers }; var ItemsOn = used.Where(e => e.HasValue).Select(e => e.Value).ToList(); var Backpack = _context.Backpack.Where(e => e.HeroId == hero.HeroId); var UsedItems = Backpack.Select(e => e.ItemId).Distinct().ToList(); UsedItems.AddRange(ItemsOn); UsedItems = UsedItems.Distinct().OrderBy(e => e).ToList(); var ItemsInUse = _context.Items.Join(UsedItems, e => e.ItemId, e => e, (a, b) => a).ToArray(); EquipmentResult EQ = Equipment.GenResult(ItemsInUse.ToArray(), Backpack.ToList()); return(Ok(new { success = true, actiontoken = tokenResult, hero = hero.GenResult(EQ, heroStatus.Location, heroStatus.StatusData) })); } catch (Exception e) { return(BadRequest(new DataError("statusErr", e.Message))); } }