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

345 lines
12 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using DS.Module.Core;
using DS.Module.Core.Constants;
using DS.Module.Core.Data;
using DS.Module.Core.Extensions;
using DS.Module.SqlSugar;
using DS.Module.UserModule;
using DS.WMS.Core.Code.Dtos;
using DS.WMS.Core.Code.Entity;
using DS.WMS.Core.Code.Interface;
using DS.WMS.Core.Info.Entity;
using DS.WMS.Core.Map.Dtos;
using DS.WMS.Core.Map.Entity;
using DS.WMS.Core.Sys.Interface;
using Mapster;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using SqlSugar;
namespace DS.WMS.Core.Code.Method;
public class CodeCtnService:ICodeCtnService
{
private readonly IServiceProvider _serviceProvider;
private readonly ISqlSugarClient db;
private readonly IUser user;
private readonly ISaasDbService saasService;
private readonly ISysCacheService _sysCacheService;
/// <summary>
///
/// </summary>
/// <param name="serviceProvider"></param>
public CodeCtnService(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
db = _serviceProvider.GetRequiredService<ISqlSugarClient>();
user = _serviceProvider.GetRequiredService<IUser>();
saasService = _serviceProvider.GetRequiredService<ISaasDbService>();
_sysCacheService = _serviceProvider.GetRequiredService<ISysCacheService>();
}
public DataResult<List<CodeCtnRes>> GetListByPage(PageRequest request)
{
//序列化查询条件
var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition);
var data = db.Queryable<CodeCtn>()
.Where(whereList)
.Select<CodeCtnRes>().ToQueryPage(request.PageCondition);
return data;
}
public DataResult EditCodeCtn(CodeCtnReq req)
{
if (req.Id == 0)
{
if (db.Queryable<CodeCtn>().Where(x=>x.CtnName == req.CtnName.Trim()).Any())
{
return DataResult.Failed("集装箱信息已存在!",MultiLanguageConst.CodeCtnExist);
}
var data = req.Adapt<CodeCtn>();
var entity = db.Insertable(data).ExecuteReturnEntity();
_sysCacheService.RemoveCache(Sys.Method.SysCacheCategoryEnum.CommonCodeCtn, "DS8").GetAwaiter().GetResult();
return DataResult.Successed("添加成功!", entity.Id,MultiLanguageConst.DataCreateSuccess);
}
else
{
var info = db.Queryable<CodeCtn>().Where(x => x.Id == req.Id).First();
info = req.Adapt(info);
db.Updateable(info).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
_sysCacheService.RemoveCache(Sys.Method.SysCacheCategoryEnum.CommonCodeCtn, "DS8").GetAwaiter().GetResult();
return DataResult.Successed("更新成功!",MultiLanguageConst.DataUpdateSuccess);
}
}
public DataResult<CodeCtnRes> GetCodeCtnInfo(string id)
{
var data = db.Queryable<CodeCtn>()
.Where(a => a.Id == long.Parse(id))
.Select<CodeCtnRes>()
.First();
return DataResult<CodeCtnRes>.Success(data,MultiLanguageConst.DataQuerySuccess);
}
public DataResult<List<CodeCtnRes>> GetClientListByPage(PageRequest request)
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
//序列化查询条件
var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition);
var data = tenantDb.Queryable<CodeCtn>()
.Where(whereList)
.Select<CodeCtnRes>().ToQueryPage(request.PageCondition);
return data;
}
public DataResult EditClientCodeCtn(CodeCtnReq req)
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
if (req.Id == 0)
{
if (tenantDb.Queryable<CodeCtn>().Where(x=>x.CtnName == req.CtnName.Trim()).Any())
{
return DataResult.Failed("集装箱信息已存在!",MultiLanguageConst.CodeCtnExist);
}
var data = req.Adapt<CodeCtn>();
var entity = tenantDb.Insertable(data).RemoveDataCache($"{SqlSugarCacheConst.Ctn}{user.TenantId}").ExecuteReturnEntity();
_sysCacheService.RemoveCache(Sys.Method.SysCacheCategoryEnum.CommonCodeCtn, "DS8").GetAwaiter().GetResult();
return DataResult.Successed("添加成功!", entity.Id,MultiLanguageConst.DataCreateSuccess);
}
else
{
var info = tenantDb.Queryable<CodeCtn>().Where(x => x.Id == req.Id).First();
info = req.Adapt(info);
tenantDb.Updateable(info).RemoveDataCache($"{SqlSugarCacheConst.Ctn}{user.TenantId}").IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
_sysCacheService.RemoveCache(Sys.Method.SysCacheCategoryEnum.CommonCodeCtn, "DS8").GetAwaiter().GetResult();
return DataResult.Successed("更新成功!",MultiLanguageConst.DataUpdateSuccess);
}
}
public DataResult<CodeCtnRes> GetClientCodeCtnInfo(string id)
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
var data = tenantDb.Queryable<CodeCtn>()
.Where(a => a.Id == long.Parse(id))
.Select<CodeCtnRes>()
.First();
return DataResult<CodeCtnRes>.Success(data,MultiLanguageConst.DataQuerySuccess);
}
public DataResult<List<CodeCtnRes>> GetCodeCtnList(PageRequest request)
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
var existIds = tenantDb.Queryable<CodeCtn>()
.Select(a => a.Id)
.ToList();
//序列化查询条件
var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition);
var data = db.Queryable<CodeCtn>().Where(a=>a.Status == StatusEnum.Enable && !existIds.Contains(a.Id))
.Where(whereList)
.Select<CodeCtnRes>().ToQueryPage(request.PageCondition);
return data;
}
public DataResult ImportCodeCtn(IdModel req)
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
var list = db.Queryable<CodeCtn>().Where(x =>req.Ids.Contains(x.Id) ).ToList();
if (list.Count == 0)
{
return DataResult.Failed("集装箱信息导入无数据!",MultiLanguageConst.CodeCtnImportNoData);
}
if (tenantDb.Queryable<CodeCtn>().Where(x =>req.Ids.Contains(x.Id) ).Any())
{
return DataResult.Failed("存在已导入的集装箱信息!",MultiLanguageConst.CodeCtnImportAlready);
}
tenantDb.Insertable(list).ExecuteCommand();
_sysCacheService.RemoveCache(Sys.Method.SysCacheCategoryEnum.CommonCodeCtn, "DS8").GetAwaiter().GetResult();
return DataResult.Successed("引入成功!",MultiLanguageConst.DataImportSuccess);
}
/// <summary>
/// 获取当前租户已有的集装箱
/// </summary>
/// <returns></returns>
public DataResult<List<string>> GetExistCodeCtnList()
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
var data = tenantDb.Queryable<CodeCtn>()
.Select(n=>n.Id.ToString())
.ToList();
return DataResult<List<string>>.Success(data);
}
public DataResult BatchDelCodeCtn(IdModel req)
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
var list = tenantDb.Queryable<CodeCtn>().Where(x => req.Ids.Contains(x.Id)).ToList();
if (list.Count > 0)
{
tenantDb.Deleteable(list).RemoveDataCache($"{SqlSugarCacheConst.Ctn}{user.TenantId}").ExecuteCommand();
}
_sysCacheService.RemoveCache(Sys.Method.SysCacheCategoryEnum.CommonCodeCtn, "DS8").GetAwaiter().GetResult();
return DataResult.Successed("删除成功!", MultiLanguageConst.DataDelSuccess);
}
/// <summary>
/// 获取箱型基础数据
/// </summary>
/// <param name="isFromCache">是否从缓存提取 true-从缓存读取 false-从数据库读取</param>
/// <returns>返回箱型基础数据列表</returns>
public async Task<DataResult<List<CodeCtnRes>>> GetAllList(bool isFromCache = true)
{
List<CodeCtnRes> list = new List<CodeCtnRes>();
bool isLoad = false;
if (isFromCache)
{
var rlt = await _sysCacheService.GetAllCommonCodeFromCache<CodeCtnRes>(Sys.Method.SysCacheCategoryEnum.CommonCodeCtn, "DS8");
if (rlt.Succeeded)
return rlt;
isLoad = true;
}
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
list = tenantDb.Queryable<CodeCtn>()
.Select<CodeCtnRes>()
.Where(a => a.Status == StatusEnum.Enable).ToList();
if (list.Count > 0)
{
if (isLoad)
{
await _sysCacheService.SetCommonCode(list, Sys.Method.SysCacheCategoryEnum.CommonCodeCtn, "DS8");
}
return DataResult<List<CodeCtnRes>>.Success(list);
}
return DataResult<List<CodeCtnRes>>.FailedData(list);
}
/// <summary>
/// 加载到缓存
/// </summary>
/// <returns></returns>
public async Task<DataResult> LoadCache()
{
var rlt = await GetAllList(false);
if (rlt.Succeeded)
{
await _sysCacheService.SetCommonCode(rlt.Data, Sys.Method.SysCacheCategoryEnum.CommonCodeCtn, "DS8");
return DataResult.Successed(MultiLanguageConst.LoadCacheSucc);
}
return DataResult.Failed(MultiLanguageConst.LoadCacheFailDataNull);
}
#region 箱号校验
public static int numtostr(char strcode)
{
int result = 0;
if (strcode == 'A') result = 10;
if (strcode == 'B') result = 12;
if (strcode == 'C') result = 13;
if (strcode == 'D') result = 14;
if (strcode == 'E') result = 15;
if (strcode == 'F') result = 16;
if (strcode == 'G') result = 17;
if (strcode == 'H') result = 18;
if (strcode == 'I') result = 19;
if (strcode == 'J') result = 20;
if (strcode == 'K') result = 21;
if (strcode == 'L') result = 23;
if (strcode == 'M') result = 24;
if (strcode == 'N') result = 25;
if (strcode == 'O') result = 26;
if (strcode == 'P') result = 27;
if (strcode == 'Q') result = 28;
if (strcode == 'R') result = 29;
if (strcode == 'S') result = 30;
if (strcode == 'T') result = 31;
if (strcode == 'U') result = 32;
if (strcode == 'V') result = 34;
if (strcode == 'W') result = 35;
if (strcode == 'X') result = 36;
if (strcode == 'Y') result = 37;
if (strcode == 'Z') result = 38;
return result;
}
public bool ValidateContainerNumber(string containerNumber)
{
// 集装箱号的校验规则
// - 由4位字母ISO代码+ 6位数字 + 1位校验码组成
// - 校验码的计算方式是将字母转换为数字,然后按照一定的公式计算得出
if (containerNumber.Length != 11)
{
return false;
}
string letters = containerNumber.Substring(0, 4);
string numbers = containerNumber.Substring(4, 6);
string checkDigit = containerNumber.Substring(10, 1);
// 检查字母部分是否都是大写字母
if (!letters.All(char.IsUpper))
{
return false;
}
// 检查数字部分是否都是数字字符
if (!numbers.All(char.IsDigit))
{
return false;
}
// 计算校验码
int[] letterValues = letters.Select(c => numtostr(c)).ToArray();
int[] numberValues = numbers.Select(c => c - '0').ToArray();
int sum = letterValues[0] * 1 + letterValues[1] * 2 + letterValues[2] * 4 + letterValues[3] * 8;
int classint = 16;
for (int i = 0; i < numberValues.Length; i++)
{
if (i == 0) classint = 16;
if (i == 1) classint = 32;
if (i == 2) classint = 64;
if (i == 3) classint = 128;
if (i == 4) classint = 256;
if (i == 5) classint = 512;
sum += numberValues[i] * (classint);
}
int calculatedCheckDigit = sum % 11 % 10;
// 检查校验码是否匹配
if (calculatedCheckDigit != int.Parse(checkDigit))
{
return false;
}
return true;
}
#endregion
}