250 lines
11 KiB
C#
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, "调用外部接口通知自定义结构更新失败");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|