From 29fad239f4304243bc4ae9c0f4f1a79930fcac94 Mon Sep 17 00:00:00 2001 From: mahao Date: Thu, 3 Aug 2023 10:20:06 +0800 Subject: [PATCH] =?UTF-8?q?JisHBPO=E7=BB=93=E7=AE=97=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entities/BQ/Dtos/HBPO_SA_DTO.cs | 2 +- .../Entities/BQ/Dtos/PUB_SA_DTO.cs | 44 +++ .../Entities/BQ/HBPO_SA_SERVICE.cs | 285 ++++++++++++++++-- .../Entities/BQ/PUB_SA_SERVICE.cs | 32 +- ...ttleAccountApplicationAutoMapperProfile.cs | 1 + 5 files changed, 343 insertions(+), 21 deletions(-) diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/HBPO_SA_DTO.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/HBPO_SA_DTO.cs index a4523b04..d1b2da11 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/HBPO_SA_DTO.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/HBPO_SA_DTO.cs @@ -60,7 +60,7 @@ public class HBPO_SA_DETAIL_IMPORT_DTO /// /// 结算日期 /// - [Display(Name = "结算日期")] + [Display(Name = "ReceiveDate")] [ImporterHeader(Name = "ReceiveDate", Format = "yyyy/MM/dd HH:mm:ss")] public DateTime SettleDate { set; get; } diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/PUB_SA_DTO.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/PUB_SA_DTO.cs index 926de242..777f59b6 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/PUB_SA_DTO.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Application.Contracts/Entities/BQ/Dtos/PUB_SA_DTO.cs @@ -145,6 +145,50 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Dtos public string GroupNum { get; set; } } + /// + /// 买单件HBPO导入 + /// + public class MaiDanJianHBPOImportDto + { + /// + /// 结算日期 + /// + [Display(Name = "买单日期")] + [ImporterHeader(Name = "买单日期")] + public DateTime SettleDate { set; get; } + + /// + /// 零件号 + /// + [Display(Name = "零件号")] + [Required(ErrorMessage = "{0}不能为空")] + [ImporterHeader(Name = "零件号")] + public string LU { get; set; } + + /// + /// 生产号 + /// + [Display(Name = "现产品生产号")] + [ImporterHeader(Name = "现产品生产号")] + [Required(ErrorMessage = "{0}不能为空")] + public string PN { get; set; } + + /// + /// 数量 + /// + [Display(Name = "数量")] + [ImporterHeader(Name = "数量")] + public decimal Qty { get; set; } + + /// + /// 结算分组号 + /// + [Display(Name = "五联单号")] + [ImporterHeader(Name = "五联单号")] + [Required(ErrorMessage = "{0}不能为空")] + public string GroupNum { get; set; } + } + /// /// 备件导入 /// diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/HBPO_SA_SERVICE.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/HBPO_SA_SERVICE.cs index 187cf6f4..dc287b5c 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/HBPO_SA_SERVICE.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/HBPO_SA_SERVICE.cs @@ -1,28 +1,26 @@ +using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; using SettleAccount.Domain.BQ; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Domain.Repositories; using Volo.Abp; -using Win.Sfs.SettleAccount.Entities.BQ.Dtos; +using Volo.Abp.Application.Dtos; using Volo.Abp.Caching; using Win.Abp.Snowflakes; using Win.Sfs.BaseData.ImportExcelCommon; -using Win.Sfs.SettleAccount.CommonManagers; -using Win.Sfs.SettleAccount.Entities.Prices; -using Win.Sfs.SettleAccount.MaterialRelationships; -using Win.Sfs.Shared.RepositoryBase; -using System; -using System.Linq; -using Microsoft.AspNetCore.Http; using Win.Sfs.SettleAccount.Bases; +using Win.Sfs.SettleAccount.CommonManagers; using Win.Sfs.SettleAccount.Constant; +using Win.Sfs.SettleAccount.Entities.BQ.Dtos; +using Win.Sfs.SettleAccount.Entities.Prices; using Win.Sfs.SettleAccount.ExcelImporter; using Win.Sfs.SettleAccount.ExportReports; -using OfficeOpenXml; -using OfficeOpenXml.Core; +using Win.Sfs.SettleAccount.MaterialRelationships; +using Win.Sfs.Shared.RepositoryBase; namespace Win.Sfs.SettleAccount.Entities.BQ; @@ -73,6 +71,11 @@ public class HBPO_SA_SERVICE : SettleAccountApplicationBase /// private readonly INormalEfCoreRepository _tbRePartsRelationshipRepository; + /// + /// 业务类型 + /// + private readonly EnumBusinessType _businessType = EnumBusinessType.JisHBPO; + /// /// 构造 /// @@ -142,12 +145,19 @@ public class HBPO_SA_SERVICE : SettleAccountApplicationBase #region 导入数据转换、数据校验 ExportImporter _exportImporter = new ExportImporter(); var result = await _exportImporter.UploadExcelImport(files, _excelImportService); - var importPubSaDetails = ObjectMapper.Map, List>(result); + var importHBOPSaDetails = ObjectMapper.Map, List>(result); + //Site包含CN1 亦庄 + //Site包含CN5 顺义 + var importCN1HBOPSaDetails = importHBOPSaDetails.FindAll(t => t.Site.Contains("CN1")); + var importCN5HBOPSaDetails = importHBOPSaDetails.FindAll(t => t.Site.Contains("CN5")); + + await SaDataHandleAsync(importCN1HBOPSaDetails, "CN1"); + await SaDataHandleAsync(importCN5HBOPSaDetails, "CN5"); return ""; //结算分组号 - var hbpoSaGroupNums = importPubSaDetails.Select(t => t.GroupNum).Distinct(); + var hbpoSaGroupNums = importHBOPSaDetails.Select(t => t.GroupNum).Distinct(); //已存在的结算分组号 var havPubSaGroupNums = (await _hbpoSaDetailRepository.GetListAsync(t => hbpoSaGroupNums.Contains(t.GroupNum))).Select(t => t.GroupNum).Distinct(); @@ -166,12 +176,11 @@ public class HBPO_SA_SERVICE : SettleAccountApplicationBase } #endregion - #region 处理结算数据 //销售价格 var priceListEntitys = await _priceListRepository.GetAllAsync(); - importPubSaDetails.ForEach(importPubSaDetail => + importHBOPSaDetails.ForEach(importPubSaDetail => { List luList = importPubSaDetail.LU.Split(" ").ToList(); importPubSaDetail.LU = luList[0].Replace(" ", ""); @@ -193,7 +202,7 @@ public class HBPO_SA_SERVICE : SettleAccountApplicationBase }); //导入的零件号集合 - var importPubSaLUs = importPubSaDetails.Select(t => t.LU).Distinct(); + var importPubSaLUs = importHBOPSaDetails.Select(t => t.LU).Distinct(); var materialRelationshipEntitys = await _materialRelationshipRepository.GetListAsync(t => importPubSaLUs.Contains(t.SettleMaterialCode)); var materialRelationshipEntitySettleMaterialCodes = materialRelationshipEntitys.Select(t => t.SettleMaterialCode).Distinct(); @@ -213,7 +222,7 @@ public class HBPO_SA_SERVICE : SettleAccountApplicationBase #region 入库数据赋值 //结算明细 - hbpoSaDetails = importPubSaDetails; + hbpoSaDetails = importHBOPSaDetails; //不可结算 结算分组号码(根据价格区分结算、不可结算) var hbpoNotSaGroupNums = hbpoSaDetails.FindAll(t => t.Price == default(decimal)).Select(t => t.GroupNum).Distinct(); @@ -329,5 +338,245 @@ public class HBPO_SA_SERVICE : SettleAccountApplicationBase } } + + /// + /// 删除 + /// + [HttpPost] + public async Task DeleteListAsync(List ids) + { + //结算主表 + List hbpoSas = new List(); + //结算明细 + List hbpoSaDetails = new List(); + //可结算主表 + List hbpoCanSas = new List(); + //可结算明细 + List hbpoCanSaDetails = new List(); + //不可结算 + List hbpoNotSaDetails = new List(); + + foreach (var id in ids) + { + try + { + var hbpoSaDelItems = await GetHBPOSaDelItemsAsync(id); + + hbpoSas.AddRange(hbpoSaDelItems.hbpoSas); + hbpoSaDetails.AddRange(hbpoSaDelItems.hbpoSaDetails); + hbpoCanSas.AddRange(hbpoSaDelItems.hbpoCanSas); + hbpoCanSaDetails.AddRange(hbpoSaDelItems.hbpoCanSaDetails); + hbpoNotSaDetails.AddRange(hbpoSaDelItems.hbpoNotSaDetails); + } + catch (Exception) + { + throw; + } + } + + //删除 + if (hbpoSas.Any()) + { + await _hbpoSaRepository.DeleteManyAsync(hbpoSas); + } + if (hbpoSaDetails.Any()) + { + await _hbpoSaDetailRepository.DeleteManyAsync(hbpoSaDetails); + } + if (hbpoCanSas.Any()) + { + await _hbpoCanSaRepository.DeleteManyAsync(hbpoCanSas); + } + if (hbpoCanSaDetails.Any()) + { + await _hbpoCanSaDetailRepository.DeleteManyAsync(hbpoCanSaDetails); + } + if (hbpoNotSaDetails.Any()) + { + await _hbpoNotSaDetailRepository.DeleteManyAsync(hbpoNotSaDetails); + } + } + #endregion + + #region 私有方法 + /// + /// 结算数据处理 + /// + private async Task SaDataHandleAsync(List hbpoSaDetails, string site) + { + //数据校验 + var checkList = new List(); + //结算单号 + var hbpoSaBillNum = OrderNumberGenerator.GenerateOrderNumber("SA"); + //结算主表 + var hbpoSa = new HBPO_SA() + { + BillNum = hbpoSaBillNum, + State = "1", + BusinessType = _businessType, + Site = site, + }; + //可结算单号 + var hbpoCanSaBillNum = OrderNumberGenerator.GenerateOrderNumber("C"); + //可结算主表 + var hbpoCanSa = new HBPO_CAN_SA() + { + BillNum = hbpoCanSaBillNum, + SettleBillNum = hbpoSaBillNum, + State = SettleBillState.未结状态, + BusinessType = _businessType, + Site = site, + }; + //可结算明细 + var hbpoCanSaDetails = new List(); + //不可结算明细 + var hbpoNotSaDetails = new List(); + //客户零件关系 + var materialRelationships = new List(); + + #region 数据校验 + //结算分组号 + var hbpoSaGroupNums = hbpoSaDetails.Select(t => t.GroupNum).Distinct(); + + //已存在的结算分组号 + var havPubSaGroupNums = (await _hbpoSaDetailRepository.GetListAsync(t => hbpoSaGroupNums.Contains(t.GroupNum))).Select(t => t.GroupNum).Distinct(); + if (havPubSaGroupNums.Any() == true) + { + foreach (var item in havPubSaGroupNums) + { + checkList.Add(new ErrorExportDto(string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, $"结算分组号{item}已存在", string.Empty)); + } + } + + if (checkList.Count > 0) + { + return await ExportErrorReportAsync(checkList); + } + #endregion + + #region 处理结算数据 + //销售价格 + var priceListEntitys = await _priceListRepository.GetAllAsync(); + + hbpoSaDetails.ForEach(hbpoSaDetail => + { + List luList = hbpoSaDetail.LU.Split(" ").ToList(); + hbpoSaDetail.LU = luList[0].Replace(" ", ""); + if (luList.Count > 1) + { + luList.RemoveAt(0); + var luAssemble = luList.Select(t => t.Replace(" ", "")); + hbpoSaDetail.LU += luAssemble.Aggregate(" ", (current, index) => current + index); + } + + hbpoSaDetail.BillNum = hbpoSaBillNum; + hbpoSaDetail.KeyCode = hbpoSaDetail.PN + hbpoSaDetail.LU; + + //根据物料号、结算日期获取价格 + var priceListEntity = priceListEntitys.Find(t => t.LU == hbpoSaDetail.LU && hbpoSaDetail.SettleDate > t.BeginTime && hbpoSaDetail.SettleDate < t.EndTime); + hbpoSaDetail.Price = priceListEntity?.Price ?? default; + hbpoSaDetail.BusinessType = _businessType; + }); + + //导入的零件号集合 + var importPubSaLUs = hbpoSaDetails.Select(t => t.LU).Distinct(); + var materialRelationshipEntitys = await _materialRelationshipRepository.GetListAsync(t => importPubSaLUs.Contains(t.SettleMaterialCode)); + var materialRelationshipEntitySettleMaterialCodes = materialRelationshipEntitys.Select(t => t.SettleMaterialCode).Distinct(); + + /* + * (不存在的客户零件号)差集 + * 转换为厂内零件号 + * 转换规则6个空格替换成“-” + */ + var noExistSettleMaterialCodes = importPubSaLUs.Except(materialRelationshipEntitySettleMaterialCodes); + + noExistSettleMaterialCodes.ForEach(t => + { + var materialRelationship = new MaterialRelationship(GuidGenerator.Create(), t.Replace(" ", "-"), "", t, _businessType.ToString()); + materialRelationships.Add(materialRelationship); + }); + #endregion + + #region 入库数据赋值 + //根据价格区分结算、不可结算 + var hbpoSaDetailsCanSes = hbpoSaDetails.FindAll(t => t.Price != default); + var hbpoSaDetailsNotCanSes = hbpoSaDetails.FindAll(t => t.Price == default); + + //可结算明细 + hbpoCanSaDetails = ObjectMapper.Map, List>(hbpoSaDetailsCanSes); + //不可结算明细 + hbpoNotSaDetails = ObjectMapper.Map, List>(hbpoSaDetailsNotCanSes); + #endregion + + #region 添加入库 + await _hbpoSaRepository.InsertAsync(hbpoSa); + await _hbpoSaDetailRepository.InsertManyAsync(hbpoSaDetails); + if (hbpoCanSaDetails.Count > 0) + { + hbpoCanSa.InvGroupNum = hbpoCanSaDetails.Count.ToString(); + hbpoCanSaDetails.ForEach(hbpoCanSaDetail => + { + hbpoCanSaDetail.BillNum = hbpoCanSaDetail.InvGroupNum = hbpoCanSaBillNum; + hbpoCanSaDetail.BusinessType = _businessType; + }); + + await _hbpoCanSaRepository.InsertAsync(hbpoCanSa); + await _hbpoCanSaDetailRepository.InsertManyAsync(hbpoCanSaDetails); + } + if (hbpoNotSaDetails.Count > 0) + { + hbpoNotSaDetails.ForEach(hbpoNotSaDetail => + { + hbpoNotSaDetail.BusinessType = _businessType; + }); + + await _hbpoNotSaDetailRepository.InsertManyAsync(hbpoNotSaDetails); + } + if (materialRelationships.Count > 0) + { + await _materialRelationshipRepository.InsertManyAsync(materialRelationships); + } + #endregion + + return ApplicationConsts.SuccessStr; + } + + /// + /// 获取结算关联项 + /// + private async Task<(List hbpoSas, List hbpoSaDetails, List hbpoCanSas, List hbpoCanSaDetails, List hbpoNotSaDetails)> GetHBPOSaDelItemsAsync(Guid id) + { + //结算主表 + List hbpoSas = new List(); + //结算明细 + List hbpoSaDetails = new List(); + //可结算主表 + List hbpoCanSas = new List(); + //可结算明细 + List hbpoCanSaDetails = new List(); + //不可结算 + List hbpoNotSaDetails = new List(); + + var hbpoSaEntity = await _hbpoSaRepository.FirstOrDefaultAsync(t => t.Id.Equals(id)); + if (hbpoSaEntity != null) + { + //结算单据 + string hbpoSaBillNum = hbpoSaEntity.BillNum; + + hbpoCanSas = await _hbpoCanSaRepository.GetListAsync(t => t.SettleBillNum == hbpoSaBillNum); + //验证可结算主表状态 + if (hbpoCanSas.Any() && hbpoCanSas.Any(t => t.State != SettleBillState.未结状态)) + { + throw new UserFriendlyException($"{hbpoSaBillNum} 该单据可结算单状态无法删除!", "400"); + } + + hbpoSas.Add(hbpoSaEntity); + hbpoSaDetails = await _hbpoSaDetailRepository.GetListAsync(t => t.BillNum == hbpoSaBillNum); + hbpoCanSaDetails = await _hbpoCanSaDetailRepository.GetListAsync(t => t.SettleBillNum == hbpoSaBillNum); + hbpoNotSaDetails = await _hbpoNotSaDetailRepository.GetListAsync(t => t.SettleBillNum == hbpoSaBillNum); + } + + return (hbpoSas, hbpoSaDetails, hbpoCanSas, hbpoCanSaDetails, hbpoNotSaDetails); + } #endregion } diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/PUB_SA_SERVICE.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/PUB_SA_SERVICE.cs index 75c4e6cb..76829264 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/PUB_SA_SERVICE.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/PUB_SA_SERVICE.cs @@ -110,7 +110,6 @@ public class PUB_SA_SERVICE : SettleAccountApplicationBase public async Task ImportByBusinessTypeAsync([FromForm] PUB_SAImportRequestDto pubSaImportRequestDto) { string result = string.Empty; - //return await ImportAsync(pubSaImportRequestDto.Files, pubSaImportRequestDto.BusinessType); switch (pubSaImportRequestDto.BusinessType) { case EnumBusinessType.None: @@ -128,6 +127,7 @@ public class PUB_SA_SERVICE : SettleAccountApplicationBase case EnumBusinessType.MaiDanJianBBAC: break; case EnumBusinessType.MaiDanJianHBPO: + result = await ImportMaiDanJianHBPOAsync(pubSaImportRequestDto.Files); break; case EnumBusinessType.BeiJian: result = await ImportBeiJianAsync(pubSaImportRequestDto.Files); @@ -476,6 +476,34 @@ public class PUB_SA_SERVICE : SettleAccountApplicationBase return await SaDataHandleAsync(importPubSaDetails, EnumBusinessType.ZhiGongJianHBPO); } + /// + /// 买单件HBPO导入 + /// + private async Task ImportMaiDanJianHBPOAsync([FromForm] IFormFileCollection files) + { + #region 导入数据转换 + ExportImporter _exportImporter = new ExportImporter(); + var importResults = await _exportImporter.UploadExcelImport(files, _excelImportService); + + importResults.ForEach(importResult => + { + importResult.SettleDate = DateTime.Now; + }); + + var importPubSaDetails = ObjectMapper.Map, List>(importResults); + #endregion + + #region 数据校验 + var checkList = await CheckAsync(importPubSaDetails); + if (checkList.Count > 0) + { + return await ExportErrorReportAsync(checkList); + } + #endregion + + return await SaDataHandleAsync(importPubSaDetails, EnumBusinessType.BeiJian); + } + /// /// 备件导入 /// @@ -505,7 +533,7 @@ public class PUB_SA_SERVICE : SettleAccountApplicationBase } /// - /// 备件导入 + /// 印度件导入 /// private async Task ImportYinDuJianAsync([FromForm] IFormFileCollection files) { diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Application/SettleAccountApplicationAutoMapperProfile.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Application/SettleAccountApplicationAutoMapperProfile.cs index 053b9c19..c23bba28 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Application/SettleAccountApplicationAutoMapperProfile.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Application/SettleAccountApplicationAutoMapperProfile.cs @@ -1023,6 +1023,7 @@ namespace Win.Sfs.SettleAccount CreateMap(); CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); }