using Kingdee.CDP.WebApi.SDK; using MES.Service.DB; using MES.Service.Dto.webApi; using MES.Service.Modes; using SqlSugar; using System.Text; namespace MES.Service.service.Kingdee; public class ErpKcManager : Repository { public bool QueryStocks(Inventory inventory) { List erpKc = GetErpInventory(inventory); // 检查返回结果是否为空 if (erpKc == null || erpKc.Count == 0) { throw new NotImplementedException("返回结果为空"); } else { var baseObjects = MapErpCABtoWomcab(erpKc); return UseTransaction(db => { return SaveData(db, baseObjects) ? 1 : 0; }) > 0; } } #region 1.获取即时库存 public List GetErpInventory(Inventory inventory) { //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。 //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。 //读取配置,初始化SDK K3CloudApi client = new K3CloudApi(); //用于记录结果 StringBuilder Info = new StringBuilder(); //业务对象标识 string formId = "STK_Inventory"; DateTime dt = DateTime.Now; //查询字段集合,即返回哪些数据,不能为空,根据不同业务单据填写不同的字段名,以下仅为示例 //string fieldKeys = "FCode,FFileId,FRelevantObject"; //string FilterString = "FID='-2146304'"; string fieldKeys = "FMaterialId.FNumber,FMtoNo,FStockId.FNumber,FLot.FNumber,FStockUnitId.FNumber,FBaseUnitId.FNumber,FStockStatusId.FName,FBASEQTY,FMaterialid.FSTOREURNOM,FMaterialid.FSTOREURNUM,FStockOrgId.FNumber"; string FilterString = string.Format(@"FMaterialId.FNumber like '%{0}%' and FStockId.FNumber like '%{1}%' and FBaseQty>0 and FStockOrgId.FNumber like'%{2}%'", inventory.ItemNo,inventory.DepotCode, inventory.StockOrgNumber); string OrderString = ""; int TopRowCount = 0; int StartRow = 0; int Limit = 0; var param = new QueryParam() { FormId = formId, FieldKeys = fieldKeys, FilterString = FilterString, OrderString = OrderString, TopRowCount = TopRowCount, StartRow = StartRow, Limit = Limit }; //调用接口 var result = client.ExecuteBillQuery(param.ToJson()); return result.Select(s => { var entity = new ErpKc { FMaterialId = s[0]?.ToString(), FMtoNo = s[1]?.ToString(), FStockId = s[2]?.ToString(), FLot = s[3]?.ToString(), FStockUnitId = s[4]?.ToString(), FBaseUnitId = s[5]?.ToString(), FStockStatusId = s[6]?.ToString(), FBASEQTY = s[7]?.ToString() , FSTOREURNOM = s[8]?.ToString(), FSTOREURNUM = s[9]?.ToString(), // FOwnerId = s[10]?.ToString() FStockOrgId = s[10]?.ToString() }; return entity; }).ToList(); } #endregion private List MapErpCABtoWomcab(List dtoList) { var ErpMesKcList = new List(); foreach (var dto in dtoList) { var kc = new ErpMesKc { FNumber = dto.FMaterialId, // FQty = Convert.ToDecimal(dto.FBASEQTY), FQty = SafeParseDecimal(dto.FBASEQTY), FBaseUnit=dto.FBaseUnitId, FStockUnit=dto.FStockUnitId, FStockNumber=dto.FStockId, CreateDate=DateTime.Now, FBatchno=dto.FLot, FMtono=dto.FMtoNo, FStockStatus=dto.FStockStatusId, FStoreUrnom= Convert.ToDecimal(dto.FSTOREURNOM), FStoreUrnum= Convert.ToDecimal(dto.FSTOREURNUM), //FOwnerId=dto.FOwnerId, FStockOrgId = dto.FStockOrgId, }; ErpMesKcList.Add(kc); } return ErpMesKcList; } private decimal SafeParseDecimal(string? input) { if (string.IsNullOrWhiteSpace(input)) return 0; if (decimal.TryParse( input, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var result)) return result; return 0; // 跳过错误字段,给默认值 } // 插入或更新数据的方法 private bool SaveData(SqlSugarScope db, List kcc) { var save = base.InsertRange(kcc); if (save) return true; throw new NotImplementedException("插入失败"); } }