using Model.InterFaceModel;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Text;
|
using WMS.DAL;
|
using WMS.Entity.BllAsnEntity;
|
using WMS.Entity.Context;
|
using WMS.Entity.DataEntity;
|
using WMS.Entity.LogEntity;
|
using WMS.Entity.SysEntity;
|
using WMS.IBLL.IBllTransServer;
|
|
namespace WMS.BLL.BllTransServer
|
{
|
public class NoticeServer : DbHelper<BllArrivalNotice>, INoticeServer
|
{
|
private static readonly SqlSugarScope Db = DataContext.Db;
|
public NoticeServer() : base(Db)
|
{
|
}
|
/// <summary>
|
/// 下发入库单
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
public ErpModel CreateAsn(AsnInfo model)
|
{
|
try
|
{
|
var resultModel = new ErpModel() { Success = -1, Message = "" };
|
if (string.IsNullOrEmpty(model.OrderCode))
|
{
|
resultModel.Message = "上游系统单号不可为空!";
|
return resultModel;
|
}
|
if (model.AsnDetails.Count <= 0)
|
{
|
resultModel.Message = "入库单明细不可为空!";
|
return resultModel;
|
}
|
|
// 入库总表信息
|
string asnNo = new Common().GetMaxNo("ASN");
|
var asnModel = new BllArrivalNotice()
|
{
|
ASNNo = asnNo,
|
Status = "0",//等待执行
|
Type = "0",//原料入库
|
Origin = string.IsNullOrEmpty(model.Origin) ? "MES" : model.Origin,
|
CustomerNo = model.Customer,
|
CustomerName = "",
|
OrderCode = model.OrderCode,
|
};
|
|
// 入库明细表信息
|
List<BllArrivalNoticeDetail> detailModels = new List<BllArrivalNoticeDetail>();
|
foreach (AsnDetail asnDetailModel in model.AsnDetails)
|
{
|
if (string.IsNullOrEmpty(asnDetailModel.SkuNo))
|
{
|
resultModel.Message = "物料编码不可为空!";
|
return resultModel;
|
}
|
if (string.IsNullOrEmpty(asnDetailModel.SkuName))
|
{
|
resultModel.Message = "物料名称不可为空!";
|
return resultModel;
|
}
|
if (asnDetailModel.Qty <= 0)
|
{
|
resultModel.Message = "数量应大于0!";
|
return resultModel;
|
}
|
if (string.IsNullOrEmpty(asnDetailModel.LotNo))
|
{
|
resultModel.Message = "批次号不可为空!";
|
return resultModel;
|
}
|
var detailModel = new BllArrivalNoticeDetail()
|
{
|
ASNNo = asnNo,
|
OrderDetailCode = asnDetailModel.OrderDetailCode,
|
SkuNo = asnDetailModel.SkuNo,
|
SkuName = asnDetailModel.SkuName,
|
LotNo = asnDetailModel.LotNo,
|
LotText = "",
|
Qty = (decimal)asnDetailModel.Qty,//这里是桶数量
|
FactQty = 0,
|
CompleteQty = 0,
|
SupplierLot = asnDetailModel.SupplierLot,
|
Status = "0",
|
IsSampling = "0",
|
InspectStatus = "0",
|
CreateUser = 0
|
};
|
detailModels.Add(detailModel);
|
}
|
|
Db.BeginTran();
|
// 插入入库单总表
|
Db.Insertable(asnModel).ExecuteCommand();
|
|
// 插入入库单明细表
|
Db.Insertable(detailModels).ExecuteCommand();
|
Db.CommitTran();
|
|
resultModel.Success = 0;
|
resultModel.Message = "成功";
|
return resultModel;
|
}
|
catch (Exception ex)
|
{
|
Db.RollbackTran();
|
throw ex;
|
}
|
}
|
/// <summary>
|
/// 任务完成
|
/// </summary>
|
/// <param name="TaskNo"></param>
|
/// <param name="Status"></param>
|
/// <returns></returns>
|
public ErpModel FinishTask(string TaskNo,string Status)
|
{
|
try
|
{
|
#region 条件判断
|
var resultModel = new ErpModel() { Success = -1, Message = "" };
|
if (string.IsNullOrEmpty(TaskNo))
|
{
|
resultModel.Message = "任务号不可为空!";
|
return resultModel;
|
}
|
//任务信息
|
var taskInfo = Db.Queryable<LogTask>().First(w => w.TaskNo == TaskNo);
|
if (taskInfo == null)
|
{
|
resultModel.Message = $"任务号为:{TaskNo}的任务不存在!";
|
return resultModel;
|
}
|
if (taskInfo.Status != "1")
|
{
|
resultModel.Message = $"任务号为:{TaskNo}的任务状态异常!";
|
return resultModel;
|
}
|
#endregion
|
//开启事务
|
Db.BeginTran();
|
var comTime = DateTime.Now;
|
|
if (Status == "0")
|
{
|
taskInfo.Status = "3";//异常结束
|
//修改任务状态
|
Db.Updateable(taskInfo).ExecuteCommand();
|
|
resultModel.Success = 0;
|
resultModel.Message = "成功";
|
return resultModel;
|
}
|
switch (taskInfo.OrderType)
|
{
|
//入库完成
|
case "0":
|
//入库单明细信息
|
var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(w => w.Id == taskInfo.ASNDetailNo);
|
if (noticeDetail == null)
|
{
|
resultModel.Message = "该任务对应的入库单明细不存在!";
|
return resultModel;
|
}
|
//入库单信息
|
var notice = Db.Queryable<BllArrivalNotice>().First(w => w.ASNNo == noticeDetail.ASNNo);
|
if (notice == null)
|
{
|
resultModel.Message = "该任务对应的入库单不存在!";
|
return resultModel;
|
}
|
if (notice.Status == "3" || notice.Status == "4")
|
{
|
resultModel.Message = "该任务对应的入库单已执行完成!";
|
return resultModel;
|
}
|
//目标储位信息
|
var locatInfo = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.EndLocat && w.IsDel == "0");
|
if (locatInfo == null)
|
{
|
resultModel.Message = "目标储位信息不存在!";
|
return resultModel;
|
}
|
//库存明细
|
var sd1 = new DataStockDetail()
|
{
|
LotNo = noticeDetail.LotNo,
|
LotText = noticeDetail.LotText,
|
SupplierLot = noticeDetail.SupplierLot,
|
SkuNo = noticeDetail.SkuNo,
|
SkuName = noticeDetail.SkuName,
|
Standard = noticeDetail.Standard,
|
Qty = 1,
|
LockQty = 0,
|
FrozenQty = 0,
|
InspectQty = 0,
|
ASNNo = noticeDetail.ASNNo,
|
ASNDetailNo = noticeDetail.Id,
|
WareHouseNo = locatInfo.WareHouseNo,//所属仓库
|
RoadwayNo = locatInfo.RoadwayNo,//所属巷道
|
AreaNo = locatInfo.AreaNo,//所属区域
|
LocatNo = locatInfo.LocatNo,//储位地址
|
PalletNo = taskInfo.PalletNo,
|
PalletNo2 = "",
|
PalletNo3 = "",
|
PalletTags = "0",
|
CompleteTime = comTime,
|
ProductionTime = null,
|
ExpirationTime = null,
|
Status = "0",
|
InspectMark = "0",
|
InspectStatus = "0",//待检验
|
BitPalletMark = "0",
|
PackagNo = "",
|
IsBale = "0",
|
IsBelt = "0",
|
|
IsDel = "0",
|
CreateUser = 0,
|
CreateTime = comTime
|
};
|
//插入库存明细
|
Db.Insertable(sd1).ExecuteCommand();
|
|
noticeDetail.CompleteQty += 1;//完成数量
|
noticeDetail.Status = "1";//0:等待执行 1:正在执行 2:执行完成
|
if (noticeDetail.CompleteQty >= noticeDetail.Qty)
|
{
|
noticeDetail.Status = "2";
|
noticeDetail.CompleteTime = comTime;
|
}
|
noticeDetail.UpdateUser = 0;
|
noticeDetail.UpdateTime = comTime;
|
//更新入库单明细
|
Db.Updateable(noticeDetail).ExecuteCommand();
|
|
notice.UpdateUser = 0;
|
notice.UpdateTime = comTime;
|
if (notice.Status == "0")
|
{
|
notice.Status = "1";
|
}
|
var asnDetailNum = Db.Queryable<BllArrivalNoticeDetail>().Count(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo && m.Status != "2");
|
if (asnDetailNum == 0)
|
{
|
notice.Status = "2";
|
notice.CompleteTime = comTime;//完成时间
|
}
|
//更新入库单
|
Db.Updateable(notice).ExecuteCommand();
|
|
locatInfo.Status = "1";//有物品
|
//更新储位状态
|
Db.Updateable(locatInfo).ExecuteCommand();
|
break;
|
}
|
taskInfo.Status = "2";//执行完成
|
//修改任务状态
|
Db.Updateable(taskInfo).ExecuteCommand();
|
|
//提交事务
|
Db.CommitTran();
|
|
resultModel.Success = 0;
|
resultModel.Message = "成功";
|
return resultModel;
|
}
|
catch (Exception ex)
|
{
|
//回滚事务
|
Db.RollbackTran();
|
throw ex;
|
}
|
}
|
/*public SoResInfo ErpAddExportNotice(SoInfo model)
|
{
|
try
|
{
|
if (string.IsNullOrEmpty(model.SoType))
|
{
|
throw new Exception("单据类型不可为空!");
|
}
|
if (string.IsNullOrEmpty(model.OrderCode))
|
{
|
throw new Exception("系统单号不可为空!");
|
}
|
if (model.SoDetails.Count <= 0)
|
{
|
throw new Exception("出库单明细不可为空!");
|
}
|
//返回信息
|
SoResInfo result = new SoResInfo();
|
|
//获取库存明细
|
var stockDetailList = Db.Queryable<DataStockDetail>().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0 && s.InspectStatus == "1").ToList();
|
//获取库存
|
var stockList = Db.Queryable<DataStock>().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0).ToList();
|
|
string CustomerName = string.Empty;
|
if (!string.IsNullOrEmpty(model.Customer))
|
{
|
//客户信息
|
var customer = Db.Queryable<SysCustomer>().First(m => m.IsDel == "0" && m.CustomerNo == model.Customer);
|
if (customer == null)
|
{
|
throw new Exception("客户信息不存在!");
|
}
|
CustomerName = customer.CustomerName;
|
}
|
//承运商信息
|
var logistics = Db.Queryable<SysLogisticsInfo>().First(m => m.IsDel == "0" && m.CarrierName == model.LogisticsNo);
|
int? logisticsId = null;
|
if (logistics != null)
|
{
|
logisticsId = logistics.Id;
|
}
|
var billNo = "";
|
var bl = true;
|
do
|
{
|
//获取自增单据号
|
billNo = new Common().GetMaxNo("SO");
|
var no = billNo;
|
bl = Db.Queryable<BllExportNotice>().Any(m => m.SONo == no);
|
} while (bl);
|
|
List<SoDetailInfo> soDetailList = new List<SoDetailInfo>();
|
//开启事务
|
Db.BeginTran();
|
try
|
{
|
var list = new List<BllExportNoticeDetail>();
|
//添加出库单
|
foreach (var d in model.SoDetails)
|
{
|
if (d.Qty < 1)
|
{
|
throw new Exception("出库数量必须大于0");
|
}
|
var sku = skuList.FirstOrDefault(a => a.SkuNo == d.SkuNo);
|
if (sku == null)
|
{
|
throw new Exception($"物料信息中未查询到出库物料信息:{d.SkuNo}");
|
}
|
//0:成品出库、1:领料出库、3:物料取样出库、4:不合格品出库、6:代储出库、7:其他出库、 ///2:抽检出库、5:中间品出库、8:寄存出库
|
if (model.SoType == "0" || model.SoType == "3" || model.SoType == "4" || model.SoType == "7")
|
{
|
if (string.IsNullOrWhiteSpace(d.LotNo))
|
{
|
throw new Exception("批次不可为空!");
|
}
|
}
|
//库存明细
|
List<DataStockDetail> stockDetails;
|
//指定批次
|
if (!string.IsNullOrWhiteSpace(d.LotNo))
|
{
|
stockDetails = stockDetailList.Where(s => s.SkuNo == d.SkuNo && s.LotNo == d.LotNo).ToList();
|
if (stockDetails.Count < 1)
|
{
|
throw new Exception($"库存中未查询到出库物料信息:{d.SkuNo}");
|
}
|
//判断数量
|
var qty = stockDetails.Sum(s => s.Qty - s.FrozenQty - s.LockQty);
|
if (d.Qty > qty)
|
{
|
throw new Exception($"总库存中出库物料信息:{d.SkuNo}、{d.LotNo} 库存数量不足");
|
}
|
//库存信息
|
var stockInfo = stockList.First(w => w.SkuNo == d.SkuNo && w.LotNo == d.LotNo);
|
if (stockInfo == null)
|
{
|
throw new Exception($"总库存中未查询到出库物料信息:{d.SkuNo}");
|
}
|
//判断总库存数量
|
if (d.Qty > stockInfo.Qty - stockInfo.FrozenQty - stockInfo.LockQty)
|
{
|
throw new Exception($"总库存中出库物料信息:{d.SkuNo}、{d.LotNo} 库存数量不足");
|
}
|
//添加出库单明细
|
var noticeDetail = new BllExportNoticeDetail()
|
{
|
SONo = billNo,
|
SkuNo = sku.SkuNo,
|
SkuName = sku.SkuName,
|
Standard = sku.Standard,
|
LotNo = d.LotNo,
|
LotText = stockInfo.LotText,
|
Qty = d.Qty,
|
AllotQty = 0,
|
FactQty = 0,
|
CompleteQty = 0,
|
PackagNo = sku.PackagNo,
|
Price = sku.Price,
|
Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * d.Qty,
|
IsBale = "",
|
IsBelt = "",
|
SupplierLot = stockInfo.SupplierLot,
|
IsWave = "0",
|
WaveNo = "",
|
IsIssueLotNo = string.IsNullOrWhiteSpace(d.LotNo) ? "0" : "1",
|
|
OrderDetailCode = d.OrderDetailCode,
|
|
CreateUser = 0,
|
};
|
list.Add(noticeDetail);
|
//更新库存锁定数量
|
stockInfo.LockQty += d.Qty;
|
var i = Db.Updateable(stockInfo).UpdateColumns(it => new { it.LockQty }).ExecuteCommand();
|
|
SoDetailInfo soDetail = new SoDetailInfo();
|
soDetail.OrderDetailCode = d.OrderDetailCode;
|
soDetail.LockQty = d.Qty;
|
soDetail.LotNo = d.LotNo;
|
|
soDetailList.Add(soDetail);
|
}
|
else//未指定批次
|
{
|
Dictionary<int, decimal> dic = new Dictionary<int, decimal>();
|
decimal q1 = 0;
|
//首先查询当前这种物料批次号为空的
|
stockDetails = stockDetailList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList();
|
if (stockDetails.Count > 0)
|
{
|
q1 = (decimal)stockDetails.Sum(s => s.Qty - s.FrozenQty - s.LockQty);
|
//库存信息
|
var stockInfo = stockList.FirstOrDefault(w => w.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(w.LotNo));
|
if (stockInfo != null)
|
{
|
var q2 = stockInfo.Qty - stockInfo.FrozenQty - stockInfo.LockQty;
|
if (q2 < q1)
|
{
|
q1 = q2;
|
}
|
if (d.Qty > q1)
|
{
|
dic.Add(stockInfo.Id, q1);
|
}
|
else
|
{
|
dic.Add(stockInfo.Id, d.Qty);
|
}
|
}
|
}
|
//如果批次号为空的数量不够,根据批次先进先出原则查找其它批次的
|
if (d.Qty > q1)
|
{
|
stockDetails = stockDetailList.Where(m => m.SkuNo == d.SkuNo && !string.IsNullOrWhiteSpace(m.LotNo)).OrderBy(s => s.LotNo).ToList();
|
foreach (var demo in stockDetails)
|
{
|
if (q1 >= d.Qty)
|
{
|
break;
|
}
|
var q2 = demo.Qty - demo.FrozenQty - demo.LockQty;
|
//库存信息
|
var stockInfo = stockList.FirstOrDefault(w => w.SkuNo == d.SkuNo && w.LotNo == demo.LotNo);
|
if (stockInfo == null)
|
{
|
continue;
|
}
|
decimal q4 = 0;
|
if (dic.ContainsKey(stockInfo.Id))
|
{
|
q4 = dic[stockInfo.Id];
|
}
|
var q3 = stockInfo.Qty - stockInfo.FrozenQty - stockInfo.LockQty - q4;
|
if (q3 < q2)
|
{
|
q2 = q3;
|
}
|
if (q2 > d.Qty - q1)
|
{
|
if (!dic.ContainsKey(stockInfo.Id))
|
{
|
dic.Add(stockInfo.Id, d.Qty - q1);
|
}
|
else
|
{
|
//更新值
|
dic[stockInfo.Id] += d.Qty - q1;
|
}
|
q1 += d.Qty - q1;
|
}
|
else
|
{
|
if (!dic.ContainsKey(stockInfo.Id))
|
{
|
dic.Add(stockInfo.Id, (decimal)q2);
|
}
|
else
|
{
|
//更新值
|
dic[stockInfo.Id] = dic[stockInfo.Id] + (decimal)q2;
|
}
|
q1 += (decimal)q2;
|
}
|
}
|
}
|
if (d.Qty > q1)
|
{
|
throw new Exception($"总库存中出库物料信息:{d.SkuNo} 库存数量不足");
|
}
|
foreach (var s in dic)
|
{
|
var st = stockList.First(a => a.Id == s.Key);
|
var item = new BllExportNoticeDetail()
|
{
|
SONo = billNo,
|
OrderDetailCode = d.OrderDetailCode,
|
SkuNo = sku.SkuNo,
|
SkuName = sku.SkuName,
|
Standard = sku.Standard,
|
LotNo = st.LotNo,
|
LotText = st.LotText,
|
Qty = s.Value,
|
AllotQty = 0,
|
FactQty = 0,
|
CompleteQty = 0,
|
PackagNo = sku.PackagNo,
|
Price = sku.Price,
|
Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * d.Qty,
|
IsBale = "",
|
IsBelt = "",
|
SupplierLot = st.SupplierLot,
|
IsWave = "0",
|
WaveNo = "",
|
IsIssueLotNo = string.IsNullOrWhiteSpace(d.LotNo) ? "0" : "1",
|
|
CreateUser = 0,
|
};
|
list.Add(item);
|
|
st.LockQty += s.Value;//锁定数量
|
var i = Db.Updateable(st).UpdateColumns(it => new { it.LockQty }).ExecuteCommand();
|
|
SoDetailInfo soDetail = new SoDetailInfo();
|
soDetail.OrderDetailCode = d.OrderDetailCode;
|
soDetail.LockQty = s.Value;
|
soDetail.LotNo = st.LotNo;
|
|
soDetailList.Add(soDetail);
|
}
|
}
|
}
|
var notice = new BllExportNotice()
|
{
|
SONo = billNo,
|
OrderCode = model.OrderCode,
|
Type = model.SoType,
|
Status = "0",
|
Origin = "WMS",
|
CustomerNo = model.Customer,
|
CustomerName = CustomerName,
|
LogisticsId = logisticsId,
|
IsWave = "0",
|
WaveNo = "",
|
IsDespatch = "0",
|
|
CreateUser = 0,
|
};
|
|
var n = Db.Insertable<BllExportNotice>(notice).ExecuteCommand();
|
var m = Db.Insertable<BllExportNoticeDetail>(list).ExecuteCommand();
|
|
if (n <= 0 || m <= 0)
|
{
|
Db.RollbackTran();
|
throw new Exception("操作失败");
|
}
|
Db.CommitTran();
|
//回传上游系统锁定数量信息
|
result.Success = "0";
|
result.Message = "操作成功";
|
result.SoDetails = soDetailList;
|
return result;
|
|
}
|
catch (Exception ex)
|
{
|
Db.RollbackTran();
|
throw new Exception(ex.Message);
|
}
|
}
|
catch (Exception ex)
|
{
|
Db.RollbackTran();
|
throw new Exception(ex.Message);
|
}
|
}*/
|
}
|
}
|