VistarStarDataIntegration/admin.net.pro/Admin.NET/Vistar.Application/Service/MaterialManagement/ProductManagementService.cs

1394 lines
57 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Admin.NET.Core;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel;
using Vistar.Application.Const;
using Vistar.Application.Entity;
using Vistar.Application.Service.MaterialManagement.Dto;
using Admin.NET.Core.Service;
using Vistar.Application.Util;
using Vistar.Application.SapService.Dto;
using Vistar.Application.Common;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using static Elastic.Clients.Elasticsearch.JoinField;
using Qiniu.CDN;
using SqlSugar;
using Microsoft.Extensions.DependencyInjection;
using System.Text.RegularExpressions;
namespace Vistar.Application.Service.MaterialManagement;
/// <summary>
/// 产品管理服务
/// </summary>
[ApiDescriptionSettings(ApplicationConst.GroupName, Name = "ProductManagement", Order = 100)]
public class ProductManagementService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<Obj110> _obj110Rep;
private readonly SqlSugarRepository<Obj137> _obj137Rep;
private readonly SqlSugarRepository<Configurations> _configurationsRep;
private readonly SysConfigService _sysConfigService;
private readonly SqlSugarRepository<ConfigurationData> _configurationDataRep;
public SapService.SapService _sapService;
public SqlSugarRepository<Obj118> _obj118Rep;
public Common.DataValidationService _dataValidationService;
public SqlSugarRepository<Obj122> _obj122Rep;
public SqlSugarRepository<Obj121> _obj121Rep;
private readonly IServiceScopeFactory _scopeFactory;
public ProductManagementService(
SqlSugarRepository<Obj110> obj110Rep,
SqlSugarRepository<Obj137> obj137Rep,
SqlSugarRepository<Configurations> configurationsRep,
SysConfigService sysConfigService,
SqlSugarRepository<ConfigurationData> configurationDataRep,
SapService.SapService sapService,
SqlSugarRepository<Obj118> obj118Rep,
DataValidationService dataValidationService,
SqlSugarRepository<Obj122> obj122Rep,
SqlSugarRepository<Obj121> obj121Rep,
IServiceScopeFactory scopeFactory
)
{
_obj110Rep = obj110Rep;
_configurationsRep = configurationsRep;
_sysConfigService = sysConfigService;
_configurationDataRep = configurationDataRep;
_sapService = sapService;
_obj118Rep = obj118Rep;
_dataValidationService = dataValidationService;
_obj122Rep = obj122Rep;
_obj121Rep = obj121Rep;
_scopeFactory = scopeFactory;
_obj137Rep = obj137Rep;
}
/// <summary>
/// 分页查询产品管理
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "page", Description = "分页查询", Order = 1000), HttpPost]
[DisplayName("分页查询产品管理")]
//[Authorize(AuthenticationSchemes = SignatureAuthenticationDefaults.AuthenticationScheme)]
public async Task<SqlSugarPagedList<ProductManagementOutput>> Page(PageProductManagementInput input)
{
var query = await _obj110Rep.AsQueryable()
.Where(x => (x.CheckedStatus == 0 || x.CheckedStatus == 1) && x.fld005324 == "发布" && x.deleted == false && x.IsLatestVersion == true)
.WhereIF(!string.IsNullOrWhiteSpace(input._System_objNBS), u => u._System_objNBS.Contains(input._System_objNBS.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.fld004484), u => u.fld004484.Contains(input.fld004484.Trim()))
.WhereIF(input.fld004494Range != null && input.fld004494Range.Length == 2, u => u.fld004494 >= input.fld004494Range[0] && u.fld004494 <= input.fld004494Range[1])
.Select<ProductManagementOutput>()
.ToPagedListAsync(input.Page, input.PageSize);
return query;
}
/// <summary>
/// 产品管理-同步到 SAP
/// </summary>
/// <returns></returns>
[ApiDescriptionSettings(Name = "syncToSAP"), HttpPost]
[DisplayName("产品管理-同步到 SAP")]
public async Task<SapOutput> SyncToSAP(ProductManagementBaseInput input)
{
const string lengthError = "物料描述长度大于40请检查";
// 验证物料描述长度
if (input.fld004484.Length > 40)
{
await _obj110Rep.AsUpdateable()
.SetColumns(it => new Obj110
{
fld004629 = DateTime.Now,
fld004312 = "N",
fld004313 = lengthError,
fld004311 = "失败"
})
.Where(it => it.idRecord == input.idRecord)
.ExecuteCommandAsync().ConfigureAwait(false);
return new SapOutput
{
code = "失败",
msg = lengthError,
result = lengthError
};
}
//获取时间戳精确到毫秒sap要求每次调用生成不重复guid
string millisecondTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
Random random = new Random();
// 生成1000到9999之间的随机数
string randomNumber = random.Next(1000, 10000).ToString();
millisecondTimestamp = millisecondTimestamp + randomNumber;
var sapMaterialInput = new SapMaterialInput()
{
Reqkeyid = "",
Businessid = "",
Messageid = "",
Sndprn = "PLM",
Rcvprn = "SAP",
Requser = await _sysConfigService.GetConfigValueByCode<string>(ConfigConst.SapUserName),
Note1 = "",
Note2 = "",
Note3 = "",
Zwbid = millisecondTimestamp,
Matnr = input._System_objNBS,
Mbrsh = input.fld004323,
Mtart = input.fld004324,
Maktx = input.fld004484,
Meins = input.fld004861,
Matkl = input.fld004485,
Bismt = input._System_ObjDescription,
Groes = input._System_objNBS,
Normt = input.fld004887,
Ferth = input.fld004882,
Zeinr = input.fld004881,
Mstae = input.fld004699,
Raube = input.fld004877,
Mhdrz = input.fld004876.ToString(),
Mhdhb = input.fld004895.ToString(),
Werks = input.fld004325,
Beskz = input.fld004490,
Sobsl = input.fld004491,
Schgt = input.fld004873,
Rgekz = input.fld004872,
Zbom = input.fld004698
};
var apiOutput = await _sapService.SapMaterialApi(sapMaterialInput);
string codeVal = apiOutput.code == "S" ? "成功" : "失败";
var msg = apiOutput.msg;
if (apiOutput.msg == "")
{
msg = "同步成功";
}
await _obj110Rep.AsUpdateable()
.SetColumns(it => new Obj110
{
fld004629 = DateTime.Now,
fld004311 = codeVal,
fld004312 = "N",
fld004313 = msg
})
.Where(it => it.idRecord == input.idRecord)
.ExecuteCommandAsync();
var output = new SapOutput()
{
parameter = apiOutput.parameter,
code = codeVal,
msg = msg,
result = apiOutput.result
};
return output;
}
/// <summary>
/// 获取BOM
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "GetBOM", Description = "获取BOM", Order = 1000), HttpPost]
[DisplayName("获取BOM")]
public async Task<SqlSugarPagedList<ProductManagementBomOutput>> GetBOM(BomPageProductManagementInput input)
{
var configid = await _configurationsRep.AsQueryable().Where(x => x.ObjectId == 110 && x.ConfigSystemName == "mBOM").FirstAsync();
var parent = await _obj110Rep.AsQueryable().Where(x => x.RecordGuid == input.ParentGuid && x.deleted == false && x.fld004311 == "成功" && x.fld004312 == "N").MaxAsync(x => x.VersionIndex);
var BomData = await _configurationDataRep.AsQueryable()
.Where(x => x.ConfigId == configid.ConfigID && x.ParentGuid == input.ParentGuid && x.isDeleted == false && x.ParentVersion == parent && (x.fld005586 != "不包含" || x.fld005586 == null)).Select<ProductManagementBomOutput>().ToListAsync();
//.WhereIF(!string.IsNullOrWhiteSpace(input.Description), u => u.Description.Contains(input.Description.Trim()))
//.WhereIF(!string.IsNullOrWhiteSpace(input.PartNumber), u => u.PartNumber.Contains(input.PartNumber.Trim()))
//.Select<ProductManagementBomOutput>().ToPagedListAsync(input.Page, input.PageSize);
foreach (var item in BomData)
{
if (item.ChildObjID == 137)
{
if (item.PartNumber != null && Regex.IsMatch(item.PartNumber, "默认"))
{
var data137 = await _obj137Rep.AsQueryable().Where(x => x.RecordGuid == item.ChildGuid && x.deleted == false && x._system_objConfigurationName == "默认").OrderByDescending(x => x.idRecord).FirstAsync();
if (data137 != null)
{
item.PartNumber = data137._System_objNBS;
item.Description = data137._System_ObjDescription;
}
}
}
}
var data = BomData.ToPagedList(input.Page, input.PageSize);
return data;
}
/// <summary>
/// 产品管理-Bom同步到SAP
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "SyncToSAPBom"), HttpPost]
[DisplayName("产品管理-Bom同步到SAP")]
public async Task<SapOutput> SyncToSAPBom(List<BomPageProductManagementInput> input)
{
var ParentData = await _obj110Rep.AsQueryable().Where(x => x.RecordGuid == input[0].ParentGuid && x.deleted == false && x.VersionIndex == input[0].ParentVersion).FirstAsync();
var EcnData = await _obj118Rep.AsQueryable().Where(x => x.RecordGuid == ParentData.fld004944_Rec && x.deleted == false).OrderByDescending(x => x.VersionIndex).FirstAsync();
var ecn = "";
if (EcnData != null)
{
ecn = EcnData._System_objNBS;
}
var itemDataList = new List<ItemData>();
for (int i = 0; i < input.Count; i++)
{
//var Verification = await _dataValidationService.VerificationMaterial(input[i].ChildObjID, input[i].PartNumber, input[i].ChildGuid);
string verification = "不存在";
if (input[i].ChildObjID == 137)
{
var data137 = await _obj137Rep.AsQueryable().Where(x => x._System_objNBS == input[i].PartNumber && x.deleted == false && x.RecordGuid == input[i].ChildGuid && x._system_objConfigurationName == "默认").OrderByDescending(x => x.idRecord).FirstAsync();
if (data137 == null)
{
verification = "不存在";
}
else
{
input[i].PartNumber = data137._System_objNBS;
verification = "存在";
}
}
else
{
verification = await _dataValidationService.VerificationMaterial(input[i].ChildObjID, input[i].PartNumber, input[i].ChildGuid);
}
if (verification == "不存在")
{
continue;
}
//int sun = i + 1;
var itemData = new ItemData()
{
POSNR = "",//组件序号 sun.ToString()
IDNRK = input[i].PartNumber,//组件物料号
MENGE = input[i].Quantity.ToString(),//组件数量
SORTF = input[i].fld004936,
ITISOB = input[i].fld004937,
ALPGR = input[i].fld004938,
ALPRF = input[i].fld004939,
ZDELETE = input[i].fld004940,
POSTP = input[i].fld004492,
ZYFMK = input[i].fld004941,
ChildGuid= input[i].ChildGuid
};
itemDataList.Add(itemData);
}
if (!string.IsNullOrEmpty(ParentData.fld005288))
{
var configid = await _configurationsRep.AsQueryable().Where(x => x.ObjectId == 110 && x.ConfigSystemName == "mBOM").FirstAsync();
var BomData = await _configurationDataRep.AsQueryable().Where(x => x.ConfigId == configid.ConfigID && x.ParentGuid == input[0].ParentGuid && x.isDeleted == false && x.ParentVersion == Convert.ToInt32(ParentData.fld005288) && (x.fld005586 != "不包含" || x.fld005586 == null)).ToListAsync();
for (int i = 0; i < BomData.Count; i++)
{
//var itemList = itemDataList.Where(x => x.IDNRK == BomData[i].PartNumber).ToList();
var itemList = itemDataList.Where(x => x.ChildGuid == BomData[i].ChildGuid).ToList();
if (itemList.Count == 0)
{
//var Verification = await _dataValidationService.VerificationMaterial(BomData[i].ChildObjID, BomData[i].PartNumber, BomData[i].ChildGuid);
//if (Verification == "不存在")
//{
// continue;
//}
if (BomData[i].ChildObjID == 137)
{
var data137 = await _obj137Rep.AsQueryable().Where(x => x.deleted == false && x.RecordGuid == BomData[i].ChildGuid && x._system_objConfigurationName == "默认").OrderByDescending(x => x.idRecord).FirstAsync();
if (data137 != null)
{
BomData[i].PartNumber = data137._System_objNBS;
}
else
{
continue;
}
}
else
{
var Verification = await _dataValidationService.VerificationMaterial(BomData[i].ChildObjID, BomData[i].PartNumber, BomData[i].ChildGuid);
if (Verification == "不存在")
{
continue;
}
}
//int sun = i + 1;
var itemData = new ItemData()
{
POSNR = "",//组件序号 sun.ToString()
IDNRK = BomData[i].PartNumber,//组件物料号
MENGE = BomData[i].Quantity.ToString(),//组件数量
SORTF = BomData[i].fld004936,
ITISOB = BomData[i].fld004937,
ALPGR = BomData[i].fld004938,
ALPRF = BomData[i].fld004939,
ZDELETE = "X",
POSTP = BomData[i].fld004492,
ZYFMK = BomData[i].fld004941
};
itemDataList.Add(itemData);
}
}
}
//获取时间戳精确到毫秒sap要求每次调用生成不重复guid
string millisecondTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
Random random = new Random();
// 生成1000到9999之间的随机数
string randomNumber = random.Next(1000, 10000).ToString();
millisecondTimestamp = millisecondTimestamp + randomNumber;
var isreq = new IS_REQ()
{
ReqKeyId = "",
BusinessId = "",
MessageId = "",
SndPrn = "PLM",
RcvPrn = "SAP",
ReqUser = await _sysConfigService.GetConfigValueByCode<string>(ConfigConst.SapUserName),
Note1 = "",
Note2 = "",
Note3 = "",
Zwbid = millisecondTimestamp,
Matnr = ParentData._System_objNBS,//父物料编码
Werks = ParentData.fld004325,//工厂
Bmeng = ParentData.fld004942.ToString(),
Aennr = ecn,
Datuv = ParentData.fld004945.ToString(),
ItemList = itemDataList
};
var apiOutput = await _sapService.SapBomApi(isreq);
string codeVal = apiOutput.code == "S" ? "成功" : "失败";
if (codeVal == "成功")
{
await _obj110Rep.AsUpdateable()
.SetColumns(it => new Obj110
{
fld004631 = DateTime.Now,
fld004315 = codeVal,
fld004316 = "N",
fld004317 = apiOutput.msg,
fld005288 = input[0].ParentVersion.ToString()
})
.Where(it => it.idRecord == ParentData.idRecord)
.ExecuteCommandAsync();
}
else
{
await _obj110Rep.AsUpdateable()
.SetColumns(it => new Obj110
{
fld004631 = DateTime.Now,
fld004315 = codeVal,
fld004316 = "N",
fld004317 = apiOutput.msg
})
.Where(it => it.idRecord == ParentData.idRecord)
.ExecuteCommandAsync();
}
var msg = apiOutput.msg;
if (apiOutput.msg == "")
{
msg = "同步成功";
}
var output = new SapOutput()
{
parameter = apiOutput.parameter,
code = codeVal,
msg = msg,
result = apiOutput.result
};
return output;
}
/// <summary>
/// 产品管理-批量同步到SAP
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "BatchSyncToSAP"), HttpPost]
[DisplayName("产品管理-批量同步到SAP")]
public async Task<List<SapOutput>> BatchSyncToSAP(List<ProductManagementBaseInput> input)
{
using var serviceScope = _scopeFactory.CreateScope();
var sysEnumService = serviceScope.ServiceProvider.GetRequiredService<SysEnumService>();
var db = serviceScope.ServiceProvider.GetRequiredService<ISqlSugarClient>().AsTenant().GetConnectionScope("启威星 1.94.4.74").CopyNew();
const string lengthError = "物料描述长度大于40请检查";
const string synchronized = "该物料编码已同步或已停用!";
var SapOutputList = new List<SapOutput>();
var Requser = await _sysConfigService.GetConfigValueByCode<string>(ConfigConst.SapUserName);
var tasks = input.Select(async item =>
{
if (item.fld004484.Length > 40)
{
db.CopyNew().Updateable<Obj110>()
.SetColumns(it => new Obj110
{
fld004629 = DateTime.Now,
fld004312 = "N",
fld004313 = lengthError,
fld004311 = "失败"
})
.Where(it => it.idRecord == item.idRecord)
.ExecuteCommand();
return new SapOutput
{
materialCode = item._System_objNBS,
code = "失败",
msg = lengthError,
result = lengthError
};
}
if (item.fld004312 == "N" || item.fld004312 == "D" || item.fld004312 == null)
{
return new SapOutput
{
materialCode = item._System_objNBS,
code = "失败",
msg = synchronized,
result = synchronized
};
}
//获取时间戳精确到毫秒sap要求每次调用生成不重复guid
string millisecondTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
Random random = new Random();
// 生成1000到9999之间的随机数
string randomNumber = random.Next(1000, 10000).ToString();
millisecondTimestamp = millisecondTimestamp + randomNumber;
var sapMaterialInput = new SapMaterialInput()
{
Reqkeyid = "",
Businessid = "",
Messageid = "",
Sndprn = "PLM",
Rcvprn = "SAP",
Requser = Requser,
Note1 = "",
Note2 = "",
Note3 = "",
Zwbid = millisecondTimestamp,
Matnr = item._System_objNBS,
Mbrsh = item.fld004323,
Mtart = item.fld004324,
Maktx = item.fld004484,
Meins = item.fld004861,
Matkl = item.fld004485,
Bismt = item._System_ObjDescription,
Groes = item._System_objNBS,
Normt = item.fld004887,
Ferth = item.fld004882,
Zeinr = item.fld004881,
Mstae = item.fld004699,
Raube = item.fld004877,
Mhdrz = item.fld004876.ToString(),
Mhdhb = item.fld004895.ToString(),
Werks = item.fld004325,
Beskz = item.fld004490,
Sobsl = item.fld004491,
Schgt = item.fld004873,
Rgekz = item.fld004872,
Zbom = item.fld004698
};
var sapOutput = await _sapService.SapMaterialApi(sapMaterialInput);
string codeVal = sapOutput.code == "S" ? "成功" : "失败";
string msg = sapOutput.msg;
if (sapOutput.msg == "")
{
msg = "同步成功";
}
await _obj110Rep.AsUpdateable()
.SetColumns(it => new Obj110
{
fld004629 = DateTime.Now,
fld004311 = codeVal,
fld004312 = "N",
fld004313 = msg
})
.Where(it => it.idRecord == item.idRecord)
.ExecuteCommandAsync();
return new SapOutput
{
parameter = sapOutput.parameter,
materialCode = item._System_objNBS,
code = codeVal,
msg = msg,
result = sapOutput.result
};
});
var materialOutput = await Task.WhenAll(tasks);
return materialOutput.ToList();
}
/// <summary>
/// 产品管理-定时同步到SAP
/// </summary>
/// <returns></returns>
[ApiDescriptionSettings(Name = "TimingSyncToSAP"), HttpGet]
[DisplayName("产品管理-定时同步到SAP")]
[AllowAnonymous]
public async Task<List<SapOutput>> TimingSyncToSAP()
{
using var serviceScope = _scopeFactory.CreateScope();
var sysEnumService = serviceScope.ServiceProvider.GetRequiredService<SysEnumService>();
var db = serviceScope.ServiceProvider.GetRequiredService<ISqlSugarClient>().AsTenant().GetConnectionScope("启威星 1.94.4.74").CopyNew();
var input = db.Queryable<Obj110>()
.Where(x => (x.CheckedStatus == 0 || x.CheckedStatus == 1) && x.fld005324 == "发布" && x.deleted == false && x.IsLatestVersion == true && (x.fld004312 == "A" || x.fld004312 == "M"))
.ToList();
const string lengthError = "物料描述长度大于40请检查";
var SapOutputList = new List<SapOutput>();
var Requser = await _sysConfigService.GetConfigValueByCode<string>(ConfigConst.SapUserName);
var tasks = input.Select(async item =>
{
if (item.fld004484.Length > 40)
{
db.CopyNew().Updateable<Obj110>()
.SetColumns(it => new Obj110
{
fld004629 = DateTime.Now,
fld004312 = "N",
fld004313 = lengthError,
fld004311 = "失败"
})
.Where(it => it.idRecord == item.idRecord)
.ExecuteCommand();
return new SapOutput
{
materialCode = item._System_objNBS,
code = "失败",
msg = lengthError,
result = lengthError
};
}
//获取时间戳精确到毫秒sap要求每次调用生成不重复guid
string millisecondTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
Random random = new Random();
// 生成1000到9999之间的随机数
string randomNumber = random.Next(1000, 10000).ToString();
millisecondTimestamp = millisecondTimestamp + randomNumber;
var sapMaterialInput = new SapMaterialInput()
{
Reqkeyid = "",
Businessid = "",
Messageid = "",
Sndprn = "PLM",
Rcvprn = "SAP",
Requser = Requser,
Note1 = "",
Note2 = "",
Note3 = "",
Zwbid = millisecondTimestamp,
Matnr = item._System_objNBS,
Mbrsh = item.fld004323,
Mtart = item.fld004324,
Maktx = item.fld004484,
Meins = item.fld004861,
Matkl = item.fld004485,
Bismt = item._System_ObjDescription,
Groes = item._System_objNBS,
Normt = item.fld004887,
Ferth = item.fld004882,
Zeinr = item.fld004881,
Mstae = item.fld004699,
Raube = item.fld004877,
Mhdrz = item.fld004876.ToString(),
Mhdhb = item.fld004895.ToString(),
Werks = item.fld004325,
Beskz = item.fld004490,
Sobsl = item.fld004491,
Schgt = item.fld004873,
Rgekz = item.fld004872,
Zbom = item.fld004698
};
var sapOutput = await _sapService.SapMaterialApi(sapMaterialInput);
string codeVal = sapOutput.code == "S" ? "成功" : "失败";
string msg = sapOutput.msg;
if (sapOutput.msg == "")
{
msg = "同步成功";
}
db.CopyNew().Updateable<Obj110>()
.SetColumns(it => new Obj110
{
fld004629 = DateTime.Now,
fld004311 = codeVal,
fld004312 = "N",
fld004313 = msg
})
.Where(it => it.idRecord == item.idRecord)
.ExecuteCommand();
return new SapOutput
{
parameter = sapOutput.parameter,
materialCode = item._System_objNBS,
code = codeVal,
msg = msg,
result = sapOutput.result
};
});
var materialOutput = await Task.WhenAll(tasks);
return materialOutput.ToList();
}
/// <summary>
/// 产品管理-定时同步 BOM 到 SAP
/// </summary>
/// <returns></returns>
[ApiDescriptionSettings(Name = "TimingSyncToSAPBom"), HttpGet]
[DisplayName("产品管理-定时同步 Bom 到 SAP")]
[AllowAnonymous]
public async Task<List<SapOutput>> TimingSyncToSAPBom()
{
var sapOutputList = new List<SapOutput>();
var sapUserName = await _sysConfigService.GetConfigValueByCode<string>(ConfigConst.SapUserName);
// 配置
var configid = 1;
var materialData = await _obj110Rep.AsQueryable()
.Where(x => (x.CheckedStatus == 0 || x.CheckedStatus == 1) && x.fld005324 == "发布" && x.deleted == false && x.IsLatestVersion == true && x.fld004311 == "成功" && x.fld004312 == "N" && (x.fld004316 == "A" || x.fld004316 == "M"))
.ToListAsync();
var groupedData = materialData.GroupBy(item => item.RecordGuid)
.Select(group => group.OrderByDescending(item => item.VersionIndex).First())
.ToList();
foreach (var item in groupedData)
{
// 获取版本号
var versionIndex = item.VersionIndex;
// 获取 ECN guid
var ecnGuid = item.fld004944_Rec;
// 查询 BOM
var bomData = await _configurationDataRep.AsQueryable()
.Where(x => x.ConfigId == configid && x.ParentGuid == item.RecordGuid && x.isDeleted == false && x.ParentVersion == versionIndex && (x.fld005586 != "不包含" || x.fld005586 == null)).ToListAsync();
if (bomData.Count == 0)
{
continue;
}
// 查询 ECN 编码
var ecnData = await _obj118Rep.AsQueryable().Where(x => x.RecordGuid == ecnGuid && x.deleted == false).OrderByDescending(x => x.VersionIndex).FirstAsync();
var ecn = ecnData != null ? ecnData._System_objNBS : "";
var itemDataList = new List<ItemData>();
foreach (var bomItem in bomData)
{
var verification = await _dataValidationService.VerificationMaterial(bomItem.ChildObjID, bomItem.PartNumber, bomItem.ChildGuid);
if (verification == "不存在")
{
continue;
}
var itemData = new ItemData
{
POSNR = (bomData.IndexOf(bomItem) + 1).ToString(),
IDNRK = bomItem.PartNumber,
MENGE = bomItem.Quantity.ToString(),
SORTF = bomItem.fld004936,
ITISOB = bomItem.fld004937,
ALPGR = bomItem.fld004938,
ALPRF = bomItem.fld004939,
ZDELETE = bomItem.fld004940,
POSTP = bomItem.fld004492,
ZYFMK = bomItem.fld004941
};
itemDataList.Add(itemData);
}
var ParentData = await _obj110Rep.AsQueryable().Where(x => x.RecordGuid == bomData[0].ParentGuid && x.deleted == false && x.VersionIndex == bomData[0].ParentVersion).FirstAsync();
//对比上个版本
if (!string.IsNullOrEmpty(ParentData.fld005288))
{
var configidold = await _configurationsRep.AsQueryable().Where(x => x.ObjectId == 110 && x.ConfigSystemName == "mBOM").FirstAsync();
var BomDataold = await _configurationDataRep.AsQueryable().Where(x => x.ConfigId == configidold.ConfigID && x.ParentGuid == bomData[0].ParentGuid && x.isDeleted == false && x.ParentVersion == Convert.ToInt32(ParentData.fld005288) && (x.fld005586 != "不包含" || x.fld005586 == null)).ToListAsync();
for (int i = 0; i < BomDataold.Count; i++)
{
var itemList = itemDataList.Where(x => x.IDNRK == BomDataold[i].PartNumber).ToList();
if (itemList.Count == 0)
{
var Verification = await _dataValidationService.VerificationMaterial(BomDataold[i].ChildObjID, BomDataold[i].PartNumber, BomDataold[i].ChildGuid);
if (Verification == "不存在")
{
continue;
}
//int sun = i + 1;
var itemData = new ItemData()
{
POSNR = "",//组件序号 sun.ToString()
IDNRK = BomDataold[i].PartNumber,//组件物料号
MENGE = BomDataold[i].Quantity.ToString(),//组件数量
SORTF = BomDataold[i].fld004936,
ITISOB = BomDataold[i].fld004937,
ALPGR = BomDataold[i].fld004938,
ALPRF = BomDataold[i].fld004939,
ZDELETE = "X",
POSTP = BomDataold[i].fld004492,
ZYFMK = BomDataold[i].fld004941
};
itemDataList.Add(itemData);
}
}
}
// 获取时间戳精确到毫秒sap 要求每次调用生成不重复 guid
string millisecondTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
Random random = new Random();
// 生成1000到9999之间的随机数
string randomNumber = random.Next(1000, 10000).ToString();
millisecondTimestamp = millisecondTimestamp + randomNumber;
var isreq = new IS_REQ
{
ReqKeyId = "",
BusinessId = "",
MessageId = "",
SndPrn = "PLM",
RcvPrn = "SAP",
ReqUser = sapUserName,
Note1 = "",
Note2 = "",
Note3 = "",
Zwbid = millisecondTimestamp,
Matnr = item._System_objNBS,
Werks = item.fld004325,
Bmeng = item.fld004942.ToString(),
Aennr = ecn,
Datuv = item.fld004945.ToString(),
ItemList = itemDataList
};
var apiOutput = await _sapService.SapBomApi(isreq);
string codeVal = apiOutput.code == "S" ? "成功" : "失败";
if (codeVal == "成功")
{
await _obj110Rep.AsUpdateable()
.SetColumns(it => new Obj110
{
fld004631 = DateTime.Now,
fld004315 = codeVal,
fld004316 = "N",
fld004317 = apiOutput.msg,
fld005288 = versionIndex.ToString()
})
.Where(it => it.idRecord == item.idRecord)
.ExecuteCommandAsync();
}
else
{
await _obj110Rep.AsUpdateable()
.SetColumns(it => new Obj110
{
fld004631 = DateTime.Now,
fld004315 = codeVal,
fld004316 = "N",
fld004317 = apiOutput.msg
})
.Where(it => it.idRecord == item.idRecord)
.ExecuteCommandAsync();
}
var msg = apiOutput.msg;
if (string.IsNullOrEmpty(msg))
{
msg = "同步成功";
}
var output = new SapOutput
{
parameter = apiOutput.parameter,
materialCode = item._System_objNBS,
code = codeVal,
msg = msg,
result = apiOutput.result
};
sapOutputList.Add(output);
}
return sapOutputList;
}
/// <summary>
///产品管理同步Bom到SAP
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public async Task<SapOutput> SyncBomToSap(SyncBomData data)
{
var sapUserName = await _sysConfigService.GetConfigValueByCode<string>(ConfigConst.SapUserName);
using var serviceScope = _scopeFactory.CreateScope();
var db = serviceScope.ServiceProvider.GetRequiredService<ISqlSugarClient>().AsTenant().GetConnectionScope("启威星 1.94.4.74").CopyNew();
var ecn = db.CopyNew().Queryable<Obj118>().Where(x => x.RecordGuid == data.ecnGuid).OrderByDescending(x => x.idRecord).First();
if (ecn != null)
{
data.Ecn = ecn._System_objNBS;
}
var itemDataList = new List<ItemData>();
foreach (var item in data.Bom)
{
string verification = "不存在";
if (item.ChildObjID == 137)
{
var data137 = await db.CopyNew().Queryable<Obj137>().Where(x => x.deleted == false && x.RecordGuid == item.ChildGuid && x._system_objConfigurationName == "默认").OrderByDescending(x=>x.idRecord).FirstAsync();
if (data137 == null)
{
verification = "不存在";
}
else {
item.PartNumber = data137._System_objNBS;
verification = "存在";
}
}
else {
verification = await _dataValidationService.VerificationMaterial(item.ChildObjID, item.PartNumber, item.ChildGuid);
}
if (verification == "不存在")
{
continue;
}
var itemData = new ItemData
{
POSNR = (data.Bom.IndexOf(item) + 1).ToString(),
IDNRK = item.PartNumber,
MENGE = item.Quantity.ToString(),
SORTF = item.SORTF,
ITISOB = item.ITISOB,
ALPGR = item.ALPGR,
ALPRF = item.ALPRF,
ZDELETE = item.ZDELETE,
POSTP = item.POSTP,
ZYFMK = item.ZYFMK,
ChildGuid=item.ChildGuid
};
itemDataList.Add(itemData);
}
if (!string.IsNullOrEmpty(data.SyncVersion))
{
var BomData = db.CopyNew().Queryable<ConfigurationData>().Where(x => x.ConfigId == 1 && x.ParentGuid == data.RecordGuid && x.isDeleted == false && x.ParentVersion == Convert.ToInt32(data.SyncVersion) && (x.fld005586 != "不包含" || x.fld005586 == null)).ToList();
foreach (var item in BomData)
{
//var itemList = itemDataList.Where(x => x.IDNRK == item.PartNumber).ToList();
var itemList = itemDataList.Where(x => x.ChildGuid == item.ChildGuid).ToList();
if (itemList.Count == 0)
{
if (item.ChildObjID == 137)
{
var data137 = await _obj137Rep.AsQueryable().Where(x => x.deleted == false && x.RecordGuid == item.ChildGuid && x._system_objConfigurationName == "默认").OrderByDescending(x => x.idRecord).FirstAsync();
if (data137 != null)
{
item.PartNumber = data137._System_objNBS;
}
else
{
continue;
}
}
else
{
var Verification = await _dataValidationService.VerificationMaterial(item.ChildObjID, item.PartNumber, item.ChildGuid);
if (Verification == "不存在")
{
continue;
}
}
//var Verification = await _dataValidationService.VerificationMaterial(item.ChildObjID, item.PartNumber, item.ChildGuid);
//if (Verification == "不存在")
//{
// if (item.ChildObjID == 137)
// {
// string partNumber = item.PartNumber.Replace("默认 ", "");//过滤BOM表PartNumber字段存在“默认 ”
// if (partNumber == item.PartNumber)//判断过滤后,物料编码是否和原料相同,相同的话跳出循环
// {
// continue;
// }
// var data137 = db.CopyNew().Queryable<Obj137>().Where(x => x._System_objNBS == partNumber && x.deleted == false).OrderByDescending(x => x.idRecord).First();
// if (data137 != null)
// {
// item.PartNumber = data137._System_objNBS;
// }
// else
// {
// continue;
// }
// }
// else
// {
// continue;
// }
//}
var itemData = new ItemData()
{
POSNR = "",//组件序号 sun.ToString()
IDNRK = item.PartNumber,//组件物料号
MENGE = item.Quantity.ToString(),//组件数量
SORTF = item.fld004936,
ITISOB = item.fld004937,
ALPGR = item.fld004938,
ALPRF = item.fld004939,
ZDELETE = "X",
POSTP = item.fld004492,
ZYFMK = item.fld004941
};
itemDataList.Add(itemData);
}
}
}
// 获取时间戳精确到毫秒sap 要求每次调用生成不重复 guid
string millisecondTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
Random random = new Random();
// 生成1000到9999之间的随机数
string randomNumber = random.Next(1000, 10000).ToString();
millisecondTimestamp = millisecondTimestamp + randomNumber;
var isreq = new IS_REQ
{
ReqKeyId = "",
BusinessId = "",
MessageId = "",
SndPrn = "PLM",
RcvPrn = "SAP",
ReqUser = sapUserName,
Note1 = "",
Note2 = "",
Note3 = "",
Zwbid = millisecondTimestamp,
Matnr = data.MaterialCode,
Werks = data.Werks,
Bmeng = data.Bmeng.ToString(),
Aennr = data.Ecn,
Datuv = data.Datuv.ToString(),
ItemList = itemDataList
};
var apiOutput = await _sapService.SapBomApi(isreq);
string codeVal = apiOutput.code == "S" ? "成功" : "失败";
if (codeVal == "成功")
{
db.CopyNew().Updateable<Obj110>()
.SetColumns(it => new Obj110
{
fld004631 = DateTime.Now,
fld004315 = codeVal,
fld004316 = "N",
fld004317 = apiOutput.msg,
fld005288 = data.VersionIndex.ToString()
})
.Where(it => it.idRecord == data.Id)
.ExecuteCommand();
}
else
{
db.CopyNew().Updateable<Obj110>()
.SetColumns(it => new Obj110
{
fld004631 = DateTime.Now,
fld004315 = codeVal,
fld004316 = "N",
fld004317 = apiOutput.msg
})
.Where(it => it.idRecord == data.Id)
.ExecuteCommand();
}
var msg = apiOutput.msg;
if (string.IsNullOrEmpty(msg))
{
msg = "同步成功";
}
var output = new SapOutput
{
parameter = apiOutput.parameter,
materialCode = data.MaterialCode,
code = codeVal,
msg = msg,
result = apiOutput.result
};
return output;
}
/// <summary>
/// 产品管理-获取工艺路线
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "GetProcessRoute", Description = "获取工艺路线", Order = 1000), HttpPost]
[DisplayName("获取工艺路线")]
public async Task<SqlSugarPagedList<ProductManagementBomOutput>> GetProcessRoute(BomPageProductManagementInput input)
{
var configid = await _configurationsRep.AsQueryable().Where(x => x.ObjectId == 110 && x.ConfigSystemName == "pBOM").FirstAsync();
var parent = await _obj110Rep.AsQueryable().Where(x => x.RecordGuid == input.ParentGuid && x.deleted == false).MaxAsync(x => x.VersionIndex);
var BomData = await _configurationDataRep.AsQueryable()
.Where(x => x.ConfigId == configid.ConfigID && x.ParentGuid == input.ParentGuid && x.isDeleted == false && x.ParentVersion == parent)
.WhereIF(!string.IsNullOrWhiteSpace(input.Description), u => u.Description.Contains(input.Description.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.PartNumber), u => u.PartNumber.Contains(input.PartNumber.Trim()))
.Select<ProductManagementBomOutput>().ToPagedListAsync(input.Page, input.PageSize);
return BomData;
}
/// <summary>
/// 产品管理-工艺路线同步到SAP
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "SyncToSAPProcessRoute"), HttpPost]
[DisplayName("产品管理-工艺路线同步到SAP")]
public async Task<SapOutput> SyncToSAPProcessRoute(List<BomPageProductManagementInput> input)
{
var ParentData = await _obj110Rep.AsQueryable().Where(x => x.RecordGuid == input[0].ParentGuid && x.deleted == false && x.VersionIndex == input[0].ParentVersion && x.fld004311 == "成功" && x.fld004312 == "N" && x.fld005324 == "发布").FirstAsync();
var itemDataList = new List<SapProcessRouteItemData>();
for (int i = 0; i < input.Count; i++)
{
var Verification = await _dataValidationService.VerificationMaterial(input[i].ChildObjID, input[i].PartNumber, input[i].ChildGuid);
if (Verification == "不存在")
{
continue;
}
//获取工序描述
var procedureDescription = await _obj122Rep.AsQueryable().Where(x => x.RecordGuid == input[i].ChildGuid).ToListAsync();
//获取工作中心
var workCenter = await _obj121Rep.AsQueryable().Where(x => x.RecordGuid == procedureDescription[0].fld005059_Rec).ToListAsync();
//int sun = i + 1;
var itemData = new SapProcessRouteItemData()
{
VORNR = input[i].Marker,
LTXA1 = procedureDescription[0]._System_ObjDescription,
ARBPL = workCenter[0]._System_objNBS,
VGW01 = input[i].fld004994.ToString(),
VGE01 = input[i].fld004995,
STEUS = input[i].fld004996,
BMSCH = input[i].fld005296.ToString()
};
itemDataList.Add(itemData);
}
//获取时间戳精确到毫秒sap要求每次调用生成不重复guid
string millisecondTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
Random random = new Random();
// 生成1000到9999之间的随机数
string randomNumber = random.Next(1000, 10000).ToString();
millisecondTimestamp = millisecondTimestamp + randomNumber;
var Datuv = ParentData.fld004945.ToString();
if (!string.IsNullOrEmpty(Datuv))
{
Datuv = ParentData.fld004945.ToDateTime().ToString("yyyy-MM-dd");
}
var isreq = new SapProcessRouteIS_REQ()
{
ReqKeyId = "",
BusinessId = "",
MessageId = "",
SndPrn = "PLM",
RcvPrn = "SAP",
ReqUser = await _sysConfigService.GetConfigValueByCode<string>(ConfigConst.SapUserName),
Note1 = "",
Note2 = "",
Note3 = "",
Zwbid = millisecondTimestamp,
Matnr = ParentData._System_objNBS,
Werks = ParentData.fld004325,
Datuv = Datuv,
Plnal = "",
ItemList = itemDataList
};
var apiOutput = await _sapService.SapProcessRouteApi(isreq);
string codeVal = apiOutput.code == "S" ? "成功" : "失败";
await _obj110Rep.AsUpdateable()
.SetColumns(it => new Obj110
{
fld004632 = DateTime.Now,
fld004319 = codeVal,
fld004320 = "N",
fld004321 = apiOutput.msg
})
.Where(it => it.idRecord == ParentData.idRecord)
.ExecuteCommandAsync();
var msg = apiOutput.msg;
if (apiOutput.msg == "")
{
msg = "同步成功";
}
var output = new SapOutput()
{
parameter = apiOutput.parameter,
code = codeVal,
msg = msg,
result = apiOutput.result
};
return output;
}
/// <summary>
/// 产品管理-定时同步工艺路线到SAP
/// </summary>
/// <returns></returns>
[ApiDescriptionSettings(Name = "TimingSyncToSAPProcessRoute"), HttpGet]
[DisplayName("产品管理-定时同步工艺路线到SAP")]
[AllowAnonymous]
public async Task<List<SapOutput>> TimingSyncToSAPProcessRoute()
{
var sapOutputList = new List<SapOutput>();
var sapUserName = await _sysConfigService.GetConfigValueByCode<string>(ConfigConst.SapUserName);
// 配置
var configid = await _configurationsRep.AsQueryable().Where(x => x.ObjectId == 110 && x.ConfigSystemName == "pBOM").FirstAsync();
//查询需要同步的产品
var materialData = await _obj110Rep.AsQueryable()
.Where(x => (x.CheckedStatus == 0 || x.CheckedStatus == 1) && x.fld005324 == "发布" && x.deleted == false && x.IsLatestVersion == true && x.fld004311 == "成功" && x.fld004312 == "N" && (x.fld004320 == "A" || x.fld004320 == "M"))
.ToListAsync();
//分组查询最大版本的物料
var groupedData = materialData.GroupBy(item => item.RecordGuid)
.Select(group => group.OrderByDescending(item => item.VersionIndex).First())
.ToList();
foreach (var item in groupedData)
{
// 获取版本号
var versionIndex = item.VersionIndex;
// 查询 BOM
var processRouteData = await _configurationDataRep.AsQueryable()
.Where(x => x.ConfigId == configid.ConfigID && x.ParentGuid == item.RecordGuid && x.isDeleted == false && x.ParentVersion == versionIndex).ToListAsync();
if (processRouteData.Count == 0)
{
continue;
}
var itemDataList = new List<SapProcessRouteItemData>();
foreach (var processRouteItem in processRouteData)
{
var verification = await _dataValidationService.VerificationMaterial(processRouteItem.ChildObjID, processRouteItem.PartNumber, processRouteItem.ChildGuid);
if (verification == "不存在")
{
continue;
}
//获取工序描述
var procedureDescription = await _obj122Rep.AsQueryable().Where(x => x.RecordGuid == processRouteItem.ChildGuid).ToListAsync();
//获取工作中心
var workCenter = await _obj121Rep.AsQueryable().Where(x => x.RecordGuid == procedureDescription[0].fld005059_Rec).ToListAsync();
var itemData = new SapProcessRouteItemData()
{
VORNR = processRouteItem.Marker,
LTXA1 = procedureDescription[0]._System_ObjDescription,
ARBPL = workCenter[0]._System_objNBS,
VGW01 = processRouteItem.fld004994.ToString(),
VGE01 = processRouteItem.fld004995,
STEUS = processRouteItem.fld004996,
BMSCH = processRouteItem.fld005296.ToString()
};
itemDataList.Add(itemData);
}
//获取时间戳精确到毫秒sap要求每次调用生成不重复guid
string millisecondTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
Random random = new Random();
// 生成1000到9999之间的随机数
string randomNumber = random.Next(1000, 10000).ToString();
millisecondTimestamp = millisecondTimestamp + randomNumber;
var Datuv = item.fld004945.ToString();
if (!string.IsNullOrEmpty(Datuv))
{
Datuv = item.fld004945.ToDateTime().ToString("yyyy-MM-dd");
}
var isreq = new SapProcessRouteIS_REQ()
{
ReqKeyId = "",
BusinessId = "",
MessageId = "",
SndPrn = "PLM",
RcvPrn = "SAP",
ReqUser = await _sysConfigService.GetConfigValueByCode<string>(ConfigConst.SapUserName),
Note1 = "",
Note2 = "",
Note3 = "",
Zwbid = millisecondTimestamp,
Matnr = item._System_objNBS,
Werks = item.fld004325,
Datuv = Datuv,
Plnal = "",
ItemList = itemDataList
};
var apiOutput = await _sapService.SapProcessRouteApi(isreq);
string codeVal = apiOutput.code == "S" ? "成功" : "失败";
await _obj110Rep.AsUpdateable()
.SetColumns(it => new Obj110
{
fld004632 = DateTime.Now,
fld004319 = codeVal,
fld004320 = "N",
fld004321 = apiOutput.msg
})
.Where(it => it.idRecord == item.idRecord)
.ExecuteCommandAsync();
var msg = apiOutput.msg;
if (apiOutput.msg == "")
{
msg = "同步成功";
}
var output = new SapOutput()
{
parameter = apiOutput.parameter,
code = codeVal,
msg = msg,
result = apiOutput.result
};
sapOutputList.Add(output);
}
return sapOutputList;
}
/// <summary>
/// 产品管理同步工艺路线到sap
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public async Task<SapOutput> SyncProcessRouteToSap(SyncProcessRouteData data)
{
using var serviceScope = _scopeFactory.CreateScope();
var db = serviceScope.ServiceProvider.GetRequiredService<ISqlSugarClient>().AsTenant().GetConnectionScope("启威星 1.94.4.74").CopyNew();
var itemDataList = new List<SapProcessRouteItemData>();
foreach (var item in data.ProcessRouteList)
{
var verification = await _dataValidationService.VerificationMaterial(item.ChildObjID, item.PartNumber, item.ChildGuid);
if (verification == "不存在")
{
continue;
}
//获取工序描述
var procedureDescription = db.CopyNew().Queryable<Obj122>().Where(x => x.RecordGuid == item.ChildGuid).First(); ;
//获取工作中心
var workCenter = db.CopyNew().Queryable<Obj121>().Where(x => x.RecordGuid == procedureDescription.fld005059_Rec).First();
var itemData = new SapProcessRouteItemData()
{
VORNR = item.VORNR,
LTXA1 = procedureDescription._System_ObjDescription,
ARBPL = workCenter._System_objNBS,
VGW01 = item.VGW01.ToString(),
VGE01 = item.VGE01,
STEUS = item.STEUS,
BMSCH = item.BMSCH.ToString()
};
itemDataList.Add(itemData);
}
var Datuv = data.Datuv.ToString();
if (!string.IsNullOrEmpty(Datuv))
{
Datuv = data.Datuv.ToDateTime().ToString("yyyy-MM-dd");
}
//获取时间戳精确到毫秒sap要求每次调用生成不重复guid
string millisecondTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
Random random = new Random();
// 生成1000到9999之间的随机数
string randomNumber = random.Next(1000, 10000).ToString();
millisecondTimestamp = millisecondTimestamp + randomNumber;
var isreq = new SapProcessRouteIS_REQ()
{
ReqKeyId = "",
BusinessId = "",
MessageId = "",
SndPrn = "PLM",
RcvPrn = "SAP",
ReqUser = await _sysConfigService.GetConfigValueByCode<string>(ConfigConst.SapUserName),
Note1 = "",
Note2 = "",
Note3 = "",
Zwbid = millisecondTimestamp,
Matnr = data._System_objNBS,
Werks = data.Werks,
Datuv = Datuv,
Plnal = "",
ItemList = itemDataList
};
var apiOutput = await _sapService.SapProcessRouteApi(isreq);
string codeVal = apiOutput.code == "S" ? "成功" : "失败";
db.CopyNew().Updateable<Obj110>()
.SetColumns(it => new Obj110
{
fld004632 = DateTime.Now,
fld004319 = codeVal,
fld004320 = "N",
fld004321 = apiOutput.msg
})
.Where(it => it.idRecord == data.idRecord)
.ExecuteCommand();
var msg = apiOutput.msg;
if (apiOutput.msg == "")
{
msg = "同步成功";
}
var output = new SapOutput()
{
parameter = apiOutput.parameter,
code = codeVal,
msg = msg,
result = apiOutput.result
};
return output;
}
}