Procházet zdrojové kódy

更新Tencent
TencentOCRController,
OASystem.API.OAMethodLib.TencentOCRTools,
OASystem.Domain.ViewModels.TencentOCR,
OASystem.Domain.Dtos.Tencent,

leiy před 1 rokem
rodič
revize
f41f98f3fe
29 změnil soubory, kde provedl 1513 přidání a 8 odebrání
  1. 39 0
      OASystem/OASystem.Api/Controllers/GroupsController.cs
  2. 439 0
      OASystem/OASystem.Api/Controllers/TencentOCRController.cs
  3. 207 0
      OASystem/OASystem.Api/OAMethodLib/TencentOCRTools.cs
  4. 2 0
      OASystem/OASystem.Api/OASystem.API.csproj
  5. 32 1
      OASystem/OASystem.Api/Program.cs
  6. 17 0
      OASystem/OASystem.Domain/Dtos/CRM/DeleClientAddDto.cs
  7. 15 0
      OASystem/OASystem.Domain/Dtos/Tencent/BizLicenseOCRDto.cs
  8. 16 0
      OASystem/OASystem.Domain/Dtos/Tencent/BusinessCardOCRDto.cs
  9. 16 0
      OASystem/OASystem.Domain/Dtos/Tencent/GeneralBasicOCRDto.cs
  10. 29 0
      OASystem/OASystem.Domain/Dtos/Tencent/IDCardOCRDto.cs
  11. 16 0
      OASystem/OASystem.Domain/Dtos/Tencent/MLIDPassportOCRDto.cs
  12. 16 0
      OASystem/OASystem.Domain/Dtos/Tencent/MarriageLicenseOCRDto.cs
  13. 20 0
      OASystem/OASystem.Domain/Dtos/Tencent/OCRDtoBase.cs
  14. 15 0
      OASystem/OASystem.Domain/Dtos/Tencent/OrgCodeCertOCRDto.cs
  15. 16 0
      OASystem/OASystem.Domain/Dtos/Tencent/PassportOCRDto.cs
  16. 15 0
      OASystem/OASystem.Domain/Dtos/Tencent/PropOwnerCertOCRDto.cs
  17. 15 0
      OASystem/OASystem.Domain/Dtos/Tencent/ResidenceBookletOCRDto.cs
  18. 16 0
      OASystem/OASystem.Domain/Dtos/Tencent/UniformCreditCodeOCRDto.cs
  19. 22 0
      OASystem/OASystem.Domain/Dtos/Tencent/VehicleLicenseOCRDto.cs
  20. 66 0
      OASystem/OASystem.Domain/Enums/TencentOCREnum.cs
  21. 16 0
      OASystem/OASystem.Domain/ViewModels/CRM/CustomerCertView.cs
  22. 2 0
      OASystem/OASystem.Domain/ViewModels/CRM/VisaDeleClientView.cs
  23. 27 1
      OASystem/OASystem.Domain/ViewModels/Group/DelegationInfoView.cs
  24. 60 0
      OASystem/OASystem.Domain/ViewModels/TencentOCR/IDCardOCRView.cs
  25. 131 0
      OASystem/OASystem.Domain/ViewModels/TencentOCR/ResidenceBookletOCRView.cs
  26. 56 2
      OASystem/OASystem.Infrastructure/Repositories/CRM/VisaDeleClientRepository.cs
  27. 81 4
      OASystem/OASystem.Infrastructure/Repositories/Groups/DelegationInfoRepository.cs
  28. 19 0
      OASystem/OASystem.Tencent/OASystem.Tencent.csproj
  29. 92 0
      OASystem/OASystem.Tencent/TencentOCRTools.cs

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

@@ -298,10 +298,49 @@ namespace OASystem.API.Controllers
             return Ok(JsonView(groupData.Data, groupData.Data.Count));
         }
 
+        /// <summary>
+        /// 获取团组名称data  And 签证国别Data
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetGroupNameAndVisaNationality(GroupNameDto dto)
+        {
+            var groupData = await _groupRepository.GetGroupNameAndVisaNationality(dto);
+            if (groupData.Code != 0)
+            {
+                return Ok(JsonView(false, groupData.Msg));
+            }
+
+
+            return Ok(JsonView(groupData.Data));
+        }
+
         #endregion
 
         #region 团组&签证
 
+        /// <summary>
+        ///  根据团组Id获取签证客户信息List
+        /// </summary>
+        /// <param name="dto">请求dto</param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetCrmByGroupId(ClientByGroupIdDto dto)
+        {
+            var groupData = await _groupRepository.GetCrmByGroupId(dto);
+            if (groupData.Code != 0)
+            {
+                return Ok(JsonView(false, groupData.Msg));
+            }
+
+            return Ok(JsonView(groupData.Data));
+        }
+
+       
+
         #endregion
     }
 }

+ 439 - 0
OASystem/OASystem.Api/Controllers/TencentOCRController.cs

