using Model.ModelDto.DataDto;
|
using Model.ModelDto.SysDto;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Text;
|
using WMS.BLL.LogServer;
|
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.IBllCheckServer;
|
|
namespace WMS.BLL.BllCheckServer
|
{
|
public class WarehouseOutsidePalletsServer : DbHelper<DataStockDetail>, IWarehouseOutsidePalletsServer
|
{
|
private static readonly SqlSugarScope Db = DataContext.Db;
|
public WarehouseOutsidePalletsServer() : base(Db)
|
{
|
}
|
|
/// <summary>
|
/// 获取库外托盘信息列表
|
/// </summary>
|
/// <param name="skuNo">物料号</param>
|
/// <param name="skuName">物料名称</param>
|
/// <param name="lotNo">批次</param>
|
/// <param name="palletNo">托盘号</param>
|
/// <returns></returns>
|
public List<MateDataStockDto> GetPalletsOutside(string skuNo, string skuName, string lotNo, string palletNo, int page, int limit, out int count)
|
{
|
string sqlCount = "SELECT DISTINCT COUNT(DataStockDetail.ID) " +
|
"FROM DataStockDetail " +
|
"where IsDel = 0 and isnull(LocatNo,'') = '' and isnull(WareHouseNo,'') = '' ";
|
|
string str = "select Id,LotNo,LotText,SupplierLot,SkuNo,SkuName,Standard,Qty,LockQty,FrozenQty,PalletNo," +
|
"Status,InspectMark,BitPalletMark,InspectStatus " +
|
"from DataStockDetail " +
|
"where IsDel = 0 and isnull(LocatNo,'') = '' and isnull(WareHouseNo,'') = ''";
|
//判断物料号是否为空
|
if (!string.IsNullOrEmpty(skuNo))
|
{
|
str += $" and SkuNo like '%{skuNo}%'";
|
}
|
//判断物料名称是否为空
|
if (!string.IsNullOrEmpty(skuName))
|
{
|
str += $" and SkuName like '%{skuName}%'";
|
}
|
//判断批次是否为空
|
if (!string.IsNullOrEmpty(lotNo))
|
{
|
str += $" and LotNo like '%{lotNo}%'";
|
}
|
//判断托盘号是否为空
|
if (!string.IsNullOrEmpty(palletNo))
|
{
|
str += $" and PalletNo like '%{palletNo}%'";
|
}
|
//排序
|
str += " order by LotNo,SkuNo,PalletNo";
|
if (page == 0)
|
{
|
page = 1;
|
}
|
str += $" offset {((page - 1) * limit)} rows fetch next {limit} rows only;";
|
List<MateDataStockDto> mateDataStockDtos = Db.Ado.SqlQuery<MateDataStockDto>(str);
|
var com = new Common();
|
count = com.GetRowCount(sqlCount);
|
return mateDataStockDtos;
|
}
|
|
|
//保存指定的储位
|
public void SaveAppointSlot(int stockDetailId, int locateId, int userId)
|
{
|
try
|
{
|
|
//库存明细信息
|
var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.Id == stockDetailId);
|
if (stockDetail == null)
|
{
|
throw new Exception("未查询到库存库外托盘的信息");
|
}
|
if (!string.IsNullOrWhiteSpace(stockDetail.LocatNo))
|
{
|
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 logTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.Type == "0" && m.PalletNo == stockDetail.PalletNo && m.Status == "1");
|
if (logTask != null)
|
{
|
throw new Exception("当前托盘已有正在执行的任务,请核实查看");
|
}
|
|
|
//若是深度1的 则判断深度2是否为空储位
|
if (locate.Depth == "01")
|
{
|
var locateDepth = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.Row == locate.Row && a.Column == locate.Column && a.Layer == locate.Layer && a.Depth == "02");
|
if (locateDepth != null)
|
{
|
if (locateDepth.Status != "1")
|
{
|
throw new Exception("该储位深度2不是有物品,不可绑定");
|
}
|
}
|
}
|
//判断是否为深度2的 若为深度2 则获取深度1储位 判断是否为空储位
|
if (locate.Depth == "02")
|
{
|
var locateDepth = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.Row == locate.Row && a.Column == locate.Column && a.Layer == locate.Layer && a.Depth == "01");
|
if (locateDepth.Status != "0" || locateDepth.Flag == "2")
|
{
|
throw new Exception("该储位深度1不是空储位或标志不是正常的");
|
}
|
}
|
|
// 获取此托盘的任务号
|
var taskModel = Db.Queryable<LogTask>().First(m=>m.IsDel=="0" && m.PalletNo == stockDetail.PalletNo && m.IsSuccess ==0 && m.Status =="0");
|
|
Db.BeginTran();
|
try
|
{
|
var time = DateTime.Now;
|
var taskNo = string.Empty;
|
if (taskModel == null) // 之前未指定托盘
|
{
|
// 添加入库日志记录
|
taskNo = new Common().GetMaxNo("TK");
|
var task = new LogTask //入库任务
|
{
|
TaskNo = taskNo,
|
Sender = "WMS",
|
Receiver = "WCS",
|
IsSuccess = 0, //是否下发成功 0失败 1成功
|
SendDate = time, //发送时间
|
BackDate = time, //返回时间
|
StartRoadway = "", // 起始巷道
|
StartLocat = "",//起始位置
|
EndLocat = locate.LocatNo,//目标位置
|
EndRoadway = locate.RoadwayNo, // 目标巷道
|
PalletNo = stockDetail.PalletNo,//托盘码
|
IsSend = 1,//是否可再次下发
|
IsCancel = 1,//是否可取消
|
IsFinish = 1,//是否可完成
|
Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务
|
Status = "0",//任务状态0:等待执行1正在执行2执行完成
|
OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单
|
Msg = "入库口到=>>" + locate.LocatNo + "储位的入库任务", //关键信息
|
|
};
|
Db.Insertable(task).ExecuteCommand();
|
|
locate.Status = "2";
|
Db.Updateable(locate).ExecuteCommand();
|
}
|
else // 已指定过托盘需变更
|
{
|
// 获取上次指定的储位地址
|
var locateOld = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == taskModel.EndLocat);
|
if (locateOld != null)
|
{
|
if (locateOld.LocatNo == locate.LocatNo) // 判断当前指定的地址和上次的是否一致,若一致不做更改
|
{
|
throw new Exception("已指定相同储位地址");
|
}
|
else // 若不一致 释放上次指定的储位地址
|
{
|
locateOld.Status = "0";
|
Db.Updateable(locateOld).ExecuteCommand();
|
}
|
}
|
locate.Status = "2";
|
Db.Updateable(locate).ExecuteCommand();
|
// 更新任务号指定地址信息
|
taskModel.EndLocat = locate.LocatNo;//目标储位
|
taskModel.EndRoadway = locate.RoadwayNo;//目标巷道
|
Db.Updateable(taskModel).ExecuteCommand();
|
|
taskNo = taskModel.TaskNo;
|
}
|
// 更新组盘表巷道地址和储位地址
|
var bindModel = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0"
|
&& m.PalletNo == stockDetail.PalletNo && m.ASNDetailNo == stockDetail.ASNDetailNo && m.ASNNo == stockDetail.ASNNo);
|
if (string.IsNullOrWhiteSpace(bindModel.TaskNo) || bindModel.TaskNo == taskNo)
|
{
|
bindModel.TaskNo = taskNo;
|
bindModel.WareHouseNo = locate.WareHouseNo;
|
bindModel.RoadwayNo = locate.RoadwayNo;
|
bindModel.LocatNo = locate.LocatNo;
|
Db.Updateable(bindModel).ExecuteCommand();
|
}
|
// 插入操作日志
|
new OperationASNServer().AddLogOperationAsn("库内作业", "库外托盘", stockDetail.PalletNo, "编辑",
|
$"指定了储位:{locate.LocatNo}、单据号:{stockDetail.ASNNo}、托盘码:{stockDetail.PalletNo}的信息", userId);
|
//提交事务
|
Db.CommitTran();
|
}
|
catch (Exception e)
|
{
|
Db.RollbackTran();
|
throw new Exception(e.Message);
|
}
|
|
}
|
catch (Exception e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
|
}
|
}
|