Bladeren bron

酒店预订
预订成本

leiy 11 maanden geleden
bovenliggende
commit
992154460d

+ 42 - 59
OASystem/OASystem.Api/Controllers/CRMController.cs

@@ -208,21 +208,13 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult>DelCustomer(DeleClientDelDto dto)
         {
-            try
+            Result result = await _clientRepository.DelCustomer(dto);
+            if (result.Code != 0)
             {
-                Result result = await _clientRepository.DelCustomer(dto);
-                if (result.Code != 0)
-                {
-                    return Ok(JsonView(false, result.Msg));
-                }
-                return Ok(JsonView(true, result.Msg));
+                return Ok(JsonView(false, result.Msg));
             }
-            catch (Exception)
-            {
-                return Ok(JsonView(false, "程序错误!"));
-                throw;
-            }
-            return Ok(JsonView(false, "程序错误!"));
+            return Ok(JsonView(true, result.Msg));
+
         }
         /// <summary>
         /// 证件表数据删除
@@ -233,20 +225,14 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> DelCustomerCerts(DelBaseDto dto)
         {
-            try
-            {
-                var result = await _customerCertRep.SoftDeleteByIdAsync<Crm_CustomerCert>(dto.Id.ToString(),dto.DeleteUserId);
-                if (!result)
-                {
-                    return Ok(JsonView(false, "删除失败"));
-                }
-                return Ok(JsonView(true, "删除成功!"));
-            }
-            catch (Exception ex)
+
+            var result = await _customerCertRep.SoftDeleteByIdAsync<Crm_CustomerCert>(dto.Id.ToString(), dto.DeleteUserId);
+            if (!result)
             {
-                return Ok(JsonView(false, "程序错误!"));
-                throw;
+                return Ok(JsonView(false, "删除失败"));
             }
+            return Ok(JsonView(true, "删除成功!"));
+
         }
 
         /// <summary>
@@ -258,20 +244,13 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> DelCustomerFamily(DelBaseDto dto)
         {
-            try
+            var result = await _customerFamilyRep.SoftDeleteByIdAsync<Crm_VisaCustomerFamily>(dto.Id.ToString(), dto.DeleteUserId);
+            if (!result)
             {
-                var result = await _customerFamilyRep.SoftDeleteByIdAsync<Crm_VisaCustomerFamily>(dto.Id.ToString(), dto.DeleteUserId);
-                if (!result)
-                {
-                    return Ok(JsonView(false, "删除失败"));
-                }
-                return Ok(JsonView(true, "删除成功!"));
-            }
-            catch (Exception ex)
-            {
-                return Ok(JsonView(false, "程序错误!"));
-                throw;
+                return Ok(JsonView(false, "删除失败"));
             }
+            return Ok(JsonView(true, "删除成功!"));
+
         }
 
         /// <summary>
@@ -283,20 +262,14 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> DelCustomerSchool(DelBaseDto dto)
         {
-            try
-            {
-                var result = await _customerSchoolRep.SoftDeleteByIdAsync<Crm_VisaCustomerSchool>(dto.Id.ToString(), dto.DeleteUserId);
-                if (!result)
-                {
-                    return Ok(JsonView(false, "删除失败"));
-                }
-                return Ok(JsonView(true, "删除成功!"));
-            }
-            catch (Exception ex)
+            
+            var result = await _customerSchoolRep.SoftDeleteByIdAsync<Crm_VisaCustomerSchool>(dto.Id.ToString(), dto.DeleteUserId);
+            if (!result)
             {
-                return Ok(JsonView(false, "程序错误!"));
-                throw;
+                return Ok(JsonView(false, "删除失败"));
             }
+            return Ok(JsonView(true, "删除成功!"));
+            
         }
         /// <summary>
         /// 客户工作经历表数据删除
@@ -307,20 +280,30 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> DelVisaCustomerCompany(DelBaseDto dto)
         {
-            try
+            var result = await _customerCompanyRep.SoftDeleteByIdAsync<Crm_VisaCustomerCompany>(dto.Id.ToString(), dto.DeleteUserId);
+            if (!result)
             {
-                var result = await _customerCompanyRep.SoftDeleteByIdAsync<Crm_VisaCustomerCompany>(dto.Id.ToString(), dto.DeleteUserId);
-                if (!result)
-                {
-                    return Ok(JsonView(false, "删除失败"));
-                }
-                return Ok(JsonView(true, "删除成功!"));
+                return Ok(JsonView(false, "删除失败"));
             }
-            catch (Exception ex)
+            return Ok(JsonView(true, "删除成功!"));
+        }
+
+        /// <summary>
+        /// 客户资料导入
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostClient(DelBaseDto dto)
+        {
+            var result = await _customerCompanyRep.SoftDeleteByIdAsync<Crm_VisaCustomerCompany>(dto.Id.ToString(), dto.DeleteUserId);
+            if (!result)
             {
-                return Ok(JsonView(false, "程序错误!"));
-                throw;
+                return Ok(JsonView(false, "删除失败"));
             }
+            return Ok(JsonView(true, "删除成功!"));
         }
