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.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 { /// /// 出库计划单 /// [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 option, IExportExcelService exportExcelServic, IInventoryDetailsRepositories inventoryDetailsRepositories) { _mapper = mapper; _loginService = loginService; _repositories = repositories; _outStockService = outStockService; _outStockTaskService = outStockTaskService; _option = option?.Value; _exportExcelService = exportExcelServic; _inventoryDetailsRepositories = inventoryDetailsRepositories; } /// /// 列表 /// /// /// [HttpPost] [Route("GetList")] public async Task> GetPagedList([FromBody] OutStockTaskQueryRequest 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, count) = await _repositories.GetListAsync(dto); var result = ResultPagedList.ReSuccess(list, count); return result; } /// /// 导出 /// /// /// [HttpPost] [Route("Export")] public Task> Export([FromBody] OutStockTaskQueryRequest 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.OutStockTask.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.OutStockTask); }); return Task.FromResult(Result.ReSuccess(res)); } /// /// 导出详情 /// /// /// [HttpPost] [Route("ExportInfo")] public Task> ExportInfo(OperateRequest 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.OutStockTaskInfo.GetRemark() + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx"; string res = _option.Url + fileName; Task.Run(async () => { //await _exportExcelService.ExportList(dto, fileName, loginInfo.UserInfo.StaffId, loginInfo.UserInfo.CompanyId, FileDownLoadOrderType.OutStockTask); await _outStockTaskService.ExportInfo(dto, fileName, loginInfo); }); return Task.FromResult(Result.ReSuccess(res)); } /// /// 作废 /// /// /// [HttpPost] [Route("Repeal")] public async Task 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); } /// /// 反作废 /// /// /// [HttpPost] [Route("NoRepeal")] public async Task 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); } /// /// 合并 /// /// /// [HttpPost] [Route("merge")] public async Task 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); } /// /// 根据出库单任务编号模糊搜索 /// /// /// [HttpGet] [Route("GetOutStockTaskListByNo")] public async Task> GetOutStockTaskListByNo([FromQuery] string billNo) { var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]); if (loginInfo == null || loginInfo.UserInfo == null) return ResultList.ReFailure(ResultCodes.Token_Invalid_Error); //List str = new List(); //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.ReFailure(ResultCodes.OutStockTaskNoData); return ResultList.ReSuccess(res); } /// /// 根据出库单任务编号模糊搜索下拉-PDA出库 /// /// /// [HttpPost] [Route("GetOutStockTaskNosByNo")] public async Task> GetOutStockTaskNosByNo([FromBody] GetOutStockTaskNosByNoRequest dto) { var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]); if (loginInfo == null || loginInfo.UserInfo == null) return ResultPagedList.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.ReFailure(ResultCodes.OutStockTaskNoData); return ResultPagedList.ReSuccess(res, total); } /// /// 根据出库单任务编号精确搜索(并且同步金蝶数据)-PDA出库 /// /// /// [HttpGet] [Route("GetOutStockTaskByNo")] public async Task> GetOutStockTaskByNo([FromQuery] string billNo) { var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]); if (loginInfo == null || loginInfo.UserInfo == null) return Result.ReFailure(ResultCodes.Token_Invalid_Error); //搜索之前同步金蝶数据(2024.03.02 取消同步最新) //await _outStockTaskService.Sync(new List() { billNo }); var res = await _repositories.GetOutStockTaskByNo(billNo); res.details = res.details.Where(w => w.AccruedQty > w.RealityQty).ToList(); if (res == null) return Result.ReFailure(ResultCodes.OutStockTaskNoData); //获取物料对应的仓位 var materialNumbers = res.details.GroupBy(x => x.MaterialNumber).Select(x => x.Key).ToList(); var stockCodes = new List() { res.StockCode }; var orgCodes = new List() { res.OrgCode }; var materialSubStocks = await _inventoryDetailsRepositories.GetMaterialSubStocks(materialNumbers, stockCodes, orgCodes, loginInfo.UserInfo.CompanyId); res.details.ForEach(x => { List rList = new List(); var slist = materialSubStocks.Where(t => t.MaterialNumber == x.MaterialNumber && t.StockCode == res.StockCode && t.OrgCode == res.OrgCode).Select(s => s.SubStock).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.ReSuccess(res); } /// /// 刷新金蝶数据 /// /// /// [HttpPost] [Route("Refresh")] public async Task 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(-3);//默认拉去三天以内的数据 var res = await _repositories.GetEntityList(dto.Ids); //先刷新选中的数据 await _outStockTaskService.Sync(res.Select(s => s.BillNo).ToList()); //再刷新3天内所有的 return await _outStockTaskService.Sync(null, begin); } /// /// 出库任务单详情 /// /// /// [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); return await _outStockTaskService.GetInfo(id, loginInfo); } /// /// 出库任务单详情(根据订单号搜索) /// /// /// [HttpGet] [Route("GetInfoByNo/{billNo}")] public async Task> GetInfoByNo([FromRoute] string billNo) { var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]); if (loginInfo == null || loginInfo.UserInfo == null) return Result.ReFailure(ResultCodes.Token_Invalid_Error); var entity = await _repositories.GetByBillNo(billNo); if (entity == null) return Result.ReFailure(ResultCodes.OutStockTaskNoData); return await _outStockTaskService.GetInfo(entity.Id, loginInfo); } } }