@@ -0,0 +1,439 @@
+using OASystem.API.OAMethodLib;
+using OASystem.Domain.Dtos.CRM;
+using OASystem.Domain.Dtos.Tencent;
+using OASystem.Domain.ViewModels.TencentOCR;
+using OASystem.Infrastructure.Repositories.CRM;
+using StackExchange.Redis;
+using System.Net.NetworkInformation;
+using TencentCloud.Ocr.V20181119.Models;
+using Ubiety.Dns.Core;
+
+namespace OASystem.API.Controllers
+{
+    /// <summary>
+    /// TencentOCR 识别 
+    /// </summary>
+    [Route("api/[controller]/[action]")]
+    //[ApiController]
+    public class TencentOCRController : ControllerBase
+    {
+        private readonly VisaDeleClientRepository _visaDeleClientRepository;
+
+        public TencentOCRController(VisaDeleClientRepository visaDeleClientRepository)
+        {
+            this._visaDeleClientRepository = visaDeleClientRepository;
+        }
+
+        /// <summary>
+        /// 通用印刷体
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [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)
+            {
+                return Ok(JsonView("图片不能大于7M!"));
+            }
+
+            var gbData = TencentOCRTools.GetOCR((int)TencentOCR.TencentOCREnum.GeneralBasic, dto);
+
+            if (gbData.Code != 0)
+            {
+                return Ok(JsonView(gbData.Msg));
+            }
+
+            if (gbData.Data == null)
+            {
+                return Ok(JsonView(gbData.Msg));
+            }
+
+            return Ok(JsonView(gbData.Data));
+        }
+
+
+        /// <summary>
+        /// 身份证识别(国徽面/反面)
+        /// 获取身份证返回数据
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [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)
+            {
+                return Ok(JsonView("图片不能大于7M!"));
+            }
+
+            var idCardData = TencentOCRTools.GetOCR((int)TencentOCR.TencentOCREnum.IDCard, dto);
+
+            if (idCardData.Code != 0)
+            {
+                return Ok(JsonView(idCardData.Msg));
+            }
+
+            if (idCardData.Data == null)
+            {
+                return Ok(JsonView(idCardData.Msg));
+            }
+
+            bool cerdStatus = await _visaDeleClientRepository.SetCrmUpdPassIdCardOCR(
+                new SetCrmUpdPassIdCardOCRDto
+                {
+                    UserId = dto.UserId,
+                    ClientName = idCardData.Data.Name,
+                    Sex = idCardData.Data.Sex == "男" ? 0 : 1,
+                    CerdNo = idCardData.Data.IdNum,
+                    CerdAddress = idCardData.Data.Address,
+                });
+
+            IDCardOCRView iDCardOCRView = new IDCardOCRView()
+            {
+                Status = cerdStatus,
+                Name = idCardData.Data.Name,
+                Sex = idCardData.Data.Sex,
+                Nation = idCardData.Data.Nation,
+                Birth = idCardData.Data.Birth,
+                Address = idCardData.Data.Address,
+                IdNum = idCardData.Data.IdNum,
+                Authority = idCardData.Data.Authority,
+                ValidDate = idCardData.Data.ValidDate
+            };
+
+            return Ok(JsonView(iDCardOCRView));
+        }
+
+        /// <summary>
+        /// 户口簿识别
+        /// 获取户口簿返回数据 
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetResidenceBookletOCR(ResidenceBookletOCRDto dto)
+        {
+            double strSize = 1024 * 1024 * 7;
+            if (dto.picBase64.Length > strSize)
+            {
+                return Ok(JsonView("图片不能大于7M!"));
+            }
+
+            var residenceBookData = TencentOCRTools.GetOCR((int)TencentOCR.TencentOCREnum.ResidenceBooklet, dto);
+
+            if (residenceBookData.Code != 0)
+            {
+                return Ok(JsonView(residenceBookData.Msg));
+            }
+
+            if (residenceBookData.Data == null)
+            {
+                return Ok(JsonView(residenceBookData.Msg));
+            }
+
+
+            return Ok(JsonView(residenceBookData.Data));
+        }
+
+        /// <summary>
+        /// 营业执照识别
+        /// 获取营业执照返回数据 
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetBizLicenseOCR(BizLicenseOCRDto dto)
+        {
+            double strSize = 1024 * 1024 * 7;
+            if (dto.picBase64.Length > strSize)
+            {
+                return Ok(JsonView("图片不能大于7M!"));
+            }
+
+            var residenceBookData = TencentOCRTools.GetOCR((int)TencentOCR.TencentOCREnum.BizLicense, dto);
+
+            if (residenceBookData.Code != 0)
+            {
+                return Ok(JsonView(residenceBookData.Msg));
+            }
+
+            if (residenceBookData.Data == null)
+            {
+                return Ok(JsonView(residenceBookData.Msg));
+            }
+
+
+            return Ok(JsonView(residenceBookData.Data));
+        }
+
+        /// <summary>
+        /// 营业执照识别
+        /// 获取营业执照返回数据 
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetOrgCodeCertOCR(OrgCodeCertOCRDto dto)
+        {
+            double strSize = 1024 * 1024 * 7;
+            if (dto.picBase64.Length > strSize)
+            {
+                return Ok(JsonView("图片不能大于7M!"));
+            }
+
+            var occData = TencentOCRTools.GetOCR((int)TencentOCR.TencentOCREnum.OrgCodeCert, dto);
+
+            if (occData.Code != 0)
+            {
+                return Ok(JsonView(occData.Msg));
+            }
+
+            if (occData.Data == null)
+            {
+                return Ok(JsonView(occData.Msg));
+            }
+
+            return Ok(JsonView(occData.Data));
+        }
+        
+        /// <summary>
+        /// 行驶证识别
+        /// 获取行驶证返回数据 
+        /// CardSide=0 主页正面(有红色印章的一面),CardSide=1 行驶证副页正面(有号码号牌的一面),CardSide=2 行驶证主页正面和副页正面。
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetVehicleLicense(VehicleLicenseOCRDto dto)
+        {
+            double strSize = 1024 * 1024 * 7;
+            if (dto.picBase64.Length > strSize)
+            {
+                return Ok(JsonView("图片不能大于7M!"));
+            }
+
+            var vehicleLicenseData = TencentOCRTools.GetOCR((int)TencentOCR.TencentOCREnum.VehicleLicense, dto);
+
+            if (vehicleLicenseData.Code != 0)
+            {
+                return Ok(JsonView(vehicleLicenseData.Msg));
+            }
+
+            if (vehicleLicenseData.Data == null)
+            {
+                return Ok(JsonView(vehicleLicenseData.Msg));
+            }
+
+            return Ok(JsonView(vehicleLicenseData.Data));
+        }
+
+        /// <summary>
+        /// 房产证识别
+        /// 获取房产证返回数据 
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetPropOwnerCert(PropOwnerCertOCRDto dto)
+        {
+            double strSize = 1024 * 1024 * 7;
+            if (dto.picBase64.Length > strSize)
+            {
+                return Ok(JsonView("图片不能大于7M!"));
+            }
+
+            var pcData = TencentOCRTools.GetOCR((int)TencentOCR.TencentOCREnum.PropOwnerCert, dto);
+
+            if (pcData.Code != 0)
+            {
+                return Ok(JsonView(pcData.Msg));
+            }
+
+            if (pcData.Data == null)
+            {
+                return Ok(JsonView(pcData.Msg));
+            }
+
+            return Ok(JsonView(pcData.Data));
+        }
+
+        /// <summary>
+        /// 结婚证识别
+        /// 获取结婚证返回数据 
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetMarriageLicense(MarriageLicenseOCRDto dto)
+        {
+            double strSize = 1024 * 1024 * 7;
+            if (dto.picBase64.Length > strSize)
+            {
+                return Ok(JsonView("图片不能大于7M!"));
+            }
+
+            var mlData = TencentOCRTools.GetOCR((int)TencentOCR.TencentOCREnum.GeneralBasic, dto);
+
+            if (mlData.Code != 0)
+            {
+                return Ok(JsonView(mlData.Msg));
+            }
+
+            if (mlData.Data == null)
+            {
+                return Ok(JsonView(mlData.Msg));
+            }
+
+            return Ok(JsonView(mlData.Data));
+        }
+
+        /// <summary>
+        /// 统一信用代码识别 
+        /// 获取统一信用代码返回数据 
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetUniformCreditCode(UniformCreditCodeOCRDto dto)
+        {
+            double strSize = 1024 * 1024 * 7;
+            if (dto.picBase64.Length > strSize)
+            {
+                return Ok(JsonView("图片不能大于7M!"));
+            }
+
+            var gbData = TencentOCRTools.GetOCR((int)TencentOCR.TencentOCREnum.GeneralBasic, dto);
+
+            if (gbData.Code != 0)
+            {
+                return Ok(JsonView(gbData.Msg));
+            }
+
+            if (gbData.Data == null)
+            {
+                return Ok(JsonView(gbData.Msg));
+            }
+
+            return Ok(JsonView(gbData.Data));
+        }
+
+        /// <summary>
+        /// 护照识别(中国大陆地区护照) 
+        /// 获取护照识别(中国大陆地区护照)返回数据 
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetPassport(PassportOCRDto dto)
+        {
+            double strSize = 1024 * 1024 * 7;
+            if (dto.picBase64.Length > strSize)
+            {
+                return Ok(JsonView("图片不能大于7M!"));
+            }
+
+            var pData = TencentOCRTools.GetOCR((int)TencentOCR.TencentOCREnum.Passport, dto);
+
+            if (pData.Code != 0)
+            {
+                return Ok(JsonView(pData.Msg));
+            }
+
+            if (pData.Data == null)
+            {
+                return Ok(JsonView(pData.Msg));
+            }
+
+            return Ok(JsonView(pData.Data));
+        }
+
+        /// <summary>
+        /// 护照识别(港澳台地区及境外护照)
+        /// 获取护照识别(港澳台地区及境外护照)返回数据 
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetMLIDPassport(PassportOCRDto dto)
+        {
+            double strSize = 1024 * 1024 * 7;
+            if (dto.picBase64.Length > strSize)
+            {
+                return Ok(JsonView("图片不能大于7M!"));
+            }
+
+            var mlidpData = TencentOCRTools.GetOCR((int)TencentOCR.TencentOCREnum.MLIDPassport, dto);
+
+            if (mlidpData.Code != 0)
+            {
+                return Ok(JsonView(mlidpData.Msg));
+            }
+
+            if (mlidpData.Data == null)
+            {
+                return Ok(JsonView(mlidpData.Msg));
+            }
+
+            return Ok(JsonView(mlidpData.Data));
+        }
+
+        /// <summary>
+        /// 名片识别
+        /// 获取名片 返回数据 
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GetBusinessCard(BusinessCardOCRDto dto)
+        {
+            double strSize = 1024 * 1024 * 7;
+            if (dto.picBase64.Length > strSize)
+            {
+                return Ok(JsonView("图片不能大于7M!"));
+            }
+
+            var mlidpData = TencentOCRTools.GetOCR((int)TencentOCR.TencentOCREnum.BusinessCard, dto);
+
+            if (mlidpData.Code != 0)
+            {
+                return Ok(JsonView(mlidpData.Msg));
+            }
+
+            if (mlidpData.Data == null)
+            {
+                return Ok(JsonView(mlidpData.Msg));
+            }
+
+            return Ok(JsonView(mlidpData.Data));
+        }
+    }
+}

