440 lines
19 KiB
C#
440 lines
19 KiB
C#
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.构建信息
|
||
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()
|
||
{
|
||
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.构建信息
|
||
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()
|
||
{
|
||
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";
|
||
}
|
||
}
|
||
}
|