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.

467 lines
15 KiB
C#

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden 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 AngleSharp.Dom;
using Castle.Core.Resource;
using DS.Module.Core;
using DS.Module.Core.Extensions;
using DS.Module.SqlSugar;
using DS.Module.UserModule;
using DS.WMS.ContainerManagement.Info.Dtos;
using DS.WMS.ContainerManagement.Info.Entity;
using DS.WMS.ContainerManagement.Info.Interface;
using DS.WMS.Core.Fee.Entity;
using DS.WMS.Core.Info.Dtos;
using DS.WMS.Core.Info.Entity;
using DS.WMS.Core.Info.Interface;
using DS.WMS.Core.Op.Entity;
using DS.WMS.Core.Op.View;
using DS.WMS.Core.Sys.Entity;
using Mapster;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using NPOI.HPSF;
using SqlSugar;
using DS.Module;
using DS.Module.ExcelModule;
using DS.Module.ExcelModule.Model;
using System;
using LanguageExt.Pipes;
using DS.WMS.Core.Invoice.Dtos;
using MathNet.Numerics.Distributions;
namespace DS.WMS.ContainerManagement.Info.Method;
public class CM_BaseInfoService : ICM_BaseInfoService
{
private readonly IServiceProvider _serviceProvider;
private readonly ISqlSugarClient db;
private readonly IUser user;
private readonly ISaasDbService saasService;
private readonly IEPPlusService epplusService;
private readonly ICM_State_Change_TemplatImportService templatImportService;
/// <summary>
///
/// </summary>
/// <param name="serviceProvider"></param>
public CM_BaseInfoService(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
db = _serviceProvider.GetRequiredService<ISqlSugarClient>();
user = _serviceProvider.GetRequiredService<IUser>();
saasService = _serviceProvider.GetRequiredService<ISaasDbService>();
epplusService = _serviceProvider.GetRequiredService<IEPPlusService>();
templatImportService = _serviceProvider.GetRequiredService<ICM_State_Change_TemplatImportService>();
}
/// <summary>
/// 列表
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public async Task<DataResult<List<CM_BaseInfoRes>>> GetListByPage(PageRequest request)
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
//序列化查询条件
var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition);
var data = tenantDb.Queryable<CM_BaseInfo>()
.Where(whereList)
.Select<CM_BaseInfoRes>().ToQueryPage(request.PageCondition);
return data;
}
//public async Task<DataResult<List<CM_CurrentStateRes>>> GetListByPage(PageRequest request)
//{
// var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
// //序列化查询条件
// var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition);
// var data = await tenantDb.Queryable<CM_CurrentStateRes>()
// .Where(whereList)
// .ToQueryPageAsync(request.PageCondition);
// return data;
//}
/// <summary>
/// 编辑
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public DataResult EditCM_BaseInfo(CM_BaseInfoReq req)
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
if (req.Id == 0)
{
//if (tenantDb.Queryable<InfoClientAccountDate>().Where(x => x.AccountType == req.AccountType &&
// x.AccountType == req.AccountType &&
// x.SaleId == req.SaleId &&
// x.BeginDate == req.BeginDate &&
// x.EndDate == req.EndDate).Any())
//{
// return DataResult.Failed("客户账期信息已存在!", MultiLanguageConst.ClientAccountDateExist);
//}
var data = req.Adapt<CM_BaseInfo>();
var entity = tenantDb.Insertable(data).ExecuteReturnEntity();
var curr = tenantDb.Queryable<CM_CurrentState>().Where(x => x.CtnBaseinfoId == entity.Id).First();
if (curr != null && curr.Cntrno != entity.Cntrno)
{
curr.Cntrno = entity.Cntrno;
tenantDb.Updateable(curr).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
}
return DataResult.Successed("添加成功!", entity.Id, MultiLanguageConst.DataCreateSuccess);
}
else
{
var info = tenantDb.Queryable<CM_BaseInfo>().Where(x => x.Id == req.Id).First();
info = req.Adapt(info);
tenantDb.Updateable(info).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
var curr = tenantDb.Queryable<CM_CurrentState>().Where(x => x.CtnBaseinfoId == info.Id).First();
if (curr != null && curr.Cntrno != info.Cntrno)
{
curr.Cntrno = info.Cntrno;
tenantDb.Updateable(curr).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
}
return DataResult.Successed("更新成功!", MultiLanguageConst.DataUpdateSuccess);
}
}
/// <summary>
/// 详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public DataResult<CM_BaseInfoRes> GetCM_BaseInfo(string id)
{
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
var data = tenantDb.Queryable<CM_BaseInfo>()
.Where(a => a.Id == long.Parse(id))
.Select<CM_BaseInfoRes>()
.First();
return DataResult<CM_BaseInfoRes>.Success(data, MultiLanguageConst.DataQuerySuccess);
}
//CM_CheckCntrno(CM_CheckCntrno model);
public DataResult<CM_CheckCntrnoRes> CM_CheckCntrno(CM_CheckCntrno req)
{
var Cntrno = req.Cntrno;
Cntrno = Cntrno.Replace("", ",");
Cntrno = Cntrno.Replace("", ",");
Cntrno = Cntrno.Replace("、", ",");
Cntrno = Cntrno.Replace(" ", ",");
Cntrno = Cntrno.Replace(" ", ",");
var splitchar = new char[] { ',', '\n', '\r', ' ', '\t', ';' };
//string[] itemsByCommaAndNewLine = Cntrno.Split();
var cntrnoList = new List<string>();
cntrnoList = Cntrno.Split(splitchar).ToList();
var result = new CM_CheckCntrnoRes();
if (cntrnoList != null) {
foreach (var cntrno in cntrnoList) {
var trueCntrno = "";
var istrue = ValidateContainerNumber(cntrno,out trueCntrno);
result.AddCntrno(cntrno, istrue, trueCntrno);
}
}
return DataResult <CM_CheckCntrnoRes>.Success(result,MultiLanguageConst.DataQuerySuccess);
}
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 static bool ValidateContainerNumber(string containerNumber,out string trueCntrno)
{
// 集装箱号的校验规则
// - 由4位字母ISO代码+ 6位数字 + 1位校验码组成
// - 校验码的计算方式是将字母转换为数字,然后按照一定的公式计算得出
trueCntrno = "";
if (containerNumber.Length != 11)
{
trueCntrno = " ";
return false;
}
string letters = containerNumber.Substring(0, 4);
string numbers = containerNumber.Substring(4, 6);
string checkDigit = containerNumber.Substring(10, 1);
var result = true;
// 检查字母部分是否都是大写字母
if (!letters.All(char.IsUpper))
{
result= false;
}
//letters = letters.ToUpper();
if (!letters.All(char.IsLetter) )
{
trueCntrno = " ";
return false;
}
// 检查数字部分是否都是数字字符
if (!numbers.All(char.IsDigit))
{
trueCntrno = " ";
return false;
//result = false;
}
// 计算校验码
letters = letters.ToUpper();
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))
{
result=false;
}
if (result == false) {
trueCntrno= letters + numbers + calculatedCheckDigit.ToString();
}
return result;
}
/// <summary>
/// 处理附件
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<DataResult> CM_DealExcel(CM_DealExcelReq req)
{
var _r = await templatImportService.DealExcel(req);
return _r;
//return DataResult.Successed($"调用成功!{JsonConvert.SerializeObject(req)}", MultiLanguageConst.DataUpdateSuccess);
}
/// <summary>
/// 处理附件
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public DataResult CM_CheckCtnBase(CM_DealExcelReq req)
{
return DataResult.Successed($"", MultiLanguageConst.DataUpdateSuccess);
//var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
}
/// <summary>
/// 推进状态
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<DataResult> CM_PushFormStatus(CM_PushFormStatusReq req)
{
//object Head = new object();
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
if (req.FormName == "CM_RentIn") {
//序列化查询条件
var Head = await tenantDb.Queryable<CM_RentIn>()
.FirstAsync(x => x.Id == req.Id);
req.CurrentState = Head.BillState;
var cando = FormPushStatusHelper(req);
if (cando.Message == "")
{
return DataResult.Failed($"此业务该状态下不能执行此动作!", MultiLanguageConst.CM_CanNotExecution);
}
else {
Head.BillState = cando.Message;
if (Head.BillState == "10001") Head.Remark += "驳回理由:" + req.Reason;
}
tenantDb.Updateable(Head).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
return DataResult.Successed($"执行成功!", MultiLanguageConst.OperationSuccess);
}
if (req.FormName == "CM_RentOut")
{
//序列化查询条件
var Head = await tenantDb.Queryable<CM_RentOut>()
.FirstAsync(x => x.Id == req.Id);
req.CurrentState = Head.BillState;
var cando = FormPushStatusHelper(req);
if (cando.Message == "")
{
return DataResult.Failed($"此业务该状态下不能执行此动作!", MultiLanguageConst.CM_CanNotExecution);
}
else
{
Head.BillState = cando.Message;
if (Head.BillState == "10001") Head.Remark += "驳回理由:" + req.Reason;
}
tenantDb.Updateable(Head).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
return DataResult.Successed($"执行成功!", MultiLanguageConst.OperationSuccess);
}
if (req.FormName == "CM_SellCtn")
{
//序列化查询条件
var Head = await tenantDb.Queryable<CM_SellCtn>()
.FirstAsync(x => x.Id == req.Id);
req.CurrentState = Head.BillState;
var cando = FormPushStatusHelper(req);
if (cando.Message == "")
{
return DataResult.Failed($"此业务该状态下不能执行此动作!", MultiLanguageConst.CM_CanNotExecution);
}
else
{
Head.BillState = cando.Message;
if (Head.BillState == "10001") Head.Remark += "驳回理由:" + req.Reason;
}
tenantDb.Updateable(Head).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
return DataResult.Successed($"执行成功!", MultiLanguageConst.OperationSuccess);
}
return DataResult.Failed($"此业务该状态下不能执行此动作!", MultiLanguageConst.CM_CanNotExecution);
}
public DataResult FormPushStatusHelper(CM_PushFormStatusReq req)
{
//执行动作 1001提交审核 1000撤回 10001驳回 1100审核通过
//状态 "/1000"录入 10001驳回 1001审核中 1100审核通过
if (req.FormName == "CM_RentIn" || req.FormName == "CM_RentOut"|| req.FormName == "CM_SellCtn")
{
//录入/驳回 状态允许提交1001
if (string.IsNullOrWhiteSpace(req.CurrentState) || req.CurrentState == "1000" || req.CurrentState == "10001") {
if (req.Execution == "1001") {
return DataResult.Successed($"1001");
}
}
//提交审核状态 允许: 通过 驳回 撤回
if ( req.CurrentState == "1001")
{
if (req.Execution == "1000")
{
return DataResult.Successed($"1000");
}
if (req.Execution == "10001")
{
return DataResult.Successed($"10001");
}
if (req.Execution == "1100")
{
return DataResult.Successed($"1100");
}
}
//审核通过状态允许 驳回
if (req.CurrentState == "1100")
{
if (req.Execution == "10001")
{
return DataResult.Successed($"10001");
}
}
}
return DataResult.Failed($"");
}
}