+ 207 - 0
OASystem/OASystem.Api/OAMethodLib/TencentOCRTools.cs

@@ -0,0 +1,207 @@
+using OASystem.Domain.Dtos.Tencent;
+using OASystem.TencentOCR;
+using TencentCloud.Common;
+using TencentCloud.Ocr.V20181119.Models;
+using TencentCloud.Ocr.V20181119;
+
+namespace OASystem.API.OAMethodLib
+{
+    /// <summary>
+    /// 腾讯OCR Tools
+    /// </summary>
+    public static class TencentOCRTools
+    {
+        /// <summary>
+        /// 初始化 腾讯云账户密钥对 SecretId,SecretKey
+        /// </summary>
+        static Credential cred = new Credential
+        {
+            SecretId = "AKIDoQUHLBELagatzoScfdMpMddMnz8apqIc",
+            SecretKey = "hKiGbhkX5NWWXu3zDWwAATVK3e5sWuBB"
+        };
+
+        /// <summary>
+        /// ocr识别
+        /// </summary>
+        /// <param name="ocrEnum">转换类型</param>
+        /// <param name="data">请求数据源</param>
+        /// <returns></returns>
+        public static Result GetOCR(int ocrEnum, object data)
+        {
+            Result result = new Result { Code = -1, Msg = "未知错误", Data = null };
+            OcrClient client = new OcrClient(cred, "ap-guangzhou");
+
+            try
+            {
+                switch (ocrEnum)
+                {
+                    case 0: //身份证识别
+                        IDCardOCRDto iDCardDto = (IDCardOCRDto)data;
+                        IDCardOCRRequest req = new IDCardOCRRequest();
+
+                        if (iDCardDto.CardSide == 0) req.CardSide = "FRONT";
+                        else if (iDCardDto.CardSide == 1) req.CardSide = "BACK";
+
+                        req.ImageBase64 = iDCardDto.picBase64;
+                        IDCardOCRResponse resp = client.IDCardOCRSync(req);
+                        result.Data = resp;
+                        break;
+                    case 1: //户口本识别
+                        ResidenceBookletOCRDto rbOCR = (ResidenceBookletOCRDto)data;
+                        ResidenceBookletOCRRequest rbReq = new ResidenceBookletOCRRequest();
+                        rbReq.ImageBase64 = rbOCR.picBase64;
+                        ResidenceBookletOCRResponse rbRep = client.ResidenceBookletOCRSync(rbReq);
+                        result.Data = rbRep;
+                        break;
+                    case 2: //营业执照识别 OrgCodeCert
+
+                        BizLicenseOCRDto blOCR = (BizLicenseOCRDto)data;
+                        BizLicenseOCRRequest blReq = new BizLicenseOCRRequest();
+                        blReq.ImageBase64 = blOCR.picBase64;
+                        BizLicenseOCRResponse blRep = client.BizLicenseOCRSync(blReq);
+                        result.Data = blRep;
+                        break;
+                    case 3: //组织机构代码证识别 
+
+                        OrgCodeCertOCRDto occOCR = (OrgCodeCertOCRDto)data;
+                        OrgCodeCertOCRRequest ocReq = new OrgCodeCertOCRRequest();
+                        ocReq.ImageBase64 = occOCR.picBase64;
+                        OrgCodeCertOCRResponse occReq = client.OrgCodeCertOCRSync(ocReq);
+                        result.Data = occReq;
+                        break;
+                    case 4: //行驶证识别 
+
+                        VehicleLicenseOCRDto vlOCR = (VehicleLicenseOCRDto)data;
+                        VehicleLicenseOCRRequest vlReq = new VehicleLicenseOCRRequest();
+
+                        if (vlOCR.CardSide == 0) vlReq.CardSide = "FRONT";
+                        else if (vlOCR.CardSide == 1) vlReq.CardSide = "BACK";
+                        else if (vlOCR.CardSide == 2) vlReq.CardSide = "DOUBLE";
+
+                        vlReq.ImageBase64 = vlOCR.picBase64;
+                        VehicleLicenseOCRResponse vlRep = client.VehicleLicenseOCRSync(vlReq);
+                        result.Data = vlRep;
+                        break;
+                    case 5: //房产证识别 通用文字识别
+                        PropOwnerCertOCRDto pocOCR = (PropOwnerCertOCRDto)data;
+                        PropOwnerCertOCRRequest pocReq = new PropOwnerCertOCRRequest();
+                        pocReq.ImageBase64 = pocOCR.picBase64;
+                        PropOwnerCertOCRResponse pocRep = client.PropOwnerCertOCRSync(pocReq);
+                        result.Data = pocRep;
+                        break;
+                    case 6: // 通用文字识别
+                        GeneralBasicOCRDto gbOCR = (GeneralBasicOCRDto)data;
+                        GeneralBasicOCRRequest gbReq = new GeneralBasicOCRRequest();
+                        gbReq.ImageBase64 = gbOCR.picBase64;
+                        GeneralBasicOCRResponse gbRep = client.GeneralBasicOCRSync(gbReq);
+                        result.Data = gbRep;
+                        break;
+                    case 7: // 护照识别(中国大陆地区护照)
+                        PassportOCRDto pOCR = (PassportOCRDto)data;
+                        PassportOCRRequest pReq = new PassportOCRRequest();
+                        pReq.ImageBase64 = pOCR.picBase64;
+                        PassportOCRResponse pRep = client.PassportOCRSync(pReq);
+                        result.Data = pRep;
+                        break;
+                    case 8: // 护照识别(港澳台地区及境外护照)
+                        MLIDPassportOCRDto mlidpOCR = (MLIDPassportOCRDto)data;
+                        MLIDPassportOCRRequest mlidpReq = new MLIDPassportOCRRequest();
+                        mlidpReq.ImageBase64 = mlidpOCR.picBase64;
+                        MLIDPassportOCRResponse mlidpRep = client.MLIDPassportOCRSync(mlidpReq);
+                        result.Data = mlidpRep;
+                        break;
+                    case 9: // 护照识别(港澳台地区及境外护照)
+                        BusinessCardOCRDto bcOCR = (BusinessCardOCRDto)data;
+                        BusinessCardOCRRequest bcReq = new BusinessCardOCRRequest();
+                        bcReq.ImageBase64 = bcOCR.picBase64;
+                        BusinessCardOCRResponse bcRep = client.BusinessCardOCRSync(bcReq);
+                        result.Data = bcRep;
+                        break;
+                }
+
+                result.Code = 0;
+                result.Msg = "成功";
+                return result;
+            }
+            catch (Exception ex)
+            {
+                result.Msg = "TencentOCRAPIError:" + ex.Message;
+                return result;
+            }
+        }
+
+
+        /// <summary>
+        /// 图片转Base64
+        /// </summary>
+        /// <param name="ImageFileName">图片的完整路径</param>
+        /// <returns></returns>
+        public static string ImgToBase64(string ImageFileName)
+        {
+            try
+            {
+                Bitmap bmp = new Bitmap(ImageFileName);
+                MemoryStream ms = new MemoryStream();
+                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
+                byte[] arr = new byte[ms.Length];
+                ms.Position = 0;
+                ms.Read(arr, 0, (int)ms.Length);
+                ms.Close();
+                return Convert.ToBase64String(arr);
+            }
+            catch (Exception e)
+            {
+                return e.Message.ToString();
+            }
+        }
+
+        /// <summary>
+        /// TencentOCR图片类型处理
+        /// PNG、JPG、JPEG、BMP
+        /// </summary>
+        /// <param name="type"></param>
+        /// <returns></returns>
+        public static bool ImageType(string type)
+        {
+            if (type.ToLower() == "png" || type.ToLower() == "jpg" || type.ToLower() == "jpeg" || type.ToLower() == "bmp")
+                return true;
+
+            return false;
+        }
+
+
+        private const double KBCount = 1024;
+        private const double MBCount = KBCount * 1024;
+        private const double GBCount = MBCount * 1024;
+        private const double TBCount = GBCount * 1024;
+
+        /// <summary>
+        /// 得到适应的大小
+        /// </summary>
+        /// <param name="path"></param>
+        /// <returns>string</returns>
+        public static string GetAutoSizeString(double size, int roundCount)
+        {
+            if (KBCount > size)
+            {
+                return Math.Round(size, roundCount) + "B";
+            }
+            else if (MBCount > size)
+            {
+                return Math.Round(size / KBCount, roundCount) + "KB";
+            }
+            else if (GBCount > size)
+            {
+                return Math.Round(size / MBCount, roundCount) + "MB";
+            }
+            else if (TBCount > size)
+            {
+                return Math.Round(size / GBCount, roundCount) + "GB";
+            }
+            else
+            {
+                return Math.Round(size / TBCount, roundCount) + "TB";
+            }
+        }
+    }
+}

