using AngleSharp.Dom;
using MES.Service.DB;
using MES.Service.Dto.webApi;
using MES.Service.Modes;
using SharpCompress.Common;
using SqlSugar;
namespace MES.Service.service.BasicData;
///
/// 物料信息
///
public class MesItemsManager : Repository
{
public bool Save(ErpItems item)
{
var entity = GetMesItems(item);
return UseTransaction(db =>
{
switch (item.Type)
{
case "0":
if (UpdateItemStatus(db, entity.Id, "A"))
return 1;
break;
case "1":
if (UpdateItemStatus(db, entity.Id, "B"))
return 1;
break;
case "3":
if (DeleteItem(db, entity.Id))
return 1;
break;
case "2":
case "4":
case "5":
if (InsertOrUpdate(db, entity))
return 1;
break;
default:
throw new ArgumentNullException(
$"type没有{item.Type}这个类型的参数");
}
throw new NotImplementedException("操作失败");
}) > 0;
}
public bool SaveList(List items)
{
var list = items.Select(GetMesItems).ToList();
var groupBy = list.GroupBy(s => s.Type)
.ToDictionary(g => g.Key, g => g.ToList());
return UseTransaction(db =>
{
foreach (var itemGroup in groupBy)
switch (itemGroup.Key)
{
case "0":
if (!UpdateItemStatusBatch(db, itemGroup.Value, "A"))
throw new NotImplementedException("启用失败");
break;
case "1":
if (!UpdateItemStatusBatch(db, itemGroup.Value, "B"))
throw new NotImplementedException("禁用失败");
break;
case "3":
if (!DeleteItemBatch(db, itemGroup.Value))
throw new NotImplementedException("删除失败");
break;
case "2":
case "4":
if (!InsertOrUpdateBatch(db, itemGroup.Value))
throw new NotImplementedException("同步失败");
break;
default:
throw new ArgumentNullException(
$"type没有{itemGroup.Key}这个类型的参数");
}
return 1;
}) > 0;
}
private bool UpdateItemStatus(SqlSugarScope db, decimal itemId,
string status)
{
var result = db.Updateable()
.SetColumns(s => s.Fforbidstatus == status)
.Where(s => s.Id == itemId).ExecuteCommand();
if (result > 0)
return true;
throw new NotImplementedException(status == "A" ? "启用失败" : "禁用失败");
}
private bool InsertItem(SqlSugarScope db, MesItems entity)
{
var insert = db.Insertable(entity).ExecuteCommand();
if (insert > 0)
return true;
throw new NotImplementedException("插入失败");
}
private bool DeleteItem(SqlSugarScope db, decimal itemId)
{
var deleteById = db.Deleteable()
.Where(s => s.Id == itemId).ExecuteCommand();
if (deleteById > 0)
return true;
throw new NotImplementedException("删除失败");
}
private MesItems GetMesItems(ErpItems item)
{
// 查找是否已存在相同客户编码的记录。ID、create_date
var existingCustomer = Db.Queryable()
.Where(s => s.ItemNo == item.FNumber)
.First();
var entity = new MesItems
{
// 如果存在,使用现有的ID,后续将删除后重新插入
// 如果不存在,设为0,InsertOrUpdate方法将生成新ID
Id = existingCustomer?.Id ?? 0,
EItemId = existingCustomer?.Id ?? 0,
ItemId = existingCustomer?.Id ?? 0,
Type = item.Type,
ItemNo = item.FNumber,
ItemName = item.FName,
ItemModel = item.FSpecification,
ItemUnit = item.FBaseUnitId,//物料基本单位编码转ID
Lowlimit = Convert.ToDouble(item.FSafeStock),
Highlimit = Convert.ToDouble(item.FMaxStock),
PrdPack = Convert.ToDouble(item.FMinPackCount),
DepotCode = item.FStockId,
Fmaterialgroup = item.FMaterialGroup,
Remarks = item.FDescription,
Ffinishreceiptoverrate =
Convert.ToDecimal(item.FFinishReceiptOverRate),
//发料方式
Fissuetype = item.FIssueType switch
{
"1" => "逐批领料",
"2" => "自动扣料",
_ => item.FIssueType
},
//Fissuetype = item.FIssueType,
//批号管理
Fisbatchmanage = item.FIsBatchManage switch
{
var v when string.Equals(v, "N", StringComparison.OrdinalIgnoreCase) => 0,
var v when string.Equals(v, "Y", StringComparison.OrdinalIgnoreCase) => 1,
var v when string.Equals(v, "W", StringComparison.OrdinalIgnoreCase) => 2,
var v when string.Equals(v, "T", StringComparison.OrdinalIgnoreCase) => 3,
_ => int.TryParse(item.FIsBatchManage, out var val) ? val : 0
},
Fpurchaserid = item.FPurchaserId,
Fpurchaseunitid = item.FPurchaseUnitId,
Storeunit = item.FStoreUnitID,
Saleunit = item.FSaleUnitId,
//Fforbidstatus = item.FForbidStatus,
MaterialProperti = item.FErpClsID,
ProductionWorkshop = item.FWorkShopId,
ProduceUnit = item.FPRODUCEUNITID,
SubconUnit = item.FSUBCONUNITID,
//FSubsidiary = item.FUseOrgId,
//Fumbrella = item.FCreateOrgId,
LastupdateDate = DateTime.Now,
// 如果存在,使用现有的CreateDate,后续将删除后重新插入
// 如果不存在,设为当前时间
CreateDate = existingCustomer?.CreateDate ?? DateTime.Now,
MnemonicCode = item.FMnemonicCode,
Company = "1000",
Factory = "1000",
InspectionMethod= item.Inspectionmethod,
ExpirationDate= item.Expirationdate,
ReviewPeriod= item.Reviewperiod,
LeadDays= item.FLeadDays,
Remark5 = item.FRemark5,
FSubsidiary = string.IsNullOrEmpty(item.FUseOrgId) ? "1" : item.FUseOrgId,
Fumbrella = string.IsNullOrEmpty(item.FCreateOrgId) ? "1" : item.FCreateOrgId,
};
//物料基本单位编码转ID,ItemUnit = item.FBaseUnitId
var entityItemUnit = Db.Queryable()
.Where(x => x.Fnumber == item.FBaseUnitId)
.Select(x => x.Id.ToString())
.First();
if (!string.IsNullOrWhiteSpace(entityItemUnit))
{
entity.ItemUnit = entityItemUnit;
}
else if (!string.IsNullOrWhiteSpace(item.FBaseUnitId))
{
entity.ItemUnit = item.FBaseUnitId;
}
else
{
entity.ItemUnit = "0";
}
//物料销售单位编码转ID,Saleunit = item.FSaleUnitId
var entitySaleunit = Db.Queryable()
.Where(x => x.Fnumber == item.FSaleUnitId)
.Select(x => x.Id.ToString())
.First();
if (!string.IsNullOrWhiteSpace(entitySaleunit))
{
entity.Saleunit = entitySaleunit;
}
else if (!string.IsNullOrWhiteSpace(item.FSaleUnitId))
{
entity.Saleunit = item.FSaleUnitId;
}
else
{
entity.Saleunit = "0";
}
//物料库房单位编码转ID,Storeunit = item.FStoreUnitID
var entityStoreunit = Db.Queryable()
.Where(x => x.Fnumber == item.FStoreUnitID)
.Select(x => x.Id.ToString())
.First();
if (!string.IsNullOrWhiteSpace(entityStoreunit))
{
entity.Storeunit = entityStoreunit;
}
else if (!string.IsNullOrWhiteSpace(item.FStoreUnitID))
{
entity.Storeunit = item.FStoreUnitID;
}
else
{
entity.Storeunit = "0";
}
//物料采购单位编码转ID,Fpurchaseunitid = item.FPurchaseUnitId
var entityFpurchaseunitid = Db.Queryable()
.Where(x => x.Fnumber == item.FPurchaseUnitId)
.Select(x => x.Id.ToString())
.First();
if (!string.IsNullOrWhiteSpace(entityFpurchaseunitid))
{
entity.Fpurchaseunitid = entityFpurchaseunitid;
}
else if (!string.IsNullOrWhiteSpace(item.FPurchaseUnitId))
{
entity.Fpurchaseunitid = item.FPurchaseUnitId;
}
else
{
entity.Fpurchaseunitid = "0";
}
//物料生产单位编码转ID,ProduceUnit = item.FPRODUCEUNITID
var entityProduceUnit = Db.Queryable()
.Where(x => x.Fnumber == item.FPRODUCEUNITID)
.Select(x => x.Id.ToString())
.First();
if (!string.IsNullOrWhiteSpace(entityProduceUnit))
{
entity.ProduceUnit = entityProduceUnit;
}
else if (!string.IsNullOrWhiteSpace(item.FPRODUCEUNITID))
{
entity.ProduceUnit = item.FPRODUCEUNITID;
}
else
{
entity.ProduceUnit = "0";
}
//物料委外单位编码转ID,SubconUnit = item.FSUBCONUNITID
var entitySubconUnit = Db.Queryable()
.Where(x => x.Fnumber == item.FSUBCONUNITID)
.Select(x => x.Id.ToString())
.First();
if (!string.IsNullOrWhiteSpace(entitySubconUnit))
{
entity.SubconUnit = entitySubconUnit;
}
else if (!string.IsNullOrWhiteSpace(item.FSUBCONUNITID))
{
entity.SubconUnit = item.FSUBCONUNITID;
}
else
{
entity.SubconUnit = "0";
}
//默认仓库编码转ID,DepotCode = item.FStockId,
var entityDepotCode = Db.Queryable()
.Where(x => x.DepotCode == item.FStockId)
.Select(x => x.DepotId.ToString())
.First();
if (!string.IsNullOrWhiteSpace(entityDepotCode))
{
entity.DepotCode = entityDepotCode;
}
else if (!string.IsNullOrWhiteSpace(item.FStockId))
{
entity.DepotCode = item.FStockId;
}
else
{
entity.SubconUnit = "0";
}
// ERP: Y=未禁用, N=禁用
// MES: A=未禁用, B=禁用
if (string.IsNullOrEmpty(item.FForbidStatus))
{
entity.Fforbidstatus = "A";
}
else
{
//我期望的值是A=启用,B=禁用
//实际给我的值是Y或N,我希望为我转换从A和B的方式
entity.Fforbidstatus = item.FForbidStatus == "N" ? "B" : "A";
}
return entity;
}
///
/// 生成新的ID,确保不重复
///
private decimal GenerateNewId()
{
// 处理空表的情况,从1开始
var maxId = Db.Queryable().Max(x => (decimal?)x.Id) ?? 0;
var newId = maxId + 1;
// 双重检查,确保生成的ID不存在
while (Db.Queryable().Where(x => x.Id == newId).Any())
{
newId++;
}
return newId;
}
///
/// 启用与禁用"Y"、"N" 转换为 "A"、"B"
///
///
///
///
///
///
private bool UpdateItemStatusBatch(SqlSugarScope db,List itemList, string inputStatus)
{
var status = (inputStatus == "Y") ? "A" : (inputStatus == "N") ? "B" : inputStatus;
var ids = itemList.Select(it => it.Id).ToArray();
var result = db.Updateable()
.SetColumns(s => s.Fforbidstatus == status)
.Where(s => ids.Contains(s.Id)).ExecuteCommand();
if (result > 0)
return true;
throw new NotImplementedException(status == "A" ? "启用失败" : "禁用失败");
}
private bool InsertItemBatch(SqlSugarScope db, List itemList)
{
var insertRange = db.Insertable(itemList).ExecuteCommand();
if (insertRange > 0)
return true;
throw new NotImplementedException("插入失败");
}
private bool DeleteItemBatch(SqlSugarScope db, List itemList)
{
var ids = itemList.Select(it => it.Id).ToArray();
var deleteByIds = db.Deleteable()
.Where(s => ids.Contains(s.Id)).ExecuteCommand();
if (deleteByIds > 0)
return true;
throw new NotImplementedException("删除失败");
}
///
/// 同步物料信息new_0/4
///
///
///
///
private bool InsertOrUpdate(SqlSugarScope db, MesItems entity)
{
if (entity.Id == 0)
{
// 新增情况:生成新ID并插入
var newId = GenerateNewId();
entity.Id = newId;
entity.EItemId = newId;
entity.ItemId = newId;
return db.Insertable(entity).ExecuteCommand() > 0;
}
else
{
// 更新情况:删除后重新插入,保持原有ID
var originalId = entity.Id;
// 先删除原记录(如果存在)
db.Deleteable().Where(s => s.Id == originalId).ExecuteCommand();
// 重新插入,保持原有ID
entity.Id = originalId;
entity.EItemId = originalId;
entity.ItemId = originalId;
return db.Insertable(entity).ExecuteCommand() > 0;
}
}
///
/// 同步物料信息old_0/4
///
///
///
///
//private bool InsertOrUpdate(SqlSugarScope db, MesItems entity)
//{
// db.Deleteable().Where(s => s.Id == entity.Id)
// .ExecuteCommand();
// var insert = db.Insertable(entity).ExecuteCommand();
// return insert > 0;
//}
private bool InsertOrUpdateBatch(SqlSugarScope db, List itemList)
{
return itemList.All(entity => InsertOrUpdate(db, entity));
}
}