+
     }
 }

+ 103 - 0
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -10314,6 +10314,109 @@ namespace OASystem.API.Controllers
             return Ok(JsonView(true, "操作成功!", Url));
         }
 
+        /// <summary>
+        /// 酒店预订
+        /// 生成 预定成本 Excel
+        /// </summary>
+        /// <param name="_dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostHotelReservationsPredictedCostFileDownload(HotelReservations_PCFD_DTO _dto)
+        {
+            #region  参数验证
+            var vadalitor = new HotelReservations_PCFD_DTOFoalidator();
+            var vadalitorRes = await vadalitor.ValidateAsync(_dto);
+            if (!vadalitorRes.IsValid)
+            {
+                var errors = new StringBuilder();
+                foreach (var valid in vadalitorRes.Errors) errors.AppendLine(valid.ErrorMessage);
+
+                return Ok(JsonView(false, errors.ToString()));
+            }
+
+            #region 团组操作权限验证 76 酒店预定模块
+            var groupAuthView = await GeneralMethod.PostGroupOperationAuth(_dto.DiId, _dto.UserId, 76);
+            if (groupAuthView.Code != 0) return Ok(JsonView(false, groupAuthView.Msg));
+            #endregion
+
+            //PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
+
+            //#region 页面操作权限验证
+            //pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+
+            //if (pageFunAuthView.FilesDownloadAuth == 0) return Ok(JsonView(false, "您没有文件下载权限!"));
+
+            //#endregion
+
+            #endregion
+
+            List<Grp_HotelReservations> hrDtas = await _sqlSugar.Queryable<Grp_HotelReservations>().Where(it => it.IsDel == 0 && it.DiId == _dto.DiId).ToListAsync();
+
+            //判断数据是否完整
+            if (hrDtas.Count < 1) return Ok(JsonView(false, "请先录入酒店预订信息!"));
+
+            hrDtas = hrDtas.OrderBy(it => it.CheckInDate).ToList();
+            string strFileName = "HotelStatement/";
+
+            string guestNames = ""; //格式Mr.xxx Ms.xxx
+            List<HotelReservations_PCFD_View> pcfds = new List<HotelReservations_PCFD_View>();
+
+            #region 数据处理
+
+            foreach (var item in hrDtas)
+            {
+                var ccpInfo = _sqlSugar.Queryable<Grp_CreditCardPayment>().Where(it => it.DIId == _dto.DiId && it.CId == item.Id).First();
+
+                pcfds.Add(new HotelReservations_PCFD_View()
+                {
+                    City = item.City,
+                    HotelName = item.HotelName,
+                    Date = $"{item.CheckInDate} - {item.CheckOutDate}",
+                    SingleRoomCount = item.SingleRoomCount,
+                    SingleRoomPrice = item.SingleRoomPrice,
+                    DoubleRoomCount = item.DoubleRoomCount,
+                    DoubleRoomPrice = item.DoubleRoomPrice,
+                    SuiteRoomCount = item.SuiteRoomCount,
+                    SuiteRoomPrice = item.SuiteRoomPrice,
+                    OtherRoomPrice = item.OtherRoomPrice,
+                    OtherRoomCount = item.OtherRoomCount,
+                    RoomCurrency = _sqlSugar.Queryable<Sys_SetData>().Where(it => it.Id == ccpInfo.PaymentCurrency).First()?.Name ?? "",
+
+                    RoomExplanation = item.RoomExplanation,
+                    PayTypeName = _sqlSugar.Queryable<Sys_SetData>().Where(it => it.Id == ccpInfo.PayDId).First()?.Name ?? "",
+                    PayTime = ccpInfo.ConsumptionDate,
+                    BankNo = ccpInfo.BankNo,
+                    PayMoney = ccpInfo.PayMoney,
+                    PayMoneyCurrency = _sqlSugar.Queryable<Sys_SetData>().Where(it => it.Id == ccpInfo.PaymentCurrency).First()?.Name ?? "",
+                    CardPrice = item.CardPrice,
+                    Remark = ccpInfo.Remark
+
+                }) ;
+            }
+
+            #endregion
+
+            //载入模板
+            WorkbookDesigner designer = new WorkbookDesigner();
+            designer.Workbook = new Workbook(AppSettingsHelper.Get("ExcelBasePath") + "Template/酒店预订成本.xls");
+
+            var groupInfo = _sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.Id == _dto.DiId).First();
+            var userInfo = _sqlSugar.Queryable<Sys_Users>().Where(it => it.Id == hrDtas[0].CreateUserId).First();
+            designer.SetDataSource("TourNo", groupInfo.TourCode);
+            designer.SetDataSource("TeamName", groupInfo.TeamName);
+            designer.SetDataSource("Opertor", userInfo.CnName);
+
+            DataTable dt = CommonFun.GetDataTableFromIList<HotelReservations_PCFD_View>(pcfds);
+            dt.TableName = "ViewMyHotelReservations";
+            designer.SetDataSource(dt);
+            designer.Process();
+            string fileName = ($"HotelReservation/{groupInfo.TeamName}_酒店预订成本_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls").Replace(":", "");
+            designer.Workbook.Save(AppSettingsHelper.Get("ExcelBasePath") + fileName);
+            string rst = AppSettingsHelper.Get("ExcelBaseUrl") + AppSettingsHelper.Get("ExcelFtpPath") + fileName;
+            return Ok(JsonView(true, "操作成功", url = rst));
+            
+        }
 
         /// <summary>
         /// 酒店预订