+ 2 - 0
OASystem/OASystem.Api/OASystem.API.csproj

@@ -32,6 +32,8 @@
     <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
     <PackageReference Include="SqlSugarCore" Version="5.1.3.32" />
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
+    <PackageReference Include="TencentCloudSDK.Common" Version="3.0.734" />
+    <PackageReference Include="TencentCloudSDK.Ocr" Version="3.0.734" />
   </ItemGroup>
 
   <ItemGroup>

+ 32 - 1
OASystem/OASystem.Api/Program.cs

@@ -8,6 +8,8 @@ using OASystem.API.OAMethodLib;
 using System.Text.Json.Serialization;
 using OASystem.API.OAMethodLibs;
 using OASystem.Domain.Dtos.Groups;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Core;
 
 var builder = WebApplication.CreateBuilder(args);
 var basePath = AppContext.BaseDirectory;
@@ -32,8 +34,8 @@ builder.Services.AddControllers()
         options.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter("yyyy-MM-dd HH:mm:ss"));
     });
 
-#region Cors
 
+#region 上传文件 
 builder.Services.AddCors(policy =>
 {
     policy.AddPolicy("Cors", opt => opt
@@ -41,10 +43,38 @@ builder.Services.AddCors(policy =>
     .AllowAnyHeader()
     .AllowAnyMethod()
     .WithExposedHeaders("X-Pagination"));
+
+});
+
+builder.Services.Configure<FormOptions>(options =>
+
+{
+
+    options.KeyLengthLimit = int.MaxValue;
+
+    options.ValueLengthLimit = int.MaxValue;
+
+    options.MultipartBodyLengthLimit = int.MaxValue;
+
+    options.MultipartHeadersLengthLimit = int.MaxValue;
+
+});
+
+builder.Services.Configure<KestrelServerOptions>(options =>
+
+{
+
+    options.Limits.MaxRequestBodySize = int.MaxValue;
+
+    options.Limits.MaxRequestBufferSize = int.MaxValue;
+
 });
 
 #endregion
 
+
+
+
 #region 接口分组
 var groups = new List<Tuple<string, string>>
 {
@@ -217,6 +247,7 @@ app.UseRouting();
 app.UseAuthentication(); // 认证
 app.UseAuthorization();  // 授权
 app.UseCors("Cors");  //Cors
+//app.UseCors("AllowSpecificOrigin");  //Cors
 
 #region 启用swaggerUI
 if (AppSettingsHelper.Get("UseSwagger").ToBool())

+ 17 - 0
OASystem/OASystem.Domain/Dtos/CRM/DeleClientAddDto.cs

@@ -12,4 +12,21 @@ namespace OASystem.Domain.Dtos.CRM
     public class DeleClientAddDto
     {
     }
+
+    public class SetCrmUpdPassIdCardOCRDto
+    {
+        public int UserId { get; set; }
+
+        public string ClientName { get; set; }
+
+        public int Sex { get; set; }
+
+        public string CerdNo { get; set; }
+
+        public string CerdAddress { get; set; }
+
+        public DateTime IssueDt { get; set; }
+
+        public DateTime ExpiryDt { get; set; }
+    }
 }

+ 15 - 0
OASystem/OASystem.Domain/Dtos/Tencent/BizLicenseOCRDto.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// 营业执照识别 请求
+    /// </summary>
+    public class BizLicenseOCRDto:OCRDtoBase
+    {
+    }
+}

