/// <summary>
        /// 获取人脸坐标(68个点)
        /// </summary>
        /// <param name="files"></param>
        /// <returns></returns>
        public ActionResult GetFaceLink(string image)
        {
            //var lines = await GetLinesAsync(new List<IFormFile>() { file });
            //if (lines.Count <= 0)
            //{
            //    return Ok(null);
            //}
            (Bitmap, string)bitmap = (null, null);
            // 获取图片文件
            //bitmap = model.image_type.ToUpper() == "BASE64" ? FileCommon.Base64ToBitmap(model.image) : FileCommon.UrlToBitmap(model.image);
            bitmap = FileCommon.UrlToBitmap(image);
            var date = FaceLandmarkDetectionCompute.GetLandmark(bitmap.Item1);

            //var hh= FaceLandmarkDetectionCompute.Getlines(date);
            return(Ok(date));
        }
        /// <summary>
        /// 获取人脸坐标(单个文件)
        /// </summary>
        /// <param name="files"></param>
        /// <returns></returns>
        public async Task <ActionResult> GetFaceLocation(FaceLocationsViewModel model)
        {
            RequestFaceModel request = new RequestFaceModel()
            {
                Status   = 500,
                Message  = null,
                FaceList = null
            };

            #region 基本验证
            // 模型验证
            if (!ModelState.IsValid)
            {
                request.Message = ModelState.Where(e => e.Value.Errors.Count > 0).FirstOrDefault().Value.Errors[0].ErrorMessage;
                request.Status  = (int)RequestEnum.必要参数未传入;
                return(Ok(request));
            }

            // 根据 secretkey 获取set
            var userFaceSet = await Service_user_face_set.GetUser_Face_Set_By_Secret_key_Async(model.secret_id);

            if (userFaceSet == null)
            {
                // 您未开通此项目
                request.Enum = RequestEnum.没有接口权限;
                return(Ok(request));
            }


            // 签名判断
            var dic = ModleToDictionary.GetProperties(model);
            var key = userFaceSet.secret_key;
            dic.Remove("sign");


            var sign = Signature.GetSign(dic, key);
            if (sign != model.sign)
            {
                // 签名错误
                request.Enum = RequestEnum.签名错误;
                return(Ok(request));
            }
            #endregion



            #region 余额逻辑判断

            // 根据 userFaceSet.user_id 获取用户信息
            var user = await Service_user.GetUser_By_User_id_Async(userFaceSet.user_id);

            // 根据user_id 先查预付款,未查询到则扣费使用
            var prepayment = await Service_user_face_detect_prepayment.GetUser_Face_Detect_Prepayment_By_User_id_Asynv(user.id);

            user_face_detect_price derectPrice = null;
            if (prepayment == null || prepayment.number <= 0)
            {
                prepayment  = null;
                derectPrice = await Service_user_face_detect_price.GetUser_Face_Detect_Price_By_User_idAsync(user.id);

                if (derectPrice == null)
                {
                    // 用户没有预付费次数
                    request.Enum = RequestEnum.没有预付费次数未开通余额付款;
                }
                else
                {
                    // 查询用户余额  derectPrice.price>余额
                    if (user.use_amount < derectPrice.price)
                    {
                        // 预付费次数为0,余额不足
                        request.Enum = RequestEnum.预付费次数为0且余额不足;
                    }
                }
            }


            // 用户余额验证
            if (!string.IsNullOrEmpty(request.Message))
            {
                return(Ok(request));
            }
            #endregion



            #region 获取图片
            // 变量初始化
            var face_token = string.Empty;
            (Bitmap, string)bitmap = (null, null);

            if (model.image_type.ToUpper() == "FACE_TOKEN")
            {
                if (model.image.Length > 50)
                {
                    request.Enum = RequestEnum.face_token格式错误;
                    return(Ok(request));
                }
                var detect = await Service_user_face_detect_log.GetUser_Face_Detect_Log_By_Face_token(model.image);

                if (detect == null)
                {
                    request.Enum = RequestEnum.face_token不存在;
                    return(Ok(request));
                }
                bitmap.Item2 = detect.image;

                var obj = JsonConvert.DeserializeObject <dynamic>(detect.api_respone);
                request.FaceList = obj.face_list;
                request.FaceNum  = obj.face_num;
                face_token       = model.image;
            }
            else
            {
                // 获取图片文件
                bitmap = model.image_type.ToUpper() == "BASE64" ? FileCommon.Base64ToBitmap(model.image) : FileCommon.UrlToBitmap(model.image);
                if (bitmap.Item1 == null && !string.IsNullOrEmpty(bitmap.Item2))
                {
                    if (model.image_type.ToUpper() == "BASE64")
                    {
                        request.Enum = RequestEnum.Base64图片格式错误;
                    }
                    else
                    {
                        request.Enum = RequestEnum.从图片的url下载图片失败;
                    }
                    return(Ok(request));
                }
            }
            #endregion



            #region 图片以及数据处理
            // 不是 FACE_TOKEN 的处理方式
            if (model.image_type.ToUpper() != "FACE_TOKEN")
            {
                // 查找是否有相同的图片
                face_token = model.image_type.ToUpper() == "BASE64" ? EncryptProvider.Md5(model.image) : EncryptProvider.Md5(FileCommon.BitmapToBase64(bitmap.Item1));
                var detect_Log = await Service_user_face_detect_log.GetUser_Face_Detect_Log_By_Face_token(face_token);

                if (detect_Log != null)
                {
                    bitmap.Item2 = detect_Log.image;
                }
                else
                {
                    try
                    {
                        // 存入本地
                        bitmap.Item2 = FileCommon.SaveBitmap(bitmap.Item1, bitmap.Item2);
                    }
                    catch (Exception ex)
                    {
                        LogHelperNLog.Error(ex);
                        request.Enum = RequestEnum.数据存储处理失败;
                        return(Ok(request));
                    }
                }
                // 获取人脸数据
                //var faceDate = FaceDetectionCompute.GetRectangle(bitmap.Item1);
                DlibDotNet.Rectangle[] faceDate = new DlibDotNet.Rectangle[0];
                try
                {
                    // 截取人像,面积排序
                    faceDate = FaceDetectionCompute.GetRectangle(bitmap.Item1).OrderByDescending(d => d.Area).Take(model.max_face_num).ToArray();
                    //faceDate = FaceDetectionCompute.GetResult(bitmap.Item2);
                }
                catch (Exception ex)
                {
                    LogHelperNLog.Error(ex, "FaceDetectionCompute.GetRectangles:人脸获取坐标出错");
                    request.Enum = RequestEnum.无法解析人脸;
                    return(Ok(request));
                }

                // 人脸关键点识别
                var landmark68 = FaceLandmarkDetectionCompute.DetsTolandmark68(bitmap.Item1, faceDate);

                if (model.face_field.ToUpper().Contains("LANDMARK"))
                {
                    request.LandmarkList = landmark68.Select(x => x.Item1);
                }

                // 人脸旋转角度
                var angles = FaceDetectionCompute.GetRotationAngle(landmark68.Select(x => x.Item2));

                // 人脸之态预测
                var gesture = FaceDetectionCompute.GetFaceGesture(landmark68.Select(x => x.Item2), bitmap.Item1.Width, bitmap.Item1.Height);
                if (faceDate != null)
                {
                    // 返回数据格式处理
                    var json = JsonConvert.SerializeObject(faceDate);
                    var data = JsonConvert.DeserializeObject <List <FaceLocationsOutMdole> >(json);
                    //data = data.OrderByDescending(d => d.Area).Take(model.max_face_num).ToList();
                    data.ForEach(x => { x.FaceToken = face_token; });
                    for (int i = 0; i < data.Count; i++)
                    {
                        data[i].FaceToken = face_token;
                        data[i].Angle     = angles[i];
                        data[i].Gesture   = new Gesture()
                        {
                            Pitch = gesture[i].Item1,
                            Yaw   = gesture[i].Item2,
                            Roll  = gesture[i].Item3
                        };
                    }
                    request.FaceList = data;
                    request.FaceNum  = data.Count();
                }
            }
            #endregion

            request.Enum = RequestEnum.Succeed;

            #region 日志&&扣费
            try
            {
                // 预付费/扣费 log
                // 时间戳
                DateTime dateTime = DateTime.Now;
                user_face_detect_prepayment_detail prepayment_Detail = null;
                user_amount_detail amount_Detail = null;
                if (prepayment != null)
                {
                    prepayment_Detail = new user_face_detect_prepayment_detail()
                    {
                        user_id       = user.id,
                        change_number = -1,
                        now_number    = prepayment.number - 1,
                        info          = string.Format("应用ID:{0},图片名称:{1}", model.secret_id, bitmap.Item2),
                        created_at    = dateTime,
                        updated_at    = dateTime
                    };
                }
                else
                {
                    amount_Detail = new user_amount_detail()
                    {
                        user_id       = user.id,
                        change_amount = -derectPrice.price,
                        now_amount    = user.use_amount - derectPrice.price,
                        info          = string.Format("应用ID:{0},图片名称:{1},费用:{2}", model.secret_id, bitmap.Item2, derectPrice.price),
                        created_at    = dateTime,
                        updated_at    = dateTime,
                        type          = 0
                    };
                }
                // 操作信息
                user_face_detect_log face_Detect_Log = new user_face_detect_log()
                {
                    user_id               = user.id,
                    secret_id             = model.secret_id,
                    face_token            = face_token,
                    image                 = bitmap.Item2,
                    image_type            = model.image_type,
                    face_field            = model.face_field,
                    max_face_num          = model.max_face_num,
                    face_type             = model.face_type,
                    is_deductions_success = true,
                    api_respone           = JsonConvert.SerializeObject(request, UnderlineSplitContractResolver.GetSettings()),
                    timestamp             = Timelong.GetUnixDateTime(model.timestamp),
                    sign       = sign,
                    created_at = dateTime,
                    updated_at = dateTime,
                    is_search  = 1,
                };



                // 修改余额,存库,日志
                using (var tra = SqlDapperHelper.GetOpenConnection().BeginTransaction())
                {
                    if (prepayment != null)
                    {
                        await SqlDapperHelper.ExecuteInsertAsync(prepayment_Detail, tra);

                        await Service_user_face_detect_prepayment.MinusUsernumber_By_User_id(prepayment_Detail, tra);
                    }
                    else
                    {
                        await SqlDapperHelper.ExecuteInsertAsync(amount_Detail, tra);

                        await Service_user.MinusUserAmount_By_User_id(amount_Detail);
                    }
                    await SqlDapperHelper.ExecuteInsertAsync(face_Detect_Log, tra);

                    tra.Commit();
                }
            }
            catch (Exception ex)
            {
                LogHelperNLog.Error(ex, "操作日志添加失败");
                request.Enum = RequestEnum.操作日志添加失败;
                return(Ok(request));
            }
            #endregion


            return(Ok(request));
        }