+ 84 - 84
OASystem/OASystem.Api/Controllers/TencentOCRController.cs

@@ -1,5 +1,6 @@
 using Aspose.Cells;
 using Aspose.Words;
+using FluentValidation;
 using Microsoft.EntityFrameworkCore.Internal;
 using Microsoft.IdentityModel.Tokens;
 using NPOI.OpenXmlFormats.Wordprocessing;
@@ -45,17 +46,16 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> GetGeneralBasic(GeneralBasicOCRDto dto)
         {
-            string[] picBase64Array = dto.picBase64.Split(';');
-            string picFormat = picBase64Array[0].Split('/')[1];
-            if (!TencentOCRTools.ImageType(picFormat))
-            {
-                return Ok(JsonView("图片格式不正确!只支持 PNG、JPG、JPEG、BMP 格式!"));
-            }
-
-            double strSize = 1024 * 1024 * 7;
-            if (dto.picBase64.Length > strSize)
+            var validator = new GeneralBasicOCRDtoFoalidator();
+            var validatorRes =  await validator.ValidateAsync(dto);
+            if (!validatorRes.IsValid) 
             {
-                return Ok(JsonView("图片不能大于7M!"));
+                var errors = new StringBuilder();
+                foreach (var valid in validatorRes.Errors)
+                {
+                    errors.AppendLine(valid.ErrorMessage);
+                }
+                return Ok(JsonView(false, errors.ToString()));
             }
 
             var gbData = await TencentOCRTools.GetOCR((int)TencentOCREnum.GeneralBasic, dto);
@@ -74,50 +74,22 @@ namespace OASystem.API.Controllers
 
             GeneralBasicOCRResponse res = gbData.Data as GeneralBasicOCRResponse;
 
-            // 创建文档对象
-            XWPFDocument doc = new XWPFDocument();
-
-            XWPFParagraph p1 = doc.CreateParagraph();
-            XWPFRun runText = p1.CreateRun();
+            string fileName = "通用印刷体[CH]";
+            string content = $"";
 
-            string fileName = "通用印刷体";
-            string content = $"{fileName}\n";
-            runText.SetText(content);
-            runText.AddCarriageReturn();
             foreach (var view in res.TextDetections)
             {
-                XWPFRun runText1 = p1.CreateRun();
-                string content1 = $"Content:{view.DetectedText}\n";
-
-                runText1.SetText(content1);
-                runText1.AddCarriageReturn();
+                content += $"Content:{view.DetectedText} \n";
             }
 
-            runText.FontSize = 12;
-            runText.SetFontFamily("宋体", FontCharRange.None); //设置宋体字体
-
-            //工作流写入,通过流的方式进行创建生成文件
-            MemoryStream stream = new MemoryStream();
-            doc.Write(stream);
-
-            string FilePath = $"{AppSettingsHelper.Get("WordBasePath")}/TencentOCR";
-
-            if (!Directory.Exists(FilePath))
+            if (dto.language == 1) { }
+            else if (dto.language == 2)
             {
-                Directory.CreateDirectory(FilePath);
+                fileName = "通用印刷体[EN]";
+                content = await YouDaoApiTools.GetOCR_ReTrans(content);
             }
 
-            string outputFile = $"{fileName}{DateTime.Now.ToString("yyyyMMddHHmmss")}.docx";
-
-            string sDate = DateTime.Now.ToString("yyyy年MM月dd日-HH时mm分ss秒-ffff");
-            FilePath = FilePath + "/" + outputFile;
-
-            FileStream Fs = new FileStream(FilePath, FileMode.OpenOrCreate);
-            doc.Write(Fs);
-            Fs.Close();
-
-            string url = $"{AppSettingsHelper.Get("WordBaseUrl")}Office/Word/TencentOCR/{outputFile}";
-
+            string url = NPOICreateWord(fileName, content);
             #endregion
 
             return Ok(JsonView(true, "操作成功", new { dataSource = res, url = url }));
@@ -133,17 +105,13 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> GetIDCard(IDCardOCRDto dto)
         {
-            string[] picBase64Array = dto.picBase64.Split(';');
-            string picFormat = picBase64Array[0].Split('/')[1];
-            if (!TencentOCRTools.ImageType(picFormat))
-            {
-                return Ok(JsonView("图片格式不正确!只支持 PNG、JPG、JPEG、BMP 格式!"));
-            }
-
-            double strSize = 1024 * 1024 * 7;
-            if (dto.picBase64.Length > strSize)
+            var validator = new IDCardOCRDtoFoalidator();
+            var validatorRes = await validator.ValidateAsync(dto);
+            if (!validatorRes.IsValid)
             {
-                return Ok(JsonView("图片不能大于7M!"));
+                var errors = new StringBuilder();
+                foreach (var valid in validatorRes.Errors) errors.AppendLine(valid.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
             }
 
             var idCardData = await TencentOCRTools.GetOCR((int)TencentOCREnum.IDCard, dto);
@@ -160,7 +128,6 @@ namespace OASystem.API.Controllers
 
             IDCardOCRAndDownUrlView iDCardOCRView = new IDCardOCRAndDownUrlView() { };
 
-
             if (dto.Language.ToLower() == "ch")
             {
                 bool cerdStatus = await _visaDeleClientRepository.SetCrmUpdPassIdCardOCR(
@@ -184,17 +151,16 @@ namespace OASystem.API.Controllers
             }
             else if (dto.Language.ToLower() == "en")
             {
-                iDCardOCRView.Name = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Name);
-                iDCardOCRView.Sex = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Sex);
-                iDCardOCRView.Nation = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Nation);
-                iDCardOCRView.Birth = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Birth);
-                iDCardOCRView.Address = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Address);
+                iDCardOCRView.Name = !string.IsNullOrEmpty( idCardData.Data.Name) ? await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Name) : "";
+                iDCardOCRView.Sex = !string.IsNullOrEmpty(idCardData.Data.Sex) ? await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Sex) : "";
+                iDCardOCRView.Nation = !string.IsNullOrEmpty(idCardData.Data.Nation) ? await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Nation) : "";
+                iDCardOCRView.Birth = !string.IsNullOrEmpty(idCardData.Data.Birth) ? await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Birth) : "";
+                iDCardOCRView.Address = !string.IsNullOrEmpty(idCardData.Data.Address) ? await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Address) : "";
                 iDCardOCRView.IdNum = idCardData.Data.IdNum;
