Files
WMS-Api/src/WMS.Web.Domain/Services/InStockTaskService.cs
tongfei 5f71e20802 优化
2023-11-24 14:29:57 +08:00

351 lines
14 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;
using WMS.Web.Core.Dto.Erp;
using WMS.Web.Core.Dto.InStockTask;
using WMS.Web.Core.Dto.Login;
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>
/// 来源单-金蝶校准-实时
/// </summary>
/// <param name="sourceBillNo"></param>
/// <returns></returns>
public async Task<Result> 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 Result.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;
}
else if (task.Type == InstockType.Miscellaneous)
{
var result = await this.SysnMiscellaneous(billNos, isTransaction);
if (!result.IsSuccess) isRollback = true;
}
else if (task.Type == InstockType.Assembled)
{
var result = await this.SysnAssembledApp(billNos, isTransaction);
if (!result.IsSuccess) isRollback = true;
}
else if (task.Type == InstockType.Stkdirecttransfers)
{
var result = await this.SysnTransferDirect(billNos, isTransaction);
if (!result.IsSuccess) isRollback = true;
}
else if (task.Type == InstockType.StktransferInst)
{
var result = await this.SysnTransferin(billNos, isTransaction);
if (!result.IsSuccess) isRollback = true;
}
//4.提交事务
var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction);
if (!isSuccess)
return Result.ReFailure(ResultCodes.AdjustError);
return Result.ReSuccess();
}
/// <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;
return await this.SysnData(erp_list.ToList(), isTransaction);
}
/// <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;
return await this.SysnData(erp_list.ToList(), isTransaction);
}
/// <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;
return await this.SysnData(erp_list.ToList(), isTransaction);
}
/// <summary>
/// 同步:分步式调入单
/// </summary>
/// <param name="billNos"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> SysnTransferin(List<string> billNos = null, bool isTransaction = true)
{
//1.获取金蝶数据:分步式入库订单数据
var erp_result = await _erpService.BillQueryForTransferin(billNos);
if (!erp_result.IsSuccess)
return Result.ReFailure(erp_result.Message, erp_result.Status);
var erp_list = erp_result.Data;
return await this.SysnData(erp_list.ToList(), isTransaction);
}
/// <summary>
/// 同步:组装拆卸单
/// </summary>
/// <param name="billNos"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> SysnAssembledApp(List<string> billNos = null, bool isTransaction = true)
{
var erp_list = new List<ErpInStockResultDto>();
//1.获取金蝶数据:组装成品入库订单数据
var erp_result_ass = await _erpService.BillQueryForAssembledApp_Assembly(billNos);
if (!erp_result_ass.IsSuccess)
return Result.ReFailure(erp_result_ass.Message, erp_result_ass.Status);
var erp_list_ass = erp_result_ass.Data;
erp_list.AddRange(erp_list_ass);
//1.1.获取金蝶数据:拆卸子件入库订单数据
var erp_result_disass = await _erpService.BillQueryForAssembledApp_Disassembly(billNos);
if (!erp_result_disass.IsSuccess)
return Result.ReFailure(erp_result_disass.Message, erp_result_disass.Status);
var erp_list_disass = erp_result_disass.Data;
erp_list.AddRange(erp_list_disass);
return await this.SysnData(erp_list, isTransaction);
}
/// <summary>
/// 同步
/// </summary>
/// <param name="billNos"></param>
/// <returns></returns>
public async Task<Result> Sysn(List<string> billNos = null)
{
//1.事务
IDbContextTransaction _transaction = _basicsRepositories.GetTransaction();
bool isRollback = false;
bool isTransaction = false;
//3.同步数据
var result = await this.InStock(billNos, isTransaction);
if (!result.IsSuccess) isRollback = true;
//3.提交事务
var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction);
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> InStock(List<string> billNos,bool isTransaction)
{
//1.同步数据:采购订单
var purchase_result = await this.SsynPurchaseInStock(billNos, isTransaction);
if (!purchase_result.IsSuccess)
return Result.ReFailure(purchase_result.Message, purchase_result.Status);
//2.同步数据:其他入库单
var miscellaneou_result = await this.SysnMiscellaneous(billNos, isTransaction);
if (!miscellaneou_result.IsSuccess)
return Result.ReFailure(miscellaneou_result.Message, miscellaneou_result.Status);
//3.同步数据:直接调拨入库单
var TransferDirect_result = await this.SysnTransferDirect(billNos, isTransaction);
if (!TransferDirect_result.IsSuccess)
return Result.ReFailure(TransferDirect_result.Message, TransferDirect_result.Status);
//4.同步数据:分步式入库单
var Transferin_result = await this.SysnTransferin(billNos, isTransaction);
if (!Transferin_result.IsSuccess)
return Result.ReFailure(Transferin_result.Message, Transferin_result.Status);
//5.同步数据:组装拆卸单
var AssembledApp_result = await this.SysnAssembledApp(billNos, isTransaction);
if (!AssembledApp_result.IsSuccess)
return Result.ReFailure(AssembledApp_result.Message, AssembledApp_result.Status);
return Result.ReSuccess();
}
/// <summary>
/// ERP数据同步到WMS数据库
/// </summary>
/// <param name="erp_list"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<Result> SysnData(List<ErpInStockResultDto> erp_list, bool isTransaction)
{
//1.通过单据编号找到wms系统现有的任务单并修改
var erp_remove_billNo = new List<string>();
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;
item.DeliveredQty = erp_data.DeliveredQty> item.DeliveredQty? erp_data.DeliveredQty: item.DeliveredQty;
erp_remove_billNo.Add(data.SourceBillNo);
}
}
//2.2.提交修改
var isSuccess = await _inStockTaskRepositories.UpdateRange(data_list, isTransaction);
if (!isSuccess)
return Result.ReFailure(ResultCodes.DateWriteError);
//要剔除的来源单据编号:去重
erp_remove_billNo= erp_remove_billNo.GroupBy(x => x).Select(x => x.Key).ToList();
//2.3剔除:已修改的单据
foreach (var item in erp_remove_billNo)
{
erp_list.RemoveAll(x => x.BillNo == item);
}
}
//3.wms任务单的来源单据编号不存在于erp中那么就新增
if (erp_list.Count != 0)
{
var add_entitys = new List<InStockTask>();
var current_billNos = erp_list.GroupBy(x => x.BillNo).Select(x => x.Key).ToList();
foreach (var item in current_billNos)
{
var current_order= erp_list.Where(x => x.BillNo == item).FirstOrDefault();
var dto = new InStockTask();
dto.Create((InstockType)current_order.Type, current_order.BillNo, current_order.CreateTime);
//找到当前对应来源单据编号的集合数据
var current_erp_details = erp_list.Where(x => x.BillNo == item).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="dto"></param>
/// <param name="loginInfo"></param>
/// <returns></returns>
public async Task<Result> Repeal(OperateRequest dto, LoginInDto loginInfo)
{
var list = await _inStockTaskRepositories.GetList(dto.Ids);
foreach (var entity in list)
{
//作废
entity.Repeal(loginInfo.UserInfo.StaffId);
}
var isSuccess = await _inStockTaskRepositories.UpdateRange(list, true);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
return Result.ReSuccess();
}
}
}