mahao
1 year ago
15 changed files with 950 additions and 550 deletions
@ -0,0 +1,45 @@ |
|||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
|
||||
|
namespace Win.Sfs.SettleAccount.Enums; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 结算、发运、Edi比对类型
|
||||
|
/// </summary>
|
||||
|
public enum EnumSaSeEdiCompareCategory |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 未定义
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "未定义")] |
||||
|
None = 0, |
||||
|
/// <summary>
|
||||
|
/// 有结算有发运(有EDI数据)
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "有结算有发运(有EDI数据")] |
||||
|
HaveSaHaveSeHaveEdi = 1, |
||||
|
/// <summary>
|
||||
|
/// 有结算有发运(无EDI数据)
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "有结算有发运(无EDI数据)")] |
||||
|
HaveSaHaveSeNotHaveEdi = 2, |
||||
|
/// <summary>
|
||||
|
/// 有结算无发运(有EDI数据)
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "有结算无发运(有EDI数据)")] |
||||
|
HaveSaNotHaveSeHaveEdi = 3, |
||||
|
/// <summary>
|
||||
|
/// 有结算无发运(无EDI数据)
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "有结算无发运(无EDI数据)")] |
||||
|
HaveSaNotHaveSeNotHaveEdi = 4, |
||||
|
/// <summary>
|
||||
|
/// 无结算有发运(有EDI数据)
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "无结算有发运(有EDI数据)")] |
||||
|
NotHaveSaHaveSeHaveEdi = 5, |
||||
|
/// <summary>
|
||||
|
/// 无结算有发运(无EDI数据)
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "无结算有发运(无EDI数据)")] |
||||
|
NotHaveSaHaveSeNotHaveEdi = 6 |
||||
|
} |
@ -0,0 +1,327 @@ |
|||||
|
using System; |
||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using Magicodes.ExporterAndImporter.Core; |
||||
|
using Magicodes.ExporterAndImporter.Excel; |
||||
|
using Win.Sfs.SettleAccount.Enums; |
||||
|
|
||||
|
namespace Win.Sfs.SettleAccount.Reports; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 结算、EDI、发运对比
|
||||
|
/// </summary>
|
||||
|
public class SaSeEdiCompareDiff |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 类型
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "类型")] |
||||
|
public EnumSaSeEdiCompareCategory Category { get; set; } |
||||
|
/// <summary>
|
||||
|
/// Wms发货单号
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "Wms发货单号")] |
||||
|
public string WmsBillNum { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 发货日期
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "发货日期")] |
||||
|
public DateTime? ShippingDate { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 日顺序号
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "日顺序号")] |
||||
|
public string SeqNumber { get; set; } |
||||
|
/// <summary>
|
||||
|
/// PJIS日顺序号
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "PJIS日顺序号")] |
||||
|
public string PJISSeqNumber { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 结算数据中的过账日期
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "客户下线时间")] |
||||
|
public DateTime? CustomerOfflineTime { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 结算数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "结算数量")] |
||||
|
public decimal? SAQty { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 发货数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "发货数量")] |
||||
|
public decimal? SEQty { get; set; } |
||||
|
/// <summary>
|
||||
|
/// Eid数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "Eid数量")] |
||||
|
public decimal? EdiQty { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 定价
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "定价")] |
||||
|
public decimal? FixPrice { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 生产号
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "生产号")] |
||||
|
public string PN { set; get; } |
||||
|
/// <summary>
|
||||
|
/// WMS目标库位
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "WMS目标库位")] |
||||
|
public string ToLocCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// ERP目标库位
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "ERP目标库位")] |
||||
|
public string ToErpLocCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// Edi客户物料号
|
||||
|
/// </summary>
|
||||
|
public string EdiCustomerPartCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 发运客户物料号
|
||||
|
/// </summary>
|
||||
|
public string SeCustomerPartCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 发运厂内物料号
|
||||
|
/// </summary>
|
||||
|
public string SeFactoryPartCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 结算客户物料号
|
||||
|
/// </summary>
|
||||
|
public string SaCustomerPartCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 结算厂内物料号
|
||||
|
/// </summary>
|
||||
|
public string SaFactoryPartCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 客户物料号
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "客户物料号")] |
||||
|
public string CustomerPartCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 物料描述
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "物料描述")] |
||||
|
public string PartCodeDesc { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 厂内物料号
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "厂内物料号")] |
||||
|
public string FactoryPartCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 替换厂内物料号
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "替换厂内物料号")] |
||||
|
public string ReplaceFactoryPartCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 是否替换了厂内零件号
|
||||
|
/// </summary>
|
||||
|
public bool IsReplace { get; set; } |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 结算、发运、Eid对比明细
|
||||
|
/// </summary>
|
||||
|
[ExcelExporter(MaxRowNumberOnASheet = 900000)] |
||||
|
public class SaSeEdiCompareDetailExport |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 结算、发运、Eid对比明细
|
||||
|
/// </summary>
|
||||
|
public interface ISaSeEdiCompareDetailExport |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 类别
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "类别")] |
||||
|
[ExporterHeader(DisplayName = "类别")] |
||||
|
[ValueMapping("有结算有发运(有EDI数据)", 1)] |
||||
|
[ValueMapping("有结算有发运(无EDI数据)", 2)] |
||||
|
[ValueMapping("有结算无发运(有EDI数据)", 3)] |
||||
|
[ValueMapping("有结算无发运(无EDI数据)", 4)] |
||||
|
[ValueMapping("无结算有发运(有EDI数据)", 5)] |
||||
|
[ValueMapping("无结算有发运(无EDI数据)", 6)] |
||||
|
public EnumSaSeEdiCompareCategory Category { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 零件描述
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "零件描述")] |
||||
|
[ExporterHeader(DisplayName = "物料描述")] |
||||
|
public string PartCodeDesc { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 替换厂内零件号
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "替换厂内零件号")] |
||||
|
[ExporterHeader(DisplayName = "替换厂内零件号")] |
||||
|
public string ReplaceFactoryPartCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 结算数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "结算数量")] |
||||
|
[ExporterHeader(DisplayName = "结算数量")] |
||||
|
public decimal SAQty { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 发货数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "发货数量")] |
||||
|
[ExporterHeader(DisplayName = "WMS发货数量")] |
||||
|
public decimal SEQty { get; set; } |
||||
|
/// <summary>
|
||||
|
/// Edi数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "Edi数量")] |
||||
|
[ExporterHeader(DisplayName = "Edi数量")] |
||||
|
public decimal EdiQty { get; set; } |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// JisBBAC结算、发运、Eid对比明细
|
||||
|
/// </summary>
|
||||
|
|
||||
|
public class SaSeEdiCompareDetailExportJisBBAC : SaSeEdiCompareDetailExport, ISaSeEdiCompareDetailExport |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 类别
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "类别")] |
||||
|
[ExporterHeader(DisplayName = "类别")] |
||||
|
[ValueMapping("有结算有发运(有EDI数据)", 1)] |
||||
|
[ValueMapping("有结算有发运(无EDI数据)", 2)] |
||||
|
[ValueMapping("有结算无发运(有EDI数据)", 3)] |
||||
|
[ValueMapping("有结算无发运(无EDI数据)", 4)] |
||||
|
[ValueMapping("无结算有发运(有EDI数据)", 5)] |
||||
|
[ValueMapping("无结算有发运(无EDI数据)", 6)] |
||||
|
public EnumSaSeEdiCompareCategory Category { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 零件描述
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "零件描述")] |
||||
|
[ExporterHeader(DisplayName = "物料描述")] |
||||
|
public string PartCodeDesc { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 替换厂内零件号
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "替换厂内零件号")] |
||||
|
[ExporterHeader(DisplayName = "替换厂内零件号")] |
||||
|
public string ReplaceFactoryPartCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 结算数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "结算数量")] |
||||
|
[ExporterHeader(DisplayName = "结算数量")] |
||||
|
public decimal SAQty { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 发货数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "发货数量")] |
||||
|
[ExporterHeader(DisplayName = "WMS发货数量")] |
||||
|
public decimal SEQty { get; set; } |
||||
|
/// <summary>
|
||||
|
/// Edi数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "Edi数量")] |
||||
|
[ExporterHeader(DisplayName = "Edi数量")] |
||||
|
public decimal EdiQty { get; set; } |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// JisHBPO结算、发运、Eid对比明细
|
||||
|
/// </summary>
|
||||
|
public class SaSeEdiCompareDetailExportJisHBPO : SaSeEdiCompareDetailExport, ISaSeEdiCompareDetailExport |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 类别
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "类别")] |
||||
|
[ExporterHeader(DisplayName = "类别")] |
||||
|
[ValueMapping("有结算有发运(有EDI数据)", 1)] |
||||
|
[ValueMapping("有结算有发运(无EDI数据)", 2)] |
||||
|
[ValueMapping("有结算无发运(有EDI数据)", 3)] |
||||
|
[ValueMapping("有结算无发运(无EDI数据)", 4)] |
||||
|
[ValueMapping("无结算有发运(有EDI数据)", 5)] |
||||
|
[ValueMapping("无结算有发运(无EDI数据)", 6)] |
||||
|
public EnumSaSeEdiCompareCategory Category { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 零件描述
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "零件描述")] |
||||
|
[ExporterHeader(DisplayName = "物料描述")] |
||||
|
public string PartCodeDesc { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 替换厂内零件号
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "替换厂内零件号")] |
||||
|
[ExporterHeader(DisplayName = "替换厂内零件号")] |
||||
|
public string ReplaceFactoryPartCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 结算数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "结算数量")] |
||||
|
[ExporterHeader(DisplayName = "结算数量")] |
||||
|
public decimal SAQty { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 发货数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "发货数量")] |
||||
|
[ExporterHeader(DisplayName = "WMS发货数量")] |
||||
|
public decimal SEQty { get; set; } |
||||
|
/// <summary>
|
||||
|
/// Edi数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "Edi数量")] |
||||
|
[ExporterHeader(DisplayName = "Edi数量")] |
||||
|
public decimal EdiQty { get; set; } |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// PUB结算与发运对比汇总
|
||||
|
/// </summary>
|
||||
|
[ExcelExporter(MaxRowNumberOnASheet = 900000)] |
||||
|
public class SaSeEdiCompareSumExport |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 厂内物料号
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "厂内物料号")] |
||||
|
[ExporterHeader(DisplayName = "LU")] |
||||
|
public string FactoryPartCode { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 物料描述
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "物料描述")] |
||||
|
[ExporterHeader(DisplayName = "物料描述")] |
||||
|
public string PartCodeDesc { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 结算数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "结算数量")] |
||||
|
[ExporterHeader(DisplayName = "结算数量")] |
||||
|
public decimal SAQty { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 发货数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "发货数量")] |
||||
|
[ExporterHeader(DisplayName = "WMS发货数量")] |
||||
|
public decimal SEQty { get; set; } |
||||
|
/// <summary>
|
||||
|
/// Edi数量
|
||||
|
/// </summary>
|
||||
|
[Display(Name = "Edi数量")] |
||||
|
[ExporterHeader(DisplayName = "Edi数量")] |
||||
|
public decimal EdiQty { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 结算与EDI量差
|
||||
|
/// </summary>
|
||||
|
[ExporterHeader(DisplayName = "结算与EDI量差")] |
||||
|
public decimal SaEdiQty => SAQty - EdiQty; |
||||
|
/// <summary>
|
||||
|
/// WMS发货与EDI数量差
|
||||
|
/// </summary>
|
||||
|
[ExporterHeader(DisplayName = "WMS发货与EDI数量差")] |
||||
|
public decimal SeEdiQty => SEQty - EdiQty; |
||||
|
} |
@ -1,183 +0,0 @@ |
|||||
using System; |
|
||||
using System.Collections.Generic; |
|
||||
using System.Linq; |
|
||||
using System.Linq.Dynamic.Core; |
|
||||
using Magicodes.ExporterAndImporter.Excel; |
|
||||
using Microsoft.AspNetCore.SignalR; |
|
||||
using SettleAccount.Domain.BQ; |
|
||||
using SettleAccount.Job.SignalR; |
|
||||
using Shouldly; |
|
||||
using TaskJob.EventArgs; |
|
||||
using TaskJob.Interfaces; |
|
||||
using Volo.Abp.BlobStoring; |
|
||||
using Volo.Abp.DependencyInjection; |
|
||||
using Volo.Abp.ObjectMapping; |
|
||||
using Win.Sfs.BaseData.ImportExcelCommon; |
|
||||
using Win.Sfs.SettleAccount; |
|
||||
using Win.Sfs.SettleAccount.Reports; |
|
||||
|
|
||||
namespace SettleAccount.Job.Services.Report |
|
||||
{ |
|
||||
/// <summary>
|
|
||||
/// BBAC结算、Edi、发运对比导出服务
|
|
||||
/// </summary>
|
|
||||
public class JisBBACSaEdiSeCompareExportService : ITransientDependency, IExportJob |
|
||||
{ |
|
||||
/// <summary>
|
|
||||
/// HubContext
|
|
||||
/// </summary>
|
|
||||
private readonly IHubContext<PageHub> _hubContext; |
|
||||
/// <summary>
|
|
||||
/// 文件容器
|
|
||||
/// </summary>
|
|
||||
private readonly IBlobContainer<MyFileContainer> _fileContainer; |
|
||||
/// <summary>
|
|
||||
/// DbContext
|
|
||||
/// </summary>
|
|
||||
private readonly SettleAccountDbContext _settleAccountDbContext; |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// 构造
|
|
||||
/// </summary>
|
|
||||
public JisBBACSaEdiSeCompareExportService( |
|
||||
IHubContext<PageHub> hubContext, |
|
||||
IBlobContainer<MyFileContainer> fileContainer, |
|
||||
IObjectMapper objectMapper, |
|
||||
SettleAccountDbContext settleAccountDbContext) |
|
||||
{ |
|
||||
_hubContext = hubContext; |
|
||||
_fileContainer = fileContainer; |
|
||||
_settleAccountDbContext = settleAccountDbContext; |
|
||||
} |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// 导出
|
|
||||
/// </summary>
|
|
||||
public string ExportFile(Guid id, List<string> exportName, List<CustomCondition> property) |
|
||||
{ |
|
||||
var version = property.Where(p => p.Name == "Version").FirstOrDefault().Value; |
|
||||
var lu = property.Where(p => p.Name == "LU").FirstOrDefault().Value; |
|
||||
var pn = property.Where(p => p.Name == "PN").FirstOrDefault().Value; |
|
||||
var strSeStartDateTime = property.Where(p => p.Name == "SeStartDateTime").FirstOrDefault().Value; |
|
||||
var strSeEndDateTime = property.Where(p => p.Name == "SeEndDateTime").FirstOrDefault().Value; |
|
||||
|
|
||||
var seStartDateTime = DateTime.Parse(strSeStartDateTime); |
|
||||
var seEndDateTime = DateTime.Parse(strSeEndDateTime); |
|
||||
var filename = exportName.FirstOrDefault(); |
|
||||
|
|
||||
//有EDI无发运
|
|
||||
var haveEdiNotHaveSeList = _settleAccountDbContext.Set<BBAC_SE_EDI>().Where(t => t.IsHaveSeData == false) |
|
||||
.GroupBy(t => new { t.LU, t.PN }) |
|
||||
.Select(t => new JisBBACEidSeCompareExport() |
|
||||
{ |
|
||||
Category = "JIS", |
|
||||
CarModeCode = default, |
|
||||
LineStationcode = default, |
|
||||
SequenceNumber = t.Max(t => t.SeqNumber), |
|
||||
ParType = "01", |
|
||||
EdiQty = t.Sum(t => t.Qty), |
|
||||
AssemblyDate = default, |
|
||||
MatchNumber = default, |
|
||||
MateType = "否", |
|
||||
DiffDesc = "WMS漏发货EDI有订单" |
|
||||
}).ToList(); |
|
||||
//无EDI有发运
|
|
||||
var notHaveEdiHaveSeList = _settleAccountDbContext.Set<BBAC_SE_DETAIL>().Where(t => t.IsHaveEdiData == false) |
|
||||
.GroupBy(t => new { t.LU, t.PN }) |
|
||||
.Select(t => new JisBBACEidSeCompareExport() |
|
||||
{ |
|
||||
Category = "JIS", |
|
||||
WmsBillNum = t.Max(t => t.BillNum), |
|
||||
MESConfigCode = t.Max(t => t.MESConfigCode), |
|
||||
ShippingDate = t.Max(t => t.BillTime), |
|
||||
PN = t.Max(t => t.PN), |
|
||||
Seq = t.Max(t => t.Seq), |
|
||||
PjsNum = t.Max(t => t.PjsNum), |
|
||||
MaterialNumber = t.Max(t => t.CustPartCode), |
|
||||
MaterialDes = t.Max(t => t.PartDesc), |
|
||||
SEQty = t.Sum(t => t.Qty), |
|
||||
InjectionCode = t.Max(t => t.InjectionCode), |
|
||||
MateType = "否", |
|
||||
DiffDesc = "WMS有发货EDI无订单" |
|
||||
}).ToList(); |
|
||||
//有EDI有发运
|
|
||||
var ediGroup = from edi in _settleAccountDbContext.Set<BBAC_SE_EDI>() |
|
||||
where edi.IsDeleted == false && edi.IsHaveSeData == true |
|
||||
group edi by new { edi.PN, edi.LU } into groupItem |
|
||||
select new |
|
||||
{ |
|
||||
groupItem.Key.PN, |
|
||||
groupItem.Key.LU, |
|
||||
Qty = groupItem.Sum(t => t.Qty), |
|
||||
SeqNumber = groupItem.Max(t => t.SeqNumber) |
|
||||
}; |
|
||||
var seGroup = from se in _settleAccountDbContext.Set<BBAC_SE_DETAIL>() |
|
||||
where se.IsHaveEdiData == true && se.AssembleData >= seStartDateTime && se.AssembleData <= seEndDateTime |
|
||||
group se by new { se.PN, se.LU } into groupItem |
|
||||
select new |
|
||||
{ |
|
||||
groupItem.Key.PN, |
|
||||
groupItem.Key.LU, |
|
||||
Qty = groupItem.Sum(t => t.Qty), |
|
||||
BillNum = groupItem.Max(t => t.BillNum), |
|
||||
MESConfigCode = groupItem.Max(t => t.MESConfigCode), |
|
||||
BillTime = groupItem.Max(t => t.BillTime), |
|
||||
Seq = groupItem.Max(t => t.Seq), |
|
||||
PjsNum = groupItem.Max(t => t.PjsNum), |
|
||||
CustPartCode = groupItem.Max(t => t.CustPartCode), |
|
||||
PartDesc = groupItem.Max(t => t.PartDesc), |
|
||||
InjectionCode = groupItem.Max(t => t.InjectionCode) |
|
||||
}; |
|
||||
var haveEdiHaveSeList = (from edi in ediGroup |
|
||||
join se in seGroup |
|
||||
on new { edi.PN, edi.LU } equals new { se.PN, se.LU } |
|
||||
//where edi.IsDeleted == false && edi.IsHaveSeData == true && se.IsHaveEdiData == true
|
|
||||
select new JisBBACEidSeCompareExport() |
|
||||
{ |
|
||||
Category = "JIS", |
|
||||
WmsBillNum = se.BillNum, |
|
||||
CarModeCode = default, |
|
||||
LineStationcode = default, |
|
||||
SequenceNumber = edi.SeqNumber, |
|
||||
ParType = "01", |
|
||||
MESConfigCode = se.MESConfigCode, |
|
||||
ShippingDate = se.BillTime, |
|
||||
PN = se.PN, |
|
||||
Seq = se.Seq, |
|
||||
PjsNum = se.PjsNum, |
|
||||
MaterialNumber = se.CustPartCode, |
|
||||
MaterialDes = se.PartDesc, |
|
||||
SEQty = se.Qty, |
|
||||
EdiQty = edi.Qty, |
|
||||
AssemblyDate = default, |
|
||||
MatchNumber = default, |
|
||||
InjectionCode = se.InjectionCode, |
|
||||
MateType = se.Qty == edi.Qty ? "是" : "否", |
|
||||
DiffDesc = "WMS有发货EDI有订单" |
|
||||
}).ToList(); |
|
||||
|
|
||||
haveEdiNotHaveSeList.AddRange(haveEdiHaveSeList); |
|
||||
notHaveEdiHaveSeList.AddRange(haveEdiHaveSeList); |
|
||||
|
|
||||
ExcelExporter excelExporter = new ExcelExporter(); |
|
||||
excelExporter |
|
||||
.Append(haveEdiNotHaveSeList, $"BBACEDI数据和发货对比") |
|
||||
.SeparateBySheet() |
|
||||
.Append(notHaveEdiHaveSeList, $"BBAC发货和EDI数据对比"); |
|
||||
|
|
||||
var result = excelExporter.ExportAppendDataAsByteArray(); |
|
||||
result.ShouldNotBeNull(); |
|
||||
_fileContainer.SaveAsync(filename, result.Result, true); |
|
||||
|
|
||||
Notify(); |
|
||||
return id.ToString(); |
|
||||
} |
|
||||
|
|
||||
#region 私有方法
|
|
||||
private void Notify() |
|
||||
{ |
|
||||
this._hubContext.Clients.All.ServerToClient("SaSeCompare", "refresh", ""); |
|
||||
} |
|
||||
#endregion
|
|
||||
} |
|
||||
} |
|
@ -0,0 +1,180 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using System.Linq; |
||||
|
using System.Linq.Dynamic.Core; |
||||
|
using Microsoft.AspNetCore.SignalR; |
||||
|
using Microsoft.OpenApi.Extensions; |
||||
|
using SettleAccount.Domain.BQ; |
||||
|
using SettleAccount.Job.SignalR; |
||||
|
using Shouldly; |
||||
|
using TaskJob.EventArgs; |
||||
|
using TaskJob.Interfaces; |
||||
|
using Volo.Abp.BlobStoring; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.ObjectMapping; |
||||
|
using Win.Sfs.BaseData.ImportExcelCommon; |
||||
|
using Win.Sfs.SettleAccount; |
||||
|
using Win.Sfs.SettleAccount.Reports; |
||||
|
|
||||
|
namespace SettleAccount.Job.Services.Report |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// BBAC结算、发运、Edi对比导出服务
|
||||
|
/// </summary>
|
||||
|
public class JisBBACSaSeEdiCompareExportService : SaSeEdiCompareExportBaseService, ITransientDependency, IExportJob |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 业务类型
|
||||
|
/// </summary>
|
||||
|
private readonly EnumBusinessType businessType = EnumBusinessType.JisBBAC; |
||||
|
/// <summary>
|
||||
|
/// 文件容器
|
||||
|
/// </summary>
|
||||
|
private readonly IBlobContainer<MyFileContainer> _fileContainer; |
||||
|
/// <summary>
|
||||
|
/// AutoMapper
|
||||
|
/// </summary>
|
||||
|
private readonly IObjectMapper _objectMapper; |
||||
|
/// <summary>
|
||||
|
/// DbContext
|
||||
|
/// </summary>
|
||||
|
private readonly SettleAccountDbContext _settleAccountDbContext; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 构造
|
||||
|
/// </summary>
|
||||
|
public JisBBACSaSeEdiCompareExportService( |
||||
|
IHubContext<PageHub> hubContext, |
||||
|
IBlobContainer<MyFileContainer> fileContainer, |
||||
|
IObjectMapper objectMapper, |
||||
|
SettleAccountDbContext settleAccountDbContext) : base(hubContext) |
||||
|
{ |
||||
|
_fileContainer = fileContainer; |
||||
|
_objectMapper = objectMapper; |
||||
|
_settleAccountDbContext = settleAccountDbContext; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 导出
|
||||
|
/// </summary>
|
||||
|
public string ExportFile(Guid id, List<string> exportName, List<CustomCondition> property) |
||||
|
{ |
||||
|
var version = property.Where(p => p.Name == "Version").FirstOrDefault().Value; |
||||
|
var lu = property.Where(p => p.Name == "LU").FirstOrDefault().Value; |
||||
|
var pn = property.Where(p => p.Name == "PN").FirstOrDefault().Value; |
||||
|
var strSeStartDateTime = property.Where(p => p.Name == "SeStartDateTime").FirstOrDefault().Value; |
||||
|
var strSeEndDateTime = property.Where(p => p.Name == "SeEndDateTime").FirstOrDefault().Value; |
||||
|
|
||||
|
var businessTypeDisplayName = businessType.GetAttributeOfType<DisplayAttribute>()?.Name ?? businessType.ToString(); |
||||
|
var seStartDateTime = DateTime.Parse(strSeStartDateTime); |
||||
|
var seEndDateTime = DateTime.Parse(strSeEndDateTime); |
||||
|
var filename = exportName.FirstOrDefault(); |
||||
|
|
||||
|
var ediSeSaCompareDiffs = GetEdiSeSaCompareData(int.Parse(version), seStartDateTime, seEndDateTime); |
||||
|
|
||||
|
HandleSaSeEdiCompareDiffList(ediSeSaCompareDiffs); |
||||
|
|
||||
|
if (string.IsNullOrEmpty(lu) == false) |
||||
|
{ |
||||
|
ediSeSaCompareDiffs = ediSeSaCompareDiffs.FindAll(p => p.CustomerPartCode == lu); |
||||
|
} |
||||
|
if (string.IsNullOrEmpty(pn) == false) |
||||
|
{ |
||||
|
ediSeSaCompareDiffs = ediSeSaCompareDiffs.FindAll(p => p.PN == pn); |
||||
|
} |
||||
|
ediSeSaCompareDiffs = ediSeSaCompareDiffs.OrderBy(t => t.Category).ToList(); |
||||
|
|
||||
|
var items = _objectMapper.Map<List<SaSeEdiCompareDiff>, List<SaSeEdiCompareDetailExportJisBBAC>>(ediSeSaCompareDiffs); |
||||
|
var excelExporter = BindExcelExporter<SaSeEdiCompareDetailExportJisBBAC>(items, businessTypeDisplayName); |
||||
|
|
||||
|
var result = excelExporter.ExportAppendDataAsByteArray(); |
||||
|
result.ShouldNotBeNull(); |
||||
|
_fileContainer.SaveAsync(filename, result.Result, true); |
||||
|
|
||||
|
Notify(); |
||||
|
return id.ToString(); |
||||
|
} |
||||
|
|
||||
|
#region 私有方法
|
||||
|
/// <summary>
|
||||
|
/// 获取结算与发运比对数据
|
||||
|
/// </summary>
|
||||
|
public List<SaSeEdiCompareDiff> GetEdiSeSaCompareData(int version, DateTime seStartDateTime, DateTime seEndDateTime) |
||||
|
{ |
||||
|
//结算
|
||||
|
var saGroup = from sa in _settleAccountDbContext.Set<BBAC_SA_DETAIL>() |
||||
|
where sa.BusinessType == businessType && sa.Version == version |
||||
|
group sa by new { sa.PN, sa.LU } into groupItem |
||||
|
select new |
||||
|
{ |
||||
|
groupItem.Key.PN, |
||||
|
groupItem.Key.LU, |
||||
|
Qty = groupItem.Sum(t => t.Qty), |
||||
|
Price = groupItem.Max(t => t.Price), |
||||
|
SettleDate = groupItem.Max(t => t.SettleDate), |
||||
|
PartCode = groupItem.Max(t => t.PartCode), |
||||
|
}; |
||||
|
//发运
|
||||
|
var seGroup = from se in _settleAccountDbContext.Set<BBAC_SE_DETAIL>() |
||||
|
where se.BusinessType == businessType && se.BillTime >= seStartDateTime && se.BillTime <= seEndDateTime |
||||
|
group se by new { se.PN, se.LU } into groupItem |
||||
|
select new |
||||
|
{ |
||||
|
groupItem.Key.PN, |
||||
|
groupItem.Key.LU, |
||||
|
Qty = groupItem.Sum(t => t.Qty), |
||||
|
WmsBillNum = groupItem.Max(t => t.WmsBillNum), |
||||
|
ShippingDate = groupItem.Max(t => t.ShippingDate), |
||||
|
FactoryPartCode = groupItem.Max(t => t.FactoryPartCode), |
||||
|
ToLoc = groupItem.Max(t => t.ToLoc), |
||||
|
ErpToLoc = groupItem.Max(t => t.ErpToLoc) |
||||
|
}; |
||||
|
var saSeCompareLeft = (from sa in saGroup |
||||
|
join se in seGroup |
||||
|
on new { sa.PN, sa.LU } equals new { se.PN, se.LU } |
||||
|
into temp |
||||
|
from se in temp.DefaultIfEmpty() |
||||
|
select new SaSeEdiCompareDiff() |
||||
|
{ |
||||
|
WmsBillNum = se.WmsBillNum, |
||||
|
ShippingDate = se.ShippingDate, |
||||
|
CustomerOfflineTime = sa.SettleDate, |
||||
|
PN = sa.PN, |
||||
|
SAQty = sa.Qty, |
||||
|
SEQty = se.Qty, |
||||
|
FixPrice = sa.Price, |
||||
|
ToLocCode = se.ToLoc, |
||||
|
ToErpLocCode = se.ErpToLoc, |
||||
|
SeCustomerPartCode = se.LU, |
||||
|
SeFactoryPartCode = se.FactoryPartCode, |
||||
|
SaCustomerPartCode = sa.LU, |
||||
|
SaFactoryPartCode = sa.PartCode |
||||
|
}); |
||||
|
var saSeCompareRight = (from se in seGroup |
||||
|
join sa in saGroup |
||||
|
on new { se.PN, se.LU } equals new { sa.PN, sa.LU } |
||||
|
into temp |
||||
|
from sa in temp.DefaultIfEmpty() |
||||
|
select new SaSeEdiCompareDiff() |
||||
|
{ |
||||
|
WmsBillNum = se.WmsBillNum, |
||||
|
ShippingDate = se.ShippingDate, |
||||
|
CustomerOfflineTime = sa.SettleDate, |
||||
|
PN = se.PN, |
||||
|
SAQty = sa.Qty, |
||||
|
SEQty = se.Qty, |
||||
|
FixPrice = sa.Price, |
||||
|
ToLocCode = se.ToLoc, |
||||
|
ToErpLocCode = se.ErpToLoc, |
||||
|
SeCustomerPartCode = se.LU, |
||||
|
SeFactoryPartCode = se.FactoryPartCode, |
||||
|
SaCustomerPartCode = sa.LU, |
||||
|
SaFactoryPartCode = sa.PartCode |
||||
|
}); |
||||
|
var saSeCompareFullJoin = saSeCompareLeft.Concat(saSeCompareRight).ToList(); |
||||
|
return saSeCompareFullJoin; |
||||
|
} |
||||
|
#endregion
|
||||
|
} |
||||
|
} |
@ -1,183 +0,0 @@ |
|||||
using System; |
|
||||
using System.Collections.Generic; |
|
||||
using System.Linq; |
|
||||
using Magicodes.ExporterAndImporter.Excel; |
|
||||
using Microsoft.AspNetCore.SignalR; |
|
||||
using SettleAccount.Domain.BQ; |
|
||||
using SettleAccount.Job.SignalR; |
|
||||
using Shouldly; |
|
||||
using TaskJob.EventArgs; |
|
||||
using TaskJob.Interfaces; |
|
||||
using Volo.Abp.BlobStoring; |
|
||||
using Volo.Abp.DependencyInjection; |
|
||||
using Win.Sfs.BaseData.ImportExcelCommon; |
|
||||
using Win.Sfs.SettleAccount; |
|
||||
using Win.Sfs.SettleAccount.Reports; |
|
||||
|
|
||||
namespace SettleAccount.Job.Services.Report |
|
||||
{ |
|
||||
/// <summary>
|
|
||||
/// HBPO结算、Edi、发运对比导出服务
|
|
||||
/// </summary>
|
|
||||
public class JisHBPOSaEdiSeCompareExportService : ITransientDependency, IExportJob |
|
||||
{ |
|
||||
/// <summary>
|
|
||||
/// HubContext
|
|
||||
/// </summary>
|
|
||||
private readonly IHubContext<PageHub> _hubContext; |
|
||||
/// <summary>
|
|
||||
/// 文件容器
|
|
||||
/// </summary>
|
|
||||
private readonly IBlobContainer<MyFileContainer> _fileContainer; |
|
||||
/// <summary>
|
|
||||
/// DbContext
|
|
||||
/// </summary>
|
|
||||
private readonly SettleAccountDbContext _settleAccountDbContext; |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// 构造
|
|
||||
/// </summary>
|
|
||||
public JisHBPOSaEdiSeCompareExportService( |
|
||||
IBlobContainer<MyFileContainer> fileContainer, |
|
||||
SettleAccountDbContext settleAccountDbContext) |
|
||||
{ |
|
||||
_fileContainer = fileContainer; |
|
||||
_settleAccountDbContext = settleAccountDbContext; |
|
||||
} |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// 导出
|
|
||||
/// </summary>
|
|
||||
public string ExportFile(Guid id, List<string> exportName, List<CustomCondition> property) |
|
||||
{ |
|
||||
var version = property.Where(p => p.Name == "Version").FirstOrDefault().Value; |
|
||||
var lu = property.Where(p => p.Name == "LU").FirstOrDefault().Value; |
|
||||
var pn = property.Where(p => p.Name == "PN").FirstOrDefault().Value; |
|
||||
var strSeStartDateTime = property.Where(p => p.Name == "SeStartDateTime").FirstOrDefault().Value; |
|
||||
var strSeEndDateTime = property.Where(p => p.Name == "SeEndDateTime").FirstOrDefault().Value; |
|
||||
|
|
||||
var seStartDateTime = DateTime.Parse(strSeStartDateTime); |
|
||||
var seEndDateTime = DateTime.Parse(strSeEndDateTime); |
|
||||
var filename = exportName.FirstOrDefault(); |
|
||||
|
|
||||
//有EDI无发运
|
|
||||
var haveEdiNotHaveSeList = _settleAccountDbContext.Set<BBAC_SE_EDI>().Where(t => t.IsHaveSeData == false) |
|
||||
.GroupBy(t => new { t.LU, t.PN }) |
|
||||
.Select(t => new JisHBPOEidSeCompareExport() |
|
||||
{ |
|
||||
Category = "JIS", |
|
||||
CarModeCode = default, |
|
||||
LineStationcode = default, |
|
||||
SequenceNumber = t.Max(t => t.SeqNumber), |
|
||||
ParType = "01", |
|
||||
EdiQty = t.Sum(t => t.Qty), |
|
||||
AssemblyDate = default, |
|
||||
MatchNumber = default, |
|
||||
MateType = "否", |
|
||||
DiffDesc = "WMS漏发货EDI有订单" |
|
||||
}).ToList(); |
|
||||
//无EDI有发运
|
|
||||
var notHaveEdiHaveSeList = _settleAccountDbContext.Set<BBAC_SE_DETAIL>().Where(t => t.IsHaveEdiData == false) |
|
||||
.GroupBy(t => new { t.LU, t.PN }) |
|
||||
.Select(t => new JisHBPOEidSeCompareExport() |
|
||||
{ |
|
||||
Category = "JIS", |
|
||||
WmsBillNum = t.Max(t => t.BillNum), |
|
||||
MESConfigCode = t.Max(t => t.MESConfigCode), |
|
||||
ShippingDate = t.Max(t => t.BillTime), |
|
||||
PN = t.Max(t => t.PN), |
|
||||
Seq = t.Max(t => t.Seq), |
|
||||
PjsNum = t.Max(t => t.PjsNum), |
|
||||
ToLoc = t.Max(t => t.ToLoc), |
|
||||
ErpToLoc = t.Max(t => t.ErpToLoc), |
|
||||
MaterialNumber = t.Max(t => t.CustPartCode), |
|
||||
MaterialDes = t.Max(t => t.PartDesc), |
|
||||
SEQty = t.Sum(t => t.Qty), |
|
||||
InjectionCode = t.Max(t => t.InjectionCode), |
|
||||
MateType = "否", |
|
||||
DiffDesc = "WMS有发货EDI无订单" |
|
||||
}).ToList(); |
|
||||
//有EDI有发运
|
|
||||
var ediGroup = from edi in _settleAccountDbContext.Set<BBAC_SE_EDI>() |
|
||||
where edi.IsDeleted == false && edi.IsHaveSeData == true |
|
||||
group edi by new { edi.PN, edi.LU } into groupItem |
|
||||
select new |
|
||||
{ |
|
||||
groupItem.Key.PN, |
|
||||
groupItem.Key.LU, |
|
||||
Qty = groupItem.Sum(t => t.Qty), |
|
||||
SeqNumber = groupItem.Max(t => t.SeqNumber) |
|
||||
}; |
|
||||
var seGroup = from se in _settleAccountDbContext.Set<BBAC_SE_DETAIL>() |
|
||||
where se.IsHaveEdiData == true && se.AssembleData >= seStartDateTime && se.AssembleData <= seEndDateTime |
|
||||
group se by new { se.PN, se.LU } into groupItem |
|
||||
select new |
|
||||
{ |
|
||||
groupItem.Key.PN, |
|
||||
groupItem.Key.LU, |
|
||||
Qty = groupItem.Sum(t => t.Qty), |
|
||||
BillNum = groupItem.Max(t => t.BillNum), |
|
||||
MESConfigCode = groupItem.Max(t => t.MESConfigCode), |
|
||||
BillTime = groupItem.Max(t => t.BillTime), |
|
||||
Seq = groupItem.Max(t => t.Seq), |
|
||||
PjsNum = groupItem.Max(t => t.PjsNum), |
|
||||
ToLoc = groupItem.Max(t => t.ToLoc), |
|
||||
ErpToLoc = groupItem.Max(t => t.ErpToLoc), |
|
||||
CustPartCode = groupItem.Max(t => t.CustPartCode), |
|
||||
PartDesc = groupItem.Max(t => t.PartDesc), |
|
||||
InjectionCode = groupItem.Max(t => t.InjectionCode) |
|
||||
}; |
|
||||
var haveEdiHaveSeList = (from edi in ediGroup |
|
||||
join se in seGroup |
|
||||
on new { edi.PN, edi.LU } equals new { se.PN, se.LU } |
|
||||
select new JisHBPOEidSeCompareExport() |
|
||||
{ |
|
||||
Category = "JIS", |
|
||||
WmsBillNum = se.BillNum, |
|
||||
CarModeCode = default, |
|
||||
LineStationcode = default, |
|
||||
SequenceNumber = edi.SeqNumber, |
|
||||
ParType = "01", |
|
||||
MESConfigCode = se.MESConfigCode, |
|
||||
ShippingDate = se.BillTime, |
|
||||
PN = se.PN, |
|
||||
Seq = se.Seq, |
|
||||
PjsNum = se.PjsNum, |
|
||||
ToLoc = se.ToLoc, |
|
||||
ErpToLoc = se.ErpToLoc, |
|
||||
MaterialNumber = se.CustPartCode, |
|
||||
MaterialDes = se.PartDesc, |
|
||||
SEQty = se.Qty, |
|
||||
EdiQty = edi.Qty, |
|
||||
AssemblyDate = default, |
|
||||
MatchNumber = default, |
|
||||
InjectionCode = se.InjectionCode, |
|
||||
MateType = se.Qty == edi.Qty ? "是" : "否", |
|
||||
DiffDesc = "WMS有发货EDI有订单" |
|
||||
}).ToList(); |
|
||||
|
|
||||
haveEdiNotHaveSeList.AddRange(haveEdiHaveSeList); |
|
||||
notHaveEdiHaveSeList.AddRange(haveEdiHaveSeList); |
|
||||
|
|
||||
ExcelExporter excelExporter = new ExcelExporter(); |
|
||||
excelExporter |
|
||||
.Append(haveEdiNotHaveSeList, $"HBPOEDI数据和发货对比") |
|
||||
.SeparateBySheet() |
|
||||
.Append(notHaveEdiHaveSeList, $"HBPO发货和EDI数据对比"); |
|
||||
|
|
||||
var result = excelExporter.ExportAppendDataAsByteArray(); |
|
||||
result.ShouldNotBeNull(); |
|
||||
_fileContainer.SaveAsync(filename, result.Result, true); |
|
||||
|
|
||||
Notify(); |
|
||||
return id.ToString(); |
|
||||
} |
|
||||
|
|
||||
#region 私有方法
|
|
||||
private void Notify() |
|
||||
{ |
|
||||
this._hubContext.Clients.All.ServerToClient("SaSeCompare", "refresh", ""); |
|
||||
} |
|
||||
#endregion
|
|
||||
} |
|
||||
} |
|
@ -0,0 +1,179 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
using System.Linq; |
||||
|
using Microsoft.AspNetCore.SignalR; |
||||
|
using Microsoft.OpenApi.Extensions; |
||||
|
using SettleAccount.Domain.BQ; |
||||
|
using SettleAccount.Job.SignalR; |
||||
|
using Shouldly; |
||||
|
using TaskJob.EventArgs; |
||||
|
using TaskJob.Interfaces; |
||||
|
using Volo.Abp.BlobStoring; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.ObjectMapping; |
||||
|
using Win.Sfs.BaseData.ImportExcelCommon; |
||||
|
using Win.Sfs.SettleAccount; |
||||
|
using Win.Sfs.SettleAccount.Reports; |
||||
|
|
||||
|
namespace SettleAccount.Job.Services.Report |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// HBPO结算、发运、Edi对比导出服务
|
||||
|
/// </summary>
|
||||
|
public class JisHBPOSaSeEdiCompareExportService : SaSeEdiCompareExportBaseService, ITransientDependency, IExportJob |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 业务类型
|
||||
|
/// </summary>
|
||||
|
private readonly EnumBusinessType businessType = EnumBusinessType.JisHBPO; |
||||
|
/// <summary>
|
||||
|
/// 文件容器
|
||||
|
/// </summary>
|
||||
|
private readonly IBlobContainer<MyFileContainer> _fileContainer; |
||||
|
/// <summary>
|
||||
|
/// AutoMapper
|
||||
|
/// </summary>
|
||||
|
private readonly IObjectMapper _objectMapper; |
||||
|
/// <summary>
|
||||
|
/// DbContext
|
||||
|
/// </summary>
|
||||
|
private readonly SettleAccountDbContext _settleAccountDbContext; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 构造
|
||||
|
/// </summary>
|
||||
|
public JisHBPOSaSeEdiCompareExportService( |
||||
|
IHubContext<PageHub> hubContext, |
||||
|
IBlobContainer<MyFileContainer> fileContainer, |
||||
|
IObjectMapper objectMapper, |
||||
|
SettleAccountDbContext settleAccountDbContext) : base(hubContext) |
||||
|
{ |
||||
|
_fileContainer = fileContainer; |
||||
|
_objectMapper = objectMapper; |
||||
|
_settleAccountDbContext = settleAccountDbContext; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 导出
|
||||
|
/// </summary>
|
||||
|
public string ExportFile(Guid id, List<string> exportName, List<CustomCondition> property) |
||||
|
{ |
||||
|
var version = property.Where(p => p.Name == "Version").FirstOrDefault().Value; |
||||
|
var lu = property.Where(p => p.Name == "LU").FirstOrDefault().Value; |
||||
|
var pn = property.Where(p => p.Name == "PN").FirstOrDefault().Value; |
||||
|
var strSeStartDateTime = property.Where(p => p.Name == "SeStartDateTime").FirstOrDefault().Value; |
||||
|
var strSeEndDateTime = property.Where(p => p.Name == "SeEndDateTime").FirstOrDefault().Value; |
||||
|
|
||||
|
var businessTypeDisplayName = businessType.GetAttributeOfType<DisplayAttribute>()?.Name ?? businessType.ToString(); |
||||
|
var seStartDateTime = DateTime.Parse(strSeStartDateTime); |
||||
|
var seEndDateTime = DateTime.Parse(strSeEndDateTime); |
||||
|
var filename = exportName.FirstOrDefault(); |
||||
|
|
||||
|
var ediSeSaCompareDiffs = GetEdiSeSaCompareData(int.Parse(version), seStartDateTime, seEndDateTime); |
||||
|
|
||||
|
HandleSaSeEdiCompareDiffList(ediSeSaCompareDiffs); |
||||
|
|
||||
|
if (string.IsNullOrEmpty(lu) == false) |
||||
|
{ |
||||
|
ediSeSaCompareDiffs = ediSeSaCompareDiffs.FindAll(p => p.CustomerPartCode == lu); |
||||
|
} |
||||
|
if (string.IsNullOrEmpty(pn) == false) |
||||
|
{ |
||||
|
ediSeSaCompareDiffs = ediSeSaCompareDiffs.FindAll(p => p.PN == pn); |
||||
|
} |
||||
|
ediSeSaCompareDiffs = ediSeSaCompareDiffs.OrderBy(t => t.Category).ToList(); |
||||
|
|
||||
|
var items = _objectMapper.Map<List<SaSeEdiCompareDiff>, List<SaSeEdiCompareDetailExportJisBBAC>>(ediSeSaCompareDiffs); |
||||
|
var excelExporter = BindExcelExporter<SaSeEdiCompareDetailExportJisBBAC>(items, businessTypeDisplayName); |
||||
|
|
||||
|
var result = excelExporter.ExportAppendDataAsByteArray(); |
||||
|
result.ShouldNotBeNull(); |
||||
|
_fileContainer.SaveAsync(filename, result.Result, true); |
||||
|
|
||||
|
Notify(); |
||||
|
return id.ToString(); |
||||
|
} |
||||
|
|
||||
|
#region 私有方法
|
||||
|
/// <summary>
|
||||
|
/// 获取结算与发运比对数据
|
||||
|
/// </summary>
|
||||
|
public List<SaSeEdiCompareDiff> GetEdiSeSaCompareData(int version, DateTime seStartDateTime, DateTime seEndDateTime) |
||||
|
{ |
||||
|
//结算
|
||||
|
var saGroup = from sa in _settleAccountDbContext.Set<HBPO_SA_DETAIL>() |
||||
|
where sa.BusinessType == businessType && sa.Version == version |
||||
|
group sa by new { sa.PN, sa.LU } into groupItem |
||||
|
select new |
||||
|
{ |
||||
|
groupItem.Key.PN, |
||||
|
groupItem.Key.LU, |
||||
|
Qty = groupItem.Sum(t => t.Qty), |
||||
|
Price = groupItem.Max(t => t.Price), |
||||
|
SettleDate = groupItem.Max(t => t.SettleDate), |
||||
|
PartCode = groupItem.Max(t => t.PartCode), |
||||
|
}; |
||||
|
//发运
|
||||
|
var seGroup = from se in _settleAccountDbContext.Set<HBPO_SE_DETAIL>() |
||||
|
where se.BusinessType == businessType && se.BillTime >= seStartDateTime && se.BillTime <= seEndDateTime |
||||
|
group se by new { se.PN, se.LU } into groupItem |
||||
|
select new |
||||
|
{ |
||||
|
groupItem.Key.PN, |
||||
|
groupItem.Key.LU, |
||||
|
Qty = groupItem.Sum(t => t.Qty), |
||||
|
WmsBillNum = groupItem.Max(t => t.WmsBillNum), |
||||
|
ShippingDate = groupItem.Max(t => t.ShippingDate), |
||||
|
FactoryPartCode = groupItem.Max(t => t.FactoryPartCode), |
||||
|
ToLoc = groupItem.Max(t => t.ToLoc), |
||||
|
ErpToLoc = groupItem.Max(t => t.ErpToLoc) |
||||
|
}; |
||||
|
var saSeCompareLeft = (from sa in saGroup |
||||
|
join se in seGroup |
||||
|
on new { sa.PN, sa.LU } equals new { se.PN, se.LU } |
||||
|
into temp |
||||
|
from se in temp.DefaultIfEmpty() |
||||
|
select new SaSeEdiCompareDiff() |
||||
|
{ |
||||
|
WmsBillNum = se.WmsBillNum, |
||||
|
ShippingDate = se.ShippingDate, |
||||
|
CustomerOfflineTime = sa.SettleDate, |
||||
|
PN = sa.PN, |
||||
|
SAQty = sa.Qty, |
||||
|
SEQty = se.Qty, |
||||
|
FixPrice = sa.Price, |
||||
|
ToLocCode = se.ToLoc, |
||||
|
ToErpLocCode = se.ErpToLoc, |
||||
|
SeCustomerPartCode = se.LU, |
||||
|
SeFactoryPartCode = se.FactoryPartCode, |
||||
|
SaCustomerPartCode = sa.LU, |
||||
|
SaFactoryPartCode = sa.PartCode |
||||
|
}); |
||||
|
var saSeCompareRight = (from se in seGroup |
||||
|
join sa in saGroup |
||||
|
on new { se.PN, se.LU } equals new { sa.PN, sa.LU } |
||||
|
into temp |
||||
|
from sa in temp.DefaultIfEmpty() |
||||
|
select new SaSeEdiCompareDiff() |
||||
|
{ |
||||
|
WmsBillNum = se.WmsBillNum, |
||||
|
ShippingDate = se.ShippingDate, |
||||
|
CustomerOfflineTime = sa.SettleDate, |
||||
|
PN = se.PN, |
||||
|
SAQty = sa.Qty, |
||||
|
SEQty = se.Qty, |
||||
|
FixPrice = sa.Price, |
||||
|
ToLocCode = se.ToLoc, |
||||
|
ToErpLocCode = se.ErpToLoc, |
||||
|
SeCustomerPartCode = se.LU, |
||||
|
SeFactoryPartCode = se.FactoryPartCode, |
||||
|
SaCustomerPartCode = sa.LU, |
||||
|
SaFactoryPartCode = sa.PartCode |
||||
|
}); |
||||
|
var saSeCompareFullJoin = saSeCompareLeft.Concat(saSeCompareRight).ToList(); |
||||
|
return saSeCompareFullJoin; |
||||
|
} |
||||
|
#endregion
|
||||
|
} |
||||
|
} |
@ -0,0 +1,141 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using Magicodes.ExporterAndImporter.Excel; |
||||
|
using Microsoft.AspNetCore.SignalR; |
||||
|
using SettleAccount.Job.SignalR; |
||||
|
using Win.Sfs.SettleAccount.Enums; |
||||
|
using Win.Sfs.SettleAccount.Reports; |
||||
|
|
||||
|
namespace SettleAccount.Job.Services.Report |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 结算、发运、Eid比对导出基础服务
|
||||
|
/// </summary>
|
||||
|
public class SaSeEdiCompareExportBaseService |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// HubContext
|
||||
|
/// </summary>
|
||||
|
private readonly IHubContext<PageHub> _hubContext; |
||||
|
|
||||
|
public SaSeEdiCompareExportBaseService(IHubContext<PageHub> hubContext) |
||||
|
{ |
||||
|
_hubContext = hubContext; |
||||
|
} |
||||
|
|
||||
|
public virtual void HandleSaSeEdiCompareDiffList(List<SaSeEdiCompareDiff> ediSeSaCompareDiffs) |
||||
|
{ |
||||
|
ediSeSaCompareDiffs.ForEach(p => |
||||
|
{ |
||||
|
p.Category = (string.IsNullOrEmpty(p.SaCustomerPartCode), string.IsNullOrEmpty(p.SeCustomerPartCode), string.IsNullOrEmpty(p.EdiCustomerPartCode)) switch |
||||
|
{ |
||||
|
(false, false, false) => EnumSaSeEdiCompareCategory.HaveSaHaveSeHaveEdi, |
||||
|
(false, false, true) => EnumSaSeEdiCompareCategory.HaveSaHaveSeNotHaveEdi, |
||||
|
(false, true, false) => EnumSaSeEdiCompareCategory.HaveSaNotHaveSeHaveEdi, |
||||
|
(false, true, true) => EnumSaSeEdiCompareCategory.HaveSaNotHaveSeNotHaveEdi, |
||||
|
(true, false, false) => EnumSaSeEdiCompareCategory.NotHaveSaHaveSeHaveEdi, |
||||
|
(true, false, true) => EnumSaSeEdiCompareCategory.NotHaveSaHaveSeNotHaveEdi, |
||||
|
_ => EnumSaSeEdiCompareCategory.None, |
||||
|
}; |
||||
|
switch (p.Category) |
||||
|
{ |
||||
|
case EnumSaSeEdiCompareCategory.HaveSaHaveSeHaveEdi: |
||||
|
case EnumSaSeEdiCompareCategory.HaveSaHaveSeNotHaveEdi: |
||||
|
case EnumSaSeEdiCompareCategory.HaveSaNotHaveSeHaveEdi: |
||||
|
case EnumSaSeEdiCompareCategory.HaveSaNotHaveSeNotHaveEdi: |
||||
|
{ |
||||
|
p.CustomerPartCode = p.SaCustomerPartCode; |
||||
|
p.FactoryPartCode = p.SaFactoryPartCode; |
||||
|
p.ReplaceFactoryPartCode = p.SaFactoryPartCode; |
||||
|
} |
||||
|
break; |
||||
|
case EnumSaSeEdiCompareCategory.NotHaveSaHaveSeHaveEdi: |
||||
|
case EnumSaSeEdiCompareCategory.NotHaveSaHaveSeNotHaveEdi: |
||||
|
{ |
||||
|
p.CustomerPartCode = p.SeCustomerPartCode; |
||||
|
p.FactoryPartCode = p.SeFactoryPartCode; |
||||
|
p.ReplaceFactoryPartCode = p.SeFactoryPartCode; |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 创建导出文件结构
|
||||
|
/// </summary>
|
||||
|
public ExcelExporter BindExcelExporter<T>(List<T> pubSaSeCompareDetailExports, string businessTypeDisplayName) where T : SaSeEdiCompareDetailExport, ISaSeEdiCompareDetailExport, new() |
||||
|
{ |
||||
|
//汇总
|
||||
|
var pubSaSeCompareSumExports = pubSaSeCompareDetailExports.GroupBy(p => p.ReplaceFactoryPartCode).Select(p => new SaSeEdiCompareSumExport() |
||||
|
{ |
||||
|
FactoryPartCode = p.Key, |
||||
|
PartCodeDesc = p.FirstOrDefault().PartCodeDesc, |
||||
|
SAQty = p.Sum(t => t.SAQty), |
||||
|
SEQty = p.Sum(t => t.SEQty), |
||||
|
EdiQty = p.Sum(t => t.EdiQty) |
||||
|
}).ToList(); |
||||
|
|
||||
|
//有结算有发运
|
||||
|
var haveSaHaveSeExports = pubSaSeCompareDetailExports.FindAll(t => new EnumSaSeEdiCompareCategory[] { EnumSaSeEdiCompareCategory.HaveSaHaveSeHaveEdi, EnumSaSeEdiCompareCategory.HaveSaHaveSeNotHaveEdi }.Contains(t.Category)); |
||||
|
//有结算有发运汇总
|
||||
|
var haveSaHaveSeSumExports = haveSaHaveSeExports.GroupBy(p => p.ReplaceFactoryPartCode).Select(p => new SaSeEdiCompareSumExport() |
||||
|
{ |
||||
|
FactoryPartCode = p.Key, |
||||
|
PartCodeDesc = p.FirstOrDefault().PartCodeDesc, |
||||
|
SAQty = p.Sum(t => t.SAQty), |
||||
|
SEQty = p.Sum(t => t.SEQty), |
||||
|
EdiQty = p.Sum(t => t.EdiQty) |
||||
|
}).ToList(); |
||||
|
//有结算无发运
|
||||
|
var haveSaNotHaveSeExports = pubSaSeCompareDetailExports.FindAll(t => new EnumSaSeEdiCompareCategory[] { EnumSaSeEdiCompareCategory.HaveSaNotHaveSeHaveEdi, EnumSaSeEdiCompareCategory.HaveSaNotHaveSeNotHaveEdi }.Contains(t.Category)); |
||||
|
//有结算无发运
|
||||
|
var haveSaNotHaveSeSumExports = haveSaNotHaveSeExports.GroupBy(p => p.ReplaceFactoryPartCode).Select(p => new SaSeEdiCompareSumExport() |
||||
|
{ |
||||
|
FactoryPartCode = p.Key, |
||||
|
PartCodeDesc = p.FirstOrDefault().PartCodeDesc, |
||||
|
SAQty = p.Sum(t => t.SAQty), |
||||
|
SEQty = p.Sum(t => t.SEQty), |
||||
|
EdiQty = p.Sum(t => t.EdiQty) |
||||
|
}).ToList(); |
||||
|
//无结算有发运
|
||||
|
var notHaveSaHaveSeExports = pubSaSeCompareDetailExports.FindAll(t => new EnumSaSeEdiCompareCategory[] { EnumSaSeEdiCompareCategory.NotHaveSaHaveSeHaveEdi, EnumSaSeEdiCompareCategory.NotHaveSaHaveSeNotHaveEdi }.Contains(t.Category)); |
||||
|
//无结算有发运
|
||||
|
var notHaveSaHaveSeSumExports = notHaveSaHaveSeExports.GroupBy(p => p.ReplaceFactoryPartCode).Select(p => new SaSeEdiCompareSumExport() |
||||
|
{ |
||||
|
FactoryPartCode = p.Key, |
||||
|
PartCodeDesc = p.FirstOrDefault().PartCodeDesc, |
||||
|
SAQty = p.Sum(t => t.SAQty), |
||||
|
SEQty = p.Sum(t => t.SEQty), |
||||
|
EdiQty = p.Sum(t => t.EdiQty) |
||||
|
}).ToList(); |
||||
|
|
||||
|
ExcelExporter excelExporter = new ExcelExporter(); |
||||
|
return excelExporter |
||||
|
.Append(pubSaSeCompareDetailExports, $"{businessTypeDisplayName}结算核对明细输出") |
||||
|
.SeparateBySheet() |
||||
|
.Append(pubSaSeCompareSumExports, $"{businessTypeDisplayName}结算核对汇总输出") |
||||
|
.SeparateBySheet() |
||||
|
|
||||
|
.Append(haveSaHaveSeExports, $"{businessTypeDisplayName}有结算有发货明细输出") |
||||
|
.SeparateBySheet() |
||||
|
.Append(haveSaHaveSeSumExports, $"{businessTypeDisplayName}有结算有发货汇总输出") |
||||
|
.SeparateBySheet() |
||||
|
|
||||
|
.Append(haveSaNotHaveSeExports, $"{businessTypeDisplayName}有结算无发货明细输出") |
||||
|
.SeparateBySheet() |
||||
|
.Append(haveSaNotHaveSeSumExports, $"{businessTypeDisplayName}有结算无发货汇总输出"); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 通知
|
||||
|
/// </summary>
|
||||
|
public virtual void Notify() |
||||
|
{ |
||||
|
_hubContext.Clients.All.ServerToClient("SaSeCompare", "refresh", ""); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
Loading…
Reference in new issue