-                iDCardOCRView.Authority = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Authority);
-                iDCardOCRView.ValidDate = await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.ValidDate);
+                iDCardOCRView.Authority = !string.IsNullOrEmpty(idCardData.Data.Authority) ? await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.Authority) : "";
+                iDCardOCRView.ValidDate = !string.IsNullOrEmpty(idCardData.Data.ValidDate) ? await YouDaoApiTools.GetOCR_ReTrans(idCardData.Data.ValidDate) : "";
             }
 
-
             #region word生成 返回地址
             Dictionary<string, object> dic = new Dictionary<string, object>();
             dic.Add("Name", iDCardOCRView.Name);
@@ -235,10 +201,13 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> GetResidenceBookletOCR(ResidenceBookletOCRDto dto)
         {
-            double strSize = 1024 * 1024 * 7;
-            if (dto.picBase64.Length > strSize)
+            var validator = new ResidenceBookletOCRDtoFoalidator();
+            var validatorRes = validator.Validate(dto);
+            if (!validatorRes.IsValid)
             {
-                return Ok(JsonView("图片不能大于7M!"));
+                var errors = new StringBuilder();
+                foreach (var valid in validatorRes.Errors) errors.AppendLine(valid.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
             }
 
             var residenceBookData = await TencentOCRTools.GetOCR((int)TencentOCREnum.ResidenceBooklet, dto);
@@ -263,7 +232,7 @@ namespace OASystem.API.Controllers
             XWPFParagraph p = doc.CreateParagraph();
             XWPFRun runText = p.CreateRun();
 
-            string fileName = "户口簿识别";
+            string fileName = "户口簿识别[CH]";
             string content = $"{fileName}\n";
 
             if (res != null)
@@ -298,6 +267,12 @@ namespace OASystem.API.Controllers
                 content += $"登记日期:{res.RegistrationDate ?? "Unknown"}\n";
             }
 
+            if (dto.language == 1) { }
+            else if (dto.language == 2) {
+                fileName = "户口簿识别[EN]";
+                content = await YouDaoApiTools.GetOCR_ReTrans(content);
+            }
+
             setWrap(content,p, runText);
 
             runText.FontSize = 12;
@@ -423,7 +398,6 @@ namespace OASystem.API.Controllers
             }
         }
 
-
         /// <summary>
         /// 营业执照识别
         /// 文档下载 
