Files
WMS-Api/src/WMS.Web.Api/Controllers/OutStockTaskController.cs
2024-12-23 11:35:37 +08:00

344 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AutoMapper;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using WMS.Web.Core;
using WMS.Web.Core.Dto;
using WMS.Web.Core.Dto.OutStockTask;
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;
using WMS.Web.Repositories;
namespace WMS.Web.Api.Controllers
{
/// <summary>
/// 出库计划单
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class OutStockTaskController : ControllerBase
{
private readonly IMapper _mapper;
private readonly ILoginService _loginService;
private readonly IOutStockTaskRepositories _repositories;
private readonly IOutStockService _outStockService;
private readonly IOutStockTaskService _outStockTaskService;
private readonly QiniuOptions _option;
private readonly IExportExcelService _exportExcelService;
private readonly IInventoryDetailsRepositories _inventoryDetailsRepositories;
public OutStockTaskController(IMapper mapper, ILoginService loginService,
IOutStockTaskRepositories repositories, IOutStockService outStockService,
IOutStockTaskService outStockTaskService, IOptions<QiniuOptions> option, IExportExcelService exportExcelServic,
IInventoryDetailsRepositories inventoryDetailsRepositories)
{
_mapper = mapper;
_loginService = loginService;
_repositories = repositories;
_outStockService = outStockService;
_outStockTaskService = outStockTaskService;
_option = option?.Value;
_exportExcelService = exportExcelServic;
_inventoryDetailsRepositories = inventoryDetailsRepositories;
}
/// <summary>
/// 列表
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
[Route("GetList")]
public async Task<ResultPagedList<OutStockTaskQueryInfoResponse>> GetPagedList([FromBody] OutStockTaskQueryRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return ResultPagedList<OutStockTaskQueryInfoResponse>.ReFailure(ResultCodes.Token_Invalid_Error);
var (list, count) = await _repositories.GetListAsync(dto);
var result = ResultPagedList<OutStockTaskQueryInfoResponse>.ReSuccess(list, count);
return result;
}
/// <summary>
/// 导出
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
[Route("Export")]
public Task<Result<string>> Export([FromBody] OutStockTaskQueryRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null)
return Task.FromResult(Result<string>.ReFailure(ResultCodes.Token_Invalid_Error));
string fileName = FileDownLoadOrderType.OutStockTask.GetRemark() + loginInfo.UserInfo.CompanyId + DateTime.Now.DateTimeToLongTimeStamp() + ".xlsx";
string res = _option.Url + fileName;
Task.Run(async () =>
{
await _exportExcelService.ExportList<OutStockTaskQueryInfoResponse, OutStockTaskQueryRequest>(dto, fileName, loginInfo.UserInfo.StaffId, loginInfo.UserInfo.CompanyId, FileDownLoadOrderType.OutStockTask);
});
return Task.FromResult(Result<string>.ReSuccess(res));
}
/// <summary>
/// 导出详情
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
[Route("ExportInfo")]
public Task<Result<string>> ExportInfo(OperateRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null)
return Task.FromResult(Result<string>.ReFailure(ResultCodes.Token_Invalid_Error));
string fileName = FileDownLoadOrderType.OutStockTaskInfo.GetRemark() + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
string res = _option.Url + fileName;
Task.Run(async () =>
{
//await _exportExcelService.ExportList<OutStockTaskQueryInfoResponse, OutStockTaskQueryRequest>(dto, fileName, loginInfo.UserInfo.StaffId, loginInfo.UserInfo.CompanyId, FileDownLoadOrderType.OutStockTask);
await _outStockTaskService.ExportInfo(dto, fileName, loginInfo);
});
return Task.FromResult(Result<string>.ReSuccess(res));
}
/// <summary>
/// 作废
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
[Route("Repeal")]
public async Task<Result> Repeal(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 _outStockTaskService.Repeal(dto, loginInfo);
}
/// <summary>
/// 反作废
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
[Route("NoRepeal")]
public async Task<Result> NoRepeal(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 _outStockTaskService.NoRepeal(dto, loginInfo);
}
/// <summary>
/// 合并
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
[Route("merge")]
public async Task<Result> merge(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 _outStockTaskService.merge(dto, loginInfo);
}
/// <summary>
/// 根据出库单任务编号模糊搜索
/// </summary>
/// <param name="billNo"></param>
/// <returns></returns>
[HttpGet]
[Route("GetOutStockTaskListByNo")]
public async Task<ResultList<GetOutStockTaskByNoResponse>> GetOutStockTaskListByNo([FromQuery] string billNo)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return ResultList<GetOutStockTaskByNoResponse>.ReFailure(ResultCodes.Token_Invalid_Error);
//List<string> str = new List<string>();
//str.Add(billNo);
//var res2 = await _repositories.GetListBySourceBillNo(str);
var res = await _repositories.GetOutStockTaskListByNo(billNo);
//获取物料对应的仓位
var materialNumbers = res.SelectMany(s => s.details).GroupBy(x => x.MaterialNumber).Select(x => x.Key).ToList();
var stockCodes = res.Select(s => s.StockCode).ToList();
var orgCodes = res.Select(s => s.OrgCode).ToList();
var materialSubStocks = await _inventoryDetailsRepositories.GetMaterialSubStocks(materialNumbers, stockCodes, orgCodes, loginInfo.UserInfo.CompanyId);
foreach (var r in res)
{
r.details.ForEach(x =>
{
x.MaterialSubStocks = materialSubStocks.Where(t => t.MaterialNumber == x.MaterialNumber && t.StockCode == r.StockCode && t.OrgCode == r.OrgCode).Select(s => s.SubStock).ToList();
});
}
if (res == null || res.Count() == 0) return ResultList<GetOutStockTaskByNoResponse>.ReFailure(ResultCodes.OutStockTaskNoData);
return ResultList<GetOutStockTaskByNoResponse>.ReSuccess(res);
}
/// <summary>
/// 根据出库单任务编号模糊搜索下拉-PDA出库
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
[Route("GetOutStockTaskNosByNo")]
public async Task<ResultPagedList<string>> GetOutStockTaskNosByNo([FromBody] GetOutStockTaskNosByNoRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return ResultPagedList<string>.ReFailure(ResultCodes.Token_Invalid_Error);
var res = await _repositories.GetOutStockTaskNosByNo(dto.BillNo, dto.StockCode);
int total = res.Count();
res = res.OrderByDescending(o => o).Skip((dto.PageNo - 1) * dto.PageSize).Take(dto.PageSize).ToList();
if (res == null || res.Count() == 0) return ResultPagedList<string>.ReFailure(ResultCodes.OutStockTaskNoData);
return ResultPagedList<string>.ReSuccess(res, total);
}
/// <summary>
/// 根据出库单任务编号模糊搜索下拉-PDA出库箱信息查询
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
[Route("GetOutStockTaskNosByNoBox")]
public async Task<ResultPagedList<string>> GetOutStockTaskNosByNoBox([FromBody] GetOutStockTaskNosByNoRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return ResultPagedList<string>.ReFailure(ResultCodes.Token_Invalid_Error);
var res = await _repositories.GetOutStockTaskNosByNoBox(dto.BillNo, dto.StockCode);
int total = res.Count();
res = res.OrderByDescending(o => o).Skip((dto.PageNo - 1) * dto.PageSize).Take(dto.PageSize).ToList();
if (res == null || res.Count() == 0) return ResultPagedList<string>.ReFailure(ResultCodes.OutStockTaskNoData);
return ResultPagedList<string>.ReSuccess(res, total);
}
/// <summary>
/// 根据出库单任务编号精确搜索(并且同步金蝶数据)-PDA出库
/// </summary>
/// <param name="billNo"></param>
/// <returns></returns>
[HttpGet]
[Route("GetOutStockTaskByNo")]
public async Task<Result<GetOutStockTaskByNoResponse>> GetOutStockTaskByNo([FromQuery] string billNo)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return Result<GetOutStockTaskByNoResponse>.ReFailure(ResultCodes.Token_Invalid_Error);
//搜索之前同步金蝶数据(2024.03.02 取消同步最新)
//await _outStockTaskService.Sync(new List<string>() { billNo });
var res = await _repositories.GetOutStockTaskByNo(billNo);
res.details = res.details.Where(w => w.AccruedQty > w.RealityQty).ToList();
if (res == null) return Result<GetOutStockTaskByNoResponse>.ReFailure(ResultCodes.OutStockTaskNoData);
//获取物料对应的仓位
var materialNumbers = res.details.GroupBy(x => x.MaterialNumber).Select(x => x.Key).ToList();
var stockCodes = new List<string>() { res.StockCode };
var orgCodes = new List<string>() { res.OrgCode };
var materialSubStocks = await _inventoryDetailsRepositories.GetMaterialSubStocks(materialNumbers, stockCodes, orgCodes, loginInfo.UserInfo.CompanyId);
res.details.ForEach(x =>
{
List<GetOutStockTaskByNoSubStockResponse> rList = new List<GetOutStockTaskByNoSubStockResponse>();
var slist = materialSubStocks.Where(t => t.MaterialNumber == x.MaterialNumber && t.StockCode == res.StockCode && t.OrgCode == res.OrgCode).Select(s => s.SubStock).ToList();
slist = slist.Where(w => !string.IsNullOrEmpty(w)).ToList();
slist.ForEach(f => rList.Add(new GetOutStockTaskByNoSubStockResponse(f)));
x.MaterialSubStocks = rList.OrderBy(s => s.SubStock_Do).Select(s => s.SubStock).ToList();
if (rList.Count() > 0)
x.FistSubStock = rList.OrderBy(s => s.SubStock_Do).First().SubStock_Do;
else
x.FistSubStock = "z";
});
res.details = res.details.OrderBy(s => s.FistSubStock).ToList();
return Result<GetOutStockTaskByNoResponse>.ReSuccess(res);
}
/// <summary>
/// 刷新金蝶数据
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
[Route("Refresh")]
public async Task<Result> Refresh(OperateRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return Result.ReFailure(ResultCodes.Token_Invalid_Error);
DateTime begin = DateTime.Now.AddDays(-9);//默认拉去三天以内的数据刷新改成过去8天的数据本身为3天Alter by yzh
var res = await _repositories.GetEntityList(dto.Ids);
//先刷新选中的数据
await _outStockTaskService.Sync(res.Select(s => s.BillNo).ToList());
//再刷新3天内所有的
return await _outStockTaskService.Sync(null, begin);
}
/// <summary>
/// 出库任务单详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
[Route("GetInfo/{id}")]
public async Task<Result<OutStockTaskInfoResponse>> GetInfo([FromRoute] int id)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return Result<OutStockTaskInfoResponse>.ReFailure(ResultCodes.Token_Invalid_Error);
return await _outStockTaskService.GetInfo(id, loginInfo);
}
/// <summary>
/// 出库任务单详情(根据订单号搜索)
/// </summary>
/// <param name="billNo"></param>
/// <returns></returns>
[HttpPost]
[Route("GetInfoByNo")]
public async Task<Result<OutStockTaskInfoResponse>> GetInfoByNo([FromBody] OutStockTaskInfoRequest dto)
{
var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]);
if (loginInfo == null || loginInfo.UserInfo == null)
return Result<OutStockTaskInfoResponse>.ReFailure(ResultCodes.Token_Invalid_Error);
var entity = await _repositories.GetByBillNo(dto.BillNo);
if (entity == null)
return Result<OutStockTaskInfoResponse>.ReFailure(ResultCodes.OutStockTaskNoData);
var response = await _outStockTaskService.GetInfo(entity.Id, loginInfo);
response.Data.Details = response.Data.Details.Skip((dto.PageNo - 1) * dto.PageSize).Take(dto.PageSize).ToList();
return response;
}
}
}