using AutoMapper;
|
using MailKit.Search;
|
using Newtonsoft.Json;
|
using Newtonsoft.Json.Serialization;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Linq.Expressions;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.OrderEnum;
|
using WIDESEA_Common.StockEnum;
|
using WIDESEA_Common.WareHouseEnum;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core.Enums;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_Core.Utilities;
|
using WIDESEA_DTO.ERP;
|
using WIDESEA_DTO.Inbound;
|
using WIDESEA_DTO.Outbound;
|
using WIDESEA_External.ERPService;
|
using WIDESEA_External.Model;
|
using WIDESEA_IBasicService;
|
using WIDESEA_IOutboundRepository;
|
using WIDESEA_IOutboundService;
|
using WIDESEA_IStockRepository;
|
using WIDESEA_IStockService;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_OutboundService
|
{
|
public class OutboundOrderService : ServiceBase<Dt_OutboundOrder, IOutboundOrderRepository>, IOutboundOrderService
|
{
|
private readonly IMapper _mapper;
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly IBasicService _basicService;
|
private readonly IOutboundOrderDetailRepository _outboundOrderDetailRepository;
|
private readonly IStockInfoService _stockInfoService;
|
private readonly IStockInfoRepository _stockInfoRepository;
|
public IOutboundOrderRepository Repository => BaseDal;
|
private readonly IInvokeERPService _invokeERPService;
|
private readonly IOutStockLockInfoService _outStockLockInfoService;
|
private readonly IOutboundOrderRepository _outboundOrderRepository;
|
|
public OutboundOrderService(IOutboundOrderRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IBasicService basicService, IOutboundOrderDetailRepository outboundOrderDetailRepository, IStockInfoService stockInfoService,
|
IStockInfoRepository stockInfoRepository, IInvokeERPService invokeERPService, IOutStockLockInfoService outStockLockInfoService,
|
IOutboundOrderRepository outboundOrderRepository) : base(BaseDal)
|
{
|
_mapper = mapper;
|
_unitOfWorkManage = unitOfWorkManage;
|
_basicService = basicService;
|
_outboundOrderDetailRepository = outboundOrderDetailRepository;
|
_stockInfoService = stockInfoService;
|
_stockInfoRepository = stockInfoRepository;
|
_invokeERPService = invokeERPService;
|
_outStockLockInfoService = outStockLockInfoService;
|
_outboundOrderRepository = outboundOrderRepository;
|
}
|
public override WebResponseContent AddData(SaveModel saveModel)
|
{
|
if (saveModel.MainData.TryGetValue(nameof(Dt_OutboundOrder.UpperOrderNo).FirstLetterToLower(), out object? upperOrderNo) && upperOrderNo != null && !string.IsNullOrEmpty(upperOrderNo.ToString()))
|
{
|
Dt_OutboundOrder outboundOrder = BaseDal.QueryFirst(x => x.UpperOrderNo == upperOrderNo.ToString() && x.WarehouseId == Convert.ToInt32(saveModel.MainData[nameof(Dt_OutboundOrder.WarehouseId).FirstLetterToLower()]));
|
if (outboundOrder != null)
|
{
|
return WebResponseContent.Instance.Error($"{upperOrderNo}领料单号已存在");
|
}
|
}
|
saveModel.DetailData[0].Add("orderDetailStatus", OrderDetailStatusEnum.New.ObjToInt());
|
return base.AddData(saveModel);
|
}
|
public WebResponseContent GetOutboundOrders(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_OutboundOrder> dt_ReceiveOrders = new List<Dt_OutboundOrder>();
|
if (string.IsNullOrEmpty(orderNo))
|
{
|
dt_ReceiveOrders = Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderStatus < OutLockStockStatusEnum.出库完成.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5);
|
}
|
else
|
{
|
dt_ReceiveOrders = Db.Queryable<Dt_OutboundOrder>().Where(x => (x.OrderNo.Contains(orderNo)) && x.OrderStatus < OutLockStockStatusEnum.出库完成.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5);
|
}
|
|
content.OK(data: dt_ReceiveOrders);
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
public WebResponseContent ReceiveOutOrder(ErpOutOrderDTO model)
|
{
|
try
|
{
|
Dt_MaterielInfo materielInfo = _basicService.MaterielInfoService.Repository.QueryFirst(x => x.MaterielCode == model.MCode);
|
if (materielInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该物料信息");
|
}
|
|
Dt_Warehouse warehouse = _basicService.WarehouseService.Repository.QueryFirst(x => x.WarehouseCode == model.WaId);
|
if (warehouse == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该仓库信息");
|
}
|
|
Dt_OutboundOrder oldOutboundOrder = BaseDal.Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == model.OrderNo).Includes(x => x.Details).First();
|
|
if (model.Way == 1)
|
{
|
if (oldOutboundOrder != null)
|
{
|
if (oldOutboundOrder.Details.FirstOrDefault(x => x.RowNo == Convert.ToInt32(model.RowNo)) != null)
|
{
|
return WebResponseContent.Instance.Error($"该明细行号已存在");
|
}
|
if (oldOutboundOrder.WarehouseId != warehouse.WarehouseId)
|
{
|
return WebResponseContent.Instance.Error($"仓库不一致");
|
}
|
else
|
{
|
Dt_OutboundOrderDetail outboundOrderDetail = new Dt_OutboundOrderDetail()
|
{
|
RowNo = Convert.ToInt32(model.RowNo),
|
BatchNo = model.MLot,
|
MaterielCode = model.MCode,
|
MaterielName = materielInfo.MaterielName,
|
OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
|
OrderQuantity = model.Qty,
|
OrderId = oldOutboundOrder.Id
|
};
|
_outboundOrderDetailRepository.AddData(outboundOrderDetail);
|
}
|
}
|
else
|
{
|
Dt_OutboundOrderDetail outboundOrderDetail = new Dt_OutboundOrderDetail()
|
{
|
RowNo = Convert.ToInt32(model.RowNo),
|
BatchNo = model.MLot,
|
MaterielCode = model.MCode,
|
MaterielName = materielInfo.MaterielName,
|
OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
|
OrderQuantity = model.Qty,
|
Unit = materielInfo.MaterielUnit
|
};
|
Dt_OutboundOrder outboundOrder = new Dt_OutboundOrder()
|
{
|
UpperOrderNo = model.OrderNo,
|
OrderStatus = OutOrderStatusEnum.未开始.ObjToInt(),
|
OrderType = OutOrderTypeEnum.Issue.ObjToInt(),
|
CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
|
WarehouseId = warehouse.WarehouseId,
|
DepartmentCode = model.DepartmentCode,
|
DepartmentName = model.DepartmentName,
|
Details = new List<Dt_OutboundOrderDetail> { outboundOrderDetail }
|
};
|
Db.InsertNav(outboundOrder).Include(x => x.Details).ExecuteCommand();
|
}
|
}
|
else if (model.Way == 2)
|
{
|
if (oldOutboundOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该出库单");
|
}
|
Dt_OutboundOrderDetail? outboundOrderDetail = oldOutboundOrder.Details.FirstOrDefault(x => x.RowNo == Convert.ToInt32(model.RowNo));
|
if (outboundOrderDetail == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该明细行号信息");
|
}
|
if (outboundOrderDetail.OrderDetailStatus != OrderDetailStatusEnum.New.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"该明细不可修改");
|
}
|
outboundOrderDetail = new Dt_OutboundOrderDetail()
|
{
|
RowNo = Convert.ToInt32(model.RowNo),
|
BatchNo = model.MLot,
|
MaterielCode = model.MCode,
|
MaterielName = materielInfo.MaterielName,
|
OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
|
OrderQuantity = model.Qty,
|
};
|
|
_outboundOrderDetailRepository.UpdateData(outboundOrderDetail);
|
}
|
else if (model.Way == 3)
|
{
|
if (oldOutboundOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该出库单");
|
}
|
}
|
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
//上报出库完成
|
public WebResponseContent TestOutUpload(int id, List<Dt_OutStockLockInfo>? outStockLockInfos)
|
{
|
try
|
{
|
Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.Id == id).Includes(x => x.Details).First();
|
Dt_Warehouse warehouse = _basicService.WarehouseService.Repository.QueryFirst(x => x.WarehouseId == outboundOrder.WarehouseId);
|
ERPIssueModel issueModel = new ERPIssueModel();
|
List<Dt_StockInfo> stockInfos = new List<Dt_StockInfo>();
|
List<Dt_OutStockLockInfo> _OutStockLockInfos = new List<Dt_OutStockLockInfo>();
|
int overCount = outboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
|
if (outboundOrder.Details.Count == overCount)
|
{
|
outboundOrder.OrderStatus = OutOrderStatusEnum.出库完成.ObjToInt();
|
_outboundOrderRepository.UpdateData(outboundOrder);
|
}
|
if (outboundOrder == null)
|
{
|
return WebResponseContent.Instance.Error("出库单不存在");
|
}
|
if (outboundOrder.CreateType == OrderCreateTypeEnum.CreateInSystem.ObjToInt())
|
{
|
return WebResponseContent.Instance.OK();
|
}
|
//测试架库给ERP上报出库完成
|
if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString())
|
{
|
List<ERPPickModel> eRPPicks = new List<ERPPickModel>();
|
foreach (var item in outboundOrder.Details)
|
{
|
if (item.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()) continue;
|
stockInfos = TestOutStocksUpdate(warehouse, item).Data as List<Dt_StockInfo> ?? null;
|
if (stockInfos == null) continue;
|
List<ERPPickItemModel> eRPOutPick = new List<ERPPickItemModel>();
|
for (int i = 0; i < stockInfos.Count; i++)
|
{
|
ERPPickItemModel pickItemModel = new ERPPickItemModel()
|
{
|
Lotno = stockInfos[i].Details[0].BatchNo,
|
Qty = stockInfos[i].Details[0].StockQuantity.ObjToInt().ToString(),
|
Location = warehouse.WarehouseCode
|
};
|
eRPOutPick.Add(pickItemModel);
|
}
|
|
ERPPickModel pickModel = new ERPPickModel()
|
{
|
Rowindex = item.RowNo,
|
Material = item.MaterielCode,
|
Qty = (item.OrderQuantity.ObjToInt()).ToString(),
|
Dataitem = eRPOutPick
|
};
|
eRPPicks.Add(pickModel);
|
}
|
ERPIssueItemModel issueItemModel = new ERPIssueItemModel()
|
{
|
Pickcode = outboundOrder.UpperOrderNo,
|
PickList = eRPPicks
|
};
|
issueModel = new ERPIssueModel()
|
{
|
UniqueTag = id.ToString(),
|
Code = outboundOrder.OrderNo,//测试
|
WarehouseCode = warehouse.WarehouseCode,
|
Docremark = "",
|
Deptno = outboundOrder.DepartmentCode,
|
Deptname = outboundOrder.DepartmentName,
|
Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
Createuser = outboundOrder.Creater,
|
Issitem = new List<ERPIssueItemModel>() { issueItemModel },
|
};
|
}
|
else
|
{
|
List<ERPPickModel> eRPPickModels = new List<ERPPickModel>();
|
|
//获取出库详情单
|
foreach (var item in outStockLockInfos)
|
{
|
ERPPickItemModel pickItemModel = new ERPPickItemModel()
|
{
|
Lotno = item.BatchNo,
|
Qty = item.AssignQuantity.ObjToInt().ToString(),
|
Location = warehouse.WarehouseCode
|
};
|
//获取出库单明细
|
Dt_OutboundOrderDetail outboundOrderDetail = outboundOrder.Details.FirstOrDefault(x => x.Id == item.OrderDetailId);
|
ERPPickModel pickModel = new ERPPickModel()
|
{
|
Rowindex = outboundOrderDetail.RowNo,
|
Material = outboundOrderDetail.MaterielCode,
|
Qty = pickItemModel.Qty,
|
Dataitem = new List<ERPPickItemModel> { pickItemModel }
|
};
|
if (item.OrderQuantity == item.AssignQuantity)
|
{
|
item.Status = OutLockStockStatusEnum.出库完成.ObjToInt();
|
}
|
eRPPickModels.Add(pickModel);
|
_OutStockLockInfos.Add(item);
|
}
|
ERPIssueItemModel issueItemModel = new ERPIssueItemModel()
|
{
|
Pickcode = outboundOrder.UpperOrderNo,
|
PickList = eRPPickModels
|
};
|
issueModel = new ERPIssueModel()
|
{
|
UniqueTag = id.ToString(),
|
Code = outboundOrder.OrderNo,
|
WarehouseCode = warehouse.WarehouseCode,
|
Docremark = "",
|
Deptno = outboundOrder.DepartmentCode,
|
Deptname = outboundOrder.DepartmentName,
|
Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
Createuser = outStockLockInfos.FirstOrDefault().Creater,
|
Issitem = new List<ERPIssueItemModel>() { issueItemModel },
|
};
|
}
|
|
if (stockInfos.Count > 0)
|
{
|
_stockInfoRepository.UpdateData(stockInfos);
|
}
|
else
|
{
|
_outStockLockInfoService.Repository.UpdateData(_OutStockLockInfos);
|
}
|
//出库完成上报ERP 测试注释
|
_invokeERPService.InvokeOutStandardsApi(issueModel);
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 更改出库单库存状态
|
/// </summary>
|
/// <param name="warehouse"></param>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
public WebResponseContent TestOutStocksUpdate(Dt_Warehouse warehouse,Dt_OutboundOrderDetail outboundOrderDetails)
|
{
|
try
|
{
|
//获取出库单库存
|
List<Dt_StockInfo> stockInfos = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId).Includes(x => x.Details).Where(x=>x.Details.Any(j=>j.MaterielCode== outboundOrderDetails.MaterielCode)).Take((int)outboundOrderDetails.OrderQuantity).ToList();
|
if (stockInfos.Count <= 0)
|
{
|
return WebResponseContent.Instance.OK();
|
}
|
//更改状态
|
stockInfos.ForEach(x =>
|
{
|
x.StockStatus = StockStatusEmun.入库完成.ObjToInt();
|
});
|
return WebResponseContent.Instance.OK("成功", stockInfos);
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
}
|
}
|