提交注释

master
wuxiaole 6 months ago
parent 62f44fe7b6
commit cb6b89acc3

@ -16,15 +16,34 @@ using YL.Utils.Table;
namespace Services
{
/// <summary>
/// 入库单服务实现类
/// 继承基础服务类BaseServices并实现IWms_stockinServices接口
/// </summary>
public class Wms_stockinServices : BaseServices<Wms_stockin>, IWms_stockinServices
{
// 入库单仓储接口实例
private readonly IWms_stockinRepository _repository;
// 入库单明细仓储接口实例
private readonly IWms_stockindetailRepository _detail;
// SqlSugar数据库客户端实例
private readonly SqlSugarClient _client;
// 库存仓储接口实例
private readonly IWms_inventoryRepository _inventory;
// 库存记录仓储接口实例
private readonly IWms_inventoryrecordRepository _inventoryrecord;
// Web主机环境实例用于访问Web根目录
private readonly IWebHostEnvironment _env;
/// <summary>
/// 构造函数,通过依赖注入获取所需服务实例
/// </summary>
/// <param name="client">SqlSugar数据库客户端</param>
/// <param name="inventoryRepository">库存仓储接口</param>
/// <param name="inventoryrecordRepository">库存记录仓储接口</param>
/// <param name="detail">入库单明细仓储接口</param>
/// <param name="env">Web主机环境</param>
/// <param name="repository">入库单仓储接口</param>
public Wms_stockinServices(
SqlSugarClient client,
IWms_inventoryRepository inventoryRepository,
@ -41,69 +60,110 @@ namespace Services
_env = env;
}
/// <summary>
/// 分页查询入库单列表数据
/// </summary>
/// <param name="bootstrap">入库单分页查询参数对象,包含分页、排序、查询条件等</param>
/// <returns>返回JSON格式的分页数据符合Bootstrap表格要求</returns>
public string PageList(PubParams.StockInBootstrapParams bootstrap)
{
// 总记录数
int totalNumber = 0;
// 处理分页偏移量将offset(起始索引)转换为页码(当前页)
if (bootstrap.offset != 0)
{
bootstrap.offset = bootstrap.offset / bootstrap.limit + 1;
}
// 构建查询:关联多个表
// Wms_stockin(入库单表)、Wms_supplier(供应商表)、Sys_dict(字典表-入库类型)、
// Sys_user(创建人用户表)、Sys_user(修改人用户表)
var query = _client.Queryable<Wms_stockin, Wms_supplier, Sys_dict, Sys_user, Sys_user>
((s, p, d, c, u) => new object[] {
// 左连接入库单表的供应商ID关联供应商表的供应商ID
JoinType.Left,s.SupplierId==p.SupplierId,
// 左连接入库单表的入库类型关联字典表的字典ID
JoinType.Left,s.StockInType==d.DictId,
// 左连接入库单表的创建人ID关联用户表的用户ID
JoinType.Left,s.CreateBy==c.UserId,
// 左连接入库单表的修改人ID关联用户表的用户ID
JoinType.Left,s.ModifiedBy==u.UserId,
})
// 筛选条件只查询未删除的数据IsDel=1表示未删除
.Where((s, p, d, c, u) => s.IsDel == 1 && d.IsDel == 1 && c.IsDel == 1)
// 选择需要返回的字段,构建匿名对象
.Select((s, p, d, c, u) => new
{
StockInId = s.StockInId.ToString(),
StockInType = d.DictName,
StockInTypeId = s.StockInType.ToString(),
s.StockInStatus,
s.StockInNo,
s.OrderNo,
s.SupplierId,
p.SupplierNo,
p.SupplierName,
s.IsDel,
s.Remark,
CName = c.UserNickname,
s.CreateDate,
UName = u.UserNickname,
s.ModifiedDate
}).MergeTable();
StockInId = s.StockInId.ToString(), // 入库单ID转换为字符串
StockInType = d.DictName, // 入库类型名称(从字典表获取)
StockInTypeId = s.StockInType.ToString(), // 入库类型ID
s.StockInStatus, // 入库单状态
s.StockInNo, // 入库单号
s.OrderNo, // 订单号
s.SupplierId, // 供应商ID
p.SupplierNo, // 供应商编号
p.SupplierName, // 供应商名称
s.IsDel, // 是否删除标识
s.Remark, // 备注
CName = c.UserNickname, // 创建人昵称
s.CreateDate, // 创建时间
UName = u.UserNickname, // 修改人昵称
s.ModifiedDate // 修改时间
})
.MergeTable(); // 合并表查询(将关联结果视为虚拟表)
// 搜索条件:入库单号或订单号包含搜索内容
if (!bootstrap.search.IsEmpty())
{
query.Where((s) => s.StockInNo.Contains(bootstrap.search) || s.OrderNo.Contains(bootstrap.search));
}
// 日期范围查询:创建时间在指定范围内
if (!bootstrap.datemin.IsEmpty() && !bootstrap.datemax.IsEmpty())
{
query.Where(s => s.CreateDate > bootstrap.datemin.ToDateTimeB() && s.CreateDate <= bootstrap.datemax.ToDateTimeE());
}
// 入库类型筛选按入库类型ID筛选
if (!bootstrap.StockInType.IsEmpty())
{
query.Where((s) => s.StockInTypeId.Contains(bootstrap.StockInType));
}
// 入库状态筛选:按入库状态筛选
if (!bootstrap.StockInStatus.IsEmpty())
{
query.Where((s) => s.StockInStatus == bootstrap.StockInStatus.ToByte());
}
// 设置排序方式
if (bootstrap.order.Equals("desc", StringComparison.OrdinalIgnoreCase))
{
// 降序排序
query.OrderBy($"MergeTable.{bootstrap.sort} desc");
}
else
{
// 升序排序
query.OrderBy($"MergeTable.{bootstrap.sort} asc");
}
// 执行分页查询,获取当前页数据和总记录数
var list = query.ToPageList(bootstrap.offset, bootstrap.limit, ref totalNumber);
// 构建符合Bootstrap表格要求的JSON数据并返回
return Bootstrap.GridData(list, totalNumber).JilToJson();
}
/// <summary>
/// 获取入库单打印数据
/// </summary>
/// <param name="stockInId">入库单ID</param>
/// <returns>返回包含入库单主信息、明细信息和打印模板的JSON数据</returns>
public string PrintList(string stockInId)
{
// 查询入库单主信息(关联供应商、字典、用户表)
var list1 = _client.Queryable<Wms_stockin, Wms_supplier, Sys_dict, Sys_user, Sys_user>
((s, p, d, c, u) => new object[] {
JoinType.Left,s.SupplierId==p.SupplierId,
@ -129,104 +189,149 @@ namespace Services
s.CreateDate,
UName = u.UserNickname,
s.ModifiedDate
}).MergeTable().Where(s => s.StockInId == stockInId).ToList();
bool flag1 = true;
bool flag2 = true;
})
.MergeTable()
.Where(s => s.StockInId == stockInId)
.ToList();
// 查询入库单明细信息(关联物料、入库单、货架、用户表)
var list2 = _client.Queryable<Wms_stockindetail, Wms_material, Wms_stockin, Wms_storagerack, Sys_user, Sys_user, Sys_user>
((s, m, p, g, c, u, a) => new object[] {
JoinType.Left,s.MaterialId==m.MaterialId,
JoinType.Left,s.StockInId==p.StockInId,
JoinType.Left,s.StoragerackId==g.StorageRackId,
JoinType.Left,s.CreateBy==c.UserId,
JoinType.Left,s.ModifiedBy==u.UserId,
JoinType.Left,s.AuditinId==a.UserId,
JoinType.Left,s.MaterialId==m.MaterialId, // 关联物料表
JoinType.Left,s.StockInId==p.StockInId, // 关联入库单表
JoinType.Left,s.StoragerackId==g.StorageRackId, // 关联货架表
JoinType.Left,s.CreateBy==c.UserId, // 关联创建人用户表
JoinType.Left,s.ModifiedBy==u.UserId, // 关联修改人用户表
JoinType.Left,s.AuditinId==a.UserId, // 关联审核人用户表
})
.Where((s, m, p, g, c, u, a) => s.IsDel == 1 && p.IsDel == 1 && g.IsDel == 1 && c.IsDel == 1)
.Select((s, m, p, g, c, u, a) => new
{
StockInId = s.StockInId.ToString(),
StockInDetailId = s.StockInDetailId.ToString(),
m.MaterialNo,
m.MaterialName,
g.StorageRackNo,
g.StorageRackName,
m.MaterialNo, // 物料编号
m.MaterialName, // 物料名称
g.StorageRackNo, // 货架编号
g.StorageRackName, // 货架名称
// 根据状态值转换为状态描述
Status = SqlFunc.IF(s.Status == 1).Return(StockInStatus.initial.GetDescription())
.ElseIF(s.Status == 2).Return(StockInStatus.egis.GetDescription())
.ElseIF(s.Status == 3).Return(StockInStatus.auditfailed.GetDescription())
.End(StockInStatus.underReview.GetDescription()),
s.PlanInQty,
s.ActInQty,
s.PlanInQty, // 计划入库数量
s.ActInQty, // 实际入库数量
s.IsDel,
s.Remark,
s.AuditinTime,
AName = a.UserNickname,
CName = c.UserNickname,
s.AuditinTime, // 审核时间
AName = a.UserNickname, // 审核人昵称
CName = c.UserNickname, // 创建人昵称
s.CreateDate,
UName = u.UserNickname,
UName = u.UserNickname, // 修改人昵称
s.ModifiedDate
}).MergeTable().Where(c => c.StockInId == stockInId).OrderBy(c => c.CreateDate, OrderByType.Desc).ToList();
if (!list1.Any())
{
flag1 = false;
}
if (!list2.Any())
{
flag2 = false;
}
})
.MergeTable()
.Where(c => c.StockInId == stockInId)
.OrderBy(c => c.CreateDate, OrderByType.Desc)
.ToList();
// 标记主信息和明细信息是否存在
bool flag1 = list1.Any();
bool flag2 = list2.Any();
// 读取入库单打印模板HTML文件
var html = FileUtil.ReadFileFromPath(Path.Combine(_env.WebRootPath, "upload", "StockIn.html"));
// 封装数据并转换为JSON返回
return (flag1, list1, flag2, list2, html).JilToJson();
}
/// <summary>
/// 入库单审核操作(事务处理)
/// </summary>
/// <param name="UserId">审核人用户ID</param>
/// <param name="stockInId">入库单ID</param>
/// <returns>审核操作是否成功</returns>
public bool Auditin(long UserId, long stockInId)
{
// 使用数据库事务执行审核逻辑
var flag = _client.Ado.UseTran(() =>
{
//添加库存 如果有则修改 如果没有新增 添加库存明细
var stockInDetailList = _client.Queryable<Wms_stockindetail>().Where(c => c.StockInId == stockInId).ToList();
var inventoryListAdd = new List<Wms_inventory>();
var inventoryListUpdate = new List<Wms_inventory>();
// 查询当前入库单的所有明细
var stockInDetailList = _client.Queryable<Wms_stockindetail>()
.Where(c => c.StockInId == stockInId)
.ToList();
// 用于存储库存记录
var inventoryDetail = new List<Wms_inventoryrecord>();
var inventory = new Wms_inventory();
// 遍历明细处理库存
stockInDetailList.ForEach(c =>
{
var exist = _client.Queryable<Wms_inventory>().Where(i => i.MaterialId == c.MaterialId && i.StoragerackId == c.StoragerackId).First();
// 查询当前物料在对应货架的库存记录
var exist = _client.Queryable<Wms_inventory>()
.Where(i => i.MaterialId == c.MaterialId && i.StoragerackId == c.StoragerackId)
.First();
if (exist.IsNullT())
{
//add
inventory.InventoryId = PubId.SnowflakeId;
inventory.StoragerackId = c.StoragerackId;
inventory.CreateBy = UserId;
inventory.Qty = c.ActInQty;
inventory.MaterialId = c.MaterialId;
//inventoryListAdd.Add(exist);
// 库存不存在则新增库存记录
var inventory = new Wms_inventory
{
InventoryId = PubId.SnowflakeId, // 生成雪花ID
StoragerackId = c.StoragerackId, // 货架ID
CreateBy = UserId, // 创建人ID
Qty = c.ActInQty, // 库存数量(初始为实际入库数量)
MaterialId = c.MaterialId // 物料ID
};
_client.Insertable(inventory).ExecuteCommand();
}
else
{
//update
exist.Qty = exist.Qty + c.ActInQty;
exist.ModifiedBy = UserId;
exist.ModifiedDate = DateTimeExt.DateTime;
//inventoryListUpdate.Add(exist);
// 库存已存在则更新库存数量(累加实际入库数量)
exist.Qty += c.ActInQty;
exist.ModifiedBy = UserId; // 修改人ID
exist.ModifiedDate = DateTimeExt.DateTime; // 修改时间
_client.Updateable(exist).ExecuteCommand();
}
// 添加库存变动记录
inventoryDetail.Add(new Wms_inventoryrecord
{
InventoryrecordId = PubId.SnowflakeId,
CreateBy = UserId,
Qty = c.ActInQty,
StockInDetailId = c.StockInDetailId,
InventoryrecordId = PubId.SnowflakeId, // 生成雪花ID
CreateBy = UserId, // 创建人ID
Qty = c.ActInQty, // 变动数量(实际入库数量)
StockInDetailId = c.StockInDetailId // 关联入库单明细ID
});
});
//_inventory.Insert(inventoryListAdd);
//_inventory.Update(inventoryListUpdate);
// 批量插入库存变动记录
_client.Insertable(inventoryDetail).ExecuteCommand();
//修改明细状态 2
_client.Updateable(new Wms_stockindetail { Status = StockInStatus.egis.ToByte(), AuditinId = UserId, AuditinTime = DateTimeExt.DateTime, ModifiedBy = UserId, ModifiedDate = DateTimeExt.DateTime }).UpdateColumns(c => new { c.Status, c.AuditinId, c.AuditinTime, c.ModifiedBy, c.ModifiedDate })
.Where(c => c.StockInId == stockInId && c.IsDel == 1).ExecuteCommand();
//修改主表中的状态改为进行中 2
_client.Updateable(new Wms_stockin { StockInId = stockInId, StockInStatus = StockInStatus.egis.ToByte(), ModifiedBy = UserId, ModifiedDate = DateTimeExt.DateTime }).UpdateColumns(c => new { c.StockInStatus, c.ModifiedBy, c.ModifiedDate }).ExecuteCommand();
}).IsSuccess;
// 更新入库单明细状态为"已审核"
_client.Updateable(new Wms_stockindetail
{
Status = StockInStatus.egis.ToByte(), // 状态设为已审核
AuditinId = UserId, // 审核人ID
AuditinTime = DateTimeExt.DateTime, // 审核时间
ModifiedBy = UserId, // 修改人ID
ModifiedDate = DateTimeExt.DateTime // 修改时间
})
.UpdateColumns(c => new { c.Status, c.AuditinId, c.AuditinTime, c.ModifiedBy, c.ModifiedDate })
.Where(c => c.StockInId == stockInId && c.IsDel == 1)
.ExecuteCommand();
// 更新入库单主表状态为"已审核"
_client.Updateable(new Wms_stockin
{
StockInId = stockInId,
StockInStatus = StockInStatus.egis.ToByte(), // 状态设为已审核
ModifiedBy = UserId, // 修改人ID
ModifiedDate = DateTimeExt.DateTime // 修改时间
})
.UpdateColumns(c => new { c.StockInStatus, c.ModifiedBy, c.ModifiedDate })
.ExecuteCommand();
}).IsSuccess; // 获取事务执行结果
return flag;
}
}

Loading…
Cancel
Save