using System; using System.Text.RegularExpressions; using System.Threading.Tasks; using Aliyun.OSS; using Infrastructure.Attribute; using Microsoft.AspNetCore.Http.HttpResults; using SqlSugar; using ZR.Model.MES.wms; using ZR.Model.MES.wms.Dto; using ZR.Service.mes.wms.IService; using ZR.Service.mes.wms_u8; namespace ZR.Service.mes.wms { /// /// 出库货物记录表Service业务层处理 /// [AppService( ServiceType = typeof(IWmGoodsOutProductionService), ServiceLifetime = LifeTime.Transient )] public class WmGoodsOutProductionService : BaseService, IWmGoodsOutProductionService { private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); /// /// 查询出库货物记录表列表 /// /// /// public (List, int) GetList(WmGoodsOutProductionQueryDto parm) { int total = 0; List partnumberByDescription = new(); if (parm != null && !string.IsNullOrEmpty(parm.Description)) { partnumberByDescription = Context .Queryable() .Where(it => it.Description.Contains(parm.Description)) .Where(it => it.Type == 1) .Select(it => it.Partnumber) .ToList(); } var predicate = Expressionable .Create() .AndIF( !string.IsNullOrEmpty(parm.Partnumber), wgo => wgo.Partnumber.Contains(parm.Partnumber) ) .AndIF( partnumberByDescription.Count > 0, wgo => partnumberByDescription.Contains(wgo.Partnumber) ) .AndIF( !string.IsNullOrEmpty(parm.PackageCodeClient), wgo => wgo.PackageCodeClient.Contains(parm.PackageCodeClient) ) .AndIF( !string.IsNullOrEmpty(parm.LocationCode), wgo => wgo.LocationCode.Contains(parm.LocationCode) ) .AndIF(parm.OutTimeStart != null, wgo => wgo.OutTime > parm.OutTimeStart) .AndIF(parm.OutTimeEnd != null, wgo => wgo.OutTime < parm.OutTimeEnd) .AndIF( !string.IsNullOrEmpty(parm.FkOutOrderId), wgo => wgo.FkOutOrderId.Contains(parm.FkOutOrderId) ); //TODO 添加了Distinct去重 var response = Queryable() .LeftJoin((wgo, wml) => wgo.Partnumber == wml.Partnumber) .Where(predicate.ToExpression()) .Select( (wgo, wml) => new WmGoodsOutProductionDto { Description = wml.Description }, true ) .MergeTable() .Distinct() .OrderBy(wml => wml.OutTime, OrderByType.Desc) .ToPageList(parm.PageNum, parm.PageSize, ref total); return (response, total); } /// /// 获取详情 /// /// /// public WmGoodsOutRecord GetInfo(string Id) { var response = Queryable().Where(x => x.Id == Id).First(); return response; } /// /// 添加出库货物记录表 /// /// /// public WmGoodsOutRecord AddWmGoodsOutProduction(WmGoodsOutRecord model) { // 检查成品库数据是否存在 bool hasRecord = Context .Queryable() .Where(it => it.Id == model.FkNowProductionId) .Any(); if (!hasRecord) { throw new Exception("请检查该箱是否已完全出库,或已添加出库记录!"); } if (string.IsNullOrEmpty(model.PackageCode)) { model.PackageCode = "L" + DateTime.Now.ToString("yyMMddHHmmss"); } if (string.IsNullOrEmpty(model.Id)) { model.Id = SnowFlakeSingle.Instance.NextId().ToString(); //也可以在程序中直接获取ID } //2. 根据成品仓库id修改记录 WmGoodsNowProduction updateModel = new WmGoodsNowProduction(); updateModel.Id = model.FkNowProductionId; updateModel.GoodsNumAction = model.GoodsNumLogic - model.GoodsNumAction; if (updateModel.GoodsNumAction <= 0) { updateModel.GoodsNumAction = 0; } if (updateModel.GoodsNumAction == 0) { Context .Deleteable() .Where(it => it.Id == updateModel.Id) .ExecuteCommand(); } else { Context .Updateable(updateModel) .IgnoreColumns(ignoreAllNullColumns: true) .ExecuteCommand(); } // 出库信息转发U8 //1.构建信息 // TODO 客户编号获取 string _outOrder = model.FkOutOrderId ?? "无出库单"; string _customerCode = Context .Queryable() .Where(x => x.ShipmentNum == _outOrder) .Select(x => x.CustomNo) .First() ?? "无客户代码"; List outPackagelist = new() { model }; List u8PackageList = new(); foreach (var item in outPackagelist) { string dateString = DateTime.Now.ToString("yyyyMMdd"); // 使用正则表达式匹配日期模式 string pattern = @"(\d{2})(\d{2})(\d{2})"; Match match = Regex.Match(item.PackageCodeClient, pattern); if (match.Success) { // 提取匹配的年份、月份和日期 string year = match.Groups[1].Value; string month = match.Groups[2].Value; string day = match.Groups[3].Value; // 转换为四位数年份(假设2000年代) string fullYear = "20" + year; // 组合为yyyyMMdd格式 dateString = fullYear + month + day; } else { logger.Warn($"未找到匹配的日期模式:{item.PackageCodeClient}"); } ERP_WMS_interactiveModelQuery u8PackageItem = new() { customerCode = _customerCode, materialCode = item.Partnumber, location = item.LocationCode, Qty = item.GoodsNumLogic.ToString(), // 批次号 LotNo = dateString, createTime = DateTime.Now, userID = model.CreatedBy ?? "手动单箱出库", guid = Guid.NewGuid().ToString(), lineno = "涂装生产线" }; u8PackageList.Add(u8PackageItem); } string urlBase = "http://gam.com.cn:8053/"; ERP_WMS_interactiveService _eRP_WMS_InteractiveService = new(); // 后台执行不阻塞主线程 _ = Task.Run(async () => { var u8ErpResult = await _eRP_WMS_InteractiveService.OutboundedAsync( urlBase, u8PackageList ); // 处理结果... //TODO 对U8返回结果进行解析 logger.Warn(u8ErpResult); }); return Context.Insertable(model).ExecuteReturnEntity(); } /// /// 修改出库货物记录表 /// /// /// public int UpdateWmGoodsOutProduction(WmGoodsOutRecord model) { //var response = Update(w => w.Id == model.Id, it => new WmGoodsOutProduction() //{ // PackageCode = model.PackageCode, // PackageCodeClient = model.PackageCodeClient, // PackageCodeOriginal = model.PackageCodeOriginal, // LocationCode = model.LocationCode, // Partnumber = model.Partnumber, // GoodsNumLogic = model.GoodsNumLogic, // GoodsNumAction = model.GoodsNumAction, // EntryWarehouseTime = model.EntryWarehouseTime, // OutTime = model.OutTime, // Remark = model.Remark, // UpdatedBy = model.UpdatedBy, // UpdatedTime = model.UpdatedTime, // CreatedBy = model.CreatedBy, // CreatedTime = model.CreatedTime, //}); //return response; return Update(model, true); } public string DoPatchOutProduction(WmBatchGoodsOutProductionDto parm) { int type = parm.Type; var time = DateTime.Now.ToLocalTime(); // 统计记录 List partnumbers = new(); int totalPackage = 0; int totalPartnumber = 0; List packageCodeRemark = new(); List outRecordList = new(); if (type == 1) { var list = parm.Ids; for (int i = 0; i < list.Count; i++) { WmGoodsNowProduction nowProduction = Context .Queryable() .Where(it => it.Id == list[i]) .First(); if (nowProduction == null) { continue; } WmGoodsOutRecord outRecord = new() { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkNowProductionId = nowProduction.Id, FkOutOrderId = parm.FkOutOrderId, PackageCode = nowProduction.PackageCode, PackageCodeClient = nowProduction.PackageCodeClient, PackageCodeOriginal = nowProduction.PackageCodeOriginal, LocationCode = nowProduction.LocationCode, Partnumber = nowProduction.Partnumber, GoodsNumAction = nowProduction.GoodsNumAction, GoodsNumLogic = nowProduction.GoodsNumAction, EntryWarehouseTime = nowProduction.EntryWarehouseTime, OutTime = time, Remark = "批量出库", CreatedBy = parm.CreatedBy ?? "batch", CreatedTime = time, }; outRecordList.Add(outRecord); // 记录统计 totalPackage++; if (!partnumbers.Contains(nowProduction.Partnumber)) { partnumbers.Add(nowProduction.Partnumber); } totalPartnumber += nowProduction.GoodsNumAction ?? 0; packageCodeRemark.Add(nowProduction.PackageCodeClient); Context.Insertable(outRecord).ExecuteCommand(); Context .Deleteable() .Where(it => it.Id == nowProduction.Id) .ExecuteCommand(); } } else if (type == 2) { if (parm.PackageCodeClient == "" || parm.PackageCodeClient == null) { return "无批次号参数"; } // 短批次号 string shortPackageCode = parm.PackageCodeClient.Split('_')[0]; if (shortPackageCode.Length < 8) { return "请输入至少8位批次号编码,以保证正确批次出库!"; } List nowProductionList = Context .Queryable() .Where(it => it.PackageCodeClient.Contains(shortPackageCode)) .ToList(); for (int i = 0; i < nowProductionList.Count; i++) { WmGoodsNowProduction nowProduction = Context .Queryable() .Where(it => it.Id == nowProductionList[i].Id) .First(); if (nowProduction == null) { continue; } WmGoodsOutRecord outRecord = new() { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkNowProductionId = nowProduction.Id, FkOutOrderId = parm.FkOutOrderId, PackageCode = nowProduction.PackageCode, PackageCodeClient = nowProduction.PackageCodeClient, PackageCodeOriginal = nowProduction.PackageCodeOriginal, LocationCode = nowProduction.LocationCode, Partnumber = nowProduction.Partnumber, GoodsNumAction = nowProduction.GoodsNumAction, GoodsNumLogic = nowProduction.GoodsNumAction, EntryWarehouseTime = nowProduction.EntryWarehouseTime, OutTime = time, Remark = "批量出库", CreatedBy = parm.CreatedBy ?? "batch", CreatedTime = time, }; outRecordList.Add(outRecord); // 记录统计 totalPackage++; if (!partnumbers.Contains(nowProduction.Partnumber)) { partnumbers.Add(nowProduction.Partnumber); } totalPartnumber += nowProduction.GoodsNumAction ?? 0; packageCodeRemark.Add(nowProduction.PackageCodeClient); Context.Insertable(outRecord).ExecuteCommand(); Context .Deleteable() .Where(it => it.Id == nowProduction.Id) .ExecuteCommand(); } } // 插入记录 WmGoodsRecord wmGoodsRecord = new() { Id = SnowFlakeSingle.Instance.NextId().ToString(), FkInventoryId = SnowFlakeSingle.Instance.NextId().ToString(), Code = "DoPatchOutProduction", Partnumber = partnumbers[0] ?? "无零件号", BlankNum = "", ChangeType = 2, ChangeQuantity = totalPartnumber, ActionTime = DateTime.Now, Status = 1, Remark = "货物出库" + "\n出库单:" + parm.FkOutOrderId + "\n零件号:" + string.Join(',', partnumbers) + "\n总箱数:" + totalPackage + "\n总零件数:" + totalPartnumber + "\n涉及批次号:\n" + string.Join(',', packageCodeRemark), CreatedBy = parm.CreatedBy ?? "batch", CreatedTime = DateTime.Now, }; int recordNum = Context.Insertable(wmGoodsRecord).ExecuteCommand(); // 出库信息转发U8 //1.构建信息 // TODO 客户编号获取 string _outOrder = parm.FkOutOrderId ?? "无出库单"; string _customerCode = Context .Queryable() .Where(x => x.ShipmentNum == _outOrder) .Select(x => x.CustomNo) .First() ?? "无客户代码"; List u8PackageList = new(); foreach (var item in outRecordList) { string dateString = DateTime.Now.ToString("yyyyMMdd"); // 使用正则表达式匹配日期模式 string pattern = @"(\d{2})(\d{2})(\d{2})"; Match match = Regex.Match(item.PackageCodeClient, pattern); if (match.Success) { // 提取匹配的年份、月份和日期 string year = match.Groups[1].Value; string month = match.Groups[2].Value; string day = match.Groups[3].Value; // 转换为四位数年份(假设2000年代) string fullYear = "20" + year; // 组合为yyyyMMdd格式 dateString = fullYear + month + day; } else { logger.Warn($"未找到匹配的日期模式:{item.PackageCodeClient}"); } ERP_WMS_interactiveModelQuery u8PackageItem = new() { customerCode = _customerCode, materialCode = item.Partnumber, location = item.LocationCode, Qty = item.GoodsNumLogic.ToString(), // 批次号 LotNo = dateString, createTime = DateTime.Now, userID = parm.CreatedBy ?? "手动批量出库", guid = Guid.NewGuid().ToString(), lineno = "涂装生产线" }; u8PackageList.Add(u8PackageItem); } string urlBase = "http://gam.com.cn:8053/"; ERP_WMS_interactiveService _eRP_WMS_InteractiveService = new(); // 后台执行不阻塞主线程 _ = Task.Run(async () => { var u8ErpResult = await _eRP_WMS_InteractiveService.OutboundedAsync( urlBase, u8PackageList ); // 处理结果... //TODO 对U8返回结果进行解析 logger.Warn(u8ErpResult); }); /* ERP_WMS_interactiveModelResult u8ErpResult = _eRP_WMS_InteractiveService.Outbounded( urlBase, u8PackageList );*/ //TODO 对U8返回结果进行解析 /* logger.Warn(u8ErpResult);*/ return "ok"; } } }