shgx_tz_mom/ZR.Service/mes/wms/WmGoodsOutProductionService.cs

543 lines
23 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 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
}
// 检查计划中是否有此零件号
WmMaterial material = Context
.Queryable<WmMaterial>()
.Where(it => it.Partnumber == model.Partnumber)
.First();
if (material == null)
{
throw new Exception("物料号不存在:" + model.Partnumber);
}
bool hasMaterial = Context
.Queryable<WmMaterialOutorder>()
.Where(it => it.FkOutorderId == model.FkOutOrderId)
.Where(it => it.FkMaterialId == material.Id)
.Any();
if (!hasMaterial)
{
throw new Exception($"该物料在此出库计划中不存在物料号:{model.Partnumber},工单号:{model.FkOutOrderId}");
}
//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();
}
// 插入操作日志
var record = new WmGoodsRecord
{
// 日志属性初始化(同原逻辑)
Id = SnowFlakeSingle.Instance.NextId().ToString(),
FkInventoryId = SnowFlakeSingle.Instance.NextId().ToString(),
Code = "AddWmGoodsOutProduction",
Partnumber = model.Partnumber ?? "无零件号",
ChangeType = 2,
ChangePackage = 1,
ChangeQuantity = model.GoodsNumLogic - model.GoodsNumAction,
Remark =
"网页单次货物出库"
+ "\n出库单:"
+ "无"
+ "\n零件号:"
+ model.Partnumber
+ "\n总箱数:"
+ 1
+ "\n变动零件数:"
+ (model.GoodsNumLogic - model.GoodsNumAction)
+ "\n涉及批次号:\n"
+ string.Join(',', model.PackageCodeClient),
CreatedBy = model.CreatedBy,
CreatedTime = DateTime.Now
// 其他属性省略
};
if (Context.Insertable(record).ExecuteCommand() == 0)
throw new Exception("操作记录插入失败");
// 出库信息转发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.GoodsNumAction.ToString(),
// 批次号
LotNo = dateString,
createTime = DateTime.Now,
userID = model.CreatedBy ?? "手动单箱出库",
guid = Guid.NewGuid().ToString(),
lineno = "涂装生产线"
};
u8PackageList.Add(u8PackageItem);
}
// 出库发U8
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
);
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;
}
// 检查计划中是否有此零件号
WmMaterial material = Context
.Queryable<WmMaterial>()
.Where(it => it.Partnumber == nowProduction.Partnumber)
.First();
if (material == null)
{
throw new Exception("物料号不存在:" + nowProduction.Partnumber);
}
bool hasMaterial = Context
.Queryable<WmMaterialOutorder>()
.Where(it => it.FkOutorderId == parm.FkOutOrderId)
.Where(it => it.FkMaterialId == material.Id)
.Any();
if (!hasMaterial)
{
throw new Exception($"该物料在此出库计划中不存在物料号:{nowProduction.Partnumber},工单号:{parm.FkOutOrderId}");
}
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;
}
// 检查计划中是否有此零件号
WmMaterial material = Context
.Queryable<WmMaterial>()
.Where(it => it.Partnumber == nowProduction.Partnumber)
.First();
if (material == null)
{
throw new Exception("物料号不存在:" + nowProduction.Partnumber);
}
bool hasMaterial = Context
.Queryable<WmMaterialOutorder>()
.Where(it => it.FkOutorderId == parm.FkOutOrderId)
.Where(it => it.FkMaterialId == material.Id)
.Any();
if (!hasMaterial)
{
throw new Exception($"该物料在此出库计划中不存在物料号:{nowProduction.Partnumber},工单号:{parm.FkOutOrderId}");
}
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,
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<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.GoodsNumAction.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
);
logger.Warn(u8ErpResult);
});
return "ok";
}
}
}