using Infrastructure.Attribute;
using SqlSugar;
using System;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
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,
ChangePackage = totalPackage,
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";
}
}
}