+ 16 - 0
OASystem/OASystem.Domain/Dtos/Tencent/BusinessCardOCRDto.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// 名片识别
+    /// 请求类
+    /// </summary>
+    public class BusinessCardOCRDto:OCRDtoBase
+    {
+    }
+}

+ 16 - 0
OASystem/OASystem.Domain/Dtos/Tencent/GeneralBasicOCRDto.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// 通用文字识别
+    /// 请求类
+    /// </summary>
+    public class GeneralBasicOCRDto:OCRDtoBase
+    {
+    }
+}

+ 29 - 0
OASystem/OASystem.Domain/Dtos/Tencent/IDCardOCRDto.cs

@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// TencentOCR ID证件识别 
+    /// </summary>
+    public class IDCardOCRDto:DtoBase
+    {
+        public int UserId { get; set; }
+
+        /// <summary>
+        /// 图片的 Base64 值。要求图片经Base64编码后不超过 7M,分辨率建议500*800以上,支持PNG、JPG、JPEG、BMP格式。建议卡片部分占据图片2/3以上。
+        /// </summary>
+        public string picBase64 { get; set; }
+
+        /// <summary>
+        /// 0 FRONT:身份证有照片的一面(人像面)
+        /// 1 BACK:身份证有国徽的一面(国徽面)
+        ///  该参数如果不填,将为您自动判断身份证正反面。
+        /// </summary>
+        public int CardSide { get; set; }
+
+    }
+}

+ 16 - 0
OASystem/OASystem.Domain/Dtos/Tencent/MLIDPassportOCRDto.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// 护照识别(港澳台地区及境外护照)
+    /// 请求实体类
+    /// </summary>
+    public class MLIDPassportOCRDto:OCRDtoBase
+    {
+    }
+}

+ 16 - 0
OASystem/OASystem.Domain/Dtos/Tencent/MarriageLicenseOCRDto.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// 结婚证
+    /// 请求实体类
+    /// </summary>
+    public class MarriageLicenseOCRDto:OCRDtoBase
+    {
+    }
+}

+ 20 - 0
OASystem/OASystem.Domain/Dtos/Tencent/OCRDtoBase.cs

@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// OCR 继承基类
+    /// </summary>
+    public class OCRDtoBase
+    {
+        /// <summary>
+        /// 图片转base64 字符串
+        /// </summary>
+        public string picBase64 { get; set; }
+
+    }
+}

+ 15 - 0
OASystem/OASystem.Domain/Dtos/Tencent/OrgCodeCertOCRDto.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// 组织机构代码证识别
+    /// </summary>
+    public class OrgCodeCertOCRDto:OCRDtoBase
+    {
+    }
+}

+ 16 - 0
OASystem/OASystem.Domain/Dtos/Tencent/PassportOCRDto.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// 护照识别(中国大陆地区护照)
+    /// 请求实体类
+    /// </summary>
+    public class PassportOCRDto:OCRDtoBase
+    {
+    }
+}

+ 15 - 0
OASystem/OASystem.Domain/Dtos/Tencent/PropOwnerCertOCRDto.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// 房产证 请求实体类
+    /// </summary>
+    public class PropOwnerCertOCRDto:OCRDtoBase
+    {
+    }
+}

+ 15 - 0
OASystem/OASystem.Domain/Dtos/Tencent/ResidenceBookletOCRDto.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// 户口本OCR Dto
+    /// </summary>
+    public class ResidenceBookletOCRDto:OCRDtoBase
+    {
+    }
+}

+ 16 - 0
OASystem/OASystem.Domain/Dtos/Tencent/UniformCreditCodeOCRDto.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// 统一信用代码请求实体类
+    /// 
+    /// </summary>
+    public class UniformCreditCodeOCRDto:OCRDtoBase
+    {
+    }
+}

+ 22 - 0
OASystem/OASystem.Domain/Dtos/Tencent/VehicleLicenseOCRDto.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Tencent
+{
+    /// <summary>
+    /// 行驶证识别
+    /// 请求类
+    /// </summary>
+    public class VehicleLicenseOCRDto:OCRDtoBase
+    {
+        /// <summary>
+        /// 0 FRONT 1 BACK 2 DOUBEL
+        /// FRONT 为行驶证主页正面(有红色印章的一面), BACK 为行驶证副页正面(有号码号牌的一面), DOUBLE 为行驶证主页正面和副页正面。
+        /// 默认值为:FRONT。
+        /// </summary>
+        public int CardSide { get; set; }
+    }
+}

