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

320 lines
13 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 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;
namespace ZR.Service.mes.wms
{
/// <summary>
/// 出库货物记录表Service业务层处理
/// </summary>
[AppService(
ServiceType = typeof(IWmGoodsOutProductionService),
ServiceLifetime = LifeTime.Transient
)]
public class WmGoodsOutProductionService
: BaseService<WmGoodsOutRecord>,
IWmGoodsOutProductionService
{
/// <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();
}
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();
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,
};
// 记录统计
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,
};
// 记录统计
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();
return "ok";
}
}
}