using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Admin.NET.Core;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq.Dynamic.Core;
using Microsoft.AspNetCore.Http;
using System.Text;
using System.Web;
using SixLabors.ImageSharp;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
using Furion;
using Serilog;
using Furion.RemoteRequest.Extensions;
using HttpMethod = System.Net.Http.HttpMethod;
namespace Admin.NET.Application
{
///
/// 领料单服务
///
[ApiDescriptionSettings("单据管理", Name = "WmsTakeMaterialOrder", Order = 100)]
[Route("api/[Controller]")]
public class WmsTakeMaterialOrderService : IWmsTakeMaterialOrderService, IDynamicApiController, ITransient
{
private readonly IRepository _wmsTakeMaterialOrderRep;
private readonly IRepository _sysDictTypeRep;
private readonly IRepository _sysDictDataRep;
private readonly ISysExcelTemplateService _sysExcelTemplateService;
private readonly static object _lock = new();
private readonly IRepository _wmsTakeMaterialOrderDetailRep;
private readonly IRepository _wmsOrderTypeRep;
private readonly IRepository _wmsPlaceRep;
private readonly IRepository _wmsMaterialStockRep;
private readonly IRepository _wmsMaterialContainerRep;
private readonly IRepository _wmsSortOrderRep;
private readonly IRepository _wmsTaskRep;
public WmsTakeMaterialOrderService(
IRepository wmsTakeMaterialOrderRep
,IRepository sysDictTypeRep
,IRepository sysDictDataRep
,ISysExcelTemplateService sysExcelTemplateService
,IRepository wmsTakeMaterialOrderDetailRep
, IRepository wmsOrderTypeRep
, IRepository wmsPlaceRep
, IRepository wmsMaterialStockRep
, IRepository wmsMaterialContainerRep
, IRepository wmsSortOrderRep
, IRepository wmsTaskRep
)
{
_wmsTakeMaterialOrderRep = wmsTakeMaterialOrderRep;
_sysDictTypeRep = sysDictTypeRep;
_sysDictDataRep = sysDictDataRep;
_sysExcelTemplateService = sysExcelTemplateService;
_wmsTakeMaterialOrderDetailRep = wmsTakeMaterialOrderDetailRep;
_wmsOrderTypeRep = wmsOrderTypeRep;
_wmsPlaceRep = wmsPlaceRep;
_wmsMaterialStockRep = wmsMaterialStockRep;
_wmsMaterialContainerRep = wmsMaterialContainerRep;
_wmsSortOrderRep = wmsSortOrderRep;
_wmsTaskRep = wmsTaskRep;
}
///
/// 分页查询领料单
///
///
///
[HttpGet("page")]
public async Task> Page([FromQuery] WmsTakeMaterialOrderSearch input)
{
var wmsTakeMaterialOrders = await _wmsTakeMaterialOrderRep.DetachedEntities
.Where(!string.IsNullOrEmpty(input.MoveType), u => EF.Functions.Like(u.MoveType, $"%{input.MoveType.Trim()}%"))
.Where(!string.IsNullOrEmpty(input.NO), u => EF.Functions.Like(u.NO, $"%{input.NO.Trim()}%"))
.Where(!string.IsNullOrEmpty(input.WBSElementcode), u => EF.Functions.Like(u.WBSElementcode, $"%{input.WBSElementcode.Trim()}%"))
.Where(!string.IsNullOrEmpty(input.BenefitingDepartcode), u => EF.Functions.Like(u.BenefitingDepartcode, $"%{input.BenefitingDepartcode.Trim()}%"))
.Where(!string.IsNullOrEmpty(input.CostCenterID), u => EF.Functions.Like(u.CostCenterID, $"%{input.CostCenterID.Trim()}%"))
.Where(!string.IsNullOrEmpty(input.FI_Client_Analysis_H), u => EF.Functions.Like(u.FI_Client_Analysis_H, $"%{input.FI_Client_Analysis_H.Trim()}%"))
.Where(input.IsInnerCompany != null, u => u.IsInnerCompany == input.IsInnerCompany)
.Where(!string.IsNullOrEmpty(input.PickerID), u => EF.Functions.Like(u.PickerID, $"%{input.PickerID.Trim()}%"))
.Where(!string.IsNullOrEmpty(input.WarehouseCentername), u => EF.Functions.Like(u.WarehouseCentername, $"%{input.WarehouseCentername.Trim()}%"))
.Where(!string.IsNullOrEmpty(input.Companyname), u => EF.Functions.Like(u.Companyname, $"%{input.Companyname.Trim()}%"))
.Where(input.OrderStatus != null, u => u.OrderStatus == input.OrderStatus)
.OrderBy(PageInputOrder.OrderBuilder(input))
.ProjectToType()
.ToADPagedListAsync(input.PageNo, input.PageSize);
return wmsTakeMaterialOrders;
}
///
/// 不分页查询领料单列表
///
/// 领料单查询参数
/// (领料单)实例列表
[HttpGet("listNonPage")]
public async Task> ListNonPageAsync([FromQuery] WmsTakeMaterialOrderSearchNonPage input)
{
var pMoveType = input.MoveType?.Trim() ?? "";
var pNO = input.NO?.Trim() ?? "";
var pWBSElementcode = input.WBSElementcode?.Trim() ?? "";
var pBenefitingDepartcode = input.BenefitingDepartcode?.Trim() ?? "";
var pCostCenterID = input.CostCenterID?.Trim() ?? "";
var pFI_Client_Analysis_H = input.FI_Client_Analysis_H?.Trim() ?? "";
var pIsInnerCompany = input.IsInnerCompany;
var pPickerID = input.PickerID?.Trim() ?? "";
var pWarehouseCentername = input.WarehouseCentername?.Trim() ?? "";
var pCompanyname = input.Companyname?.Trim() ?? "";
var pOrderStatus = input.OrderStatus;
var wmsTakeMaterialOrders = await _wmsTakeMaterialOrderRep.DetachedEntities
.Where(!string.IsNullOrEmpty(pMoveType), u => EF.Functions.Like(u.MoveType, $"%{pMoveType}%"))
.Where(!string.IsNullOrEmpty(pNO), u => EF.Functions.Like(u.NO, $"%{pNO}%"))
.Where(!string.IsNullOrEmpty(pWBSElementcode), u => EF.Functions.Like(u.WBSElementcode, $"%{pWBSElementcode}%"))
.Where(!string.IsNullOrEmpty(pBenefitingDepartcode), u => EF.Functions.Like(u.BenefitingDepartcode, $"%{pBenefitingDepartcode}%"))
.Where(!string.IsNullOrEmpty(pCostCenterID), u => EF.Functions.Like(u.CostCenterID, $"%{pCostCenterID}%"))
.Where(!string.IsNullOrEmpty(pFI_Client_Analysis_H), u => EF.Functions.Like(u.FI_Client_Analysis_H, $"%{pFI_Client_Analysis_H}%"))
.Where(pIsInnerCompany != null, u => u.IsInnerCompany == pIsInnerCompany)
.Where(!string.IsNullOrEmpty(pPickerID), u => EF.Functions.Like(u.PickerID, $"%{pPickerID}%"))
.Where(!string.IsNullOrEmpty(pWarehouseCentername), u => EF.Functions.Like(u.WarehouseCentername, $"%{pWarehouseCentername}%"))
.Where(!string.IsNullOrEmpty(pCompanyname), u => EF.Functions.Like(u.Companyname, $"%{pCompanyname}%"))
.Where(pOrderStatus != null, u => u.OrderStatus == pOrderStatus)
.OrderBy(PageInputOrder.OrderNonPageBuilder(input))
.ProjectToType()
.ToListAsync();
return wmsTakeMaterialOrders;
}
///
/// 获取单据明细
///
///
///
[HttpGet("PageDetail")]
public async Task> PageDetail([FromQuery] TakePageDetailInput input)
{
var wmsOrders = await _wmsTakeMaterialOrderDetailRep.DetachedEntities
.Where(input.Id != null, u => u.OrderId == input.Id)
.ProjectToType()
.ToADPagedListAsync(input.PageNo, input.PageSize);
return wmsOrders;
}
///
/// 分页查询物料库存
///
///
///
[HttpGet("stockPage")]
public async Task> StockPage([FromQuery] TakeMaterialStockSearch input)
{
//从未执行和执行中的任务中获取库位进行筛选(未写)
//查询所有被锁定库位和待出的库存
var lockPlace = await _wmsPlaceRep.DetachedEntities.Where(x => x.Islock == YesOrNot.Y || x.PlaceStatus == PlaceStatus.DAICHU).Select(x => x.PlaceCode).ToListAsync();
var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities
.Where(u => u.StockNumber != 0)
.Where(!string.IsNullOrEmpty(input.MaterialNo), u => EF.Functions.Like(u.MaterialNo, $"%{input.MaterialNo.Trim()}%"))
.Where(!string.IsNullOrEmpty(input.MaterialName), u => EF.Functions.Like(u.MaterialName, $"%{input.MaterialName.Trim()}%"))
.Where(!string.IsNullOrEmpty(input.ProjectCode), u => EF.Functions.Like(u.ProjectCode, $"%{input.ProjectCode.Trim()}%"))
.Where(!string.IsNullOrEmpty(input.ContractCode), u => EF.Functions.Like(u.ContractCode, $"%{input.ContractCode.Trim()}%"))
.Where(!string.IsNullOrEmpty(input.TACode), u => EF.Functions.Like(u.TACode, $"%{input.TACode.Trim()}%"))
.Where(input.SearchBeginTime != null && input.SearchEndTime != null, u => u.CreatedTime >= DateTime.Parse(input.SearchBeginTime.Trim()) &&
u.CreatedTime <= DateTime.Parse(input.SearchEndTime.Trim()))
.Where(u => u.AreaId == 472817877401669)
.Where(u => !lockPlace.Contains(u.PlaceCode))
.ProjectToType()
.ToADPagedListAsync(input.PageNo, input.PageSize);
return wmsMaterialStocks;
}
///
/// 物料编码下拉框
///
///
[HttpGet("GetMaterialNoList")]
public async Task> GetMaterialNoList()
{
// 查询库位表状态为存货的库位作为查询库存的条件 固定库区
List wmsPlaceCodes = await _wmsPlaceRep.Where(u => u.PlaceStatus == PlaceStatus.CUNHUO && u.AreaId == 472817877401669)
.Select(t => t.PlaceCode).ToListAsync();
//从未执行和执行中的任务中获取库位进行筛选(未写)
//查询所有被锁定库位和待出的库存
var lockPlace = await _wmsPlaceRep.DetachedEntities.Where(x => x.Islock == YesOrNot.Y || x.PlaceStatus == PlaceStatus.DAICHU).Select(x => x.PlaceCode).ToListAsync();
//查询库存
var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities
.ToListAsync();
//未执行或执行中的明细托盘相关库存不继续显示
wmsMaterialStocks = wmsMaterialStocks
.Where(u => !lockPlace.Contains(u.PlaceCode))
.GroupBy(x => x.MaterialNo).Select(x => x.First()).ToList();
List MaterialNoListOutputLists = new List();
foreach (var item in wmsMaterialStocks)
{
MaterialNoListOutput MaterialNoListOutput = new MaterialNoListOutput();
MaterialNoListOutput.Code = item.MaterialNo;
MaterialNoListOutput.MaterialNo = item.MaterialNo;
MaterialNoListOutputLists.Add(MaterialNoListOutput);
}
return MaterialNoListOutputLists;
}
///
/// 项目编码下拉框
///
///
[HttpGet("GetProjectCodeList")]
public async Task> GetProjectCodeList()
{
// 查询库位表状态为存货的库位作为查询库存的条件 固定库区
List wmsPlaceCodes = await _wmsPlaceRep.Where(u => u.PlaceStatus == PlaceStatus.CUNHUO && u.AreaId == 472817877401669)
.Select(t => t.PlaceCode).ToListAsync();
//从未执行和执行中的任务中获取库位进行筛选(未写)
//查询所有被锁定库位和待出的库存
var lockPlace = await _wmsPlaceRep.DetachedEntities.Where(x => x.Islock == YesOrNot.Y || x.PlaceStatus == PlaceStatus.DAICHU).Select(x => x.PlaceCode).ToListAsync();
//查询库存
var wmsMaterialStocks = await _wmsMaterialStockRep.DetachedEntities
.ToListAsync();
//未执行或执行中的明细托盘相关库存不继续显示
wmsMaterialStocks = wmsMaterialStocks
.Where(u => !lockPlace.Contains(u.PlaceCode))
.GroupBy(x => x.ProjectCode).Select(x => x.First()).ToList();
List ProjectCodeListOutputLists = new List();
foreach (var item in wmsMaterialStocks)
{
ProjectCodeListOutput ProjectCodeListOutput = new ProjectCodeListOutput();
ProjectCodeListOutput.Code = item.ProjectCode;
ProjectCodeListOutput.ProjectCode = item.ProjectCode;
ProjectCodeListOutputLists.Add(ProjectCodeListOutput);
}
return ProjectCodeListOutputLists;
}
///
/// 增加领料单
///
///
///
[HttpPost("add")]
public async Task Add(AddWmsTakeMaterialOrderInput input)
{
// 查询单据小类是“生产入库”的Id
var wmsOrderType = await _wmsOrderTypeRep.FirstOrDefaultAsync(z => z.Name.Contains("领料出库"));
var wmsTakeMaterialOrder = input.Adapt();
wmsTakeMaterialOrder.SOID = 66666;
wmsTakeMaterialOrder.OrderLargeCategory = wmsOrderType != null ? wmsOrderType.Pid : 0;
wmsTakeMaterialOrder.OrderSubclass = wmsOrderType != null ? wmsOrderType.Id : 0;
wmsTakeMaterialOrder.OrderStatus = OrderStatusEnum.WEIXIAFA;
await _wmsTakeMaterialOrderRep.InsertAsync(wmsTakeMaterialOrder);
}
///
/// 增加领料单(yigo系统获取)
///
///
///
[HttpPost("TakeOrderAdd")]
[UnitOfWork]
public async Task TakeOrderAdd()
{
//获取领料申请单
string url = App.Configuration["YiGoWebApi:QueryOutBoundNotice"];
var Billdate_S = DateTime.Now.AddDays(-15).ToString("yyyy-MM-dd");
var Billdate_E = DateTime.Now.AddDays(15).ToString("yyyy-MM-dd");
//写日志文件
//Log.Error($"[TransferContainerCode][ContainerCode:{input.ContainerCode}][url:{url}]");
var response = await url.SetHttpMethod(System.Net.Http.HttpMethod.Post)
.SetBody(new Dictionary {
{ "Billdate_S", Billdate_S },
{ "Billdate_E", Billdate_E},
}, "application/json").PostAsStringAsync();
var Data = response.FromJson();
var wmsOrderType = await _wmsOrderTypeRep.FirstOrDefaultAsync(z => z.Name.Contains("领料出库"));
foreach (var item in Data.Data)
{
item.Id = Yitter.IdGenerator.YitIdHelper.NextId();
var wmsTakeMaterialOrder = item.Adapt();
var isExcit = await _wmsTakeMaterialOrderRep.AnyAsync(x => x.NO == item.NO);
if (!isExcit)
{
wmsTakeMaterialOrder.OrderLargeCategory = wmsOrderType != null ? wmsOrderType.Pid : 0;
wmsTakeMaterialOrder.OrderSubclass = wmsOrderType != null ? wmsOrderType.Id : 0;
await _wmsTakeMaterialOrderRep.InsertNowAsync(wmsTakeMaterialOrder);
foreach (var item1 in item.Dtls)
{
var wmsTakeMaterialDeatail = item1.Adapt();
wmsTakeMaterialDeatail.OrderId = item.Id;
await _wmsTakeMaterialOrderDetailRep.InsertNowAsync(wmsTakeMaterialDeatail);
}
}
}
}
///
/// 领料下架接口(yigo系统)
///
///
///
[HttpPost("ReturnTakeOrder")]
[UnifyResult(typeof(object))]
[UnitOfWork]
public async Task