Files
zszq-trs/YLErpDAL/Modules/StructureModule/StructureService.cs
T
2024-05-09 14:06:26 +08:00

250 lines
11 KiB
C#

using YLErp.Enums;
using YLErp.Modules.ApiModule;
namespace YLErp.Modules.StructureModule
{
/// <summary>
/// 自定义结构服务
/// </summary>
public class StructureService : YLBaseService
{
public StructureService(OptUserInfo userInfo) : base(userInfo)
{
}
/// <summary>
/// 获取结构名称和字段信息
/// </summary>
/// <param name="range"></param>
/// <returns></returns>
public Dictionary<string, List<Structure_Details>> 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());
}
/// <summary>
/// 查询自定义结构信息
/// </summary>
/// <param name="range">交易类型</param>
/// <returns></returns>
public List<Structure_Info> QueryStructureInfo(StructureRangeEnum range)
{
return DbContext.Structure_Info.Where(O => O.Range == range).OrderBy(O => O.SortIndex).ToList();
}
/// <summary>
/// 查询指定自定义结构的字段信息
/// </summary>
/// <param name="structureId">自定义结构Id</param>
/// <returns></returns>
public List<Structure_Details> QueryStructure_Details(int structureId)
{
return DbContext.Structure_Details.Where(O => O.StructureId == structureId).OrderBy(O => O.SortIndex).ToList();
}
/// <summary>
/// 查询指定自定义结构的字段信息
/// </summary>
/// <param name="structureId">自定义结构Id</param>
/// <returns></returns>
public List<Structure_Details> 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();
}
/// <summary>
/// 保存自定义结构信息
/// </summary>
/// <param name="range">交易类型</param>
/// <param name="infos">自定义结构信息</param>
public void SaveStructureInfo(StructureRangeEnum range, List<Structure_Info> 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<Structure_Details>(), 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();
}
/// <summary>
/// 保存指定自定义结构的字段信息
/// </summary>
/// <param name="structureId">自定义结构Id</param>
/// <param name="objs">字段信息</param>
public void SaveStructureDetails(int structureId, List<Structure_Details> 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, "调用外部接口通知自定义结构更新失败");
}
}
}
/// <summary>
/// 删除自定义结构信息
/// <para>会同时删除结构信息对应的字段信息</para>
/// </summary>
/// <param name="id">自定义结构Id</param>
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<Structure_Details>(), 3);
}
catch (Exception ex)
{
LogFactory.GetLogger("SaveStructureInfo").Error(ex, "调用外部接口通知自定义结构删除失败");
}
}
DbContext.SaveChanges();
}
/// <summary>
/// 删除自定义结构字段信息
/// </summary>
/// <param name="id">自定义结构字段信息Id</param>
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, "调用外部接口通知自定义结构更新失败");
}
}
}
}
}
}