shgx_tz_mom/ZR.Service/mes/wms/WmGoodsOutProductionService.cs
2025-07-22 16:39:51 +08:00

467 lines
20 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 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
{
/// <summary>
/// 出库货物记录表Service业务层处理
/// </summary>
[AppService(
ServiceType = typeof(IWmGoodsOutProductionService),
ServiceLifetime = LifeTime.Transient
)]
public class WmGoodsOutProductionService
: BaseService<WmGoodsOutRecord>,
IWmGoodsOutProductionService
{
private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
/// <summary>
/// 查询出库货物记录表列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public (List<WmGoodsOutProductionDto>, int) GetList(WmGoodsOutProductionQueryDto parm)
{
int total = 0;
List<string> partnumberByDescription = new();
if (parm != null && !string.IsNullOrEmpty(parm.Description))
{
partnumberByDescription = Context
.Queryable<WmMaterial>()
.Where(it => it.Description.Contains(parm.Description))
.Where(it => it.Type == 1)
.Select(it => it.Partnumber)
.ToList();
}
var predicate = Expressionable
.Create<WmGoodsOutRecord>()
.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<WmMaterial>((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);
}
/// <summary>
/// 获取详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public WmGoodsOutRecord GetInfo(string Id)
{
var response = Queryable().Where(x => x.Id == Id).First();
return response;
}
/// <summary>
/// 添加出库货物记录表
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public WmGoodsOutRecord AddWmGoodsOutProduction(WmGoodsOutRecord model)
{
// 检查成品库数据是否存在
bool hasRecord = Context
.Queryable<WmGoodsNowProduction>()
.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<WmGoodsNowProduction>()
.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<WmOutOrder>()
.Where(x => x.ShipmentNum == _outOrder)
.Select(x => x.CustomNo)
.First() ?? "无客户代码";
List<WmGoodsOutRecord> outPackagelist = new() { model };
List<ERP_WMS_interactiveModelQuery> 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();
}
/// <summary>
/// 修改出库货物记录表
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
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<string> partnumbers = new();
int totalPackage = 0;
int totalPartnumber = 0;
List<string> packageCodeRemark = new();
List<WmGoodsOutRecord> outRecordList = new();
if (type == 1)
{
var list = parm.Ids;
for (int i = 0; i < list.Count; i++)
{
WmGoodsNowProduction nowProduction = Context
.Queryable<WmGoodsNowProduction>()
.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<WmGoodsNowProduction>()
.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<WmGoodsNowProduction> nowProductionList = Context
.Queryable<WmGoodsNowProduction>()
.Where(it => it.PackageCodeClient.Contains(shortPackageCode))
.ToList();
for (int i = 0; i < nowProductionList.Count; i++)
{
WmGoodsNowProduction nowProduction = Context
.Queryable<WmGoodsNowProduction>()
.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<WmGoodsNowProduction>()
.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<WmOutOrder>()
.Where(x => x.ShipmentNum == _outOrder)
.Select(x => x.CustomNo)
.First() ?? "无客户代码";
List<ERP_WMS_interactiveModelQuery> 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";
}
}
}