+ 66 - 0
OASystem/OASystem.Domain/Enums/TencentOCREnum.cs

@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.TencentOCR
+{
+    /// <summary>
+    /// ocr 枚举类型
+    /// </summary>
+    public enum TencentOCREnum
+    {
+        /* OCR存储文件路径
+         * **************************************
+         * 身份证识别 OCR/IDCard
+         * 户口本识别 OCR/ResidenceBooklet
+         * 营业执照识别 OCR/BizLicense
+         * 组织机构代码证识别 OCR/OrgCodeCert
+         * 行驶证识别 OCR/VehicleLicense
+         * 房产证识别 OCR/PropOwnerCert
+         * 通用印刷体识别 OCR/GeneralAccurate
+         ***************************************
+         */
+        /// <summary>
+        /// 身份证识别
+        /// </summary>
+        IDCard = 0,
+        /// <summary>
+        /// 户口本识别
+        /// </summary>
+        ResidenceBooklet=1,
+        /// <summary>
+        /// 营业执照识别
+        /// </summary>
+        BizLicense,
+        /// <summary>
+        /// 组织机构代码证识别
+        /// </summary>
+        OrgCodeCert,
+        /// <summary>
+        /// 行驶证识别
+        /// </summary>
+        VehicleLicense,
+        /// <summary>
+        /// 房产证识别
+        /// </summary>
+        PropOwnerCert,
+        /// <summary>
+        /// 通用印刷体识别
+        /// </summary>
+        GeneralBasic,
+        /// <summary>
+        /// 护照识别(中国大陆地区护照)
+        /// </summary>
+        Passport,
+        /// <summary>
+        /// 护照识别(港澳台地区及境外护照)
+        /// </summary>
+        MLIDPassport,
+        /// <summary>
+        /// 名片识别
+        /// </summary>
+        BusinessCard
+    }
+}

+ 16 - 0
OASystem/OASystem.Domain/ViewModels/CRM/CustomerCertView.cs

@@ -0,0 +1,16 @@
+using OASystem.Domain.Entities.Customer;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.CRM
+{
+    /// <summary>
+    /// 签证 证件类型
+    /// </summary>
+    public class CustomerCertView: Crm_CustomerCert
+    {
+    }
+}

+ 2 - 0
OASystem/OASystem.Domain/ViewModels/CRM/VisaDeleClientView.cs

@@ -92,4 +92,6 @@ namespace OASystem.Domain.ViewModels.CRM
         /// </summary>
         public string IdNo { get; set; }
     }
+
+   
 }

+ 27 - 1
OASystem/OASystem.Domain/ViewModels/Group/DelegationInfoView.cs

@@ -140,7 +140,7 @@ namespace OASystem.Domain.ViewModels.Group
         public string TellPhone { get; set; }
     }
 
-    // <summary>
+    /// <summary>
     /// 接团信息列表
     /// 返回视图
     /// </summary>
@@ -248,4 +248,30 @@ namespace OASystem.Domain.ViewModels.Group
         /// </summary>
         public string GroupName { get; set; }
     }
+
+    /// <summary>
+    /// 根据团组ID 查询客户
+    /// </summary>
+    public class CrmByGroupIdView
+    {
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        public int GrpId { get; set; }
+
+        /// <summary>
+        /// 客户名称
+        /// </summary>
+        public string clientName { get; set; }
+
+        /// <summary>
+        /// 客户手机号
+        /// </summary>
+        public string Tel { get; set; }
+
+        /// <summary>
+        /// 客户身份证号码
+        /// </summary>
+        public string CerdNo { get; set; }
+    }
 }

+ 60 - 0
OASystem/OASystem.Domain/ViewModels/TencentOCR/IDCardOCRView.cs

@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.TencentOCR
+{
+    /// <summary>
+    /// 身份证 OCR 返回视图
+    /// </summary>
+    public class IDCardOCRView
+    {
+        /// <summary>
+        /// 是否修改
+        /// 签证客户人员信息
+        /// </summary>
+        public bool Status { get; set; }
+
+        /// <summary>
+        /// 姓名
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 性别
+        /// </summary>
+        public string Sex { get; set; }
+
+        /// <summary>
+        /// 种族
+        /// </summary>
+        public string Nation { get; set; }
+
+        /// <summary>
+        /// 生日
+        /// </summary>
+        public string Birth { get; set; }
+
+        /// <summary>
+        /// 身份证地址
+        /// </summary>
+        public string Address { get; set; }
+
+        /// <summary>
+        /// 身份证号码
+        /// </summary>
+        public string IdNum { get; set; }
+
+        /// <summary>
+        /// 签发机关
+        /// </summary>
+        public string Authority { get; set; }
+
+        /// <summary>
+        /// 证件有效期
+        /// </summary>
+        public string ValidDate { get; set; }
+    }
+}

+ 131 - 0
OASystem/OASystem.Domain/ViewModels/TencentOCR/ResidenceBookletOCRView.cs

