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
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 }); ;
|
|
}
|
|
|
|
}
|
|
|