using AutoMapper;
|
using HslCommunication.WebSocket;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Linq.Expressions;
|
using System.Reflection.Metadata;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.CommonEnum;
|
using WIDESEA_Common.OrderEnum;
|
using WIDESEA_Common.StockEnum;
|
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.Inbound;
|
using WIDESEA_External.ERPService;
|
using WIDESEA_External.Model;
|
using WIDESEA_IBasicRepository;
|
using WIDESEA_IBasicService;
|
using WIDESEA_IInboundRepository;
|
using WIDESEA_IInboundService;
|
using WIDESEA_IRecordService;
|
using WIDESEA_IStockRepository;
|
using WIDESEA_IStockService;
|
using WIDESEA_ITaskInfoRepository;
|
using WIDESEA_Model.Models;
|
using WIDESEA_StockRepository;
|
|
namespace WIDESEA_InboundService
|
{
|
public class InboundOrderService : ServiceBase<Dt_InboundOrder, IInboundOrderRepository>, IInboundOrderService
|
{
|
private readonly IMapper _mapper;
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly IInboundRepository _inboundRepository;
|
private readonly IBasicRepository _basicRepository;
|
private readonly IStockRepository _stockRepository;
|
private readonly IRecordService _recordService;
|
private readonly IInvokeERPService _invokeERPService;
|
|
public IInboundOrderRepository Repository => BaseDal;
|
|
public InboundOrderService(IInboundOrderRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IInboundRepository inboundRepository, IBasicRepository basicRepository, IStockRepository stockRepository, IRecordService recordService, IInvokeERPService invokeERPService) : base(BaseDal)
|
{
|
_mapper = mapper;
|
_unitOfWorkManage = unitOfWorkManage;
|
_inboundRepository = inboundRepository;
|
_basicRepository = basicRepository;
|
_stockRepository = stockRepository;
|
_recordService = recordService;
|
_invokeERPService = invokeERPService;
|
}
|
|
public WebResponseContent MaterielGroup(int inboundOrderId, string palletCode, string serNum)
|
{
|
try
|
{
|
Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.Id == inboundOrderId).Includes(x => x.Details).First();
|
if (inboundOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单信息");
|
}
|
if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单明细信息");
|
}
|
|
Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
|
if (receiveOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到对应的收货单");
|
}
|
if (receiveOrder.Details == null || receiveOrder.Details.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到对应的收货单明细");
|
}
|
|
List<string> purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList();
|
|
MatSerNumAnalysisModel model = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNum);
|
|
List<Dt_InboundOrderDetail> inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == model.MaterielCode).ToList();
|
|
if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料信息");
|
}
|
if (receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == model.MaterielCode) == null)
|
{
|
return WebResponseContent.Instance.Error($"未在收货单明细中找到该物料信息");
|
}
|
if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null)
|
{
|
return WebResponseContent.Instance.Error($"未在收货单明细中找到该采购单");
|
}
|
|
Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt() && x.OrderQuantity == model.Quantity).FirstOrDefault();
|
|
if (notGroupDetail == null)
|
{
|
return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成");
|
}
|
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == model.MaterielCode);
|
if (materielInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该物料的信息");
|
}
|
|
Dt_StockInfo stockInfo = new Dt_StockInfo()
|
{
|
PalletCode = palletCode,
|
StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
|
WarehouseId = inboundOrder.WarehouseId
|
};
|
|
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
|
{
|
BatchNo = model.LotNo,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
OrderNo = inboundOrder.InboundOrderNo,
|
SerialNumber = model.SerialNumber,
|
StockQuantity = model.Quantity,
|
OutboundQuantity = 0,
|
Status = StockStatusEmun.组盘暂存.ObjToInt(),
|
ProductionDate = model.ProductionDate,
|
EffectiveDate = model.EffectiveDate,
|
InboundOrderRowNo = notGroupDetail.RowNo,
|
};
|
|
_stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
|
_inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails);
|
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
public WebResponseContent MaterielGroup(int inboundOrderId, string palletCode, List<string> serNums)
|
{
|
try
|
{
|
Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.Id == inboundOrderId).Includes(x => x.Details).First();
|
if (inboundOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单信息");
|
}
|
if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单明细信息");
|
}
|
|
Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
|
if (receiveOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到对应的收货单");
|
}
|
if (receiveOrder.Details == null || receiveOrder.Details.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到对应的收货单明细");
|
}
|
|
List<string> purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList();
|
|
List<MatSerNumAnalysisModel> models = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNums);
|
|
if (models.Select(x => x.MaterielCode).Distinct().Count() > 1)
|
{
|
return WebResponseContent.Instance.Error($"物料不可混放");
|
}
|
|
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 = inboundOrder.Details.Where(x => x.MaterielCode == materielCode).ToList();
|
|
if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料信息");
|
}
|
if (receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == materielCode) == null)
|
{
|
return WebResponseContent.Instance.Error($"未在收货单明细中找到该物料信息");
|
}
|
|
float 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()
|
{
|
PalletCode = palletCode,
|
StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
|
WarehouseId = inboundOrder.WarehouseId,
|
PalletType = PalletTypeEnum.SmallPallet.ObjToInt(),
|
Details = new List<Dt_StockInfoDetail>()
|
};
|
}
|
else
|
{
|
if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"托盘号重复");
|
}
|
beforeQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
|
}
|
|
List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
|
List<int> detailKeys = new List<int>();
|
foreach (var model in models)
|
{
|
if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null)
|
{
|
return WebResponseContent.Instance.Error($"未在收货单明细中找到该采购单");
|
}
|
|
Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt() && x.OrderQuantity == model.Quantity && !detailKeys.Contains(x.Id) && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault();
|
|
if (notGroupDetail == null)
|
{
|
return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成");
|
}
|
detailKeys.Add(notGroupDetail.Id);
|
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
|
{
|
BatchNo = model.LotNo,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
OrderNo = inboundOrder.InboundOrderNo,
|
SerialNumber = model.SerialNumber,
|
StockQuantity = model.Quantity,
|
OutboundQuantity = 0,
|
Status = StockStatusEmun.组盘暂存.ObjToInt(),
|
ProductionDate = model.ProductionDate,
|
EffectiveDate = model.EffectiveDate,
|
InboundOrderRowNo = notGroupDetail.RowNo,
|
};
|
|
if (stockInfo.Id > 0)
|
{
|
stockInfoDetail.StockId = stockInfo.Id;
|
}
|
stockInfo.Details.Add(stockInfoDetail);
|
|
stockInfoDetails.Add(stockInfoDetail);
|
|
notGroupDetail.ReceiptQuantity = model.Quantity;
|
notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
|
}
|
|
float 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);
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup);
|
_unitOfWorkManage.CommitTran();
|
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
public WebResponseContent FeedbackInboundOrder(int id)
|
{
|
try
|
{
|
Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.Id == id).Includes(x => x.Details).First();
|
if (inboundOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单信息");
|
}
|
if (inboundOrder.Details == null || inboundOrder.Details.Count == 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单明细信息");
|
}
|
if (inboundOrder.OrderStatus != InOrderStatusEnum.入库完成.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"入库单据未完成");
|
}
|
if (inboundOrder.Details.FirstOrDefault(x => x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()) != null)
|
{
|
return WebResponseContent.Instance.Error($"入库明细未完成");
|
}
|
|
List<Dt_StockInfo> stockInfos = Db.Queryable<Dt_StockInfo>().Where(x => x.Details.Any(v => v.OrderNo == inboundOrder.InboundOrderNo)).Includes(x => x.Details).ToList();
|
List<Dt_Warehouse> warehouses = Db.Queryable<Dt_Warehouse>().ToList();
|
|
List<ERPInboundDetailModel> detailModels = new List<ERPInboundDetailModel>();
|
foreach (var item in inboundOrder.Details)
|
{
|
Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(v => v.InboundOrderRowNo == item.RowNo && v.MaterielCode == item.MaterielCode));
|
if (stockInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到库存信息");
|
}
|
|
Dt_Warehouse? warehouse = warehouses.FirstOrDefault(x => x.WarehouseId == stockInfo.WarehouseId);
|
if (warehouse == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到仓库信息");
|
}
|
|
ERPInboundDetailModel detailModel = new ERPInboundDetailModel()
|
{
|
ExpiryDate = stockInfo.Details.FirstOrDefault()?.EffectiveDate ?? "",
|
LocationCode = warehouse.WarehouseCode,
|
MaterialsCode = item.MaterielCode,
|
MfgDate = stockInfo.Details.FirstOrDefault()?.ProductionDate ?? "",
|
QtyCustoms = "0",
|
Quantity = stockInfo.Details.Sum(x => x.StockQuantity).ToString(),
|
Rack = stockInfo.LocationCode,
|
ReceiptCode = inboundOrder.UpperOrderNo,
|
ReceiptSerNo = item.RowNo.ToString()
|
};
|
detailModels.Add(detailModel);
|
}
|
Dt_Warehouse? warehouse2 = warehouses.FirstOrDefault(x => x.WarehouseId == inboundOrder.WarehouseId);
|
if (warehouse2 == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到仓库信息");
|
}
|
ERPInboundModel model = new ERPInboundModel()
|
{
|
Code = inboundOrder.InboundOrderNo,
|
CreatorCode = inboundOrder.Creater,
|
EndDate = inboundOrder.CreateDate.ToString(),
|
StockDate = inboundOrder.CreateDate.ToString(),
|
SuppliersId = inboundOrder.SupplierId,
|
Type = "S",
|
UniqueTag = inboundOrder.Id.ToString(),
|
WarehouseCode = warehouse2.WarehouseCode,
|
Way = 1,
|
Details = detailModels
|
};
|
|
string response = _invokeERPService.InvokeInboundOrderApi(model);
|
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
}
|
}
|