添加项目文件。

This commit is contained in:
2025-04-30 17:01:05 +08:00
commit 1eaedea85d
261 changed files with 33985 additions and 0 deletions

View File

@@ -0,0 +1,423 @@
using BarCode.Web.Core.Dto;
using BarCode.Web.Core.Dto.Erp;
using BarCode.Web.Core.Dto.Login;
using BarCode.Web.Core.Dto.SerialNumbers;
using BarCode.Web.Core.Internal.Results;
using BarCode.Web.Domain.Entitys;
using BarCode.Web.Domain.Infrastructure;
using BarCode.Web.Domain.IService;
using BarCode.Web.Domain.IService.Public;
using BarCode.Web.Domain.Services.Public;
using BarCode.Web.Domain.Values;
using BarCode.Web.Domain.Values.Single;
using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using NPOI.HPSF;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BarCode.Web.Domain.Services
{
/// <summary>
/// 序列号服务
/// </summary>
public class SerialNumberService : ISerialNumberService
{
private readonly ISerialNumbersRepositories _serialNumbersRepositories;
private readonly ISGenerateRecordRepositories _sGenerateRecordRepositories;
private readonly RedisClientService _redisClientService;
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly ILogger<SerialNumberService> _logger;
private IBasicsRepositories _transactionRepositories;
private ICenerateDataRepositories _cenerateDataRepositories;
private readonly ISingleDataService _singleDataService;
private readonly IErpService _erpService;
/// <summary>
/// 序列号服务
/// </summary>
/// <param name="serialNumbersRepositories"></param>
/// <param name="sGenerateRecordRepositories"></param>
/// <param name="redisClientService"></param>
/// <param name="serviceScopeFactory"></param>
/// <param name="logger"></param>
/// <param name="transactionRepositories"></param>
/// <param name="cenerateDataRepositories"></param>
public SerialNumberService(ISerialNumbersRepositories serialNumbersRepositories,
ISGenerateRecordRepositories sGenerateRecordRepositories,
RedisClientService redisClientService,
IServiceScopeFactory serviceScopeFactory,
ILogger<SerialNumberService> logger, IBasicsRepositories transactionRepositories,
ICenerateDataRepositories cenerateDataRepositories, ISingleDataService singleDataService, IErpService erpService)
{
_serialNumbersRepositories = serialNumbersRepositories;
_sGenerateRecordRepositories = sGenerateRecordRepositories;
_redisClientService = redisClientService;
_serviceScopeFactory = serviceScopeFactory;
_logger = logger;
_transactionRepositories = transactionRepositories;
_cenerateDataRepositories = cenerateDataRepositories;
_singleDataService = singleDataService;
_erpService = erpService;
}
/// <summary>
/// 生成序列号
/// </summary>
/// <param name="dto"></param>
/// <param name="loginInfo"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public Task<Result> Generate(GenerateSerialNumberRequest dto, LoginInDto loginInfo)
{
if (dto.Details.Count() == 0) return Task.FromResult(Result.ReSuccess());
//if (dto.Details.Count() > 1000) return Task.FromResult(Result.ReFailure(ResultCodes.SerialGenerateBigNumber));
_logger.LogInformation($"生成序列号:{JsonConvert.SerializeObject(dto)},用户:{loginInfo.UserInfo.Nickname}");
var info = _redisClientService.GetStringKey<bool>($"barcode_cenerate_serial");
if (info == true) return Task.FromResult(Result.ReFailure(ResultCodes.SerialNumberG));
_redisClientService.SetStringKey($"barcode_cenerate_serial", true, TimeSpan.FromMinutes(5));
var materials_result = _erpService.BillQueryForMaterial().GetAwaiter().GetResult();
List<ErpMaterialDto> materials = new List<ErpMaterialDto>();
if (materials_result.IsSuccess)
materials = materials_result.Data.ToList();
var cList = dto.Details.GroupBy(g => g.Specifications).Select(s => s.Key).ToList();
foreach (var s in cList)
{
var m = materials.FirstOrDefault(w => w.Specifications.Equals(s));
var details = dto.Details.Where(w => w.Specifications.Equals(s)).ToList();
if (m == null)
{
details.ForEach(f => dto.Details.Remove(f));
}
else
{
foreach (var de in details)
{
de.MaterialNumber = m.MaterialNumber;
de.IdConvertBar = m.IdConvertBar;
}
}
}
string supplierCode = "";
string orgCode = "";
if (dto.OrgCode.Substring(0, 1).Equals("s"))
supplierCode = dto.OrgCode.Substring(2, dto.OrgCode.Length - 2);
else
orgCode = dto.OrgCode.Substring(2, dto.OrgCode.Length - 2);
var dataEntity = _cenerateDataRepositories.Get(CenerateDataType.Serial).GetAwaiter().GetResult();
int beginNumber = dataEntity.Number;
if (beginNumber == 0)
dataEntity.Number = dto.Details.Sum(s => s.Number);
else
dataEntity.Number += dto.Details.Sum(s => s.Number);
List<SerialNumberGenerateRecord> sgList = new List<SerialNumberGenerateRecord>();
foreach (var d in dto.Details)
{
if (d.isTwo == 0)//如果套装数为0那么自动变成1
{
d.isTwo = 1;
}
else if(d.isTwo==2)
{
int result = d.Number % d.isTwo;
if (result !=0)//
{
return Task.FromResult(Result.ReFailure(ResultCodes.IsTwoError));
}
}
else if(d.isTwo>2)
{
return Task.FromResult(Result.ReFailure(ResultCodes.IsTwoError));
}
SerialNumberGenerateRecord sg = new SerialNumberGenerateRecord()
{
CompanyId = loginInfo.UserInfo.CompanyId,
CreateTime = DateTime.Now,
CreatorId = loginInfo.UserInfo.UcId,
OrgCode = orgCode,
IdConvertBar = d.IdConvertBar,
MaterialNumber = d.MaterialNumber,
Number = d.Number,
BeginNumber = beginNumber,
PurchaseBillNo = d.PurchaseBillNo,
SupplierCode = supplierCode,
IsTwo=d.isTwo//alter by yzh
};
//下一个物料开始数量要重新赋值
beginNumber = beginNumber + d.Number;
sgList.Add(sg);
}
IDbContextTransaction _transaction = _transactionRepositories.GetTransaction();
bool res_Rollback = false;
var isSuccess = _sGenerateRecordRepositories.AddRange(sgList, false).GetAwaiter().GetResult();
if (!isSuccess) res_Rollback = true;
if (!res_Rollback)
{
var entity = _cenerateDataRepositories.Edit(dataEntity, false).GetAwaiter().GetResult();
if (entity == null) res_Rollback = true;
}
isSuccess = _transactionRepositories.CommitTransaction(res_Rollback, _transaction);
if (!isSuccess) return Task.FromResult(Result.ReFailure(ResultCodes.DateWriteError));
Task.Run(async () =>
{
await GenerateSerialNumber(sgList);
});
_redisClientService.SetStringKey($"barcode_cenerate_serial", false, TimeSpan.FromMinutes(5));
return Task.FromResult(Result.ReSuccess());
}
/// <summary>
/// 循环生成序列码
/// </summary>
/// <param name="sgList"></param>
/// <param name="beginNumber"></param>
private async Task GenerateSerialNumber(List<SerialNumberGenerateRecord> sgList)
{
try
{
var info = _redisClientService.GetStringKey<bool>($"cenerate_serial_exec");
if (info == true)
{
//如果当前有在生成的计划 则挂起 等生成完成
while (true)
{
Thread.Sleep(5000);
info = _redisClientService.GetStringKey<bool>($"cenerate_serial_exec");
if (info != true)
break;
}
}
_redisClientService.SetStringKey($"cenerate_serial_exec", true, TimeSpan.FromMinutes(30));
_logger.LogInformation($"生成序列码开始:{DateTime.Now}-{JsonConvert.SerializeObject(sgList)}");
using (var scope = _serviceScopeFactory.CreateScope())
{
bool isSuccess = true;
bool res_Rollback = false;
var _snRepositories = scope.ServiceProvider.GetRequiredService<ISerialNumbersRepositories>();
var _sgRepositories = scope.ServiceProvider.GetRequiredService<ISGenerateRecordRepositories>();
_transactionRepositories = scope.ServiceProvider.GetRequiredService<IBasicsRepositories>();
foreach (var sg in sgList)
{
List<SerialNumbers> sList = new List<SerialNumbers>();
for (int i = 0; i < sg.Number; i++)
{
SerialNumbers s = new SerialNumbers()
{
CreateTime = DateTime.Now,
CreatorId = sg.CreatorId,
OrgCode = sg.OrgCode,
SupplierCode = sg.SupplierCode,
SerialNumber = sg.IdConvertBar,
MaterialNumber = sg.MaterialNumber,
Number = sg.BeginNumber + i,
IsTwo = sg.IsTwo,
thisNumber = i+1,//alter by yzh
GenerateRecordId = sg.Id
};
sList.Add(s);
}
//一个生成记录一个事物,这样能一条条记录对应的生成下去 成功一个是一个
IDbContextTransaction _transaction = _transactionRepositories.GetTransaction();
var isRes = await _snRepositories.AddRange(sList, false);
if (!isRes)
res_Rollback = true;
if (!res_Rollback)
{
sg.Complete();//生成完成
var sg_entity = await _sgRepositories.Edit(sg, false);
if (sg_entity == null)
res_Rollback = true;
}
//提交事务
isSuccess = _transactionRepositories.CommitTransaction(res_Rollback, _transaction);
if (res_Rollback || !isSuccess)
_logger.LogError("生成序列码数据操作失败");
}
}
_redisClientService.SetStringKey($"cenerate_serial_exec", false, TimeSpan.FromMinutes(30));
_logger.LogInformation($"生成序列码结束{DateTime.Now}");
}
catch (Exception ex)
{
_logger.LogError($"生成序列码异常:{ex.ToString}");
}
}
/// <summary>
/// 下载
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task<Result> DownLoad(OperateSerialNumberRequest dto)
{
//取出所有的生成记录
var generateRecords = await _sGenerateRecordRepositories.GetEntityList(dto.GenerateRecordIds);
if (generateRecords.Count() != dto.GenerateRecordIds.Count())
return Result.ReFailure(ResultCodes.NoDateError);
var snGRList = await _serialNumbersRepositories.GetEntityListByGRIds(dto.GenerateRecordIds);
//修改序列号下载数
List<SerialNumbers> olist = new List<SerialNumbers>();
if (dto.IsAll)
olist = snGRList;
else
{
olist = snGRList.Where(w => dto.SerialNumbers.Contains(w.SerialNumber)).ToList();
}
olist.ForEach(f => f.DownLoad());
foreach (var g in generateRecords)
{
int downLoad = snGRList.Where(w => w.GenerateRecordId == g.Id && w.DownLoadNumber > 0).Count();
g.DownLoad(downLoad);
}
IDbContextTransaction _transaction = _transactionRepositories.GetTransaction();
bool res_Rollback = false;
var isSuccess = await _serialNumbersRepositories.EditEntityList(olist, false);
if (!isSuccess) res_Rollback = true;
if (!res_Rollback)
{
var res = await _sGenerateRecordRepositories.EditEntityList(generateRecords, false);
if (!res) res_Rollback = true;
}
isSuccess = _transactionRepositories.CommitTransaction(res_Rollback, _transaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
return Result.ReSuccess();
}
/// <summary>
/// 打印
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task<Result> Print(OperateSerialNumberRequest dto)
{
//取出所有的生成记录
var generateRecords = await _sGenerateRecordRepositories.GetEntityList(dto.GenerateRecordIds);
if (generateRecords.Count() != dto.GenerateRecordIds.Count())
return Result.ReFailure(ResultCodes.NoDateError);
var snGRList = await _serialNumbersRepositories.GetEntityListByGRIds(dto.GenerateRecordIds);
//修改序列号下载数
List<SerialNumbers> olist = new List<SerialNumbers>();
if (dto.IsAll)
olist = snGRList;
else
{
olist = snGRList.Where(w => dto.SerialNumbers.Contains(w.SerialNumber)).ToList();
}
olist.ForEach(f => f.Print());
foreach (var g in generateRecords)
{
int printNumber = snGRList.Where(w => w.GenerateRecordId == g.Id && w.PrintNumber > 0).Count();
g.Print(printNumber);
}
IDbContextTransaction _transaction = _transactionRepositories.GetTransaction();
bool res_Rollback = false;
var isSuccess = await _serialNumbersRepositories.EditEntityList(olist, false);
if (!isSuccess) res_Rollback = true;
if (!res_Rollback)
{
var res = await _sGenerateRecordRepositories.EditEntityList(generateRecords, false);
if (!res) res_Rollback = true;
}
isSuccess = _transactionRepositories.CommitTransaction(res_Rollback, _transaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
return Result.ReSuccess();
}
/// <summary>
/// 反写使用数
/// </summary>
/// <param name="sGIds"></param>
/// <returns></returns>
public async Task<Result> Use(List<int> sGIds)
{
var sGList = await _sGenerateRecordRepositories.GetEntityList(sGIds);
var sGSNumberList = await _serialNumbersRepositories.GetEntityListByGRIds(sGIds);
foreach (var sg in sGList)
{
int number = sGSNumberList.Where(w => w.GenerateRecordId == sg.Id && w.BoxId > 0).Count();
sg.Use(number);
}
var isSuccess = await _sGenerateRecordRepositories.EditEntityList(sGList, false);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
return Result.ReSuccess();
}
/// <summary>
/// 修改序列码物料
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task<Result> UpdateMaterial(UpdateMaterialRequest dto)
{
//取出所有的生成记录
var generateRecord = await _sGenerateRecordRepositories.GetEntity(dto.GenerateRecordId);
if (generateRecord == null)
return Result.ReFailure(ResultCodes.NoDateError);
var serialNumbers = await _serialNumbersRepositories.GetEntityList(dto.SerialNumbers);
var exec_m = serialNumbers.Where(w => w.MaterialNumber == dto.MaterialNumber).Select(s => s.MaterialNumber).ToList();
if (exec_m.Count() > 0)
return Result.ReFailure($"序列号{string.Join(",", exec_m)}对应物料跟需要修改的物料一致", 611007);
//修改物料
foreach (var s in serialNumbers)
{
var res = s.UpdateMaterial(dto.MaterialNumber);
if (!res.IsSuccess) return res;
}
generateRecord.UpdateMaterial();
IDbContextTransaction _transaction = _transactionRepositories.GetTransaction();
bool res_Rollback = false;
var isSuccess = await _serialNumbersRepositories.EditEntityList(serialNumbers, false);
if (!isSuccess) res_Rollback = true;
if (!res_Rollback)
{
var res = await _sGenerateRecordRepositories.Edit(generateRecord, false);
if (res == null) res_Rollback = true;
}
isSuccess = _transactionRepositories.CommitTransaction(res_Rollback, _transaction);
if (!isSuccess) return Result.ReFailure(ResultCodes.DateWriteError);
return Result.ReSuccess();
}
}
}