Files
WMS-Api/src/WMS.Web.Domain/Services/InStockTaskService.cs
2023-11-11 15:55:29 +08:00

360 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.EntityFrameworkCore.Storage;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WMS.Web.Core.Dto.Erp;
using WMS.Web.Core.Dto.Erp.Purchase;
using WMS.Web.Core.Dto.InStockTask;
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.Values;
namespace WMS.Web.Domain.Services
{
/// <summary>
/// 入库任务单-服务
/// </summary>
public class InStockTaskService : IInStockTaskService
{
private readonly IMapper _mapper;
private readonly IErpService _erpService;
private readonly ILoginService _loginService;
private readonly IBasicsRepositories _basicsRepositories;
private readonly IInStockRepositories _inStockRepositories;
private readonly IInStockTaskRepositories _inStockTaskRepositories;
public InStockTaskService(IMapper mapper, IErpService erpService, ILoginService loginService,
IBasicsRepositories basicsRepositories,
IInStockRepositories inStockRepositories, IInStockTaskRepositories inStockTaskRepositories)
{
_mapper = mapper;
_erpService = erpService;
_loginService = loginService;
_basicsRepositories = basicsRepositories;
_inStockRepositories = inStockRepositories;
_inStockTaskRepositories = inStockTaskRepositories;
}
/// <summary>
/// 来源单-与金蝶校准-第二步-pad这个只针对采购订单
/// </summary>
/// <param name="sourceBillNo"></param>
/// <returns></returns>
public async Task<ResultList<SourceBillNoQueryResponse>> Adjust(string sourceBillNo)
{
//1.事务
IDbContextTransaction _transaction = _basicsRepositories.GetTransaction();
bool isRollback = false;
bool isTransaction = false;
//2.查看是否有入库任务单
var task = await _inStockTaskRepositories.GetBySource(sourceBillNo);
if (task == null)
return ResultList<SourceBillNoQueryResponse>.ReFailure(ResultCodes.OrderNoData);
//3.有的话就同步一下金蝶的数据
var billNos = new List<string>();
billNos.Add(sourceBillNo);
//3.1采购订单类型-进去金蝶交互更新
if (task.Type == InstockType.Purchase)
{
var result = await this.SsynPurchaseInStock(billNos, isTransaction);
if (!result.IsSuccess) isRollback = true;
}
//4.提交事务
var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction);
if (!isSuccess)
return ResultList<SourceBillNoQueryResponse>.ReFailure(ResultCodes.AdjustError);
//5.再一次查询新的数据:并返回最后的结果
var request = new InStockTaskBillNoQueryRequest() { SourceBillNo = sourceBillNo };
var list = await _inStockTaskRepositories.GetListBy(request);
return ResultList<SourceBillNoQueryResponse>.ReSuccess(list);
}
/// <summary>
/// 来源单-与金蝶校准-第二步-pad这个是非采购订单上架使用
/// </summary>
/// <param name="sourceBillNo"></param>
/// <returns></returns>
public async Task<ResultList<SourceBillNoNoPurchaseQueryResponse>> AdjustNoPurchase(string sourceBillNo)
{
//1.事务
IDbContextTransaction _transaction = _basicsRepositories.GetTransaction();
bool isRollback = false;
bool isTransaction = false;
//2.查看是否有入库任务单
var task = await _inStockTaskRepositories.GetBySource(sourceBillNo);
if (task == null)
return ResultList<SourceBillNoNoPurchaseQueryResponse>.ReFailure(ResultCodes.OrderNoData);
//3.有的话就同步一下金蝶的数据
var billNos = new List<string>();
billNos.Add(sourceBillNo);
//3.1这里要对入库任务单的类型逐一判断进行去ErpService找对应的单据类型重新获取这里只有采购后面再加其它的
if (task.Type == InstockType.Miscellaneous)
{
var result = await this.SysnMiscellaneous(billNos, isTransaction);
if (!result.IsSuccess) isRollback = true;
}
else if (task.Type == InstockType.Assembled)
{
}
else if (task.Type == InstockType.Stkdirecttransfers)
{
}
else if (task.Type == InstockType.StktransferInst)
{
}
//4.提交事务
var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction);
if (!isSuccess)
return ResultList<SourceBillNoNoPurchaseQueryResponse>.ReFailure(ResultCodes.AdjustError);
//5.再一次查询新的数据:并返回最后的结果
var request = new InStockTaskBillNoQueryRequest() { SourceBillNo = sourceBillNo };
var list = await _inStockTaskRepositories.GetListInfoBy(request);
return ResultList<SourceBillNoNoPurchaseQueryResponse>.ReSuccess(list);
}
/// <summary>
/// 同步:采购入库类型单据
/// </summary>
/// <param name="billNos"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> SsynPurchaseInStock(List<string> billNos = null, bool isTransaction = true)
{
//1.获取金蝶数据:采购订单数据
var erp_result = await _erpService.BillQueryForPurchaseInStock(billNos);
if (!erp_result.IsSuccess)
return Result.ReFailure(erp_result.Message, erp_result.Status);
var erp_list = erp_result.Data;
//2.通过单据编号找到wms系统现有的任务单并修改
var erp_removeList = new List<ErpPurchaseInStockResultDto>();
var SourceBillNo_list = erp_list.GroupBy(x => x.FBillNo).Select(x => x.Key).ToList();
var data_list = await _inStockTaskRepositories.GetListBy(SourceBillNo_list);
if (data_list.Count != 0)
{
//2.1提取出wms任务单明细信息
var data_list_details = data_list.SelectMany(x => x.Details).ToList();
foreach (var item in data_list_details)
{
var data = data_list.Where(x => x.Id == item.Fid).FirstOrDefault();
//2.1.1对比erp的物料信息
var erp_data = erp_list.Where(x => x.FBillNo == data.SourceBillNo && x.FMaterialId == item.MaterialId).FirstOrDefault();
if (erp_data != null)
{
//2.1.2修改数量
item.AccruedQty = erp_data.FQty;
item.DeliveredQty = erp_data.FStockInQty;
erp_removeList.Add(erp_data);
}
}
//2.2.提交修改
var isSuccess = await _inStockTaskRepositories.UpdateRange(data_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<InStockTask>();
//var current_billNos = erp_list.GroupBy(x => x.FBillNo).Select(x => x.Key).ToList();
var current_billNos = erp_list.GroupBy(x => new { x.FBillNo, x.FCreateDate }).Select(x => new { x.Key.FBillNo, x.Key.FCreateDate }).ToList();
foreach (var item in current_billNos)
{
var dto = new InStockTask();
dto.SourceBillNo = item.FBillNo;
dto.CreateTime = item.FCreateDate;
dto.Create(InstockType.Purchase);
//找到当前对应来源单据编号的集合数据
var current_erp_details = erp_list.Where(x => x.FBillNo == item.FBillNo).ToList();
//给到dto的实体明细中
dto.Details = _mapper.Map<List<InStockTaskDetails>>(current_erp_details);
add_entitys.Add(dto);
}
//3.1提交新增
var isSuccess = await _inStockTaskRepositories.AddRange(add_entitys, isTransaction);
if (!isSuccess)
return Result.ReFailure(ResultCodes.DateWriteError);
}
return Result.ReSuccess();
}
/// <summary>
/// 同步:其他入库单
/// </summary>
/// <param name="billNos"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> SysnMiscellaneous(List<string> billNos = null, bool isTransaction = true)
{
//1.获取金蝶数据:其他入库订单数据
var erp_result = await _erpService.BillQueryForMiscellaneous(billNos);
if (!erp_result.IsSuccess)
return Result.ReFailure(erp_result.Message, erp_result.Status);
var erp_list = erp_result.Data;
//2.通过单据编号找到wms系统现有的任务单并修改
var erp_removeList = new List<ErpMiscellaneousDto>();
var SourceBillNo_list = erp_list.GroupBy(x => x.BillNo).Select(x => x.Key).ToList();
var data_list = await _inStockTaskRepositories.GetListBy(SourceBillNo_list);
if (data_list.Count != 0)
{
//2.1提取出wms任务单明细信息
var data_list_details = data_list.SelectMany(x => x.Details).ToList();
foreach (var item in data_list_details)
{
var data = data_list.Where(x => x.Id == item.Fid).FirstOrDefault();
//2.1.1对比erp的物料信息
var erp_data = erp_list.Where(x => x.BillNo == data.SourceBillNo && x.MaterialId == item.MaterialId).FirstOrDefault();
if (erp_data != null)
{
//2.1.2修改数量
item.AccruedQty = erp_data.Qty;
erp_removeList.Add(erp_data);
}
}
//2.2.提交修改
var isSuccess = await _inStockTaskRepositories.UpdateRange(data_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<InStockTask>();
var current_billNos = erp_list.GroupBy(x => new { x.BillNo,x.CreateTime }).Select(x => new {x.Key.BillNo,x.Key.CreateTime }).ToList();
foreach (var item in current_billNos)
{
var dto = new InStockTask();
dto.SourceBillNo = item.BillNo;
dto.CreateTime = item.CreateTime;
dto.Create(InstockType.Miscellaneous);
//找到当前对应来源单据编号的集合数据
var current_erp_details = erp_list.Where(x => x.BillNo == item.BillNo).ToList();
//给到dto的实体明细中
dto.Details = _mapper.Map<List<InStockTaskDetails>>(current_erp_details);
add_entitys.Add(dto);
}
//3.1提交新增
var isSuccess = await _inStockTaskRepositories.AddRange(add_entitys, isTransaction);
if (!isSuccess)
return Result.ReFailure(ResultCodes.DateWriteError);
}
return Result.ReSuccess();
}
/// <summary>
/// 同步:直接调拨入库单
/// </summary>
/// <param name="billNos"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> SysnTransferDirect(List<string> billNos = null, bool isTransaction = true)
{
//1.获取金蝶数据:直接调拨入库订单数据
var erp_result = await _erpService.BillQueryForTransferDirect(billNos);
if (!erp_result.IsSuccess)
return Result.ReFailure(erp_result.Message, erp_result.Status);
var erp_list = erp_result.Data;
//2.通过单据编号找到wms系统现有的任务单并修改
var erp_removeList = new List<ErpTransferDirectDto>();
var SourceBillNo_list = erp_list.GroupBy(x => x.BillNo).Select(x => x.Key).ToList();
var data_list = await _inStockTaskRepositories.GetListBy(SourceBillNo_list);
if (data_list.Count != 0)
{
//2.1提取出wms任务单明细信息
var data_list_details = data_list.SelectMany(x => x.Details).ToList();
foreach (var item in data_list_details)
{
var data = data_list.Where(x => x.Id == item.Fid).FirstOrDefault();
//2.1.1对比erp的物料信息
var erp_data = erp_list.Where(x => x.BillNo == data.SourceBillNo && x.MaterialId == item.MaterialId).FirstOrDefault();
if (erp_data != null)
{
//2.1.2修改数量
item.AccruedQty = erp_data.Qty;
erp_removeList.Add(erp_data);
}
}
//2.2.提交修改
var isSuccess = await _inStockTaskRepositories.UpdateRange(data_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<InStockTask>();
var current_billNos = erp_list.GroupBy(x => new { x.BillNo, x.CreateTime }).Select(x => new { x.Key.BillNo, x.Key.CreateTime }).ToList();
foreach (var item in current_billNos)
{
var dto = new InStockTask();
dto.SourceBillNo = item.BillNo;
dto.CreateTime = item.CreateTime;
dto.Create(InstockType.Stkdirecttransfers);
//找到当前对应来源单据编号的集合数据
var current_erp_details = erp_list.Where(x => x.BillNo == item.BillNo).ToList();
//给到dto的实体明细中
dto.Details = _mapper.Map<List<InStockTaskDetails>>(current_erp_details);
add_entitys.Add(dto);
}
//3.1提交新增
var isSuccess = await _inStockTaskRepositories.AddRange(add_entitys, isTransaction);
if (!isSuccess)
return Result.ReFailure(ResultCodes.DateWriteError);
}
return Result.ReSuccess();
}
}
}