|
|
|
|
@ -0,0 +1,338 @@
|
|
|
|
|
using IRepository;
|
|
|
|
|
using IServices;
|
|
|
|
|
using Microsoft.AspNetCore.Hosting;
|
|
|
|
|
using SqlSugar;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using YL.Core.Dto;
|
|
|
|
|
using YL.Core.Entity;
|
|
|
|
|
using YL.Utils.Extensions;
|
|
|
|
|
using YL.Utils.Files;
|
|
|
|
|
using YL.Utils.Json;
|
|
|
|
|
using YL.Utils.Pub;
|
|
|
|
|
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,
|
|
|
|
|
IWms_inventoryrecordRepository inventoryrecordRepository,
|
|
|
|
|
IWms_stockindetailRepository detail,
|
|
|
|
|
IWebHostEnvironment env,
|
|
|
|
|
IWms_stockinRepository repository) : base(repository)
|
|
|
|
|
{
|
|
|
|
|
_client = client;
|
|
|
|
|
_repository = repository;
|
|
|
|
|
_detail = detail;
|
|
|
|
|
_inventory = inventoryRepository;
|
|
|
|
|
_inventoryrecord = inventoryrecordRepository;
|
|
|
|
|
_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(), // 入库单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,
|
|
|
|
|
JoinType.Left,s.StockInType==d.DictId,
|
|
|
|
|
JoinType.Left,s.CreateBy==c.UserId,
|
|
|
|
|
JoinType.Left,s.ModifiedBy==u.UserId,
|
|
|
|
|
})
|
|
|
|
|
.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()
|
|
|
|
|
.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, // 关联审核人用户表
|
|
|
|
|
})
|
|
|
|
|
.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, // 货架名称
|
|
|
|
|
// 根据状态值转换为状态描述
|
|
|
|
|
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.IsDel,
|
|
|
|
|
s.Remark,
|
|
|
|
|
s.AuditinTime, // 审核时间
|
|
|
|
|
AName = a.UserNickname, // 审核人昵称
|
|
|
|
|
CName = c.UserNickname, // 创建人昵称
|
|
|
|
|
s.CreateDate,
|
|
|
|
|
UName = u.UserNickname, // 修改人昵称
|
|
|
|
|
s.ModifiedDate
|
|
|
|
|
})
|
|
|
|
|
.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 inventoryDetail = new List<Wms_inventoryrecord>();
|
|
|
|
|
|
|
|
|
|
// 遍历明细处理库存
|
|
|
|
|
stockInDetailList.ForEach(c =>
|
|
|
|
|
{
|
|
|
|
|
// 查询当前物料在对应货架的库存记录
|
|
|
|
|
var exist = _client.Queryable<Wms_inventory>()
|
|
|
|
|
.Where(i => i.MaterialId == c.MaterialId && i.StoragerackId == c.StoragerackId)
|
|
|
|
|
.First();
|
|
|
|
|
|
|
|
|
|
if (exist.IsNullT())
|
|
|
|
|
{
|
|
|
|
|
// 库存不存在则新增库存记录
|
|
|
|
|
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
|
|
|
|
|
{
|
|
|
|
|
// 库存已存在则更新库存数量(累加实际入库数量)
|
|
|
|
|
exist.Qty += c.ActInQty;
|
|
|
|
|
exist.ModifiedBy = UserId; // 修改人ID
|
|
|
|
|
exist.ModifiedDate = DateTimeExt.DateTime; // 修改时间
|
|
|
|
|
_client.Updateable(exist).ExecuteCommand();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 添加库存变动记录
|
|
|
|
|
inventoryDetail.Add(new Wms_inventoryrecord
|
|
|
|
|
{
|
|
|
|
|
InventoryrecordId = PubId.SnowflakeId, // 生成雪花ID
|
|
|
|
|
CreateBy = UserId, // 创建人ID
|
|
|
|
|
Qty = c.ActInQty, // 变动数量(实际入库数量)
|
|
|
|
|
StockInDetailId = c.StockInDetailId // 关联入库单明细ID
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 批量插入库存变动记录
|
|
|
|
|
_client.Insertable(inventoryDetail).ExecuteCommand();
|
|
|
|
|
|
|
|
|
|
// 更新入库单明细状态为"已审核"
|
|
|
|
|
_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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|