You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

331 lines
14 KiB

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Text;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Bibliography;
using DocumentFormat.OpenXml.Office2010.Excel;
using DocumentFormat.OpenXml.Wordprocessing;
using EFCore.BulkExtensions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
using SettleAccount.Bases;
using SettleAccount.Domain.BQ;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Win.Abp.Snowflakes;
using Win.Sfs.BaseData.ImportExcelCommon;
using Win.Sfs.SettleAccount.Bases.DomainServices;
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.MaterialRelationships;
using Win.Sfs.Shared.RepositoryBase;
using static System.Runtime.CompilerServices.RuntimeHelpers;
namespace Win.Sfs.SettleAccount.Bases;
/// <summary>
/// 发票明细调整表
/// </summary>
[AllowAnonymous]
[Route("api/settleaccount/[controller]/[action]")]
public class ADJ_SERVICE : BASE_SERVICE
{
protected readonly INormalEfCoreRepository<PUB_ADJ_DETAIL, Guid> _repository;
protected readonly BaseDomainService _baseDomainService;
protected readonly INormalEfCoreRepository<INVOICE_GRP, Guid> _invRepository;
protected readonly INormalEfCoreRepository<MaterialRelationship, Guid> _relRepository;
protected readonly INormalEfCoreRepository<BBAC_NOT_SA_DETAIL, Guid> _bbacRepository;
protected readonly INormalEfCoreRepository<PUB_NOT_SA_DETAIL, Guid> _pubRepository;
protected readonly INormalEfCoreRepository<HBPO_NOT_SA_DETAIL, Guid> _hbpoRepository;
protected readonly INormalEfCoreRepository<PriceList, Guid> _priceRepository;
protected readonly INormalEfCoreRepository<PriceListBJ, Guid> _pricebjRepository;
public ADJ_SERVICE(
INormalEfCoreRepository<PUB_ADJ_DETAIL, Guid> repository,
BaseDomainService baseDomainService,
IExcelImportAppService excelImportService,
ISnowflakeIdGenerator snowflakeIdGenerator,
ICommonManager commonManager,
INormalEfCoreRepository<INVOICE_GRP, Guid> invRepository,
INormalEfCoreRepository<MaterialRelationship, Guid> relRepository,
INormalEfCoreRepository<BBAC_NOT_SA_DETAIL, Guid> bbacRepository,
INormalEfCoreRepository<PUB_NOT_SA_DETAIL, Guid> pubRepository,
INormalEfCoreRepository<HBPO_NOT_SA_DETAIL, Guid> hbpoRepository,
INormalEfCoreRepository<PriceList, Guid> priceRepository,
INormalEfCoreRepository<PriceListBJ, Guid> pricebjRepository
)
: base(excelImportService, snowflakeIdGenerator, commonManager)
{
_relRepository = relRepository;
_invRepository = invRepository;
_repository = repository;
_baseDomainService = baseDomainService;
_bbacRepository = bbacRepository;
_pubRepository = pubRepository;
_hbpoRepository = hbpoRepository;
_priceRepository = priceRepository;
_pricebjRepository = pricebjRepository;
}
/// <summary>
///查询明细
/// </summary>
/// <param name="input">明细查询条件</param>
/// <returns></returns>
[HttpPost]
public virtual async Task<PagedResultDto<PUB_ADJ_DETAIL_DTO>> DetailQueryAsync(PUB_ADJ_DETAIL_REQ_DTO input)
{
var entitys = await _repository.GetListByFilterAsync(input.Filters, input.Sorting, input.MaxResultCount, input.SkipCount);
var totalCount = await _repository.GetCountByFilterAsync(input.Filters);
var dtos = ObjectMapper.Map<List<PUB_ADJ_DETAIL>, List<PUB_ADJ_DETAIL_DTO>>(entitys);
return new PagedResultDto<PUB_ADJ_DETAIL_DTO>(totalCount, dtos);
}
/// <summary>
/// 导入文件
/// </summary>
/// <param name="files"></param>
/// <returns></returns>
/// <exception cref="BusinessException"></exception>
[HttpPost]
[DisableRequestSizeLimit]
public async Task<string> ExcelImport([FromForm] IFormFileCollection files)
{
List<ErrorExportDto> errorList = new List<ErrorExportDto>();
ExportImporter _exportImporter = new ExportImporter();
var result = await _exportImporter.UploadExcelImport<PUB_ADJ_DETAIL_IMP_DTO>(files, _excelImportService);
if (result.Count == 0)
{
throw new BusinessException("8989", "导入数据记录为0条");
}
var relation = _relRepository.ToList();
var invs = result.Select(p => p.OldInvBillNum).ToList();//所有发票号
var deletels = _repository.Where(p => invs.Contains(p.OldInvBillNum)).ToList();//所有关联发票号的调整表
var invlist = _invRepository.Where(p => invs.Contains(p.InvbillNum)).ToList();//所有发票
var dlists = deletels.Where(p => string.IsNullOrEmpty(p.InvBillNum)).ToList();//所有新发票号不为空的调整记录
foreach (var itm in dlists)
{
errorList.Add(new ErrorExportDto() { ItemCode = $"{itm.LU}", Message = $"客户零件号{itm.LU}标识号{itm.PN}下线日期{itm.SettleDate}记录已经被重新开票,新发票号为:{itm.InvBillNum}" });
}
//var first = deletels.FirstOrDefault();
//if (!string.IsNullOrEmpty(first.InvBillNum))
//{
// throw new BusinessException("8989", $"调整记录已经生成新发票号:{first.InvBillNum}");
//}
var entityList = ObjectMapper.Map<List<PUB_ADJ_DETAIL_IMP_DTO>, List<PUB_ADJ_DETAIL>>(result);
var codelist = entityList.Select(p => p.LU).ToList();
var errors = await _baseDomainService.CheckBase(codelist, new BASE_CONF() { IsRelationShip = true });
foreach (var itm in errors)
{
errorList.Add(
new ErrorExportDto() { ItemCode = $"{itm}", Message = $"[客户零件关系表]不存在客户零件号{itm}" });
}
var errorEntitylist = await _baseDomainService.CheckPriceList(entityList);
if (errorEntitylist.Count > 0)
{
foreach (var itm in errorEntitylist)
{
errorList.Add(new ErrorExportDto() { ItemCode = $"{itm.LU}", Message = $"客户零件号{itm.LU}标识号{itm.PN}下线日期{itm.SettleDate}不存在价格单记录" });
}
}
var query = from itm in entityList
join itm1 in invlist
on itm.InvBillNum equals itm1.InvbillNum
join itm2 in relation on itm.LU equals itm2.SettleMaterialCode
select new PUB_ADJ_DETAIL(
id: GuidGenerator.Create(),
keyCode: itm.PN + itm.LU,
version: itm.Version,
settleBillNum: itm.SettleBillNum,
lU: itm2.ErpMaterialCode,
pN: itm.PN,
site: itm.Site,
qty: itm.Qty,
extend1: string.Empty,
price: 0,
invGroupNum: itm1.InvGroupNum,
settleDate: itm.SettleDate,
businessType: itm1.BusinessType,
groupNum: itm.GroupNum,
oldinv: itm.InvBillNum,
inv: string.Empty,
partcode: itm.PartCode
);
await _repository.DbContext.BulkDeleteAsync(deletels);//删除发票下所有调整明细
await _repository.DbContext.BulkInsertAsync(query.ToList());
return ApplicationConsts.SuccessStr;
}
/// <summary>
/// 导入文件
/// </summary>
/// <param name="files"></param>
/// <returns></returns>
/// <exception cref="BusinessException"></exception>
[HttpPost]
[DisableRequestSizeLimit]
public async Task<IActionResult> CheckImport(List<PUB_ADJ_DETAIL_DTO> p_list)
{
if (p_list.Count == 0)
{
throw new UserFriendlyException($"导入数据为空");
}
foreach (var itm in p_list)
{
itm.KeyCode = itm.PN + itm.LU.Replace(" ", "").Trim();
}
var pnlist = p_list.Select(p => p.PN).Distinct().ToList();
int flag = 0;
var keylist = p_list.Select(p => p.KeyCode).Distinct();
List<ERR_EXP_DTO> errorList = new List<ERR_EXP_DTO>();
var first = p_list.FirstOrDefault();
if (first != null)
{
var inv = _invRepository.Where(p => p.InvbillNum == first.InvBillNum).FirstOrDefault();
string keyname = string.Empty;
List<PUB_ADJ_DETAIL> adjlist = new List<PUB_ADJ_DETAIL>();
switch (inv.BusinessType)
{
case EnumBusinessType.MaiDanJianHBPO:
break;
case EnumBusinessType.MaiDanJianBBAC:
break;
case EnumBusinessType.ZhiGongJianBBAC:
//var errors1 = _pubRepository.Where(p => pnlist.Contains(p.PN)).ToList();
//foreach (var p in errors1)
//{
// errorList.Add(new ERR_EXP_DTO() { Message = $"不能结算数据中存在{p.PN}数据,不能导入调整表" });
//}
break;
case EnumBusinessType.ZhiGongJianHBPO:
//var errors2 = _pubRepository.Where(p => pnlist.Contains(p.PN)).ToList();
//foreach (var p in errors2)
//{
// errorList.Add(new ERR_EXP_DTO() { Message = $"不能结算数据中存在发货单{p.PN}数据,不能导入调整表" });
//}
break;
case EnumBusinessType.BeiJian:
flag = 1;
//var errors3 = _pubRepository.Where(p => pnlist.Contains(p.PN)).ToList();
//foreach (var p in errors3)
//{
// errorList.Add(new ERR_EXP_DTO() { Message = $"不能结算数据中存在交付识别号{p.PN}数据,不能导入调整表" });
//}
break;
case EnumBusinessType.JisBBAC:
var errors4 = _bbacRepository.Where(p => keylist.Contains(p.KeyCode));
foreach (var p in errors4)
{
errorList.Add(new ERR_EXP_DTO() { Message = $"不能结算数据中存在生产码{p.PN}结算零件{p.PartCode},不能导入调整表" });
}
break;
case EnumBusinessType.JisHBPO:
//var errors5 = _hbpoRepository.Where(p => keylist.Contains(p.KeyCode));
//foreach (var p in errors5)
//{
// errorList.Add(new ERR_EXP_DTO() { Message = $"不能结算数据中存在生产码{p.PN}结算零件{p.PartCode},不能导入调整表" });
//}
break;
case EnumBusinessType.YinDuJian:
//var errors6 = _pubRepository.Where(p => pnlist.Contains(p.PN));
//foreach (var p in errors6)
//{
// errorList.Add(new ERR_EXP_DTO() { Message = $"不能结算数据中存在发货单{p.PN}数据,不能导入调整表" });
//}
break;
}
}
var entityList = ObjectMapper.Map<List<PUB_ADJ_DETAIL_DTO>, List<PUB_ADJ_DETAIL>>(p_list);
var codelist = entityList.Select(p => p.LU).ToList();
var errors = await _baseDomainService.CheckBase(codelist, new BASE_CONF() { IsRelationShip = true });
foreach (var itm in errors)
{
errorList.Add(
new ERR_EXP_DTO() { ItemCode = $"{itm}", Message = $"[客户零件关系表]不存在客户零件号{itm}" });
}
var errorEntitylist = await _baseDomainService.CheckPriceList(entityList);
if (errorEntitylist.Count > 0)
{
foreach (var itm in errorEntitylist)
{
errorList.Add(new ERR_EXP_DTO() { ItemCode = $"{itm.LU}", Message = $"客户零件号{itm.LU}标识号{itm.PN}下线日期{itm.SettleDate}不存在价格单记录" });
}
}
if (errorList.Count > 0)
{
return new JsonResult(new { Code = ApplicationConsts.ImportFailCode, Message= "请下载错误信息", fileName = await ExportErrorReportAsync(errorList) });
}
List<PUB_ADJ_DETAIL_DTO> ls = new List<PUB_ADJ_DETAIL_DTO>();
if (flag == 1)
{
var pricebjlist = _pricebjRepository.ToList();
var inner = from d in p_list
join p in pricebjlist on d.LU equals p.LU
where
d.SettleDate >= p.BeginDate && d.SettleDate <= p.EndDate
select
new PUB_ADJ_DETAIL_DTO()
{
InvBillNum = d.InvBillNum,
SettleDate = d.SettleDate,
LU = d.LU,
PN = d.PN,
Qty = d.Qty,
GroupNum = d.GroupNum,
KeyCode = d.KeyCode,
Price = p.Price,
};
ls = inner.ToList();
}
else
{
var pricelist = _priceRepository.ToList();
var inner = from d in p_list
join p in pricelist on d.LU equals p.LU
where
d.SettleDate >= p.BeginTime && d.SettleDate <= p.EndTime
select new PUB_ADJ_DETAIL_DTO()
{
InvBillNum = d.InvBillNum,
SettleDate = d.SettleDate,
LU = d.LU,
PN = d.PN,
Qty = d.Qty,
GroupNum = d.GroupNum,
KeyCode = d.KeyCode,
Price = p.Price,
};
ls = inner.ToList();
}
return new JsonResult(new { Code = 200, data =ls }); ;
}
}