using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
using Volo.Abp.ObjectMapping;
using Win_in.Sfs.Auth.Application.Contracts;
using Win_in.Sfs.Wms.DataExchange.Domain;
using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Tyrp;
using Win_in.Sfs.Wms.DataExchange.Domain.Shared;
using Win_in.Sfs.Wms.DataExchange.WMS.ProductRecycleNote;
using Win_in.Sfs.Wms.Store.Application.Contracts;
namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.TyrpAgent.Outgoing;
public class ProductRecycleNoteConverter : IOutgoingConverter
{
private readonly string billtype = "A009";
private readonly IOutgoingFromWmsManager _outgoingFromWmsManager;
private readonly IOutgoingToExternalManager _outgoingToExternalManager;
private readonly IDepartmentAppService _departmentAppService;
private readonly IObjectMapper _objectMapper;
public ProductRecycleNoteConverter(
IOutgoingFromWmsManager outgoingFromWmsManager
, IOutgoingToExternalManager outgoingToExternalManager
, IDepartmentAppService departmentAppService
, IObjectMapper objectMapper
)
{
_outgoingFromWmsManager = outgoingFromWmsManager;
_outgoingToExternalManager = outgoingToExternalManager;
_departmentAppService = departmentAppService;
_objectMapper = objectMapper;
}
///
/// 转换数据
///
///
public virtual async Task> ConvertAsync()
{
var outgoingToExternalList = new List();
//获取要同步得数据
var outgoingFromWmsList = await _outgoingFromWmsManager.GetToBeProcessedListAsync(EnumOutgoingDataType.ProductRecycle, EnumSystemType.ERP).ConfigureAwait(false);
foreach (var outgoingFromWms in outgoingFromWmsList)
{
var wmsReceipt = JsonSerializer.Deserialize(outgoingFromWms.DataContent);
var exchangeReceipt = _objectMapper.Map(wmsReceipt);
var department = await _departmentAppService.GetByUsernameAsync(exchangeReceipt.Worker).ConfigureAwait(false);
var departmentCode = department == null ? "" : department.Code;
foreach (var detail in wmsReceipt.Details)
{
string tyrpNumber = outgoingFromWms.TyrpNumber;
#region 主表
var exchangeReceiptDetail = _objectMapper.Map(detail);
var purchaseOrder = BuildDataInterface(exchangeReceipt, exchangeReceiptDetail, departmentCode, tyrpNumber);
var outgoingToExternal = new OutgoingToExternal()
{
DataType = EnumOutgoingDataType.ProductRecycle.ToString(),
TableType = EnumExchangeTableType.MainTable,
DataAction = outgoingFromWms.DataAction,
SerialNumber=tyrpNumber,
SourceSystem = EnumSystemType.WMS.ToString(),
SourceDataId = wmsReceipt.Id.ToString(),
SourceDataGroupCode = wmsReceipt.Number,
SourceDataDetailCode = detail.ItemCode,
Writer = nameof(TyrpOutgoingBackgroundWorker),
DestinationSystem = EnumSystemType.ERP.ToString(),
DestinationDataId = "",
};
outgoingToExternal.SetEffectiveDate(outgoingFromWms.EffectiveDate);
outgoingToExternal.SourceDataContent = JsonSerializer.Serialize(exchangeReceipt);
outgoingToExternal.DestinationDataContent = JsonSerializer.Serialize(purchaseOrder);
outgoingToExternalList.Add(outgoingToExternal);
#endregion
#region 明细
var materialDetails = wmsReceipt.MaterialDetails.Where(r => r.ProductItemCode == detail.ItemCode && r.ProductLot == detail.Lot);
foreach (var materialDetail in materialDetails)
{
var outgoingDetailToExternal = new OutgoingToExternal()
{
DataType = EnumOutgoingDataType.ProductRecycle.ToString(),
TableType = EnumExchangeTableType.DetailTable,
DataAction = outgoingFromWms.DataAction,
SerialNumber = tyrpNumber,
SourceSystem = EnumSystemType.WMS.ToString(),
SourceDataId = materialDetail.Id.ToString(),
SourceDataGroupCode = wmsReceipt.Number,
SourceDataDetailCode = materialDetail.ItemCode,
Writer = nameof(TyrpOutgoingBackgroundWorker),
DestinationSystem = EnumSystemType.ERP.ToString(),
DestinationDataId = "",
};
outgoingDetailToExternal.SetEffectiveDate(outgoingFromWms.EffectiveDate);
var exchangeMterialDetail = _objectMapper.Map(materialDetail);
outgoingDetailToExternal.SourceDataContent = JsonSerializer.Serialize(exchangeMterialDetail);
var purchaseOrderDetail = BuildDataInterfaceDetail(tyrpNumber, exchangeMterialDetail,wmsReceipt.Number);
outgoingDetailToExternal.DestinationDataContent = JsonSerializer.Serialize(purchaseOrderDetail);
outgoingToExternalList.Add(outgoingDetailToExternal);
}
#endregion
}
}
//插入到中间表OutgoingToExternal
await _outgoingToExternalManager.CreateManyAsync(outgoingToExternalList).ConfigureAwait(false);
//将outgoingFromWms数据归档
await _outgoingFromWmsManager.ArchiveManyAsync(outgoingFromWmsList).ConfigureAwait(false);
return outgoingToExternalList;
}
///
/// 构建主表
///
///
///
private Wmsoutm BuildDataInterface(ProductRecycleNoteExchangeDto exchangeOrder, ProductRecycleNoteDetailExchangeDto exchangeOrderDetail, string departmentCode, string tyrpNumber)
{
var ret = new Wmsoutm()
{
wmsoutm_mid= Convert.ToDecimal(tyrpNumber),
wmsoutm_nbr = exchangeOrder.Number,
wmsoutm_type = billtype,
wmsoutm_dt_w = DateTime.Now.ToString("yyyyMMdd HH:mm:ss"),
wmsoutm_stat = "Y",
wmsoutm_tyrp_dt = "",
wmsoutm_user = "WMS",
wmsoutm_dept = departmentCode,//根据Worker从UserDepartment中获取
//wmsoutm_date = exchangeOrder.ActiveDate.ToString("yyyyMMdd"),
wmsoutm_date = DateTime.Now.ToString("yyyyMMdd"),
wmsoutm_cust = "",
wmsoutm_shm_nbr = "",
wmsoutm_cust_loc = "",
wmsoutm_stock_stat = "",
wmsoutm_open_part = exchangeOrderDetail.ItemCode,
wmsoutm_open_loc = exchangeOrderDetail.LocationErpCode,
wmsoutm_open_hours = 1,//无法取到转移工时 目前默认为1
wmsoutm_tyrp_k = "",
wmsoutm_id = 0,//明细中最大scmsend_id
wmsoutm_open_qty = exchangeOrderDetail.Qty,
};
return ret;
}
///
/// 构建明细
///
///
///
///
private Wmsoutd BuildDataInterfaceDetail(string tyrpNumber, ProductRecycleMaterialDetailExchangeDto exchangeDetailOrder,string number)
{
var ret = new Wmsoutd()
{
wmsoutd_mid=Convert.ToDecimal(tyrpNumber),
wmsoutd_nbr = number,
wmsoutd_part = exchangeDetailOrder.ItemCode,
wmsoutd_loc = exchangeDetailOrder.LocationErpCode,
wmsoutd_qty = exchangeDetailOrder.Qty,
wmsoutd_bcm_code = "",
wmsoutd_projt_id = "",
};
return ret;
}
}