/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Caching.Manual;
using CoreCms.Net.Configuration;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Helper;
using SqlSugar;
namespace CoreCms.Net.Repository
{
///
/// 库存操作表 接口实现
///
public class CoreCmsStockRepository : BaseRepository, ICoreCmsStockRepository
{
private readonly IUnitOfWork _unitOfWork;
public CoreCmsStockRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
{
_unitOfWork = unitOfWork;
}
#region 实现重写增删改查操作==========================================================
///
/// 重写异步插入方法
///
/// 实体数据
///
public async Task InsertAsync(FMCreateStock entity)
{
var jm = new AdminUiCallBack();
if (entity.items == null || !entity.items.Any())
{
jm.msg = "至少选择一个货品哦";
return jm;
}
bool isRepeat = entity.items.GroupBy(i => i.productId).Any(g => g.Count() > 1);
if (isRepeat)
{
jm.msg = "请勿提交相同货品";
return jm;
}
if (entity.items.Any(p => p.nums <= 0))
{
jm.msg = "入库出库的货品数量不能为0";
return jm;
}
var stockModel = new CoreCmsStock();
if (entity.model.type == (int)GlobalEnumVars.StockType.In)
{
stockModel.id = await CreateCode(GlobalEnumVars.StockType.In.ToString());
}
else if (entity.model.type == (int)GlobalEnumVars.StockType.Out)
{
stockModel.id = await CreateCode(GlobalEnumVars.StockType.Out.ToString());
}
else
{
jm.msg = "单据类型错误";
return jm;
}
stockModel.memo = entity.model.memo;
stockModel.createTime = DateTime.Now;
stockModel.manager = entity.model.manager;
stockModel.type = entity.model.type;
var logs = new List();
var products = new List();
var index = 0;
foreach (var item in entity.items)
{
index++;
//判断此货品是否存在
var product = await DbClient.Queryable((p, good) => new JoinQueryInfos(
JoinType.Left, p.goodsId == good.id))
.Select((p, good) => new CoreCmsProducts
{
id = p.id,
goodsId = p.goodsId,
barcode = p.barcode,
sn = p.sn,
price = p.price,
costprice = p.costprice,
mktprice = p.mktprice,
marketable = p.marketable,
weight = p.weight,
stock = p.stock,
freezeStock = p.freezeStock,
spesDesc = p.spesDesc,
isDefalut = p.isDefalut,
images = p.images,
isDel = p.isDel,
name = good.name,
bn = good.bn,
isMarketable = good.isMarketable,
unit = good.unit
}).With(SqlWith.NoLock)
.MergeTable()
.Where(p => p.id == item.productId).FirstAsync();
if (product != null && item.nums > 0)
{
var stock = 0;
if (entity.model.type == (int)GlobalEnumVars.StockType.In)
{
stock = product.stock + item.nums;
}
else if (entity.model.type == (int)GlobalEnumVars.StockType.Out)
{
stock = product.stock - item.nums;
if (stock < 0)
{
jm.msg = $"第{index}个货品最大出库数量为:" + product.stock;
return jm;
}
}
product.stock = stock;
products.Add(product);
var log = new CoreCmsStockLog
{
stockId = stockModel.id,
productId = product.id,
goodsId = product.goodsId,
nums = item.nums,
sn = product.sn,
bn = product.barcode,
goodsName = product.name,
spesDesc = product.spesDesc,
createTime = DateTime.Now
};
logs.Add(log);
}
else
{
jm.msg = $"请检查第{index}个货品或数量是否正确";
return jm;
}
}
try
{
_unitOfWork.BeginTran();
var bl = await DbClient.Insertable(stockModel).ExecuteCommandAsync() > 0;
if (products.Any())
{
await DbClient.Updateable(products).ExecuteCommandAsync();
}
if (logs.Any())
{
await DbClient.Insertable(logs).ExecuteCommandAsync();
}
jm.code = bl ? 0 : 1;
jm.msg = bl ? GlobalConstVars.CreateSuccess : GlobalConstVars.CreateFailure;
_unitOfWork.CommitTran();
}
catch (Exception e)
{
_unitOfWork.RollbackTran();
jm.code = 1;
jm.msg = "处理异常";
jm.data = e;
}
return jm;
}
#endregion
#region 重写根据条件查询分页数据
///
/// 重写根据条件查询分页数据
///
/// 判断集合
/// 排序方式
/// 当前页面索引
/// 分布大小
///
/// 是否使用WITH(NOLOCK)
///
public async Task> QueryPageAsync(Expression> predicate,
Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
RefAsync totalCount = 0;
List page;
if (blUseNoLock)
{
page = await DbClient.Queryable((p, sUser) => new JoinQueryInfos(
JoinType.Left, p.manager == sUser.id))
.Select((p, sUser) => new CoreCmsStock
{
id = p.id,
type = p.type,
manager = p.manager,
memo = p.memo,
createTime = p.createTime,
managerName = sUser.nickName
})
.With(SqlWith.NoLock)
.MergeTable()
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate)
.ToPageListAsync(pageIndex, pageSize, totalCount);
}
else
{
page = await DbClient.Queryable((p, sUser) => new JoinQueryInfos(JoinType.Left, p.manager == sUser.id))
.Select((p, sUser) => new CoreCmsStock
{
id = p.id,
type = p.type,
manager = p.manager,
memo = p.memo,
createTime = p.createTime,
managerName = sUser.nickName
})
.MergeTable()
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate)
.ToPageListAsync(pageIndex, pageSize, totalCount);
}
var list = new PageList(page, pageIndex, pageSize, totalCount);
return list;
}
#endregion
///
/// 生成唯一单号
///
///
///
public async Task CreateCode(string type)
{
Random rand = new Random();
while (true)
{
var str = string.Empty;
if (type == GlobalEnumVars.StockType.In.ToString())
{
str = "sI";
}
else if (type == GlobalEnumVars.StockType.Out.ToString())
{
str = "sO";
}
else
{
str = "sU";
}
str += CommonHelper.Msectime() + rand.Next(0, 9);
var bl = await DbClient.Queryable().AnyAsync(p => p.id == str);
if (bl == false)
{
return str;
}
}
}
}
}