using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using HH.WCS.Mobox3.RiDong.dto;
|
using HH.WCS.Mobox3.RiDong.generalMethod;
|
using HH.WCS.Mobox3.RiDong.models;
|
using HH.WCS.Mobox3.RiDong.util;
|
|
namespace HH.WCS.Mobox3.RiDong.apiMethod;
|
|
/// <summary>
|
/// 出库流程方法类
|
/// </summary>
|
public abstract class OutWareHouseService
|
{
|
/// <summary>
|
/// 创建出库单
|
/// </summary>
|
public static void CreateOutboundOrderFromMaterialOut(List<MaterialOut> materialOuts)
|
{
|
List<OutboundOrder> outboundOrders = new List<OutboundOrder>();
|
|
// 创建出库单
|
foreach (var materialOut in materialOuts)
|
{
|
// 查询物料表
|
var tnMaterial = AdoSqlMethod<TN_Material>.QueryFirst(p => p.S_ITEM_CODE == materialOut.S_INT_PRODUCT_CODE);
|
|
// 物料表为空
|
if (tnMaterial is null)
|
{
|
if (materialOut.S_ITEM_EMPTY != "物料不存在")
|
{
|
materialOut.S_ITEM_EMPTY = "物料不存在";
|
AdoSqlMethod<MaterialOut>.UpdateFirst(materialOut, p => new { p.S_ITEM_EMPTY });
|
}
|
}
|
else
|
{
|
if (outboundOrders.Count > 0 && outboundOrders.Count(p => p.S_NO == materialOut.S_TRAN_SUB_SEQ) > 0)
|
{
|
if (tnMaterial.ISAUTO == "Y")
|
{
|
materialOut.S_TRANSACTION += "-001";
|
}
|
else
|
{
|
materialOut.S_TRANSACTION += "-002";
|
}
|
|
var outboundOrder = outboundOrders.First(p => p.S_NO == materialOut.S_TRANSACTION);
|
|
outboundOrder.Details.Add(new OutboundDetail()
|
{
|
S_OO_NO = outboundOrder.S_NO,
|
S_SERIAL_NO = outboundOrder.S_NO,
|
N_ROW_NO = materialOut.S_ORDER_LINE,
|
S_BATCH_NO = materialOut.S_LOT,
|
F_QTY = materialOut.S_LOR_QUANTITYOT,
|
S_ITEM_CODE = materialOut.S_INT_PRODUCT_CODE,
|
S_IDENTIFICATION = "MO",
|
S_ITEM_NAME = tnMaterial.S_ITEM_NAME,
|
S_BS_NO = materialOut.S_SO
|
});
|
|
materialOut.S_CREATE_OK = 1;
|
}
|
else
|
{
|
// 创建出库单主表数据
|
OutboundOrder outboundOrder = new OutboundOrder();
|
|
if (tnMaterial.ISAUTO == "Y")
|
{
|
outboundOrder.ISAUTO = "Y";
|
materialOut.S_TRANSACTION += "-001";
|
}
|
else
|
{
|
outboundOrder.ISAUTO = "N";
|
materialOut.S_TRANSACTION += "-002";
|
}
|
|
outboundOrder.S_NO = materialOut.S_TRANSACTION;
|
|
outboundOrder.Details = new List<OutboundDetail>();
|
|
outboundOrder.Details.Add(new OutboundDetail()
|
{
|
S_OO_NO = outboundOrder.S_NO,
|
S_SERIAL_NO = outboundOrder.S_NO,
|
N_ROW_NO = materialOut.S_ORDER_LINE,
|
S_BATCH_NO = materialOut.S_LOT,
|
F_QTY = materialOut.S_LOR_QUANTITYOT,
|
S_ITEM_CODE = materialOut.S_INT_PRODUCT_CODE,
|
S_IDENTIFICATION = "MO",
|
S_ITEM_NAME = tnMaterial.S_ITEM_NAME,
|
S_BS_NO = materialOut.S_SO
|
});
|
|
materialOut.S_CREATE_OK = 1;
|
|
outboundOrders.Add(outboundOrder);
|
}
|
}
|
}
|
|
var querySqlSugarClient = AdoSqlMethod<object>.QuerySqlSugarClient();
|
|
try
|
{
|
querySqlSugarClient.BeginTran();
|
AdoSqlMethod<OutboundOrder>.AddOutboundOrderAndDetailsListTran(querySqlSugarClient, outboundOrders);
|
AdoSqlMethod<MaterialOut>.UpdateListTran(querySqlSugarClient, materialOuts, p => new { p.S_CREATE_OK });
|
querySqlSugarClient.CommitTran();
|
}
|
catch (Exception e)
|
{
|
Console.WriteLine(e);
|
querySqlSugarClient.RollbackTran();
|
}
|
}
|
|
/// <summary>
|
/// 创建出库单
|
/// </summary>
|
public static void CreateOutboundOrderFromDoOut(List<DoOut> doOuts)
|
{
|
List<OutboundOrder> outboundOrders = new List<OutboundOrder>();
|
|
// 创建出库单
|
foreach (var doOut in doOuts)
|
{
|
// 查询物料表
|
var tnMaterial = AdoSqlMethod<TN_Material>.QueryFirst(p => p.S_ITEM_CODE == doOut.S_INT_PRODUCT_CODE);
|
|
if (tnMaterial == null)
|
{
|
if (doOut.S_ITEM_EMPTY != "物料不存在")
|
{
|
doOut.S_ITEM_EMPTY = "物料不存在";
|
AdoSqlMethod<DoOut>.UpdateFirst(doOut, p => new { p.S_ITEM_EMPTY });
|
}
|
}
|
else
|
{
|
if (tnMaterial.ISAUTO == "Y")
|
{
|
doOut.S_TRANSACTION += "-001";
|
}
|
else
|
{
|
doOut.S_TRANSACTION += "-002";
|
}
|
|
if (outboundOrders.Count > 0 && outboundOrders.Count(p => p.S_NO == doOut.S_TRANSACTION) > 0)
|
{
|
var outboundOrder = outboundOrders.First(p => p.S_NO == doOut.S_TRANSACTION);
|
|
outboundOrder.Details.Add(new OutboundDetail
|
{
|
S_OO_NO = outboundOrder.S_NO,
|
S_SERIAL_NO = outboundOrder.S_NO,
|
N_ROW_NO = doOut.S_ORDER_LINE,
|
S_BATCH_NO = doOut.S_LOT,
|
F_QTY = doOut.S_LOR_QUANTITYOT,
|
S_ITEM_CODE = doOut.S_INT_PRODUCT_CODE,
|
S_IDENTIFICATION = "DO",
|
S_ITEM_NAME = tnMaterial.S_ITEM_NAME,
|
S_BS_NO = doOut.S_SO
|
});
|
|
doOut.S_CREATE_OK = 1;
|
}
|
else
|
{
|
// 创建出库单主表数据
|
OutboundOrder outboundOrder = new OutboundOrder();
|
|
if (tnMaterial.ISAUTO == "Y")
|
{
|
outboundOrder.ISAUTO = "Y";
|
doOut.S_TRANSACTION += "-001";
|
}
|
else
|
{
|
outboundOrder.ISAUTO = "N";
|
doOut.S_TRANSACTION += "-002";
|
}
|
|
outboundOrder.S_NO = doOut.S_TRANSACTION;
|
|
outboundOrder.Details = new List<OutboundDetail>();
|
|
outboundOrder.Details.Add(new OutboundDetail()
|
{
|
S_OO_NO = outboundOrder.S_NO,
|
S_SERIAL_NO = outboundOrder.S_NO,
|
N_ROW_NO = doOut.S_ORDER_LINE,
|
S_BATCH_NO = doOut.S_LOT,
|
F_QTY = doOut.S_LOR_QUANTITYOT,
|
S_ITEM_CODE = doOut.S_INT_PRODUCT_CODE,
|
S_IDENTIFICATION = "DO",
|
S_ITEM_NAME = tnMaterial.S_ITEM_NAME,
|
S_BS_NO = doOut.S_SO,
|
});
|
|
doOut.S_CREATE_OK = 1;
|
|
outboundOrders.Add(outboundOrder);
|
}
|
}
|
}
|
|
var querySqlSugarClient = AdoSqlMethod<object>.QuerySqlSugarClient();
|
|
try
|
{
|
querySqlSugarClient.BeginTran();
|
AdoSqlMethod<OutboundOrder>.AddOutboundOrderAndDetailsListTran(querySqlSugarClient, outboundOrders);
|
AdoSqlMethod<DoOut>.UpdateListTran(querySqlSugarClient, doOuts, p => new { p.S_CREATE_OK });
|
querySqlSugarClient.CommitTran();
|
}
|
catch (Exception e)
|
{
|
Console.WriteLine(e);
|
querySqlSugarClient.RollbackTran();
|
}
|
}
|
|
/// <summary>
|
/// 结果确定
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
public static ApiModel.SimpleResult ResultDetermination(ResultDeterminationDto input)
|
{
|
var result = new ApiModel.SimpleResult();
|
|
var container = AdoSqlMethod<Container>.QueryFirst(p => p.S_CODE == input.cntrCode);
|
|
// 判断托盘在容器表中是存在
|
if (container != null)
|
{
|
// 托盘存在,将托盘变更为可用状态
|
container.C_ENABLE = 'Y';
|
|
// 找到所有的容器货品明细数据
|
var cntrItemDetails = AdoSqlMethod<CntrItemDetail>.QueryList(p => p.S_CNTR_CODE == input.cntrCode);
|
|
if (cntrItemDetails.Count > 0)
|
{
|
// 容器货品明细数据存在
|
foreach (var cntrItemDetail in cntrItemDetails)
|
{
|
cntrItemDetail.F_QTY -= cntrItemDetail.F_ALLOC_QTY;
|
cntrItemDetail.F_ALLOC_QTY = 0;
|
|
// 如果当前容器货品明细数据为0
|
if (cntrItemDetail.F_QTY == 0)
|
{
|
// 删除容器货品明细
|
AdoSqlMethod<CntrItemDetail>.DeleteFirst(cntrItemDetail);
|
container.N_DETAIL_COUNT -= 1;
|
}
|
else
|
{
|
AdoSqlMethod<CntrItemDetail>.UpdateFirst(cntrItemDetail, p => new { p.F_QTY, p.F_ALLOC_QTY });
|
}
|
}
|
|
// 找到对应的配盘明细数据
|
var distributionCntrDetails = AdoSqlMethod<TN_Distribution_CNTR_Detail>
|
.QueryList(p => input.ids.Contains(p.S_ID));
|
|
if (distributionCntrDetails.Count > 0)
|
{
|
var moBoxInputDto = new MoBoxInputDto();
|
moBoxInputDto.op_type = 4;
|
|
var moBoxInputDto2 = new MoBoxInputDto();
|
moBoxInputDto2.op_type = 7;
|
|
foreach (var distribution in distributionCntrDetails)
|
{
|
distribution.IS_SORTING = "Y";
|
distribution.F_ACC_P_QTY = distribution.F_QTY;
|
|
var moBoxInputDetailDto = new MoBoxInputDetailDto();
|
moBoxInputDetailDto.item_code = distribution.S_ITEM_CODE;
|
moBoxInputDetailDto.item_name = distribution.S_ITEM_NAME;
|
moBoxInputDetailDto.qty = Convert.ToInt32(distribution.F_QTY);
|
moBoxInputDetailDto.wh_code = Settings.WHCode;
|
moBoxInputDetailDto.area_code = Settings.AreaCode;
|
|
var moBoxInputDetailDto2 = new MoBoxInputDetailDto();
|
moBoxInputDetailDto2.item_code = distribution.S_ITEM_CODE;
|
moBoxInputDetailDto2.item_name = distribution.S_ITEM_NAME;
|
moBoxInputDetailDto2.qty = Convert.ToInt32(distribution.F_QTY);
|
moBoxInputDetailDto2.area_code = Settings.AreaCode;
|
moBoxInputDetailDto2.wh_code = Settings.WHCode;
|
|
moBoxInputDto.item_info.Add(moBoxInputDetailDto);
|
moBoxInputDto2.item_info.Add(moBoxInputDetailDto2);
|
}
|
|
// 调用第三方接口
|
ThirdlyPortMethod.CallMoboxWMSAddChange("/api/wms/inventory/AddChange", moBoxInputDto);
|
ThirdlyPortMethod.CallMoboxWMSAddChange("/api/wms/inventory/AddChange", moBoxInputDto2);
|
|
AdoSqlMethod<TN_Distribution_CNTR_Detail>.UpdateList(distributionCntrDetails,
|
p => new { p.IS_SORTING, p.F_ACC_P_QTY });
|
|
var tnDistributionCntr = AdoSqlMethod<TN_Distribution_CNTR>.QueryFirst(p => distributionCntrDetails[0].S_DC_NO == p.S_DC_NO);
|
|
if (tnDistributionCntr != null)
|
{
|
// 根据主表找到所有的配盘子表数据
|
var tnDistributionCntrDetails =
|
AdoSqlMethod<TN_Distribution_CNTR_Detail>.QueryList(p =>
|
p.S_DC_NO == tnDistributionCntr.S_DC_NO);
|
|
// 配盘明细完成的数量和总数量一致,出库单完成
|
if (tnDistributionCntrDetails.Count(p => p.IS_SORTING == "Y") ==
|
tnDistributionCntrDetails.Count)
|
{
|
tnDistributionCntr.N_B_STATE = 6;
|
tnDistributionCntr.S_B_STATE = "完成";
|
AdoSqlMethod<TN_Distribution_CNTR>.UpdateFirst(tnDistributionCntr, p => new { p.N_B_STATE, p.S_B_STATE });
|
|
var tnDistributionCntrs = AdoSqlMethod<TN_Distribution_CNTR>.QueryList(p => p.S_BS_NO == tnDistributionCntr.S_BS_NO);
|
|
if (tnDistributionCntrs.Count(p => p.N_B_STATE == 6) == tnDistributionCntrs.Count)
|
{
|
var outboundOrder = AdoSqlMethod<OutboundOrder>.QueryFirst(p => p.S_NO == tnDistributionCntr.S_BS_NO);
|
outboundOrder.N_B_STATE = 4;
|
AdoSqlMethod<OutboundOrder>.UpdateFirst(outboundOrder, p => new { p.N_B_STATE });
|
}
|
}
|
}
|
|
AdoSqlMethod<Container>.UpdateFirst(container, p => new { p.C_ENABLE, p.N_DETAIL_COUNT });
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = $"当前容器{input.cntrCode}的配盘单明细数据不存在";
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = $"当前容器{input.cntrCode}的容器货品明细数据不存在";
|
}
|
}
|
else
|
{
|
result.resultCode = -1;
|
result.resultMsg = $"当前容器{input.cntrCode}不存在";
|
}
|
|
return result;
|
}
|
|
/// <summary>
|
/// 指引出库结果确定
|
/// </summary>
|
/// <returns></returns>
|
public static ApiModel.SimpleResult ResultDeterminationGuideOut(Task task)
|
{
|
var result = new ApiModel.SimpleResult();
|
|
// 找到所有的容器货品明细数据
|
var cntrItemDetails = AdoSqlMethod<CntrItemDetail>.QueryList(p => p.S_CNTR_CODE == task.S_CNTR_CODE);
|
|
if (cntrItemDetails.Count > 0)
|
{
|
var moBoxInputDto = new MoBoxInputDto();
|
moBoxInputDto.op_type = 4;
|
|
var moBoxInputDto2 = new MoBoxInputDto();
|
moBoxInputDto2.op_type = 7;
|
|
foreach (var distribution in cntrItemDetails)
|
{
|
var moBoxInputDetailDto = new MoBoxInputDetailDto();
|
moBoxInputDetailDto.item_code = distribution.S_ITEM_CODE;
|
moBoxInputDetailDto.item_name = distribution.S_ITEM_NAME;
|
moBoxInputDetailDto.qty = Convert.ToInt32(distribution.F_QTY);
|
moBoxInputDetailDto.wh_code = Settings.WHCode;
|
moBoxInputDetailDto.area_code = Settings.AreaCode;
|
|
var moBoxInputDetailDto2 = new MoBoxInputDetailDto();
|
moBoxInputDetailDto2.item_code = distribution.S_ITEM_CODE;
|
moBoxInputDetailDto2.item_name = distribution.S_ITEM_NAME;
|
moBoxInputDetailDto2.qty = Convert.ToInt32(distribution.F_QTY);
|
moBoxInputDetailDto2.area_code = Settings.AreaCode;
|
moBoxInputDetailDto2.wh_code = Settings.WHCode;
|
|
moBoxInputDto.item_info.Add(moBoxInputDetailDto);
|
moBoxInputDto2.item_info.Add(moBoxInputDetailDto2);
|
}
|
|
// 调用第三方接口
|
ThirdlyPortMethod.CallMoboxWMSAddChange("/api/wms/inventory/AddChange", moBoxInputDto);
|
ThirdlyPortMethod.CallMoboxWMSAddChange("/api/wms/inventory/AddChange", moBoxInputDto2);
|
}
|
|
return result;
|
}
|
|
/// <summary>
|
/// 指引出库
|
/// </summary>
|
/// <param name="input"></param>
|
public static ApiModel.SimpleResult GuideOut(OperationDto input)
|
{
|
var result = new ApiModel.SimpleResult();
|
|
// 1.查询容器货位表
|
var locCntrRel = AdoSqlMethod<LocCntrRel>.QueryFirst(p => p.S_CNTR_CODE == input.cntrCode);
|
|
if (locCntrRel == null)
|
{
|
result.resultCode = -1;
|
result.resultMsg = "该容器的容器货位不存在";
|
return result;
|
}
|
|
// 2. 确定起点
|
input.startLocation = locCntrRel.S_LOC_CODE;
|
input.taskType = 5;
|
|
// 3.调用创建任务的接口
|
return SynthesizeService.AddOperation(input);
|
}
|
}
|