@@ -434,10 +408,13 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> GetBizLicenseOCR(BizLicenseOCRDto dto)
         {
-            double strSize = 1024 * 1024 * 7;
-            if (dto.picBase64.Length > strSize)
+            var validator = new BizLicenseOCRDtoFoalidator();
+            var validatorRes = await validator.ValidateAsync(dto);
+            if (!validatorRes.IsValid)
             {
-                return Ok(JsonView("图片不能大于7M!"));
+                var errors = new StringBuilder();
+                foreach (var valid in validatorRes.Errors) errors.AppendLine(valid.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
             }
 
             var residenceBookData = await TencentOCRTools.GetOCR((int)TencentOCREnum.BizLicense, dto);
@@ -453,7 +430,7 @@ namespace OASystem.API.Controllers
             }
 
             BizLicenseOCRResponse dataInfo = residenceBookData.Data as BizLicenseOCRResponse;
-            string fileName = "营业执照识别";
+            string fileName = "营业执照识别[CH]";
             string content = "";
             if (dataInfo != null)
             {
@@ -469,6 +446,13 @@ namespace OASystem.API.Controllers
                 content += $"成立日期:{dataInfo.SetDate}\n";
 
             }
+            
+            if (dto.language == 2)
+            {
+                fileName = "营业执照识别[EN]";
+                content = await YouDaoApiTools.GetOCR_ReTrans(content);
+            }
+
 
             string url = NPOICreateWord(fileName, content);
             var data = new
@@ -489,10 +473,13 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> GetOrgCodeCertOCR(OrgCodeCertOCRDto dto)
         {
-            double strSize = 1024 * 1024 * 7;
-            if (dto.picBase64.Length > strSize)
+            var validator = new OrgCodeCertOCRDtoFoalidator();
+            var validatorRes = await validator.ValidateAsync(dto);
+            if (!validatorRes.IsValid)
             {
-                return Ok(JsonView("图片不能大于7M!"));
+                var errors = new StringBuilder();
+                foreach (var valid in validatorRes.Errors) errors.AppendLine(valid.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
             }
 
             var occData = await TencentOCRTools.GetOCR((int)TencentOCREnum.OrgCodeCert, dto);
@@ -507,7 +494,7 @@ namespace OASystem.API.Controllers
                 return Ok(JsonView(occData.Msg));
             }
 
-            string fileName = "组织结构识别";
+            string fileName = "组织结构识别[CH]";
             string content = "";
             OrgCodeCertOCRResponse occInfo = occData.Data as OrgCodeCertOCRResponse;
             if (occInfo != null)
@@ -518,6 +505,8 @@ namespace OASystem.API.Controllers
                 content += $"有效期:{occInfo.ValidDate}\n";
             }
 
+            if (dto.language == 2) content = await YouDaoApiTools.GetOCR_ReTrans(content);
+
             string url = NPOICreateWord(fileName, content);
 
             var data = new
@@ -539,10 +528,14 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> GetVehicleLicense(VehicleLicenseOCRDto dto)
         {
-            double strSize = 1024 * 1024 * 7;
-            if (dto.picBase64.Length > strSize)
+            var validator = new VehicleLicenseOCRDtoFoalidator();
+            var validatorRes = await validator.ValidateAsync(dto);
+
+            if (!validatorRes.IsValid)
             {
-                return Ok(JsonView("图片不能大于7M!"));
+                var errors = new StringBuilder();
+                foreach (var valid in validatorRes.Errors) errors.AppendLine(valid.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
             }
 
             var vehicleLicenseData = TencentOCRTools.GetOCR((int)TencentOCREnum.VehicleLicense, dto);
@@ -588,6 +581,9 @@ namespace OASystem.API.Controllers
                     content += $"发证日期:{frontInfo.IssueDate ?? "Unknown"}\n";
                     content += $"印章:{frontInfo.Seal ?? "Unknown"}\n";
                 }
+
+                if (dto.language == 2) content = await YouDaoApiTools.GetOCR_ReTrans(content);
+
                 url = NPOICreateWord(fileName, content);
             }
             else if (dto.CardSide == 1) //反面
@@ -610,13 +606,13 @@ namespace OASystem.API.Controllers
                     content += $"准牵引总质量:{backInfo.TotalQuasiMass ?? "Unknown"}\n";
                 }
 
+                if (dto.language == 2) content = await YouDaoApiTools.GetOCR_ReTrans(content);
+
                 url = NPOICreateWord(fileName, content);
             }
-
             #endregion
 
             return Ok(JsonView(true, "操作成功", new { dataSource = data, url = url }));
-
         }
 
         /// <summary>
@@ -921,7 +917,11 @@ namespace OASystem.API.Controllers
             string picFormat = picBase64Array[0].Split('/')[1];
             if (!TencentOCRTools.ImageType(picFormat))
             {
-                return Ok(JsonView("图片格式不正确!只支持 PNG、JPG、JPEG、BMP 格式!"));
+                if (!picFormat.ToLower().Equals("pdf"))
+                {
+                    return Ok(JsonView("图片格式不正确!只支持 PDF、PNG、JPG、JPEG、BMP 格式!"));
+                }
+                
             }
 
             double strSize = 1024 * 1024 * 7;

