using YLErp.Enums; using YLErp.Modules.ApiModule; namespace YLErp.Modules.StructureModule { /// /// 自定义结构服务 /// public class StructureService : YLBaseService { public StructureService(OptUserInfo userInfo) : base(userInfo) { } /// /// 获取结构名称和字段信息 /// /// /// public Dictionary> QueryStructureMap(StructureRangeEnum range) { var query = from info in DbContext.Structure_Info join detail in DbContext.Structure_Details on info.id equals detail.StructureId into db from detail in db.DefaultIfEmpty() where info.Range == range orderby info.SortIndex ascending select new { info.StructureName, detail }; var list = query.AsEnumerable(); return list.GroupBy(O => O.StructureName).ToDictionary(K => K.Key, V => V.Select(O => O.detail).Where(n => n != null).OrderBy(n => n.SortIndex).ToList()); } /// /// 查询自定义结构信息 /// /// 交易类型 /// public List QueryStructureInfo(StructureRangeEnum range) { return DbContext.Structure_Info.Where(O => O.Range == range).OrderBy(O => O.SortIndex).ToList(); } /// /// 查询指定自定义结构的字段信息 /// /// 自定义结构Id /// public List QueryStructure_Details(int structureId) { return DbContext.Structure_Details.Where(O => O.StructureId == structureId).OrderBy(O => O.SortIndex).ToList(); } /// /// 查询指定自定义结构的字段信息 /// /// 自定义结构Id /// public List QueryStructure_Details(string structureName) { var query = from info in DbContext.Structure_Info join detail in DbContext.Structure_Details on info.id equals detail.StructureId where info.StructureName == structureName orderby detail.SortIndex select detail; return query.ToList(); } /// /// 保存自定义结构信息 /// /// 交易类型 /// 自定义结构信息 public void SaveStructureInfo(StructureRangeEnum range, List infos) { var count = infos.Select(O => O.StructureName).Distinct().Count(); if (infos.Any(O => O.StructureName == "气囊结构")) { throw new ServiceException("气囊结构为系统内置类型,不允许添加!"); } if (range == StructureRangeEnum.EXTEND_INFO && infos.Any(O => O.StructureName == "自定义")) { throw new ServiceException("自定义要素中\"自定义\"为保留名称,不可使用"); } if (count != infos.Count) { throw new ServiceException("不应出现重复类型名!"); } var list = DbContext.Structure_Info.Where(O => O.Range == range).ToList(); if (list.Any(O => infos.Any(B => O.StructureName == B.StructureName && O.id != B.id))) { throw new ServiceException("不应出现重复类型名!"); } foreach (var item in infos) { var obj = list.FirstOrDefault(O => O.id == item.id); if (obj == null) { obj = new Structure_Info() { Range = range, SortIndex = item.SortIndex }; DbContext.Structure_Info.Add(obj); } if (PS.Config.ErpElement.ExternalAPIForCustomCalcEnable && range == StructureRangeEnum.CUSTOM_TRADE && obj.StructureName != item.StructureName) { var details = DbContext.Structure_Details.Where(O => O.StructureId == item.id).OrderBy(O => O.SortIndex).ToList(); try {//通知外部接口,暂时不考虑访问失败的问题; if (obj.id > 0) { StructureInfoApiHelper.ChangeEvent(obj.StructureName, new List(), 3); } StructureInfoApiHelper.ChangeEvent(item.StructureName, details, 1); } catch (Exception ex) { LogFactory.GetLogger("SaveStructureInfo").Error(ex, "调用外部接口通知自定义结构变更失败"); } } obj.StructureName = item.StructureName; obj.StructureTypeSm = item.StructureTypeSm; obj.OptId = UserId; obj.OptDate = DateTime.Now; } DbContext.SaveChanges(); } /// /// 保存指定自定义结构的字段信息 /// /// 自定义结构Id /// 字段信息 public void SaveStructureDetails(int structureId, List objs) { var list = DbContext.Structure_Details.Where(O => O.StructureId == structureId).ToList(); foreach (var item in objs) { var obj = list.FirstOrDefault(O => O.id == item.id); if (obj == null) { obj = new Structure_Details() { StructureId = item.StructureId, SortIndex = item.SortIndex }; DbContext.Structure_Details.Add(obj); } if (list.Any(O => O.id != item.id && O.ColumnName == item.ColumnName)) { throw new ServiceException("不应出现重复的字段名!"); } if (!string.IsNullOrWhiteSpace(item.FieldNameSm) && list.Any(O => O.id != item.id && O.FieldNameSm == item.FieldNameSm)) { throw new ServiceException("报送字段已存在,不应重复被设置!"); } obj.ColumnName = item.ColumnName ?? ""; obj.ColumnDefaultValue = item.ColumnDefaultValue ?? ""; obj.ColumnOptions = item.ColumnOptions ?? ""; obj.ColumnType = item.ColumnType; obj.FieldNameSm = item.FieldNameSm ?? ""; obj.OptId = UserId; obj.OptDate = DateTime.Now; } DbContext.SaveChanges(); if (PS.Config.ErpElement.ExternalAPIForCustomCalcEnable) { try {//通知外部接口,暂时不考虑访问失败的问题; var structureInfo = DbContext.Structure_Info.Where(O => O.id == structureId).First(); if (structureInfo.Range == StructureRangeEnum.CUSTOM_TRADE) { var details = DbContext.Structure_Details.Where(O => O.StructureId == structureId).OrderBy(O => O.SortIndex).ToList(); StructureInfoApiHelper.ChangeEvent(structureInfo.StructureName, details, 2); } } catch (Exception ex) { LogFactory.GetLogger("SaveStructureDetails").Error(ex, "调用外部接口通知自定义结构更新失败"); } } } /// /// 删除自定义结构信息 /// 会同时删除结构信息对应的字段信息 /// /// 自定义结构Id public void DeleteStructureInfo(int id) { var info = DbContext.Structure_Info.Where(O => O.id == id).FirstOrDefault(); if (info != null) { DbContext.Structure_Info.Remove(info); } var details = DbContext.Structure_Details.Where(O => O.StructureId == id); if (details.Any()) { DbContext.Structure_Details.RemoveRange(details); } if (PS.Config.ErpElement.ExternalAPIForCustomCalcEnable && info != null && info.Range == StructureRangeEnum.CUSTOM_TRADE) { try {//通知外部接口,暂时不考虑访问失败的问题; StructureInfoApiHelper.ChangeEvent(info.StructureName, new List(), 3); } catch (Exception ex) { LogFactory.GetLogger("SaveStructureInfo").Error(ex, "调用外部接口通知自定义结构删除失败"); } } DbContext.SaveChanges(); } /// /// 删除自定义结构字段信息 /// /// 自定义结构字段信息Id public void DeleteStructureDetails(int id) { var detail = DbContext.Structure_Details.Where(O => O.id == id).FirstOrDefault(); if (detail != null) { DbContext.Structure_Details.Remove(detail); DbContext.SaveChanges(); if (PS.Config.ErpElement.ExternalAPIForCustomCalcEnable) { try {//通知外部接口,暂时不考虑访问失败的问题; var structureInfo = DbContext.Structure_Info.Where(O => O.id == detail.StructureId).First(); if (structureInfo.Range == StructureRangeEnum.CUSTOM_TRADE) { var details = DbContext.Structure_Details.Where(O => O.StructureId == structureInfo.id).OrderBy(O => O.SortIndex).ToList(); StructureInfoApiHelper.ChangeEvent(structureInfo.StructureName, details, 2); } } catch (Exception ex) { LogFactory.GetLogger("SaveStructureDetails").Error(ex, "调用外部接口通知自定义结构更新失败"); } } } } } }