using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WMS.Web.Core;
using WMS.Web.Core.Dto;
using WMS.Web.Core.Dto.InStockTask;
using WMS.Web.Core.Help;
using WMS.Web.Core.Internal.Results;
using WMS.Web.Domain.Infrastructure;
using WMS.Web.Domain.IService;
using WMS.Web.Domain.IService.Public;
using WMS.Web.Domain.Options;
using WMS.Web.Domain.Values;
namespace WMS.Web.Api.Controllers
{
///
/// 入库任务单-接口
///
[Route("api/[controller]")]
[ApiController]
public class InStockTaskController : ControllerBase
{
private readonly QiniuOptions _option;
private readonly IExportExcelService _exportExcelService;
private readonly ILoginService _loginService;
private readonly IInStockService _inStockService;
private readonly IInStockTaskService _inStockTaskService;
private readonly IInStockTaskRepositories _inStockTaskRepositories;
private readonly IInventoryDetailsRepositories _inventoryDetailsRepositories;
private readonly IInStockRepositories _inStockRepositories;
public InStockTaskController(
IInStockRepositories inStockRepositories,
IOptions option,
IExportExcelService exportExcelService,
ILoginService loginService,
IInStockTaskService inStockTaskService,
IInStockTaskRepositories inStockTaskRepositories,
IInventoryDetailsRepositories inventoryDetailsRepositories,
IInStockService inStockService)
{
_inStockRepositories = inStockRepositories;
_inventoryDetailsRepositories = inventoryDetailsRepositories;
this._option = option?.Value;
this._exportExcelService = exportExcelService;
this._loginService = loginService;
this._inStockService = inStockService;
this._inStockTaskService = inStockTaskService;
this._inStockTaskRepositories = inStockTaskRepositories;
}
///
/// 列表
///
///
///
[HttpPost]
[Route("GetList")]
public async Task> GetPagedList([FromBody] InStockTaskQueryRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return ResultPagedList.ReFailure(ResultCodes.Token_Invalid_Error);
var (list,total) = await _inStockTaskRepositories.GetPagedList(dto,loginInfo.UserInfo.CompanyId);
return ResultPagedList.ReSuccess(list, total);
}
///
/// 导出
///
///
///
[HttpPost]
[Route("Export")]
public Task> Export([FromBody] InStockTaskQueryRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null)
return Task.FromResult(Result.ReFailure(ResultCodes.Token_Invalid_Error));
string fileName = FileDownLoadOrderType.InStockTask.GetRemark() + loginInfo.UserInfo.CompanyId + DateTime.Now.DateTimeToLongTimeStamp() + ".xlsx";
string res = _option.Url + fileName;
Task.Run(async () =>
{
await _exportExcelService.ExportList(dto, fileName, loginInfo.UserInfo.StaffId, loginInfo.UserInfo.CompanyId, FileDownLoadOrderType.InStockTask);
});
return Task.FromResult(Result.ReSuccess(res));
}
///
/// 作废
///
///
///
[HttpPost]
[Route("Repeal")]
public async Task Repeal([FromBody]OperateRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return Result.ReFailure(ResultCodes.Token_Invalid_Error);
return await _inStockTaskService.Repeal(dto, loginInfo);
}
///
/// 反作废
///
///
///
[HttpPost]
[Route("NoRepeal")]
public async Task NoRepeal([FromBody] OperateRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return Result.ReFailure(ResultCodes.Token_Invalid_Error);
return await _inStockTaskService.NoRepeal(dto, loginInfo);
}
///
/// 金蝶-拉取数据-测试用
///
///
///
[HttpGet]
[Route("Test")]
public async Task Test([FromQuery] string sourceBillNo)
{
var sbns = new List();
sbns.Add(sourceBillNo);
//2.同步金蝶
// return await _inStockTaskService.Sysn(sbns);
return await _inStockTaskService.Sysn(null);//alter by yzh
}
///
/// 刷新
///
///
///
[HttpPost]
[Route("Refresh")]
public async Task Refresh([FromBody] OperateRequest dto)
{
//去重
var ids = dto.Ids.GroupBy(x => x).Select(x=>x.Key).ToList();
//1.先找到任务单-并找到来源单集
var tasks= await _inStockTaskRepositories.GetList(ids);
var sourcesBillNos = tasks.Select(x => x.SourceBillNo).ToList();
//2.同步金蝶
await _inStockTaskService.Sysn(sourcesBillNos);
////再刷新
return await _inStockTaskService.Sysn(null);
}
///
/// 收货-pad
///
///
///
[HttpPost]
[Route("Receive")]
public async Task Receive([FromBody] UpdateInStockTaskRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return Result.ReFailure(ResultCodes.Token_Invalid_Error);
return await _inStockService.Receive(dto, loginInfo);
}
///
/// 来源单-编号模糊查询-采购上架使用-pad
///
/// 来源单号
///
[HttpGet]
[Route("GetSourceOrder/{sourceBillNo}")]
public async Task> GetSourceOrder([FromRoute] string sourceBillNo)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return ResultList.ReFailure(ResultCodes.Token_Invalid_Error);
////将传过来的sourceBillNo进行分割
//string[] s=sourceBillNo.Split('&');
//sourceBillNo=s[0];
//string type=s[1];
var list = await _inStockTaskRepositories.GetListBy(new InStockTaskBillNoQueryRequest() { SourceBillNo = sourceBillNo});
//获取物料对应的仓位
var materialNumbers = list.GroupBy(x => x.MaterialNumber).Select(x => x.Key).ToList();
var stockCodes = list.GroupBy(x => x.StockCode).Select(x => x.Key).ToList();
var orgCodes = list.GroupBy(x => x.OrgCode).Select(x => x.Key).ToList();
var materialSubStocks= await _inventoryDetailsRepositories.GetMaterialSubStocks(materialNumbers, stockCodes, orgCodes, loginInfo.UserInfo.CompanyId);
list.ForEach(x =>
{
x.MaterialSubStocks = materialSubStocks.Where(t => t.MaterialNumber == x.MaterialNumber && t.StockCode == x.StockCode && t.OrgCode == x.OrgCode).Select(x => x.SubStock).ToList();
});
////排除待入库数量为0的
//var result= list.Where(x => x.WaitSlefQty != 0).ToList();
return ResultList.ReSuccess(list);
}
///
/// 来源单-已收货未入库的箱集合-采购上架使用-pad
///
///
///
[HttpGet]
[Route("GetReceiveBox/{taskId}")]
public async Task> GetReceiveBox([FromRoute] int taskId)
{
//找到收货的箱子
var receiveBoxList= await _inStockTaskRepositories.GetReceiveBox(taskId);
//找到已入库的箱子
var instockBoxList= await _inStockRepositories.GetInstockBox(taskId);
var remobox = new List();
if (receiveBoxList.Count!=0 && instockBoxList.Count != 0)
{
//剔除已入库的箱子
foreach (var boxid in instockBoxList.Distinct().ToList())
{
var reBox= receiveBoxList.Where(x => x.BoxId == boxid).FirstOrDefault();
if (reBox != null)
remobox.Add(reBox);
}
}
if (remobox.Count != 0)
{
foreach (var item in remobox)
{
receiveBoxList.Remove(item);
}
}
return ResultList.ReSuccess(receiveBoxList);
}
///
/// 来源单-已收货未入库的箱集合-采购上架使用-pad-post
///
///
///
[HttpPost]
[Route("GetReceiveBox")]
public async Task> GetReceiveBox([FromBody] ReceiveBoxRequeset dto)
{
//找到收货的箱子
var receiveBoxList = await _inStockTaskRepositories.GetReceiveBox(dto.TaskId, dto.MaterialNumber);
//找到已入库的箱子
var instockBoxList = await _inStockRepositories.GetInstockBox(dto.TaskId);
var remobox = new List();
if (receiveBoxList.Count != 0 && instockBoxList.Count != 0)
{
//剔除已入库的箱子
foreach (var boxid in instockBoxList.Distinct().ToList())
{
var reBox = receiveBoxList.Where(x => x.BoxId == boxid).FirstOrDefault();
if (reBox != null)
remobox.Add(reBox);
}
}
if (remobox.Count != 0)
{
foreach (var item in remobox)
{
receiveBoxList.Remove(item);
}
}
return ResultList.ReSuccess(receiveBoxList);
}
///
/// 来源单-编号模糊查询-非采购上架使用-pad
///
///
///
[HttpPost]
[Route("GetSourceOrderNoPurchase")]
public async Task> GetSourceOrderNoPurchaseBy([FromBody] InStockTaskBillNoQueryRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return ResultList.ReFailure(ResultCodes.Token_Invalid_Error);
var list = await _inStockTaskRepositories.GetListInfoBy(dto);
//获取物料对应的仓位
var materialNumbers = list.SelectMany(x=>x.Details).GroupBy(x => x.MaterialNumber).Select(x => x.Key).ToList();
var stockCodes = list.SelectMany(x => x.Details).GroupBy(x => x.StockCode).Select(x => x.Key).ToList();
var orgCodes = list.SelectMany(x => x.Details).GroupBy(x => x.OrgCode).Select(x => x.Key).ToList();
var materialSubStocks = await _inventoryDetailsRepositories.GetMaterialSubStocks(materialNumbers, stockCodes, orgCodes, loginInfo.UserInfo.CompanyId);
list.SelectMany(x=>x.Details).ToList().ForEach(x =>
{
x.MaterialSubStocks = materialSubStocks.Where(t => t.MaterialNumber == x.MaterialNumber && t.StockCode==x.StockCode && t.OrgCode == x.OrgCode).Select(x => x.SubStock).ToList();
});
foreach(var l in list)
{
l.WaitShelfQty = l.Details.Sum(s => s.WaitShelfQty);
}
return ResultList.ReSuccess(list);
}
///
/// 校准-来源单-采购上架使用-对应金蝶-pad
///
///
///
[HttpGet]
[Route("Adjust/{sourceBillNo}")]
public async Task> Adjust([FromRoute] string sourceBillNo)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return ResultList.ReFailure(ResultCodes.Token_Invalid_Error);
//校准
var result= await _inStockTaskService.Adjust(sourceBillNo);
if(!result.IsSuccess)
return ResultList.ReFailure(result);
//再一次查询新的数据:并返回最后的结果
var request = new InStockTaskBillNoQueryRequest() { SourceBillNo = sourceBillNo };
var list = await _inStockTaskRepositories.GetListBy(request);
return ResultList.ReSuccess(list);
}
///
/// 校准-来源单-非采购上架使用-对应金蝶-pad
///
///
///
[HttpPost]
[Route("AdjustNoPurchase")]
public async Task> AdjustNoPurchaseBy([FromBody] InStockTaskBillNoQueryRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return ResultList.ReFailure(ResultCodes.Token_Invalid_Error);
//校准
var result = await _inStockTaskService.Adjust(dto.SourceBillNo);
if (!result.IsSuccess)
return ResultList.ReFailure(result);
//再一次查询新的数据:并返回最后的结果
var request = new InStockTaskBillNoQueryRequest() { SourceBillNo = dto.SourceBillNo,StockCode=dto.StockCode };
var list = await _inStockTaskRepositories.GetListInfoBy(request);
return ResultList.ReSuccess(list);
}
///
/// 采购订单物料明细和箱物料明细-对比-pad
///
///
///
[HttpPost]
[Route("Contrast")]
public async Task> Contrast([FromBody] ContrastMaterialsRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return Result.ReFailure(ResultCodes.Token_Invalid_Error);
var result = await _inStockService.Contrast(dto);
return result;
}
///
/// 入库任务单详情
///
///
///
[HttpGet]
[Route("GetInfo/{id}")]
public async Task> GetInfo([FromRoute] int id)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return Result.ReFailure(ResultCodes.Token_Invalid_Error);
var info= await _inStockTaskRepositories.GetInfo(id, loginInfo.UserInfo.CompanyId);
return Result.ReSuccess(info);
}
}
}