360 lines
16 KiB
C#
360 lines
16 KiB
C#
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();
|
||
}
|
||
}
|
||
}
|