Files
WMS-Api/src/WMS.Web.Domain/Services/OutStockTaskService.cs
18942506660 fb95cccae2 调整接口
2024-06-14 09:31:34 +08:00

625 lines
31 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.EntityFrameworkCore.Storage;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WMS.Web.Core;
using WMS.Web.Core.Dto;
using WMS.Web.Core.Dto.Erp;
using WMS.Web.Core.Dto.Erp.Customer;
using WMS.Web.Core.Dto.Erp.Org;
using WMS.Web.Core.Dto.Erp.OutStock;
using WMS.Web.Core.Dto.Login;
using WMS.Web.Core.Dto.OutStockTask;
using WMS.Web.Core.Help;
using WMS.Web.Core.Internal.Results;
using WMS.Web.Domain.Entitys;
using WMS.Web.Domain.Infrastructure;
using WMS.Web.Domain.IService;
using WMS.Web.Domain.IService.Public;
using WMS.Web.Domain.Services.Public;
using WMS.Web.Domain.Values;
using WMS.Web.Domain.Values.Single;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace WMS.Web.Domain.Services
{
/// <summary>
/// 出库任务
/// </summary>
public class OutStockTaskService : IOutStockTaskService
{
private readonly IMapper _mapper;
private IErpService _erpService;
private readonly ILoginService _loginService;
private readonly IBasicsRepositories _transactionRepositories;
private IOutStockRepositories _outStockRepositories;
private IOutStockTaskRepositories _outStockTaskRepositories;
private readonly IErpOpsSyncDateRepositories _erpOpsSyncDateRepositories;
private readonly RedisClientService _redisClientService;
private readonly IErpBasicDataExtendService _erpBasicDataExtendService;
private readonly ISingleDataService _singleDataService;
private IBoxRepositories _boxRepositories;
private readonly IExportExcelService _exportExcelService;
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly ILogger<OutStockTaskService> _logger;
public OutStockTaskService(IMapper mapper, IErpService erpService, ILoginService loginService,
IBasicsRepositories transactionRepositories,
IOutStockRepositories outStockRepositories, IOutStockTaskRepositories outStockTaskRepositories, IErpOpsSyncDateRepositories erpOpsSyncDateRepositories,
RedisClientService redisClientService, IErpBasicDataExtendService erpBasicDataExtendService,
ISingleDataService singleDataService, IBoxRepositories boxRepositories, IExportExcelService exportExcelService, IServiceScopeFactory serviceScopeFactory,
ILogger<OutStockTaskService> logger)
{
_mapper = mapper;
_erpService = erpService;
_loginService = loginService;
_transactionRepositories = transactionRepositories;
_outStockRepositories = outStockRepositories;
_outStockTaskRepositories = outStockTaskRepositories;
_erpOpsSyncDateRepositories = erpOpsSyncDateRepositories;
_redisClientService = redisClientService;
_erpBasicDataExtendService = erpBasicDataExtendService;
_singleDataService = singleDataService;
_boxRepositories = boxRepositories;
_exportExcelService = exportExcelService;
_serviceScopeFactory = serviceScopeFactory;
_logger = logger;
}
/// <summary>
/// 出库任务作废
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<Result> Repeal(OperateRequest dto, LoginInDto loginInfo)
{
var list = await _outStockTaskRepositories.GetEntityListByDetailIds(dto.Ids);
foreach (var entity in list)
{
List<int> e_ids = entity.Details.Select(s => s.Id).ToList();
var j_ids = e_ids.Intersect(dto.Ids).ToList();
//作废
entity.Repeal(loginInfo.UserInfo.StaffId, j_ids);
}
var isSuccess = await _outStockTaskRepositories.EditEntityList(list, true);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
return Result.ReSuccess();
}
/// <summary>
/// 反作废
/// </summary>
/// <param name="dto"></param>
/// <param name="loginInfo"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public Task<Result> NoRepeal(OperateRequest dto, LoginInDto loginInfo)
{
throw new NotImplementedException();
}
/// <summary>
/// 出库任务合并
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<Result> merge(OperateRequest dto, LoginInDto loginInfo)
{
var list = await _outStockTaskRepositories.GetEntityList(dto.Ids);
// 2:符合合并数据逻辑:出库状态为”待拣货”+出库类型为:销售出库+发货组织一致+收货客户一致+发货仓库一致
OutStockTask entity = new OutStockTask();
var res = entity.Merge(list, loginInfo.UserInfo.StaffId);
if (!res.IsSuccess) return res;
IDbContextTransaction _transaction = _transactionRepositories.GetTransaction();
bool isRollback = false;
bool isSuccess = true;
entity = await _outStockTaskRepositories.Add(entity, false);
if (entity == null) isRollback = true;
isSuccess = await _outStockTaskRepositories.DeleteEntityList(list.Select(s => s.Id).ToList(), false);
if (isSuccess == false) isRollback = true;
//提交事务
isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction);
if (!isSuccess)
return Result.ReFailure(ResultCodes.DateWriteError);
return Result.ReSuccess();
}
/// <summary>
/// erp数据转化wms 执行数据库操作
/// </summary>
/// <param name="erp_list"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> SsynDate(List<ErpDeliveryNoticeOutStockResultDto> erp_list, bool isTransaction)
{
if (erp_list.Count() <= 0) return Result.ReSuccess();
_logger.LogInformation($"获取到金蝶出库任务单数据:{JsonConvert.SerializeObject(erp_list)}");
//2.通过单据编号找到wms系统现有的任务单并修改
var erp_removeList = new List<ErpDeliveryNoticeOutStockResultDto>();
var SourceBillNo_list = erp_list.GroupBy(x => x.SourceBillNo).Select(x => x.Key).ToList();
var data_list = await _outStockTaskRepositories.GetListBySourceBillNo(SourceBillNo_list);
List<int> update_ids = new List<int>();
if (data_list.Count != 0)
{
//2.1提取出wms任务单明细信息
foreach (var outStockTask in data_list)
{
bool isUpdate = false;
var sourcNos = outStockTask.Details.SelectMany(s => s.ErpDetails).Select(s => s.SourceBillNo).ToList();
//仓库不同 拆分成不同的任务单
var erps = erp_list.Where(w => sourcNos.Contains(w.SourceBillNo) && w.StockCode.Equals(outStockTask.StockCode)).ToList();
//比对数据
isUpdate = SsynDateComparison(outStockTask, erps);
foreach (var erp in erps)
{
//仓库不同 拆分成不同的
var detail = outStockTask.Details.FirstOrDefault(w => w.MaterialNumber == erp.MaterialNumber);
if (detail == null)
{
//添加一条物料明细
detail = _mapper.Map<OutStockTaskDetails>(erp);
var erpDetail = _mapper.Map<OutStockTaskErpDetails>(erp);
detail.ErpDetails.Add(erpDetail);
outStockTask.Details.Add(detail);
isUpdate = true;
}
else
{
//找到物料明细下面对应的金蝶明细Id 然后修改(跟金蝶明细一一对应)
var erpDetail = detail.ErpDetails.FirstOrDefault(f => f.Erp_DetailId == erp.Erp_DetailId);
if (erpDetail == null)
{
erpDetail = _mapper.Map<OutStockTaskErpDetails>(erp);
detail.ErpDetails.Add(erpDetail);
isUpdate = true;
}
else
{
if (erpDetail.AccruedQty != erp.AccruedQty)
{
isUpdate = true;
erpDetail.AccruedQty = erp.AccruedQty;
}
}
detail.AccruedQty = detail.ErpDetails.Sum(s => s.AccruedQty);
}
//操作完后剔除
erp_removeList.Add(erp);
}
if (isUpdate)
update_ids.Add(outStockTask.Id);
//执行完后重新计算一下状态
outStockTask.GenerateStatus();
}
}
var update_date_list = data_list.Where(w => update_ids.Contains(w.Id)).ToList();
//2.2.提交修改
var isSuccess = await _outStockTaskRepositories.EditEntityList(update_date_list, isTransaction);
if (!isSuccess)
return Result.ReFailure(ResultCodes.DateWriteError);
//2.3剔除:已修改的单据
foreach (var item in erp_removeList)
erp_list.Remove(item);
//3.wms任务单的来源单据编号不存在于erp中那么就新增
if (erp_list.Count != 0)
{
var add_entitys = new List<OutStockTask>();
//根据来源订单号和仓库分组 一个来源订单号和一个仓库 对应一个任务单
var billNos = erp_list.GroupBy(x => (x.SourceBillNo, x.StockCode)).Select(x => x.Key).ToList();
foreach (var item in billNos)
{
var eList = erp_list.Where(f => f.SourceBillNo == item.SourceBillNo && f.StockCode == item.StockCode).ToList();
var e = eList.First();
var entity = new OutStockTask();
entity.Create((OutStockType)e.Type, e.StockCode, e.OrgCode, e.DeliveryOrgId, e.ReceiptCustomerId, (DateTime)e.CreateTime);
//找到当前对应来源单据编号的集合数据
var mIds = eList.GroupBy(g => g.MaterialNumber).Select(s => s.Key).ToList();
//给到dto的实体明细中
foreach (var mid in mIds)
{
var emList = eList.Where(w => w.MaterialNumber == mid).ToList();
var detail = _mapper.Map<OutStockTaskDetails>(emList.First());
var erpDetail = _mapper.Map<List<OutStockTaskErpDetails>>(emList);
detail.ErpDetails.AddRange(erpDetail);
detail.AccruedQty = detail.ErpDetails.Sum(s => s.AccruedQty);
entity.Details.Add(detail);
}
add_entitys.Add(entity);
}
//3.1提交新增
isSuccess = await _outStockTaskRepositories.AddRange(add_entitys, isTransaction);
if (!isSuccess)
return Result.ReFailure(ResultCodes.DateWriteError);
}
return Result.ReSuccess();
}
/// <summary>
/// 金蝶数据同步时比对数据
/// 金蝶单据明细行删除后wms明细数量调整为0
/// </summary>
/// <returns></returns>
public bool SsynDateComparison(OutStockTask outStockTask, List<ErpDeliveryNoticeOutStockResultDto> erp_list)
{
bool isUpdate = false;
var erpDetails = outStockTask.Details.SelectMany(s => s.ErpDetails).ToList().Clone();
foreach (var d in outStockTask.Details)
{
foreach (var ed in d.ErpDetails)
{
//没有找到这条出库任务单里的来源单信息,则跳过这条数据(有些合并的单据,当前没有找到金蝶对应的单据(时间超出范围了等情况))
var erp_o = erp_list.Where(w => w.SourceBillNo == ed.SourceBillNo).ToList();
if (erp_o.Count() == 0) continue;
var erp_d = erp_list.Where(w => w.MaterialNumber == d.MaterialNumber && ed.Erp_DetailId == w.Erp_DetailId).ToList();
if (erp_d.Count() == 0)
{
//金蝶删除明细数据后 wms对应数据修改为0
ed.AccruedQty = 0;
d.AccruedQty = d.ErpDetails.Sum(s => s.AccruedQty);
isUpdate = true;
}
}
}
return isUpdate;
}
/// <summary>
/// 发货通知单同步数据
/// </summary>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> BillQueryForDeliveryNoticeOutStock(bool isTransaction, List<string> sourceBillNos = null, DateTime? beginTime = null)
{
//1.获取金蝶数据:采购订单数据
var erp_result = await _erpService.BillQueryForDeliveryNoticeOutStock(sourceBillNos, beginTime);
if (!erp_result.IsSuccess)
return Result.ReFailure(erp_result.Message, erp_result.Status);
return await this.SsynDate(erp_result.Data.ToList(), isTransaction);
}
/// <summary>
/// 直接调拨
/// </summary>
/// <param name="isTransaction"></param>
/// <param name="sourceBillNos"></param>
/// <returns></returns>
public async Task<Result> BillQueryForTransferDirectOutStock(bool isTransaction, List<string> sourceBillNos = null, DateTime? beginTime = null)
{
var erp_result = await _erpService.BillQueryForTransferDirectOutStock(sourceBillNos, beginTime);
if (!erp_result.IsSuccess)
return Result.ReFailure(erp_result.Message, erp_result.Status);
return await this.SsynDate(erp_result.Data.ToList(), isTransaction);
}
/// <summary>
/// 分布式调出
/// </summary>
/// <param name="isTransaction"></param>
/// <param name="sourceBillNos"></param>
/// <returns></returns>
public async Task<Result> BillQueryForTransferOutOutStock(bool isTransaction, List<string> sourceBillNos = null, DateTime? beginTime = null)
{
var erp_result = await _erpService.BillQueryForTransferOutOutStock(sourceBillNos, beginTime);
if (!erp_result.IsSuccess)
return Result.ReFailure(erp_result.Message, erp_result.Status);
return await this.SsynDate(erp_result.Data.ToList(), isTransaction);
}
/// <summary>
/// 组装拆卸单
/// </summary>
/// <param name="isTransaction"></param>
/// <param name="sourceBillNos"></param>
/// <returns></returns>
public async Task<Result> BillQueryForAssembledAppOutStock(bool isTransaction, List<string> sourceBillNos = null, DateTime? beginTime = null)
{
List<ErpDeliveryNoticeOutStockResultDto> list = new List<ErpDeliveryNoticeOutStockResultDto>();
var erp_result = await _erpService.BillQueryForAssembledAppOutStock_Dassembly(sourceBillNos, beginTime);
if (!erp_result.IsSuccess)
return Result.ReFailure(erp_result.Message, erp_result.Status);
list.AddRange(erp_result.Data);
var erp_result_a = await _erpService.BillQueryForAssembledAppOutStock_Assembly(sourceBillNos, beginTime);
if (!erp_result_a.IsSuccess)
return Result.ReFailure(erp_result_a.Message, erp_result_a.Status);
list.AddRange(erp_result_a.Data);
return await this.SsynDate(list, isTransaction);
}
/// <summary>
/// 其他入库单
/// </summary>
/// <param name="isTransaction"></param>
/// <param name="sourceBillNos"></param>
/// <returns></returns>
public async Task<Result> BillQueryForMisDeliveryOutStock(bool isTransaction, List<string> sourceBillNos = null, DateTime? beginTime = null)
{
var erp_result = await _erpService.BillQueryForMisDeliveryOutStock(sourceBillNos, beginTime);
if (!erp_result.IsSuccess)
return Result.ReFailure(erp_result.Message, erp_result.Status);
return await this.SsynDate(erp_result.Data.ToList(), isTransaction);
}
/// <summary>
/// 销售出库单
/// </summary>
/// <param name="isTransaction"></param>
/// <param name="sourceBillNos"></param>
/// <param name="beginTime"></param>
/// <returns></returns>
public async Task<Result> BillQueryForSalOutStock(bool isTransaction, List<string> sourceBillNos = null, DateTime? beginTime = null)
{
var erp_result = await _erpService.BillQueryForSalOutStock(sourceBillNos, beginTime);
if (!erp_result.IsSuccess)
return Result.ReFailure(erp_result.Message, erp_result.Status);
return await this.SsynDate(erp_result.Data.ToList(), isTransaction);
}
/// <summary>
/// 同步金蝶数据 不传源订单号则更新所有
/// </summary>
/// <param name="sourceBillNos"></param>
/// <returns></returns>
public async Task<Result> Sync(List<string> billNos = null, DateTime? begin = null)
{
var info = _redisClientService.GetStringKey<bool>($"wms_outstock_sync");
if (info == true) return Result.ReFailure(ResultCodes.ErpSyns);
_redisClientService.SetStringKey($"wms_outstock_sync", true, TimeSpan.FromMinutes(5));
//1.事务
IDbContextTransaction _transaction = _transactionRepositories.GetTransaction();
bool isRollback = false;
bool isSuccess = true;
Result result;
//定时任务更新
if (billNos == null)
{
//DateTime begin = await _erpOpsSyncDateRepositories.Get(ErpOpsSyncType.OutStock);
if (begin == null)
begin = DateTime.Now.AddHours(-8);//默认拉去8小时以内的数据
//更新时间范围内所有
result = await BillQueryForSalOutStock(false, null, begin);
if (!result.IsSuccess) isRollback = true;
result = await BillQueryForTransferDirectOutStock(false, null, begin);
if (!result.IsSuccess) isRollback = true;
result = await BillQueryForTransferOutOutStock(false, null, begin);
if (!result.IsSuccess) isRollback = true;
result = await BillQueryForAssembledAppOutStock(false, null, begin);
if (!result.IsSuccess) isRollback = true;
result = await BillQueryForMisDeliveryOutStock(false, null, begin);
if (!result.IsSuccess) isRollback = true;
//更新时间管理
//isSuccess = await _erpOpsSyncDateRepositories.Edit(ErpOpsSyncType.OutStock, false);
//if (!isSuccess) isRollback = true;
//4.提交事务
isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction);
_redisClientService.SetStringKey($"wms_outstock_sync", false, TimeSpan.FromMinutes(5));
if (!isSuccess)
return Result.ReFailure(ResultCodes.DateWriteError);
return Result.ReSuccess();
}
//根据指定单号更新
List<string> SalOutStock_Nos = new List<string>();
List<string> TransferDirect_Nos = new List<string>();
List<string> TransferOut_Nos = new List<string>();
List<string> AssembledApp_Nos = new List<string>();
List<string> MisDeliveryOut_Nos = new List<string>();
var taskList = await _outStockTaskRepositories.GetListByBillNo(billNos);
foreach (var entity in taskList)
{
if (entity.Type == OutStockType.Sal)
SalOutStock_Nos.AddRange(entity.Details.SelectMany(s => s.ErpDetails).Select(s => s.SourceBillNo));
else if (entity.Type == OutStockType.Stkdirecttransfers)
TransferDirect_Nos.AddRange(entity.Details.SelectMany(s => s.ErpDetails).Select(s => s.SourceBillNo));
else if (entity.Type == OutStockType.StktransferInst)
TransferOut_Nos.AddRange(entity.Details.SelectMany(s => s.ErpDetails).Select(s => s.SourceBillNo));
else if (entity.Type == OutStockType.Assembled)
AssembledApp_Nos.AddRange(entity.Details.SelectMany(s => s.ErpDetails).Select(s => s.SourceBillNo));
else if (entity.Type == OutStockType.Miscellaneous)
MisDeliveryOut_Nos.AddRange(entity.Details.SelectMany(s => s.ErpDetails).Select(s => s.SourceBillNo));
}
if (SalOutStock_Nos.Count() > 0)
{
result = await BillQueryForSalOutStock(false, SalOutStock_Nos);
if (!result.IsSuccess) isRollback = true;
}
if (TransferDirect_Nos.Count() > 0)
{
result = await BillQueryForTransferDirectOutStock(false, TransferDirect_Nos);
if (!result.IsSuccess) isRollback = true;
}
if (TransferOut_Nos.Count() > 0)
{
result = await BillQueryForTransferOutOutStock(false, TransferOut_Nos);
if (!result.IsSuccess) isRollback = true;
}
if (AssembledApp_Nos.Count() > 0)
{
result = await BillQueryForAssembledAppOutStock(false, AssembledApp_Nos);
if (!result.IsSuccess) isRollback = true;
}
if (MisDeliveryOut_Nos.Count() > 0)
{
result = await BillQueryForMisDeliveryOutStock(false, MisDeliveryOut_Nos);
if (!result.IsSuccess) isRollback = true;
}
//4.提交事务
isSuccess = _transactionRepositories.CommitTransaction(isRollback, _transaction);
_redisClientService.SetStringKey($"wms_outstock_sync", false, TimeSpan.FromMinutes(5));
if (!isSuccess)
return Result.ReFailure(ResultCodes.DateWriteError);
return Result.ReSuccess();
}
/// <summary>
/// 获取出库任务单详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<Result<OutStockTaskInfoResponse>> GetInfo(int id, LoginInDto loginInfo, IServiceScope scope = null)
{
if (scope != null)
{
_outStockTaskRepositories = scope.ServiceProvider.GetRequiredService<IOutStockTaskRepositories>();
_outStockRepositories = scope.ServiceProvider.GetRequiredService<IOutStockRepositories>();
_erpService = scope.ServiceProvider.GetRequiredService<IErpService>();
_boxRepositories = scope.ServiceProvider.GetRequiredService<IBoxRepositories>();
}
var entity = await _outStockTaskRepositories.Get(id);
if (entity == null)
return Result<OutStockTaskInfoResponse>.ReFailure(ResultCodes.OutStockTaskNoData);
//获取任务单对应出库信息
var outStockList = await _outStockRepositories.GetByTaskId(id);
//取组织
var org_result = await _erpService.BillQueryForOrg();
List<ErpOrgDto> orgs = new List<ErpOrgDto>();
if (org_result.IsSuccess)
orgs = org_result.Data.ToList();
//取客户
var customer_result = await _erpService.BillQueryForCustomer();
List<ErpCustomerDto> customers = new List<ErpCustomerDto>();
if (customer_result.IsSuccess)
customers = customer_result.Data.ToList();
var materials_result = await _erpService.BillQueryForMaterial();
List<ErpMaterialDto> materials = new List<ErpMaterialDto>();
if (materials_result.IsSuccess)
materials = materials_result.Data.ToList();
OutStockTaskInfoResponse response = new OutStockTaskInfoResponse()
{
Id = entity.Id,
BillNo = entity.BillNo,
SourceBillNo = string.Join(",", entity.Details.SelectMany(s => s.ErpDetails).Select(s => s.SourceBillNo).Distinct()),
SaleBillNo = string.Join(",", entity.Details.SelectMany(s => s.ErpDetails).Select(s => s.SaleBillNo).Distinct()),
CreateTime = entity.CreateTime.DateToStringSeconds(),
Status = entity.Status.GetRemark(),
Type = entity.Type.GetRemark(),
DeliveryOrg = _erpBasicDataExtendService.GetOrgName(orgs, entity.DeliveryOrgId),
ReceiptCustomer = entity.Type == OutStockType.Sal
? _erpBasicDataExtendService.GetCustomerName(customers, entity.ReceiptCustomerId)
: _erpBasicDataExtendService.GetOrgName(orgs, entity.DeliveryOrgId),
};
var details = outStockList.SelectMany(s => s.Details).ToList();
var boxDetails = outStockList.SelectMany(s => s.Details).SelectMany(s => s.BoxsDetails).ToList();
var boxList = await _boxRepositories.GetEntityList(boxDetails.Select(s => s.BoxId).ToList());
foreach (var b in boxDetails)
{
var detail = details.FirstOrDefault(f => f.Id == b.DetailId);
var outStock = outStockList.FirstOrDefault(f => f.Id == detail.Fid);
var m = materials.FirstOrDefault(f => f.MaterialNumber.Equals(detail.MaterialNumber));
OutStockTaskInfoDetailsResponse infoDetail = new OutStockTaskInfoDetailsResponse()
{
BoxBillNo = boxList.FirstOrDefault(f => f.Id == b.BoxId)?.BoxBillNo ?? "",
Qty = b.Qty,
SerialNumbers = string.Join(",", b.SerialNumbers),
SerialNumberList = b.SerialNumbers,
Method = outStock.Method.GetRemark(),
Creator = _singleDataService.GetSingleData(SingleAction.Staffs, loginInfo.UserInfo.CompanyId, outStock.CreatorId),
CreateTime = outStock.CreateTime.DateToStringSeconds(),
MaterialNumber = detail.MaterialNumber,
Specifications = m?.Specifications ?? "",
BarCode = m?.BarCode ?? "",
MaterialName = m?.MaterialName ?? "",
AccruedQty = entity.Details.FirstOrDefault(f => f.MaterialNumber == detail.MaterialNumber)?.AccruedQty ?? 0
};
response.Details.Add(infoDetail);
}
return Result<OutStockTaskInfoResponse>.ReSuccess(response);
}
/// <summary>
/// 导出详情
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task ExportInfo(OperateRequest dto, string fileName, LoginInDto loginInfo)
{
try
{
var ids = dto.Ids.Distinct().ToList();
using (var scope = _serviceScopeFactory.CreateScope())
{
List<ExportInfoResponse> list = new List<ExportInfoResponse>();
foreach (var id in ids)
{
var info = await this.GetInfo(id, loginInfo, scope);
if (!info.IsSuccess) continue;
var response = info.Data;
foreach (var d in response.Details)
{
if (d.SerialNumberList == null || d.SerialNumberList.Count() <= 0)
{
list.Add(new ExportInfoResponse()
{
SourceBillNo = response.SourceBillNo,
SaleBillNo = response.SaleBillNo,
ReceiptCustomer = response.ReceiptCustomer,
CreateTime = d.CreateTime,
BoxBillNo = d.BoxBillNo,
Specifications = d.Specifications,
MaterialName = d.MaterialName,
MaterialNumber = d.MaterialNumber,
BarCode = d.BarCode,
SerialNumbers = ""
});
}
else
{
foreach (var s in d.SerialNumberList)
{
list.Add(new ExportInfoResponse()
{
SourceBillNo = response.SourceBillNo,
SaleBillNo = response.SaleBillNo,
ReceiptCustomer = response.ReceiptCustomer,
CreateTime = d.CreateTime,
BoxBillNo = d.BoxBillNo,
Specifications = d.Specifications,
MaterialName = d.MaterialName,
MaterialNumber = d.MaterialNumber,
BarCode = d.BarCode,
SerialNumbers = s
});
}
}
}
}
var _exportExcelService = scope.ServiceProvider.GetRequiredService<IExportExcelService>();
await _exportExcelService.Export(list, fileName, loginInfo.UserInfo.StaffId, loginInfo.UserInfo.CompanyId, FileDownLoadOrderType.OutStockTaskInfo);
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}