@@ -0,0 +1,131 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.TencentOCR
+{
+    /// <summary>
+    /// 户口簿 返回View
+    /// </summary>
+    public class ResidenceBookletOCRView
+    {
+        /// <summary>
+        /// 户籍地址
+        /// </summary>
+        public string Address { get; set; }
+        /// <summary>
+        /// 出生日期
+        /// </summary>
+        public string BirthDate { get; set; }
+        /// <summary>
+        /// 出生城市
+        /// </summary>
+        public string BirthPlace { get; set; }
+        /// <summary>
+        /// 血型
+        /// </summary>
+        public string BloodType { get; set; }
+        /// <summary>
+        /// 教育程度
+        /// </summary>
+        public string EducationDegree { get; set; }
+        /// <summary>
+        /// 曾用姓名
+        /// </summary>
+        public string FormerName { get; set; }
+        /// <summary>
+        /// 身高
+        /// </summary>
+        public string Height { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string HomePageNumber { get; set; }
+        /// <summary>
+        /// 与户主关系
+        /// </summary>
+        public string Household { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string HouseholdNumber { get; set; }
+        /// <summary>
+        /// 户主名称
+        /// </summary>
+        public string HouseholderName { get; set; }
+        /// <summary>
+        /// 身份证号
+        /// </summary>
+        public string IdCardNumber { get; set; }
+        /// <summary>
+        /// 签发日期
+        /// </summary>
+        public string IssueDate { get; set; }
+        /// <summary>
+        /// 婚姻状态
+        /// </summary>
+        public string MaritalStatus { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string MoveToCityInformation { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string MoveToSiteInformation { get; set; }
+        /// <summary>
+        /// 姓名
+        /// </summary>
+        public string Name { get; set; }
+        /// <summary>
+        /// 种族
+        /// </summary>
+        public string Nation { get; set; }
+        /// <summary>
+        /// 江苏省江阴市
+        /// </summary>
+        public string NativePlace { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string OtherAddresses { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string Profession { get; set; }
+        /// <summary>
+        /// 2010年07月13日
+        /// </summary>
+        public DateTime RegistrationDate { get; set; }
+        /// <summary>
+        /// 子
+        /// </summary>
+        public string Relationship { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string ReligiousBelief { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string RequestId { get; set; }
+        /// <summary>
+        /// 丰镇小学
+        /// </summary>
+        public string ServicePlace { get; set; }
+        /// <summary>
+        /// 男
+        /// </summary>
+        public string Sex { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string Signature { get; set; }
+        /// <summary>
+        /// 
+        /// </summary>
+        public string VeteranStatus { get; set; }
+    }
+}

+ 56 - 2
OASystem/OASystem.Infrastructure/Repositories/CRM/VisaDeleClientRepository.cs

@@ -1,5 +1,6 @@
 using OASystem.Domain;
 using OASystem.Domain.Dtos;
+using OASystem.Domain.Dtos.CRM;
 using OASystem.Domain.Dtos.UserDto;
 using OASystem.Domain.Entities.Customer;
 using OASystem.Domain.Entities.Groups;
@@ -39,7 +40,6 @@ namespace OASystem.Infrastructure.Repositories.CRM
                                              Left Join Crm_CustomerCert crmCard1 On crmCard1.SdId = 773 And  cdc.Id = crmCard1.DcId 
                                              Left Join Crm_CustomerCert crmCard2 On crmCard2.SdId = 774 And  cdc.Id = crmCard2.DcId ");
 
-
                 var clientList = await _sqlSugar.SqlQueryable<VisaDeleClientListView>(sql).ToListAsync();
 
                 if (clientList.Count > 0)
@@ -75,7 +75,7 @@ namespace OASystem.Infrastructure.Repositories.CRM
         /// </summary>
         /// <param name="loginDto"></param>
         /// <returns></returns>
-        public async Task<int> CrmClinetAdd(Crm_DeleClient  client)
+        public async Task<int> CrmClinetAdd(Crm_DeleClient client)
         {
             int addId = -1;
 
@@ -85,5 +85,59 @@ namespace OASystem.Infrastructure.Repositories.CRM
             return addId;
         }
 
+
+        /// <summary>
+        /// 根据身份证识别修改ocr添加
+        /// </summary>
+        /// <param name="client"></param>
+        /// <returns></returns>
+        public async Task<bool> SetCrmUpdPassIdCardOCR(SetCrmUpdPassIdCardOCRDto client)
+        {
+
+            string clientSql = string.Format(@"Select * From Crm_DeleClient Where LastName+FirstName='{0}' And Sex = {1}",
+                                             client.ClientName, client.Sex);
+            var clientInfo = await _sqlSugar.SqlQueryable<VisaDeleClientListView>(clientSql).FirstAsync();
+            if(clientInfo == null) return false;
+
+            string cardSql = string.Format(@"Select * From Crm_CustomerCert Where SdId=773 And DcId={0}", clientInfo.Id);
+            var cardInfo = await _sqlSugar.SqlQueryable<CustomerCertView>(cardSql).FirstAsync();
+
+            if (cardInfo == null)  //添加
+            {
+                int cerdAdd = await _sqlSugar.Insertable<Crm_CustomerCert>(new Crm_CustomerCert
+                {
+                    DcId = clientInfo.Id,
+                    SdId = "773",
+                    Country = "中国",
+                    CertNo = client.CerdNo,
+                    TargetCountry = "",
+                    IssueDt = new DateTime(1990, 1, 1),
+                    ExpiryDt = "1990-01-01 00:00:00.000",
+                    CreateUserId = client.UserId,
+                    CreateTime = DateTime.Now,
+                    DeleteUserId = null,
+                    DeleteTime = "1990-01-01 00:00:00.000",
+                    Remark = "",
+                    IsDel = 0
+                }).ExecuteReturnIdentityAsync();
+                if (cerdAdd > 0) return true;
+
+            }
+            else  //修改
+            {
+                var cerdStatus = await _sqlSugar.Updateable<Crm_CustomerCert>()
+                    .Where(c => c.Id == cardInfo.Id)
+                    .SetColumns(c => new Crm_CustomerCert
+                    {
+                        CertNo = cardInfo.CertNo,
+                        IDCardAddress = cardInfo.IDCardAddress
+                    }).ExecuteCommandAsync();
+
+                if (cerdStatus > 0) return true;
+            }
+
+            
+            return false;
+        }
     }
 }

+ 81 - 4
OASystem/OASystem.Infrastructure/Repositories/Groups/DelegationInfoRepository.cs

@@ -3,8 +3,10 @@ using OASystem.Domain.Dtos;
 using OASystem.Domain.Dtos.Groups;
 using OASystem.Domain.Dtos.UserDto;
 using OASystem.Domain.Entities.Groups;
+using OASystem.Domain.ViewModels.CRM;
 using OASystem.Domain.ViewModels.Group;
 using OASystem.Infrastructure.Repositories.System;
+using Org.BouncyCastle.Asn1.Cms;
 using Org.BouncyCastle.Utilities.Collections;
 using Serilog;
 using SqlSugar;
@@ -32,6 +34,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
             this._usersRepository = usersRepository;
         }
 
+        #region 团组
         /// <summary>
         /// 获取接团信息List
         /// </summary>
@@ -157,7 +160,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
 
                 throw;
             }
-            
+
 
             return result;
         }
@@ -262,7 +265,8 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 }  //增加
                 else if (dto.Status == 2)     //修改
                 {
-                    var updateStatus = await UpdateAsync(a => a.Id == dto.Id, a => new Grp_DelegationInfo {
+                    var updateStatus = await UpdateAsync(a => a.Id == dto.Id, a => new Grp_DelegationInfo
+                    {
                         SalesQuoteNo = dto.SalesQuoteNo,
                         TeamLevSId = dto.TeamLevSId,
                         ClientName = dto.ClientName,
@@ -300,7 +304,8 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 }
                 else if (dto.Status == 3)  //删除
                 {
-                    var deleteStatus = await UpdateAsync(a => a.Id == dto.Id, a => new Grp_DelegationInfo { 
+                    var deleteStatus = await UpdateAsync(a => a.Id == dto.Id, a => new Grp_DelegationInfo
+                    {
                         DeleteUserId = dto.UserId,
                         DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                         IsDel = 1
@@ -348,7 +353,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 {
                     result.Msg = "删除失败!";
                 }
-                
+
             }
 
             return result;
@@ -439,5 +444,77 @@ namespace OASystem.Infrastructure.Repositories.Groups
             }
             return result;
         }
+
+        /// <summary>
+        /// 获取接团名称List And 签证国别
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<Result> GetGroupNameAndVisaNationality(GroupNameDto dto)
+        {
+            Result result = new Result() { Code = -2, Msg = "未知错误" };
+
+            if (dto.PortType == 1 || dto.PortType == 2) //web
+            {
+                string sql = string.Format(@"Select Id,TeamName GroupName From  Grp_DelegationInfo 
+                                             Where TeamName != '' And IsDel = 0
+                                             Order By Id Desc");
+                var _groupNameList = await _sqlSugar.SqlQueryable<GroupNameView>(sql).ToListAsync();
+                
+                string visaSql = string.Format(@"Select Id,Name From Sys_SetData Where STid = 41 And IsDel = 0");
+                var _setDataList = await _sqlSugar.SqlQueryable<SetDataInfoView>(visaSql).ToListAsync();
+
+                var data = new {
+                    groupNameData = _groupNameList,
+                    visaNationalityData = _setDataList
+                };
+
+                result.Data = data;
+                result.Code = 0;
+
+            }
+            return result;
+        }
+
+        #endregion
+
+        #region 团组&签证
+
+        /// <summary>
+        /// 根据团组Id查询客户
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<Result> GetCrmByGroupId(ClientByGroupIdDto dto)
+        {
+            Result result = new Result() { Code = -2 };
+            if (dto.PortType == 1 || dto.PortType == 2)
+            {
+                string sql = string.Format(@"Select gdjc.GrpDCId grpId,cdc.Id,cdc.LastName+cdc.FirstName clientName,cdc.Tel,ccc.CertNo CerdNo 
+                                             From  Grp_DelegationJoinCustomer gdjc
+                                             Inner join Crm_DeleClient cdc On gdjc.CrmDCId =  cdc.Id
+                                             Left Join Crm_CustomerCert ccc On ccc.SdId = 773 And  cdc.Id = ccc.DcId 
+                                             Where gdjc.GrpDCId = {0}", dto.GroupId);
+
+
+                var clientList = await _sqlSugar.SqlQueryable<CrmByGroupIdView>(sql).ToListAsync();
+
+                if (clientList.Count > 0)
+                {
+                    result.Code = 0;
+                    result.Msg = "成功!";
+                    result.Data = clientList;
+                }
+                else
+                {
+                    result.Msg = "暂无数据!";
+                }
+            }
+
+            return result;
+        }
+
+
+        #endregion
     }
 }

+ 19 - 0
OASystem/OASystem.Tencent/OASystem.Tencent.csproj

@@ -0,0 +1,19 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="System.Drawing.Common" Version="7.0.0" />
+    <PackageReference Include="TencentCloudSDK.Common" Version="3.0.734" />
+    <PackageReference Include="TencentCloudSDK.Ocr" Version="3.0.734" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\OASystem.Domain\OASystem.Domain.csproj" />
+  </ItemGroup>
+
+</Project>

+ 92 - 0
OASystem/OASystem.Tencent/TencentOCRTools.cs

@@ -0,0 +1,92 @@
+using TencentCloud.Common;
+using TencentCloud.Ocr.V20181119.Models;
+using TencentCloud.Ocr.V20181119;
+using OASystem.Domain;
+using OASystem.TencentOCR;
+using OASystem.Domain.Dtos.Tencent;
+using System.Drawing;
+
+namespace OASystem.Tencent
+{
+    /// <summary>
+    /// 腾讯OCR Tools
+    /// </summary>
+    public class TencentOCRTool
+    {
+        /// <summary>
+        /// 初始化 腾讯云账户密钥对 SecretId,SecretKey
+        /// </summary>
+        Credential cred = new Credential
+        {
+            SecretId = "AKIDoQUHLBELagatzoScfdMpMddMnz8apqIc",
+            SecretKey = "hKiGbhkX5NWWXu3zDWwAATVK3e5sWuBB"
+        };
+
+        /// <summary>
+        /// ocr识别
+        /// </summary>
+        /// <param name="picBase64">图片base64</param>
+        /// <param name="ocrEnum">转换类型</param>
+        /// <param name="data">请求数据源</param>
+        /// <returns></returns>
+        public Result GetOCR(TencentOCREnum ocrEnum, object data)
+        {
+            Result result = new Result { Code = -1, Msg = "未知错误", Data = null };
+            OcrClient client = new OcrClient(cred, "ap-guangzhou");
+
+            try
+            {
+                switch (ocrEnum)
+                {
+                    case 0: //身份证识别
+                        IDCardOCRDto iDCardDto = (IDCardOCRDto)data;
+                        IDCardOCRRequest req = new IDCardOCRRequest();
+
+                        if (iDCardDto.CardSide == 0) req.CardSide = "FORNT";
+                        else if (iDCardDto.CardSide == 0) req.CardSide = "BACK";
+
+                        req.ImageBase64 = iDCardDto.picBase64;
+                        IDCardOCRResponse resp = client.IDCardOCRSync(req);
+                        result.Data = resp;
+                        break;
+
+                }
+
+                result.Code = 0;
+                result.Msg = "成功";
+                return result;
+            }
+            catch (Exception ex)
+            {
+                result.Msg = "类型:" + ex.Message;
+                return result;
+            }
+        }
+
+
+        /// <summary>
+        /// 图片转Base64
+        /// </summary>
+        /// <param name="ImageFileName">图片的完整路径</param>
+        /// <returns></returns>
+        public string ImgToBase64(string ImageFileName)
+        {
+            try
+            {
+                Bitmap bmp = new Bitmap(ImageFileName);
+                MemoryStream ms = new MemoryStream();
+                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
+                byte[] arr = new byte[ms.Length];
+                ms.Position = 0;
+                ms.Read(arr, 0, (int)ms.Length);
+                ms.Close();
+                return Convert.ToBase64String(arr);
+            }
+            catch (Exception e)
+            {
+                return e.Message.ToString();
+            }
+        }
+
+    }
+}