using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using AutoMapper;
using Model.ModelDto.SysDto;
using SqlSugar;
using WMS.DAL;
using WMS.Entity.BllCheckEntity;
using WMS.Entity.Context;
using WMS.Entity.DataEntity;
using WMS.Entity.SysEntity;
using WMS.IBLL.ILogServer;
using WMS.IBLL.ISysServer;
using WMS.IDAL.ISysInterface;
namespace WMS.BLL.SysServer
{
public class ExceptionServer : IExceptionServer
{
private static readonly SqlSugarScope Db = DataContext.Db;
private readonly IOperationSysServer _operation; //操作日志
public IExceptionRepository ExceptionRst { get; set; }
private readonly IMapper _mapper;
public ExceptionServer(IExceptionRepository exceptionRst, IMapper mapper, IOperationSysServer operation)
{
ExceptionRst = exceptionRst;
_mapper = mapper;
_operation = operation;
}
///
/// 查询异常处理表信息
///
/// 托盘号
/// 储位号
/// 单据号 入库单 出库单 移库单
/// 任务号
/// 状态 0:未处理 1:已处理
/// 处理描述
/// 异常类型 0:空取 1:满入 2:双工位异常
///
///
///
public async Task> GetExceptionList(string palletNo, string excLocatNo, string orderNo,
string taskNo, string status, string text, string type, int page = 0, int limit = 10)
{
try
{
Expression> item = Expressionable.Create()
.AndIF(!string.IsNullOrWhiteSpace(palletNo), it => it.PalletNo.Contains(palletNo.Trim()))
.AndIF(!string.IsNullOrWhiteSpace(excLocatNo), it => it.ExcLocatNo.Contains(excLocatNo.Trim()))
.AndIF(!string.IsNullOrWhiteSpace(orderNo), it => it.OrderNo.Contains(orderNo.Trim()))
.AndIF(!string.IsNullOrWhiteSpace(taskNo), it => it.TaskNo.Contains(taskNo.Trim()))
.AndIF(!string.IsNullOrWhiteSpace(text), it => it.Text.Contains(text.Trim()))
.AndIF(!string.IsNullOrWhiteSpace(status), it => it.Status == type)
.AndIF(!string.IsNullOrWhiteSpace(type), it => it.Type == type)
.ToExpression();//注意 这一句 不能少
var data = await ExceptionRst.GetAllByOrderPageAsync(item, limit, page, out int counts).ToListAsync();
return data;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
///
/// 添加异常处理信息
///
/// 异常类型 0:空取 1:满入 2:双工位异常
/// 托盘号
/// 储位号
/// 单据号 入库单 出库单 移库单
/// 任务号
/// 处理描述
/// 操作人
///
public async Task AddException(string type, string palletNo, string excLocatNo, string orderNo, string taskNo, string text, int userId)
{
try
{
var exNo = new Common().GetMaxNo("EX");
var num = await ExceptionRst.AddAsync(new SysException()
{
Type = type,
ExceptionNo = exNo,
PalletNo = palletNo,
ExcLocatNo = excLocatNo,
OrderNo = orderNo,
TaskNo = taskNo,
Text = text,
CreateUser = userId
});
if (num > 0)
{
return true;
}
else
{
return false;
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
///
/// 获取异常处理信息列表
///
/// 异常号
/// 托盘号
/// 异常储位
/// 关联单号
/// 关联任务号
/// 异常类型
/// 状态
///
public List GetTableList(string exceptionNo, string palletNo, string excLocatNo, string orderNo, string taskNo, string type, string status)
{
List tablelist = ExceptionRst.GetExceptionList(exceptionNo, palletNo, excLocatNo, orderNo, taskNo, type, status);
return tablelist;
}
///
/// 根据id获取异常信息
///
/// 异常id
///
public SysException GetTableById(int id)
{
SysException table = ExceptionRst.GetExceptionById(id);
return table;
}
///
/// 新增异常处理
///
/// 异常类型
/// 托盘号
/// 异常储位
/// 关联单号
/// 关联任务号
/// 备注
/// 创建人
///
/// 捕获异常
public async Task InsertTableName(string type, string palletNo, string excLocatNo, string orderNo, string taskNo, string demo, int uid)
{
//捕获异常
try
{
//获取最大异常号
string ExceptionNo = ExceptionRst.GetMaxExceptionNo().ExceptionNo;
//判断获取到的异常号是否为空
if (!string.IsNullOrEmpty(ExceptionNo))
{
ExceptionNo = "1000";
}
else
{
ExceptionNo = (int.Parse(ExceptionNo) + 1).ToString();
}
int i = await ExceptionRst.InsertException(ExceptionNo, type, palletNo, excLocatNo, orderNo, taskNo, demo, uid);
return i;
}
catch (Exception ex)
{
//抛出异常
throw new Exception("新增异常处理", ex);
}
}
///
/// 处理异常状态-空取异常
///
/// 异常处理dto
///
/// 捕获异常
public string EditStatus(ExceptionDto tabledto)
{
string strMessage = "";
var time = DateTime.Now;
try
{
//异常处理表
SysException exception = Db.Queryable().First(m => m.Id == tabledto.Id);
if (exception == null || exception.Status != "0")
{
strMessage = "该异常不存在或已处理";
return strMessage;
}
//储位表
SysStorageLocat storageLocat = Db.Queryable().First(m => m.LocatNo == exception.ExcLocatNo);
if (storageLocat == null || storageLocat.Flag != "1")
{
throw new Exception("储位不存在或状态异常!");
}
//库存明细表
DataStockDetail stockDetail = Db.Queryable().First(m => m.PalletNo == exception.PalletNo);
if (stockDetail == null)
{
throw new Exception("库存明细不存在!");
}
//库存总表
DataStock stock = Db.Queryable().First(m => m.SkuNo == stockDetail.SkuNo && m.LotNo == stockDetail.LotNo);
if (stock == null)
{
throw new Exception("库存不存在!");
}
//开启事务
Db.Ado.BeginTran();
//异常处理表,将状态Status修改为:1,已处理
exception.Status = "1";
exception.Text = tabledto.Text;
exception.Demo = tabledto.Demo;
exception.UpdateUser = tabledto.UpdateUser;
exception.UpdateTime = time;
Db.Updateable(exception).ExecuteCommand();
//找到货物处理
if (tabledto.IsHasGoods == "0")
{
//储位表, 将储位标志Flag修改为:0:正常
storageLocat.Flag = "0";
storageLocat.Status = "1";
storageLocat.UpdateUser = tabledto.UpdateUser;
storageLocat.UpdateTime = time;
Db.Updateable(storageLocat).UpdateColumns(it => new { it.Flag, it.UpdateUser, it.UpdateTime }).ExecuteCommand();
//库存明细表,修改锁定数量LockQty=锁定数量LockQty-托盘数量,状态Status修改为:0:待分配
stockDetail.LockQty = stockDetail.LockQty - stockDetail.Qty;
stockDetail.Status = "0";
stockDetail.UpdateUser = tabledto.UpdateUser;
stockDetail.UpdateTime = time;
Db.Updateable(stockDetail).UpdateColumns(it => new { it.LockQty, it.Status, it.UpdateUser, it.UpdateTime }).ExecuteCommand();
//库存总表,修改锁定数量LockQty=锁定数量-托盘数量
stock.LockQty = Convert.ToDecimal(stock.LockQty - stockDetail.Qty);
stock.UpdateUser = tabledto.UpdateUser;
stock.UpdateTime = time;
Db.Updateable(stock).UpdateColumns(it => new { it.LockQty, it.UpdateUser, it.UpdateTime }).ExecuteCommand();
}
else//未找到货物处理
{
//储位表,
storageLocat.Status = "0"; //将储位状态Status修改为:0,空储位,
storageLocat.Flag = "0";//将储位标志Flag修改为:0:正常
storageLocat.UpdateUser = tabledto.UpdateUser;
storageLocat.UpdateTime = time;
Db.Updateable(storageLocat).UpdateColumns(it => new {it.Status, it.Flag, it.UpdateUser, it.UpdateTime }).ExecuteCommand();
var crNo = new Common().GetMaxNo("CR");
var check = new BllStockCheck()
{
CRNo = crNo,
Status = 2,
Origin = "1",
CreateUser = tabledto.UpdateUser,
CreateTime = time
};
//添加盘点表
Db.Insertable(check).ExecuteCommand();
var detail = new BllStockCheckDetail()
{
CRNo = crNo,
PalletNo = exception.PalletNo,
Qty = stockDetail.Qty,
RealQty = 0,
CheckResult = 1,// 0:正常,1:异常
Status = 3,
SkuNo = stockDetail.SkuNo,
SkuName = stockDetail.SkuName,
Standard = stockDetail.Standard,
LotNo = stockDetail.LotNo,
LotText = stockDetail.LotText,
SupplierLot = stockDetail.SupplierLot,
TaskNo = exception.TaskNo,
CreateUser = tabledto.UpdateUser,
CreateTime = time
};
//添加盘点明细表
Db.Insertable(detail).ExecuteCommand();
var outStockBox = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == exception.PalletNo).ToList();
var logList = new List();
foreach (var item in outStockBox)
{
var checkLog = new BllStockCheckLog()
{
CRNo = crNo,
PalletNo = exception.PalletNo,
BoxNo = item.BoxNo,
BoxNo2 = item.BoxNo2,
BoxNo3 = item.BoxNo3,
Qty = item.Qty,
RealQty = 0,
CheckResult = 1,
CheckDate = time,
CheckUserId = tabledto.UpdateUser,
SkuNo = item.SkuNo,
SkuName = item.SkuName,
Standard = item.Standard,
LotNo = item.LotNo,
LotText = item.LotText,
SupplierLot = item.SupplierLot,
CreateUser = tabledto.UpdateUser,
CreateTime = time
};
logList.Add(checkLog);
}
//添加盘点记录表
Db.Insertable(logList).ExecuteCommand();
}
//提交事务
Db.Ado.CommitTran();
//插入操作日志
_operation.InsertOperation("仓库设置", "异常管理", exception.ExceptionNo, "编辑", $"处理了异常号为:{exception.ExceptionNo}的异常信息", Convert.ToInt32(exception.UpdateUser));
return strMessage;
}
catch (Exception ex)
{
Db.RollbackTran();
//抛出异常
throw new Exception("处理状态异常", ex);
}
}
///
/// 处理异常状态-满入异常
///
///
///
public string EditStatus2(ExceptionDto tabledto)
{
string strMessage = "";
var time = DateTime.Now;
try
{
//异常处理表
SysException exception = Db.Queryable().First(m => m.Id == tabledto.Id);
if (exception == null || exception.Status != "0")
{
strMessage = "该异常不存在或已处理";
return strMessage;
}
//储位表
SysStorageLocat storageLocat = Db.Queryable().First(m => m.LocatNo == exception.ExcLocatNo);
if (storageLocat == null || storageLocat.Flag != "1")
{
throw new Exception("储位不存在或状态异常!");
}
//开启事务
Db.Ado.BeginTran();
//异常处理表,将状态Status修改为:1,已处理
exception.Status = "1";
exception.Text = tabledto.Text;
exception.Demo = tabledto.Demo;
exception.UpdateUser = tabledto.UpdateUser;
exception.UpdateTime = time;
Db.Updateable(exception).ExecuteCommand();
//储位表
storageLocat.Status = "0";// 将储位状态Status修改为:0
storageLocat.Flag = "0";//空储位,将储位标志Flag修改为:0:正常
storageLocat.UpdateUser = tabledto.UpdateUser;
storageLocat.UpdateTime = time;
Db.Updateable(storageLocat).UpdateColumns(it => new { it.Status, it.Flag, it.UpdateUser, it.UpdateTime }).ExecuteCommand();
//提交事务
Db.Ado.CommitTran();
//插入操作日志
_operation.InsertOperation("仓库设置", "异常管理", exception.ExceptionNo, "编辑", $"处理了异常号为:{exception.ExceptionNo}的异常信息", Convert.ToInt32(exception.UpdateUser));
return strMessage;
}
catch (Exception ex)
{
Db.RollbackTran();
//抛出异常
throw new Exception("处理状态异常", ex);
}
}
}
}