/***********************************************************************
* Project: baifenBinfa
* ProjectName: 百分兵法管理系统
* Web: http://chuanyin.com
* Author:
* Email:
* CreateTime: 202403/02
* 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;
using CoreCms.Net.Model.Entities.baifenbingfa.puhuo;
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, string username, CoreCmsDistribution distribution)
{
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 if (entity.model.type == 3)
{
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;
if (entity.model.type == 3 )
{
if (stockModel.memo == "无")
{
stockModel.memo = "";
}
stockModel.memo = distribution.name+ " 经销商铺货 " + stockModel.memo;
stockModel.type = 2;
}
else
{
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,
distributionPrice = p.distributionPrice,
CategoryID = good.goodsCategoryId,
}).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;
}
}
else if (entity.model.type == 3)
{
stock = product.stock - item.nums;
if (stock < 0)
{
jm.msg = $"第{index}个货品最大出库数量为:" + product.stock;
return jm;
}
}
product.nums = item.nums;
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();
}
//铺货
if (entity.model.type == 3)
{
if (products.Any() && distribution != null)
{
foreach (var products1 in products)
{
var puhuo = await DbClient.Queryable().Where(x => x.isdelete == false && x.productsId == products1.id && x.distributionId == entity.model.distributionId).FirstAsync();
if (puhuo != null)
{
puhuo.nums = puhuo.nums + products1.nums;
puhuo.price = products1.distributionPrice;
puhuo.amount = products1.distributionPrice * new decimal(puhuo.nums);
puhuo.isdelete = false;
//entity.createBy = username;
puhuo.upDataBy = username;
//entity.createTime = DateTime.Now;
puhuo.upDataTime = DateTime.Now;
await DbClient.Updateable(puhuo).ExecuteCommandAsync();
}
else
{
puhuo = new Puhuo();
puhuo.distributionId = entity.model.distributionId;
puhuo.distributionName = distribution.name;
puhuo.areaCode = distribution.areaCode;
puhuo.areaCodeName = distribution.areaName;
puhuo.CategoryId = products1.CategoryID??0;
//获取全部数据缓存
var categorie = await DbClient.Queryable().Where(x => x.id == puhuo.CategoryId).FirstAsync(); ;
if (categorie != null)
{
puhuo.CategoryName = categorie.name;
}
puhuo.goodsId = products1.goodsId;
puhuo.goodsName = products1.name;
puhuo.productsId = products1.id;
puhuo.productsName = products1.sn;
puhuo.spesDesc = products1.spesDesc;
puhuo.shoukuannums = 0;
puhuo.shoukuanamount = 0;
puhuo.nums = puhuo.nums + products1.nums;
puhuo.price = products1.distributionPrice;
puhuo.amount = products1.distributionPrice * new decimal(puhuo.nums);
puhuo.isdelete = false;
puhuo.createBy = username;
puhuo.upDataBy = username;
puhuo.createTime = DateTime.Now;
puhuo.upDataTime = DateTime.Now;
await DbClient.Insertable(puhuo).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;
}
}
}
}
}