/// <summary> /// 更新系统价格 /// </summary> /// <returns></returns> public static bool Update() { // TODO: 暂时每次启动时更新一次, 后期根据需要修改 // 数据过期时间 DateTime expiresIn = new DateTime(); // 从 ESI 获取系统价格数据 List <ESIMarketPrice> eSIMarketPrices = ESI.GetMarketPrices(ref expiresIn); // 如果获取不成功则返回 if (eSIMarketPrices == null) { return(false); } DCEVEDataContext dc = new DCEVEDataContext(); dc.UniversePrice.DeleteAllOnSubmit(dc.UniversePrice); // 清空所有旧数据 dc.SubmitChanges(); UniversePrice up; foreach (var mp in eSIMarketPrices) { // 判断物品类型数据库是否有跟踪, 无跟踪则跳过 if (dc.invTypes.SingleOrDefault(t => t.typeID == mp.TypeID) == null) { continue; } // 新建数据 up = new UniversePrice(); // 更新数据 up.TypeID = mp.TypeID; up.AdjustedPrice = mp.AdjustedPrice; up.AveragePrice = mp.AveragePrice; up.ExpiresIn = expiresIn; dc.UniversePrice.InsertOnSubmit(up); } // 提交数据库 dc.SubmitChanges(); return(true); }
/// <summary> /// 从 ESI 获取价格数据更新本地数据库 /// </summary> /// <param name="location"></param> private void UpdateMarketPrice(Locations location) { DCEVEDataContext dc = new DCEVEDataContext(); MarketPrice mp; if (_marketPriceOfLocation == null) { // 若该字段为空则说明数据库还没有此数据, 新建一条 mp = new MarketPrice() { TypeID = typeID, LocationID = location.LocationID, ExpiresDateTime = DateTime.MinValue }; dc.MarketPrice.InsertOnSubmit(mp); } else { // 若不为空则从新的 DataContext 获取该数据 mp = dc.MarketPrice.Single(p => p.TypeID == typeID && p.LocationID == location.LocationID); } // 数据过期时间 DateTime expriesDateTime = new DateTime(); // 从 ESI 获取价格数据 IEnumerable <ESIMarketOrder> marketOrders = ESI.GetMarketOrders(mp.TypeID, location.RegionID, ref expriesDateTime); // 仅获取对应位置的数据 marketOrders = marketOrders.Where(p => p.LocationID == mp.LocationID); if (marketOrders.Where(p => p.IsBuyOrder).Count() == 0) { mp.MaxBuyPrice = 0; } else { mp.MaxBuyPrice = marketOrders.Where(p => p.IsBuyOrder).Max(p => p.Price); } // TODO: 当售价为 0 时, 即没有出售单时, 应该做些处理 // 设置 PriceAsProduct 和 PriceAsMaterial 属性, 根据不同情况做不同处理 if (marketOrders.Where(p => !p.IsBuyOrder).Count() == 0) { mp.MinSellPrice = 0; } else { mp.MinSellPrice = marketOrders.Where(p => !p.IsBuyOrder).Min(p => p.Price); } // 数据过期时间 mp.ExpiresDateTime = expriesDateTime; // 更新数据库 dc.SubmitChanges(); }
/// <summary> /// 更新软件跟踪的所有角色和军团拥有的蓝图信息 /// </summary> /// <returns>若更新成功则返回 True, 应 SubmitChange() </returns> public static bool Update() { DCEVEDataContext dc = new DCEVEDataContext(); // TODO: First OwnedBluePrints.Update() 执行前, 应该先根据数据库蓝图更新时间, 将从上次更新到目前为止的工业历史更新进数据库蓝图的属性中.() DateTime updateTime = DateTime.Now; // 统一更新时间 var esiOwnedBluePrints = OwnedBluePrintsOfAllCharacters(); // ESI 取得的 OwnedBluePrints 数据 var dbOwnedBluePrints = dc.OwnedBluePrints.ToList(); // 数据库上的 OwnedBluePrints 数据 -> 必须调用 ToList() 方法, 否则每次都会重新重数据库获取数据 // 第一次遍历先将 ItemID 匹配得上且基本属性没有改变的蓝图对象的数据更新 OwnedBluePrints bluePrintDB; for (int i = esiOwnedBluePrints.Count - 1; i >= 0; i--) { // 查找数据库中对应 ItemID 的蓝图数据 (p.UpdateTime != updateTime 条件筛选掉已更新的数据) bluePrintDB = dbOwnedBluePrints.SingleOrDefault(p => p.UpdateTime != updateTime && p.ItemID == esiOwnedBluePrints[i].ItemID); // 若没有对应的数据, 则留待下次遍历处理 if (bluePrintDB == null) { continue; } // 虽然 ItemID 一样, 需通过确认蓝图 BluePrintID 属性是否相同来确认是否是同一个物品 if (bluePrintDB.BluePrintID != esiOwnedBluePrints[i].BluePrintID) { // 若不是同一个物品, 理论上也是将数据的字段更新一下就可以, 但若出现这个问题则属以外情况. // continue; // _updateAllPropertyFromESIData 中没有更新 BluePrintID // 理论上不可能存在这种情况, 若出现,先用一个 MessageBox 提示 MessageBox.Show(string.Format("OwnedBluePrints.Update() 更新错误, 数据 ItemID:{0} 能匹配到, 但是物品类型不一样. ", bluePrintDB.ItemID)); // 出现错误, 更新失败 return(false); } // 若是蓝图基本属性匹配不上 if (bluePrintDB.TimeEfficiency != esiOwnedBluePrints[i].TimeEfficiency || bluePrintDB.MaterialEfficiency != esiOwnedBluePrints[i].MaterialEfficiency || bluePrintDB.Quantity != esiOwnedBluePrints[i].Quantity || bluePrintDB.Runs != esiOwnedBluePrints[i].Runs) { // 若是同一个物品, 但是物品基本属性变了, 理论上在用户确认后更新物品基本属性即可, 但必须尽量排除, 因为属于可以完全避免出现的情况 // TODO: Z 完善工业线程控制后需取消注释 OwnedBluePrints.Update() -> 蓝图基本属性不同时弹窗提示 // MessageBox.Show(string.Format("蓝图:{0}, ItemID:{1} 的数据库基本数据与ESI匹配不上.", bluePrintDB.BluePrints.invTypes.Name, bluePrintDB.ItemID), "注意"); continue; } // 用 ESI 蓝图的数据更新数据库蓝图的一般数据 bluePrintDB._updateGeneralPropertyFromESIData(esiOwnedBluePrints[i]); // 统一设置数据更新时间 bluePrintDB.UpdateTime = updateTime; // 更新完数据库蓝图数据后将数据从 ESI 蓝图列表中对应的对象删除 esiOwnedBluePrints.Remove(esiOwnedBluePrints[i]); } // 若临时表中没有元素, 且数据库中的数据都已更新过, 则更新完成 if (esiOwnedBluePrints.Count == 0 && dbOwnedBluePrints.Where(p => p.UpdateTime != updateTime).Count() == 0) { return(true); } else { // 否则, 则必须进行用户确认 // 新建用户确认窗体 ESIAndDBConfirm winConfirm = new ESIAndDBConfirm(); // 表头赋值 winConfirm.DBListViewColumnHeaders = ListViewColumnHeaders(); winConfirm.ESIListViewColumnHeaders = ListViewColumnHeaders(); // 获取数据库数据中和 ESI 数据匹配不上, 无法更新的数据 var dbUnMatchBluePrints = dbOwnedBluePrints.Where(p => p.UpdateTime != updateTime); // 若有, 则添加到确认窗体的显示列表中 if (dbUnMatchBluePrints.Count() != 0) { foreach (var bp in dbUnMatchBluePrints) { winConfirm.DBListViewItemCollection.Add(bp.ListViewItem()); } } // 若 ESI 数据中还有没更新到数据库的, 也显示到确认窗体中 if (esiOwnedBluePrints.Count != 0) { foreach (var bp in esiOwnedBluePrints) { winConfirm.ESIListViewItemCollection.Add(bp.ListViewItem()); } } // 确认窗体载入数据 winConfirm.LoadListViewData(); // 若用户确认变更 if (winConfirm.ShowDialog() == DialogResult.OK) { // 关掉窗体 winConfirm.Close(); // 先遍历 ESI 数据将 ItemID 相同得数据更新到数据库 for (int i = esiOwnedBluePrints.Count - 1; i >= 0; i--) { // 查找数据库中对应 ItemID 的蓝图数据 (p.UpdateTime != updateTime 条件筛选掉已更新的数据) bluePrintDB = dbOwnedBluePrints.SingleOrDefault(p => p.UpdateTime != updateTime && p.ItemID == esiOwnedBluePrints[i].ItemID); if (bluePrintDB != null) { // 更新数据库对象除了 ItemID 和 BluePrintID 以外的所有字段 bluePrintDB._updateAllPropertyFromESIData(esiOwnedBluePrints[i]); bluePrintDB.UpdateTime = updateTime; // 更新完数据库蓝图数据后将数据从 ESI 蓝图列表中对应的对象删除 esiOwnedBluePrints.RemoveAt(i); } } // 若此时数据库中还有未更新到的蓝图数据, 则说明游戏中是没有该数据了, 要从数据库中删除 dbUnMatchBluePrints = dbOwnedBluePrints.Where(p => p.UpdateTime != updateTime); if (dbUnMatchBluePrints.Count() != 0) { dc.OwnedBluePrints.DeleteAllOnSubmit(dbUnMatchBluePrints); } // 若 ESI 数据还没有匹配完, 剩下的就直接插入了 if (esiOwnedBluePrints.Count() != 0) { dc.OwnedBluePrints.InsertAllOnSubmit(esiOwnedBluePrints); } dc.SubmitChanges(); return(true); } return(false); } }
/// <summary> /// 清空并重新获取角色的技能数据(提交数据库) /// </summary> /// <returns>是否更新成功</returns> public bool UpdateSkills() { // 通过ESI获取角色的技能信息 ESICharacterSkillList csl = ESI.GetCharacterSkillList(CharacterID, GetAccessToken()); if (csl == null) { return(false); } DCEVEDataContext dc = new DCEVEDataContext(); // 清空原有技能数据 dc.CharacterSkills.DeleteAllOnSubmit(CharacterSkills); dc.SubmitChanges(); var targetSkillID = dc.invTypes.Where(p => CONST.TargetSkillsGroupID.Contains(p.groupID)).Select(p => p.typeID); CharacterSkills skill; // 只提取有用的技能数据且处理角色数据 foreach (var s in csl.SkillList) { // 若技能 ID 不在要存储的技能ID队列里面, 则跳过 if (!targetSkillID.Contains(s.SkillID)) { continue; } // 若是要存储的技能, 则创建对应的数据记录 skill = new CharacterSkills() { CharacterID = CharacterID, SkillID = s.SkillID, Level = s.TrainedSkillLevel }; CharacterSkills.Add(skill); } dc.SubmitChanges(); // 分析角色能力 // 制造能力 ManuCapability = (from s in dc.industryActivitySkills join c in dc.CharacterSkills on s.skillID equals c.SkillID where c.CharacterID == CharacterID && s.activityID == CONST.ManufactActivityID && c.Level >= s.level select s.skillID).Count(); NumManufactureLine = 1; var targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 3387); // 批量生产学 if (targetSkill != null) { NumManufactureLine += targetSkill.Level; } targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 24625); // 高级量产技术 if (targetSkill != null) { NumManufactureLine += targetSkill.Level; } // 科研能力 ReseCapability = (from s in dc.industryActivitySkills join c in dc.CharacterSkills on s.skillID equals c.SkillID where c.CharacterID == CharacterID && CONST.ResearchActivitiesID.Contains(s.activityID) && c.Level >= s.level select s.skillID).Count(); NumResearchLine = 1; targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 3406); // 实验室运作理论 if (targetSkill != null) { NumResearchLine += targetSkill.Level; } targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 24624); // 高级实验室运作理论 if (targetSkill != null) { NumResearchLine += targetSkill.Level; } // 市场订单量 if (Market) { NumMarketOrder = 5; targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 3443); // 贸易学 if (targetSkill != null) { NumMarketOrder += targetSkill.Level * 4; } targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 3444); // 零售技巧 if (targetSkill != null) { NumMarketOrder += targetSkill.Level * 8; } targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 16596); // 批发技巧 if (targetSkill != null) { NumMarketOrder += targetSkill.Level * 16; } targetSkill = CharacterSkills.SingleOrDefault(p => p.SkillID == 18580); // 商业巨头 if (targetSkill != null) { NumMarketOrder += targetSkill.Level * 32; } } dc.SubmitChanges(); return(true); }