using Model.ModelDto;
|
using Model.ModelVm;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Linq.Expressions;
|
using Model.InterFaceModel;
|
using Model.ModelDto.BllSoDto;
|
using Model.ModelDto.SysDto;
|
using Newtonsoft.Json;
|
using Utility.Tools;
|
using WMS.BLL.Logic;
|
using WMS.BLL.LogServer;
|
using WMS.DAL;
|
using WMS.Entity.BllAsnEntity;
|
using WMS.Entity.BllSoEntity;
|
using WMS.Entity.Context;
|
using WMS.Entity.DataEntity;
|
using WMS.Entity.LogEntity;
|
using WMS.Entity.SysEntity;
|
using WMS.IBLL.IBllAsnServer;
|
using WMS.Entity.BllQualityEntity;
|
|
namespace WMS.BLL.BllAsnServer
|
{
|
public class PalletBindServer : DbHelper<BllPalletBind>, IPalletBindServer
|
{
|
private static readonly SqlSugarScope Db = DataContext.Db;
|
public PalletBindServer() : base(Db)
|
{
|
}
|
|
#region 托盘绑定
|
public List<PalletBindDto> GetPalletBindList(PalletBindVm model, out int count)
|
{
|
try
|
{
|
var strList = new List<int>();
|
|
if (!string.IsNullOrWhiteSpace(model.SkuNo) || !string.IsNullOrWhiteSpace(model.SkuName))
|
{
|
var detailList = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.IsDel == "0" && m.SkuNo.Contains(model.SkuNo.Trim()) && m.SkuName.Contains(model.SkuName.Trim())).Select(m => m.Id).Distinct().ToList();
|
strList = detailList;
|
}
|
Expression<Func<BllPalletBind, bool>> item = Expressionable.Create<BllPalletBind>()
|
.AndIF(!string.IsNullOrWhiteSpace(model.ASNNo), it => it.ASNNo.Contains(model.ASNNo.Trim()))
|
.AndIF(!string.IsNullOrWhiteSpace(model.PalletNo), it => it.PalletNo.Contains(model.PalletNo.Trim()))
|
.AndIF(!string.IsNullOrWhiteSpace(model.LocatNo), it => it.LocatNo.Contains(model.LocatNo.Trim()))
|
.AndIF(!string.IsNullOrEmpty(model.RoadwayNo), a => a.RoadwayNo == model.RoadwayNo)
|
.AndIF(!string.IsNullOrEmpty(model.WareHouseNo), a => a.RoadwayNo == model.WareHouseNo)
|
.AndIF(strList.Count>0, it => strList.Contains((int)it.ASNDetailNo))
|
.AndIF(!string.IsNullOrWhiteSpace(model.LotNo), it => it.LotNo.Contains(model.LotNo.Trim()))
|
.AndIF(!string.IsNullOrWhiteSpace(model.LotText), it => it.LotText.Contains(model.LotText.Trim()))
|
.AndIF(!string.IsNullOrWhiteSpace(model.StartTime), it => it.CreateTime >= Convert.ToDateTime(model.StartTime))
|
.AndIF(!string.IsNullOrWhiteSpace(model.EndTime), it => it.CreateTime <= Convert.ToDateTime(model.EndTime))
|
.AndIF(!string.IsNullOrWhiteSpace(model.Status), it => it.Status == model.Status)
|
.And(m => m.IsDel == "0")
|
.ToExpression();//注意 这一句 不能少
|
var total = 0;
|
var sku = Db.Queryable<SysMaterials>().First(a => a.IsDel == "0" && a.SkuNo == "100099" && a.SkuName == "托盘");
|
var data = GetAllWhereAsync(item)
|
.LeftJoin<BllArrivalNoticeDetail>((a, b) => a.ASNDetailNo == b.Id)
|
.LeftJoin<SysUserInfor>((a, b, c) => a.CreateUser == c.Id)
|
.LeftJoin<SysUserInfor>((a, b, c, d) => a.UpdateUser == d.Id)
|
//.LeftJoin<SysStorageLocat>((a, b, c, d, e) => a.LocatNo == e.LocatNo)
|
//.LeftJoin<BllBoxInfo>((a, b, c, d, e, f) => a.Id == e.BindNo)
|
.Select((a, b, c, d) => new PalletBindDto()
|
{
|
Id = a.Id,
|
ASNNo = a.ASNNo,
|
ASNDetailNo = a.ASNDetailNo,
|
|
PalletNo = a.PalletNo,
|
PalletNo2 = a.PalletNo2,
|
PalletNo3 = a.PalletNo3,
|
LocatNo = a.LocatNo,
|
RoadwayNo = a.RoadwayNo,
|
WareHouseNo = a.WareHouseNo,
|
Qty = a.Qty,
|
FullQty = a.FullQty,
|
Status = a.Status,
|
Type = a.Type,
|
CompleteTime = a.CompleteTime,
|
|
SkuNo = b.SkuNo == null ? sku.SkuNo : b.SkuNo,
|
SkuName = b.SkuName == null ? sku.SkuName : b.SkuName,
|
|
LotNo = a.LotNo,
|
LotText = a.LotText,
|
ProductionTime = a.ProductionTime,
|
ExpirationTime = a.ExpirationTime,
|
SupplierLot = a.SupplierLot,
|
InspectMark = a.InspectMark,
|
BitPalletMark = a.BitPalletMark,
|
|
CreateUserName = c.RealName,
|
CreateTime = a.CreateTime,
|
})
|
.OrderBy(a => a.Status).OrderByDescending(a => a.CreateTime)
|
.ToOffsetPage(model.Page, model.Limit, ref total);
|
|
count = data.Count;
|
return data;
|
|
}
|
catch (Exception ex)
|
{
|
throw new Exception(ex.Message);
|
}
|
}
|
|
public List<BoxInfoDto> GetBoxInfoList(BoxInfoVm model, out int count)
|
{
|
try
|
{
|
var total = 0;
|
var data = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel =="0" && m.BindNo == model.BindNo)
|
.LeftJoin<BllPalletBind>((a, b) => a.BindNo == b.Id)
|
.GroupBy((a, b) => new
|
{
|
a.PalletNo,
|
a.BoxNo,
|
a.SkuNo,
|
a.SkuName,
|
a.LotNo,
|
a.LotText,
|
a.SupplierLot,
|
a.FullQty,
|
a.ProductionTime,
|
a.ExpirationTime,
|
a.InspectMark,
|
a.BitBoxMark,
|
a.InspectStatus,
|
b.Status
|
})
|
.Select((a, b) => new BoxInfoDto()
|
{
|
BoxNo = a.BoxNo,
|
PalletNo = a.PalletNo,
|
Qty = SqlFunc.AggregateSum(a.Qty),
|
FullQty = a.FullQty,
|
SkuNo = a.SkuNo,
|
SkuName = a.SkuName,
|
LotNo = a.LotNo,
|
LotText = a.LotText,
|
ProductionTime = a.ProductionTime,
|
ExpirationTime = a.ExpirationTime,
|
SupplierLot = a.SupplierLot,
|
InspectMark = a.InspectMark,
|
BitBoxMark = a.BitBoxMark,
|
InspectStatus = a.InspectStatus,
|
BindStatus = b.Status
|
}).ToOffsetPage(model.Page, model.Limit, ref total);
|
count = total;
|
return data;
|
}
|
catch (Exception ex)
|
{
|
throw ex;
|
}
|
}
|
|
/// <summary>
|
/// 根据箱码获取箱支信息
|
/// </summary>
|
/// <param name="boxNo">箱码</param>
|
/// <param name="boxNo3">支码</param>
|
/// <returns></returns>
|
public List<BoxInfoDto> GetBoxInfoByBoxNo(string boxNo, string boxNo3)
|
{
|
Expression<Func<BllBoxInfo, bool>> item = Expressionable.Create<BllBoxInfo>()
|
.AndIF(!string.IsNullOrWhiteSpace(boxNo), it => it.BoxNo == boxNo.Trim())
|
.AndIF(!string.IsNullOrWhiteSpace(boxNo3), it => it.BoxNo3.Contains(boxNo3.Trim()))
|
.And(m => m.IsDel == "0")
|
.ToExpression();
|
|
var data = Db.Queryable<BllBoxInfo>().Where(item)
|
.LeftJoin<SysUserInfor>((a, b) => a.CreateUser == b.Id)
|
.LeftJoin<SysUserInfor>((a, b, c) => a.UpdateUser == c.Id)
|
.Select((a, b, c) => new BoxInfoDto()
|
{
|
Id = a.Id,
|
ASNNo = a.ASNNo,
|
ASNDetailNo = a.ASNDetailNo,
|
BindNo = a.BindNo,
|
BoxNo = a.BoxNo,
|
BoxNo3 = a.BoxNo3,
|
PalletNo = a.PalletNo,
|
Qty = a.Qty,
|
FullQty = a.FullQty,
|
|
Status = a.Status,
|
SkuNo = a.SkuNo,
|
SkuName = a.SkuName,
|
LotNo = a.LotNo,
|
LotText = a.LotText,
|
ProductionTime = a.ProductionTime,
|
ExpirationTime = a.ExpirationTime,
|
CompleteTime = a.CompleteTime,
|
SupplierLot = a.SupplierLot,
|
InspectStatus = a.InspectStatus,
|
InspectMark = a.InspectMark,
|
BitBoxMark = a.BitBoxMark,
|
Origin = a.Origin,
|
|
CreateUserName = c.RealName,
|
UpdateUserName = c.RealName,
|
CreateTime = a.CreateTime,
|
UpdateTime = a.UpdateTime
|
}).ToList();
|
|
return data;
|
}
|
|
//删除托盘绑定信息
|
public void DelPalletBind(int id, int userId)
|
{
|
try
|
{
|
|
var bind = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Id == id);
|
if (bind == null)
|
{
|
throw new Exception("未查询到托盘绑定信息");
|
}
|
if (bind.Status != "0")
|
{
|
throw new Exception("该托盘绑定信息的状态不是等待入库,不能删除");
|
}
|
//获取托盘信息
|
var pallet = Db.Queryable<SysPallets>().First(a => a.IsDel == "0" && a.PalletNo == bind.PalletNo && a.Status == "1");
|
if (pallet == null)
|
{
|
throw new Exception("未查询到托盘信息!");
|
}
|
//if (pallet.Status != "0")
|
//{
|
// throw new Exception("该托盘信息的状态不是未使用,请核查!");
|
//}
|
|
Db.BeginTran();
|
var time = DateTime.Now;
|
//托盘绑定的箱支信息集合
|
var boxList = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.BindNo == bind.Id).ToList();
|
|
foreach (var b in boxList)
|
{
|
b.IsDel = "0";
|
b.ASNNo = "";
|
b.ASNDetailNo = null;
|
b.PalletNo = "";
|
b.BindNo = null;
|
b.Status = "0";
|
b.CompleteTime = null;
|
b.UpdateTime = time;
|
b.UpdateUser = userId;
|
var i = Db.Updateable(b).ExecuteCommand();
|
if (i!=1)
|
{
|
throw new Exception($"{b.BoxNo}箱码、{b.BoxNo3}支码删除失败");
|
}
|
}
|
//判断是否有指定储位
|
if (!string.IsNullOrWhiteSpace(bind.LocatNo))
|
{
|
//储位状态变更为空储位
|
var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == bind.LocatNo);
|
bind.LocatNo = "";
|
bind.WareHouseNo = "";
|
bind.RoadwayNo = "";
|
locate.Status = "0";
|
Db.Updateable(locate).ExecuteCommand();
|
}
|
//删除托盘绑定信息
|
bind.IsDel = "1";
|
bind.UpdateTime = time;
|
bind.UpdateUser = userId;
|
Db.Updateable(bind).ExecuteCommand();
|
//入库单明细
|
var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == bind.ASNDetailNo);
|
if (noticeDetail == null && boxList[0].SkuNo != "100099")
|
{
|
throw new Exception("未查询到托盘绑定的入库单明细信息");
|
}
|
if (noticeDetail != null || boxList[0].SkuNo != "100099")
|
{
|
//修改入库单明细
|
noticeDetail.FactQty -= bind.Qty;
|
//判断入库单明细组托数量是否为0,是:修改明细状态
|
if (noticeDetail.FactQty == 0)
|
{
|
noticeDetail.Status = "0";
|
//获取状态不是等待执行的明细信息
|
var count = Db.Queryable<BllArrivalNoticeDetail>().Count(m => m.IsDel == "0" && m.Id != noticeDetail.Id && m.ASNNo == bind.ASNNo && m.Status !="0");
|
if (count==0)
|
{
|
//修改入库单信息
|
var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.ASNNo == bind.ASNNo);
|
notice.Status = "0";
|
notice.UpdateTime = time;
|
notice.UpdateUser = userId;
|
Db.Updateable(notice).ExecuteCommand();
|
}
|
|
}
|
Db.Updateable(noticeDetail).ExecuteCommand();
|
}
|
|
pallet.Status = "0";
|
pallet.UpdateUser = userId;
|
pallet.UpdateTime = DateTime.Now;
|
Db.Updateable(pallet).ExecuteCommand();
|
|
new OperationASNServer().AddLogOperationAsn("入库作业", "托盘绑定", bind.PalletNo, "删除", $"删除了入库单:{bind.ASNNo}、托盘码:{bind.PalletNo}的信息", userId);
|
Db.CommitTran();
|
}
|
catch (Exception e)
|
{
|
Db.RollbackTran();
|
throw new Exception(e.Message);
|
}
|
}
|
//删除绑定的箱码信息
|
public void DelBindBoxInfo(string boxNo, int userId)
|
{
|
try
|
{
|
var boxInfos = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo).ToList();
|
|
if (boxInfos.Count == 0)
|
{
|
throw new Exception("未查询到绑定箱支信息");
|
}
|
|
var boxInfo = boxInfos.First();
|
if (boxInfo.Status == "2")
|
{
|
throw new Exception("该箱支信息状态为已入库,不能删除");
|
}
|
|
if (boxInfo.SkuNo == "100099")
|
{
|
throw new Exception("该箱支信息属于空托组盘,请在托盘信息页中删除");
|
}
|
var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == boxInfo.PalletNo);
|
var bind = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Id == boxInfo.BindNo);
|
if (bind == null)
|
{
|
throw new Exception("未查询到托盘绑定信息");
|
}
|
if (bind.Status != "0")
|
{
|
throw new Exception("该托盘绑定信息的状态不是等待入库,不能删除");
|
}
|
Db.BeginTran();
|
var time = DateTime.Now;
|
var qty = 0;
|
foreach (var item in boxInfos)
|
{
|
//删除解绑箱支信息
|
item.ASNNo = "";
|
item.ASNDetailNo = null;
|
item.BindNo = null;
|
item.PalletNo = "";
|
item.Status = "0";
|
item.CompleteTime = null;
|
item.UpdateTime = time;
|
item.UpdateUser = userId;
|
qty += item.Qty;
|
}
|
Db.Updateable(boxInfos).ExecuteCommand();
|
|
//修改托盘绑定信息
|
bind.Qty -= qty;
|
|
if (bind.Qty ==0)
|
{
|
//判断是否有指定储位
|
if (!string.IsNullOrWhiteSpace(bind.LocatNo))
|
{
|
bind.LocatNo = "";
|
bind.RoadwayNo = "";
|
bind.WareHouseNo = "";
|
//储位状态变更为空储位
|
var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == bind.LocatNo);
|
locate.Status = "0";
|
Db.Updateable(locate).ExecuteCommand();
|
}
|
//删除托盘绑定信息
|
bind.IsDel = "1";
|
bind.UpdateTime = time;
|
bind.UpdateUser = userId;
|
//变更托盘使用状态
|
pallet.Status = "0";
|
pallet.UpdateTime = time;
|
pallet.UpdateUser = userId;
|
}
|
Db.Updateable(bind).ExecuteCommand();
|
Db.Updateable(pallet).ExecuteCommand();
|
|
//入库单明细
|
var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == bind.ASNDetailNo);
|
if (noticeDetail == null && boxInfo.SkuNo != "100099")
|
{
|
throw new Exception("未查询到托盘绑定的入库单明细信息");
|
}
|
if (boxInfo.SkuNo != "100099")
|
{
|
//修改入库单明细
|
noticeDetail.FactQty -= qty;
|
//判断入库单明细组托数量是否为0,是:修改明细状态
|
if (noticeDetail.FactQty == 0)
|
{
|
noticeDetail.Status = "0";
|
//获取状态不是等待执行的明细信息
|
var count = Db.Queryable<BllArrivalNoticeDetail>().Count(m => m.IsDel == "0" && m.Id != noticeDetail.Id && m.ASNNo == bind.ASNNo && m.Status != "0");
|
if (count == 0)
|
{
|
//修改入库单信息
|
var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.ASNNo == bind.ASNNo);
|
notice.Status = "0";
|
notice.UpdateTime = time;
|
notice.UpdateUser = userId;
|
Db.Updateable(notice).ExecuteCommand();
|
}
|
|
}
|
Db.Updateable(noticeDetail).ExecuteCommand();
|
}
|
//判断是否为托盘物料
|
//if (boxInfo.SkuNo == "100099")
|
//{
|
// new OperationASNServer().AddLogOperationAsn("入库作业", "托盘绑定", boxInfo.PalletNo, "删除", $"删除了托盘码:{boxInfo.PalletNo}的箱支物料信息", userId);
|
//}
|
//else
|
//{
|
new OperationASNServer().AddLogOperationAsn("入库作业", "托盘绑定", boxInfo.BoxNo3, "删除", $"删除了箱码:{boxInfo.BoxNo}、追溯码:{boxInfo.BoxNo3}的箱支物料信息", userId);
|
//}
|
|
Db.CommitTran();
|
}
|
catch (Exception e)
|
{
|
Db.RollbackTran();
|
throw new Exception(e.Message);
|
}
|
}
|
|
//托盘绑定撤销申请
|
public void CancelPalletBind(int id, string reason, int userId)
|
{
|
try
|
{
|
|
|
var bind = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Id == id);
|
if (bind == null)
|
{
|
throw new Exception("未查询到入库单据的托盘绑定信息");
|
}
|
|
if (bind.Type == "1")
|
{
|
throw new Exception("该托盘是空托,不是物料托盘");
|
}
|
|
if (bind.Status == "1")
|
{
|
throw new Exception("该托盘状态为正在执行,请稍后撤销");
|
}
|
var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.ASNNo == bind.ASNNo);
|
if (notice == null)
|
{
|
throw new Exception("未查询到入库单据信息");
|
}
|
if (notice.Status != "1" && notice.Status != "2")
|
{
|
throw new Exception("入库单据状态不是正在执行或执行完成,不能撤销");
|
}
|
var auditLog = Db.Queryable<BllAuditLog>().Where(m => m.IsDel == "0" && m.Status == "0");
|
var boxInfo = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo);
|
|
var time = DateTime.Now;
|
|
var startStatusName = "";
|
var endStatusName = "";
|
switch (notice.Status)
|
{
|
case "1":
|
startStatusName = "正在执行";
|
endStatusName = "正在执行";
|
break;
|
case "2":
|
startStatusName = "执行完成";
|
endStatusName = "正在执行";
|
break;
|
default:
|
throw new Exception("单据状态错误");
|
}
|
|
|
if (auditLog.Count(m => m.OrderNo == bind.ASNNo && m.PalletNo.Contains(bind.PalletNo)) > 0)
|
{
|
throw new Exception("该托盘已有申请撤销信息,请勿重复申请");
|
}
|
|
var info = boxInfo.First(m => m.BindNo == bind.Id);
|
var log = new BllAuditLog()
|
{
|
OrderNo = notice.ASNNo,
|
PalletNo = bind.PalletNo,
|
Msg = $"物料:{info.SkuNo}、批次:{info.LotNo};",
|
Reason = reason,
|
Status = "0",
|
Opinion = "",
|
StartStatus = startStatusName,
|
EndStatus = endStatusName,
|
FunctionCode = "002",
|
|
IsDel = "0",
|
CreateUser = userId,
|
CreateTime = time
|
};
|
|
|
Db.Insertable(log).ExecuteCommand();
|
new OperationASNServer().AddLogOperationAsn("入库作业", "托盘绑定", notice.ASNNo, "取消", $"添加了单据号为{notice.ASNNo}、托盘号为{bind.PalletNo}撤销申请", userId);
|
}
|
catch (Exception e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
|
#endregion
|
|
#region 指定储位
|
//指定储位数据源(正常的空储位)
|
public List<LocatDto> GetLocateList(string houseNo, string roadwayNo, string row, string column, string layer, string locateNo, int page, int limit, out int count)
|
{
|
try
|
{
|
Expression<Func<SysStorageLocat, bool>> item = Expressionable.Create<SysStorageLocat>()
|
.AndIF(!string.IsNullOrWhiteSpace(roadwayNo), m => m.RoadwayNo == roadwayNo)
|
.AndIF(!string.IsNullOrWhiteSpace(row), m => m.Row == int.Parse(row))
|
.AndIF(!string.IsNullOrWhiteSpace(column), m => m.Column == int.Parse(column))
|
.AndIF(!string.IsNullOrWhiteSpace(layer), m => m.Layer == int.Parse(layer))
|
.AndIF(!string.IsNullOrWhiteSpace(locateNo), m => m.LocatNo.Contains(locateNo))
|
.And(m => m.IsDel == "0" && m.Status=="0" && m.Flag == "0" && m.WareHouseNo == houseNo)
|
.ToExpression();//注意 这一句 不能少
|
var total = 0;
|
var list = Db.Queryable<SysStorageLocat>().Where(item)
|
.Select(a => new LocatDto()
|
{
|
Id = a.Id,
|
RoadwayNo = a.RoadwayNo,
|
LocatNo = a.LocatNo,
|
Row = a.Row,
|
Column = a.Column,
|
Layer = a.Layer,
|
Status = a.Status
|
}).ToOffsetPage(page, limit, ref total);
|
count = total;
|
|
return list;
|
|
}
|
catch (Exception e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
|
//保存指定的储位
|
public void SaveAppointSlot(int bindId, int locateId, int userId)
|
{
|
try
|
{
|
//托盘绑定信息
|
var bind = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Id == bindId);
|
if (bind == null)
|
{
|
throw new Exception("未查询到托盘绑定的信息");
|
}
|
if (bind.Status != "0")
|
{
|
throw new Exception("该托盘绑定的信息状态不是等待执行,不能指定储位,请核实!");
|
}
|
//储位
|
var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.Id == locateId);
|
if (locate == null)
|
{
|
throw new Exception("未查询到储位的信息");
|
}
|
if (locate.Status != "0" || locate.Flag != "0")
|
{
|
throw new Exception("该储位状态不是空储位或标志不是正常的");
|
}
|
var bindIdList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.PalletNo == bind.PalletNo && m.Status != "2").Select(m => m.Id).ToList();
|
//判断是否有零箱
|
foreach (var item in bindIdList)
|
{
|
var boxInfo = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.BindNo == item);
|
if (boxInfo.Count(m => m.BitBoxMark == "1") > 0)
|
{
|
throw new Exception($"{bind.PalletNo}托盘上有零箱,请入零箱库!");
|
}
|
}
|
Db.BeginTran();
|
try
|
{
|
var time = DateTime.Now;
|
//判断托盘绑定信息是否已有指定储位
|
if (!string.IsNullOrWhiteSpace(bind.LocatNo))
|
{
|
var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == bind.LocatNo);
|
locate2.Status = "0";
|
Db.Updateable(locate2).ExecuteCommand();
|
}
|
//获取同托盘的托盘绑定信息
|
var bindList = Db.Queryable<BllPalletBind>()
|
.Where(m => m.IsDel == "0" && m.PalletNo == bind.PalletNo && m.Status == "0").ToList();
|
if (bindList.Count>0)
|
{
|
foreach (var b in bindList)
|
{
|
b.LocatNo = locate.LocatNo;
|
b.WareHouseNo = locate.WareHouseNo;
|
b.RoadwayNo = locate.RoadwayNo;
|
b.UpdateTime = time;
|
b.UpdateUser = userId;
|
}
|
|
Db.Updateable(bindList).ExecuteCommand();
|
}
|
//修改指定的储位
|
bind.LocatNo = locate.LocatNo;
|
bind.WareHouseNo = locate.WareHouseNo;
|
bind.RoadwayNo = locate.RoadwayNo;
|
bind.UpdateTime = time;
|
bind.UpdateUser = userId;
|
locate.Status = "2";
|
Db.Updateable(bind).ExecuteCommand();
|
Db.Updateable(locate).ExecuteCommand();
|
|
new OperationASNServer().AddLogOperationAsn("入库作业", "托盘绑定", bind.PalletNo, "编辑", $"指定了储位:{locate.LocatNo}、单据号:{bind.ASNNo}、托盘码:{bind.PalletNo}的信息", userId);
|
Db.CommitTran();
|
}
|
catch (Exception e)
|
{
|
Db.RollbackTran();
|
throw new Exception(e.Message);
|
}
|
|
}
|
catch (Exception e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
#endregion
|
|
//申请储位
|
public OutCommandDto RequestLocation(string palletNo, string houseNo, string roadwayNo)
|
{
|
try
|
{
|
//验证托盘条码是否为空
|
if (string.IsNullOrEmpty(palletNo))
|
{
|
throw new Exception("请输入要申请的托盘条码");
|
}
|
//验证所属仓库是否为空
|
if (string.IsNullOrEmpty(houseNo))
|
{
|
throw new Exception("请选择所属仓库");
|
}
|
//验证是否为平库入库
|
if (houseNo == "W02")
|
{
|
throw new Exception("零箱库请使用PDA手持进行平库入库");
|
}
|
|
OutCommandDto comDto;//返回wcs的入库命令
|
var isHaveLocateNo = false; //托盘绑定信息中是否已有指定储位
|
|
var stock = Db.Queryable<SysPallets>().First(a => a.PalletNo == palletNo);//托盘信息
|
|
//判断托盘条码是否有效
|
if (stock == null)
|
throw new Exception("托盘条码不受WMS管理,不可入库!");
|
|
#region
|
|
//查询托盘绑定信息(状态为等待入库的)
|
var palletBindList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Status != "2").ToList();
|
var haveLocate = palletBindList.FirstOrDefault(m => !string.IsNullOrWhiteSpace(m.LocatNo));
|
|
|
if (palletBindList.Count >= 1) //正常入库
|
{
|
var bindIdList = palletBindList.Select(m => m.Id).ToList();
|
//判断是否有零箱
|
foreach (var item in bindIdList)
|
{
|
var boxInfo = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.BindNo == item);
|
if (boxInfo.Count(m => m.BitBoxMark == "1") > 0)
|
{
|
throw new Exception($"{palletNo}托盘上有零箱,请入零箱库!");
|
}
|
}
|
|
var palletBind = palletBindList.FirstOrDefault(m => m.Status == "1");
|
if (palletBind != null)
|
{
|
var beingTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == palletBind.TaskNo);
|
if (beingTask == null)
|
{
|
throw new Exception("该托盘正在入库,但未查询到任务信息");
|
}
|
comDto = new OutCommandDto()
|
{
|
PalletNo = palletNo,//托盘号
|
StartRoadway = beingTask.StartRoadway, // 起始巷道
|
StartLocate = "", // 起始位置
|
EndLocate = beingTask.EndLocat, // 目标位置
|
EndRoadway = beingTask.EndRoadway, // 目标巷道
|
TaskNo = beingTask.TaskNo, // 任务号
|
TaskType = "0",// 任务类型 (出库)
|
OutMode = "", //目标地址
|
Order = 1
|
};
|
return comDto;
|
}
|
if (haveLocate != null)
|
{
|
isHaveLocateNo = true; //已有指定储位
|
}
|
if (palletBindList.First().Type == "0") //物料托入库
|
{
|
//判断是否绑定单据及单据状态是否正常
|
foreach (var item in palletBindList)
|
{
|
var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.ASNNo == item.ASNNo);
|
if (notice == null)
|
{
|
throw new Exception("托盘存在物料未绑定入库单,不可入库!");
|
}
|
|
if (notice.Status == "3")
|
{
|
throw new Exception($"入库单{item.ASNNo}已关闭,不可入库!");
|
}
|
}
|
}
|
}
|
else //回流入库
|
{
|
var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList();
|
if (stockDetail.Count==0)
|
{
|
throw new Exception($"{palletNo}托盘条码不具有箱码信息,不可入库!");
|
}
|
else
|
{
|
//判断是否有零箱
|
var detailIdList = stockDetail.Select(m => m.Id).ToList();
|
var dataBoxInfo = Db.Queryable<DataBoxInfo>().Where(m => detailIdList.Contains(m.StockDetailId)).ToList();
|
if (dataBoxInfo.Count(m => m.BitBoxMark == "1")>0)
|
{
|
throw new Exception($"{palletNo}托盘上有零箱,不可入库!");
|
}
|
|
}
|
|
//获取对应回库规则
|
var function = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO");
|
#region 托盘回库规则
|
|
if (function != null)
|
{
|
//拣货完成后允许托盘回库
|
if (function.SetValue == "CompletePick")
|
{
|
var allot = Db.Queryable<BllExportAllot>().First(a => a.IsDel == "0" && a.LotNo == stockDetail[0].LotNo && a.PalletNo == palletNo && a.SkuNo == stockDetail[0].SkuNo);
|
|
//验证拣货明细是否存在
|
if (allot != null)
|
{
|
//验证当前托盘拣货信息是否已完成
|
if (allot.Status != "5")
|
{
|
throw new Exception("当前托盘拣货信息未完成,请完成后回库!");
|
}
|
}
|
}
|
}
|
|
|
#endregion
|
}
|
|
var allotLocate = new AllotLocation();
|
|
SysStorageLocat locate;
|
if (isHaveLocateNo) //指定储位
|
{
|
locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == haveLocate.LocatNo);
|
}
|
else
|
{
|
locate = allotLocate.GetSuiTableLocate(houseNo, roadwayNo);
|
}
|
Db.BeginTran();
|
try
|
{
|
if (locate != null)
|
{
|
//添加巷道使用记录
|
var log = new SysRoadwayUseLog
|
{
|
RoadwayNo = locate.RoadwayNo,
|
LocateNo = locate.LocatNo,
|
WareHouseNo = locate.WareHouseNo,
|
Row = locate.Row,
|
Column = locate.Column,
|
Layer = locate.Layer,
|
Depth = locate.Depth
|
};
|
Db.Insertable(log).ExecuteCommand();
|
}
|
|
var taskNo = new Common().GetMaxNo("TK");
|
var exTask = new LogTask //入库任务
|
{
|
TaskNo = taskNo,
|
Sender = "WMS",
|
Receiver = "WCS",
|
IsSuccess = 1, //是否下发成功 0失败 1成功
|
SendDate = DateTime.Now, //发送时间
|
BackDate = DateTime.Now, //返回时间
|
StartRoadway="", // 起始巷道
|
StartLocat = "",//起始位置
|
EndLocat = locate.LocatNo,//目标位置
|
EndRoadway = locate.RoadwayNo, // 目标巷道
|
PalletNo = palletNo,//托盘码
|
IsSend = 1,//是否可再次下发
|
IsCancel = 1,//是否可取消
|
IsFinish = 1,//是否可完成
|
Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务
|
Status = "1",//任务状态0:等待执行1正在执行2执行完成
|
OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单
|
Msg = "入库口到=>>" + locate.LocatNo + "的入库任务", //关键信息
|
|
};
|
Db.Insertable(exTask).ExecuteCommand();
|
locate.Status = "2";
|
Db.Updateable(locate).ExecuteCommand();
|
if (palletBindList.Count >= 1)
|
{
|
foreach (var item in palletBindList)
|
{
|
item.Status = "1";
|
item.WareHouseNo = locate.WareHouseNo;
|
item.RoadwayNo = locate.RoadwayNo;
|
item.LocatNo = locate.LocatNo;
|
item.TaskNo = taskNo;
|
}
|
Db.Updateable(palletBindList).ExecuteCommand();
|
}
|
Db.CommitTran();
|
comDto = new OutCommandDto()
|
{
|
PalletNo = palletNo,//托盘号
|
StartRoadway = "",
|
StartLocate = "", // 起始位置
|
EndLocate = locate.LocatNo, // 目标位置
|
EndRoadway = locate.RoadwayNo, // 目标巷道
|
TaskNo = exTask.TaskNo, // 任务号
|
TaskType = "0",// 任务类型 (出库)
|
OutMode = "", //目标地址
|
Order = 1
|
};
|
|
}
|
catch (Exception ex)
|
{
|
Db.RollbackTran();
|
throw new Exception(ex.Message);
|
}
|
#endregion
|
|
|
return comDto;
|
}
|
catch (Exception e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
|
//入库完成(wcs反馈、wms手动完成)
|
public void ArrivalSuccess(string taskNo, int userId)
|
{
|
try
|
{
|
//正常入库
|
var task = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == taskNo);
|
if (task == null)
|
{
|
throw new Exception("未查询到任务信息");
|
}
|
if (task.Status == "2")
|
{
|
throw new Exception("当前任务已完成");
|
}
|
|
var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList();
|
//当前任务中的储位信息
|
var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat);
|
if (locate==null)
|
{
|
throw new Exception($"未查询到任务中的储位信息");
|
}
|
//获取箱码信息
|
var box1 = Db.Queryable<BllBoxInfo>().First(a => a.PalletNo == task.PalletNo && a.IsDel == "0" && a.Status != "2");
|
|
Db.BeginTran();
|
|
task.Status = "2";//任务状态
|
task.IsSend = 0;
|
task.IsCancel = 0;
|
task.IsFinish = 0;
|
task.FinishDate = DateTime.Now;//完成时间
|
Db.Updateable(task).ExecuteCommand();
|
if (userId != 0)
|
{
|
//添加操作日志记录
|
var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId);
|
}
|
//判断是否是回流入库完成
|
if (stockDetail.Any())
|
{
|
foreach (var item in stockDetail)
|
{
|
item.WareHouseNo = locate.WareHouseNo;
|
item.RoadwayNo = locate.RoadwayNo;
|
item.AreaNo = locate.AreaNo;
|
item.LocatNo = locate.LocatNo;
|
item.UpdateTime = DateTime.Now;
|
if (userId != 0)
|
{
|
item.UpdateUser = userId;
|
}
|
}
|
|
locate.Status = "1";
|
Db.Updateable(locate).ExecuteCommand();
|
Db.Updateable(stockDetail).ExecuteCommand();
|
Db.CommitTran();
|
return;
|
}
|
//正常入库
|
var bindList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel =="0" && m.TaskNo == taskNo && m.Status =="1").ToList();
|
if (bindList.Count == 0)
|
{
|
throw new Exception($"{taskNo}该任务没有对应的流水信息");
|
}
|
|
var comTime = DateTime.Now;
|
foreach (var item in bindList)
|
{
|
switch (item.Type)
|
{
|
case "1":
|
var boxInfo = Db.Queryable<BllBoxInfo>().First(m => m.IsDel == "0" && m.BindNo == item.Id);
|
var sku = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == boxInfo.SkuNo);
|
#region 库存明细
|
var sd1 = new DataStockDetail()
|
{
|
LotNo = item.LotNo,
|
LotText = item.LotText,
|
SupplierLot = item.SupplierLot,
|
SkuNo = boxInfo.SkuNo,
|
SkuName = boxInfo.SkuName,
|
Standard = sku.Standard,
|
Qty = item.Qty,
|
LockQty = 0,
|
FrozenQty = 0,
|
InspectQty = 0,
|
ASNNo = item.ASNNo,
|
ASNDetailNo = item.ASNDetailNo,
|
WareHouseNo = locate.WareHouseNo,
|
RoadwayNo = locate.RoadwayNo,
|
AreaNo = locate.AreaNo,
|
LocatNo = locate.LocatNo,
|
PalletNo = item.PalletNo,
|
PalletNo2 = item.PalletNo2,
|
PalletNo3 = item.PalletNo3,
|
//PalletType = item.PalletType,
|
CompleteTime = comTime,
|
ProductionTime = item.ProductionTime,
|
ExpirationTime = item.ExpirationTime,
|
Status = "0",
|
InspectMark = item.InspectMark,
|
InspectStatus = sku.IsInspect,
|
BitPalletMark = item.BitPalletMark,
|
PackagNo = sku.PackagNo,
|
IsBale = item.IsBale,
|
IsBelt = item.IsBelt,
|
|
|
IsDel = "0",
|
CreateUser = 0,
|
CreateTime = comTime
|
};
|
var sdId1 = Db.Insertable(sd1).ExecuteReturnIdentity();
|
#endregion
|
|
#region 库存箱码明细
|
|
var box2 = new DataBoxInfo()
|
{
|
StockDetailId = sdId1,
|
BindNo = item.Id,
|
BoxNo = boxInfo.BoxNo,
|
BoxNo2 = boxInfo.BoxNo2,
|
BoxNo3 = boxInfo.BoxNo3,
|
PalletNo = boxInfo.PalletNo,
|
PalletNo2 = boxInfo.PalletNo2,
|
PalletNo3 = boxInfo.PalletNo3,
|
Qty = boxInfo.Qty,
|
FullQty = boxInfo.FullQty,
|
Status = "2",
|
LotNo = boxInfo.LotNo,
|
LotText = boxInfo.LotText,
|
SkuNo = boxInfo.SkuNo,
|
SkuName = boxInfo.SkuName,
|
Standard = sku.Standard,
|
ProductionTime = boxInfo.ProductionTime,
|
SupplierLot = boxInfo.SupplierLot,
|
InspectStatus = boxInfo.InspectStatus,
|
InspectMark = boxInfo.InspectMark,
|
BitBoxMark = boxInfo.BitBoxMark,
|
|
CreateUser = 0,
|
CreateTime = comTime
|
};
|
boxInfo.Status = "2";
|
Db.Updateable(boxInfo).ExecuteCommand();
|
Db.Insertable(box2).ExecuteCommand();
|
#endregion
|
|
#region 库存
|
var dataStock1 = Db.Queryable<DataStock>().First(m => m.IsDel == "0" && m.SkuNo == sku.SkuNo);
|
if (dataStock1 != null)
|
{
|
dataStock1.Qty += item.Qty;
|
Db.Updateable(dataStock1).ExecuteCommand();
|
}
|
else
|
{
|
var stock = new DataStock()
|
{
|
SkuNo = sku.SkuNo,
|
SkuName = sku.SkuName,
|
Standard = sku.Standard,
|
LotNo = "",
|
LotText = "",
|
Qty = item.Qty,
|
LockQty = 0,
|
FrozenQty = 0,
|
|
IsDel = "0",
|
CreateUser = userId,
|
CreateTime = comTime
|
};
|
Db.Insertable(stock).ExecuteCommand();
|
}
|
#endregion
|
|
break;
|
case "0":
|
var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == item.ASNDetailNo);
|
if (noticeDetail == null)
|
{
|
throw new Exception("未查询到托盘绑定的入库单明细信息");
|
}
|
|
var sku1 = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo);
|
string isinspect = "0";
|
//判断物料是否免检
|
if (sku1.IsInspect == "1")
|
{
|
isinspect = sku1.IsInspect;
|
}
|
|
//获取该批次最终质检结果
|
//var quality = Db.Queryable<BllQualityInspect>().Where(a => a.LotNo == noticeDetail.LotNo && a.IsDel == "0").OrderByDescending(a => a.CreateTime).ToList();
|
#region 库存明细
|
var sd = new DataStockDetail()
|
{
|
LotNo = noticeDetail.LotNo,
|
LotText = noticeDetail.LotText,
|
SupplierLot = noticeDetail.SupplierLot,
|
SkuNo = noticeDetail.SkuNo,
|
SkuName = noticeDetail.SkuName,
|
Standard = noticeDetail.Standard,
|
Qty = item.Qty,
|
LockQty = 0,
|
FrozenQty = 0,
|
InspectQty = 0,
|
ASNNo = item.ASNNo,
|
ASNDetailNo = item.ASNDetailNo,
|
WareHouseNo = locate.WareHouseNo,
|
RoadwayNo = locate.RoadwayNo,
|
AreaNo = locate.AreaNo,
|
LocatNo = !string.IsNullOrWhiteSpace(locate.LocatNo) ? locate.LocatNo : "",
|
PalletNo = item.PalletNo,
|
PalletNo2 = item.PalletNo2,
|
PalletNo3 = item.PalletNo3,
|
//PalletType = item.PalletType,
|
CompleteTime = comTime,
|
ProductionTime = item.ProductionTime,
|
ExpirationTime = item.ExpirationTime,
|
Status = "0",
|
InspectMark = item.InspectMark,
|
InspectStatus = isinspect,
|
BitPalletMark = item.BitPalletMark,
|
PackagNo = noticeDetail.PackagNo,
|
IsBale = item.IsBale,
|
IsBelt = item.IsBelt,
|
|
IsDel = "0",
|
CreateUser = 0,
|
CreateTime = comTime
|
};
|
|
//if (quality.Count() > 0)
|
//{
|
// //修改合格不合格数量
|
// if (quality[0].IsQualified == "1") //合格
|
// {
|
// //增加合格数量
|
// quality[0].PassQty += item.Qty;
|
// sd.InspectStatus = "1";
|
// }
|
// else if (quality[0].IsQualified == "0") //不合格
|
// {
|
// //增加不合格数量
|
// quality[0].FailQty += item.Qty;
|
// sd.InspectStatus = "2";
|
// }
|
// Db.Updateable(quality[0]).ExecuteCommand(); //修改质检信息
|
//}
|
|
var sdId = Db.Insertable(sd).ExecuteReturnIdentity(); //新增库存明细信息
|
|
#endregion
|
|
#region 库存箱码明细
|
var boxInfoList = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.BindNo == item.Id).ToList();
|
var boxList = new List<DataBoxInfo>();
|
foreach (var demo in boxInfoList)
|
{
|
var box = new DataBoxInfo()
|
{
|
StockDetailId = sdId,
|
BindNo = demo.BindNo,
|
BoxNo = demo.BoxNo,
|
BoxNo2 = demo.BoxNo2,
|
BoxNo3 = demo.BoxNo3,
|
PalletNo = demo.PalletNo,
|
PalletNo2 = demo.PalletNo2,
|
PalletNo3 = demo.PalletNo3,
|
Qty = demo.Qty,
|
FullQty = demo.FullQty,
|
Status = "2",
|
LotNo = demo.LotNo,
|
LotText = demo.LotText,
|
SkuNo = demo.SkuNo,
|
SkuName = demo.SkuName,
|
Standard = noticeDetail.Standard,
|
ProductionTime = demo.ProductionTime,
|
SupplierLot = demo.SupplierLot,
|
InspectStatus = demo.InspectStatus,
|
InspectMark = demo.InspectMark,
|
BitBoxMark = demo.BitBoxMark,
|
|
CreateUser = 0,
|
CreateTime = comTime
|
};
|
boxList.Add(box);
|
demo.Status = "2";
|
}
|
Db.Updateable(boxInfoList).ExecuteCommand();
|
Db.Insertable(boxList).ExecuteCommand();
|
|
#endregion
|
|
#region 库存
|
var dataStock = Db.Queryable<DataStock>().First(m =>
|
m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo && m.LotNo == noticeDetail.LotNo);
|
if (dataStock != null)
|
{
|
dataStock.Qty += item.Qty;
|
Db.Updateable(dataStock).ExecuteCommand();
|
}
|
else
|
{
|
var stock = new DataStock()
|
{
|
SkuNo = noticeDetail.SkuNo,
|
SkuName = noticeDetail.SkuName,
|
Standard = noticeDetail.Standard,
|
LotNo = noticeDetail.LotNo,
|
LotText = noticeDetail.LotText,
|
Qty = item.Qty,
|
LockQty = 0,
|
FrozenQty = 0,
|
|
IsDel = "0",
|
CreateUser = userId,
|
CreateTime = comTime
|
};
|
Db.Insertable(stock).ExecuteCommand();
|
}
|
#endregion
|
|
#region 入库单 及 明细
|
//入库单明细
|
noticeDetail.CompleteQty += item.Qty;
|
if (noticeDetail.CompleteQty >= noticeDetail.Qty)
|
{
|
noticeDetail.Status = "2";
|
noticeDetail.CompleteTime = comTime;
|
}
|
Db.Updateable(noticeDetail).ExecuteCommand();
|
//入库单
|
var asnDetailNum = Db.Queryable<BllArrivalNoticeDetail>()
|
.Count(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo && m.Status != "2");
|
if (asnDetailNum == 0)
|
{
|
var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo);
|
notice.Status = "2";
|
notice.CompleteTime = comTime;
|
Db.Updateable(notice).ExecuteCommand();
|
}
|
|
#endregion
|
break;
|
}
|
item.Status = "2";
|
item.CompleteTime = comTime;
|
|
#region 手动完成注释代码
|
|
//item.Status = "2";
|
//item.CompleteTime = comTime;
|
//var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>()
|
// .First(m => m.IsDel == "0" && m.Id == item.ASNDetailNo);
|
//if (noticeDetail == null)
|
//{
|
// throw new Exception("未查询到托盘绑定的入库单明细信息");
|
//}
|
//#region 库存明细
|
//var sd = new DataStockDetail()
|
//{
|
// LotNo = noticeDetail.LotNo,
|
// LotText = noticeDetail.LotText,
|
// SupplierLot = noticeDetail.SupplierLot,
|
// SkuNo = noticeDetail.SkuNo,
|
// SkuName = noticeDetail.SkuName,
|
// Standard = noticeDetail.Standard,
|
// Qty = item.Qty,
|
// LockQty = 0,
|
// FrozenQty = 0,
|
// InspectQty = 0,
|
// ASNNo = item.ASNNo,
|
// ASNDetailNo = item.ASNDetailNo,
|
// WareHouseNo = locate.WareHouseNo,
|
// RoadwayNo = locate.RoadwayNo,
|
// AreaNo = locate.AreaNo,
|
// LocatNo = locate.LocatNo,
|
// PalletNo = item.PalletNo,
|
// PalletNo2 = item.PalletNo2,
|
// PalletNo3 = item.PalletNo3,
|
// CompleteTime = comTime,
|
// ProductionTime = item.ProductionTime,
|
// ExpirationTime = item.ExpirationTime,
|
// Status = "0",
|
// InspectMark = item.InspectMark,
|
// InspectStatus = "1",
|
// BitPalletMark = item.BitPalletMark,
|
// PackagNo = noticeDetail.PackagNo,
|
// IsBale = item.IsBale,
|
// IsBelt = item.IsBelt,
|
|
// IsDel = "0",
|
// CreateUser = 0,
|
// CreateTime = comTime
|
//};
|
//var sdId = Db.Insertable(sd).ExecuteReturnIdentity();
|
//#endregion
|
|
//#region 库存箱码明细
|
//var boxInfoList = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.BindNo == item.Id).ToList();
|
//var boxList = new List<DataBoxInfo>();
|
//foreach (var demo in boxInfoList)
|
//{
|
// var box = new DataBoxInfo()
|
// {
|
// StockDetailId = sdId,
|
// BindNo = demo.BindNo,
|
// BoxNo = demo.BoxNo,
|
// BoxNo2 = demo.BoxNo2,
|
// BoxNo3 = demo.BoxNo3,
|
// PalletNo = demo.PalletNo,
|
// PalletNo2 = demo.PalletNo2,
|
// PalletNo3 = demo.PalletNo3,
|
// Qty = demo.Qty,
|
// FullQty = demo.FullQty,
|
// Status = "2",
|
// LotNo = demo.LotNo,
|
// LotText = demo.LotText,
|
// SkuNo = demo.SkuNo,
|
// SkuName = demo.SkuName,
|
// Standard = noticeDetail.Standard,
|
// ProductionTime = demo.ProductionTime,
|
// SupplierLot = demo.SupplierLot,
|
// InspectStatus = demo.InspectStatus,
|
// InspectMark = demo.InspectMark,
|
// BitBoxMark = demo.BitBoxMark,
|
|
// CreateUser = 0,
|
// CreateTime = comTime
|
// };
|
// boxList.Add(box);
|
// demo.Status = "2";
|
//}
|
//Db.Updateable(boxInfoList).ExecuteCommand();
|
//Db.Insertable(boxList).ExecuteCommand();
|
|
//#endregion
|
|
//#region 库存
|
//var dataStock = Db.Queryable<DataStock>().First(m =>
|
// m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo && m.LotNo == noticeDetail.LotNo);
|
//if (dataStock != null)
|
//{
|
// dataStock.Qty += item.Qty;
|
// Db.Updateable(dataStock).ExecuteCommand();
|
//}
|
//else
|
//{
|
// var stock = new DataStock()
|
// {
|
// SkuNo = noticeDetail.SkuNo,
|
// SkuName = noticeDetail.SkuName,
|
// Standard = noticeDetail.Standard,
|
// LotNo = noticeDetail.LotNo,
|
// LotText = noticeDetail.LotText,
|
// Qty = item.Qty,
|
// LockQty = 0,
|
// FrozenQty = 0,
|
|
// IsDel = "0",
|
// CreateUser = userId,
|
// CreateTime = comTime
|
// };
|
// Db.Insertable(stock).ExecuteCommand();
|
//}
|
//#endregion
|
|
//#region 入库单 及 明细
|
////入库单明细
|
//noticeDetail.CompleteQty += item.Qty;
|
//if (noticeDetail.CompleteQty>=noticeDetail.Qty)
|
//{
|
// noticeDetail.Status = "2";
|
// noticeDetail.CompleteTime = comTime;
|
//}
|
//Db.Updateable(noticeDetail).ExecuteCommand();
|
////入库单
|
//var asnDetailNum = Db.Queryable<BllArrivalNoticeDetail>()
|
// .Count(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo && m.Status!="2");
|
//if (asnDetailNum == 0)
|
//{
|
// var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo);
|
// notice.Status = "2";
|
// notice.CompleteTime = comTime;
|
// Db.Updateable(notice).ExecuteCommand();
|
//}
|
|
//#endregion
|
#endregion
|
|
}
|
//判断储位信息
|
locate.Status = "1";
|
Db.Updateable(locate).ExecuteCommand();
|
|
|
Db.Updateable(bindList).ExecuteCommand();
|
|
Db.CommitTran();
|
|
}
|
catch (Exception e)
|
{
|
Db.RollbackTran();
|
throw new Exception(e.Message);
|
}
|
}
|
|
/// <summary>
|
/// 满入异常
|
/// </summary>
|
/// <param name="model">任务信息</param>
|
/// <returns>返回新的储位地址</returns>
|
public OutCommandDto FullException(ReceiveWcsSignal model)
|
{
|
try
|
{
|
OutCommandDto comDto;//返回wcs的入库命令
|
|
// 判断当前任务状态 Status 1:正在执行 3:异常结束
|
var taskModel = Db.Queryable<LogTask>().First(m => m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1");
|
if (taskModel == null)
|
{
|
throw new Exception("此任务不存在或任务状态已变更!");
|
}
|
|
Db.BeginTran();
|
// 将当前任务状态变更异常结束
|
taskModel.Status = "3";
|
Db.Updateable(taskModel).ExecuteCommand();
|
|
// 改变当前储位地址的储位标志变更为屏蔽
|
var locatModel = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == taskModel.EndLocat && m.IsDel == "0");
|
if (locatModel == null)
|
{
|
throw new Exception("未查询到当前任务储位信息!");
|
}
|
locatModel.Flag = "1";
|
Db.Updateable(locatModel).ExecuteCommand();
|
|
// 验证托盘绑定信息
|
string asnNo = "回流托盘";
|
var palletBindModel = Db.Queryable<BllPalletBind>().First(m => m.PalletNo == model.PalletNo && m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1");
|
if (palletBindModel != null)
|
{
|
asnNo = palletBindModel.ASNNo;
|
}
|
|
// 插入异常处理表
|
string exceptionNo = new Common().GetMaxNo("EX");
|
var exceptionModel = new SysException()
|
{
|
ExceptionNo = exceptionNo,
|
Type = "1", // 0:空取异常 1:满入异常 2:双工位异常
|
PalletNo = taskModel.PalletNo,
|
ExcLocatNo = taskModel.EndLocat,
|
OrderNo = asnNo,
|
TaskNo = taskModel.TaskNo,
|
Status = "0",
|
Text = "", // 处理描述
|
CreateUser = 0
|
};
|
Db.Insertable(exceptionModel).ExecuteCommand();
|
|
|
// 根据托盘号重新获取储位地址(当前巷道优先)
|
SysStorageLocat locate = new SysStorageLocat();
|
AllotLocation allotLocate = new AllotLocation();
|
try
|
{
|
locate = allotLocate.GetSuiTableLocate("W01", taskModel.EndRoadway);
|
}
|
catch (Exception ex)
|
{
|
//try
|
//{
|
// locate = allotLocate.GetSuiTableLocate("W01", "");
|
//}
|
//catch (Exception ex)
|
//{
|
// 整个仓库都没有找到托盘
|
if (asnNo != "回流托盘")
|
{
|
palletBindModel.Status = "0"; // 等待执行
|
palletBindModel.LocatNo = ""; // 储位地址
|
Db.Updateable(palletBindModel).ExecuteCommand();
|
Db.CommitTran();
|
}
|
|
return null;
|
//throw ex;
|
//}
|
}
|
|
|
|
// 生成入库任务
|
var taskNo = new Common().GetMaxNo("TK"); // 获取任务编号
|
var exTask = new LogTask
|
{
|
TaskNo = taskNo,
|
Sender = "WMS",
|
Receiver = "WCS",
|
IsSuccess = 1, //是否下发成功 0失败 1成功
|
SendDate = DateTime.Now, //发送时间
|
BackDate = DateTime.Now, //返回时间
|
StartRoadway = taskModel.EndRoadway, //起始巷道
|
StartLocat = taskModel.EndLocat, //起始位置
|
EndLocat = locate.LocatNo, //目标位置
|
EndRoadway = locate.RoadwayNo, //目标巷道
|
PalletNo = taskModel.PalletNo, //托盘码
|
IsSend = 1, //是否可再次下发
|
IsCancel = 1, //是否可取消
|
IsFinish = 1, //是否可完成
|
Type = "0", //任务类型 0 入库任务 1 出库任务 2 移库任务
|
Status = "1", //任务状态0:等待执行1正在执行2执行完成
|
OrderType = "0", //0 入库单 1 出库单 2 盘点单 3 移库单
|
Msg = taskModel.EndLocat+">>>>" + locate.LocatNo + "的入库任务", //关键信息
|
};
|
Db.Insertable(exTask).ExecuteCommand();
|
locate.Status = "2";
|
Db.Updateable(locate).ExecuteCommand();
|
|
if (asnNo != "回流托盘")
|
{
|
palletBindModel.TaskNo = taskNo; // 更新储位地址
|
palletBindModel.LocatNo = locate.LocatNo; // 更新储位地址
|
Db.Updateable(palletBindModel).ExecuteCommand();
|
}
|
|
comDto = new OutCommandDto()
|
{
|
PalletNo = taskModel.PalletNo, //托盘号
|
StartRoadway = taskModel.EndRoadway,
|
StartLocate = taskModel.EndLocat, // 起始位置
|
EndLocate = locate.LocatNo, // 目标位置
|
EndRoadway = locate.RoadwayNo, // 目标巷道
|
TaskNo = exTask.TaskNo, // 任务号
|
TaskType = "0",
|
OutMode = "", //目标地址
|
Order = 1 // 优先级
|
};
|
Db.CommitTran();
|
|
|
return comDto;
|
}
|
catch (Exception e)
|
{
|
Db.RollbackTran();
|
throw new Exception(e.Message);
|
}
|
}
|
|
//手动取消入库任务
|
public void CancelAsnTask(string taskNo, int userId)
|
{
|
try
|
{
|
var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
|
if (task == null)
|
{
|
throw new Exception("未查询到任务信息");
|
}
|
Db.BeginTran();
|
var time = DateTime.Now;
|
//修改任务
|
task.IsSuccess = 1;
|
task.IsCancel = 0;
|
task.IsFinish = 0;
|
task.IsSend = 0;
|
task.Status = "4";
|
task.CancelDate = DateTime.Now;
|
Db.Updateable(task).ExecuteCommand();
|
|
//托盘绑定信息
|
var bind = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.TaskNo == taskNo).ToList();
|
if (bind.Count >0)
|
{
|
foreach (var item in bind)
|
{
|
item.Status = "0";//修改托盘绑定状态信息
|
item.TaskNo = "";//任务号清空
|
item.LocatNo = ""; //储位地址清空
|
item.WareHouseNo = "";
|
item.RoadwayNo = "";
|
item.UpdateTime = time;
|
item.UpdateUser = userId;
|
}
|
Db.Updateable(bind).ExecuteCommand();
|
}
|
var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat);
|
if (locate == null)
|
{
|
throw new Exception("未查询道储位信息");
|
}
|
|
locate.Status = "0"; //修改储位状态
|
Db.Updateable(locate).ExecuteCommand();
|
|
//添加操作日志记录
|
var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "取消", $"点击取消按钮取消了任务号为:{taskNo}的任务", (int)userId);
|
Db.CommitTran();
|
}
|
catch (Exception e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
|
|
|
////重新下发入库任务
|
//public OutCommandDto AgainSendAsnTask(string taskNo, int userId, string url)
|
//{
|
// try
|
// {
|
// var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
|
// if (task == null)
|
// {
|
// throw new Exception("未查询到任务信息");
|
// }
|
// var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.PalletNo == task.PalletNo);
|
// if (stockDetail == null)
|
// {
|
// throw new Exception(task.PalletNo + " 当前托盘未在库内,请核实信息");
|
// }
|
|
|
// var outDto = new OutCommandDto()
|
// {
|
// PalletNo = task.PalletNo,//托盘号
|
// StartLocate = "", // 起始位置
|
// EndLocate = task.EndLocat, // 目标位置
|
// TaskNo = task.TaskNo, // 任务号
|
// TaskType = "1",// 任务类型 (出库)
|
// OutMode = "", //目标地址
|
// Order = 1
|
// };
|
// //添加操作日志记录
|
// var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "下发", $"点击下发按钮、重新下发了任务号为:{taskNo}的入库任务", (int)userId);
|
|
// // 正式运行程序放开
|
// var list = new List<string> { outDto.TaskNo };
|
// var jsonData = JsonConvert.SerializeObject(outDto);
|
|
// try
|
// {
|
// var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
|
// var response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS");
|
// var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
|
|
// ////解析返回数据
|
// var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
|
// if (wcsModel.StatusCode == 0)
|
// {
|
// //更改任务的发送返回时间//
|
// new TaskServer().EditTaskIssueOk(list, time1, time2);
|
// }
|
// if (wcsModel.StatusCode == -1)
|
// {
|
// new TaskServer().EditTaskIssueNo(list, time1, time2, wcsModel.Msg);
|
// throw new Exception($"wcs返回状态异常:{wcsModel.Msg}");
|
// }
|
// }
|
// catch (Exception ex)
|
// {
|
// throw new Exception(ex.Message);
|
// }
|
// return outDto;
|
// }
|
// catch (Exception e)
|
// {
|
// throw new Exception(e.Message);
|
// }
|
//}
|
|
|
|
}
|
}
|