using AutoMapper;
|
using HslCommunication.WebSocket;
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
using Newtonsoft.Json;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
|
using SqlSugar;
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using System.Dynamic;
|
using System.Globalization;
|
using System.Linq;
|
using System.Linq.Expressions;
|
using System.Reflection;
|
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_Common.WareHouseEnum;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core.CodeConfigEnum;
|
using WIDESEA_Core.DB;
|
using WIDESEA_Core.Enums;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_Core.Seed;
|
using WIDESEA_Core.Utilities;
|
using WIDESEA_DTO;
|
using WIDESEA_DTO.Basic;
|
using WIDESEA_DTO.ERP;
|
using WIDESEA_DTO.Inbound;
|
using WIDESEA_DTO.MES;
|
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_ITaskInfoService;
|
using WIDESEA_Model.Models;
|
using WIDESEA_StockRepository;
|
using static Org.BouncyCastle.Pqc.Crypto.Utilities.PqcOtherInfoGenerator;
|
|
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;
|
private readonly IWarehouseService _warehouseService;
|
private readonly IPalletTypeInfoRepository _palletTypeInfoRepository;
|
|
public IInboundOrderRepository Repository => BaseDal;
|
|
public InboundOrderService(IInboundOrderRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IInboundRepository inboundRepository, IBasicRepository basicRepository, IStockRepository stockRepository, IRecordService recordService, IInvokeERPService invokeERPService, IWarehouseService warehouseService, IPalletTypeInfoRepository palletTypeInfoRepository) : base(BaseDal)
|
{
|
_mapper = mapper;
|
_unitOfWorkManage = unitOfWorkManage;
|
_inboundRepository = inboundRepository;
|
_basicRepository = basicRepository;
|
_stockRepository = stockRepository;
|
_recordService = recordService;
|
_invokeERPService = invokeERPService;
|
_warehouseService = warehouseService;
|
_palletTypeInfoRepository = palletTypeInfoRepository;
|
}
|
public override object GetDetailPage(PageDataOptions pageData)
|
{
|
Type t = typeof(Dt_InboundOrder);
|
|
if (pageData.Value == null) return new PageGridData<object>(total: 0, null);
|
string keyName = t.GetKeyName();
|
////生成查询条件
|
//Expression<Func<TEntity, bool>> whereExpression = keyName.CreateExpression<TEntity>(pageData.Value, LinqExpressionType.Equal);
|
int totalCount = 0;
|
PropertyInfo propertyInfo = t.GetProperties().FirstOrDefault(x => x.GetCustomAttribute<Navigate>() != null);
|
if (propertyInfo != null)
|
{
|
Type detailType = propertyInfo.PropertyType.GetGenericArguments()[0];
|
Navigate navigate = propertyInfo.GetCustomAttribute<Navigate>();
|
List<Dt_InboundOrderDetail> list = BaseDal.Db.Queryable<Dt_InboundOrderDetail>().Where(navigate.GetName(), "=", pageData.Value).ToPageList(pageData.Page, pageData.Rows, ref totalCount);
|
decimal sum = 0;
|
list.ForEach(x =>
|
{
|
sum += Convert.ToDecimal(x.OrderQuantity);
|
});
|
PageGridData<Dt_InboundOrderDetail> pageGridData = new PageGridData<Dt_InboundOrderDetail>()
|
{
|
Total= totalCount,
|
Rows=list,
|
Summary=new
|
{
|
OrderQuantity = Math.Round(sum, 3),
|
}
|
};
|
return pageGridData;
|
}
|
return new PageGridData<object>(total: 0, null);
|
}
|
/// <summary>
|
/// 其他入库单接收(调拔入仓,客供回收,物料销售退货)
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent ReceiveWarehousingOrder(ErpInOrderDTO model)
|
{
|
try
|
{
|
return model.Way switch
|
{
|
1 => AddSingOrder(model),
|
2 => UpdateSingOrder(model),
|
3 => DeleteSingOrder(model),
|
_ => WebResponseContent.Instance.Error($"操作类型不存在,Way:{model.Way}"),
|
};
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 新增单据
|
/// </summary>
|
public WebResponseContent AddSingOrder(ErpInOrderDTO model)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
//获取物料信息
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x=>x.MaterielCode==model.MCode);
|
if (materielInfo==null)
|
{
|
return content.Error($"物料{model.MCode}不存在!");
|
}
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == model.WaId);
|
if (warehouse == null)
|
{
|
return content.Error($"未找到仓库信息");
|
}
|
Dt_InboundOrder inboundOrderOld = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == model.OrderNo).Includes(x=>x.Details).First();
|
if (inboundOrderOld!=null)
|
{
|
if (inboundOrderOld.OrderStatus!= OrderDetailStatusEnum.New.ObjToInt())
|
{
|
return content.Error($"{model.OrderNo}单据已开始!");
|
}
|
Dt_InboundOrderDetail? inboundOrderDetailOld = inboundOrderOld.Details?.FirstOrDefault(x => x.RowNo == model.RowNo.ObjToInt() && x.MaterielCode == model.MCode);
|
if (inboundOrderDetailOld!=null)
|
{
|
inboundOrderDetailOld.OrderQuantity += model.Qty;
|
_inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetailOld);
|
}
|
else
|
{
|
Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail()
|
{
|
OrderId= inboundOrderOld.Id,
|
MaterielCode = model.MCode,
|
BatchNo = "",
|
OrderQuantity = model.Qty,
|
ReceiptQuantity = 0,
|
OverInQuantity = 0,
|
OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
|
Unit = materielInfo.MaterielUnit,
|
RowNo = model.RowNo.ObjToInt(),
|
MaterielName = materielInfo.MaterielName,
|
MaterielSpec = materielInfo.MaterielSpec
|
};
|
_inboundRepository.InboundOrderDetailRepository.AddData(orderDetail);
|
}
|
}
|
else
|
{
|
Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail()
|
{
|
MaterielCode = model.MCode,
|
BatchNo = "",
|
OrderQuantity = model.Qty,
|
ReceiptQuantity = 0,
|
OverInQuantity = 0,
|
OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
|
Unit = materielInfo.MaterielUnit,
|
RowNo = model.RowNo.ObjToInt(),
|
MaterielName = materielInfo.MaterielName,
|
MaterielSpec = materielInfo.MaterielSpec
|
};
|
|
Dt_InboundOrder inboundOrder = new Dt_InboundOrder()
|
{
|
UpperOrderNo = model.OrderNo,
|
WarehouseId = warehouse.WarehouseId,
|
SupplierId = "",
|
OrderStatus = InOrderStatusEnum.未开始.ObjToInt(),
|
CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
|
Remark = model.Note,
|
Details = new List<Dt_InboundOrderDetail> { orderDetail }
|
};
|
switch (model.OType)
|
{
|
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).ExecuteCommand();
|
}
|
return content.OK("成功");
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 修改单据
|
/// </summary>
|
public WebResponseContent UpdateSingOrder(ErpInOrderDTO model)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
//获取单据信息
|
Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == model.OrderNo).First();
|
if (inboundOrder == null)
|
{
|
return content.Error($"单据{model.OrderNo}不存在!");
|
}
|
if (inboundOrder.OrderStatus>=InOrderStatusEnum.入库中.ObjToInt())
|
{
|
return content.Error($"单据{model.OrderNo}入库中或已完成");
|
}
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 删除单据
|
/// </summary>
|
public WebResponseContent DeleteSingOrder(ErpInOrderDTO model)
|
{
|
WebResponseContent content = new WebResponseContent();
|
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 < InOrderStatusEnum.入库完成.ObjToInt() && x.WarehouseId == warehouseId).Includes(x=>x.Details).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 10);
|
}
|
else
|
{
|
dt_ReceiveOrders = Db.Queryable<Dt_InboundOrder>().Where(x => (x.InboundOrderNo.Contains(orderNo)) && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt() && x.WarehouseId == warehouseId).Includes(x => x.Details).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 10);
|
}
|
|
content.OK(data: dt_ReceiveOrders);
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 单个物料码组盘 适用测试架
|
/// </summary>
|
/// <param name="inboundOrderId"></param>
|
/// <param name="palletCode"></param>
|
/// <param name="serNum"></param>
|
/// <returns></returns>
|
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.OrderStatus >= InOrderStatusEnum.入库完成.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"入库单已结束");
|
}
|
if (inboundOrder.Details.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单明细信息");
|
}
|
MatSerNumAnalysisModel model = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNum);
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == model.MaterielCode);
|
if (materielInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该物料的信息");
|
}
|
if (materielInfo.WarehouseId != inboundOrder.WarehouseId)
|
{
|
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.Count <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到对应的收货单明细");
|
}
|
List<string> purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList();
|
if (!purchaseOrderNos.Contains(model.PurchaseOrderNo))
|
{
|
return WebResponseContent.Instance.Error($"未找到对应收货单明细中采购单");
|
}
|
Dt_ReceiveOrderDetail? receiveOrderDetail = receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == model.MaterielCode);
|
if (receiveOrderDetail == null)
|
{
|
return WebResponseContent.Instance.Error($"未在收货单明细中找到该物料信息");
|
}
|
Dt_InboundOrderDetail? inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.MaterielCode == model.MaterielCode);
|
if (inboundOrderDetail == null)
|
{
|
return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料信息");
|
}
|
if (inboundOrderDetail.OrderDetailStatus > OrderDetailStatusEnum.GroupAndInbound.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"对应入库单明细已结束");
|
}
|
float inboundDetailSum = inboundOrderDetail.OverInQuantity + inboundOrderDetail.ReceiptQuantity;
|
if (inboundDetailSum == inboundOrderDetail.OrderQuantity)
|
{
|
return WebResponseContent.Instance.Error($"该物料入库单明细已全部组盘完成");
|
}
|
if (model.Quantity > receiveOrderDetail.ReceivedQuantity || (inboundDetailSum + model.Quantity) > receiveOrderDetail.ReceivedQuantity)
|
{
|
return WebResponseContent.Instance.Error($"与该收货单明细收货数量不一致");
|
}
|
Dt_StockInfo oldStockinfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
|
if (oldStockinfo != null)
|
{
|
return WebResponseContent.Instance.Error($"托盘重复");
|
}
|
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,
|
Unit = materielInfo.MaterielUnit,
|
Status = StockStatusEmun.组盘暂存.ObjToInt(),
|
ProductionDate = model.ProductionDate,
|
EffectiveDate = model.EffectiveDate,
|
InboundOrderRowNo = inboundOrderDetail.RowNo,
|
};
|
|
Dt_StockInfo stockInfo = new Dt_StockInfo()
|
{
|
PalletCode = palletCode,
|
StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
|
WarehouseId = inboundOrder.WarehouseId,
|
Details = new List<Dt_StockInfoDetail> { stockInfoDetail }
|
};
|
inboundOrderDetail.ReceiptQuantity += model.Quantity;
|
_unitOfWorkManage.BeginTran();
|
if (inboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
|
{
|
inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
|
}
|
_inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetail);
|
if (inboundOrder.OrderStatus == InOrderStatusEnum.未开始.ObjToInt())
|
{
|
inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
BaseDal.UpdateData(inboundOrder);
|
}
|
_stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
|
_unitOfWorkManage.CommitTran();
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
|
/// <summary>
|
/// 入平库,直接添加库存
|
/// </summary>
|
/// <param name="warehouseId"></param>
|
/// <param name="serNums"></param>
|
/// <returns></returns>
|
public WebResponseContent InPinKu(string inboundOrderId, int warehouseId, List<string> serNums)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
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.InboundOrderNo == inboundOrderId && 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($"未找到入库单明细信息");
|
}
|
|
//入库明细原完成数量
|
int oldCount = inboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count;
|
|
Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
|
if (receiveOrder == null && inboundOrder.OrderType==InOrderTypeEnum.Purchase.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"未找到对应的收货单");
|
}
|
if ((receiveOrder?.Details == null || receiveOrder?.Details.Count <= 0) && inboundOrder.OrderType == InOrderTypeEnum.Purchase.ObjToInt())
|
{
|
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($"未在入库单明细中找到该物料信息");
|
}
|
foreach (var model in models)
|
{
|
if (!inboundOrderDetails.Any(x => x.BatchNo == model.LotNo))
|
return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料批次【{model.LotNo}】");
|
}
|
if (receiveOrder?.Details.FirstOrDefault(x => x.MaterielCode == materielCode) == null && inboundOrder.OrderType == InOrderTypeEnum.Purchase.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"未在收货单明细中找到该物料信息");
|
}
|
float beforeQuantity = 0;
|
Dt_StockInfo stockInfo = new Dt_StockInfo()
|
{
|
PalletCode = DateTime.Now.ToString("yyyyMMddHHmmss"),
|
StockStatus = StockStatusEmun.入库完成.ObjToInt(),
|
WarehouseId = inboundOrder.WarehouseId,
|
PalletType = PalletTypeEnum.SmallPallet.ObjToInt(),
|
LocationCode = "平库位",
|
Details = new List<Dt_StockInfoDetail>()
|
};
|
|
List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
|
List<int> detailKeys = new List<int>();
|
Dt_ReturnOrder? returnOrder = null;
|
foreach (var model in models)
|
{
|
if (purchaseOrderNos?.FirstOrDefault(x => x == model.PurchaseOrderNo) == null && inboundOrder.OrderType == InOrderTypeEnum.Purchase.ObjToInt())
|
{
|
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,
|
MaterielSpec=materielInfo.MaterielSpec,
|
OrderNo = inboundOrder.InboundOrderNo,
|
SerialNumber = model.SerialNumber,
|
StockQuantity = model.Quantity,
|
OutboundQuantity = 0,
|
Unit = materielInfo.MaterielUnit,
|
Status = StockStatusEmun.入库完成.ObjToInt(),
|
ProductionDate = model.ProductionDate,
|
EffectiveDate = model.EffectiveDate,
|
InboundOrderRowNo = notGroupDetail.RowNo,
|
};
|
oldCount++;
|
|
if (stockInfo.Id > 0)
|
{
|
stockInfoDetail.StockId = stockInfo.Id;
|
}
|
stockInfo.Details.Add(stockInfoDetail);
|
|
stockInfoDetails.Add(stockInfoDetail);
|
|
notGroupDetail.ReceiptQuantity = model.Quantity;
|
notGroupDetail.OverInQuantity = model.Quantity;
|
notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
|
}
|
|
//入库明细新增完成数量
|
if (inboundOrder.Details.Count == oldCount)
|
{
|
inboundOrder.OrderStatus = InOrderStatusEnum.入库完成.ObjToInt();
|
//判断是否为退料入库单
|
if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt())
|
{
|
returnOrder = _inboundRepository.ReturnOrderRepository.Db.Queryable<Dt_ReturnOrder>().Where(x => x.OrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
|
returnOrder.ReturnOrderStatus = ReturnOrderStatusEnum.Returned.ObjToInt();
|
foreach (var item in inboundOrder.Details)
|
{
|
Dt_ReturnOrderDetail returnOrderDetail = returnOrder.Details?.FirstOrDefault(x => x.MCode == item.MaterielCode);
|
if (returnOrderDetail != null)
|
{
|
returnOrderDetail.OverReturnQty = item.OverInQuantity;
|
returnOrderDetail.OrderDetailStatus = ReturnOrderStatusEnum.Returned.ObjToInt();
|
}
|
}
|
}
|
}
|
else
|
inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
|
|
_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);
|
if (returnOrder != null)
|
{
|
_inboundRepository.ReturnOrderRepository.UpdateData(returnOrder);
|
_inboundRepository.ReturnOrderDetailRepository.UpdateData(returnOrder.Details);
|
}
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.Inbound);
|
_unitOfWorkManage.CommitTran();
|
|
#region 入库完成上报ERP
|
if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt() && inboundOrder.OrderType != InOrderTypeEnum.Allocat.ObjToInt())
|
{
|
if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt())
|
{
|
FeedbackReturnOrder(inboundOrder, returnOrder);
|
}
|
else
|
{
|
FeedbackInboundOrder(inboundOrder.Id);
|
}
|
}
|
#endregion
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// WMS入平库不推单据
|
/// </summary>
|
/// <param name="warehouseId"></param>
|
/// <param name="serNums"></param>
|
/// <returns></returns>
|
public WebResponseContent WMSInPinKu(int warehouseId, List<string> serNums)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == warehouseId);
|
if (warehouse == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该仓库信息");
|
}
|
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($"未找到该物料的信息");
|
}
|
float beforeQuantity = 0;
|
Dt_StockInfo stockInfo = new Dt_StockInfo()
|
{
|
PalletCode = DateTime.Now.ToString("yyyyMMddHHmmss"),
|
StockStatus = StockStatusEmun.入库完成.ObjToInt(),
|
WarehouseId = warehouse.WarehouseId,
|
PalletType = PalletTypeEnum.SmallPallet.ObjToInt(),
|
LocationCode = "平库位",
|
Details = new List<Dt_StockInfoDetail>()
|
};
|
List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
|
foreach (var model in models)
|
{
|
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
|
{
|
BatchNo = model.LotNo,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
MaterielSpec = materielInfo.MaterielSpec,
|
SerialNumber = model.SerialNumber,
|
StockQuantity = model.Quantity,
|
OutboundQuantity = 0,
|
OrderNo = "",
|
Unit = materielInfo.MaterielUnit,
|
Status = StockStatusEmun.入库完成.ObjToInt(),
|
ProductionDate = model.ProductionDate,
|
EffectiveDate = model.EffectiveDate,
|
};
|
|
if (stockInfo.Id > 0)
|
{
|
stockInfoDetail.StockId = stockInfo.Id;
|
}
|
stockInfo.Details.Add(stockInfoDetail);
|
|
stockInfoDetails.Add(stockInfoDetail);
|
|
}
|
float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
|
_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();
|
}
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.Inbound);
|
_unitOfWorkManage.CommitTran();
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 组盘
|
/// </summary>
|
/// <param name="saveModel"></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();
|
var serNums = saveModel.DelKeys.Select(x => x.ToString()).ToList();
|
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.InboundOrderNo == 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, serNums);
|
//验证判断时间格式
|
WebResponseContent IsValidContent = IsValidMCDates(models);
|
if (!IsValidContent.Status)
|
{
|
return content.Error(IsValidContent.Message);
|
}
|
//除采购入库单以外其他入库单组盘数据处理
|
if (inboundOrder.OrderType != InOrderTypeEnum.Purchase.ObjToInt())
|
{
|
return OtherInGroup(inboundOrder, palletCode, Initiallife, warehouse, models);
|
}
|
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();
|
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 && x.BatchNo == (models.FirstOrDefault()?.LotNo ?? "")).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 = GetPalletType(warehouse, palletCode),
|
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.HA64.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.HA57.ToString())
|
{
|
if (models.Count >= 2)
|
{
|
return WebResponseContent.Instance.Error($"组盘明细不唯一");
|
}
|
}
|
|
List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
|
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.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()
|
{
|
BatchNo = model.LotNo,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
MaterielSpec = materielInfo.MaterielSpec,
|
OrderNo = inboundOrder.InboundOrderNo,
|
SerialNumber = model.SerialNumber,
|
StockQuantity = model.Quantity,
|
OutboundQuantity = 0,
|
Unit = materielInfo.MaterielUnit,
|
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;
|
if (notGroupDetail.ReceiptQuantity>notGroupDetail.OrderQuantity)
|
{
|
return WebResponseContent.Instance.Error($"组盘数量溢出{notGroupDetail.ReceiptQuantity - notGroupDetail.OrderQuantity}");
|
}
|
if (notGroupDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
|
{
|
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();
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
public WebResponseContent OtherInGroup(Dt_InboundOrder inboundOrder,string? palletCode,int Initiallife,Dt_Warehouse warehouse,List<MatSerNumAnalysisModel> models)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (models.Select(x => x.MaterielCode).Distinct().Count() > 1)
|
{
|
return content.Error($"物料不可混放");
|
}
|
//验证判断时间格式
|
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 content.Error($"未找到该物料的信息");
|
}
|
|
List<Dt_InboundOrderDetail> inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == materielCode).ToList();
|
|
if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0)
|
{
|
return content.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 = GetPalletType(warehouse, palletCode),
|
Details = new List<Dt_StockInfoDetail>()
|
};
|
}
|
else
|
{
|
if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt())
|
{
|
return content.Error($"托盘号重复");
|
}
|
beforeQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
|
}
|
|
if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString())
|
{
|
stockInfo.Remark = Initiallife.ToString();
|
string batchNo = models.FirstOrDefault()?.LotNo ?? "";
|
Dt_StockInfoDetail existDetail = _stockRepository.StockInfoDetailRepository.QueryFirst(x => x.BatchNo == batchNo);
|
if (existDetail != null)
|
{
|
return content.Error($"{batchNo}测试架已存在");
|
}
|
if (models.Count >= 2)
|
{
|
return content.Error($"组盘明细不唯一");
|
}
|
if (palletCode.Substring(0, 1) == "6")
|
{
|
stockInfo.PalletType = PalletTypeEnum.MediumPallet.ObjToInt();
|
}
|
else
|
{
|
stockInfo.PalletType = PalletTypeEnum.LargestPallet.ObjToInt();
|
}
|
}
|
else if (warehouse.WarehouseCode == WarehouseEnum.HA57.ToString())
|
{
|
if (models.Count >= 2)
|
{
|
return content.Error($"组盘明细不唯一");
|
}
|
}
|
|
List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
|
foreach (var model in models)
|
{
|
Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus <= OrderDetailStatusEnum.Inbounding.ObjToInt() && x.MaterielCode == model.MaterielCode && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault();
|
|
if (notGroupDetail == null)
|
{
|
return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成");
|
}
|
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
|
{
|
BatchNo = model.LotNo,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
MaterielSpec = materielInfo.MaterielSpec,
|
OrderNo = inboundOrder.InboundOrderNo,
|
SerialNumber = model.SerialNumber,
|
StockQuantity = model.Quantity,
|
OutboundQuantity = 0,
|
Unit = materielInfo.MaterielUnit,
|
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;
|
if (notGroupDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
|
{
|
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();
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
|
public WebResponseContent MaterielGroup(string palletCode, int Initiallife, int warehouseId, List<string> serNums)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == warehouseId);
|
if (warehouse == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该仓库信息");
|
}
|
|
List<MatSerNumAnalysisModel> models = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNums);
|
|
if (models.Select(x => x.MaterielCode).Distinct().Count() > 1)
|
{
|
return WebResponseContent.Instance.Error($"物料不可混放");
|
}
|
//验证判断时间格式
|
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($"未找到该物料的信息");
|
}
|
|
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 = warehouse.WarehouseId,
|
PalletType = GetPalletType(warehouse, palletCode),
|
Details = new List<Dt_StockInfoDetail>()
|
};
|
}
|
else
|
{
|
if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"托盘号重复");
|
}
|
beforeQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
|
}
|
|
if (warehouse.WarehouseCode == WarehouseEnum.HA64.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($"组盘明细不唯一");
|
}
|
stockInfo.Remark = Initiallife.ToString();
|
if (palletCode.Substring(0, 1) == "6")
|
{
|
stockInfo.PalletType = PalletTypeEnum.MediumPallet.ObjToInt();
|
}
|
else
|
{
|
stockInfo.PalletType = PalletTypeEnum.LargestPallet.ObjToInt();
|
}
|
}
|
else if (warehouse.WarehouseCode == WarehouseEnum.HA57.ToString())
|
{
|
if (models.Count >= 2)
|
{
|
return WebResponseContent.Instance.Error($"组盘明细不唯一");
|
}
|
}
|
|
List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
|
List<int> detailKeys = new List<int>();
|
foreach (var model in models)
|
{
|
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
|
{
|
BatchNo = model.LotNo,
|
MaterielCode = materielInfo.MaterielCode,
|
MaterielName = materielInfo.MaterielName,
|
MaterielSpec = materielInfo.MaterielSpec,
|
OrderNo = "",
|
SerialNumber = model.SerialNumber,
|
StockQuantity = model.Quantity,
|
OutboundQuantity = 0,
|
Unit = materielInfo.MaterielUnit,
|
Status = StockStatusEmun.组盘暂存.ObjToInt(),
|
ProductionDate = model.ProductionDate,
|
EffectiveDate = model.EffectiveDate,
|
InboundOrderRowNo = 0,
|
};
|
|
if (stockInfo.Id > 0)
|
{
|
stockInfoDetail.StockId = stockInfo.Id;
|
}
|
stockInfo.Details.Add(stockInfoDetail);
|
|
stockInfoDetails.Add(stockInfoDetail);
|
}
|
|
float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
|
|
_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();
|
}
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup);
|
_unitOfWorkManage.CommitTran();
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 入库完成上报ERP
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent FeedbackInboundOrder(int inboundOrderId)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.Id == inboundOrderId).Includes(x => x.Details).First();
|
if (inboundOrder.Details.Count == 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到入库单明细信息");
|
}
|
|
List<Dt_StockInfoDetail> stockInfoDetails = _stockRepository.StockInfoDetailRepository.QueryData(x => x.OrderNo == inboundOrder.InboundOrderNo);
|
if (stockInfoDetails.Count == 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到库存明细信息");
|
}
|
//获取该入库单所有库存
|
List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => stockInfoDetails.GroupBy(x => x.StockId).Select(x => x.Key).Contains(x.Id)).Includes(x => x.Details).ToList();
|
Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == inboundOrder.WarehouseId);
|
if (warehouse == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到仓库信息");
|
}
|
List<ERPInboundDetailModel>? detailModels = new List<ERPInboundDetailModel>();
|
foreach (var stockInfo in stockInfos)
|
{
|
foreach (var item in stockInfo.Details.GroupBy(x => x.InboundOrderRowNo).Select(x => x.Key))
|
{
|
//区分不同批次
|
Dt_StockInfoDetail? dt_StockInfoDetail = stockInfo.Details.Where(x => x.InboundOrderRowNo == item).FirstOrDefault();
|
ERPInboundDetailModel detailModel = new ERPInboundDetailModel()
|
{
|
ExpiryDate = dt_StockInfoDetail?.EffectiveDate ?? "",
|
LocationCode = warehouse.WarehouseCode,
|
MaterialsCode = dt_StockInfoDetail.MaterielCode,
|
MfgDate = dt_StockInfoDetail.ProductionDate ?? "",
|
QtyCustoms = "0",
|
Quantity = stockInfo.Details.Where(x => x.InboundOrderRowNo == item).Sum(x => x.StockQuantity).ToString(),
|
Rack = stockInfo.LocationCode,
|
ReceiptCode = inboundOrder.UpperOrderNo,
|
ReceiptSerNo = item.ToString()
|
};
|
detailModels.Add(detailModel);
|
}
|
}
|
ERPInboundModel model = new ERPInboundModel()
|
{
|
Code = CreateCodeByRule(nameof(RuleCodeEnum.RLCodeRule)),
|
CreatorCode = inboundOrder.Creater,
|
EntDate = inboundOrder.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"),
|
StockDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
SuppliersId = inboundOrder.SupplierId,
|
Type = "S",
|
UniqueTag = inboundOrder.Id.ToString(),
|
WarehouseCode = warehouse.WarehouseCode,
|
Way = 1,
|
Details = detailModels
|
};
|
//推送ERP
|
_invokeERPService.InvokeInboundOrderApi(model);
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 退料完成上报至ERP
|
/// </summary>
|
public WebResponseContent FeedbackReturnOrder(Dt_InboundOrder inboundOrder,Dt_ReturnOrder returnOrder)
|
{
|
WebResponseContent content= new WebResponseContent();
|
try
|
{
|
if (returnOrder==null)
|
{
|
return content.OK();
|
}
|
//获取仓库编码
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseId==inboundOrder.WarehouseId);
|
|
var groupedDetails = returnOrder.Details.GroupBy(d => new { d.PickCode, d.RowId })
|
.Select(g => new
|
{
|
PickCode = returnOrder.OrderNo,
|
RowIndex = g.Key.RowId,
|
Details = g.ToList()
|
})
|
.ToList();
|
// 构建嵌套结构
|
var issitems = groupedDetails.Select(g => new ReturnItem
|
{
|
Pickcode = g.PickCode,
|
Rowindex = g.RowIndex,
|
PickList = g.Details
|
.GroupBy(d => d.MCode)
|
.Select(mg => new ReturnPickItem
|
{
|
Material = mg.Key,
|
Qty = mg.Sum(x => x.ReturnQty),
|
Dataitem = mg.Select(d => new ReturnDataItem
|
{
|
Lotno = d.BatchNo,
|
Qty = d.ReturnQty,
|
Location = warehouse.WarehouseCode,
|
Msfpart = d.Code
|
}).ToList()
|
}).ToList()
|
}).ToList();
|
//获取对应退料单
|
ERPReturnModel returnModel = new ERPReturnModel()
|
{
|
Way = 1,
|
UniqueTag = returnOrder.Id.ToString(),
|
Code = CreateCodeByRule(nameof(RuleCodeEnum.TLCodeRule)),
|
WarehouseCode = warehouse.WarehouseCode,
|
Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
Createuser=inboundOrder.Creater,
|
IsDev=returnOrder.IsDev,
|
Issitem= issitems
|
};
|
_invokeERPService.InvokeReturnApi(returnModel);
|
return content.OK();
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 成品入库上传ERP
|
/// </summary>
|
public WebResponseContent FeedbackProIn(Dt_MesProInOrder mesProInOrder)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
List<ERPProItemsItem> proItemsItems = new List<ERPProItemsItem>();
|
foreach (var item in mesProInOrder.Details)
|
{
|
ERPProItemsItem proItemsItem = new ERPProItemsItem()
|
{
|
PartNum = item.ProductCode,
|
Rev=item.ProductVersion,
|
DateCode=item.DateCode,
|
BatchNumber= item.BagNo,
|
XLocation=item.XSite,
|
Xqty=item.XQty,
|
QtySet=item.SETQty,
|
QtyPcs=item.OKPCSQTY,
|
WoList=new List<ERPProListItem>()
|
{
|
new ERPProListItem()
|
{
|
moNumber=item.MoNumber,
|
WoNumber=item.ERPOrder,
|
QtyPcs=item.OKPCSQTY,
|
QtySet=item.SETQty
|
}
|
}
|
};
|
proItemsItems.Add(proItemsItem);
|
}
|
ERPProInboundModel proInboundModel = new ERPProInboundModel()
|
{
|
Way = 1,
|
Code = mesProInOrder.ProInOrderNo,
|
CreatorCode = "GSWMS",
|
CompanyCode = "HATC",
|
FactoryCode = "HA02",
|
WarehouseCode = "HA71",
|
LocationCode = "HA71",
|
StockDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
StockFormType= "Production",
|
StockFormItems= proItemsItems
|
};
|
_invokeERPService.InvokeProInApi(proInboundModel);
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
static object lock_code = new object();
|
public string CreateCodeByRule(string ruleCode)
|
{
|
lock (lock_code)
|
{
|
|
string code = string.Empty;
|
DateTime dateTime = DateTime.Now;
|
DateTime now = DateTime.Now;
|
try
|
{
|
if (string.IsNullOrEmpty(ruleCode))
|
throw new ArgumentNullException(nameof(ruleCode));
|
SqlSugarClient sugarClient = new SqlSugarClient(new ConnectionConfig
|
{
|
IsAutoCloseConnection = true,
|
DbType = DbType.SqlServer,
|
ConnectionString = DBContext.ConnectionString
|
});
|
Dt_CodeRuleConfig codeRuleConfig = sugarClient.Queryable<Dt_CodeRuleConfig>().Where(x => x.RuleCode == ruleCode).First();
|
if (codeRuleConfig == null)
|
throw new ArgumentNullException(nameof(codeRuleConfig));
|
if (codeRuleConfig.ModifyDate != null)
|
{
|
dateTime = Convert.ToDateTime(codeRuleConfig.ModifyDate);
|
}
|
else
|
{
|
dateTime = Convert.ToDateTime(codeRuleConfig.CreateDate);
|
}
|
|
if (now.Year == dateTime.Year && now.Month == dateTime.Month && now.Day == dateTime.Day)
|
{
|
now = dateTime;
|
codeRuleConfig.CurrentVal = Convert.ToInt32(codeRuleConfig.CurrentVal) + 1;
|
}
|
else
|
{
|
codeRuleConfig.CurrentVal = 1;
|
}
|
codeRuleConfig.ModifyDate = DateTime.Now;
|
code = codeRuleConfig.Format;
|
code = code.Replace($"[{CodeFormatTypeEnum.YYYY}]", now.Year.ToString().PadLeft(4, '0'));
|
code = code.Replace($"[{CodeFormatTypeEnum.MM}]", now.Month.ToString().PadLeft(2, '0'));
|
code = code.Replace($"[{CodeFormatTypeEnum.DD}]", now.Day.ToString().PadLeft(2, '0'));
|
code = code.Replace($"[{CodeFormatTypeEnum.ST}]", codeRuleConfig.StartStr?.ToString() ?? "");
|
code = code.Replace($"[{CodeFormatTypeEnum.NUM}]", codeRuleConfig.CurrentVal.ToString().PadLeft(codeRuleConfig.Length, '0'));
|
Dictionary<string, object> keyValuePairs = new Dictionary<string, object>() { { nameof(codeRuleConfig.CurrentVal), codeRuleConfig.CurrentVal }, { nameof(codeRuleConfig.Id), codeRuleConfig.Id }, { nameof(codeRuleConfig.ModifyDate), DateTime.Now } };
|
sugarClient.Updateable(keyValuePairs).AS(MainDb.CodeRuleConfig).WhereColumns(nameof(codeRuleConfig.Id)).ExecuteCommand();
|
sugarClient.Updateable(codeRuleConfig);
|
|
}
|
catch (Exception ex)
|
{
|
|
}
|
return code;
|
}
|
}
|
#region 弃用
|
/// <summary>
|
/// 入库完成回传到ERP
|
/// </summary>
|
/// <param name="id"></param>
|
/// <returns></returns>
|
//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($"入库单据已完成");
|
// }
|
|
// 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,//测试
|
// EntDate = inboundOrder.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"),
|
// StockDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
// SuppliersId = inboundOrder.SupplierId,
|
// Type = "S",
|
// UniqueTag = inboundOrder.Id.ToString(),
|
// WarehouseCode = warehouse2.WarehouseCode,
|
// Way = 1,
|
// Details = detailModels
|
// };
|
// //测试注释
|
// _invokeERPService.InvokeInboundOrderApi(model);
|
// return WebResponseContent.Instance.OK();
|
// }
|
// catch (Exception ex)
|
// {
|
// return WebResponseContent.Instance.Error(ex.Message);
|
// }
|
//}
|
#endregion
|
public int GetPalletType(Dt_Warehouse warehouse, string palletCode)
|
{
|
if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString())
|
{
|
if (palletCode.Substring(0, 1) == "6")
|
{
|
return PalletTypeEnum.MediumPallet.ObjToInt();
|
}
|
else
|
{
|
return PalletTypeEnum.LargestPallet.ObjToInt();
|
}
|
}
|
else if (warehouse.WarehouseCode == WarehouseEnum.HA153.ObjToString())
|
{
|
Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.CodeStartStr == palletCode.Substring(0, 1));
|
if (palletTypeInfo == null)
|
{
|
throw new Exception($"托盘号错误");
|
}
|
return palletTypeInfo.PalletType;
|
}
|
else if (warehouse.WarehouseCode == WarehouseEnum.HA152.ObjToString())
|
{
|
Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.CodeStartStr == palletCode.Substring(0, 2));
|
if (palletTypeInfo == null)
|
{
|
throw new Exception($"托盘号错误");
|
}
|
return palletTypeInfo.PalletType;
|
}
|
else if (warehouse.WarehouseCode == WarehouseEnum.HA57.ObjToString())
|
{
|
Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.CodeStartStr == palletCode.Substring(0, 3));
|
if (palletTypeInfo == null)
|
{
|
throw new Exception($"托盘号错误");
|
}
|
return palletTypeInfo.PalletType;
|
}
|
return -1;
|
}
|
/// <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();
|
}
|
}
|
}
|