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; using DS.Module.Core.Enums; 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; private readonly ICM_RentInService CM_RentInService; private readonly ICM_RentOutService CM_RentOutService; private readonly ICM_SellCtnService CM_SellCtnService; /// /// /// /// public CM_BaseInfoService(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; db = _serviceProvider.GetRequiredService(); user = _serviceProvider.GetRequiredService(); saasService = _serviceProvider.GetRequiredService(); epplusService = _serviceProvider.GetRequiredService(); templatImportService = _serviceProvider.GetRequiredService(); CM_RentInService = _serviceProvider.GetRequiredService(); CM_RentOutService = _serviceProvider.GetRequiredService(); CM_SellCtnService = _serviceProvider.GetRequiredService(); } /// /// 列表 /// /// /// public async Task>> GetListByPage(PageRequest request) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); //序列化查询条件 var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition); var data = tenantDb.Queryable() .Where(whereList) .Select().ToQueryPage(request.PageCondition); return data; } //public async Task>> GetListByPage(PageRequest request) //{ // var tenantDb = saasService.GetBizDbScopeById(user.TenantId); // //序列化查询条件 // var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition); // var data = await tenantDb.Queryable() // .Where(whereList) // .ToQueryPageAsync(request.PageCondition); // return data; //} /// /// 编辑 /// /// /// public DataResult EditCM_BaseInfo(CM_BaseInfoReq req) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); if (req.Id == 0) { //if (tenantDb.Queryable().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(); var entity = tenantDb.Insertable(data).ExecuteReturnEntity(); var curr = tenantDb.Queryable().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().Where(x => x.Id == req.Id).First(); info = req.Adapt(info); tenantDb.Updateable(info).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand(); var curr = tenantDb.Queryable().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); } } /// /// 详情 /// /// /// public DataResult GetCM_BaseInfo(string id) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); var data = tenantDb.Queryable() .Where(a => a.Id == long.Parse(id)) .Select() .First(); return DataResult.Success(data, MultiLanguageConst.DataQuerySuccess); } //CM_CheckCntrno(CM_CheckCntrno model); public DataResult 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(); 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 .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; } /// /// 处理附件 /// /// /// public async Task CM_DealExcel(CM_DealExcelReq req) { var _r = await templatImportService.DealExcel(req); return _r; //return DataResult.Successed($"调用成功!{JsonConvert.SerializeObject(req)}", MultiLanguageConst.DataUpdateSuccess); } /// /// 处理附件 /// /// /// public DataResult CM_CheckCtnBase(CM_DealExcelReq req) { return DataResult.Successed($"", MultiLanguageConst.DataUpdateSuccess); //var tenantDb = saasService.GetBizDbScopeById(user.TenantId); } /// /// 推进状态 /// /// /// public async Task 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() .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 == CM_BillStatusEnum.驳回.ToInt().ToString()) Head.Remark += "驳回理由:" + req.Reason; } tenantDb.Updateable(Head).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand(); if (Head.BillState == CM_BillStatusEnum.审核通过.ToInt().ToString()) { CM_RentInService.CM_RentIn_Confirm(Head.Id); } return DataResult.Successed($"执行成功!", MultiLanguageConst.OperationSuccess); } if (req.FormName == "CM_RentOut") { //序列化查询条件 var Head = await tenantDb.Queryable() .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 == CM_BillStatusEnum.驳回.ToInt().ToString()) Head.Remark += "驳回理由:" + req.Reason; } tenantDb.Updateable(Head).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand(); if (Head.BillState == CM_BillStatusEnum.审核通过.ToInt().ToString()) { CM_RentOutService.CM_RentOut_Confirm(Head.Id); } return DataResult.Successed($"执行成功!", MultiLanguageConst.OperationSuccess); } if (req.FormName == "CM_SellCtn") { //序列化查询条件 var Head = await tenantDb.Queryable() .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 == CM_BillStatusEnum.驳回.ToInt().ToString()) Head.Remark += "驳回理由:" + req.Reason; } tenantDb.Updateable(Head).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand(); if (Head.BillState == CM_BillStatusEnum.审核通过.ToInt().ToString()) { CM_SellCtnService.CM_SellCtn_Confirm(Head.Id); } 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") { var _录入 = CM_BillStatusEnum.录入.ToInt().ToString(); //录入/驳回 状态允许提交1001 if (string.IsNullOrWhiteSpace(req.CurrentState) || req.CurrentState == CM_BillStatusEnum.录入.ToInt().ToString() || req.CurrentState == CM_BillStatusEnum.驳回.ToInt().ToString() ) { if (req.Execution == CM_ExecutionEnum.提交审核.ToInt().ToString()) { return DataResult.Successed(CM_BillStatusEnum.审核中.ToInt().ToString()); } } //提交审核状态 允许: 通过 驳回 撤回 if ( req.CurrentState == CM_BillStatusEnum.审核中.ToInt().ToString()) { if (req.Execution == CM_ExecutionEnum.撤回.ToInt().ToString()) { return DataResult.Successed(CM_BillStatusEnum.录入.ToInt().ToString()); } if (req.Execution == CM_ExecutionEnum.驳回.ToInt().ToString()) { return DataResult.Successed(CM_BillStatusEnum.驳回.ToInt().ToString()); } if (req.Execution == CM_ExecutionEnum.审核通过.ToInt().ToString()) { return DataResult.Successed(CM_BillStatusEnum.审核通过.ToInt().ToString()); } } //审核通过状态允许 驳回 if (req.CurrentState == CM_BillStatusEnum.审核通过.ToInt().ToString()) { if (req.Execution == CM_ExecutionEnum.驳回.ToInt().ToString()) { return DataResult.Successed(CM_BillStatusEnum.驳回.ToInt().ToString()); } } } return DataResult.Failed($""); } }