+ 2 - 0
OASystem/OASystem.Api/OAMethodLib/TencentCloudAPI/TencentOCRTools.cs

@@ -95,6 +95,8 @@ namespace OASystem.API.OAMethodLib.TencentCloudAPI
                         GeneralBasicOCRDto gbOCR = (GeneralBasicOCRDto)data;
                         GeneralBasicOCRRequest gbReq = new GeneralBasicOCRRequest();
                         gbReq.ImageBase64 = gbOCR.picBase64;
+                        gbReq.IsPdf = true;
+
                         GeneralBasicOCRResponse gbRep = client.GeneralBasicOCRSync(gbReq);
                         result.Data = gbRep;
                         break;

+ 1 - 1
OASystem/OASystem.Api/OAMethodLib/YouDaoAPI/YouDaoApiTools.cs

@@ -21,7 +21,7 @@ namespace OASystem.API.OAMethodLib.YouDaoAPI
             if (data == null && data.Code != 0)
                 str = txt;
             else
-                str = data.Data;
+                str = data.Data as string;
 
             return str;
         }

+ 25 - 1
OASystem/OASystem.Domain/Dtos/Groups/HotelReservationsDto.cs

@@ -1,4 +1,5 @@
-using System;
+using FluentValidation;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -303,6 +304,29 @@ namespace OASystem.Domain.Dtos.Groups
 
     }
 
+    /// <summary>
+    /// 酒店预订
+    /// 预订成本 excel 下载
+    /// </summary>
+    public class HotelReservations_PCFD_DTO : UserPageFuncDtoBase
+    {
+        public int DiId { get; set; }
+    }
+
+    #region 酒店预订 预订成本 excel 下载 参数验证
+    public class HotelReservations_PCFD_DTOFoalidator : AbstractValidator<HotelReservations_PCFD_DTO>
+    {
+        public HotelReservations_PCFD_DTOFoalidator()
+        { 
+            RuleFor(it => it.DiId)
+                .GreaterThan(0)
+                .WithMessage($"请传入有效的用户DiId值");
+
+        }
+    }
+
+    #endregion
+
 
     /// <summary>
     /// 酒店预订

+ 16 - 1
OASystem/OASystem.Domain/Dtos/Tencent/BizLicenseOCRDto.cs

@@ -1,4 +1,5 @@
-using System;
+using FluentValidation;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -12,4 +13,18 @@ namespace OASystem.Domain.Dtos.Tencent
     public class BizLicenseOCRDto:OCRDtoBase
     {
     }
+
+    /// <summary>
+    /// 营业执照识别 Request Param Validator
+    /// </summary>
+    public class BizLicenseOCRDtoFoalidator : AbstractValidator<BizLicenseOCRDto>
+    {
+        /// <summary>
+        /// Init
+        /// </summary>
+        public BizLicenseOCRDtoFoalidator() 
+        {
+            Include(new OCRDtoBaseFoalidator());
+        }
+    }
 }

+ 17 - 2
OASystem/OASystem.Domain/Dtos/Tencent/GeneralBasicOCRDto.cs

@@ -1,4 +1,5 @@
-using System;
+using FluentValidation;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -10,7 +11,21 @@ namespace OASystem.Domain.Dtos.Tencent
     /// 通用文字识别
     /// 请求类
     /// </summary>
-    public class GeneralBasicOCRDto:OCRDtoBase
+    public class GeneralBasicOCRDto : OCRDtoBase
     {
     }
+
+    /// <summary>
+    /// 验证
+    /// </summary>
+    public class GeneralBasicOCRDtoFoalidator : AbstractValidator<GeneralBasicOCRDto>
+    {
+        /// <summary>
+        /// 通用文字识别 请求参数验证
+        /// </summary>
+        public GeneralBasicOCRDtoFoalidator()
+        {
+            Include(new OCRDtoBaseFoalidator()); //继承基类验证规则
+        }
+    }
 }

+ 35 - 1
OASystem/OASystem.Domain/Dtos/Tencent/IDCardOCRDto.cs

@@ -1,4 +1,5 @@
-using System;
+using FluentValidation;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -33,4 +34,37 @@ namespace OASystem.Domain.Dtos.Tencent
         public int CardSide { get; set; }
 
     }
