using HH.WMS.BLL.CoreServer;
using HH.WMS.BLL.Interface;
using HH.WMS.Common;
using HH.WMS.DAL;
using HH.WMS.DAL.Basic;
using HH.WMS.DAL.InStock;
using HH.WMS.DAL.OutStock;
using HH.WMS.Entitys;
using HH.WMS.Entitys.Basic;
using HH.WMS.Entitys.Common;
using HH.WMS.Entitys.Entitys.PrintDataSource;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HH.WMS.BLL.OutStock
{
public class TN_WM_WAVE_MSTBLL : DapperBaseBLL
{
#region 打单
///
/// 打单
///
///
///
public OperateResult CreateBill(BatchesResult bResult)
{
return UseTransaction(trans =>
{
//生成波次主表
CreateDAL>().Add(bResult.WaveMst, trans);
//生成波次子表
CreateDAL>().AddRange(bResult.WaveMst.WaveDtlList, trans);
//修改出库订单主子表状态
CreateDAL().UpdateState(bResult.OutMstList, trans);
bResult.OutMstList.ForEach(x => x.CN_S_WAVE_CODE = bResult.WaveMst.CN_S_WAVE_NO);
//修改波次
CreateDAL().UpdateWave(bResult.OutMstList, trans);
//记录仓库库存锁定明细
CreateDAL>().AddRange(bResult.OutLockingDtlList, trans);
//生成出库单主表
CreateDAL>().AddRange(bResult.ReduceInventoryMstList, trans);
//生成出库单子表
CreateDAL>().AddRange(bResult.ReduceInventoryDtlList, trans);
//生成分拣单
CreateDAL>().AddRange(bResult.SortingList, trans);
var sortingDtlList = new List();
var sortingLocationList = new List();
bResult.SortingList.ForEach(p =>
{
sortingDtlList.AddRange(p.SortingDtlList);
sortingLocationList.AddRange(p.SortingLocationList);
});
//生成分拣单子表
CreateDAL>().AddRange(sortingDtlList, trans);
////生成分拣单明细
CreateDAL>().AddRange(sortingLocationList, trans);
//库区量表分配量上升
CreateDAL().UpdateAreaAlloc(bResult.StockAreaList, trans);
//托盘物料分配量上升
CreateDAL().UpdateTrayItemAllocQty(bResult.TrayItemList, trans);
foreach (var sortingEntity in bResult.SortingList)
{
//生成任务
if (sortingEntity.Tasks.Any())
{
//增加出库任务
CreateDAL>().AddRange(sortingEntity.Tasks, trans);
//起点置为预出库锁定,终点预入库锁定
foreach (var task in sortingEntity.Tasks)
{
if (task.EndAreaEntity.CN_C_IS_AUTO == Constants.Y)
{
CreateDAL>().Update(new
{
CN_S_LOCATION_STATE = Constants.Location_State_OutLock
}, new
{
CN_S_LOCATION_CODE = task.CN_S_START_BIT
}, trans);
//存在终点
if (!string.IsNullOrEmpty(task.CN_S_END_BIT))
{
CreateDAL>().Update(new
{
CN_S_LOCATION_STATE = Constants.Location_State_InLock
}, new
{
CN_S_LOCATION_CODE = task.CN_S_END_BIT
}, trans);
//发送ams任务
var sendAms = BLLCreator.Create().SendAmsTask(task);
if (!sendAms.Success)
throw new Exception(sendAms.Msg);
}
}
}
}
}
});
}
#endregion
public OperateResult GenerateSorting(BatchesResult bResult)
{
return UseTransaction(trans =>
{
//生成波次主表
CreateDAL>().Add(bResult.WaveMst, trans);
//生成波次子表
CreateDAL>().AddRange(bResult.WaveMst.WaveDtlList, trans);
//修改出库订单主子表状态和子表数量
CreateDAL().UpdateStateAndQty(bResult.OutMstList, trans);
bResult.OutMstList.ForEach(x => x.CN_S_WAVE_CODE = bResult.WaveMst.CN_S_WAVE_NO);
//修改波次
CreateDAL().UpdateWave(bResult.OutMstList, trans);
//记录仓库库存锁定明细
CreateDAL>().AddRange(bResult.OutLockingDtlList, trans);
//生成出库单主表
CreateDAL>().AddRange(bResult.ReduceInventoryMstList, trans);
//生成出库单子表
CreateDAL>().AddRange(bResult.ReduceInventoryDtlList, trans);
//生成分拣单
CreateDAL>().AddRange(bResult.SortingList, trans);
var sortingDtlList = new List();
var sortingLocationList = new List();
bResult.SortingList.ForEach(p =>
{
sortingDtlList.AddRange(p.SortingDtlList);
sortingLocationList.AddRange(p.SortingLocationList);
});
//生成分拣单子表
CreateDAL>().AddRange(sortingDtlList, trans);
//生成分拣单明细
CreateDAL>().AddRange(sortingLocationList, trans);
//库区量表分配量上升
CreateDAL().UpdateAreaAlloc(bResult.StockAreaList, trans);
//托盘物料分配量上升
CreateDAL().UpdateTrayItemAllocQty(bResult.TrayItemList, trans);
foreach (var sortingEntity in bResult.SortingList)
{
//生成任务
if (sortingEntity.Tasks.Any())
{
//增加出库任务
CreateDAL>().AddRange(sortingEntity.Tasks, trans);
//起点置为预出库锁定,终点预入库锁定
foreach (var task in sortingEntity.Tasks)
{
if (task.EndAreaEntity.CN_C_IS_AUTO == Constants.Y)
{
CreateDAL>().Update(new
{
CN_S_LOCATION_STATE = Constants.Location_State_OutLock
}, new
{
CN_S_LOCATION_CODE = task.CN_S_START_BIT
}, trans);
//存在终点
if (!string.IsNullOrEmpty(task.CN_S_END_BIT))
{
CreateDAL>().Update(new
{
CN_S_LOCATION_STATE = Constants.Location_State_InLock
}, new
{
CN_S_LOCATION_CODE = task.CN_S_END_BIT
}, trans);
//发送ams任务
var sendAms = BLLCreator.Create().SendAmsTask(task);
if (!sendAms.Success)
throw new Exception(sendAms.Msg);
}
}
}
}
}
});
}
#region 保存物流
///
/// 保存物流
///
///
///
public OperateResult SaveWayBill(object param)
{
return CreateDAL().SaveWayBill(param);
}
#endregion
#region 保存打印信息
///
/// 保存打印信息
///
///
///
///
///
///
public OperateResult SavePrinter(List outMstList, TN_WM_PRINT_TASKEntity printTask, PrintType printType,
List outPackList)
{
return UseTransaction(trans =>
{
//添加打印任务
CreateDAL>().Add(printTask, trans);
//更新物流单打印标识
CreateDAL().UpdatePrint(outMstList, printType, trans);
//添加包装码
if (outPackList != null && outPackList.Any())
CreateDAL>().AddRange(outPackList, trans);
});
}
#endregion
#region 保存发货打印任务
///
/// 保存发货打印任务
///
///
///
///
public OperateResult SaveInvoicePrint(List outMstList, TN_WM_PRINT_TASKEntity printTask)
{
return UseTransaction(trans =>
{
//添加打印任务
CreateDAL>().Add(printTask, trans);
//更新发货单打印标识
CreateDAL().UpdatePrint(outMstList, PrintType.Invoice, trans);
});
}
#endregion
#region 确认包装复验
///
/// 确认包装复验
///
///
///
///
public OperateResult ConfirmReview(bool isAllReview, string outNo, List reviewItems, List boxDtlList)
{
return UseTransaction(trans =>
{
CreateDAL>().AddRange(reviewItems, trans);
if (boxDtlList.Any())
CreateDAL>().AddRange(boxDtlList, trans);
if (isAllReview)
{
//修改主表状态
CreateDAL>().Update(new { CN_S_STATE = Constants.State_Rechecked }, new { CN_S_OP_NO = outNo }, trans);
//修改子表状态
CreateDAL>().Update(new { CN_S_STATE = Constants.State_Rechecked }, new { CN_S_OP_NO = outNo }, trans);
}
});
}
#endregion
#region 确认发货
///
/// 确认发货
///
///
///
public OperateResult DeliverGoods(string opNo)
{
//K3对接,销售出库
string isUseK3 = "";
string stockCode = "";
var currentOutMst = CreateDAL>().GetSingleEntity(new
{
CN_S_OP_NO = opNo
});
if (currentOutMst != null)
stockCode = currentOutMst.CN_S_STOCK_CODE;
// 出库发送K3-拼接销售出库实体
List K3SalesDeliveryList = new List();
//获取策略:是否需要与K3对接
isUseK3 = GetStrategy(stockCode, StrategyKey.IsUseK3);
//吉鑫祥项目需要反馈K3系统
if (Constants.SysConfig.APP_NAME== "JXX" && isUseK3.Equals("Y"))
{
//拼接实体
List returnEntity = new InfK3Request().GetSalesDeliveryData(opNo);
if (returnEntity.Any())
{
K3SalesDeliveryList.AddRange(returnEntity);
}
}
//库存锁定明细
var outLockDtl = CreateDAL>().GetList(new
{
CN_S_FROM_NO = opNo
});
OperateResult or = UseTransaction(trans =>
{
//吉鑫祥项目需要反馈K3系统
if (K3SalesDeliveryList.Any())
{
OperateResult re = new InfK3Request().sendK3_Sales_Delivery(K3SalesDeliveryList);
if (!re.Success)
{
throw new Exception(re.Msg);
}
}
//修改主表状态
CreateDAL>().Update(new { CN_S_STATE = Constants.State_Completed }, new { CN_S_OP_NO = opNo }, trans);
//修改子表状态
CreateDAL>().Update(new { CN_S_STATE = Constants.State_Completed }, new { CN_S_OP_NO = opNo }, trans);
//降库存
if (outLockDtl.Any())
{
CreateDAL().UpdateAllocQtyByLock(Constants.Rule_OutOrder, outLockDtl, trans);
//删除锁定明细
CreateDAL().DeleteOutLock(outLockDtl, trans);
}
//OperateResult or = new OutCommint().OutCommit(currentOutMst.CN_S_OP_TYPE, currentOutMst.CN_S_FROM_NO);
//OperateResult or = new OutCommint().UpdateRdrecordCheckFlag(currentOutMst.CN_S_FROM_NO, currentOutMst.CN_S_OP_TYPE);
//or = new OtherSysApi().OutOrderConmit(currentOutMst.CN_S_OP_TYPE, currentOutMst.CN_S_FROM_NO);
//if (or.Status == ResultStatus.Error)
// throw new Exception(or.Msg);
});
if (or.Status == ResultStatus.Success)
{
or = new OtherSysApi().OutOrderConmit(currentOutMst.CN_S_OP_TYPE, currentOutMst.CN_S_FROM_NO);
return or;
}
return or;
}
#endregion
#region 确认分播
///
/// 确认分播
///
///
///
public OperateResult ConfirmSowing(string waveNo)
{
return UseTransaction(trans =>
{
CreateDAL>().Update(new
{
CN_S_STATE = Constants.Wave_Sowed
}, new
{
CN_S_WAVE_NO = waveNo
}, trans);
CreateDAL>().Update(new
{
CN_S_STATE = Constants.Wave_Sowed
}, new
{
CN_S_WAVE_NO = waveNo
}, trans);
});
}
#endregion
#region 波次列表
///
/// 波次列表
///
///
///
public OperateResult WaveList(SearchModel searchModel)
{
return CreateDAL().WaveList(searchModel);
}
#endregion
public OperateResult UpdateRdrecordCheckFlag(string opFromNo, string opType)
{
OperateResult updateState = new OperateResult() { Success = true, Msg = "" };
try
{
Log.Info("开始进入出库确认更新", opFromNo + "||" + opType);
string tableName = "";//表名
switch (opType)
{
case "其他出库":
tableName = "Rdrecord09$Rdrecords09";
break;
case "销售出库":
tableName = "Rdrecord32$Rdrecords32";
break;
default:
break;
}
Log.Info("确认tableName", tableName);
//string opDatastr = WebApiManager.HttpWMS_Get("Api/Out/GetOutU8Data?opNo=" + opFromNo);
//Log.Info("获取WMS数据", opDatastr);
//OperateResult opData = JsonConvert.DeserializeObject(opDatastr);
TN_WM_OUT_MSTEntity outMst =CreateDAL>().ExecuteSingleEntity("select * from TN_WM_OUT_MST where CN_S_FROM_NO='" + opFromNo + "'");
if (string.IsNullOrEmpty(tableName))
{
//updateState.Success = false;
//updateState.Msg = "更新失败,根据提供的业务类型,未定位到具体表!";
return OperateResult.Error("更新失败,根据提供的业务类型,未定位到具体表!");
}
Log.Info("解析WMS数据成功,开始更新中间表", "");
SqlExecuteResult result = BLLCreator.Create().UpdateRdrecordCheckFlag(opFromNo, tableName, outMst);
//SqlExecuteResult result = new OutDataDAL().UpdateRdrecordCheckFlag(opFromNo, tableName, outMst);
if (!result.Success)
{
//updateState.Success = false;
//updateState.Msg = result.Exception.ToString();
Log.Info("出库确认更新", JsonConvert.SerializeObject(updateState));
return OperateResult.Error(result.Exception.ToString());
}
return updateState;
}
catch (Exception ex)
{
Log.Info("确认tableName", ex.Message.ToString());
return OperateResult.Error(ex.Message);
}
}
}
}