using DapperORMCore.Context.DataContext;
using DapperORMCore.Model.BaseModel;
using DapperORMCore.Model.CoreModel;
using DapperORMCore.Repository.IRepositorys;
using DapperORMCore.String.Consts;
using DapperORMCore.String.Enums;
using Microsoft.Extensions.Configuration;
using NXWMS.Code;
using NXWMS.DataAccess.Entity;
using NXWMS.IService.NXWMS.Balance;
using NXWMS.Model.AppModels.Condition.Balance;
using NXWMS.Model.AppModels.Result.Balance;
using NXWMS.Model.AppModels.Result.OutStock;
using NXWMS.Model.Common;
using NXWMS.String.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WestDistance.DapperORM.Repository.Repositorys;
namespace NXWMS.Service.NXWMS.Balance
{
///
/// 库存操作接口
///
[AutoInject(typeof(IBalanceOperateService), InjectType.Scope)]
public class BalanceOperateService : ServiceBase, IBalanceOperateService
{
///
/// 系统操作仓储中转
///
private IDataRepositoryContext _dataContext;
///
/// SQL节点仓储
///
private ISQLNodeRepository _iSQLNodeRepository;
///
/// 配置
///
private IConfiguration _configuration;
///
/// 库存查询服务
///
private IBalanceSearchService _balanceSearchService;
public BalanceOperateService(IDataRepositoryContext dataRepositoryContext,
IConfiguration configuration, ISQLNodeRepository iSQLNodeRepository, IBalanceSearchService balanceSearchService)
{
this._dataContext = dataRepositoryContext;
this._configuration = configuration;
this._iSQLNodeRepository = iSQLNodeRepository;
this._balanceSearchService = balanceSearchService;
}
///
/// 库存状态变更
///
///
///
public OperateResultInfo BalanceStatusChange(BalanceStatusChangeCondition info)
{
if (info.BalanceId == 0 && string.IsNullOrWhiteSpace(info.BalanceIds))
{
return FailMessageStatus("参数错误!");
}
var sqlAndBuilder = new StringBuilder();
sqlAndBuilder = info.BalanceId != null ?
sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("BALANCE_ID", info.BalanceId, DBOperationString._Equal)) :
sqlAndBuilder;
sqlAndBuilder = string.IsNullOrWhiteSpace(info.BalanceIds) ?
sqlAndBuilder :
sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("BALANCE_ID", info.BalanceIds, DBOperationString._In));
if (sqlAndBuilder.Length == 0)
{
return FailMessageStatus("参数错误!");
}
var now = DateTime.Now;
var sql = $@"UPDATE WMS_STK_BALANCE SET BALANCE_STATUS={(int)info.BalanceStatus},UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
WHERE 1=1 {sqlAndBuilder}";
var affectedRows = new DataRepository(_dataContext).Execute(sql);
if (!string.IsNullOrWhiteSpace(info.BalanceIds))
{
return GetStatus(affectedRows, info.BalanceIds.Split(',').Length);
}
if (info.BalanceId != null)
{
return GetStatus(affectedRows, 1);
}
return SuccessStatus();
}
///
/// 盘点状态变更
///
///
///
public OperateResultInfo InventoryStatusChange(InventoryStatusChangeCondition info)
{
var sqlAndBuilder = new StringBuilder();
sqlAndBuilder = info.Id != null ?
info.Id > 0 ?
sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("INVENTORY_ID", info.Id, DBOperationString._Equal)) :
sqlAndBuilder : sqlAndBuilder;
sqlAndBuilder = string.IsNullOrWhiteSpace(info.InventoryNo) ?
sqlAndBuilder :
sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("INVENTORY_NO", info.InventoryNo, DBOperationString._Equal));
sqlAndBuilder = string.IsNullOrWhiteSpace(info.Ids) ?
sqlAndBuilder :
sqlAndBuilder.Append(_iSQLNodeRepository.GetAddCondition("INVENTORY_ID", info.Ids, DBOperationString._In));
if (sqlAndBuilder.Length == 0)
{
return FailMessageStatus("参数错误!");
}
try
{
_dataContext.BeginTran();
var now = DateTime.Now;
var sql = string.Empty;
int statusBalance;
if (info.InventoryModeMsg == "结束盘点")
{
statusBalance = 55;
}
else if (info.InventoryModeMsg == "正常盘点")
{
statusBalance = 88;
}
else
{
statusBalance = 88;
}
if (info.InventoryModeMsg == "正常盘点" || info.InventoryModeMsg == "结束盘点")
{
sql = $@"UPDATE WMS_STK_INVENTORY SET INVENTORY_STATUS={(int)info.InventoryStatus},
UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
WHERE 1=1 {sqlAndBuilder}";
new DataRepository(_dataContext).Execute(sql);
sql = $@"UPDATE WMS_STK_INVENTORY_DTL SET INVENTORY_DTL_STATUS={(int)info.InventoryStatus},
UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
WHERE 1=1 AND EXISTS(SELECT * FROM WMS_STK_INVENTORY WHERE 1=1 {sqlAndBuilder})";
new DataRepository(_dataContext).Execute(sql);
}
sql = $"update WMS_STK_BALANCE set BALANCE_STATUS = '{statusBalance}',UPDATE_BY = '{info.OperationUserId}',UPDATE_TIME = getdate(),DATA_VERSION = DATA_VERSION + 1 where TRAY_CODE in (select TRAY_CODE from WMS_STK_INVENTORY_DTL where INVENTORY_ID = '{info.Ids}') and BALANCE_STATUS < 99";
new DataRepository(_dataContext).Execute(sql);
sql = $"update WMS_STK_TRAY set TRAY_STATUS = '{statusBalance}',UPDATE_BY = '{info.OperationUserId}',UPDATE_TIME = getdate(),DATA_VERSION = DATA_VERSION + 1 where TRAY_CODE in (select TRAY_CODE from WMS_STK_INVENTORY_DTL where INVENTORY_ID = '{info.Ids}') and TRAY_STATUS < 99";
new DataRepository(_dataContext).Execute(sql);
sql = $"update WMS_STK_TRAY_DTL set TRAY_DTL_STATUS = '{statusBalance}',UPDATE_BY = '{info.OperationUserId}',UPDATE_TIME = getdate(),DATA_VERSION = DATA_VERSION + 1 where TRAY_DTL_ID in (select TRAY_DTL_ID from WMS_STK_INVENTORY_DTL where INVENTORY_ID = '{info.Ids}') and TRAY_DTL_STATUS < 99";
new DataRepository(_dataContext).Execute(sql);
_dataContext.Commit();
return SuccessStatus();
}
catch (Exception ex)
{
_dataContext.Rollback();
return FailMessageStatus(ex.Message);
}
}
public OperateResultInfo ConfirmInventory(ResultConfirmInventoryCondition info)
{
try
{
_dataContext.BeginTran();
var now = DateTime.Now;
var sql = $@"UPDATE WMS_STK_INVENTORY SET INVENTORY_STATUS={(int)info.InventoryStatus},
UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
WHERE 1=1 AND INVENTORY_NO='{info.InventoryNo}'";
new DataRepository(_dataContext).Execute(sql);
foreach (var item in info.ResultConfirmInventoryDetail)
{
sql = $@"UPDATE WMS_STK_INVENTORY_DTL SET ACTUAL_INVENTORY_QTY={item.ActualInventoryQty},
UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
WHERE 1=1 AND INVENTORY_DTL_ID={item.InventoryDTLId}";
new DataRepository(_dataContext).Execute(sql);
}
_dataContext.Commit();
return SuccessStatus();
}
catch (Exception ex)
{
_dataContext.Rollback();
return FailMessageStatus(ex.Message);
}
}
///
/// 盘点单结果确认
///
///
///
public OperateResultInfo ResultConfirmInventory(ResultConfirmInventoryCondition info)
{
//TODO 暂时注释,,减少麻烦...
//var whereList = new List()
// .AddFieldKeyInfo(nameof(WMS_STK_INVENTORY.INVENTORY_NO), info.InventoryNo,
// EnumCSharpPropertyType.STRING, DBOperationString._Equal,
// !string.IsNullOrWhiteSpace(info.InventoryNo))
// .AddFieldKeyInfo(nameof(WMS_STK_INVENTORY.RESULT_FLAG), 1,
// EnumCSharpPropertyType.STRING, DBOperationString._NoEqual);
//var result = new DataRepository(_dataContext).Query(whereList).FirstOrDefault();
//if (result == null)
//{
// return FailMessageStatus($"盘点单数据出现变更,请重新刷新数据!");
//}
//if (result.INVENTORY_STATUS != (int)InventoryStatus.FirstInventorComplate
// && result.INVENTORY_STATUS != (int)InventoryStatus.TwoInventorComplate)
//{
// return FailMessageStatus($"盘点单状态不在盘点完成,请重新刷新数据!");
//}
try
{
_dataContext.BeginTran();
var now = DateTime.Now;
var sql = $@"UPDATE WMS_STK_INVENTORY SET RESULT_FLAG=1,
UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
WHERE 1=1 AND INVENTORY_NO='{info.InventoryNo}'";
new DataRepository(_dataContext).Execute(sql);
foreach(var item in info.ResultConfirmInventoryDetail)
{
sql = $@"UPDATE WMS_STK_INVENTORY_DTL SET INVENTORY_RESULT_QTY={item.InventoryResultQTY},
UPDATE_BY={info.OperationUserId},UPDATE_TIME='{now}'
WHERE 1=1 AND INVENTORY_DTL_ID={item.InventoryDTLId}";
new DataRepository(_dataContext).Execute(sql);
}
sql = $@"update [dbo].[WMS_STK_BALANCE]
set BALANCE_STATUS=55 where PALLET_CODE in (
SELECT PALLET_CODE
FROM [dbo].[WMS_STK_INVENTORY_DTL] ,WMS_STK_INVENTORY where WMS_STK_INVENTORY.INVENTORY_ID=WMS_STK_INVENTORY.INVENTORY_ID
and WMS_STK_INVENTORY.INVENTORY_NO='{info.InventoryNo}'
) and BALANCE_STATUS={(int)BalanceStatus.Complete}";
new DataRepository(_dataContext).Execute(sql);
sql = $@"update WMS_STK_TRAY_DTL set WMS_STK_TRAY_DTL.QTY=tbl2.INVENTORY_RESULT_QTY from WMS_STK_TRAY_DTL,
(select tbl.TRAY_DTL_ID,tbl.MATERIEL_CODE,WMS_STK_INVENTORY_DTL.INVENTORY_RESULT_QTY,WMS_STK_INVENTORY.INVENTORY_NO from WMS_STK_INVENTORY_DTL
left join (
select WMS_STK_TRAY_DTL.TRAY_DTL_ID,WMS_STK_TRAY.TRAY_CODE,WMS_STK_TRAY_DTL.MATERIEL_CODE from WMS_STK_TRAY_DTL
left join WMS_STK_TRAY on WMS_STK_TRAY_DTL.TRAY_ID=WMS_STK_TRAY.TRAY_ID) as tbl on WMS_STK_INVENTORY_DTL.TRAY_CODE=tbl.TRAY_CODE
LEFT JOIN WMS_STK_INVENTORY ON WMS_STK_INVENTORY_DTL.INVENTORY_ID=WMS_STK_INVENTORY.INVENTORY_ID
) tbl2
where WMS_STK_TRAY_DTL.TRAY_DTL_ID=tbl2.TRAY_DTL_ID and tbl2.INVENTORY_NO='{info.InventoryNo}'";
new DataRepository(_dataContext).Execute(sql);
_dataContext.Commit();
return SuccessStatus();
}
catch (Exception ex)
{
_dataContext.Rollback();
return FailMessageStatus(ex.Message);
}
}
///
/// 新增盘点单
///
///
///
public OperateResultInfo AddInventory(InventoryOperateCondition info)
{
var whereList = new List()
.AddFieldKeyInfo(nameof(WMS_STK_BALANCE.BALANCE_ID), string.Join(",", info.InventoryAddDetailList.Select(s => s.BalanceId).ToList()),
EnumCSharpPropertyType.STRING, DBOperationString._In,
info.InventoryAddDetailList.Any())
.AddFieldKeyInfo(nameof(WMS_STK_BALANCE.BALANCE_STATUS), (int)BalanceStatus.InStock,
EnumCSharpPropertyType.STRING, DBOperationString._NoEqual, true);
var result = new DataRepository(_dataContext).Query(whereList);
if (result.Any())
{
return FailMessageStatus($"新增的盘点单明细中,【{string.Join(",", result.Select(s => s.BIN_CODE))}】库位均不是在库状态,请检查!");
}
try
{
_dataContext.BeginTran();
var now = DateTime.Now;
int inventoryId = Convert.ToInt32(new DataRepository