+
+    /// <summary>
+    /// TencentOCR ID证件识别 DTO 验证
+    /// </summary>
+    public class IDCardOCRDtoFoalidator : AbstractValidator<IDCardOCRDto>
+    {
+
+        private readonly List<string> _languages = new List<string>() { "ch", "en" };
+        public IDCardOCRDtoFoalidator()
+        {
+            RuleFor(it => it.UserId)
+                .GreaterThan(0)
+                .WithMessage($"请传入有效的用户UserId值") ;
+
+            RuleFor(it => it.Language)
+                .NotNull()
+                .NotEmpty()
+                .WithMessage($"Language:参数值为空")
+                .Must(LanguageBeAllowedValue)
+                .WithMessage($"Language:无效值");
+
+            RuleFor(it => it.picBase64).NotNull().NotEmpty().WithMessage("picBase64为空");
+            RuleFor(it => it.picBase64).Must(base64 => OCRVerifyMethod.ImageSize(base64)).WithMessage("图片不能大于7M!");
+            RuleFor(it => it.picBase64).Must(base64 => OCRVerifyMethod.ImageType(base64)).WithMessage("图片格式不正确!只支持 PNG、JPG、JPEG、BMP格式的文件!");//
+            RuleFor(it => it.CardSide).InclusiveBetween(0, 1).WithMessage("CardSide(超出范围):0 人像面 1 国徽面");
+        }
+
+        private bool LanguageBeAllowedValue(string value)
+        {
+            return _languages.Contains(value.ToLower());
+        }
+    }
+
 }

+ 33 - 1
OASystem/OASystem.Domain/Dtos/Tencent/OCRDtoBase.cs

@@ -1,4 +1,5 @@
-using System;
+using FluentValidation;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -16,5 +17,36 @@ namespace OASystem.Domain.Dtos.Tencent
         /// </summary>
         public string picBase64 { get; set; }
 
+        /// <summary>
+        /// 语种
+        /// 1 中文
+        /// 2 英文
+        /// </summary>
+        public int language { get; set; }
+
     }
+
+    /// <summary>
+    /// 验证
+    /// </summary>
+    public class OCRDtoBaseFoalidator : AbstractValidator<OCRDtoBase>
+    {
+        public OCRDtoBaseFoalidator()
+        {
+            RuleFor(it => it.picBase64)
+                .NotEmpty()
+                .NotNull()
+                .WithMessage("picBase64为空");
+            RuleFor(it => it.picBase64)
+                .Must(base64 => OCRVerifyMethod.ImageSize(base64))
+                .WithMessage("图片不能大于7M!");
+            RuleFor(it => it.picBase64)
+                .Must(base64 => OCRVerifyMethod.ImageType(base64))
+                .WithMessage("图片格式不正确!只支持 PNG、JPG、JPEG、BMP格式的文件!");
+            RuleFor(it => it.language)
+                .InclusiveBetween(1, 2)
+                .WithMessage("language(超出范围):1 中文 2 英文");
+        }
+    }
+
 }

+ 47 - 0
OASystem/OASystem.Domain/Dtos/Tencent/OCRVerifyMethod.cs

@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// OCR Request Param Verify Method
+    /// </summary>
+    public static class OCRVerifyMethod
+    {
+        /// <summary>
+        /// TencentOCR图片类型处理
+        /// PNG、JPG、JPEG、BMP
+        /// </summary>
+        /// <param name="type"></param>
+        /// <returns></returns>
+        public static bool ImageType(string type)
+        {
+            string[] picBase64Array = type.Split(';');
+            string picFormat = picBase64Array[0].Split('/')[1];
+            if (picFormat.ToLower().Equals("png") || picFormat.ToLower().Equals("jpg") || picFormat.ToLower().Equals("jpeg") || picFormat.ToLower().Equals("bmp"))
+                return true;
+
+            return false;
+        }
+
+        /// <summary>
+        /// TencentOCR图片大小处理
+        /// 不能大于7MB
+        /// </summary>
+        /// <param name="type"></param>
+        /// <returns></returns>
+        public static bool ImageSize(string picBase64)
+        {
+            double strSize = 1024 * 1024 * 7;
+            if (picBase64.Length < strSize)
+            {
+                return true;
+            }
+
+            return false;
+        }
+    }
+}

+ 13 - 1
OASystem/OASystem.Domain/Dtos/Tencent/OrgCodeCertOCRDto.cs

@@ -1,4 +1,5 @@
-using System;
+using FluentValidation;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -12,4 +13,15 @@ namespace OASystem.Domain.Dtos.Tencent
     public class OrgCodeCertOCRDto:OCRDtoBase
     {
     }
+
+    /// <summary>
+    /// 组织机构代码证 Request ParaM Validator
+    /// </summary>
+    public class OrgCodeCertOCRDtoFoalidator : AbstractValidator<OrgCodeCertOCRDto>
+    {
+        public OrgCodeCertOCRDtoFoalidator() {
+
+            Include(new OCRDtoBaseFoalidator());
+        }
+    }
 }

+ 14 - 1
OASystem/OASystem.Domain/Dtos/Tencent/ResidenceBookletOCRDto.cs

