Пример #1
0
        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));
        }
Пример #2
0
        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));
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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));
        }
Пример #5
0
        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));
        }
Пример #6
0
        /// <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));
        }
Пример #7
0
        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));
        }
Пример #8
0
        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));
        }
Пример #9
0
        /// <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);
                });
            }
        }
Пример #10
0
        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));
        }
Пример #11
0
        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));
        }
Пример #12
0
        /// <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));
        }
Пример #13
0
        /// <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);
        }
Пример #14
0
        /// <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);
        }
Пример #15
0
        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));
        }
Пример #16
0
        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);
        }
Пример #19
0
        /// <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)));
            }
        }