using AutoMapper; using OASystem.Domain.Dtos.PersonnelModule; using OASystem.Domain.Entities.Groups; using OASystem.Domain.Entities.PersonnelModule; using OASystem.Domain.ViewModels.PersonnelModule; namespace OASystem.Infrastructure.Repositories.PersonnelModule { /// /// 物品进销存 /// 仓储 /// public class GoodsRepository : BaseRepository { private readonly IMapper _mapper; private JsonView _jv; public GoodsRepository(SqlSugarClient sqlSugar, IMapper mapper) : base(sqlSugar) { _mapper = mapper; _jv = new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = "操作失败!" }; } /// /// 基础数据 /// /// public async Task InitDataSource() { var typeData = await _sqlSugar.Queryable() .Includes(x => x.SubTypeItems.Where(z => z.IsDel == 0) //.Select(z => new { // z.Id, // z.STid, // z.Name //}) .ToList()) .Where(x => x.IsDel == 0 && x.Remark.Equals("GoodsType")) //.Select(x => new { // x.Id, // x.Name, // x.SubTypeItems //}) .ToListAsync(); var groupData = await _sqlSugar.Queryable() .Where(x => x.IsDel == 0) .Select(x => new { id = x.Id, groupName = x.TeamName }) .OrderByDescending(x => x.id) .ToListAsync(); var userData = await _sqlSugar.Queryable() .Where(x => x.IsDel == 0) .Select(x => new { x.Id, UserName = x.CnName, }) .ToListAsync(); _jv.Code = StatusCodes.Status200OK; _jv.Data = new { goodsTypeData = typeData, groupNameData = groupData, userNameData = userData }; _jv.Msg = $"操作成功"; return _jv; } /// /// 物品列表 /// /// /// public async Task GoodsList(GoodsListDTO dto) { var ids = new List(); if (!string.IsNullOrEmpty(dto.TypeIds)) { var strArray = dto.TypeIds.Split(','); foreach (var str in strArray) { if (int.TryParse(str, out int id)) { ids.Add(id); } } } RefAsync total = 0; var data = await _sqlSugar.Queryable() .LeftJoin((gi, sd) => gi.Type == sd.Id) .LeftJoin((gi, sd, u) => gi.LastUpdateUserId == u.Id) .Where((gi, sd, u) => gi.IsDel == 0) .WhereIF(ids.Count > 0, (gi, sd, u) => ids.Contains(gi.Type)) .WhereIF(!string.IsNullOrEmpty(dto.GoodsName), (gi, sd, u) => gi.Name.Contains(dto.GoodsName)) .Select((gi, sd, u) => new { gi.Id, gi.Name, gi.Type, TypeName = sd.Name, gi.StockQuantity, LastUpdateUserName = u.CnName, gi.LastUpdateTime, gi.Remark, }) .OrderByDescending(gi => gi.LastUpdateTime) .ToPageListAsync(dto.PageIndex, dto.PageSize, total); _jv.Code = StatusCodes.Status200OK; _jv.Data = data; _jv.Count = total; _jv.Msg = $"操作成功"; return _jv; } /// /// 物品Info /// /// /// /// public async Task GoodsInfo(int portType, int id) { var data = await _sqlSugar.Queryable() .LeftJoin((gi, sd) => gi.Type == sd.Id) .LeftJoin((gi, sd, u1) => gi.LastUpdateUserId == u1.Id) .LeftJoin((gi, sd, u1, u2) => gi.CreateUserId == u2.Id) .Where((gi, sd, u1, u2) => gi.IsDel == 0 && gi.Id == id) .Select((gi, sd, u1, u2) => new { gi.Id, gi.Name, ParentType = sd.STid, gi.Type, TypeName = sd.Name, gi.SQ_Total, gi.OQ_Total, gi.PriceTotal, gi.StockQuantity, gi.Remark, LastUpdateUserName = u1.CnName, gi.LastUpdateTime, CreateUserName = u2.CnName, gi.CreateTime, }) .FirstAsync(); _jv.Code = StatusCodes.Status200OK; _jv.Data = data; _jv.Msg = $"操作成功"; return _jv; } /// /// 物品 OP(Create Or Edit) /// /// /// /// public async Task GoodsOp(GoodsOPDTO dto, int currUserId) { var info = new Pm_GoodsInfo() { Id = dto.Id, Name = dto.Name, Type = dto.Type, SQ_Total = 0, OQ_Total = 0, PriceTotal = 0, StockQuantity = 0, Remark = dto.Remark, LastUpdateUserId = currUserId, LastUpdateTime = DateTime.Now, CreateUserId = currUserId }; if (dto.Id > 0) //Edit { var upd = await _sqlSugar.Updateable(info) .UpdateColumns(x => new { x.Name, x.Type, x.Remark, x.LastUpdateUserId, x.LastUpdateTime, }) .ExecuteCommandAsync(); if (upd > 0) { _jv.Msg = $"修改成功!"; _jv.Code = StatusCodes.Status200OK; return _jv; } } else if (dto.Id < 1) //添加 { var selectInfo = await _sqlSugar.Queryable().FirstAsync(x => x.Name.Equals(info.Name)); if (selectInfo != null) { _jv.Msg = $"“{info.Name}”该物品已存在,请勿重新添加!"; return _jv; } var add = await _sqlSugar.Insertable(info).ExecuteCommandAsync(); if (add > 0) { _jv.Msg = $"添加成功!"; _jv.Code = StatusCodes.Status200OK; return _jv; } } return _jv; } /// /// 物品 Del /// /// /// /// public async Task GoodsDel(int id, int currUserId) { _sqlSugar.BeginTran(); var goods = await _sqlSugar.Updateable() .SetColumns(x => new Pm_GoodsInfo() { IsDel = 1, DeleteUserId = currUserId, DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }) .Where(x => x.Id == id) .ExecuteCommandAsync(); if (goods < 1) { _sqlSugar.RollbackTran(); _jv.Msg = $"操作失败"; return _jv; } var goodsStorage = await _sqlSugar.Updateable() .SetColumns(x => new Pm_GoodsStorage() { IsDel = 1, DeleteUserId = currUserId, DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }) .Where(x => x.Id == id) .ExecuteCommandAsync(); var goodsReceive = await _sqlSugar.Updateable() .SetColumns(x => new Pm_GoodsReceive() { IsDel = 1, DeleteUserId = currUserId, DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }) .Where(x => x.Id == id) .ExecuteCommandAsync(); _sqlSugar.CommitTran(); _jv.Code = StatusCodes.Status200OK; _jv.Msg = $"操作成功!"; return _jv; } /// /// 物品入库列表 /// /// /// public async Task GoodsStorageList(GoodsStorageListDTO dto) { RefAsync total = 0; var data = await _sqlSugar.Queryable() .LeftJoin((gs, gi) => gs.GoodsId == gi.Id) .LeftJoin((gs, gi, u) => gs.CreateUserId == u.Id) .LeftJoin((gs, gi, u,u1) => gs.StorageUserId == u1.Id) .Where((gs, gi, u,u1) => gs.IsDel == 0) .WhereIF(dto.GoodsId > 0, (gs, gi, u,u1) => gs.GoodsId == dto.GoodsId) .Select((gs, gi, u, u1) => new { gs.Id, gs.GoodsId, GoodsName = gi.Name, gs.Quantity, gs.UnitPrice, gs.TotalPrice, gs.SupplierName, gs.SupplierTel, gs.SupplierAddress, gs.SupplierSource, StorageUserName=u1.CnName, gs.StorageTime, CreateUserName = u.CnName, gs.CreateTime, }) .OrderByDescending(gs => gs.CreateTime) .ToPageListAsync(dto.PageIndex, dto.PageSize, total); _jv.Code = StatusCodes.Status200OK; _jv.Data = data; _jv.Count = total; _jv.Msg = $"操作成功"; return _jv; } /// /// 物品入库详情 /// /// /// public async Task GoodsStorageInfo(int portType, int id) { var data = await _sqlSugar.Queryable() .LeftJoin((gs, gi) => gs.GoodsId == gi.Id) .LeftJoin((gs, gi, u) => gs.CreateUserId == u.Id) .LeftJoin((gs, gi, u, u1) => gs.StorageUserId == u1.Id) .Where((gs, gi, u) => gs.IsDel == 0) .WhereIF(id > 0, (gs, gi, u) => gs.Id == id) .Select((gs, gi, u, u1) => new { gs.Id, gs.GoodsId, GoodsName = gi.Name, gs.Quantity, gs.UnitPrice, gs.TotalPrice, gs.SupplierName, gs.SupplierTel, gs.SupplierAddress, gs.SupplierSource, StorageUser = u1.CnName, gs.StorageTime, CreateUserName = u.CnName, gs.CreateTime, gs.Remark }) .FirstAsync(); _jv.Msg = $"操作成功!"; _jv.Code = StatusCodes.Status200OK; _jv.Data = data; return _jv; } /// /// 物品入库 操作(Create Or Edit) /// /// /// /// public async Task GoodsStorageOp(GoodsStorageOpDto dto, int currUserId) { var info = _mapper.Map(dto); info.CreateUserId = currUserId; info.BatchNo = Guid.NewGuid().ToString("N"); decimal editAgoQuantity = 0.00M, editAgoTotalPrice = 0.00M; _sqlSugar.BeginTran(); if (info.Id > 0) //修改 { var selectInfo = await _sqlSugar.Queryable() .Where(x => x.Id == dto.Id) .FirstAsync(); editAgoQuantity = selectInfo.Quantity; editAgoTotalPrice = selectInfo.TotalPrice; var storageEdit = await _sqlSugar.Updateable(info) .UpdateColumns(x => new { x.Quantity, x.UnitPrice, x.TotalPrice, x.SupplierName, x.SupplierTel, x.SupplierAddress, x.SupplierSource, x.StorageUserId, x.StorageTime }) .Where(x => x.Id == dto.Id) .ExecuteCommandAsync(); if (storageEdit < 1) { _sqlSugar.RollbackTran(); _jv.Msg = $"修改失败!"; return _jv; } } else if (info.Id < 1) //添加 { var storageAdd = await _sqlSugar.Insertable(info).ExecuteCommandAsync(); if (storageAdd < 1) { _sqlSugar.RollbackTran(); _jv.Msg = $"添加失败!"; return _jv; } } var goodsInfo = await _sqlSugar.Queryable().FirstAsync(x => x.Id == info.GoodsId); goodsInfo.SQ_Total = goodsInfo.SQ_Total - editAgoQuantity + info.Quantity; goodsInfo.StockQuantity = goodsInfo.StockQuantity - editAgoQuantity + info.Quantity; goodsInfo.PriceTotal = goodsInfo.PriceTotal - editAgoTotalPrice + info.TotalPrice; goodsInfo.LastUpdateUserId = currUserId; goodsInfo.LastUpdateTime = DateTime.Now; var goodsEdit = await _sqlSugar.Updateable(goodsInfo) .UpdateColumns(x => new { x.SQ_Total, x.StockQuantity, x.PriceTotal, x.LastUpdateUserId, x.LastUpdateTime, }) .Where(x => x.Id == info.GoodsId) .ExecuteCommandAsync(); if (goodsEdit > 0) { _sqlSugar.CommitTran(); _jv.Msg = $"操作成功!"; _jv.Code = StatusCodes.Status200OK; return _jv; } _sqlSugar.RollbackTran(); _jv.Msg = $"操作失败!"; return _jv; } /// /// 物品入库 Del /// /// /// public async Task GoodsStorageDel(int id, int userId) { var storageInfo = await _sqlSugar.Queryable() .Where(x => x.Id == id) .FirstAsync(); if (storageInfo == null) return _jv; decimal delAgoQauntity = storageInfo.Quantity, delAgoTotalPrice = storageInfo.TotalPrice; int goodsId = storageInfo.GoodsId; _sqlSugar.BeginTran(); var storageDel = await _sqlSugar.Updateable() .SetColumns(x => new Pm_GoodsStorage { DeleteUserId = userId, DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), IsDel = 1 }) .Where(x => x.Id == id) .ExecuteCommandAsync(); if (storageDel < 1) { _sqlSugar.RollbackTran(); _jv.Msg = $"操作失败!"; return _jv; } var goodsInfo = await _sqlSugar.Queryable().FirstAsync(x => x.Id == goodsId); goodsInfo.SQ_Total = goodsInfo.SQ_Total - delAgoQauntity; goodsInfo.StockQuantity = goodsInfo.StockQuantity - delAgoQauntity; goodsInfo.PriceTotal = goodsInfo.PriceTotal - delAgoTotalPrice; goodsInfo.LastUpdateUserId = userId; goodsInfo.LastUpdateTime = DateTime.Now; var goodsEdit = await _sqlSugar.Updateable(goodsInfo) .UpdateColumns(x => new { x.SQ_Total, x.StockQuantity, x.PriceTotal, x.LastUpdateUserId, x.LastUpdateTime, }) .Where(x => x.Id == goodsId) .ExecuteCommandAsync(); if (goodsEdit > 0) { _sqlSugar.CommitTran(); _jv.Msg = $"操作成功!"; _jv.Code = StatusCodes.Status200OK; return _jv; } _sqlSugar.RollbackTran(); _jv.Msg = $"操作失败!"; return _jv; } /// /// 物品领用列表 /// /// /// public async Task GoodsReceiveList(GoodsReceiveListDTO dto) { RefAsync total = 0; var data = await _sqlSugar.Queryable() .LeftJoin((gr, gi) => gr.GoodsId == gi.Id) .LeftJoin((gr, gi, u1) => gr.AuditUserId == u1.Id) .LeftJoin((gr, gi, u1, u2) => gr.CreateUserId == u2.Id) .Where((gr, gi, u1, u2) => gr.IsDel == 0) .WhereIF(dto.GoodsId > 0, (gr, gi, u1, u2) => gr.GoodsId == dto.GoodsId) .WhereIF(dto.GoodsId > 0, (gr, gi, u1, u2) => gr.CreateUserId == dto.CurrUserId) .Select((gr, gi, u1, u2) => new GoodsReceiveListView { Id = gr.Id, GroupId = gr.GroupId, GoodsId = gr.GoodsId, GoodsName = gi.Name, Quantity = gr.Quantity, Reason = gr.Reason, Remark = gr.Remark, AuditStatus = gr.AuditStatus, //AuditStatusText = gr.AuditStatus.GetEnumDescription(), AuditUserId = gr.AuditUserId, AuditUserName = u1.CnName, AuditTime = gr.AuditTime, CreateUserName = u2.CnName, CreateTime = gr.CreateTime }) .OrderByDescending(gr => gr.CreateTime) .ToPageListAsync(dto.PageIndex, dto.PageSize, total); _jv.Code = StatusCodes.Status200OK; _jv.Data = data; _jv.Count = total; _jv.Msg = $"操作成功"; return _jv; } /// /// 物品领用详情 /// /// /// /// public async Task GoodsReceiveInfo(int portType, int id) { var data = await _sqlSugar.Queryable() .LeftJoin((gr, gi) => gr.GoodsId == gi.Id) .LeftJoin((gr, gi, u1) => gr.AuditUserId == u1.Id) .LeftJoin((gr, gi, u1, u2) => gr.CreateUserId == u2.Id) .Where((gr, gi, u1, u2) => gr.IsDel == 0) .WhereIF(id > 0, (gr, gi, u1, u2u) => gr.Id == id) .Select((gr, gi, u1, u2) => new { gr.Id, gr.GroupId, gr.GoodsId, GoodsName = gi.Name, gr.Quantity, gr.Reason, gr.Remark, gr.AuditStatus, AuditStatusText = gr.AuditStatus.GetDescription(), gr.AuditUserId, AuditUserName = u1.CnName, gr.AuditTime, CreateUserName = u2.CnName, gr.CreateTime }) .FirstAsync(); _jv.Code = StatusCodes.Status200OK; _jv.Data = data; _jv.Msg = $"操作成功"; return _jv; } /// /// 物品领用 OP(Add Or Edit) /// /// /// /// public async Task GoodsReceiveOP(GoodsReceiveOPDTO dto, int currUserId) { var info = _mapper.Map(dto); info.CreateUserId = currUserId; _sqlSugar.BeginTran(); //物品现有库存 var stockQuantity = _sqlSugar.Queryable() .First(x => x.Id == info.GoodsId) ?.StockQuantity; //待审核 该物品数量 var waitAuditQuantity = await _sqlSugar.Queryable() .Where(x => x.IsDel == 0 && x.GoodsId == dto.GoodsId && x.AuditStatus == GoodsAuditEnum.Pending ) .SumAsync(x => x.Quantity); if (info.Id > 0) //修改 { //审核验证 var selectInfo = await _sqlSugar.Queryable().FirstAsync(x => x.Id == info.Id); if (selectInfo.AuditStatus == GoodsAuditEnum.Approved) { _sqlSugar.RollbackTran(); _jv.Msg = $"该条数据已通过审核,不可更改!"; return _jv; } //物品数量验证 decimal editAfterQuantity = waitAuditQuantity - selectInfo.Quantity + info.Quantity; if (editAfterQuantity > stockQuantity) { _sqlSugar.RollbackTran(); _jv.Msg = $"该物品现有库存不足,不可更改!请联系采购人员购买!"; return _jv; } var edit = await _sqlSugar.Updateable(info) .UpdateColumns(x => new { x.GroupId, x.Quantity, x.Reason, x.Remark, }) .Where(x => x.Id == info.Id) .ExecuteCommandAsync(); if (edit > 0) { _sqlSugar.CommitTran(); _jv.Msg = $"操作成功!"; _jv.Code = StatusCodes.Status200OK; return _jv; } } else if (info.Id < 1) //添加 { //物品数量验证 decimal addAgoQuantity = waitAuditQuantity + info.Quantity; if (addAgoQuantity > stockQuantity) { _sqlSugar.RollbackTran(); _jv.Msg = $"该物品现有库存不足,不可更改!请联系采购人员购买!"; return _jv; } var add = await _sqlSugar.Insertable(info).ExecuteCommandAsync(); if (add > 0) { _sqlSugar.CommitTran(); _jv.Msg = $"操作成功!"; _jv.Code = StatusCodes.Status200OK; return _jv; } } _sqlSugar.RollbackTran(); return _jv; } /// /// 物品领用 Audit /// /// /// /// /// public async Task GoodsReceiveAudit(int[] idArray, int userId, GoodsAuditEnum auditEnum) { if (idArray.Length < 1) return _jv; //TODO: 审核权限验证 _sqlSugar.BeginTran(); var receiveInfos = await _sqlSugar.Queryable() .Where(x => x.IsDel == 0 && idArray.Contains(x.Id)) .ToListAsync(); bool status = true; foreach (var id in idArray) { var currInfo = receiveInfos.Find(x => x.Id == id); var edit = await _sqlSugar.Updateable() .SetColumns(x => new Pm_GoodsReceive() { AuditStatus = auditEnum, AuditUserId = userId, AuditTime = DateTime.Now, }) .Where(x => x.Id == id) .ExecuteCommandAsync(); if (edit < 1) status = false; var goodsInfo = await _sqlSugar.Queryable().Where(x => x.Id == currInfo.GoodsId).FirstAsync(); goodsInfo.StockQuantity = goodsInfo.StockQuantity - currInfo.Quantity; goodsInfo.LastUpdateTime = DateTime.Now; goodsInfo.LastUpdateUserId = userId; var editGoods = await _sqlSugar.Updateable(goodsInfo) .UpdateColumns(x => new { x.StockQuantity, x.LastUpdateUserId, x.LastUpdateTime, }) .Where(x => x.Id == id) .ExecuteCommandAsync(); if (editGoods < 1) status = false; } if (status) { _sqlSugar.CommitTran(); _jv.Msg = $"操作成功!"; _jv.Code = StatusCodes.Status200OK; return _jv; } _sqlSugar.RollbackTran(); return _jv; } /// /// 物品领用 Del /// /// /// /// /// public async Task GoodsReceiveDel(int id, int currUserId) { var receiveInfo = await _sqlSugar.Queryable() .Where(x => x.IsDel == 0 && x.Id == id) .FirstAsync(); if (receiveInfo.AuditStatus == GoodsAuditEnum.Approved) { _jv.Msg = $"该条数据已通过审核,不可删除!"; return _jv; } var edit = await _sqlSugar.Updateable() .UpdateColumns(x => new Pm_GoodsReceive() { IsDel = 1, DeleteUserId = currUserId, DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), }) .Where(x => x.Id == id) .ExecuteCommandAsync(); if (edit > 0) { _jv.Msg = $"操作成功!"; _jv.Code = StatusCodes.Status200OK; return _jv; } return _jv; } } }