@@ -1,4 +1,6 @@
-using System;
+using FluentValidation;
+using FluentValidation.Internal;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -12,4 +14,15 @@ namespace OASystem.Domain.Dtos.Tencent
     public class ResidenceBookletOCRDto:OCRDtoBase
     {
     }
+
+    /// <summary>
+    /// 户口本OCR Request 验证
+    /// </summary>
+    public class ResidenceBookletOCRDtoFoalidator : AbstractValidator<ResidenceBookletOCRDto>
+    {
+        public ResidenceBookletOCRDtoFoalidator() 
+        {
+            Include(new OCRDtoBaseFoalidator());
+        }
+    }
 }

+ 13 - 1
OASystem/OASystem.Domain/Dtos/Tencent/VehicleLicenseOCRDto.cs

@@ -1,4 +1,5 @@
-using System;
+using FluentValidation;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -19,4 +20,15 @@ namespace OASystem.Domain.Dtos.Tencent
         /// </summary>
         public int CardSide { get; set; }
     }
+
+    public class VehicleLicenseOCRDtoFoalidator : AbstractValidator<VehicleLicenseOCRDto>
+    {
+        public VehicleLicenseOCRDtoFoalidator()
+        {
+            Include(new OCRDtoBaseFoalidator());
+            RuleFor(it => it.CardSide)
+                .InclusiveBetween(0, 2)
+                .WithMessage("CardSide参数值超处范围! 0 FRONT(为行驶证主页正面(有红色印章的一面)) 1 BACK(为行驶证副页正面(有号码号牌的一面)) 2 DOUBEL(为行驶证主页正面和副页正面)");
+        }
+    }
 }

+ 1 - 0
OASystem/OASystem.Domain/OASystem.Domain.csproj

@@ -16,6 +16,7 @@
     <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" />
     <PackageReference Include="AutoMapper" Version="12.0.0" />
     <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.0" />
+    <PackageReference Include="EyeSoft.FluentValidation" Version="3.0.7760.34875" />
     <PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="2.2.0" />
     <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
     <PackageReference Include="SqlSugarCore" Version="5.1.3.32" />

+ 101 - 0
OASystem/OASystem.Domain/ViewModels/Groups/HotelReservationsByDiIdView.cs

@@ -372,6 +372,107 @@ namespace OASystem.Domain.ViewModels.Groups
         public string? ConfirmationNumber { get; set; }
     }
 
+    /// <summary>
+    /// 酒店预订
+    /// 生成 预定成本 Excel 
+    /// </summary>
+    public class HotelReservations_PCFD_View 
+    {
+        /// <summary>
+        /// 城市地区
+        /// </summary>
+        public string City { get; set; }
+
+        /// <summary>
+        /// 酒店名称
+        /// </summary>
+        public string HotelName { get; set; }
+
+        /// <summary>
+        /// 时间
+        /// checkInDate  -  CheckInOut
+        /// </summary>
+        public string Date { get; set; }
+
+        /// <summary>
+        /// 单间数量
+        /// </summary>
+        public int SingleRoomCount { get; set; }
+        /// <summary>
+        /// 单间单价
+        /// </summary>
+        public decimal SingleRoomPrice { get; set; }
+        /// <summary>
+        /// 双间数量
+        /// </summary>
+        public int DoubleRoomCount { get; set; }
+        /// <summary>
+        /// 双间单价
+        /// </summary>
+        public decimal DoubleRoomPrice { get; set; }
+        /// <summary>
+        /// 套房数量
+        /// </summary>
+        public int SuiteRoomCount { get; set; }
+        /// <summary>
+        /// 套房单价
+        /// </summary>
+        public decimal SuiteRoomPrice { get; set; }
+        /// <summary>
+        /// 其他房型数量
+        /// </summary>
+        public int OtherRoomCount { get; set; }
+        /// <summary>
+        /// 其他房型单价
+        /// </summary>
+        public decimal OtherRoomPrice { get; set; }
+
+        public string RoomCurrency { get; set; }
+
+        /// <summary>
+        /// 消费说明
+        /// </summary>
+        public string RoomExplanation { get; set; }
+
+        /// <summary>
+        /// 消费方式
+        /// </summary>
+        public string Consumptionpatterns { get; set; }
+
+        /// <summary>
+        /// 支付方式
+        /// </summary>
+        public string PayTypeName { get; set; }
+
+        public string PayTime { get; set; }
+
+        /// <summary>
+        /// 银行账号
+        /// </summary>
+        public string BankNo { get; set; }
+
+        /// <summary>
+        /// 付款金额
+        /// </summary>
+        public decimal PayMoney { get; set; }
+
+        /// <summary>
+        /// 付款付款金额币种
+        /// </summary>
+        public string PayMoneyCurrency { get; set; }
+
+        /// <summary>
+        /// 行用卡金额
+        /// </summary>
+        public decimal CardPrice { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string Remark { get; set; }
+    }
+
+
     #endregion