using AutoMapper;
|
using MailKit.Search;
|
using Newtonsoft.Json;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Data;
|
using System.Globalization;
|
using System.Linq;
|
using System.Reflection.Metadata;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_BasicRepository;
|
using WIDESEA_Common;
|
using WIDESEA_Common.OrderEnum;
|
using WIDESEA_Common.TaskEnum;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core.CodeConfigEnum;
|
using WIDESEA_Core.Enums;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_Core.Utilities;
|
using WIDESEA_DTO;
|
using WIDESEA_DTO.Basic;
|
using WIDESEA_DTO.ERP;
|
using WIDESEA_DTO.Inbound;
|
using WIDESEA_DTO.Outbound;
|
using WIDESEA_IBasicRepository;
|
using WIDESEA_IBasicService;
|
using WIDESEA_IInboundRepository;
|
using WIDESEA_IInboundService;
|
using WIDESEA_InboundRepository;
|
using WIDESEA_IStockRepository;
|
using WIDESEA_IStockService;
|
using WIDESEA_ITaskInfoRepository;
|
using WIDESEA_Model.Models;
|
using WIDESEA_Model.Models.Inbound;
|
using static WIDESEA_Common.HouseInventoryIn;
|
using static WIDESEA_Common.HouseSyncretism;
|
using static WIDESEA_Common.InventoryAllocate;
|
using Parameter = WIDESEA_Common.Parameter;
|
|
namespace WIDESEA_InboundService
|
{
|
public partial class InboundOrderService : ServiceBase<Dt_InboundOrder, IInboundOrderRepository>, IInboundOrderService
|
{
|
private readonly IMapper _mapper;
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly ITaskRepository _taskRepository;
|
private readonly IInboundRepository _inboundRepository;
|
private readonly IBasicRepository _basicRepository;
|
private IBasicService _basicService;
|
private IStockService _stockService;
|
private IInboundOrderDetailService _inboundOrderDetailService;
|
private IInboundOrder_HtyService _inboundOrderHtyService;
|
private IInboundOrderDetail_HtyService _inboundOrderDetail_HtyService;
|
private IWarehouseService _warehouseService;
|
private readonly IStockRepository _stockRepository;
|
private IPalletTypeInfoRepository _palletTypeInfoRepository;
|
private readonly IReturnOrderRepository _returnOrderRepository;
|
private readonly ICPInboundOrderDetailRepository _cPInboundOrderDetailRepository;
|
|
|
public IInboundOrderRepository Repository => BaseDal;
|
|
public InboundOrderService(IInboundOrderRepository BaseDal, IMapper mapper, IBasicService basicService, IBasicRepository basicRepository, IInboundRepository inboundRepository, IUnitOfWorkManage unitOfWorkManage, ITaskRepository taskRepository, IStockService stockService, IInboundOrderDetailService inboundOrderDetailService, IInboundOrder_HtyService inboundOrderHtyService, IInboundOrderDetail_HtyService inboundOrderDetail_HtyService, IWarehouseService warehouseService, IStockRepository stockRepository, IPalletTypeInfoRepository palletTypeInfoRepository, IReturnOrderRepository returnOrderRepository, ICPInboundOrderDetailRepository cPInboundOrderDetailRepository) : base(BaseDal)
|
{
|
_mapper = mapper;
|
_unitOfWorkManage = unitOfWorkManage;
|
_taskRepository = taskRepository;
|
_stockService = stockService;
|
_inboundRepository = inboundRepository;
|
_basicRepository = basicRepository;
|
_inboundOrderDetailService = inboundOrderDetailService;
|
_inboundOrderHtyService = inboundOrderHtyService;
|
_inboundOrderDetail_HtyService = inboundOrderDetail_HtyService;
|
_basicService = basicService;
|
_warehouseService = warehouseService;
|
_stockRepository = stockRepository;
|
_palletTypeInfoRepository = palletTypeInfoRepository;
|
_returnOrderRepository = returnOrderRepository;
|
_cPInboundOrderDetailRepository = cPInboundOrderDetailRepository;
|
}
|
|
/// <summary>
|
/// PDA扫码组盘
|
/// </summary>
|
/// <param name="materielGroupDTO"></param>
|
/// <returns></returns>
|
public WebResponseContent MaterielGroup(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
|
var orderNo = saveModel.MainData["orderNo"].ToString();
|
var palletCode = saveModel.MainData["palletCode"].ToString();
|
var warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
|
var Initiallife = saveModel.MainData["initiallife"].ObjToInt();
|
List<string> serialNumbers = new List<string>();
|
List<decimal> quantitys = new List<decimal>();
|
foreach (var item in saveModel.DelKeys)
|
{
|
string json = JsonConvert.SerializeObject(item);
|
Dictionary<string, object> delKeyDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
|
|
|
if (delKeyDict.TryGetValue("serialNumber", out object serialNumberObj))
|
{
|
string serialNumber = serialNumberObj?.ToString();
|
if (!string.IsNullOrEmpty(serialNumber))
|
{
|
serialNumbers.Add(serialNumber);
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error("serialNumber的值为空");
|
}
|
}
|
if (delKeyDict.TryGetValue("quantity", out object quantityObj))
|
{
|
if (quantityObj == null)
|
{
|
return WebResponseContent.Instance.Error("物料数量的值为空");
|
}
|
decimal quantity;
|
try
|
{
|
quantity = Convert.ToDecimal(quantityObj);
|
}
|
catch
|
{
|
return WebResponseContent.Instance.Error($"物料数量{quantityObj}无法转换为数字");
|
}
|
if (quantity <= 0)
|
{
|
return WebResponseContent.Instance.Error("物料数量必须大于0");
|
}
|
|
quantitys.Add(quantity);
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error("缺少物料数量字段");
|
}
|
}
|
Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == warehouseId);
|
if (warehouse == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该仓库信息");
|
}
|
|
Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.OrderNo == orderNo && x.WarehouseId == warehouse.WarehouseId).Includes(x => x.Details).First();
|
if (inboundOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单信息");
|
}
|
if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单明细信息");
|
}
|
List<MatSerNumAnalysisModel> models = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serialNumbers);
|
//验证判断时间格式
|
WebResponseContent IsValidContent = IsValidMCDates(models);
|
if (!IsValidContent.Status)
|
{
|
return content.Error(IsValidContent.Message);
|
}
|
|
string materielCode = models.FirstOrDefault()?.MaterielCode ?? "";
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode);
|
if (materielInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该物料的信息");
|
}
|
List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>();
|
///找数量匹配的
|
if (warehouse.WarehouseCode.Contains("BC"))
|
{
|
inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == materielCode && x.SupplierBatch == (models.FirstOrDefault()?.LotNo ?? "") && x.OrderQuantity > x.ReceiptQuantity && x.OrderQuantity == (quantitys.FirstOrDefault())).ToList();
|
}
|
else
|
{
|
inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == materielCode && x.BatchNo == (models.FirstOrDefault()?.LotNo ?? "")).ToList();
|
}
|
|
|
if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料信息或数量不匹配");
|
}
|
var inboundOrderDet = inboundOrderDetails.FirstOrDefault();
|
|
//Dt_StockInfo? stockInfo = _stockService.StockInfoService.GetStockByPalletCode(palletCode);
|
|
decimal beforeQuantity = 0;
|
|
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
|
if (stockInfo == null)
|
{
|
stockInfo = new Dt_StockInfo()
|
{
|
BatchNo = inboundOrderDet.BatchNo,
|
PalletCode = palletCode,
|
PalletType = GetPalletType(warehouse, palletCode),//GetPalletType(warehouse, palletCode)
|
IsFull = true,
|
StockStatus = (int)StockStatusEmun.组盘暂存,
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
MaterialType = (int)InventoryMaterialType.原材料,
|
Materialweight = 0,
|
Wlstatus = (int)InventoryMaterialStatus.合格,
|
Mgeneratetime = DateTime.Now,
|
WarehouseId = warehouse.WarehouseId,
|
System = inboundOrder.System,
|
Details = new List<Dt_StockInfoDetail>()
|
};
|
}
|
else
|
{
|
//if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
|
//{
|
return WebResponseContent.Instance.Error($"托盘号重复,该托盘已组过物料");
|
//}
|
//beforeQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
|
}
|
|
if (warehouse.WarehouseCode == WarehouseEnum.SC01_BC.ToString())
|
{
|
stockInfo.Remark = Initiallife.ToString();
|
string batchNo = models.FirstOrDefault()?.LotNo ?? "";
|
//Dt_StockInfoDetail existDetail = _stockRepository.StockInfoDetailRepository.QueryFirst(x => x.BatchNo == batchNo);
|
//if (existDetail != null)
|
//{
|
// return WebResponseContent.Instance.Error($"{batchNo}测试架已存在");
|
//}
|
if (models.Count >= 2)
|
{
|
return WebResponseContent.Instance.Error($"组盘明细不唯一");
|
}
|
//if (palletCode.Substring(0, 1) == "6")
|
//{
|
// stockInfo.PalletType = PalletTypeEnum.MediumPallet.ObjToInt();
|
//}
|
//else
|
//{
|
// stockInfo.PalletType = PalletTypeEnum.LargestPallet.ObjToInt();
|
//}
|
}
|
else if (warehouse.WarehouseCode == WarehouseEnum.SC01_BC.ToString())
|
{
|
if (models.Count >= 2)
|
{
|
return WebResponseContent.Instance.Error($"组盘明细不唯一");
|
}
|
}
|
|
List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
|
foreach (var model in models)
|
{
|
|
Dt_InboundOrderDetail notGroupDetail = new Dt_InboundOrderDetail();
|
///找数量匹配的
|
if (warehouse.WarehouseCode.Contains("BC"))
|
{
|
notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus <= OrderDetailStatusEnum.Inbounding.ObjToInt() && x.MaterielCode == model.MaterielCode && x.SupplierBatch == model.LotNo && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault();
|
}
|
else
|
{
|
notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus <= OrderDetailStatusEnum.Inbounding.ObjToInt() && x.MaterielCode == model.MaterielCode && x.BatchNo == model.LotNo && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault();
|
}
|
|
|
if (notGroupDetail == null)
|
{
|
return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成");
|
}
|
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
|
{
|
MaterielCode = inboundOrderDet.MaterielCode,
|
MaterielName = inboundOrderDet.MaterielName,
|
OrderNo = inboundOrder.OrderNo,
|
BatchNo = inboundOrderDet.BatchNo,
|
LinId = inboundOrderDet.LinId,
|
StockQuantity = (quantitys.FirstOrDefault()),
|
Status = (int)StockStatusEmun.组盘暂存,
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
Id = inboundOrderDet.LinId.ObjToInt(),
|
DeliveryNote = model.DeliveryNote,
|
SupplierBatch = inboundOrderDet.SupplierBatch,
|
MaterieSpec = inboundOrderDet.MaterieSpec,
|
OrinalLocation = inboundOrderDet.OrinalLocation
|
};
|
|
if (stockInfo.Id > 0)
|
{
|
stockInfoDetail.StockId = stockInfo.Id;
|
}
|
stockInfo.Details.Add(stockInfoDetail);
|
|
stockInfoDetails.Add(stockInfoDetail);
|
|
decimal decimalReceiptQuantity = Convert.ToDecimal(notGroupDetail.ReceiptQuantity);
|
decimal decimalModelQuantity = Convert.ToDecimal((quantitys.FirstOrDefault()));
|
decimal decimalOrderQuantity = Convert.ToDecimal(notGroupDetail.OrderQuantity);
|
decimalReceiptQuantity += decimalModelQuantity;
|
// 检查是否超出订单数量
|
if (decimalReceiptQuantity > decimalOrderQuantity)
|
{
|
return WebResponseContent.Instance.Error($"组盘数量溢出{decimalReceiptQuantity - decimalOrderQuantity}");
|
}
|
// 转回float类型存储,但比较和计算都使用decimal完成
|
notGroupDetail.ReceiptQuantity = Convert.ToDecimal(decimalReceiptQuantity);
|
if (notGroupDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
|
{
|
notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
|
}
|
}
|
|
decimal totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
|
|
inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
|
_unitOfWorkManage.BeginTran();
|
if (stockInfo.Id == 0)
|
{
|
_stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
|
}
|
else
|
{
|
_stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo).Include(x => x.Details, new UpdateNavOptions() { OneToManyInsertOrUpdate = true }).ExecuteCommand();
|
}
|
_inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails);
|
_inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
|
_unitOfWorkManage.CommitTran();
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
content = WebResponseContent.Instance.Error(ex.Message);
|
}
|
finally
|
{
|
|
}
|
return content;
|
}
|
|
//药水,低温仓组盘
|
public WebResponseContent NewMaterielGroup(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
|
var orderNo = saveModel.MainData["orderNo"].ToString();
|
var palletCode = saveModel.MainData["palletCode"].ToString();
|
var warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
|
var Initiallife = saveModel.MainData["initiallife"].ObjToInt();
|
List<string> serialNumbers = new List<string>();
|
List<decimal> quantitys = new List<decimal>();
|
foreach (var item in saveModel.DelKeys)
|
{
|
string json = JsonConvert.SerializeObject(item);
|
Dictionary<string, object> delKeyDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
|
|
|
if (delKeyDict.TryGetValue("serialNumber", out object serialNumberObj))
|
{
|
string serialNumber = serialNumberObj?.ToString();
|
if (!string.IsNullOrEmpty(serialNumber))
|
{
|
serialNumbers.Add(serialNumber);
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error("serialNumber的值为空");
|
}
|
}
|
if (delKeyDict.TryGetValue("quantity", out object quantityObj))
|
{
|
if (quantityObj == null)
|
{
|
return WebResponseContent.Instance.Error("物料数量的值为空");
|
}
|
decimal quantity;
|
try
|
{
|
quantity = Convert.ToDecimal(quantityObj);
|
}
|
catch
|
{
|
return WebResponseContent.Instance.Error($"物料数量{quantityObj}无法转换为数字");
|
}
|
if (quantity <= 0)
|
{
|
return WebResponseContent.Instance.Error("物料数量必须大于0");
|
}
|
|
quantitys.Add(quantity);
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error("缺少物料数量字段");
|
}
|
}
|
Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == warehouseId);
|
if (warehouse == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该仓库信息");
|
}
|
|
Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.OrderNo == orderNo && x.WarehouseId == warehouse.WarehouseId).Includes(x => x.Details).First();
|
if (inboundOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单信息");
|
}
|
if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单明细信息");
|
}
|
List<MatSerNumAnalysisModel> models = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serialNumbers);
|
//验证判断时间格式
|
WebResponseContent IsValidContent = IsValidMCDates(models);
|
if (!IsValidContent.Status)
|
{
|
return content.Error(IsValidContent.Message);
|
}
|
|
string materielCode = models.FirstOrDefault()?.MaterielCode ?? "";
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode);
|
if (materielInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该物料的信息");
|
}
|
|
decimal beforeQuantity = 0;
|
|
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
|
if (stockInfo == null)
|
{
|
stockInfo = new Dt_StockInfo()
|
{
|
BatchNo = "",
|
PalletCode = palletCode,
|
PalletType = GetPalletType(warehouse, palletCode),//GetPalletType(warehouse, palletCode)
|
IsFull = true,
|
StockStatus = (int)StockStatusEmun.组盘暂存,
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
MaterialType = (int)InventoryMaterialType.原材料,
|
Materialweight = 0,
|
Wlstatus = (int)InventoryMaterialStatus.合格,
|
Mgeneratetime = DateTime.Now,
|
WarehouseId = 0,
|
System = inboundOrder.System,
|
Details = new List<Dt_StockInfoDetail>()
|
};
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error($"托盘号重复,该托盘已组过物料");
|
}
|
List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
|
foreach (var model in models)
|
{
|
|
Dt_InboundOrderDetail notGroupDetail = new Dt_InboundOrderDetail();
|
|
notGroupDetail = inboundOrder.Details.Where(x => x.OrderDetailStatus <= OrderDetailStatusEnum.Inbounding.ObjToInt() && x.MaterielCode == model.MaterielCode && x.SupplierBatch == model.LotNo && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault();
|
|
if (notGroupDetail.MaterielType == 1)
|
{
|
stockInfo.WarehouseId = 6;
|
}
|
else if (notGroupDetail.MaterielType == 2)
|
{
|
stockInfo.WarehouseId = 5;
|
}
|
|
if (notGroupDetail == null)
|
{
|
return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成");
|
}
|
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
|
{
|
MaterielCode = notGroupDetail.MaterielCode,
|
MaterielName = notGroupDetail.MaterielName,
|
OrderNo = inboundOrder.OrderNo,
|
BatchNo = notGroupDetail.BatchNo,
|
LinId = notGroupDetail.LinId,
|
StockQuantity = model.Quantity,
|
Status = (int)StockStatusEmun.组盘暂存,
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
Id = notGroupDetail.LinId.ObjToInt(),
|
DeliveryNote = model.DeliveryNote,
|
SupplierBatch = notGroupDetail.SupplierBatch,
|
MaterieSpec = notGroupDetail.MaterieSpec,
|
OrinalLocation = notGroupDetail.OrinalLocation
|
};
|
|
if (stockInfo.Id > 0)
|
{
|
stockInfoDetail.StockId = stockInfo.Id;
|
}
|
stockInfo.Details.Add(stockInfoDetail);
|
|
stockInfoDetails.Add(stockInfoDetail);
|
|
decimal decimalReceiptQuantity = Convert.ToDecimal(notGroupDetail.ReceiptQuantity);
|
decimal decimalModelQuantity = Convert.ToDecimal(notGroupDetail.OrderQuantity);
|
decimal decimalOrderQuantity = Convert.ToDecimal(notGroupDetail.OrderQuantity);
|
decimalReceiptQuantity += model.Quantity;
|
// 检查是否超出订单数量
|
if (decimalReceiptQuantity > decimalOrderQuantity)
|
{
|
return WebResponseContent.Instance.Error($"组盘数量溢出{decimalReceiptQuantity - decimalOrderQuantity}");
|
}
|
// 转回float类型存储,但比较和计算都使用decimal完成
|
notGroupDetail.ReceiptQuantity = Convert.ToDecimal(decimalReceiptQuantity);
|
if (notGroupDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
|
{
|
notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
|
}
|
}
|
|
decimal totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
|
|
inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
|
_unitOfWorkManage.BeginTran();
|
if (stockInfo.Id == 0)
|
{
|
_stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
|
}
|
else
|
{
|
_stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo).Include(x => x.Details, new UpdateNavOptions() { OneToManyInsertOrUpdate = true }).ExecuteCommand();
|
}
|
_inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrder.Details);
|
_inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
|
_unitOfWorkManage.CommitTran();
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
content = WebResponseContent.Instance.Error(ex.Message);
|
}
|
finally
|
{
|
|
}
|
return content;
|
}
|
|
/// <summary>
|
/// 成品组盘
|
/// </summary>
|
/// <param name="materielGroupDTO"></param>
|
/// <returns></returns>
|
#region
|
public WebResponseContent CPMaterielGroup(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
var orderNo = saveModel.MainData["orderNo"].ToString();
|
var palletCode = saveModel.MainData["palletCode"].ToString();
|
var warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
|
var serialNumbers = new List<string>();
|
var quantities = new List<decimal>();
|
var lotNos = new List<string>();
|
var materielCodes = new List<string>();
|
// 获取仓库信息
|
Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == warehouseId);
|
if (warehouse == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该仓库信息");
|
}
|
|
// 获取入库单信息
|
Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>()
|
.Where(x => x.OrderNo == orderNo && x.WarehouseId == warehouse.WarehouseId)
|
.Includes(x => x.Details)
|
.First();
|
|
if (inboundOrder == null || inboundOrder.Details == null || inboundOrder.Details.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单信息");
|
}
|
|
// 批量查询所有相关箱号的CP入库单明细
|
List<Dt_CPInboundOrderDetail> CPinboundOrderDetails = BaseDal.Db.Queryable<Dt_CPInboundOrderDetail>()
|
.LeftJoin<Dt_InboundOrderDetail>((cp, d) => cp.OrderDetailId == d.Id)
|
.LeftJoin<Dt_InboundOrder>((cp, d, o) => d.OrderId == o.Id)
|
.Where((cp, d, o) =>
|
o.OrderNo == orderNo &&
|
o.WarehouseId == warehouse.WarehouseId
|
)
|
.Select((cp, d, o) => cp)
|
.ToList();
|
|
//float totalQty = CPinboundOrderDetails.Sum(x => x.QtyOfpcs);
|
|
|
// 按照箱号分组,用于后续处理
|
var boxCodesToCheck = CPinboundOrderDetails
|
.Select(x => x.BoxCode)
|
.Where(bc => !string.IsNullOrEmpty(bc))
|
.Distinct()
|
.ToList();
|
|
|
// 3. 查询这些箱号是否已存在于库存中
|
var existingStockBoxCodes = _stockRepository.StockInfoRepository.Db
|
.Queryable<Dt_StockInfo>()
|
.LeftJoin<Dt_StockInfoDetail>((s, d) => s.Id == d.StockId)
|
.LeftJoin<Dt_StockInfoDetailCP>((s, d, cp) => d.Id == cp.StockDetailId)
|
.Where((s, d, cp) => boxCodesToCheck.Contains(cp.BoxCode) && !string.IsNullOrEmpty(cp.BoxCode))
|
.Select((s, d, cp) => cp.BoxCode)
|
.Distinct()
|
.ToList();
|
|
// 4. 检查是否有重复
|
if (existingStockBoxCodes.Any())
|
{
|
return WebResponseContent.Instance.Error($"以下箱号已在库存中:{string.Join(",", existingStockBoxCodes)}");
|
}
|
|
// 获取所有相关的入库单明细ID
|
var orderDetailIds = CPinboundOrderDetails.Select(x => x.OrderDetailId).Distinct().ToList();
|
|
// 查询对应的入库单明细
|
List<Dt_InboundOrderDetail> inboundOrderDetails = BaseDal.Db.Queryable<Dt_InboundOrderDetail>()
|
.Where(x => orderDetailIds.Contains(x.Id))
|
.ToList();
|
|
if (inboundOrderDetails.Sum(x => x.OrderQuantity) <= inboundOrderDetails.Sum(x => x.ReceiptQuantity))
|
{
|
return WebResponseContent.Instance.Error($"此单据已全部组盘完成");
|
}
|
|
// 按订单明细ID分组,检查每个明细的所有箱号是否都扫描了
|
var detailsByOrderDetailId = CPinboundOrderDetails
|
.GroupBy(x => x.OrderDetailId)
|
.ToDictionary(g => g.Key, g => g.ToList());
|
|
// 获取相关的订单明细
|
List<Dt_InboundOrderDetail> orderDetails = new List<Dt_InboundOrderDetail>();
|
List<Dt_InboundOrderDetail> detailsToUpdate = new List<Dt_InboundOrderDetail>();
|
|
// 检查每个订单明细是否完成了所有箱号的扫描
|
foreach (var kvp in detailsByOrderDetailId)
|
{
|
int orderDetailId = kvp.Key;
|
var cpDetails = kvp.Value;
|
|
// 获取订单明细
|
var orderDetail = inboundOrder.Details.FirstOrDefault(x => x.Id == orderDetailId);
|
if (orderDetail == null)
|
{
|
orderDetail = BaseDal.Db.Queryable<Dt_InboundOrderDetail>()
|
.First(x => x.Id == orderDetailId);
|
}
|
|
if (orderDetail == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到订单明细ID:{orderDetailId}");
|
}
|
|
orderDetails.Add(orderDetail);
|
|
// 标记该明细为已完成组盘
|
orderDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
|
var recqty = orderDetail.ReceiptQuantity;
|
float totalQty = cpDetails.Sum(item => item.QtyOfpcs);
|
orderDetail.ReceiptQuantity = (decimal)totalQty + recqty; // 收货数量等于订单数量
|
|
detailsToUpdate.Add(orderDetail);
|
}
|
|
|
|
// 检查托盘是否已存在
|
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db
|
.Queryable<Dt_StockInfo>()
|
.Where(x => x.PalletCode == palletCode)
|
.First();
|
|
if (stockInfo == null)
|
{
|
// 创建新托盘
|
stockInfo = new Dt_StockInfo()
|
{
|
BatchNo = "", // 使用入库单批次号
|
PalletCode = palletCode,
|
PalletType = GetPalletType(warehouse, palletCode),
|
IsFull = true,
|
StockStatus = (int)StockStatusEmun.组盘暂存,
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
MaterialType = (int)InventoryMaterialType.原材料,
|
Materialweight = 0,
|
Wlstatus = (int)InventoryMaterialStatus.合格,
|
Mgeneratetime = DateTime.Now,
|
WarehouseId = warehouse.WarehouseId,
|
System = inboundOrder.System,
|
Details = new List<Dt_StockInfoDetail>()
|
};
|
}
|
else
|
{
|
// 如果托盘已存在,检查是否已经是组盘暂存状态
|
if (stockInfo.StockStatus != (int)StockStatusEmun.组盘暂存)
|
{
|
return WebResponseContent.Instance.Error($"托盘号重复,该托盘已组过物料");
|
}
|
}
|
|
List<Dt_CPInboundOrderDetail> cPInboundOrderDetail = new List<Dt_CPInboundOrderDetail>();
|
// 创建库存明细 - 按订单明细创建
|
foreach (var orderDetail in orderDetails)
|
{
|
// 获取该明细对应的所有箱号
|
var detailBoxCodes = detailsByOrderDetailId[orderDetail.Id]
|
.Select(x => x.BoxCode)
|
.ToList();
|
|
cPInboundOrderDetail = BaseDal.Db.Queryable<Dt_CPInboundOrderDetail>().Where(x => detailBoxCodes.Contains(x.BoxCode)).ToList();
|
|
List<Dt_StockInfoDetailCP> stockInfoDetailCP = new List<Dt_StockInfoDetailCP>();
|
foreach (var item in cPInboundOrderDetail)
|
{
|
Dt_StockInfoDetailCP stockInfoDetailCP1 = new Dt_StockInfoDetailCP()
|
{
|
BoxId = item.BoxId,
|
BoxCode = item.BoxCode,
|
DateCode = item.DateCode,
|
JobId = item.JobId,
|
PartNum = item.PartNum,
|
QtyOfpcs = item.QtyOfpcs,
|
QtyOfxout = item.QtyOfxout,
|
CPStockDetailStatus = (int)StockStatusEmun.组盘暂存,
|
LPNNO = item.LPNNO,
|
OrinalLocation = item.OrinalLocation,
|
Creater = "上游WMS",
|
};
|
stockInfoDetailCP.Add(stockInfoDetailCP1);
|
|
item.CPOrderDetailStatus = InOrderStatusEnum.入库中.ObjToInt();
|
}
|
|
// 创建库存明细
|
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
|
{
|
MaterielCode = orderDetail.MaterielCode,
|
MaterielName = orderDetail.MaterielName,
|
OrderNo = inboundOrder.OrderNo,
|
BatchNo = orderDetail.BatchNo,
|
SupplierBatch = orderDetail.SupplierBatch,
|
LinId = orderDetail.LinId,
|
StockQuantity = (decimal)cPInboundOrderDetail.Sum(item => item.QtyOfpcs),
|
Status = (int)StockStatusEmun.组盘暂存,
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
Id = orderDetail.LinId.ObjToInt(),
|
//DeliveryNote = orderDetail.DeliveryNote,
|
MaterieSpec = orderDetail.MaterieSpec,
|
StockDetails = stockInfoDetailCP,
|
OrinalLocation = orderDetail.OrinalLocation
|
};
|
|
if (stockInfo.Id > 0)
|
{
|
stockInfoDetail.StockId = stockInfo.Id;
|
}
|
stockInfo.Details.Add(stockInfoDetail);
|
}
|
|
// 检查入库单是否所有明细都已完成组盘
|
bool allDetailsCompleted = inboundOrder.Details.All(x =>
|
detailsToUpdate.Any(d => d.Id == x.Id) ||
|
x.OrderDetailStatus == OrderDetailStatusEnum.GroupAndInbound.ObjToInt());
|
|
|
|
// 事务处理
|
_unitOfWorkManage.BeginTran();
|
try
|
{
|
if (stockInfo.Id == 0)
|
{
|
_stockRepository.StockInfoRepository.Db.InsertNav(stockInfo)
|
.Include(x => x.Details).ThenInclude(x => x.StockDetails)
|
.ExecuteCommand();
|
}
|
else
|
{
|
_stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo)
|
.Include(x => x.Details, new UpdateNavOptions()
|
{
|
OneToManyInsertOrUpdate = true
|
}).ThenInclude(x => x.StockDetails)
|
.ExecuteCommand();
|
}
|
|
// 更新订单明细
|
if (detailsToUpdate.Count > 0)
|
{
|
_inboundRepository.InboundOrderDetailRepository.UpdateData(detailsToUpdate);
|
}
|
|
// 更新订单
|
_inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
|
|
_cPInboundOrderDetailRepository.UpdateData(cPInboundOrderDetail);
|
|
_unitOfWorkManage.CommitTran();
|
|
content = WebResponseContent.Instance.OK("组盘成功");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
throw new Exception($"组盘事务处理失败:{ex.Message}", ex);
|
}
|
}
|
catch (Exception ex)
|
{
|
content = WebResponseContent.Instance.Error($"组盘失败:{ex.Message}");
|
}
|
|
return content;
|
}
|
#endregion
|
|
#region 弃用
|
public WebResponseContent CP1MaterielGroup(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
var orderNo = saveModel.MainData["orderNo"].ToString();
|
var palletCode = saveModel.MainData["palletCode"].ToString();
|
var warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
|
var serialNumbers = new List<string>();
|
var quantities = new List<decimal>();
|
var lotNos = new List<string>();
|
var materielCodes = new List<string>();
|
|
foreach (var item in saveModel.DelKeys)
|
{
|
var delKeyDict = item as IDictionary<string, object>;
|
if (delKeyDict == null)
|
{
|
string json = JsonConvert.SerializeObject(item);
|
delKeyDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
|
}
|
|
// 处理序列号
|
if (!delKeyDict.TryGetValue("serialNumber", out object serialNumberObj) || serialNumberObj == null)
|
{
|
return WebResponseContent.Instance.Error("缺少serialNumber字段或值为空");
|
}
|
|
string serialNumber = serialNumberObj.ToString();
|
if (string.IsNullOrWhiteSpace(serialNumber))
|
{
|
return WebResponseContent.Instance.Error("serialNumber的值为空");
|
}
|
serialNumbers.Add(serialNumber);
|
}
|
// 获取仓库信息
|
Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == warehouseId);
|
if (warehouse == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该仓库信息");
|
}
|
|
// 获取入库单信息
|
Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>()
|
.Where(x => x.OrderNo == orderNo && x.WarehouseId == warehouse.WarehouseId)
|
.Includes(x => x.Details)
|
.First();
|
|
if (inboundOrder == null || inboundOrder.Details == null || inboundOrder.Details.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单信息");
|
}
|
|
// 批量查询所有相关箱号的CP入库单明细
|
List<Dt_CPInboundOrderDetail> CPinboundOrderDetails = BaseDal.Db.Queryable<Dt_CPInboundOrderDetail>()
|
.LeftJoin<Dt_InboundOrderDetail>((cp, d) => cp.OrderDetailId == d.Id)
|
.LeftJoin<Dt_InboundOrder>((cp, d, o) => d.OrderId == o.Id)
|
.Where((cp, d, o) =>
|
o.OrderNo == orderNo &&
|
o.WarehouseId == warehouse.WarehouseId &&
|
serialNumbers.Contains(cp.BoxCode)
|
)
|
.Select((cp, d, o) => cp)
|
.ToList();
|
|
//float totalQty = CPinboundOrderDetails.Sum(x => x.QtyOfpcs);
|
|
|
// 验证查询到的数据数量是否匹配
|
if (CPinboundOrderDetails.Count < serialNumbers.Count)
|
{
|
return WebResponseContent.Instance.Error($"未找到所有对应的箱号信息,找到{CPinboundOrderDetails.Count}条,期望{serialNumbers.Count}条");
|
}
|
|
// 按照箱号分组,用于后续处理
|
var cpDetailsByBoxCode = CPinboundOrderDetails
|
.GroupBy(x => x.BoxCode)
|
.ToDictionary(g => g.Key, g => g.ToList());
|
|
|
var existingStockBoxCodes = _stockRepository.StockInfoRepository.Db
|
.Queryable<Dt_StockInfo>()
|
.LeftJoin<Dt_StockInfoDetail>((s, d) => s.Id == d.StockId)
|
.LeftJoin<Dt_StockInfoDetailCP>((s, d, cp) => d.Id == cp.StockDetailId)
|
.Where((s, d, cp) =>
|
serialNumbers.Contains(cp.BoxCode))
|
.Select((s, d, cp) => cp.BoxCode)
|
.Distinct()
|
.ToList();
|
|
if (existingStockBoxCodes.Any())
|
{
|
return WebResponseContent.Instance.Error($"以下箱号已在库存中:{string.Join(",", existingStockBoxCodes)}");
|
}
|
|
// 获取所有相关的入库单明细ID
|
var orderDetailIds = CPinboundOrderDetails.Select(x => x.OrderDetailId).Distinct().ToList();
|
|
// 查询对应的入库单明细
|
List<Dt_InboundOrderDetail> inboundOrderDetails = BaseDal.Db.Queryable<Dt_InboundOrderDetail>()
|
.Where(x => orderDetailIds.Contains(x.Id))
|
.ToList();
|
|
if (inboundOrderDetails.Sum(x => x.OrderQuantity) <= inboundOrderDetails.Sum(x => x.ReceiptQuantity))
|
{
|
return WebResponseContent.Instance.Error($"此单据已全部组盘完成");
|
}
|
|
// 按订单明细ID分组,检查每个明细的所有箱号是否都扫描了
|
var detailsByOrderDetailId = CPinboundOrderDetails
|
.GroupBy(x => x.OrderDetailId)
|
.ToDictionary(g => g.Key, g => g.ToList());
|
|
// 获取相关的订单明细
|
List<Dt_InboundOrderDetail> orderDetails = new List<Dt_InboundOrderDetail>();
|
List<Dt_InboundOrderDetail> detailsToUpdate = new List<Dt_InboundOrderDetail>();
|
|
// 检查每个订单明细是否完成了所有箱号的扫描
|
foreach (var kvp in detailsByOrderDetailId)
|
{
|
int orderDetailId = kvp.Key;
|
var cpDetails = kvp.Value;
|
|
// 获取订单明细
|
var orderDetail = inboundOrder.Details.FirstOrDefault(x => x.Id == orderDetailId);
|
if (orderDetail == null)
|
{
|
orderDetail = BaseDal.Db.Queryable<Dt_InboundOrderDetail>()
|
.First(x => x.Id == orderDetailId);
|
}
|
|
if (orderDetail == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到订单明细ID:{orderDetailId}");
|
}
|
|
orderDetails.Add(orderDetail);
|
|
// 标记该明细为已完成组盘
|
orderDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
|
var recqty = orderDetail.ReceiptQuantity;
|
float totalQty = cpDetails.Sum(item => item.QtyOfpcs);
|
orderDetail.ReceiptQuantity = (decimal)totalQty + recqty; // 收货数量等于订单数量
|
|
detailsToUpdate.Add(orderDetail);
|
}
|
|
|
|
// 检查托盘是否已存在
|
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db
|
.Queryable<Dt_StockInfo>()
|
.Where(x => x.PalletCode == palletCode)
|
.First();
|
|
if (stockInfo == null)
|
{
|
// 创建新托盘
|
stockInfo = new Dt_StockInfo()
|
{
|
BatchNo = "", // 使用入库单批次号
|
PalletCode = palletCode,
|
PalletType = GetPalletType(warehouse, palletCode),
|
IsFull = true,
|
StockStatus = (int)StockStatusEmun.组盘暂存,
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
MaterialType = (int)InventoryMaterialType.原材料,
|
Materialweight = 0,
|
Wlstatus = (int)InventoryMaterialStatus.合格,
|
Mgeneratetime = DateTime.Now,
|
WarehouseId = warehouse.WarehouseId,
|
System = inboundOrder.System,
|
Details = new List<Dt_StockInfoDetail>()
|
};
|
}
|
else
|
{
|
// 如果托盘已存在,检查是否已经是组盘暂存状态
|
if (stockInfo.StockStatus != (int)StockStatusEmun.组盘暂存)
|
{
|
return WebResponseContent.Instance.Error($"托盘号重复,该托盘已组过物料");
|
}
|
}
|
|
List<Dt_CPInboundOrderDetail> cPInboundOrderDetail = new List<Dt_CPInboundOrderDetail>();
|
// 创建库存明细 - 按订单明细创建
|
foreach (var orderDetail in orderDetails)
|
{
|
// 获取该明细对应的所有箱号
|
var detailBoxCodes = detailsByOrderDetailId[orderDetail.Id]
|
.Select(x => x.BoxCode)
|
.ToList();
|
|
cPInboundOrderDetail = BaseDal.Db.Queryable<Dt_CPInboundOrderDetail>().Where(x => detailBoxCodes.Contains(x.BoxCode)).ToList();
|
|
List<Dt_StockInfoDetailCP> stockInfoDetailCP = new List<Dt_StockInfoDetailCP>();
|
foreach (var item in cPInboundOrderDetail)
|
{
|
Dt_StockInfoDetailCP stockInfoDetailCP1 = new Dt_StockInfoDetailCP()
|
{
|
BoxId = item.BoxId,
|
BoxCode = item.BoxCode,
|
DateCode = item.DateCode,
|
JobId = item.JobId,
|
PartNum = item.PartNum,
|
QtyOfpcs = item.QtyOfpcs,
|
QtyOfxout = item.QtyOfxout,
|
CPStockDetailStatus = (int)StockStatusEmun.组盘暂存,
|
Creater = "上游WMS",
|
};
|
stockInfoDetailCP.Add(stockInfoDetailCP1);
|
|
item.CPOrderDetailStatus = InOrderStatusEnum.入库中.ObjToInt();
|
}
|
|
// 创建库存明细
|
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
|
{
|
MaterielCode = orderDetail.MaterielCode,
|
MaterielName = orderDetail.MaterielName,
|
OrderNo = inboundOrder.OrderNo,
|
BatchNo = orderDetail.BatchNo,
|
SupplierBatch = orderDetail.SupplierBatch,
|
LinId = orderDetail.LinId,
|
StockQuantity = (decimal)cPInboundOrderDetail.Sum(item => item.QtyOfpcs),
|
Status = (int)StockStatusEmun.组盘暂存,
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
Id = orderDetail.LinId.ObjToInt(),
|
//DeliveryNote = orderDetail.DeliveryNote,
|
MaterieSpec = orderDetail.MaterieSpec,
|
StockDetails = stockInfoDetailCP,
|
OrinalLocation = orderDetail.OrinalLocation
|
};
|
|
if (stockInfo.Id > 0)
|
{
|
stockInfoDetail.StockId = stockInfo.Id;
|
}
|
stockInfo.Details.Add(stockInfoDetail);
|
}
|
|
// 检查入库单是否所有明细都已完成组盘
|
bool allDetailsCompleted = inboundOrder.Details.All(x =>
|
detailsToUpdate.Any(d => d.Id == x.Id) ||
|
x.OrderDetailStatus == OrderDetailStatusEnum.GroupAndInbound.ObjToInt());
|
|
|
|
// 事务处理
|
_unitOfWorkManage.BeginTran();
|
try
|
{
|
if (stockInfo.Id == 0)
|
{
|
_stockRepository.StockInfoRepository.Db.InsertNav(stockInfo)
|
.Include(x => x.Details).ThenInclude(x => x.StockDetails)
|
.ExecuteCommand();
|
}
|
else
|
{
|
_stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo)
|
.Include(x => x.Details, new UpdateNavOptions()
|
{
|
OneToManyInsertOrUpdate = true
|
}).ThenInclude(x => x.StockDetails)
|
.ExecuteCommand();
|
}
|
|
// 更新订单明细
|
if (detailsToUpdate.Count > 0)
|
{
|
_inboundRepository.InboundOrderDetailRepository.UpdateData(detailsToUpdate);
|
}
|
|
// 更新订单
|
_inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
|
|
_cPInboundOrderDetailRepository.UpdateData(cPInboundOrderDetail);
|
|
_unitOfWorkManage.CommitTran();
|
|
content = WebResponseContent.Instance.OK("组盘成功");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
throw new Exception($"组盘事务处理失败:{ex.Message}", ex);
|
}
|
}
|
catch (Exception ex)
|
{
|
content = WebResponseContent.Instance.Error($"组盘失败:{ex.Message}");
|
}
|
|
return content;
|
}
|
#endregion
|
|
public string ReceiveWMSTaskin = WIDESEA_Core.Helper.AppSettings.Configuration["ReceiveWMSTaskin"];
|
|
/// <summary>
|
/// 组盘合托
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
public WebResponseContent SYMaterielGroup(SaveModel saveModel)
|
{
|
|
WebResponseContent webResponseContent = new WebResponseContent();
|
try
|
{
|
var soussAddress = saveModel.MainData["soussAddress"];
|
var targetAddress = saveModel.MainData["targetAddress"];
|
|
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Includes(x => x.Details).Where(x => x.PalletCode == soussAddress).First();
|
Dt_StockInfo targetstockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Includes(x => x.Details).Where(x => x.PalletCode == targetAddress).First();
|
Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == targetstockInfo.WarehouseId);
|
if (stockInfo == null || targetstockInfo == null)
|
{
|
throw new Exception("库存未找到托盘号");
|
}
|
|
var sameItems = from sourceItem in stockInfo.Details
|
join targetItem in targetstockInfo.Details
|
on new
|
{
|
sourceItem.BatchNo,
|
sourceItem.MaterielName,
|
sourceItem.MaterielCode
|
}
|
equals new
|
{
|
targetItem.BatchNo,
|
targetItem.MaterielName,
|
targetItem.MaterielCode
|
}
|
select new
|
{
|
SourceItem = sourceItem,
|
TargetItem = targetItem,
|
BatchNo = sourceItem.BatchNo,
|
MaterialCode = sourceItem.MaterielCode,
|
MaterialType = sourceItem.MaterielName
|
};
|
|
var matchedSourceItemIds = sameItems.Select(x => x.SourceItem.Id).ToList();
|
|
foreach (var item in stockInfo.Details)
|
{
|
if (!matchedSourceItemIds.Contains(item.Id))
|
{
|
item.StockId = targetstockInfo.Id;
|
}
|
}
|
var differentItems = stockInfo.Details
|
.Where(x => !matchedSourceItemIds.Contains(x.Id))
|
.ToList();
|
targetstockInfo.Details = targetstockInfo.Details
|
.Where(x => !matchedSourceItemIds.Contains(x.Id))
|
.Concat(differentItems)
|
.ToList();
|
if (warehouse.WarehouseCode == "SC02_CP")
|
{
|
warehouse.WarehouseCode = "SC01_CP";
|
}
|
if (warehouse.WarehouseCode == "SC02_BC")
|
{
|
warehouse.WarehouseCode = "SC01_BC";
|
}
|
var houseSyncretism = new HouseSyncretism
|
{
|
ApiType = "InventoryMoveController",
|
Method = "AsrsSubmitMoveDatas",
|
|
Parameters = new List<HouseSyncretism.Parame>
|
{
|
new HouseSyncretism.Parame {
|
Value = stockInfo.Details.Select(g => new Parame.Syncretism
|
{
|
Lpn = stockInfo.PalletCode,
|
MoveType = 0,
|
WareHouseCode = warehouse.WarehouseCode,
|
ItemCode = g.MaterielCode,
|
MoveNumber = g.StockQuantity,
|
LotNo = g.BatchNo,
|
WipBatch = g.BatchNo,
|
LocationName = stockInfo.LocationCode,
|
TargetLocName = targetstockInfo.LocationCode,
|
TargetLpn = targetstockInfo.PalletCode,
|
|
}).ToList()
|
}
|
}
|
};
|
var authResult = AuthenticateWithWMS();
|
if (authResult.IsSuccess)
|
{
|
houseSyncretism.Context = new Dictionary<string, string>
|
{
|
{ "Ticket", authResult.Ticket },
|
{ "InvOrgId", authResult.InvOrgId }
|
|
};
|
|
var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskin, houseSyncretism, "立库入库数量回传WMS");
|
if (!response.Success)
|
{
|
throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
|
}
|
|
}
|
_unitOfWorkManage.BeginTran();
|
foreach (var sameItem in sameItems)
|
{
|
sameItem.TargetItem.StockQuantity += sameItem.SourceItem.StockQuantity;
|
_stockRepository.StockInfoDetailRepository.UpdateData(sameItem.TargetItem);
|
_stockRepository.StockInfoDetailRepository.DeleteData(sameItem.SourceItem);
|
}
|
_stockRepository.StockInfoRepository.UpdateData(targetstockInfo);
|
_stockRepository.StockInfoDetailRepository.UpdateData(targetstockInfo.Details);
|
_stockRepository.StockInfoRepository.DeleteData(stockInfo);
|
|
_unitOfWorkManage.CommitTran();
|
webResponseContent = WebResponseContent.Instance.OK("合托成功");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
webResponseContent = WebResponseContent.Instance.Error($"组盘失败:{ex.Message}");
|
}
|
return webResponseContent;
|
}
|
|
private (bool IsSuccess, string Ticket, string InvOrgId) AuthenticateWithWMS()
|
{
|
var authentication = new Authentication
|
{
|
ApiType = "AuthenticationController",
|
Parameters = new List<Parameter>
|
{
|
new Parameter { Value = "LK-Admin" },
|
new Parameter { Value = "LK-Admin" }
|
},
|
Method = "Login",
|
};
|
|
var response = HttpHelper.Post<WebResponseContent>(ReceiveWMSTaskin, authentication, "登录WMS账号");
|
|
if (response.Context != null)
|
{
|
return (true, response.Context["Ticket"].ToString(), response.Context["InvOrgId"].ToString());
|
}
|
|
return (false, null, null);
|
}
|
|
|
public int GetPalletType(Dt_Warehouse warehouse, string palletCode)
|
{
|
if (warehouse.WarehouseCode.Contains("BC"))
|
{
|
Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.CodeStartStr == palletCode.Substring(0, 3));
|
if (palletTypeInfo == null)
|
{
|
throw new Exception($"托盘号错误");
|
}
|
return palletTypeInfo.PalletType;
|
}
|
else
|
{
|
Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.CodeStartStr == palletCode.Substring(0, 2));
|
if (palletTypeInfo == null)
|
{
|
throw new Exception($"托盘号错误");
|
}
|
return palletTypeInfo.PalletType;
|
}
|
return 0;
|
}
|
/// <summary>
|
/// 判断正确时间格式
|
/// </summary>
|
public WebResponseContent IsValidMCDates(List<MatSerNumAnalysisModel> analysisModels)
|
{
|
string[] effDates = analysisModels.Select(x => x.EffectiveDate).Distinct().ToArray();
|
string[] ProDates = analysisModels.Select(x => x.ProductionDate).Distinct().ToArray();
|
foreach (string effDate in effDates)
|
{
|
string format = "yyyy-MM-dd"; // 目标格式
|
DateTime parsedDate;
|
// 解析并验证格式
|
bool isValid = DateTime.TryParseExact(
|
effDate,
|
format,
|
CultureInfo.InvariantCulture,
|
DateTimeStyles.None,
|
out parsedDate
|
);
|
|
if (!isValid)
|
{
|
return WebResponseContent.Instance.Error("格式无效或日期不合法");
|
}
|
}
|
foreach (string ProDate in ProDates)
|
{
|
string format = "yyyy-MM-dd"; // 目标格式
|
DateTime parsedDate;
|
// 解析并验证格式
|
bool isValid = DateTime.TryParseExact(
|
ProDate,
|
format,
|
CultureInfo.InvariantCulture,
|
DateTimeStyles.None,
|
out parsedDate
|
);
|
|
if (!isValid)
|
{
|
return WebResponseContent.Instance.Error("格式无效或日期不合法");
|
}
|
}
|
return WebResponseContent.Instance.OK();
|
}
|
|
/// <summary>
|
/// 入库单据下发
|
/// </summary>
|
/// <param name="orderAddDTO"></param>
|
/// <returns></returns>
|
public WebResponseContent AddInboundOrders(HouseInbound model)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
_unitOfWorkManage.BeginTran();
|
foreach (var item in model.DetailList)
|
{
|
//获取物料信息
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == item.MaterielCode);
|
if (materielInfo == null)
|
{
|
return content.Error($"物料{item.MaterielCode}不存在!");
|
}
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == model.InWarehouse);
|
if (warehouse == null)
|
{
|
return content.Error($"未找到仓库信息");
|
}
|
if (warehouse.WarehouseCode.Contains("CP"))
|
{
|
Dt_InboundOrder inboundOrderOld = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == model.AsnNo).Includes(x => x.Details).First();
|
|
if (inboundOrderOld != null)
|
{
|
if (inboundOrderOld.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt())
|
{
|
inboundOrderOld.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_inboundRepository.InboundOrderRepository.UpdateData(inboundOrderOld);
|
}
|
Dt_InboundOrderDetail orderDetail1 = BaseDal.Db.Queryable<Dt_InboundOrderDetail>().Where(x => x.OrderId == inboundOrderOld.Id).First();
|
Dt_InboundOrderDetail? inboundOrderDetailOld = inboundOrderOld.Details?.FirstOrDefault(x => x.LinId == item.LinId && x.MaterielCode == item.MaterielCode);
|
if (inboundOrderDetailOld != null)
|
{
|
inboundOrderDetailOld.OrderQuantity += item.OrderQuantity;
|
_inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetailOld);
|
}
|
else
|
{
|
List<Dt_CPInboundOrderDetail> cPInboundOrderDetail = new List<Dt_CPInboundOrderDetail>();
|
foreach (var list in item.BoxList)
|
{
|
Dt_CPInboundOrderDetail cPInboundOrderDetail1 = new Dt_CPInboundOrderDetail()
|
{
|
BoxId = (float)list.BoxId,
|
BoxCode = list.BoxCode,
|
DateCode = list.DateCode,
|
JobId = (float)list.JobId,
|
PartNum = list.PartNum,
|
QtyOfpcs = (float)list.QtyOfpcs,
|
QtyOfxout = (float)list.QtyOfxout,
|
CPOrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
|
LPNNO = list.LPNNO,
|
OrinalLocation = list.OrinalLocation,
|
Creater = "上游WMS",
|
};
|
cPInboundOrderDetail.Add(cPInboundOrderDetail1);
|
}
|
|
Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail()
|
{
|
OrderId = orderDetail1.OrderId,
|
MaterielCode = item.MaterielCode,
|
BatchNo = item.BatchNo,
|
OrderQuantity = item.OrderQuantity,
|
ReceiptQuantity = 0,
|
OverInQuantity = 0,
|
OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
|
LinId = item.LinId,
|
LPNNo = item.LPNNo,
|
MaterielName = item.MaterielName,
|
MaterieSpec = item.MaterieSpec,
|
Creater = "上游WMS",
|
SupplierBatch = item.SupplierBatch,
|
OrinalLocation = item.OrinalLocation,
|
CPDetails = cPInboundOrderDetail
|
};
|
//_inboundRepository.InboundOrderDetailRepository.AddData(orderDetail);
|
Db.InsertNav(orderDetail).Include(x => x.CPDetails).ExecuteCommand();
|
}
|
}
|
else
|
{
|
List<Dt_CPInboundOrderDetail> cPInboundOrderDetail = new List<Dt_CPInboundOrderDetail>();
|
foreach (var list in item.BoxList)
|
{
|
Dt_CPInboundOrderDetail cPInboundOrderDetail1 = new Dt_CPInboundOrderDetail()
|
{
|
BoxId = (float)list.BoxId,
|
BoxCode = list.BoxCode,
|
DateCode = list.DateCode,
|
JobId = (float)list.JobId,
|
PartNum = list.PartNum,
|
QtyOfpcs = (float)list.QtyOfpcs,
|
QtyOfxout = (float)list.QtyOfxout,
|
CPOrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
|
LPNNO = list.LPNNO,
|
OrinalLocation = list.OrinalLocation,
|
Creater = "上游WMS",
|
};
|
cPInboundOrderDetail.Add(cPInboundOrderDetail1);
|
}
|
|
Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail()
|
{
|
MaterielCode = item.MaterielCode,
|
BatchNo = item.BatchNo,
|
OrderQuantity = item.OrderQuantity,
|
ReceiptQuantity = 0,
|
OverInQuantity = 0,
|
OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
|
LinId = item.LinId,
|
LPNNo = item.LPNNo,
|
MaterielName = item.MaterielName,
|
MaterieSpec = item.MaterieSpec,
|
Creater = "上游WMS",
|
SupplierBatch = item.SupplierBatch,
|
OrinalLocation = item.OrinalLocation,
|
CPDetails = cPInboundOrderDetail
|
};
|
Dt_InboundOrder inboundOrder = new Dt_InboundOrder()
|
{
|
OrderNo = model.AsnNo,
|
UpperOrderNo = model.AsnNo,
|
WarehouseId = warehouse.WarehouseId,
|
//SupplierId = "",
|
OrderStatus = InboundStatusEnum.未开始.ObjToInt(),
|
CreateType = CreateType.UpperSystemPush.ObjToInt(),
|
Remark = "",
|
TransactionCode = model.TransactionCode,
|
InoutType = model.OrderType,
|
OrderType = model.InoutType.ObjToInt(),
|
Creater = "上游WMS",
|
System = model.System,
|
Details = new List<Dt_InboundOrderDetail> { orderDetail }
|
};
|
//switch (model.OrderType)//单据类型
|
//{
|
// case 1:
|
// inboundOrder.OrderType = InOrderTypeEnum.Allocat.ObjToInt();
|
// break;
|
// case 3:
|
// inboundOrder.OrderType = InOrderTypeEnum.CustomerRecovery.ObjToInt();
|
// break;
|
// case 6:
|
// inboundOrder.OrderType = InOrderTypeEnum.SaleReturn.ObjToInt();
|
// break;
|
// default:
|
// break;
|
//};
|
|
|
Db.InsertNav(inboundOrder).Include(x => x.Details).ThenInclude(x => x.CPDetails).ExecuteCommand();
|
}
|
}
|
else
|
{
|
//if (item.SupplierBatch == null)
|
//{
|
// return content.Error("供应商批次不可为空");
|
//}
|
Dt_InboundOrder inboundOrderOld = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == model.AsnNo).Includes(x => x.Details).First();
|
|
if (inboundOrderOld != null)
|
{
|
if (inboundOrderOld.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt())
|
{
|
inboundOrderOld.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
_inboundRepository.InboundOrderRepository.UpdateData(inboundOrderOld);
|
}
|
Dt_InboundOrderDetail orderDetail1 = BaseDal.Db.Queryable<Dt_InboundOrderDetail>().Where(x => x.OrderId == inboundOrderOld.Id).First();
|
Dt_InboundOrderDetail? inboundOrderDetailOld = inboundOrderOld.Details?.FirstOrDefault(x => x.LinId == item.LinId && x.MaterielCode == item.MaterielCode);
|
if (inboundOrderDetailOld != null)
|
{
|
inboundOrderDetailOld.OrderQuantity += item.OrderQuantity;
|
inboundOrderDetailOld.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
|
_inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetailOld);
|
}
|
else
|
{
|
Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail()
|
{
|
OrderId = orderDetail1.OrderId,
|
MaterielCode = item.MaterielCode,
|
MaterielType = item.MaterielType,
|
BatchNo = item.BatchNo,
|
OrderQuantity = item.OrderQuantity,
|
ReceiptQuantity = 0,
|
OverInQuantity = 0,
|
OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
|
LinId = item.LinId,
|
LPNNo = item.LPNNo,
|
MaterielName = item.MaterielName,
|
MaterieSpec = item.MaterieSpec,
|
Creater = "上游WMS",
|
SupplierBatch = item.SupplierBatch
|
};
|
_inboundRepository.InboundOrderDetailRepository.AddData(orderDetail);
|
}
|
}
|
else
|
{
|
Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail()
|
{
|
MaterielType = item.MaterielType,
|
MaterielCode = item.MaterielCode,
|
BatchNo = item.BatchNo,
|
OrderQuantity = item.OrderQuantity,
|
ReceiptQuantity = 0,
|
OverInQuantity = 0,
|
OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
|
LinId = item.LinId,
|
LPNNo = item.LPNNo,
|
MaterielName = item.MaterielName,
|
MaterieSpec = item.MaterieSpec,
|
Creater = "上游WMS",
|
SupplierBatch = item.SupplierBatch
|
};
|
|
Dt_InboundOrder inboundOrder = new Dt_InboundOrder()
|
{
|
OrderNo = model.AsnNo,
|
UpperOrderNo = model.AsnNo,
|
WarehouseId = warehouse.WarehouseId,
|
//SupplierId = "",
|
OrderStatus = InboundStatusEnum.未开始.ObjToInt(),
|
CreateType = CreateType.UpperSystemPush.ObjToInt(),
|
Remark = "",
|
TransactionCode = model.TransactionCode,
|
InoutType = model.OrderType,
|
OrderType = model.InoutType.ObjToInt(),
|
Creater = "上游WMS",
|
System = model.System,
|
Details = new List<Dt_InboundOrderDetail> { orderDetail }
|
};
|
Db.InsertNav(inboundOrder).Include(x => x.Details).ExecuteCommand();
|
}
|
}
|
}
|
_unitOfWorkManage.CommitTran();
|
content = WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content = WebResponseContent.Instance.Error(ex.Message);
|
|
}
|
finally
|
{
|
|
}
|
return content;
|
}
|
/// <summary>
|
/// 盘点入库
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent InventoryIn(string name)
|
{
|
WebResponseContent content = new();
|
try
|
{
|
//Dt_StockInfoDetail stockInfoDetail = _stockService.StockInfoDetailService.Repository.QueryFirst(x => x.OrderNo == name);
|
////Dt_OutboundOrderDetail outboundOrderDetail=
|
//HouseInventoryIn houseInventoryIn1 = new HouseInventoryIn();
|
//houseInventoryIn1.No = name;
|
//InventoryIn inventoryIn = new InventoryIn();
|
//inventoryIn.LinId = stockInfoDetail.LinId;
|
////inventoryIn.LPN_No =stockInfoDetail.
|
//inventoryIn.MaterielCode = stockInfoDetail.MaterielCode;
|
//inventoryIn.OrderQuantity = stockInfoDetail.StockQuantity;
|
//inventoryIn.BatchNo = stockInfoDetail.BatchNo;
|
//inventoryIn.FinishQty = stockInfoDetail.FinishQty;
|
//inventoryIn.WarehouseCode =
|
// inventoryIn.StorageAreaCode =
|
// inventoryIn.StorageLocationCode =
|
// #region 验证数据
|
//(bool, string, object ?) result = CheckInboundOrderAddData(orderAddDTO1);
|
// if (!result.Item1) return content = WebResponseContent.Instance.Error(result.Item2);
|
// #endregion
|
|
// Dt_OutboundOrder inboundOrder = _mapper.Map<Dt_OutboundOrder>(orderAddDTO1);
|
// inboundOrder.OrderStatus = InboundStatusEnum.未开始.ObjToInt();
|
// inboundOrder.OrderType = OutOrderTypeEnum.OutInventory.ObjToInt();
|
// inboundOrder.Creater = "WMS";
|
// inboundOrder.CreateDate = DateTime.Now;
|
// bool a = BaseDal.Db.InsertNav(inboundOrder).Include(x => x.Details).ExecuteCommand();
|
content = WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
content = WebResponseContent.Instance.Error(ex.Message);
|
}
|
finally
|
{
|
|
}
|
return content;
|
}
|
/// <summary>
|
/// 入库单据取消
|
/// </summary>
|
/// <param name="houseInventoryIn"></param>
|
/// <returns></returns>
|
public WebResponseContent CancelIn(HouseCancelIn houseCancelIn)
|
{
|
WebResponseContent content = new();
|
try
|
{
|
InboundOrderAddDTO orderAddDTO1 = new InboundOrderAddDTO();
|
orderAddDTO1.OrderNo = houseCancelIn.AsnNo;
|
orderAddDTO1.Details = houseCancelIn.DetailList.DicToIEnumerable<InboundOrderDetailAddDTO>();
|
Dt_InboundOrder oldOutboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == orderAddDTO1.OrderNo).Includes(x => x.Details).First();
|
Dt_InboundOrderDetail dt_InboundOrderDetail = BaseDal.Db.Queryable<Dt_InboundOrderDetail>().Where(x => x.OrderId == oldOutboundOrder.Id).First();
|
if (oldOutboundOrder.OrderStatus != InboundStatusEnum.未开始.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error("该入库单任务已开始执行,不可取消");
|
}
|
oldOutboundOrder.OrderStatus = InboundStatusEnum.取消.ObjToInt();
|
BaseDal.UpdateData(oldOutboundOrder);
|
|
Dt_InboundOrder_Hty inboundOrder_Hty = new Dt_InboundOrder_Hty
|
{
|
OrderStatus = oldOutboundOrder.OrderStatus,
|
CreateType = oldOutboundOrder.CreateType,
|
//SourceId = oldOutboundOrder.SourceId,
|
UpperOrderNo = oldOutboundOrder.UpperOrderNo,
|
//OrderNo = oldOutboundOrder.OrderNo,
|
//OutWareHouse = oldOutboundOrder.OutWareHouse,
|
TransactionCode = oldOutboundOrder.TransactionCode,
|
InoutType = oldOutboundOrder.InoutType,
|
OrderType = oldOutboundOrder.OrderType,
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
};
|
_inboundOrderHtyService.AddData(inboundOrder_Hty);
|
foreach (var item in oldOutboundOrder.Details)
|
{
|
Dt_InboundOrderDetail_Hty dt_InboundOrderDetail_Hty = new Dt_InboundOrderDetail_Hty
|
{
|
OrderId = dt_InboundOrderDetail.OrderId,
|
MaterielCode = dt_InboundOrderDetail.MaterielCode,
|
MaterielName = dt_InboundOrderDetail.MaterielName,
|
BatchNo = dt_InboundOrderDetail.BatchNo,
|
OrderQuantity = dt_InboundOrderDetail.OrderQuantity,
|
ReceiptQuantity = dt_InboundOrderDetail.ReceiptQuantity,
|
OverInQuantity = dt_InboundOrderDetail.OverInQuantity,
|
OrderDetailStatus = dt_InboundOrderDetail.OrderDetailStatus,
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
};
|
_inboundOrderDetail_HtyService.AddData(dt_InboundOrderDetail_Hty);
|
_inboundOrderDetailService.DeleteData(item);
|
}
|
BaseDal.DeleteData(oldOutboundOrder);
|
content = WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
content = WebResponseContent.Instance.Error(ex.Message);
|
}
|
finally
|
{
|
|
}
|
return content;
|
}
|
|
public WebResponseContent GetInboundOrders(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
int pageNo = saveModel.MainData["pageNo"].ObjToInt();
|
string? orderNo = saveModel.MainData["orderNo"].ToString();
|
int warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
|
List<Dt_InboundOrder> dt_ReceiveOrders = new List<Dt_InboundOrder>();
|
if (string.IsNullOrEmpty(orderNo))
|
{
|
dt_ReceiveOrders = Db.Queryable<Dt_InboundOrder>().Where(x => x.OrderStatus < InboundStatusEnum.入库完成.ObjToInt() && x.WarehouseId == warehouseId).Includes(x => x.Details).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 50);
|
}
|
else
|
{
|
dt_ReceiveOrders = Db.Queryable<Dt_InboundOrder>().Where(x => (x.OrderNo.Contains(orderNo)) && x.OrderStatus < InboundStatusEnum.入库完成.ObjToInt() && x.WarehouseId == warehouseId).Includes(x => x.Details).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 50);
|
}
|
|
content.OK(data: dt_ReceiveOrders);
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// erp单据下发
|
/// </summary>
|
/// <param name="addInboundOrder"></param>
|
/// <returns></returns>
|
public WebResponseContent Save(AddInboundOrderModel addInboundOrder)
|
{
|
try
|
{
|
List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>();
|
Random random = new Random();
|
if (addInboundOrder.Details != null)
|
{
|
foreach (var model in addInboundOrder.Details)
|
{
|
// 生成3位随机数(1-999之间)
|
int randomNum = random.Next(1, 1000);
|
|
// 格式化当前日期为年月日(例如:20230820)
|
string datePart = DateTime.Now.ToString("yyyyMMdd");
|
Dt_InboundOrderDetail inboundOrderDetail = new Dt_InboundOrderDetail()
|
{
|
MaterielCode = model.MaterielCode,
|
MaterielName = model.MaterielName,
|
SupplierBatch = model.SupplierBatch,
|
OrderQuantity = model.OrderQuantity,
|
BatchNo = "PC" + $"{datePart}{randomNum}",
|
OrderDetailStatus = InOrderStatusEnum.未开始.ObjToInt(),
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
|
};
|
inboundOrderDetails.Add(inboundOrderDetail);
|
}
|
}
|
int randomNum2 = random.Next(1, 1000);
|
string datePart2 = DateTime.Now.ToString("yyyyMMdd");
|
Dt_InboundOrder erpProScrapSheet = new Dt_InboundOrder()
|
{
|
OrderNo = "WMSIN" + $"{datePart2}{randomNum2}",
|
UpperOrderNo = "WMSIN" + $"{datePart2}{randomNum2}",
|
WarehouseId = addInboundOrder.WarehouseId,
|
OrderType = OrderTypeEnum.生产入库单.ObjToInt(),
|
InoutType = InoutTypeEnum.OtherIn.ToString(),
|
OrderStatus = InOrderStatusEnum.未开始.ObjToInt(),
|
CreateType = OrderCreateTypeEnum.CreateInSystem.ObjToInt(),
|
System = "WMS",
|
Details = inboundOrderDetails,
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
};
|
_unitOfWorkManage.BeginTran();
|
Db.InsertNav(erpProScrapSheet).Include(x => x.Details).ExecuteCommand();
|
_unitOfWorkManage.CommitTran();
|
return WebResponseContent.Instance.OK();
|
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
|
}
|
|
public string CancelInMaterialWarehousing = WIDESEA_Core.Helper.AppSettings.Configuration["CancelInMaterialWarehousing"];
|
/// <summary>
|
/// 入库单据取消推送ERP
|
/// </summary>
|
/// <param name="orderNo"></param>
|
/// <returns></returns>
|
public WebResponseContent FeedbackInboundCanceERP(int[] keys)
|
{
|
try
|
{
|
List<Dt_InboundOrderDetail> inboundOrderDetails = _inboundRepository.InboundOrderDetailRepository.QueryData(x => keys.Contains(x.Id));
|
|
if (inboundOrderDetails == null || inboundOrderDetails.Count == 0)
|
{
|
return WebResponseContent.Instance.Error("未找到入库单明细信息");
|
}
|
if (inboundOrderDetails.FirstOrDefault(x => x.OrderDetailStatus > OrderDetailStatusEnum.New.ObjToInt() && x.OrderDetailStatus != OrderDetailStatusEnum.AssignOverPartial.ObjToInt()) != null)
|
{
|
return WebResponseContent.Instance.Error("所选入库单明细存在入库中或已完成");
|
}
|
Dt_InboundOrder inboundOrder = _inboundRepository.InboundOrderRepository.QueryFirst(x => x.Id == inboundOrderDetails[0].OrderId);
|
if (inboundOrder == null)
|
{
|
return WebResponseContent.Instance.Error("未通过该明细找到入库单信息");
|
}
|
if (!inboundOrder.System.Equals("ERP"))
|
{
|
return WebResponseContent.Instance.Error("该入库单据非ERP推送,无法取消");
|
}
|
List<FeedbackInboundOrderERP> feedbackInboundOrders = new List<FeedbackInboundOrderERP>();
|
foreach (var item in inboundOrderDetails)
|
{
|
FeedbackInboundOrderERP feedbackInbound = new FeedbackInboundOrderERP()
|
{
|
code = inboundOrder.UpperOrderNo,
|
itemId = item.LinId,
|
};
|
feedbackInboundOrders.Add(feedbackInbound);
|
}
|
|
var response = HttpHelper.Post<WebResponseContent>(CancelInMaterialWarehousing, feedbackInboundOrders, "入库明细取消回传ERP");
|
_unitOfWorkManage.BeginTran();
|
if (response.Code == 0)
|
{
|
_inboundRepository.InboundOrderDetailRepository.DeleteAndMoveIntoHty(inboundOrderDetails, OperateType.人工取消);
|
|
//检查该主订单是否还有剩余明细
|
int remainingDetailsCount = _inboundRepository.InboundOrderDetailRepository
|
.Db.Queryable<Dt_InboundOrderDetail>()
|
.Where(d => d.OrderId == inboundOrder.Id)
|
.Count();
|
//检查明细完成的个数
|
int overCount = _inboundRepository.InboundOrderDetailRepository
|
.Db.Queryable<Dt_InboundOrderDetail>()
|
.Where(d => d.OrderId == inboundOrder.Id && d.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt())
|
.Count();
|
// 如果没有剩余明细,再删除主订单
|
if (remainingDetailsCount == 0)
|
{
|
_inboundRepository.InboundOrderRepository.DeleteAndMoveIntoHty(inboundOrder, OperateType.人工取消);
|
}
|
//如果取消以后明细已经全部完成
|
if (remainingDetailsCount == overCount)
|
{
|
inboundOrder.OrderStatus = InOrderStatusEnum.入库完成.ObjToInt();
|
_inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
|
}
|
|
|
_unitOfWorkManage.CommitTran();
|
return WebResponseContent.Instance.OK();
|
}
|
else
|
{
|
throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
|
|
}
|
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
//反拣回库单
|
public WebResponseContent ReceiveReturnOrder(List<HouseReturnOrder> houseReturnOrder)
|
{
|
try
|
{
|
Random random = new Random();
|
List<Dt_ReturnOrder> returnOrders = new List<Dt_ReturnOrder>();
|
_unitOfWorkManage.BeginTran();
|
foreach (var item in houseReturnOrder)
|
{
|
int randomNum = random.Next(1, 1000);
|
string datePart = DateTime.Now.ToString("yyyyMMdd");
|
Dt_ReturnOrder returnOrder = _returnOrderRepository.QueryFirst(x => x.LPNNo == item.LPNNo && x.OrderStatus == InOrderStatusEnum.未开始.ObjToInt());
|
if (returnOrder == null)
|
{
|
Dt_ReturnOrder newReturnOrder = new Dt_ReturnOrder
|
{
|
OrderType = OrderTypeEnum.反拣回库单.ObjToInt(),
|
MaterielCode = item.MaterielCode,
|
MaterielName = item.MaterielName,
|
MaterieSpec = item.MaterieSpec,
|
BatchNo = item.BatchNo,
|
OrderQuantity = item.OrderQuantity,
|
Remark = item.Remark,
|
LinId = item.LinId,
|
LPNNo = item.LPNNo,
|
LocationCode = item.LocationCode,
|
WarehouseCode = item.WarehouseCode,
|
System = item.System,
|
OrderStatus = InOrderStatusEnum.未开始.ObjToInt(),
|
Creater = "SMOM",
|
CreateDate = DateTime.Now
|
};
|
_returnOrderRepository.AddData(newReturnOrder);
|
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo, Dt_StockInfoDetail>((stock, detail) => stock.Id == detail.StockId).Where((stock, detail) => stock.PalletCode == item.LPNNo && stock.LocationCode == item.LocationCode).First();
|
Dt_OutboundOrderDetail outboundOrderDetail = new Dt_OutboundOrderDetail();
|
Dt_OutboundOrder outboundOrder = new Dt_OutboundOrder();
|
if (stockInfo == null)
|
{
|
Dt_Warehouse warehouse = _warehouseService.Repository.QueryData(x => x.WarehouseCode == item.WarehouseCode).FirstOrDefault();
|
if (warehouse == null)
|
{
|
return WebResponseContent.Instance.Error($"该仓库编号{item.WarehouseCode}未配置");
|
}
|
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail
|
{
|
MaterielCode = item.MaterielCode,
|
MaterielName = item.MaterielName,
|
MaterieSpec = item.MaterieSpec,
|
BatchNo = item.BatchNo,
|
LinId = item.LinId,
|
Status = StockStatusEmun.组盘暂存.ObjToInt(),
|
Creater = "SMOM",
|
CreateDate = DateTime.Now,
|
OrderNo = newReturnOrder.OrderNo,
|
StockQuantity = item.OrderQuantity,
|
};
|
Dt_StockInfo stockInfo1 = new Dt_StockInfo
|
{
|
PalletCode = item.LPNNo,
|
WarehouseId = warehouse.WarehouseId,
|
BatchNo = item.BatchNo,
|
PalletType = GetPalletType(warehouse, item.LPNNo),
|
IsFull = true,
|
StockStatus = (int)StockStatusEmun.反拣入库,
|
Creater = "WMS",
|
CreateDate = DateTime.Now,
|
MaterialType = (int)InventoryMaterialType.原材料,
|
Materialweight = 0,
|
Wlstatus = (int)InventoryMaterialStatus.合格,
|
Mgeneratetime = DateTime.Now,
|
Details = new List<Dt_StockInfoDetail> { stockInfoDetail }
|
};
|
Db.InsertNav(stockInfo1).Include(x => x.Details).ExecuteCommand();
|
}
|
else
|
{
|
outboundOrderDetail = new Dt_OutboundOrderDetail
|
{
|
MaterielCode = item.MaterielCode,
|
MaterielName = item.MaterielName,
|
MaterieSpec = item.MaterieSpec,
|
BatchNo = item.BatchNo,
|
OrderQuantity = stockInfo.Details.Sum(x => x.StockQuantity),
|
Remark = item.Remark,
|
LinId = item.LinId,
|
LPNNo = item.LPNNo,
|
Creater = "SMOM",
|
CreateDate = DateTime.Now,
|
LocationName = item.LocationCode
|
};
|
outboundOrder = new Dt_OutboundOrder
|
{
|
OrderNo = "FJCK" + $"{datePart}{randomNum}",
|
UpperOrderNo = "WMSFJCK" + $"{datePart}{randomNum}",
|
OrderStatus = OutOrderStatusEnum.未开始.ObjToInt(),
|
OrderType = OrderTypeEnum.反拣出库单.ObjToInt(),
|
InoutType = InoutTypeEnum.OtherOut.ToString(),
|
System = item.System,
|
Creater = "SMOM",
|
CreateDate = DateTime.Now,
|
CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
|
Details = new List<Dt_OutboundOrderDetail> { outboundOrderDetail }
|
};
|
Db.InsertNav(outboundOrder).Include(x => x.Details).ExecuteCommand();
|
}
|
|
}
|
else
|
{
|
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo, Dt_StockInfoDetail>((stock, detail) => stock.Id == detail.StockId).Where((stock, detail) => stock.PalletCode == item.LPNNo && stock.StockStatus == StockStatusEmun.余料退库.ObjToInt()).First();
|
stockInfo.StockStatus = StockStatusEmun.反拣入库.ObjToInt();
|
returnOrder.LinId = item.LinId;
|
returnOrder.System = item.System;
|
returnOrder.WarehouseCode = item.WarehouseCode;
|
returnOrder.LocationCode = item.LocationCode;
|
returnOrder.OrderType = OrderTypeEnum.反拣回库单.ObjToInt();
|
returnOrder.OrderQuantity += item.OrderQuantity;
|
returnOrder.ReceiptQuantity += item.OrderQuantity;
|
_returnOrderRepository.UpdateData(returnOrder);
|
_stockRepository.StockInfoRepository.UpdateData(stockInfo);
|
|
}
|
}
|
_unitOfWorkManage.CommitTran();
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
public WebResponseContent GetMaterielCode(int warehouseId)
|
{
|
try
|
{
|
List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == warehouseId).ToList();
|
List<string> materielCodes = materielInfos.Select(x => x.MaterielCode).Distinct().ToList();
|
return WebResponseContent.Instance.OK("成功", data: materielCodes);
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
public WebResponseContent GetMaterielName(int warehouseId, string materielCode)
|
{
|
try
|
{
|
List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == warehouseId && x.MaterielCode == materielCode).ToList();
|
List<string> materielNames = materielInfos.Select(x => x.MaterielName).Distinct().ToList();
|
return WebResponseContent.Instance.OK("成功", data: materielNames);
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 验证单据添加DTO对象
|
/// </summary>
|
/// <param name="inboundOrderAddDTO">单据添加DTO</param>
|
/// <returns></returns>
|
//private (bool, string, object?) CheckInboundOrderAddData(InboundOrderAddDTO inboundOrderAddDTO)
|
//{
|
// (bool, string, object?) result1 = ModelValidate.ValidateModelData(inboundOrderAddDTO);
|
// if (!result1.Item1) return result1;
|
|
// (bool, string, object?) result2 = ModelValidate.ValidateModelData(inboundOrderAddDTO.Details);
|
// if (!result2.Item1) return result2;
|
|
// IEnumerable<int> inOrderTypes = Enum.GetValues<OrderTypeEmun>().Cast<int>();
|
// if (!inOrderTypes.Contains(inboundOrderAddDTO.OrderType))
|
// {
|
// return (false, "未找到该单据类型", inboundOrderAddDTO);
|
// }
|
|
// List<string> materielCodes = inboundOrderAddDTO.Details.Select(x => x.MaterielCode).ToList();
|
// if (!_basicService.MaterielInfoService.ExsitMateriels(materielCodes))
|
// {
|
// return (false, "有物料信息未录入,请录入物料信息", inboundOrderAddDTO);
|
// }
|
// Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == inboundOrderAddDTO.OutWareHouse);
|
// if (warehouse == null)
|
// {
|
// return (false, "未找到仓库信息", inboundOrderAddDTO);
|
// }
|
// if (BaseDal.QueryFirst(x => x.OrderName == inboundOrderAddDTO.orderName && !string.IsNullOrEmpty(x.OrderName)) != null)
|
// {
|
// return (false, "单据已存在", inboundOrderAddDTO);
|
// }
|
// return (true, "成功", inboundOrderAddDTO);
|
//}
|
|
|
}
|
}
|