diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Bases/BA_SERVICE.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Bases/BA_SERVICE.cs index 44ff5c9e..364980a3 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Bases/BA_SERVICE.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Bases/BA_SERVICE.cs @@ -26,6 +26,8 @@ using Win.Sfs.SettleAccount.CommonManagers; using Win.Sfs.SettleAccount.Constant; using Win.Sfs.SettleAccount.Entities.BQ.Dtos; using Win.Sfs.SettleAccount.Entities.BQ.Managers; +using Win.Sfs.SettleAccount.Entities.BQ.Temp; +using Win.Sfs.SettleAccount.Entities.Prices; using Win.Sfs.SettleAccount.ExcelImporter; using Win.Sfs.SettleAccount.ExportReports; using Win.Sfs.SettleAccount.Migrations; @@ -34,7 +36,9 @@ using Win.Sfs.Shared.RepositoryBase; namespace Win.Sfs.SettleAccount.Bases { - public abstract class BA_SERVICE: BASE_SERVICE + public abstract class BA_SERVICE + + : BASE_SERVICE { protected readonly INormalEfCoreRepository _repository; protected readonly INormalEfCoreRepository _wRepository; @@ -47,7 +51,7 @@ namespace Win.Sfs.SettleAccount.Bases protected readonly INV_MNG _invMng; - + protected BA_SERVICE( INormalEfCoreRepository adjRepository, @@ -65,8 +69,8 @@ namespace Win.Sfs.SettleAccount.Bases ) { - - + + _repository = repository; _wRepository = wRepository; _mRepository = mRepository; @@ -76,7 +80,7 @@ namespace Win.Sfs.SettleAccount.Bases _bbacMng = bbacMng; _hbpoMng = hbpoMng; _invMng = invMng; - + } protected BA_SERVICE(IExcelImportAppService excelImportService, @@ -87,7 +91,7 @@ namespace Win.Sfs.SettleAccount.Bases INormalEfCoreRepository wRepository, INormalEfCoreRepository sRepository, INormalEfCoreRepository mRepository, - + BBAC_CAN_SA_MNG pubMng, HBPO_CAN_SA_MNG bbacMng, PUB_CAN_SA_MNG hbpoMng, @@ -116,7 +120,7 @@ namespace Win.Sfs.SettleAccount.Bases public virtual async Task ReissueInvoice(INVOICE_GRP_REQ_DTO input) { - // await _invMng.SetForwardState(input.InvGroupNum, SettleBillState.商务已审核); + // await _invMng.SetForwardState(input.InvGroupNum, SettleBillState.商务已审核); return ApplicationConsts.SuccessStr; @@ -144,13 +148,13 @@ namespace Win.Sfs.SettleAccount.Bases public virtual async Task DetailQueryAsync(INVOICE_GRP_REQ_DTO input) { - INVOICE_GRP_DETAIL_DTO entity=new INVOICE_GRP_DETAIL_DTO(); - var m= await _mRepository.GetListByFilterAsync(input.Filters, input.Sorting,int.MaxValue, input.SkipCount); - var mdtos = ObjectMapper.Map, List>(m); - var w=await _wRepository.GetListByFilterAsync(input.Filters, input.Sorting, int.MaxValue, input.SkipCount); - var wdtos = ObjectMapper.Map, List>(w); - var s=await _sRepository.GetListByFilterAsync(input.Filters, input.Sorting, int.MaxValue, input.SkipCount); - var sdtos = ObjectMapper.Map, List>(s); + INVOICE_GRP_DETAIL_DTO entity = new INVOICE_GRP_DETAIL_DTO(); + var m = await _mRepository.GetListByFilterAsync(input.Filters, input.Sorting, int.MaxValue, input.SkipCount); + var mdtos = ObjectMapper.Map, List>(m); + var w = await _wRepository.GetListByFilterAsync(input.Filters, input.Sorting, int.MaxValue, input.SkipCount); + var wdtos = ObjectMapper.Map, List>(w); + var s = await _sRepository.GetListByFilterAsync(input.Filters, input.Sorting, int.MaxValue, input.SkipCount); + var sdtos = ObjectMapper.Map, List>(s); entity.INVOICE_NOT_SETTLE = sdtos; entity.INVOICE_WAIT_DETAIL = wdtos; entity.INVOICE_MAP_GROUP = mdtos; @@ -204,7 +208,7 @@ namespace Win.Sfs.SettleAccount.Bases - return ApplicationConsts.SuccessStr; + return ApplicationConsts.SuccessStr; } @@ -214,19 +218,16 @@ namespace Win.Sfs.SettleAccount.Bases [HttpPost] public virtual async Task ReceivedAsync(INVOICE_GRP_REQ_DTO input) { - var entity=await _invMng.GetMainAsync(input.InvGroupNum); + var entity = await _invMng.GetMainAsync(input.InvGroupNum); if (entity != null) { bool flag = await _invMng.ReceivedAsync(entity.InvGroupNum); if (flag == true) { - await _invMng.SetForwardState(entity,SettleBillState.客户已收票); + await _invMng.SetForwardState(entity, SettleBillState.客户已收票); } } - - return ApplicationConsts.SuccessStr; - } protected virtual async Task> GetMapGroupAsync(INVOICE_GRP_REQ_DTO input) { @@ -253,8 +254,8 @@ namespace Win.Sfs.SettleAccount.Bases filters.Add(new FilterCondition("InvBillNum", p_invbillNum, EnumFilterAction.Equal, EnumFilterLogic.And)); return await _sRepository.GetListByFilterAsync(filters); - - + + } protected virtual async Task> GetAjdmentDetail(INVOICE_GRP_REQ_DTO input) @@ -291,17 +292,108 @@ namespace Win.Sfs.SettleAccount.Bases List filters = new List(); filters.Add(new FilterCondition("InvBillNum", p_invbillNum, EnumFilterAction.Equal, EnumFilterLogic.And)); - var ls= await _repository.GetListByFilterAsync(filters); - if(ls!=null && ls.Count()>0) + var ls = await _repository.GetListByFilterAsync(filters); + if (ls != null && ls.Count() > 0) { return ls.FirstOrDefault(); } return null; + } + /// + /// hbpo、jit、备件等 + /// + /// 可结算明细列表 + /// 版本号 + /// 发票分组 + /// 原发票号 + protected async Task ReissueSecInvoice(List p_list, int p_version, string p_parentInvBillNum) + { + + return await _invMng.ReissueSecInvoice(p_list,p_parentInvBillNum, p_version); + } + /// + /// 第一次开票 + /// + /// + /// + /// + /// + /// 要作废的发票号 + /// + /// + protected async Task ReissueFirstInvoice(List dtos,int p_version, string p_parentInvBillNum) + { + return await _invMng.ReissueFirstInvoice(dtos,p_parentInvBillNum,p_version); + } + + /// + /// 校验规则 + /// + /// + /// + /// + protected async Task> CheckInvoiceGenerationRules(List dto1s, List p_pricelist, EnumBusinessType p_businessType) where T : SA_CAN_BASE + { + var inner = from d in dto1s + join p in p_pricelist on d.LU equals p.LU + where + d.SettleDate >= p.BeginTime && d.SettleDate <= p.EndTime + select d; + var left = from d in dto1s + join p in inner on new { d.LU, d.PN } equals new { p.LU, p.PN } + + into temp + from tm in temp.DefaultIfEmpty()//校验错误项 + where tm == null + select d; + + List errorList = new List(); + + string name = string.Empty; + string keyname = string.Empty; + switch (p_businessType) + { + case EnumBusinessType.MaiDanJianHBPO: + name = "HBPO买单件"; + keyname = "生产码"; + break; + case EnumBusinessType.ZhiGongJianHBPO: + name = "HBPO直供件"; + keyname = "发货单号"; + break; + case EnumBusinessType.ZhiGongJianBBAC: + name = "BBAC直供件"; + keyname = "发货单号"; + break; + case EnumBusinessType.YinDuJian: + name = "HBPO印度件"; + keyname = "发货单号"; + break; + case EnumBusinessType.JisBBAC: + name = "BBAC-JIS"; + keyname = "生产码"; + break; + case EnumBusinessType.JisHBPO: + name = "HBPO-JIS"; + keyname = "生产码"; + break; + case EnumBusinessType.BeiJian: + name = "备件"; + keyname = "交付识别号"; + break; + } + foreach (var error in left) + { + errorList.Add(new ERR_EXP_DTO() { ItemCode = error.LU, CustomCode = $"{name}", Message = $"LU:{error.LU}{keyname}:{error.PN},下线日期:{error.SettleDate}没有对应区间销售价格表!" }); + } + return errorList; + } } + } diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Bases/CAN_SA_SERVICE.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Bases/CAN_SA_SERVICE.cs index d85dd704..b29a92e1 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Bases/CAN_SA_SERVICE.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Bases/CAN_SA_SERVICE.cs @@ -1,9 +1,12 @@ using AutoMapper; +using DocumentFormat.OpenXml.Vml.Office; +using EFCore.BulkExtensions; using Magicodes.ExporterAndImporter.Core; using Magicodes.ExporterAndImporter.Csv; using Magicodes.ExporterAndImporter.Excel; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using NUglify.JavaScript.Syntax; using SettleAccount.Bases; using SettleAccount.Domain.BQ; using Shouldly; @@ -27,104 +30,16 @@ using Win.Sfs.SettleAccount.Constant; using Win.Sfs.SettleAccount.Entities.BQ; using Win.Sfs.SettleAccount.Entities.BQ.Dtos; using Win.Sfs.SettleAccount.Entities.BQ.Managers; +using Win.Sfs.SettleAccount.Entities.BQ.Temp; +using Win.Sfs.SettleAccount.Entities.Prices; using Win.Sfs.SettleAccount.ExcelImporter; using Win.Sfs.SettleAccount.ExportReports; using Win.Sfs.Shared.RepositoryBase; +using static Win.Sfs.SettleAccount.SettleAccountPermissions; namespace Win.Sfs.SettleAccount.Bases { - public class TMEP_INV - { - public string LU { set; get; } - public string ContractDocID { set; get; } - public decimal Amt { set; get; } - public decimal Qty { set; get; } - public decimal Price { set; get; } - /// - /// 开始日期 - /// - public DateTime BeginDate { get; set; } - /// - /// 结束日期 - /// - public DateTime EndDate { get; set; } - } - - public class TEMP_CAN_SA_DETAIL - { - /// - ///关联结算单号 - /// - public string SettleBillNum { get; set; } - /// - ///工厂地点 - /// - - public string Site { get; set; } - /// - /// 版本 - /// - public int Version { get; set; } - /// - /// 单价 - /// - public decimal Price { get; set; } - /// - /// 结算单号(发票分组号) - /// - public string BillNum { get; set; } - /// - /// 结算日期 - /// - public DateTime SettleDate { get; set; } - /// - ///发票组号 - /// - public string InvGroupNum { get; set; } - /// - /// 零件号 - /// - public string LU { get; set; } - - - /// - /// 物料描述 - /// - public string MaterialDesc { get; set; } - - - /// - /// 生产号 - /// - public string PN { get; set; } - /// - /// 结算数量 - /// - public decimal Qty { get; set; } - /// - /// 结算分组号 - /// - public string GroupNum { get; set; } - /// - /// 金额 - /// - public decimal Amt { get; set; } - - /// - /// 合同号 - /// - public string ContractDocID { set; get; } - /// - /// 开始日期 - /// - public DateTime BeginDate { get; set; } - /// - /// 结束日期 - /// - public DateTime EndDate { get; set; } - - - } + @@ -246,220 +161,99 @@ namespace Win.Sfs.SettleAccount.Bases return new PagedResultDto(totalCount, dtos); } - //public virtual async Task SetForwardState(TEntity p_entiy, SettleBillState state) - //{ - // if (await SetForwardState(p_entiy.InvGroupNum, state) == true) - // { - // return true; - // } - // return false; - - //} - - - - - ///// - ///// 向前流程 - ///// - ///// - ///// - ///// - ///// - //public virtual async Task SetForwardState(string p_billNum, SettleBillState state) - //{ - - // var ls = _repository.Where(p => p.InvGroupNum == p_billNum).ToList(); - // if (ls != null && ls.Count > 0) - // { - // throw new BusinessException("8989", string.Format("不存在编号为{0}", p_billNum)); - // } - // foreach (TEntity p_entiy in ls) - // { - // switch (p_entiy.State) - // { - // case SettleBillState.财务已审核: - // if (state == SettleBillState.商务已审核) - // { - // p_entiy.State = state; - // } - // else - // { - // throw new BusinessException("8989", "当前状态不是【商务已审核】,无法设置成【财务已审核】状态"); - // } - // break; - // case SettleBillState.商务已审核: - // if (state == SettleBillState.已开票) - // { - // p_entiy.State = state; - // } - // else - // { - // throw new BusinessException("8989", "当前状态不是【已开票】状态,无法设置成【商务已审核】"); - // } - // break; - // case SettleBillState.已开票: - // if (state == SettleBillState.未结状态) - // { - // p_entiy.State = state; - // } - // else - // { - // throw new BusinessException("8989", "当前状态不是【未结状态】状态,无法设置成【已开票】"); - // } - // break; - // case SettleBillState.已扣减: - // if (state == SettleBillState.客户已收票) - // { - // p_entiy.State = state; - // } - // else - // { - // throw new BusinessException("8989", "当前状态不是[客户收票],无法设置成【财务已审核】状态"); - // } - // break; - // case SettleBillState.客户已收票: - // if (state == SettleBillState.财务已审核) - // { - // p_entiy.State = state; - // } - // else - // { - // throw new BusinessException("8989", "当前状态不是[财务已审核],无法设置成【客户已收票】状态"); - // } - // break; - // } - // await _repository.UpdateAsync(p_entiy); - // return true; - // } - // return false; - //} - ///// - ///// 向后流程 - ///// - ///// - ///// - ///// - ///// - //public virtual async Task SetBackwardState(string p_billNum, SettleBillState state) - //{ - - // var ls = _repository.Where(p => p.InvGroupNum == p_billNum).ToList(); - // if (ls != null && ls.Count > 0) - // { - // throw new BusinessException("8989", string.Format("不存在发票分组号为{0}的可结算单", p_billNum)); - // } - // foreach (TEntity p_entiy in ls) - // { - - // switch (p_entiy.State) - // { - // case SettleBillState.商务已审核: - // if (state == SettleBillState.财务已审核) - // { - // p_entiy.State = state; - // } - // else - // { - // throw new BusinessException("8989", "当前状态不是【财务已审核】,无法设置成【商务已审核】状态"); - // } - // break; - // case SettleBillState.已开票: - // if (state == SettleBillState.商务已审核) - // { - // p_entiy.State = state; - // } - // else - // { - // throw new BusinessException("8989", "当前状态不是【商务已审核】状态,无法设置成【已开票】"); - // } - // break; - // case SettleBillState.未结状态: - // if (state == SettleBillState.已开票) - // { - // p_entiy.State = state; - // } - // else - // { - // throw new BusinessException("8989", "当前状态不是【已开票】状态,无法设置成【未结状态】"); - // } - // break; - // case SettleBillState.客户已收票: - // if (state == SettleBillState.已扣减) - // { - // p_entiy.State = state; - // } - // else - // { - // throw new BusinessException("8989", "当前状态不是[财务已审核],无法设置成【财务已审核客户收票】状态"); - // } - // break; - // case SettleBillState.财务已审核: - // if (state == SettleBillState.客户已收票) - // { - // p_entiy.State = state; - // } - // else - // { - // throw new BusinessException("8989", "当前状态不是[客户已收票],无法设置成【财务已审核】状态"); - // } - // break; - // } - // await _repository.UpdateAsync(p_entiy); - // return true; - // } - // return false; - //} - - - //public virtual async Task SetNewState(TEntity p_entiy) - //{ - - // return await SetNewState(p_entiy.BillNum); - //} - - //public virtual async Task SetNewState(string billNum) - //{ - - // var entity = await GetMainAsync(billNum); - // if (entity != null) - // { - - // entity.State = SettleBillState.未结状态; - - - // await _repository.UpdateAsync(entity); - // return true; - // } - // return false; - // ; - //} - ///// - ///// 获得所有明细 - ///// - ///// - ///// - //public virtual async Task> GetDetalListAsync(string billNum) - //{ - // return await _detailRepository.Where(p => p.InvGroupNum == billNum).ToListAsync(); - //} - ///// - ///// 获得主表信息 - ///// - ///// - ///// - //public virtual async Task GetMainAsync(string billNum) - //{ - // return await _repository.Where(p => p.InvGroupNum == billNum).FirstOrDefaultAsync(); - //} - - - + /// + /// hbpo、jit、备件等 + /// + /// 可结算明细列表 + /// 版本号 + /// 发票分组 + /// 原发票号 + protected async Task SecInvoice(List p_list, int p_version, string p_InvGroupNum, string p_parentInvBillNum,EnumBusinessType businessType) + { + return await _invmng.SecInvoice(p_list, p_version, p_InvGroupNum, p_parentInvBillNum, businessType); + } + /// + /// 第一次开票 + /// + /// + /// + /// + /// + /// + /// + /// + protected async Task FirstInvoice(List dtos, List p_notlist, int p_version, string p_InvGroupNum, string p_parentInvBillNum,EnumBusinessType businessType) + { + return await _invmng.FirstInvoice(dtos, p_notlist, p_version, p_InvGroupNum, p_parentInvBillNum, businessType); + } + /// + /// 校验规则 + /// + /// + /// + /// + protected async Task> CheckInvoiceGenerationRules(List dto1s, List p_pricelist,EnumBusinessType p_businessType) where T : SA_CAN_BASE + { + var inner = from d in dto1s + join p in p_pricelist on d.LU equals p.LU + where + d.SettleDate >= p.BeginTime && d.SettleDate <= p.EndTime + select d; + var left = from d in dto1s + join p in inner on new { d.LU, d.PN } equals new { p.LU, p.PN } + + into temp + from tm in temp.DefaultIfEmpty()//校验错误项 + where tm == null + select d; + + List errorList = new List (); + + string name = string.Empty; + string keyname = string.Empty; + switch (p_businessType) + { + case EnumBusinessType.MaiDanJianHBPO: + name = "HBPO买单件"; + keyname = "生产码"; + break; + case EnumBusinessType.ZhiGongJianHBPO: + name = "HBPO直供件"; + keyname = "发货单号"; + break; + case EnumBusinessType.ZhiGongJianBBAC: + name = "BBAC直供件"; + keyname = "发货单号"; + break; + case EnumBusinessType.YinDuJian: + name = "HBPO印度件"; + keyname = "发货单号"; + break; + case EnumBusinessType.JisBBAC: + name = "BBAC-JIS"; + keyname = "生产码"; + break; + case EnumBusinessType.JisHBPO: + name = "HBPO-JIS"; + keyname = "生产码"; + break; + case EnumBusinessType.BeiJian: + name = "备件"; + keyname = "交付识别号"; + break; + + } + foreach (var error in left) + { + errorList.Add(new ERR_EXP_DTO() { ItemCode = error.LU, CustomCode = $"{name}", Message = $"LU:{error.LU}{keyname}:{error.PN},下线日期:{error.SettleDate}没有对应区间销售价格表!" }); + } + return errorList; + } } } diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/BBAC_BA_SERVICE.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/BBAC_BA_SERVICE.cs index 60342a74..4335b6ff 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/BBAC_BA_SERVICE.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/BBAC_BA_SERVICE.cs @@ -19,6 +19,7 @@ using Win.Sfs.SettleAccount.CommonManagers; using Win.Sfs.SettleAccount.Constant; using Win.Sfs.SettleAccount.Entities.BQ.Dtos; using Win.Sfs.SettleAccount.Entities.BQ.Managers; +using Win.Sfs.SettleAccount.Entities.BQ.Temp; using Win.Sfs.SettleAccount.Entities.Prices; using Win.Sfs.SettleAccount.ExportReports; using Win.Sfs.Shared.RepositoryBase; @@ -33,11 +34,8 @@ namespace Win.Sfs.SettleAccount.Entities.BQ public class BBAC_BA_SERVICE : BA_SERVICE { - private readonly INormalEfCoreRepository _adjRepository; private readonly INormalEfCoreRepository _priceRepository; - - public BBAC_BA_SERVICE(IExcelImportAppService excelImportService, ISnowflakeIdGenerator snowflakeIdGenerator, ICommonManager commonManager, @@ -68,7 +66,8 @@ namespace Win.Sfs.SettleAccount.Entities.BQ /// public virtual async Task ReissueInvoice(string p_invbillnum) { - var mappingList= await GetMapGroupAsync(p_invbillnum);//结算分组 + var mappingList= await GetMapGroupAsync(p_invbillnum);//发票对应结算分组 + if (mappingList != null && mappingList.Count() > 0) { var version=int.Parse(DateTime.Now.ToString("yyyymm")); @@ -76,10 +75,14 @@ namespace Win.Sfs.SettleAccount.Entities.BQ var inv= await GetInvoiceGroupByInvBillNum(p_invbillnum); if (inv != null) { - var bbaclist = await _bbacMng.GetContainsAsync(inv.InvbillNum, gList);//结算分组对应结算零件 - var adjlist=await _adjRepository.Where(p=>p.InvBillNum==inv.InvbillNum).ToListAsync(); - if(adjlist!=null && adjlist.Count()>0) - { + if (inv.InvoiceState == InvoiceBillState.报废) + { + throw new BusinessException("8989", $"选择发票:{p_invbillnum}状态为报废状态不能重开!"); + } + var bbaclist = await _bbacMng.GetContainsAsync(inv.InvbillNum, gList);//结算分组对应结算零件 + var adjlist = await _adjRepository.Where(p => p.InvBillNum == inv.InvbillNum).ToListAsync();//调整表明细 + if (adjlist != null && adjlist.Count() > 0) + { foreach (var itm in adjlist) { bbaclist.Add(new BBAC_CAN_SA_DETAIL( @@ -107,27 +110,8 @@ namespace Win.Sfs.SettleAccount.Entities.BQ //var groupNumList = entitys.Select(p => new { p.GroupNum).Distinct().ToList(); //var notList = _notRepository.Where(p => gNumList.Contains(p.GroupNum)).ToList();//不能结算 var dto1s = ObjectMapper.Map, List>(entitys); - var priceList = _priceRepository.ToList();//价格单 - - var inner = from d in dto1s - join p in priceList on d.LU equals p.LU - where - d.SettleDate >= p.BeginTime && d.SettleDate <= p.EndTime - select d; - var left = from d in dto1s - join p in inner on new { d.LU, d.PN } equals new { p.LU, p.PN } - into temp - from tm in temp.DefaultIfEmpty()//校验错误项 - where tm == null - select d; - - List errorList = new List(); - - foreach (var error in left) - { - errorList.Add(new ERR_EXP_DTO() { ItemCode = error.LU, CustomCode = "业务类别BBAC", Version = version.ToString(), Message = "LU:{0}PN:{1},下线日期:{2}没有对应区间销售价格表!" }); - } + var errorList =await CheckInvoiceGenerationRules(entitys, priceList, inv.BusinessType); if (errorList.Count() > 0) { return await ExportErrorReportAsync(errorList); @@ -155,350 +139,15 @@ namespace Win.Sfs.SettleAccount.Entities.BQ EndDate = p.EndTime }; var dtos = q.ToList(); - if (dtos != null && dtos.Count > 0) { - if (p_invbillnum.Substring(0, 1) == "INV")//一次开票 + if (p_invbillnum.Substring(0, 1) == "INV")//一次开票重开 { - // dtos = dtos.OrderBy(p => p.SettleDate).ToList(); - var _query = dtos.GroupBy(p => new { p.GroupNum }).Select(p => new { GroupNum = p.Key.GroupNum, Amt = p.Sum(itm => itm.Amt) }).OrderBy(p => p.Amt); - Dictionary dic = new Dictionary();//原本 - Dictionary copyDic = new Dictionary();//变换数组副本 - foreach (var itm in _query.ToList()) - { - dic.Add(itm.GroupNum, itm.Amt); - copyDic.Add(itm.GroupNum, itm.Amt); - } - Dictionary> invoiceMap = new Dictionary>(); - foreach (var itm in dic) - { - if (copyDic.ContainsKey(itm.Key) == true)//是否存在分组 - { - string invoiceBillNum = OrderNumberGenerator.GenerateOrderNumber("INV"); - List invoiceGroupNumList = new List();//每个发票对应的结算分组号 - List List = new List(); - decimal sum = itm.Value;//初始分组合计金额 - //List luList = dtos.Where(p => p.GroupNum == itm.Key).Select(p => p.LU + p.ContractDocID).Distinct().ToList(); //初始LU种类 - foreach (var _itm1 in copyDic) - { - if (itm.Key == _itm1.Key)//相同结算分组项不计算,已初始化 - { - invoiceGroupNumList.Add(itm.Key); - continue; - } - //var grouplist = dtos.Where(p => p.GroupNum == _itm1.Key).Select(p => p.LU + p.ContractDocID).Distinct().ToList();//每项LU种类 - //luList.AddRange(grouplist); - //luList = luList.Distinct().ToList(); - //if (luList.Count > 20)//累加零件不超过20种 - //{ - // continue; - //} - sum += _itm1.Value; - if (sum > 10000000) - { - break; - } - invoiceGroupNumList.Add(_itm1.Key);//所有条件都满足添加发票和结算分组对应关系 - } - invoiceMap.Add(invoiceBillNum, invoiceGroupNumList);//记录发票对应关系 - foreach (var rem in invoiceGroupNumList)//移除已经开票分组 - { - copyDic.Remove(rem); - } - } - } - if (invoiceMap.Keys.Count > 0) - { - var groupList = new List(); - var notDetialList = new List(); - var detailList = new List(); - var invlist = new List(); - // string str = JsonConvert.SerializeObject(invoiceMap); - foreach (var itm in invoiceMap)//分组影响和 - { - var key = itm.Key;//发票票号 - var ls = itm.Value;//结算分组号列表 - var detailDtos = dtos.Where(p => ls.Contains(p.GroupNum)).GroupBy(p => new { p.InvGroupNum, p.LU, p.Price, p.ContractDocID, p.BeginDate, p.EndDate }) - .Select(itm => new - { - InvGroupNum = itm.Key.InvGroupNum, - LU = itm.Key.LU, - ContactDocID = itm.Key.ContractDocID, - Price = itm.Key.Price, - Amt = itm.Sum(p => p.Amt), - Qty = itm.Sum(k => k.Qty), - BeginDate = itm.Key.BeginDate, - EndDate = itm.Key.EndDate - }) - .ToList(); - decimal amt = detailDtos.Sum(k => k.Amt); - decimal txtAmt = Math.Round(detailDtos.Sum(k => k.Amt) * 0.13m, 2); - var mapList = new List(); - foreach (var groupnum in ls) - { - mapList.Add(new INVOICE_MAP_GROUP( - guid: GuidGenerator.Create(), - version: version, - invbillNum: key, - invGroupNum: inv.InvGroupNum, - settleGroupNum: groupnum, - amt: 0, - extend1: string.Empty, - extend2: string.Empty - ) - ); - } - if (mapList.Count > 0) - { - groupList.AddRange(mapList); - } - List _entityDetailList = new List(); - foreach (var detail in detailDtos) - { - _entityDetailList.Add( - new INVOICE_WAIT_DETAIL( - guid: GuidGenerator.Create(), - version: version, - invbillNum: key, - invGroupNum:inv.InvGroupNum, - lU: detail.LU, - qty: detail.Qty, - bussiessType: EnumBusinessType.JisHBPO, - amt: detail.Amt, - pRICE: detail.Price, - extend1: detail.ContactDocID, - extend2: string.Empty, - beginDate: detail.BeginDate, - endDate: detail.EndDate - )); - } - if (_entityDetailList.Count > 0) - { - detailList.AddRange(_entityDetailList); - } - - #region 原有新发票生成时 - //var notls = notList.GroupBy(p => new { p.GroupNum, p.LU }) - // .Select(p => new { GroupNum = p.Key.GroupNum, LU = p.Key.LU, Qty = p.Sum(itm => itm.Qty) }); - //var innotls = new List(); - //foreach (var nitm in notls) - //{ - // innotls.Add(new INVOICE_NOT_SETTLE( - // guid: GuidGenerator.Create(), - // version: main.Version, - // invGroupNum: main.InvGroupNum, - // settleGroupNum: nitm.GroupNum, - // lU: string.Empty, - // lU1: nitm.LU, - // extend1: string.Empty, - // extend2: string.Empty, - // qty: nitm.Qty - // )); - //} - //if (innotls.Count > 0) - //{ - // notDetialList.AddRange(innotls); - //} - #endregion - var invbill = new INVOICE_GRP - (guid: GuidGenerator.Create(), - realnvBillNum: string.Empty, - invbillNum: key, - amt: amt, - taxAmt: txtAmt, - fileName: string.Empty, - businessType: EnumBusinessType.JisBBAC, - invGroupNum: inv.InvGroupNum, - state: SettleBillState.已开票, - invoiceBillState: InvoiceBillState.正常, - tax:0, - parent:inv.InvbillNum - ); - invlist.Add(invbill); - } - var notlist=await GetNotDetailAsync(p_invbillnum); - if (notlist != null && notlist.Count > 0) - { - foreach (var nitm in notlist) - { - notDetialList.Add(new INVOICE_NOT_SETTLE( - guid: GuidGenerator.Create(), - version: version, - invGroupNum: nitm.InvGroupNum, - settleGroupNum: nitm.SettleGroupNum, - lU: string.Empty, - lU1: nitm.LU, - extend1: string.Empty, - extend2: string.Empty, - qty: nitm.Qty - )); - } - } - await _repository.DbContext.BulkInsertAsync(invlist); - await _repository.DbContext.BulkInsertAsync(groupList); - await _repository.DbContext.BulkInsertAsync(detailList); - await _repository.DbContext.BulkInsertAsync(notDetialList); - } + await ReissueFirstInvoice(dtos, version, p_invbillnum); } else//二次开票 { - var groups1 = dtos.GroupBy(p => new { p.LU, p.ContractDocID, p.Price, p.BeginDate, p.EndDate }).Select(p => new TMEP_INV - { - BeginDate = p.Key.BeginDate, - EndDate = p.Key.EndDate, - LU = p.Key.LU, - ContractDocID = p.Key.ContractDocID, - Amt = p.Sum(itm => itm.Amt), - Qty = p.Sum(itm => itm.Qty), - Price = p.Key.Price - }).ToList();//汇总记录不出现重复值 - var groups = dtos.GroupBy(p => new { p.LU, p.ContractDocID, p.Price, p.BeginDate, p.EndDate }).Select(p => new TMEP_INV - { - BeginDate = p.Key.BeginDate, - EndDate = p.Key.EndDate, - LU = p.Key.LU, - ContractDocID = p.Key.ContractDocID, - Amt = p.Sum(itm => itm.Amt), - Qty = p.Sum(itm => itm.Qty), - Price = p.Key.Price - }).ToList();//汇总记录不出现重复值 - Dictionary> invoiceMap = new Dictionary>();//发票和发票明细关系 - foreach (var group in groups) - { - int i = groups1.Count(p => p.LU == group.LU - && p.ContractDocID == group.ContractDocID - && p.BeginDate == group.BeginDate - && p.EndDate == group.EndDate - ); - if (i > 0) - { - string invoiceBillNum = OrderNumberGenerator.GenerateOrderNumber("CINV"); - List tempList = new List(); - decimal sum = group.Amt;//初始合计金额 - int partCount = 0; - foreach (var group1 in groups1) - { - if (group.LU == group1.LU && group1.ContractDocID == group.ContractDocID - && group.BeginDate == group1.BeginDate - && group.EndDate == group1.EndDate - ) - { - tempList.Add(group1); - partCount++;//符合条件加入到零件中 - continue; - } - partCount++; - if (partCount > 30) - { - continue; - } - sum += group1.Amt; - if (sum > 10000000) - { - break; - } - tempList.Add(group1); - } - invoiceMap.Add(invoiceBillNum, tempList); - var query = from itm in groups1 - join itm1 in tempList - on new { itm.LU, itm.ContractDocID, itm.BeginDate, itm.EndDate } equals new { itm1.LU, itm1.ContractDocID, itm1.BeginDate, itm1.EndDate } into temp - from tm in temp - where tm == null - select new TMEP_INV - { - LU = itm.LU, - ContractDocID = itm.ContractDocID, - Price = itm.Price, - Amt = itm.Amt, - Qty = itm.Qty, - BeginDate = itm.BeginDate, - EndDate = itm.EndDate - }; - groups1 = query.ToList(); - } - } - if (invoiceMap.Count > 0) - { - var groupList = new List(); - var notDetialList = new List(); - var detailList = new List(); - var invlist = new List(); - foreach (var group in invoiceMap) - { - var key = group.Key;//发票票号 - var ls = group.Value;//发票明细 - List _entityDetailList = new List(); - foreach (var detail in ls) - { - _entityDetailList.Add( - new INVOICE_WAIT_DETAIL( - guid: GuidGenerator.Create(), - version: version, - invbillNum: key, - invGroupNum: inv.InvGroupNum, - lU: detail.LU, - qty: detail.Qty, - bussiessType: EnumBusinessType.JisBBAC, - amt: detail.Amt, - pRICE: detail.Price, - extend1: detail.ContractDocID, - extend2: string.Empty, - beginDate: detail.BeginDate, - endDate: detail.EndDate - )); - } - if (_entityDetailList.Count > 0) - { - detailList.AddRange(_entityDetailList); - } - decimal amt = detailList.Sum(k => k.Amt); - decimal txtAmt = Math.Round(detailList.Sum(k => k.Amt), 2); - var contractList = ls.Select(p => p.ContractDocID).Distinct(); - var _groupList = dtos.Where(p => contractList.Contains(p.ContractDocID)).GroupBy(p => new { p.GroupNum }) - .Select(p => new { GroupNum = p.Key.GroupNum, Amt = p.Sum(itm => itm.Amt) }).Distinct(); - List group1 = new List(); - - foreach (var en in _groupList) - { - group1.Add( - new INVOICE_MAP_GROUP( - guid: GuidGenerator.Create(), - version: version, - invbillNum: key, - invGroupNum: inv.InvGroupNum, - settleGroupNum: en.GroupNum, - amt: en.Amt, - extend1: string.Empty, - extend2: string.Empty)); - } - if (group1.Count > 0) - { - groupList.AddRange(group1); - } - var invbill = new INVOICE_GRP - (guid: GuidGenerator.Create(), - realnvBillNum: string.Empty, - invbillNum: key, - amt: amt, - taxAmt: txtAmt, - fileName: string.Empty, - businessType: EnumBusinessType.JisBBAC, - invGroupNum: inv.InvGroupNum, - state: SettleBillState.已开票, - invoiceBillState: InvoiceBillState.正常, - tax: 0, - parent: inv.InvbillNum - ); - invlist.Add(invbill); - } - await _repository.DbContext.BulkInsertAsync(invlist); - await _repository.DbContext.BulkInsertAsync(groupList); - await _repository.DbContext.BulkInsertAsync(detailList); - //await _repository.DbContext.BulkInsertAsync(notDetialList); - - } - + await ReissueSecInvoice(dtos, version, p_invbillnum); } } } @@ -511,12 +160,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ { throw new BusinessException("8989", $"不存发票号:{p_invbillnum}对应的结算分组号"); } - return ApplicationConsts.SuccessStr; - } - - - } } diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/BBAC_CAN_SA_SERVICE.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/BBAC_CAN_SA_SERVICE.cs index 079dd257..73fe672d 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/BBAC_CAN_SA_SERVICE.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/BBAC_CAN_SA_SERVICE.cs @@ -29,6 +29,7 @@ using Microsoft.EntityFrameworkCore.Migrations; using Win.Abp.Snowflakes; using Win.Sfs.SettleAccount.CommonManagers; using Volo.Abp; +using Win.Sfs.SettleAccount.Entities.BQ.Temp; namespace Win.Sfs.SettleAccount.Entities.BQ { @@ -91,30 +92,12 @@ namespace Win.Sfs.SettleAccount.Entities.BQ var entitys = await _bbacMng.GetDetalListAsync(input.BillNum);//可结算 var groupNumList = entitys.Select(p => p.GroupNum).Distinct().ToList(); //var groupNumList = entitys.Select(p => new { p.GroupNum).Distinct().ToList(); - var notList = _notRepository.Where(p => groupNumList.Contains(p.GroupNum)).ToList();//不能结算 + var notQuery = _notRepository.Where(p => groupNumList.Contains(p.InvGroupNum)).ToList();//不能结算 var dto1s = ObjectMapper.Map, List>(entitys); var priceList = _priceRepository.ToList();//价格单 + var errorList = await CheckInvoiceGenerationRules(entitys, priceList,main.BusinessType);//校验生成规则 - var inner = from d in dto1s - join p in priceList on d.LU equals p.LU - where - d.SettleDate >= p.BeginTime && d.SettleDate <= p.EndTime - select d; - var left = from d in dto1s - join p in inner on new { d.LU, d.PN } equals new { p.LU, p.PN } - - into temp - from tm in temp.DefaultIfEmpty()//校验错误项 - where tm == null - select d; - - List errorList = new List(); - - foreach (var error in left) - { - errorList.Add(new ERR_EXP_DTO() { ItemCode = error.LU, CustomCode = "业务类别BBAC", Version = main.Version.ToString(), Message = "LU:{0}PN:{1},下线日期:{2}没有对应区间销售价格表!" }); - } if (errorList.Count() > 0) { return await ExportErrorReportAsync(errorList); @@ -147,329 +130,30 @@ namespace Win.Sfs.SettleAccount.Entities.BQ { if (input.BillNum.Substring(0, 1) == "C")//一次开票 { - // dtos = dtos.OrderBy(p => p.SettleDate).ToList(); - var _query = dtos.GroupBy(p => new { p.GroupNum }).Select(p => new { GroupNum = p.Key.GroupNum, Amt = p.Sum(itm => itm.Amt) }).OrderBy(p => p.Amt); - Dictionary dic = new Dictionary();//原本 - Dictionary copyDic = new Dictionary();//变换数组副本 - foreach (var itm in _query.ToList()) + var notlist = notQuery.Select(p => new TEMP_NOT_SA_DETAIL { - dic.Add(itm.GroupNum, itm.Amt); - copyDic.Add(itm.GroupNum, itm.Amt); - } - Dictionary> invoiceMap = new Dictionary>(); - foreach (var itm in dic) - { - if (copyDic.ContainsKey(itm.Key) == true)//是否存在分组 - { - string invoiceBillNum = OrderNumberGenerator.GenerateOrderNumber("INV"); - List invoiceGroupNumList = new List();//每个发票对应的结算分组号 - List List = new List(); - decimal sum = itm.Value;//初始分组合计金额 - //List luList = dtos.Where(p => p.GroupNum == itm.Key).Select(p => p.LU + p.ContractDocID).Distinct().ToList(); //初始LU种类 - foreach (var _itm1 in copyDic) - { - if (itm.Key == _itm1.Key)//相同结算分组项不计算,已初始化 - { - invoiceGroupNumList.Add(itm.Key); - continue; - } - //var grouplist = dtos.Where(p => p.GroupNum == _itm1.Key).Select(p => p.LU + p.ContractDocID).Distinct().ToList();//每项LU种类 - //luList.AddRange(grouplist); - //luList = luList.Distinct().ToList(); - //if (luList.Count > 20)//累加零件不超过20种 - //{ - // continue; - //} - sum += _itm1.Value; - if (sum > 10000000) - { - break; - } - - invoiceGroupNumList.Add(_itm1.Key);//所有条件都满足添加发票和结算分组对应关系 - } - invoiceMap.Add(invoiceBillNum, invoiceGroupNumList);//记录发票对应关系 - foreach (var rem in invoiceGroupNumList)//移除已经开票分组 - { - copyDic.Remove(rem); - } - } - } - if (invoiceMap.Keys.Count > 0) - { - var groupList = new List(); - var notDetialList = new List(); - var detailList = new List(); - var invlist = new List(); - - // string str = JsonConvert.SerializeObject(invoiceMap); - - foreach (var itm in invoiceMap)//分组影响和 - { - var key = itm.Key;//发票票号 - var ls = itm.Value;//结算分组号列表 - var detailDtos = dtos.Where(p => ls.Contains(p.GroupNum)).GroupBy(p => new { p.InvGroupNum, p.LU, p.Price, p.ContractDocID, p.BeginDate, p.EndDate }) - .Select(itm => new - { - InvGroupNum = itm.Key.InvGroupNum, - LU = itm.Key.LU, - ContactDocID = itm.Key.ContractDocID, - Price = itm.Key.Price, - Amt = itm.Sum(p => p.Amt), - Qty = itm.Sum(k => k.Qty), - BeginDate = itm.Key.BeginDate, - EndDate = itm.Key.EndDate - }) - .ToList(); - decimal amt = detailDtos.Sum(k => k.Amt); - decimal txtAmt = Math.Round(detailDtos.Sum(k => k.Amt) * 0.13m, 2); - var mapList = new List(); - foreach (var groupnum in ls) - { - //amt = dtos.Where(p => p.GroupNum == groupnum).Sum(p => p.Amt); - mapList.Add(new INVOICE_MAP_GROUP( - guid: GuidGenerator.Create(), - version: main.Version, - invbillNum: key, - invGroupNum: main.InvGroupNum, - settleGroupNum: groupnum, - amt: 0, - extend1: string.Empty, - extend2: string.Empty - ) - ); - } - if (mapList.Count > 0) - { - groupList.AddRange(mapList); - } - List _entityDetailList = new List(); - foreach (var detail in detailDtos) - { - _entityDetailList.Add( - new INVOICE_WAIT_DETAIL( - guid: GuidGenerator.Create(), - version: main.Version, - invbillNum: key, - invGroupNum: main.InvGroupNum, - lU: detail.LU, - qty: detail.Qty, - bussiessType: EnumBusinessType.JisBBAC, - amt: detail.Amt, - pRICE: detail.Price, - extend1: detail.ContactDocID, - extend2: string.Empty, - beginDate: detail.BeginDate, - endDate: detail.EndDate - - )); - } - if (_entityDetailList.Count > 0) - { - detailList.AddRange(_entityDetailList); - } - var notls = notList.GroupBy(p => new { p.GroupNum, p.LU }) - .Select(p => new { GroupNum = p.Key.GroupNum, LU = p.Key.LU, Qty = p.Sum(itm => itm.Qty) }); - var innotls = new List(); - foreach (var nitm in notls) - { - innotls.Add(new INVOICE_NOT_SETTLE( - guid: GuidGenerator.Create(), - version: main.Version, - invGroupNum: main.InvGroupNum, - settleGroupNum: nitm.GroupNum, - lU: string.Empty, - lU1: nitm.LU, - extend1: string.Empty, - extend2: string.Empty, - qty: nitm.Qty - )); - } - if (innotls.Count > 0) - { - notDetialList.AddRange(innotls); - } - var invbill = new INVOICE_GRP - (guid: GuidGenerator.Create(), - realnvBillNum: string.Empty, - invbillNum: key, - amt: amt, - taxAmt: txtAmt, - fileName: string.Empty, - businessType: EnumBusinessType.JisBBAC, - invGroupNum: main.InvGroupNum, - state: SettleBillState.已开票, - invoiceBillState: InvoiceBillState.正常, - tax: 0, - parent: string.Empty - ); - invlist.Add(invbill); - } - await _repository.DbContext.BulkInsertAsync(invlist); - await _repository.DbContext.BulkInsertAsync(groupList); - await _repository.DbContext.BulkInsertAsync(detailList); - await _repository.DbContext.BulkInsertAsync(notDetialList); - } + KeyCode = p.KeyCode, + Version = p.Version, + SettleBillNum = p.SettleBillNum, + LU = p.LU, + PN = p.PN, + Site = p.Site, + Qty = p.Qty, + Price = p.Price, + BusinessType = p.BusinessType, + IsReturn = "", + InvGroupNum = p.InvGroupNum, + SettleDate = p.SettleDate, + GroupNum = p.GroupNum, + ContractDocID = string.Empty + + }).ToList();//不能结算 + await FirstInvoice(dtos, notlist, main.Version, main.InvGroupNum, string.Empty, main.BusinessType); } else//二次开票 { - var groups1 = dtos.GroupBy(p => new { p.LU, p.ContractDocID, p.Price, p.BeginDate, p.EndDate }).Select(p => new TMEP_INV - { - BeginDate = p.Key.BeginDate, - EndDate = p.Key.EndDate, - LU = p.Key.LU, - ContractDocID = p.Key.ContractDocID, - Amt = p.Sum(itm => itm.Amt), - Qty = p.Sum(itm => itm.Qty), - Price = p.Key.Price - }).ToList();//汇总记录不出现重复值 - var groups = dtos.GroupBy(p => new { p.LU, p.ContractDocID, p.Price, p.BeginDate, p.EndDate }).Select(p => new TMEP_INV - { - BeginDate = p.Key.BeginDate, - EndDate = p.Key.EndDate, - LU = p.Key.LU, - ContractDocID = p.Key.ContractDocID, - Amt = p.Sum(itm => itm.Amt), - Qty = p.Sum(itm => itm.Qty), - Price = p.Key.Price - }).ToList();//汇总记录不出现重复值 - Dictionary> invoiceMap = new Dictionary>();//发票和发票明细关系 - foreach (var group in groups) - { - int i = groups1.Count(p => p.LU == group.LU - && p.ContractDocID == group.ContractDocID - && p.BeginDate == group.BeginDate - && p.EndDate == group.EndDate - ); - if (i > 0) - { - string invoiceBillNum = OrderNumberGenerator.GenerateOrderNumber("CINV"); - List tempList = new List(); - decimal sum = group.Amt;//初始合计金额 - int partCount = 0; - foreach (var group1 in groups1) - { - if (group.LU == group1.LU && group1.ContractDocID == group.ContractDocID - && group.BeginDate == group1.BeginDate - && group.EndDate == group1.EndDate - - ) - { - tempList.Add(group1); - partCount++;//符合条件加入到零件中 - continue; - } - partCount++; - if (partCount > 30) - { - continue; - } - sum += group1.Amt; - if (sum > 10000000) - { - break; - } - tempList.Add(group1); - } - invoiceMap.Add(invoiceBillNum, tempList); - var query = from itm in groups1 - join itm1 in tempList - on new { itm.LU, itm.ContractDocID, itm.BeginDate, itm.EndDate } equals new { itm1.LU, itm1.ContractDocID, itm1.BeginDate, itm1.EndDate } into temp - from tm in temp - where tm == null - select new TMEP_INV - { - LU = itm.LU, - ContractDocID = itm.ContractDocID, - Amt = itm.Amt, - Qty = itm.Qty, - BeginDate = itm.BeginDate, - EndDate = itm.EndDate - }; - groups1 = query.ToList(); - } - } - if (invoiceMap.Count > 0) - { - var groupList = new List(); - var notDetialList = new List(); - var detailList = new List(); - var invlist = new List(); - foreach (var group in invoiceMap) - { - var key = group.Key;//发票票号 - var ls = group.Value;//发票明细 - List _entityDetailList = new List(); - foreach (var detail in ls) - { - _entityDetailList.Add( - new INVOICE_WAIT_DETAIL( - guid: GuidGenerator.Create(), - version: main.Version, - invbillNum: key, - invGroupNum: main.InvGroupNum, - lU: detail.LU, - qty: detail.Qty, - bussiessType: EnumBusinessType.JisBBAC, - amt: detail.Amt, - pRICE: detail.Price, - extend1: detail.ContractDocID, - extend2: string.Empty, - beginDate: detail.BeginDate, - endDate: detail.EndDate - )); - } - if (_entityDetailList.Count > 0) - { - detailList.AddRange(_entityDetailList); - } - decimal amt = detailList.Sum(k => k.Amt); - decimal txtAmt = Math.Round(detailList.Sum(k => k.Amt), 2); - var contractList = ls.Select(p => p.ContractDocID).Distinct(); - var _groupList = dtos.Where(p => contractList.Contains(p.ContractDocID)).GroupBy(p => new { p.GroupNum }) - .Select(p => new { GroupNum = p.Key.GroupNum, Amt = p.Sum(itm => itm.Amt) }).Distinct(); - List group1 = new List(); - - foreach (var en in _groupList) - { - group1.Add( - new INVOICE_MAP_GROUP( - guid: GuidGenerator.Create(), - version: main.Version, - invbillNum: key, - invGroupNum: main.InvGroupNum, - settleGroupNum: en.GroupNum, - amt: en.Amt, - extend1: string.Empty, - extend2: string.Empty)); - } - if (group1.Count > 0) - { - groupList.AddRange(group1); - } - - var invbill = new INVOICE_GRP - (guid: GuidGenerator.Create(), - realnvBillNum: string.Empty, - invbillNum: key, - amt: amt, - taxAmt: txtAmt, - fileName: string.Empty, - businessType: EnumBusinessType.JisBBAC, - invGroupNum: main.InvGroupNum, - state: SettleBillState.已开票, - invoiceBillState: InvoiceBillState.正常, - tax: 0, - parent: string.Empty - ); - invlist.Add(invbill); - } - await _repository.DbContext.BulkInsertAsync(invlist); - await _repository.DbContext.BulkInsertAsync(groupList); - await _repository.DbContext.BulkInsertAsync(detailList); - //await _repository.DbContext.BulkInsertAsync(notDetialList); - } + await SecInvoice(dtos, main.Version, main.InvGroupNum, string.Empty, main.BusinessType); } } diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/HBPO_CAN_SA_SERVICE.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/HBPO_CAN_SA_SERVICE.cs index 0f896ea4..9efd5628 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/HBPO_CAN_SA_SERVICE.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/HBPO_CAN_SA_SERVICE.cs @@ -1,3 +1,4 @@ +using DocumentFormat.OpenXml.Bibliography; using EFCore.BulkExtensions; using Microsoft.AspNetCore.Authorization; @@ -6,6 +7,7 @@ using SettleAccount.Domain.BQ; using System; using System.Collections.Generic; using System.Linq; +using System.Security.Policy; using System.Text; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; @@ -18,9 +20,11 @@ using Win.Sfs.SettleAccount.CommonManagers; using Win.Sfs.SettleAccount.Constant; using Win.Sfs.SettleAccount.Entities.BQ.Dtos; using Win.Sfs.SettleAccount.Entities.BQ.Managers; +using Win.Sfs.SettleAccount.Entities.BQ.Temp; using Win.Sfs.SettleAccount.Entities.Prices; using Win.Sfs.SettleAccount.ExportReports; using Win.Sfs.Shared.RepositoryBase; +using static System.Runtime.CompilerServices.RuntimeHelpers; namespace Win.Sfs.SettleAccount.Entities.BQ { @@ -41,7 +45,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ HBPO_CAN_SA_DETAIL_EXP_DTO > { - private readonly INormalEfCoreRepository _notRepository; + private readonly INormalEfCoreRepository _notRepository; private readonly INormalEfCoreRepository _priceRepository; private readonly HBPO_CAN_SA_MNG _hbpoMng; @@ -52,7 +56,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ INormalEfCoreRepository repository, INormalEfCoreRepository detailRepository, INV_MNG invmng, - INormalEfCoreRepository notRepository, + INormalEfCoreRepository notRepository, INormalEfCoreRepository priceRepository, HBPO_CAN_SA_MNG hbpoMng @@ -64,12 +68,6 @@ namespace Win.Sfs.SettleAccount.Entities.BQ _notRepository = notRepository; _hbpoMng = hbpoMng; } - - - - - - /// /// 生成发票 /// @@ -86,370 +84,67 @@ namespace Win.Sfs.SettleAccount.Entities.BQ if (await _hbpoMng.SetForwardState(main, SettleBillState.已开票)) { var entitys = await _hbpoMng.GetDetalListAsync(input.BillNum); - - var groupNumList = entitys.Select(p => p.GroupNum).Distinct().ToList(); - - var notList = _notRepository.Where(p => groupNumList.Contains(p.InvGroupNum)).ToList();//不能结算 - - var dto1s = ObjectMapper.Map, List>(entitys); - - var priceList = _priceRepository.ToList();//价格单 - - var inner = from d in dto1s - join p in priceList on d.LU equals p.LU - where - d.SettleDate >= p.BeginTime && d.SettleDate <= p.EndTime - select d; - var left = from d in dto1s - join p in inner on new { d.LU, d.PN } equals new { p.LU, p.PN } - - into temp - from tm in temp.DefaultIfEmpty()//校验错误项 - where tm == null - select d; - - List errorList = new List(); - - foreach (var error in left) + var groupNumList = entitys.Select(p => p.GroupNum).Distinct().ToList(); + var notQuery = _notRepository.Where(p => groupNumList.Contains(p.InvGroupNum)).ToList(); + var dto1s = ObjectMapper.Map, List>(entitys); + var priceList = _priceRepository.ToList();//价格单 + var errorList=await CheckInvoiceGenerationRules(entitys, priceList,main.BusinessType);//校验生成规则 + if (errorList.Count() > 0) + { + return await ExportErrorReportAsync(errorList); + } + var q = from d in dto1s + join p in priceList on d.LU equals p.LU + where d.SettleDate >= p.BeginTime && d.SettleDate <= p.EndTime + select new TEMP_CAN_SA_DETAIL + { + SettleBillNum = d.SettleBillNum, + Site = d.Site, + Version = d.Version, + Price = p.Price, + BillNum = d.BillNum, + SettleDate = d.SettleDate, + InvGroupNum = d.InvGroupNum, + LU = d.LU, + MaterialDesc = d.MaterialDesc, + PN = d.PN, + Qty = d.Qty, + GroupNum = d.GroupNum, + Amt = Math.Round(d.Qty * p.Price, 2), + ContractDocID="no", + BeginDate = p.BeginTime, + EndDate = p.EndTime + }; + var dtos = q.ToList(); + if (dtos != null && dtos.Count > 0) + { + if (input.BillNum.Substring(0, 1) == "C")//一次开票 { - errorList.Add(new ERR_EXP_DTO() { ItemCode = error.LU, CustomCode = "业务类别HBPO", Version = main.Version.ToString(), Message = "LU:{0}PN:{1},下线日期:{2}没有对应区间销售价格表!" }); + var notlist = notQuery.Select(p => new TEMP_NOT_SA_DETAIL + { + KeyCode = p.KeyCode, + Version = p.Version, + SettleBillNum = p.SettleBillNum, + LU = p.LU, + PN = p.PN, + Site = p.Site, + Qty = p.Qty, + Price = p.Price, + BusinessType = p.BusinessType, + IsReturn = "", + InvGroupNum = p.InvGroupNum, + SettleDate = p.SettleDate, + GroupNum = p.GroupNum, + ContractDocID = string.Empty + + }).ToList();//不能结算 + await FirstInvoice(dtos, notlist, main.Version, main.InvGroupNum, string.Empty,main.BusinessType); } - if (errorList.Count() > 0) + else//二次开票 { - return await ExportErrorReportAsync(errorList); + await SecInvoice(dtos, main.Version, main.InvGroupNum, string.Empty, main.BusinessType); } - var q = from d in dto1s - join p in priceList on d.LU equals p.LU - where d.SettleDate >= p.BeginTime && d.SettleDate <= p.EndTime - select new TEMP_CAN_SA_DETAIL - { - SettleBillNum = d.SettleBillNum, - Site = d.Site, - Version = d.Version, - Price = p.Price, - BillNum = d.BillNum, - SettleDate = d.SettleDate, - InvGroupNum = d.InvGroupNum, - LU = d.LU, - MaterialDesc = d.MaterialDesc, - PN = d.PN, - Qty = d.Qty, - GroupNum = d.GroupNum, - Amt = Math.Round(d.Qty * p.Price, 2), - - BeginDate = p.BeginTime, - EndDate = p.EndTime - }; - var dtos = q.ToList(); - if (dtos != null && dtos.Count > 0) - { - if (input.BillNum.Substring(0, 1) == "C")//一次开票 - { - var _query = dtos.GroupBy(p => new { p.GroupNum }).Select(p => new { GroupNum = p.Key.GroupNum, Amt = p.Sum(itm => itm.Amt) }); - Dictionary dic = new Dictionary();//原本 - Dictionary copyDic = new Dictionary();//变换数组副本 - foreach (var itm in _query.ToList()) - { - dic.Add(itm.GroupNum, itm.Amt); - copyDic.Add(itm.GroupNum, itm.Amt); - } - Dictionary> invoiceMap = new Dictionary>(); - foreach (var itm in dic) - { - string invoiceBillNum = OrderNumberGenerator.GenerateOrderNumber("INV"); - List invoiceGroupNumList = new List();//每个发票对应的结算分组号 - List List = new List(); - decimal sum = itm.Value;//初始分组合计金额 - List luList = dtos.Where(p => p.GroupNum == itm.Key).Select(p => p.LU).Distinct().ToList(); //初始LU种类 - - if (copyDic.ContainsKey(itm.Key) == true)//是否存在分组 - { - foreach (var _itm1 in copyDic) - { - if (itm.Key == _itm1.Key)//相同结算分组项不计算,已初始化 - { - invoiceGroupNumList.Add(itm.Key); - continue; - } - //var grouplist = dtos.Where(p => p.GroupNum == _itm1.Key).Select(p => p.LU).Distinct().ToList();//每项LU种类 - //luList.AddRange(grouplist); - //luList = luList.Distinct().ToList(); - //if (luList.Count > 20)//累加零件不超过20种 - //{ - // continue; - //} - sum += _itm1.Value; - if (sum > 10000000) - { - break; - } - invoiceGroupNumList.Add(_itm1.Key);//所有条件都满足添加发票和结算分组对应关系 - } - invoiceMap.Add(invoiceBillNum, invoiceGroupNumList);//记录发票对应关系 - foreach (var rem in invoiceGroupNumList)//移除 - { - copyDic.Remove(rem); - } - } - } - if (invoiceMap.Keys.Count > 0) - { - var groupList = new List(); - var notDetialList = new List(); - var detailList = new List(); - var invlist = new List(); - foreach (var itm in invoiceMap)//分组影响和 - { - var key = itm.Key;//发票票号 - var ls = itm.Value;//结算分组号列表 - var detailDtos = dtos.Where(p => ls.Contains(p.GroupNum)).GroupBy(p => new { p.InvGroupNum, p.LU, p.Price,p.BeginDate,p.EndDate }) - .Select(itm => new - { - InvGroupNum = itm.Key.InvGroupNum, - LU = itm.Key.LU, - Price = itm.Key.Price, - Amt = Math.Round(itm.Sum(k => k.Qty) * itm.Key.Price, 2), - Qty = itm.Sum(k => k.Qty), - BeginDate = itm.Key.BeginDate, - EndDate = itm.Key.EndDate - }) - .ToList(); - decimal amt = detailDtos.Sum(k => k.Amt); - decimal txtAmt = Math.Round(detailDtos.Sum(k => k.Amt), 2); - var mapList = new List(); - foreach (var groupnum in ls) - { - - mapList.Add(new INVOICE_MAP_GROUP( - guid: GuidGenerator.Create(), - version: main.Version, - invbillNum: key, - invGroupNum: main.InvGroupNum, - settleGroupNum: groupnum, - amt: 0, - extend1: string.Empty, - extend2: string.Empty - ) - ); - } - if (mapList.Count > 0) - { - groupList.AddRange(mapList); - - } - List _entityDetailList = new List(); - foreach (var detail in detailDtos) - { - _entityDetailList.Add( - new INVOICE_WAIT_DETAIL( - guid: GuidGenerator.Create(), - version: main.Version, - invbillNum: key, - invGroupNum: main.InvGroupNum, - lU: detail.LU, - qty: detail.Qty, - bussiessType: EnumBusinessType.JisHBPO, - amt: detail.Amt, - pRICE: detail.Price, - extend1: string.Empty, - extend2: string.Empty, - beginDate:detail.BeginDate, - endDate:detail.EndDate - )); - } - if (_entityDetailList.Count > 0) - { - detailList.AddRange(_entityDetailList); - } - - var notls = notList.GroupBy(p => new { p.GroupNum, p.LU }).Select(p => new { GroupNum = p.Key.GroupNum, LU = p.Key.LU, Qty = p.Sum(itm => itm.Qty) }); - var innotls = new List(); - foreach (var nitm in notls) - { - innotls.Add(new INVOICE_NOT_SETTLE( - guid: GuidGenerator.Create(), - version: main.Version, - invGroupNum: main.InvGroupNum, - settleGroupNum: nitm.GroupNum, - lU: string.Empty, - lU1: nitm.LU, - extend1: string.Empty, - extend2: string.Empty, - qty: nitm.Qty - )); - } - if (innotls.Count > 0) - { - notDetialList.AddRange(innotls); - } - var invbill = new INVOICE_GRP - (guid: GuidGenerator.Create(), - realnvBillNum: string.Empty, - invbillNum: key, - amt: amt, - taxAmt: txtAmt, - fileName: string.Empty, - businessType: EnumBusinessType.JisHBPO, - invGroupNum: main.InvGroupNum, - state: SettleBillState.已开票, - invoiceBillState: InvoiceBillState.正常, - tax: 0, - parent: string.Empty - ); - invlist.Add(invbill); - } - await _repository.DbContext.BulkInsertAsync(invlist); - await _repository.DbContext.BulkInsertAsync(groupList); - await _repository.DbContext.BulkInsertAsync(detailList); - await _repository.DbContext.BulkInsertAsync(notDetialList); - } - } - else//二次开票 - { - var groups1 = dtos.GroupBy(p => new { p.LU, p.Price,p.BeginDate,p.EndDate }).Select(p => new TMEP_INV - { - LU = p.Key.LU, - Amt = p.Sum(itm => itm.Amt), - Qty = p.Sum(itm => itm.Qty), - Price = p.Key.Price, - BeginDate=p.Key.BeginDate, - EndDate=p.Key.EndDate - - }).ToList();//汇总记录不出现重复值 - var groups = dtos.GroupBy(p => new { p.LU, p.Price, p.BeginDate, p.EndDate }).Select(p => new TMEP_INV - { - LU = p.Key.LU, - Amt = p.Sum(itm => itm.Amt), - Qty = p.Sum(itm => itm.Qty), - Price = p.Key.Price, - BeginDate = p.Key.BeginDate, - EndDate = p.Key.EndDate - }).ToList();//汇总记录不出现重复值 - Dictionary> invoiceMap = new Dictionary>();//发票和发票明细关系 - foreach (var group in groups) - { - int i = groups1.Count(p => p.LU == group.LU &&p.BeginDate==group.BeginDate && p.EndDate==group.EndDate ); - if (i > 0) - { - string invoiceBillNum = OrderNumberGenerator.GenerateOrderNumber("CINV"); - List tempList = new List(); - decimal sum = group.Amt;//初始合计金额 - int partCount = 0; - foreach (var group1 in groups1) - { - if (group.LU == group1.LU && group.BeginDate == group1.BeginDate && group.EndDate == group1.EndDate) - { - tempList.Add(group1); - partCount++;//符合条件加入到零件中 - continue; - } - partCount++; - if (partCount > 30) - { - continue; - } - if (sum > 10000000) - { - break; - } - sum += group1.Amt; - tempList.Add(group1); - } - invoiceMap.Add(invoiceBillNum, tempList); - var query = from itm in groups1 - join itm1 in tempList - on new { itm.LU, itm.BeginDate,itm.EndDate} equals new { itm1.LU, itm1.BeginDate, itm1.EndDate } into temp - from tm in temp where tm==null - select new TMEP_INV { LU = itm.LU, Amt = itm.Amt, Qty = itm.Qty ,BeginDate=itm.BeginDate,EndDate=itm.EndDate }; - - groups1 = query.ToList(); - } - } - if (invoiceMap.Count > 0) - { - var groupList = new List(); - var notDetialList = new List(); - var detailList = new List(); - var invlist = new List(); - foreach (var group in invoiceMap) - { - var key = group.Key;//发票票号 - var ls = group.Value;//发票明细 - List _entityDetailList = new List(); - foreach (var detail in ls) - { - _entityDetailList.Add( - new INVOICE_WAIT_DETAIL( - guid: GuidGenerator.Create(), - version: main.Version, - invbillNum: key, - invGroupNum: main.InvGroupNum, - lU: detail.LU, - qty: detail.Qty, - bussiessType: EnumBusinessType.JisBBAC, - amt: detail.Amt, - pRICE: detail.Price, - extend1: string.Empty, - extend2: string.Empty, - beginDate: detail.BeginDate, - endDate: detail.EndDate - )); - } - if (_entityDetailList.Count > 0) - { - detailList.AddRange(_entityDetailList); - } - decimal amt = detailList.Sum(k => k.Amt); - decimal txtAmt = Math.Round(detailList.Sum(k => k.Amt), 2); - var contractList = ls.Select(p => p.ContractDocID).Distinct(); - var _groupList = dtos.GroupBy(p => new { p.GroupNum }) - .Select(p => new { GroupNum = p.Key.GroupNum, Amt = p.Sum(itm => itm.Amt) }).Distinct(); - List group1 = new List(); - - foreach (var en in _groupList) - { - group1.Add( - new INVOICE_MAP_GROUP( - guid: GuidGenerator.Create(), - version: main.Version, - invbillNum: key, - invGroupNum: main.InvGroupNum, - settleGroupNum: en.GroupNum, - amt: en.Amt, - extend1: string.Empty, - extend2: string.Empty)); - } - if (group1.Count > 0) - { - groupList.AddRange(group1); - } - - var invbill = new INVOICE_GRP - (guid: GuidGenerator.Create(), - realnvBillNum: string.Empty, - invbillNum: key, - amt: amt, - taxAmt: txtAmt, - fileName: string.Empty, - businessType: EnumBusinessType.JisHBPO, - invGroupNum: main.InvGroupNum, - state: SettleBillState.已开票, - invoiceBillState: InvoiceBillState.正常, - tax: 0, - parent: string.Empty - ); - invlist.Add(invbill); - } - await _repository.DbContext.BulkInsertAsync(invlist); - await _repository.DbContext.BulkInsertAsync(groupList); - await _repository.DbContext.BulkInsertAsync(detailList); - //await _repository.DbContext.BulkInsertAsync(notDetialList); - - } - - } - } } } @@ -457,5 +152,9 @@ namespace Win.Sfs.SettleAccount.Entities.BQ } + + + + } } diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/PUB_CAN_SA_SERVICE.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/PUB_CAN_SA_SERVICE.cs index 06ee2b7a..cd07c9cc 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/PUB_CAN_SA_SERVICE.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Application/Entities/BQ/PUB_CAN_SA_SERVICE.cs @@ -13,6 +13,7 @@ using Win.Sfs.SettleAccount.CommonManagers; using Win.Sfs.SettleAccount.Constant; using Win.Sfs.SettleAccount.Entities.BQ.Dtos; using Win.Sfs.SettleAccount.Entities.BQ.Managers; +using Win.Sfs.SettleAccount.Entities.BQ.Temp; using Win.Sfs.SettleAccount.Entities.Prices; using Win.Sfs.SettleAccount.ExportReports; using Win.Sfs.Shared.RepositoryBase; @@ -70,7 +71,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ { var entitys = await _pubMng.GetDetalListAsync(input.BillNum); var groupNumList = entitys.Select(p => p.GroupNum).Distinct().ToList(); - List errorList = new List(); + var dto1s = ObjectMapper.Map, List>(entitys); List priceList=new List(); if (main.BusinessType == EnumBusinessType.BeiJian) @@ -85,25 +86,11 @@ namespace Win.Sfs.SettleAccount.Entities.BQ { priceList = _priceRepository.ToList();//价格单 } - var inner = from d in dto1s - join p in priceList on d.LU equals p.LU - where - d.SettleDate >= p.BeginTime && d.SettleDate <= p.EndTime - select d; - var left = from d in dto1s - join p in inner on new { d.LU, d.PN } equals new { p.LU, p.PN } - - into temp - from tm in temp.DefaultIfEmpty()//校验错误项 - where tm == null - select d; - foreach (var error in left) + var errorList = await CheckInvoiceGenerationRules(entitys, priceList,main.BusinessType);//校验生成规则 + if (errorList.Count() > 0) { - errorList.Add(new ERR_EXP_DTO() { ItemCode = error.LU, CustomCode = "", Version = main.Version.ToString(), Message = "LU:{0}PN:{1},下线日期:{2}没有对应区间销售价格表!" }); + return await ExportErrorReportAsync(errorList); } - - - if (errorList.Count() > 0) { return await ExportErrorReportAsync(errorList); @@ -127,323 +114,22 @@ namespace Win.Sfs.SettleAccount.Entities.BQ Qty = d.Qty, GroupNum = d.GroupNum, Amt = Math.Round(d.Qty * p.Price, 2), - + ContractDocID="no", BeginDate = p.BeginTime, EndDate = p.EndTime }; var dtos = q.ToList(); if (dtos != null && dtos.Count > 0) { - if (input.BillNum.Substring(0, 1) == "C")//一次开票 - { - var _query = dtos.GroupBy(p => new { p.GroupNum }).Select(p => new { GroupNum = p.Key.GroupNum, Amt = p.Sum(itm => itm.Amt) }); - Dictionary dic = new Dictionary();//原本 - Dictionary copyDic = new Dictionary();//变换数组副本 - foreach (var itm in _query.ToList()) - { - dic.Add(itm.GroupNum, itm.Amt); - copyDic.Add(itm.GroupNum, itm.Amt); - } - Dictionary> invoiceMap = new Dictionary>(); - foreach (var itm in dic) - { - string invoiceBillNum = OrderNumberGenerator.GenerateOrderNumber("INV"); - List invoiceGroupNumList = new List();//每个发票对应的结算分组号 - List List = new List(); - decimal sum = itm.Value;//初始分组合计金额 - List luList = dtos.Where(p => p.GroupNum == itm.Key).Select(p => p.LU).Distinct().ToList(); //初始LU种类 - - if (copyDic.ContainsKey(itm.Key) == true)//是否存在分组 - { - foreach (var _itm1 in copyDic) - { - if (itm.Key == _itm1.Key)//相同结算分组项不计算,已初始化 - { - invoiceGroupNumList.Add(itm.Key); - continue; - } - //var grouplist = dtos.Where(p => p.GroupNum == _itm1.Key).Select(p => p.LU).Distinct().ToList();//每项LU种类 - //luList.AddRange(grouplist); - //luList = luList.Distinct().ToList(); - //if (luList.Count > 20)//累加零件不超过20种 - //{ - // continue; - //} - sum += _itm1.Value; - if (sum > 10000000) - { - break; - } - invoiceGroupNumList.Add(_itm1.Key);//所有条件都满足添加发票和结算分组对应关系 - } - invoiceMap.Add(invoiceBillNum, invoiceGroupNumList);//记录发票对应关系 - foreach (var rem in invoiceGroupNumList)//移除 - { - copyDic.Remove(rem); - } - } - } - if (invoiceMap.Keys.Count > 0) - { - - var groupList = new List(); - var notDetialList = new List(); - var detailList = new List(); - var invlist = new List(); - foreach (var itm in invoiceMap)//分组影响和 - { - var key = itm.Key;//发票票号 - var ls = itm.Value;//结算分组号列表 - var detailDtos = dtos.Where(p => ls.Contains(p.GroupNum)).GroupBy(p => new { p.InvGroupNum, p.LU, p.Price, p.BeginDate, p.EndDate }) - .Select(itm => new - { - InvGroupNum = itm.Key.InvGroupNum, - LU = itm.Key.LU, - Price = itm.Key.Price, - Amt = Math.Round(itm.Sum(k => k.Qty) * itm.Key.Price, 2), - Qty = itm.Sum(k => k.Qty), - BeginDate = itm.Key.BeginDate, - EndDate = itm.Key.EndDate - }) - .ToList(); - decimal amt = detailDtos.Sum(k => k.Amt); - decimal txtAmt = Math.Round(detailDtos.Sum(k => k.Amt), 2); - var mapList = new List(); - foreach (var groupnum in ls) - { - - mapList.Add(new INVOICE_MAP_GROUP( - guid: GuidGenerator.Create(), - version: main.Version, - invbillNum: key, - invGroupNum: main.InvGroupNum, - settleGroupNum: groupnum, - amt: 0, - extend1: string.Empty, - extend2: string.Empty - ) - ); - } - if (mapList.Count > 0) - { - groupList.AddRange(mapList); - - } - List _entityDetailList = new List(); - foreach (var detail in detailDtos) - { - _entityDetailList.Add( - new INVOICE_WAIT_DETAIL( - guid: GuidGenerator.Create(), - version: main.Version, - invbillNum: key, - invGroupNum: main.InvGroupNum, - lU: detail.LU, - qty: detail.Qty, - bussiessType: EnumBusinessType.JisHBPO, - amt: detail.Amt, - pRICE: detail.Price, - extend1: string.Empty, - extend2: string.Empty, - beginDate: detail.BeginDate, - endDate: detail.EndDate - )); - } - if (_entityDetailList.Count > 0) - { - detailList.AddRange(_entityDetailList); - } - - // var notls = notList.GroupBy(p => new { p.GroupNum, p.LU }).Select(p => new { GroupNum = p.Key.GroupNum, LU = p.Key.LU, Qty = p.Sum(itm => itm.Qty) }); - //var innotls = new List(); - //foreach (var nitm in notls) - //{ - // innotls.Add(new INVOICE_NOT_SETTLE( - // guid: GuidGenerator.Create(), - // version: main.Version, - // invGroupNum: main.InvGroupNum, - // settleGroupNum: nitm.GroupNum, - // lU: string.Empty, - // lU1: nitm.LU, - // extend1: string.Empty, - // extend2: string.Empty, - // qty: nitm.Qty - // )); - //} - //if (innotls.Count > 0) - //{ - // notDetialList.AddRange(innotls); - //} - var invbill = new INVOICE_GRP - (guid: GuidGenerator.Create(), - realnvBillNum: string.Empty, - invbillNum: key, - amt: amt, - taxAmt: txtAmt, - fileName: string.Empty, - businessType: EnumBusinessType.JisHBPO, - invGroupNum: main.InvGroupNum, - state: SettleBillState.已开票, - invoiceBillState: InvoiceBillState.正常, - tax:0, - parent:string.Empty - - - ); - invlist.Add(invbill); - } - await _repository.DbContext.BulkInsertAsync(invlist); - await _repository.DbContext.BulkInsertAsync(groupList); - await _repository.DbContext.BulkInsertAsync(detailList); - await _repository.DbContext.BulkInsertAsync(notDetialList); - } - } - else//二次开票 - { - var groups1 = dtos.GroupBy(p => new { p.LU, p.Price, p.BeginDate, p.EndDate }).Select(p => new TMEP_INV - { - LU = p.Key.LU, - Amt = p.Sum(itm => itm.Amt), - Qty = p.Sum(itm => itm.Qty), - Price = p.Key.Price, - BeginDate = p.Key.BeginDate, - EndDate = p.Key.EndDate - - }).ToList();//汇总记录不出现重复值 - var groups = dtos.GroupBy(p => new { p.LU, p.Price, p.BeginDate, p.EndDate }).Select(p => new TMEP_INV + if (input.BillNum.Substring(0, 1) == "C")//一次开票 { - LU = p.Key.LU, - Amt = p.Sum(itm => itm.Amt), - Qty = p.Sum(itm => itm.Qty), - Price = p.Key.Price, - BeginDate = p.Key.BeginDate, - EndDate = p.Key.EndDate - }).ToList();//汇总记录不出现重复值 - Dictionary> invoiceMap = new Dictionary>();//发票和发票明细关系 - foreach (var group in groups) - { - int i = groups1.Count(p => p.LU == group.LU && p.BeginDate == group.BeginDate && p.EndDate == group.EndDate); - if (i > 0) - { - string invoiceBillNum = OrderNumberGenerator.GenerateOrderNumber("CINV"); - List tempList = new List(); - decimal sum = group.Amt;//初始合计金额 - int partCount = 0; - foreach (var group1 in groups1) - { - if (group.LU == group1.LU && group.BeginDate == group1.BeginDate && group.EndDate == group1.EndDate) - { - tempList.Add(group1); - partCount++;//符合条件加入到零件中 - continue; - } - partCount++; - if (partCount > 30) - { - continue; - } - if (sum > 10000000) - { - break; - } - sum += group1.Amt; - tempList.Add(group1); - } - invoiceMap.Add(invoiceBillNum, tempList); - var query = from itm in groups1 - join itm1 in tempList - on new { itm.LU, itm.BeginDate, itm.EndDate } equals new { itm1.LU, itm1.BeginDate, itm1.EndDate } into temp - from tm in temp - where tm == null - select new TMEP_INV { LU = itm.LU, Amt = itm.Amt, Qty = itm.Qty, BeginDate = itm.BeginDate, EndDate = itm.EndDate }; - - groups1 = query.ToList(); - } + + await FirstInvoice(dtos,new List(), main.Version, main.InvGroupNum, string.Empty, main.BusinessType); } - if (invoiceMap.Count > 0) + else//二次开票 { - var groupList = new List(); - var notDetialList = new List(); - var detailList = new List(); - var invlist = new List(); - foreach (var group in invoiceMap) - { - var key = group.Key;//发票票号 - var ls = group.Value;//发票明细 - List _entityDetailList = new List(); - foreach (var detail in ls) - { - _entityDetailList.Add( - new INVOICE_WAIT_DETAIL( - guid: GuidGenerator.Create(), - version: main.Version, - invbillNum: key, - invGroupNum: main.InvGroupNum, - lU: detail.LU, - qty: detail.Qty, - bussiessType: EnumBusinessType.JisBBAC, - amt: detail.Amt, - pRICE: detail.Price, - extend1: string.Empty, - extend2: string.Empty, - beginDate: detail.BeginDate, - endDate: detail.EndDate - )); - } - if (_entityDetailList.Count > 0) - { - detailList.AddRange(_entityDetailList); - } - decimal amt = detailList.Sum(k => k.Amt); - decimal txtAmt = Math.Round(detailList.Sum(k => k.Amt), 2); - var contractList = ls.Select(p => p.ContractDocID).Distinct(); - var _groupList = dtos.GroupBy(p => new { p.GroupNum }) - .Select(p => new { GroupNum = p.Key.GroupNum, Amt = p.Sum(itm => itm.Amt) }).Distinct(); - List group1 = new List(); - - foreach (var en in _groupList) - { - group1.Add( - new INVOICE_MAP_GROUP( - guid: GuidGenerator.Create(), - version: main.Version, - invbillNum: key, - invGroupNum: main.InvGroupNum, - settleGroupNum: en.GroupNum, - amt: en.Amt, - extend1: string.Empty, - extend2: string.Empty)); - } - if (group1.Count > 0) - { - groupList.AddRange(group1); - } - - var invbill = new INVOICE_GRP - (guid: GuidGenerator.Create(), - realnvBillNum: string.Empty, - invbillNum: key, - amt: amt, - taxAmt: txtAmt, - fileName: string.Empty, - businessType: EnumBusinessType.JisHBPO, - invGroupNum: main.InvGroupNum, - state: SettleBillState.已开票, - invoiceBillState: InvoiceBillState.正常, - tax:0, - parent:string.Empty - ); - invlist.Add(invbill); - } - await _repository.DbContext.BulkInsertAsync(invlist); - await _repository.DbContext.BulkInsertAsync(groupList); - await _repository.DbContext.BulkInsertAsync(detailList); - //await _repository.DbContext.BulkInsertAsync(notDetialList); - + await SecInvoice(dtos, main.Version, main.InvGroupNum, string.Empty, main.BusinessType); } - - } - } } } diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Managers/BBAC_CAN_SA_MNG.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Managers/BBAC_CAN_SA_MNG.cs index ef6bbccf..4752bd03 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Managers/BBAC_CAN_SA_MNG.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Managers/BBAC_CAN_SA_MNG.cs @@ -51,9 +51,6 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers } - - - /// /// 向前流程 /// @@ -209,7 +206,6 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers public virtual async Task SetNewState(BBAC_CAN_SA p_entiy) { - return await SetNewState(p_entiy.BillNum); } diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Managers/INV_MNG.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Managers/INV_MNG.cs index 8f6a89e4..d3929488 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Managers/INV_MNG.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Managers/INV_MNG.cs @@ -1,6 +1,7 @@ using EFCore.BulkExtensions; using Hangfire; using Microsoft.AspNetCore.SignalR; +using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.EntityFrameworkCore; using NPOI.SS.Formula.Functions; using SettleAccount.Bases; @@ -14,18 +15,21 @@ using Volo.Abp; using Volo.Abp.Auditing; using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Services; +using Win.Sfs.SettleAccount.Bases; +using Win.Sfs.SettleAccount.Entities.BQ.Temp; +using Win.Sfs.SettleAccount.Entities.Prices; using Win.Sfs.Shared.RepositoryBase; namespace Win.Sfs.SettleAccount.Entities.BQ.Managers { - public class INV_MNG:DomainService + public class INV_MNG : DomainService { //private readonly INormalEfCoreRepository _canRepository; private readonly INormalEfCoreRepository _repository; private readonly INormalEfCoreRepository _groupRepository; private readonly INormalEfCoreRepository _detailRepository; private readonly INormalEfCoreRepository _notRepository; - + private readonly INormalEfCoreRepository _adjRepository; private readonly PUB_CAN_SA_MNG _pubMng; @@ -36,14 +40,11 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers PUB_CAN_SA_MNG pubMng, BBAC_CAN_SA_MNG bbacMng, HBPO_CAN_SA_MNG hbpoMng, - - - - INormalEfCoreRepository repository, - INormalEfCoreRepository groupRepository, - INormalEfCoreRepository detailRepository, - INormalEfCoreRepository notRepository, - INormalEfCoreRepository adjRepository + INormalEfCoreRepository repository, + INormalEfCoreRepository groupRepository, + INormalEfCoreRepository detailRepository, + INormalEfCoreRepository notRepository, + INormalEfCoreRepository adjRepository ) { //_canRepository = canRepository; @@ -61,18 +62,18 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers { } - public virtual async Task SetForwardState(string p_groupBillnum , SettleBillState p_State) + public virtual async Task SetForwardState(string p_groupBillnum, SettleBillState p_State) { - var _first=_repository.Where(p => p.InvbillNum == p_groupBillnum).FirstOrDefault(); + var _first = _repository.Where(p => p.InvbillNum == p_groupBillnum).FirstOrDefault(); if (_first != null) { - return await SetForwardState(_first, p_State); + return await SetForwardState(_first, p_State); } return false; } - - private async Task SetSettleState(INVOICE_GRP p_entiy, SettleBillState p_State,bool IsForward=true) + + private async Task SetSettleState(INVOICE_GRP p_entiy, SettleBillState p_State, bool IsForward = true) { if (p_entiy.BusinessType == EnumBusinessType.BeiJian || p_entiy.BusinessType == EnumBusinessType.YinDuJian || @@ -119,7 +120,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers { isSucc = await _hbpoMng.SetBackwardState(p_entiy.InvGroupNum, p_State); } - + return isSucc; } return false; @@ -133,12 +134,18 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers /// public virtual async Task SetForwardState(INVOICE_GRP p_entiy, SettleBillState p_State) { + if (p_entiy.InvoiceState == InvoiceBillState.报废) + { + throw new BusinessException("8989", "当前发票已报废不能进行操作"); + } + var state = p_State; switch (p_State) { case SettleBillState.财务已审核: if (p_entiy.State == SettleBillState.商务已审核) { + p_entiy.State = state; } else @@ -167,9 +174,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers } break; } - - - var flag= await SetSettleState(p_entiy, p_State,true); + var flag = await SetSettleState(p_entiy, p_State, true); if (flag == true) { await _repository.UpdateAsync(p_entiy); @@ -222,7 +227,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers } break; } - var flag = await SetSettleState(p_entiy, p_State,false); + var flag = await SetSettleState(p_entiy, p_State, false); if (flag == false) { return false; @@ -242,9 +247,9 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers /// /// /// - public virtual async Task GetMainAsync(string p_groupbillNum) + public virtual async Task GetMainAsync(string p_invbillNum) { - return await _repository.Where(p => p.InvbillNum == p_groupbillNum).FirstOrDefaultAsync(); + return await _repository.Where(p => p.InvbillNum == p_invbillNum).FirstOrDefaultAsync(); } /// @@ -431,12 +436,15 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers /// public virtual async Task Reject(string groupbillNum) { - - var _ls=await _repository.Where(p => p.InvGroupNum == groupbillNum).ToListAsync(); - - if (_ls != null && _ls.Count > 0) + var ls = await _repository.Where(p => p.InvGroupNum == groupbillNum).ToListAsync(); + if (ls != null && ls.Count > 0) { - foreach (var p_entity in _ls) + var first = ls.FirstOrDefault(); + if(first.State==SettleBillState.客户已收票 || first.State== SettleBillState.已扣减) + { + throw new BusinessException("8989",$"发票分组{groupbillNum}客户已经是客户已收票或已扣减状态不能退回"); + } + foreach (var p_entity in ls) { if (p_entity.State == SettleBillState.财务已审核 || p_entity.State == SettleBillState.已开票 || p_entity.State == SettleBillState.商务已审核) @@ -445,26 +453,30 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers var groupList = _groupRepository.Where(p => p.InvGroupNum == p_entity.InvGroupNum).ToList(); var notList = _notRepository.Where(p => p.InvGroupNum == p_entity.InvGroupNum).ToList(); var detailList = _detailRepository.Where(p => p.InvGroupNum == p_entity.InvGroupNum).ToList(); - //var canList = _canRepository.Where(p => p.InvGroupNum == p_entity.InvGroupNum).ToList(); - //foreach (var itm in canList) - //{ - // itm.State = SettleBillState.未结状态; - //} await _repository.DbContext.BulkDeleteAsync(entList); await _repository.DbContext.BulkDeleteAsync(groupList); await _repository.DbContext.BulkDeleteAsync(notList); await _repository.DbContext.BulkDeleteAsync(detailList); + if (first.BusinessType == EnumBusinessType.JisBBAC) + { + await _bbacMng.SetNewState(groupbillNum); + } + else if (first.BusinessType == EnumBusinessType.JisHBPO) + { + await _hbpoMng.SetNewState(groupbillNum); + } + else + { + await _pubMng.SetNewState(groupbillNum); + } //await _repository.DbContext.BulkUpdateAsync(canList); } - if (p_entity.State == SettleBillState.已扣减) - { - - } + } } else { - + throw new BusinessException("8989",$"查询不到发票分组号为{groupbillNum}发票分组"); } return true; } @@ -483,7 +495,7 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers { } - + } @@ -533,11 +545,421 @@ namespace Win.Sfs.SettleAccount.Entities.BQ.Managers } + /// + /// hbpo、jit、备件等 + /// + /// 可结算明细列表 + /// 版本号 + /// 发票分组 + /// 原发票号 + public async Task SecInvoice(List dtos, int p_version, string p_InvGroupNum, string p_parentInvBillNum, EnumBusinessType businessType) + { + + var groups1 = dtos.GroupBy(p => new { p.LU, p.Price, p.BeginDate, p.EndDate, p.ContractDocID }).Select(p => new TMEP_INV + { + LU = p.Key.LU, + Amt = p.Sum(itm => itm.Amt), + Qty = p.Sum(itm => itm.Qty), + ContractDocID = p.Key.ContractDocID, + Price = p.Key.Price, + BeginDate = p.Key.BeginDate, + EndDate = p.Key.EndDate + + }).ToList();//汇总记录不出现重复值 + var groups = dtos.GroupBy(p => new { p.LU, p.Price, p.BeginDate, p.EndDate, p.ContractDocID }).Select(p => new TMEP_INV + { + LU = p.Key.LU, + Amt = p.Sum(itm => itm.Amt), + Qty = p.Sum(itm => itm.Qty), + Price = p.Key.Price, + BeginDate = p.Key.BeginDate, + EndDate = p.Key.EndDate + }).ToList();//汇总记录不出现重复值 + Dictionary> invoiceMap = new Dictionary>();//发票和发票明细关系 + foreach (var group in groups) + { + int i = groups1.Count(p => p.LU == group.LU + && p.BeginDate == group.BeginDate + && p.EndDate == group.EndDate + && p.ContractDocID == group.ContractDocID + ); + if (i > 0) + { + string invoiceBillNum = OrderNumberGenerator.GenerateOrderNumber("CINV"); + List tempList = new List(); + decimal sum = group.Amt;//初始合计金额 + int partCount = 0; + foreach (var group1 in groups1) + { + if (group.LU == group1.LU + && group.BeginDate == group1.BeginDate + && group.EndDate == group1.EndDate + && group1.ContractDocID == group.ContractDocID + ) + { + tempList.Add(group1); + partCount++;//符合条件加入到零件中 + continue; + } + partCount++; + if (partCount > 30) + { + continue; + } + if (sum > 10000000) + { + break; + } + sum += group1.Amt; + tempList.Add(group1); + } + invoiceMap.Add(invoiceBillNum, tempList); + var query = from itm in groups1 + join itm1 in tempList + on new { itm.LU, itm.BeginDate, itm.EndDate, itm.ContractDocID } + equals new { itm1.LU, itm1.BeginDate, itm1.EndDate, itm1.ContractDocID } into temp + from tm in temp + where tm == null + select new TMEP_INV + { + LU = itm.LU, + Amt = itm.Amt, + Qty = itm.Qty, + BeginDate = itm.BeginDate, + ContractDocID = itm.ContractDocID, + EndDate = itm.EndDate + }; + + groups1 = query.ToList(); + } + } + if (invoiceMap.Count > 0) + { + var groupList = new List(); + var notDetialList = new List(); + var detailList = new List(); + var invlist = new List(); + foreach (var group in invoiceMap) + { + var key = group.Key;//发票票号 + var ls = group.Value;//发票明细 + List _entityDetailList = new List(); + foreach (var detail in ls) + { + _entityDetailList.Add( + new INVOICE_WAIT_DETAIL( + guid: GuidGenerator.Create(), + version: p_version, + invbillNum: key, + invGroupNum: p_InvGroupNum, + lU: detail.LU, + qty: detail.Qty, + bussiessType: businessType, + amt: detail.Amt, + pRICE: detail.Price, + extend1: string.Empty, + extend2: string.Empty, + beginDate: detail.BeginDate, + endDate: detail.EndDate + )); + } + if (_entityDetailList.Count > 0) + { + detailList.AddRange(_entityDetailList); + } + decimal amt = detailList.Sum(k => k.Amt); + decimal txtAmt = Math.Round(detailList.Sum(k => k.Amt), 2); + var contractList = ls.Select(p => p.ContractDocID).Distinct(); + var _groupList = dtos.Where(p => contractList.Contains(p.ContractDocID)).GroupBy(p => new { p.GroupNum }) + .Select(p => new { GroupNum = p.Key.GroupNum, Amt = p.Sum(itm => itm.Amt) }).Distinct(); + //var _groupList = dtos.GroupBy(p => new { p.GroupNum }) + // .Select(p => new { GroupNum = p.Key.GroupNum, Amt = p.Sum(itm => itm.Amt) }).Distinct(); + List group1 = new List(); + + foreach (var en in _groupList) + { + group1.Add( + new INVOICE_MAP_GROUP( + guid: GuidGenerator.Create(), + version: p_version, + invbillNum: key, + invGroupNum: p_InvGroupNum, + settleGroupNum: en.GroupNum, + amt: en.Amt, + extend1: string.Empty, + extend2: string.Empty)); + } + if (group1.Count > 0) + { + groupList.AddRange(group1); + } + + var invbill = new INVOICE_GRP + (guid: GuidGenerator.Create(), + realnvBillNum: string.Empty, + invbillNum: key, + amt: amt, + taxAmt: txtAmt, + fileName: string.Empty, + businessType: businessType, + invGroupNum: p_InvGroupNum, + state: SettleBillState.已开票, + invoiceBillState: InvoiceBillState.正常, + tax: 0, + parent: p_parentInvBillNum + ); + invlist.Add(invbill); + } + await _repository.DbContext.BulkInsertAsync(invlist); + await _repository.DbContext.BulkInsertAsync(groupList); + await _repository.DbContext.BulkInsertAsync(detailList); + //await _repository.DbContext.BulkInsertAsync(notDetialList); + return true; + + } + return false; + + } + + /// + /// 第一次开票 + /// + /// + /// + /// + /// + /// + /// + /// + public async Task FirstInvoice(List dtos, List p_notlist, int p_version, string p_InvGroupNum, string p_parentInvBillNum, EnumBusinessType businessType) + { + var _query = dtos.GroupBy(p => new { p.GroupNum }).Select(p => new { GroupNum = p.Key.GroupNum, Amt = p.Sum(itm => itm.Amt) }); + Dictionary dic = new Dictionary();//原本 + Dictionary copyDic = new Dictionary();//变换数组副本 + foreach (var itm in _query.ToList()) + { + dic.Add(itm.GroupNum, itm.Amt); + copyDic.Add(itm.GroupNum, itm.Amt); + } + Dictionary> invoiceMap = new Dictionary>(); + foreach (var itm in dic) + { + string invoiceBillNum = OrderNumberGenerator.GenerateOrderNumber("INV"); + List invoiceGroupNumList = new List();//每个发票对应的结算分组号 + List List = new List(); + decimal sum = itm.Value;//初始分组合计金额 + // List luList = dtos.Where(p => p.GroupNum == itm.Key).Select(p => p.LU).Distinct().ToList(); //初始LU种类 + if (copyDic.ContainsKey(itm.Key) == true)//是否存在分组 + { + foreach (var _itm1 in copyDic) + { + if (itm.Key == _itm1.Key)//相同结算分组项不计算,已初始化 + { + invoiceGroupNumList.Add(itm.Key); + continue; + } + //var grouplist = dtos.Where(p => p.GroupNum == _itm1.Key).Select(p => p.LU).Distinct().ToList();//每项LU种类 + //luList.AddRange(grouplist); + //luList = luList.Distinct().ToList(); + //if (luList.Count > 20)//累加零件不超过20种 + //{ + // continue; + //} + sum += _itm1.Value; + if (sum > 10000000) + { + break; + } + invoiceGroupNumList.Add(_itm1.Key);//所有条件都满足添加发票和结算分组对应关系 + } + invoiceMap.Add(invoiceBillNum, invoiceGroupNumList);//记录发票对应关系 + foreach (var rem in invoiceGroupNumList)//移除 + { + copyDic.Remove(rem); + } + } + } + if (invoiceMap.Keys.Count > 0) + { + + var groupList = new List(); + var notDetialList = new List(); + var detailList = new List(); + var invlist = new List(); + foreach (var itm in invoiceMap)//分组影响和 + { + var key = itm.Key;//发票票号 + var ls = itm.Value;//结算分组号列表 + var detailDtos = dtos.Where(p => ls.Contains(p.GroupNum)).GroupBy(p => new { p.InvGroupNum, p.LU, p.Price, p.BeginDate, p.EndDate, p.ContractDocID }) + .Select(itm => new + { + InvGroupNum = itm.Key.InvGroupNum, + LU = itm.Key.LU, + ContactDocID = itm.Key.ContractDocID, + Price = itm.Key.Price, + Amt = Math.Round(itm.Sum(k => k.Qty) * itm.Key.Price, 2), + Qty = itm.Sum(k => k.Qty), + BeginDate = itm.Key.BeginDate, + EndDate = itm.Key.EndDate + }) + .ToList(); + decimal amt = detailDtos.Sum(k => k.Amt); + decimal txtAmt = Math.Round(detailDtos.Sum(k => k.Amt), 2); + var mapList = new List(); + foreach (var groupnum in ls) + { + mapList.Add(new INVOICE_MAP_GROUP( + guid: GuidGenerator.Create(), + version: p_version, + invbillNum: key, + invGroupNum: p_InvGroupNum, + settleGroupNum: groupnum, + amt: 0, + extend1: string.Empty, + extend2: string.Empty + ) + ); + } + if (mapList.Count > 0) + { + groupList.AddRange(mapList); + } + List _entityDetailList = new List(); + foreach (var detail in detailDtos) + { + _entityDetailList.Add( + new INVOICE_WAIT_DETAIL( + guid: GuidGenerator.Create(), + version: p_version, + invbillNum: key, + invGroupNum: p_InvGroupNum, + lU: detail.LU, + qty: detail.Qty, + bussiessType: businessType, + amt: detail.Amt, + pRICE: detail.Price, + extend1: string.Empty, + extend2: string.Empty, + beginDate: detail.BeginDate, + endDate: detail.EndDate + )); + } + if (_entityDetailList.Count > 0) + { + detailList.AddRange(_entityDetailList); + } + var innotls = new List(); + + if (p_notlist != null && p_notlist.Count > 0) + { + var notls = p_notlist.GroupBy(p => new { p.GroupNum, p.LU }).Select(p => new { GroupNum = p.Key.GroupNum, LU = p.Key.LU, Qty = p.Sum(itm => itm.Qty) }); + foreach (var nitm in notls) + { + innotls.Add(new INVOICE_NOT_SETTLE( + guid: GuidGenerator.Create(), + version: p_version, + invGroupNum: p_InvGroupNum, + settleGroupNum: nitm.GroupNum, + lU: string.Empty, + lU1: nitm.LU, + extend1: string.Empty, + extend2: string.Empty, + qty: nitm.Qty + )); + } + if (innotls.Count > 0) + { + notDetialList.AddRange(innotls); + } + } + var invbill = new INVOICE_GRP + (guid: GuidGenerator.Create(), + realnvBillNum: string.Empty, + invbillNum: key, + amt: amt, + taxAmt: txtAmt, + fileName: string.Empty, + businessType: businessType, + invGroupNum: p_InvGroupNum, + state: SettleBillState.已开票, + invoiceBillState: InvoiceBillState.正常, + tax: 0, + parent: string.Empty + ); + invlist.Add(invbill); + } + await _repository.DbContext.BulkInsertAsync(invlist); + await _repository.DbContext.BulkInsertAsync(groupList); + await _repository.DbContext.BulkInsertAsync(detailList); + if (notDetialList.Count > 0) + { + await _repository.DbContext.BulkInsertAsync(notDetialList); + } + } + return true; + } + /// + /// + /// + /// + /// + /// + /// + /// + public async Task ReissueFirstInvoice(List dtos, string p_OldInvBillNum, int p_version) + { + if (!string.IsNullOrEmpty(p_OldInvBillNum)) + { + var inv = await GetInvoiceAsync(p_OldInvBillNum); + if (inv == null) + { + throw new BusinessException("8989", $"找不到选择要重开发票号{p_OldInvBillNum}不能重开"); + } + if (inv.InvoiceState == InvoiceBillState.报废) + { + throw new BusinessException("8989", $"选择要重开发票号{p_OldInvBillNum}已经作废不能重开"); + } + inv.InvoiceState = InvoiceBillState.报废; + await FirstInvoice(dtos, new List(), p_version, inv.InvGroupNum, inv.InvbillNum, inv.BusinessType); + _repository.DbContext.BulkUpdate(new List { inv }); + return true; + } + return false; + } + /// + /// + /// + /// + /// + /// + /// + /// + public async Task ReissueSecInvoice(List dtos, string p_OldInvBillNum, int p_version) + { + if (!string.IsNullOrEmpty(p_OldInvBillNum)) + { + var inv = await GetInvoiceAsync(p_OldInvBillNum); + if (inv == null) + { + throw new BusinessException("8989", $"找不到选择要重开发票号{p_OldInvBillNum}不能重开"); + } + if (inv.InvoiceState == InvoiceBillState.报废) + { + throw new BusinessException("8989", $"选择要重开发票号{p_OldInvBillNum}已经作废不能重开"); + } + inv.InvoiceState = InvoiceBillState.报废; + + await FirstInvoice(dtos, new List(), p_version, inv.InvGroupNum, inv.InvbillNum, inv.BusinessType); + _repository.DbContext.BulkUpdate(new List { inv }); + return true; + } + return false; + } } } diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Temp/TempClass.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Temp/TempClass.cs new file mode 100644 index 00000000..c16ff5d5 --- /dev/null +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Domain/Entities/BQ/Temp/TempClass.cs @@ -0,0 +1,183 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SettleAccount.Bases; + +namespace Win.Sfs.SettleAccount.Entities.BQ.Temp; +public class TMEP_INV +{ + public string LU { set; get; } + public string ContractDocID { set; get; } + public decimal Amt { set; get; } + public decimal Qty { set; get; } + public decimal Price { set; get; } + /// + /// 开始日期 + /// + public DateTime BeginDate { get; set; } + /// + /// 结束日期 + /// + public DateTime EndDate { get; set; } +} + +public class TEMP_CAN_SA_DETAIL +{ + /// + ///关联结算单号 + /// + public string SettleBillNum { get; set; } + /// + ///工厂地点 + /// + + public string Site { get; set; } + /// + /// 版本 + /// + public int Version { get; set; } + /// + /// 单价 + /// + public decimal Price { get; set; } + /// + /// 结算单号(发票分组号) + /// + public string BillNum { get; set; } + /// + /// 结算日期 + /// + public DateTime SettleDate { get; set; } + /// + ///发票组号 + /// + public string InvGroupNum { get; set; } + /// + /// 零件号 + /// + public string LU { get; set; } + + + /// + /// 物料描述 + /// + public string MaterialDesc { get; set; } + + + /// + /// 生产号 + /// + public string PN { get; set; } + /// + /// 结算数量 + /// + public decimal Qty { get; set; } + /// + /// 结算分组号 + /// + public string GroupNum { get; set; } + /// + /// 金额 + /// + public decimal Amt { get; set; } + + /// + /// 合同号 + /// + public string ContractDocID { set; get; } + /// + /// 开始日期 + /// + public DateTime BeginDate { get; set; } + /// + /// 结束日期 + /// + public DateTime EndDate { get; set; } + + +} +public class TEMP_NOT_SA_DETAIL : SA_NOT_BASE +{ + ///// + ///// 对应字段(Material+ExternalCalNumber) + ///// + //[Display(Name = "LU+生产码")] + //public string KeyCode { get; set; } = null!; + + ///// + ///// 期间 + ///// + //[Display(Name = "期间")] + //public int Version { get; set; } + + ///// + ///// 结算单号 + ///// + //[Display(Name = "结算单号")] + //public string SettleBillNum { get; set; } = null!; + + ///// + ///// 对应字段Material + ///// + //[Display(Name = "零件号")] + //public string LU { get; set; } = null!; + + ///// + ///// 对应字段ExternalCalNumber + ///// + //[Display(Name = "生产码")] + //public string PN { get; set; } = null!; + + /// + /// 选择工厂导入 + /// + [Display(Name = "工厂地点")] + public string Site { get; set; } = null!; + + /// + /// 对应字段Quantity + /// + //[Display(Name = "结算数量")] + //public decimal Qty { get; set; } + + ///// + ///// 匹配价格表对应区间对应地点带出 + ///// + //[Display(Name = "单价")] + //public decimal Price { get; set; } + + /// + /// ExternalCallNumber包含(R0)为买单件 1为JIS 2.为买单件 + /// + [Display(Name = "业务类别")] + public EnumBusinessType BusinessType { get; set; } + + /// + /// 对应字段MovementType,996正常,997为退货 + /// + [Display(Name = "是否退货")] + public string IsReturn { get; set; } = null!; + + //[Display(Name = "发票分组号")] + //public string InvGroupNum { get; set; } = null!; + + ///// + ///// 对应字段PostingDate + ///// + //[Display(Name = "结算日期(收货日期)")] + //public DateTime SettleDate { get; set; } + + /// + /// 对应字段Reference + /// + //[Display(Name = "结算分组")] + //public string GroupNum { get; set; } = null!; + + [Display(Name = "合同号")] + public string ContractDocID { get; set; } + + +} diff --git a/code/src/Modules/SettleAccount/src/SettleAccount.Domain/EnumBillState.cs b/code/src/Modules/SettleAccount/src/SettleAccount.Domain/EnumBillState.cs index 970ff8a9..8be265d7 100644 --- a/code/src/Modules/SettleAccount/src/SettleAccount.Domain/EnumBillState.cs +++ b/code/src/Modules/SettleAccount/src/SettleAccount.Domain/EnumBillState.cs @@ -35,7 +35,7 @@ namespace Win.Sfs.SettleAccount public enum InvoiceBillState { - [Description("正常")] + [Description("在用")] 正常 = 1, [Description("报废")] 报废 = 2,