/// <summary> /// 自动积分并微信推送接口 /// </summary> /// <param name="webPosArg"></param> /// <returns></returns> private async static Task <Result> WebPosForPoint(WebPosArg webPosArg) { int amount = new Random(((unchecked ((int)DateTime.Now.Millisecond + (int)DateTime.Now.Ticks)))).Next(10, 2000); string testString = $@"<cmd type=""SALES"" appCode=""POS""> <shared offline=""true""> <companyID>{webPosArg.companyID}</companyID> <orgID>{webPosArg.orgID}</orgID> <storeID>{webPosArg.storeID}</storeID> <cashierID>{webPosArg.cashierID}</cashierID> </shared> <sales discountPercentage=""{webPosArg.discountPercentage}"" cardID=""{webPosArg.cardID}"" txnDateTime=""{webPosArg.txnDateTime}"" receiptNo=""12L102N10120180321uytu7t876896{amount}"" actualAmount=""{amount}"" payableAmount=""{amount}"" verificationCode="""" /> </cmd>"; WebPosTest.WebPOSSoapClient ws = new WebPosTest.WebPOSSoapClient(WebPosTest.WebPOSSoapClient.EndpointConfiguration.WebPOSSoap); WebPosTest.WebPOSCredentials mwc = new WebPosTest.WebPOSCredentials(); mwc.Username = ConfigurationUtil.GetSection("ObjectConfig:WebPosService:UserName"); mwc.Password = ws.GetEncryptedCharAsync(ConfigurationUtil.GetSection("ObjectConfig:WebPosService:PassWord")).Result; try { var cmdResult = await ws.CmdAsync(mwc, testString); if (!string.IsNullOrWhiteSpace(cmdResult.CmdResult) && cmdResult.CmdResult.Contains("hasError=\"false\"")) { return(new Result(true, "OCR识别成功,完成自动积分且进行微信推送", null)); } return(new Result(false, $"OCR验证通过,{cmdResult.CmdResult}", null)); } catch (Exception ex) { Log.Error("WebPos接口", ex); return(new Result(false, $"OCR验证通过,{ex.Message}", null)); } }
public static async Task <Result> ReceiptOCR(string Id) { try { var ApplyPointModel = dal.GetModel <ApplyPoint>($"and ApplyPointID='{Id}'"); //根据Id 获取 积分申请 if (ApplyPointModel == null) { return(new Result(false, "积分申请表查无数据", null)); } var ReceiptOCRResult = await Task.Run(async() => { #region 调用BAIDUOCR API,并将识别数据添加至原始数据表 var Image = (Bitmap)Bitmap.FromFile(ApplyPointModel.ReceiptPhoto); var base64 = Commom.ImgToBase64String(Image); //拿到积分申请中的图片转为Base64 base64 = System.Web.HttpUtility.UrlEncode(base64); //byte[] bytes = Convert.FromBase64String(base64); //var result = Commom.GeneralOCRBasic(s => s.Receipt(bytes)); //暂时为票据服务识别 //根据MallOCRRule配置的OCR相关配置进行OCR请求,暂不用SDK,缓存处理 MallOCRRule MallOCRRule = CacheHandle <MallOCRRule>($"MallOCRRule{Id}", 1, $" and MallID='{ApplyPointModel.MallID}'"); var result = HttpHelper.HttpPost(string.Format(MallOCRRule.OCRServerURL, MallOCRRule.OCRServerToken), $"image={base64}"); if (result.Contains("error_msg")) { var OCRErrorModel = JsonConvert.DeserializeObject <OCRErrorResult>(result); return(new Result(false, OCRErrorModel.error_msg, null)); } var RecongnizeModel = new ApplyPictureRecongnize { id = Guid.NewGuid(), applyid = Guid.Parse(Id), Lineno = 0, LineContent = result }; var AddResult = DbContext.Add(RecongnizeModel); //识别内容添加到识别原始表 #endregion if (AddResult == 0) { ApplyPointModel.RecongizeStatus = 1; var UpadateResult = DbContext.Update(ApplyPointModel); //已解析原始数据 if (UpadateResult) { //根据商铺规则明细取到OCR结果 var ApplyOCRResult = GetApplyPointOCRResult(Guid.Parse(Id), ApplyPointModel.StoreID, result); if (ApplyOCRResult.Success) { ApplyPointOCRResult OCRResult = (ApplyPointOCRResult)ApplyOCRResult.Data; //匹配商铺规则 var VerifyResult = VerifyOCRResult(OCRResult); if (VerifyResult.Success) { //更新积分申请表 ApplyPointModel.RecongizeStatus = 2; //成功匹配 ApplyPointModel.AuditDate = DateTime.Now; //修改审批日期 if (DbContext.Update(ApplyPointModel)) { Store StoreModel = CacheHandle <Store>($"Store{ApplyPointModel.StoreID}", 1, $" and StoreId = '{ApplyPointModel.StoreID}'"); OrgInfo orgInfo = CacheHandle <OrgInfo>($"OrgInfo{StoreModel.OrgID}", 24, $" and OrgId = '{StoreModel.OrgID}'"); Company company = CacheHandle <Company>($"Company{StoreModel.CompanyID}", 24, $" and CompanyId = '{StoreModel.CompanyID}'"); Card card = dal.GetModel <Card>($" and CardID = '{ApplyPointModel.CardID}'"); //自动积分 var webPosArg = new WebPosArg { cardID = card.CardCode, companyID = company.CompanyCode, orgID = orgInfo.OrgCode, storeID = StoreModel.StoreCode, cashierID = "crm", discountPercentage = 0, receiptNo = ApplyPointModel.ReceiptNo, txnDateTime = ApplyPointModel.TransDate }; var webPosResult = await WebPosForPoint(webPosArg); return(webPosResult); } else { return(new Result(false, "OCR信息校验成功后修改积分申请表失败", null)); } } else { return(new Result(false, VerifyResult.Message, null)); } } else { ApplyPointModel.RecongizeStatus = 3; //成功匹配 DbContext.Update(ApplyPointModel); return(new Result(false, ApplyOCRResult.Message, null)); } } else { return(new Result(false, "修改积分申请表失败", null)); } } else { return(new Result(false, "添加到原始表失败", null)); } }); return(ReceiptOCRResult); } catch (Exception ex) { Log.Error("ReceiptOCR", ex); return(new Result(false, ex.Message, null)); } }
/// <summary> /// 创建积分申请单,校验信息成功并推送 /// 若原先存在积分申请单,失败的原因:校验失败 所有应该重新赋值 /// </summary> /// <param name="applyPointRequest"></param> /// <returns></returns> public static Result CreateApplyPoint(ApplyPointRequest applyPointRequest) { try { #region 图片上传 ImageResponse ImageResponse = null; try { var FileUploadResult = ImageUpload(Commom.FileUploadUrl, applyPointRequest.receiptOCR.Base64); if (!FileUploadResult.Success) { return(FileUploadResult); } ImageResponse = JsonConvert.DeserializeObject <ImageResponse>(FileUploadResult.Data.ToString()); } catch (Exception ex) { Log.Error("CreateApplyPoint-FileUpload", ex); return(new Result(false, ex.Message, null)); } #endregion Store StoreModel = CacheHandle <Store>( Key: $"Store{applyPointRequest.receiptOCR.StoreId}", Hour: double.Parse(ConfigurationUtil.GetSection("ObjectConfig:CacheExpiration:Store")), sqlWhere: $" and StoreId = '{applyPointRequest.receiptOCR.StoreId}'"); StoreOCR StoreOCRRule = CacheHandle <StoreOCR>( Key: $"StoreOCR{applyPointRequest.receiptOCR.StoreId}", Hour: double.Parse(ConfigurationUtil.GetSection("ObjectConfig:CacheExpiration:StoreOCR")), sqlWhere: $"and StoreId = '{applyPointRequest.receiptOCR.StoreId}'"); var ApplyPoint = dal.GetModel <ApplyPoint>($" and ReceiptNo='{applyPointRequest.receiptOCR.ReceiptNo}' and StoreID='{applyPointRequest.receiptOCR.StoreId}'"); ApplyPictureRecongnize applyPictureRecongnize = dal.GetModel <ApplyPictureRecongnize>($" and id='{applyPointRequest.receiptOCR.RecongnizelId}'"); var IsHas = false; // 是否原先存在积分申请单 默认没有 更新识别原始表 if (ApplyPoint == null) //判断该小票号 是否存在积分申请单 不存在则添加原始积分申请单 (已解析原始数据,校验失败) { var ApplyPointId = Guid.NewGuid(); ApplyPoint = new ApplyPoint { ApplyPointID = ApplyPointId, MallID = StoreModel.MallID, StoreID = applyPointRequest.receiptOCR.StoreId, CardID = Guid.Parse(applyPointRequest.cardId), ReceiptNo = applyPointRequest.receiptOCR.ReceiptNo, TransDate = applyPointRequest.receiptOCR.TransDatetime, TransAmt = applyPointRequest.receiptOCR.TranAmount, VerifyStatus = StoreOCRRule.needVerify == 0 ? 1 : 0, ReceiptPhoto = ImageResponse.fileURL }; applyPictureRecongnize.applyid = ApplyPointId; DbContext.Update <ApplyPictureRecongnize>(applyPictureRecongnize); } else { IsHas = true; ApplyPoint.MallID = StoreModel.MallID; ApplyPoint.StoreID = applyPointRequest.receiptOCR.StoreId; ApplyPoint.CardID = Guid.Parse(applyPointRequest.cardId); ApplyPoint.ReceiptNo = applyPointRequest.receiptOCR.ReceiptNo; ApplyPoint.TransDate = applyPointRequest.receiptOCR.TransDatetime; ApplyPoint.TransAmt = applyPointRequest.receiptOCR.TranAmount; ApplyPoint.VerifyStatus = StoreOCRRule.needVerify == 0 ? 1 : 0; } var VerifyRecognitionResult = VerifyRecognition(applyPointRequest.receiptOCR); //校验结果 ApplyPoint.AuditDate = DateTime.Now; if (VerifyRecognitionResult.Success) //校验成功 { ApplyPoint.RecongizeStatus = 2; ApplyPoint.VerifyStatus = 1; } else//校验失败 修改值 { ApplyPoint.RecongizeStatus = 3; ApplyPoint.VerifyStatus = 0; ApplyPoint.Status = 0; if (IsHas) { DbContext.Update <ApplyPoint>(ApplyPoint); } else { DbContext.Add <ApplyPoint>(ApplyPoint); } return(VerifyRecognitionResult); } var LastRes = true;//添加是否成功 if (IsHas) { if (!DbContext.Update <ApplyPoint>(ApplyPoint)) { LastRes = false; } } else { if (DbContext.Add <ApplyPoint>(ApplyPoint) != 0) { LastRes = false; } } if (LastRes) { List <Company> companyList = CacheHandle <List <Company> >( Key: "Company", Hour: double.Parse(ConfigurationUtil.GetSection("ObjectConfig:CacheExpiration:Company")), sqlWhere: ""); List <OrgInfo> orgList = CacheHandle <List <OrgInfo> >( Key: "OrgInfo", Hour: double.Parse(ConfigurationUtil.GetSection("ObjectConfig:CacheExpiration:OrgInfo")), sqlWhere: ""); //自动积分 推送 var arg = new WebPosArg { companyID = companyList.Where(s => s.CompanyId == StoreModel.CompanyID).FirstOrDefault()?.CompanyCode ?? "", storeID = StoreModel.StoreCode, cardID = dal.GetModel <Card>($" and CardID='{applyPointRequest.cardId}'")?.CardCode ?? "", cashierID = "CrmApplyPoint", discountPercentage = 0, orgID = orgList.Where(s => s.OrgId == StoreModel.OrgID).FirstOrDefault()?.OrgCode ?? "", receiptNo = applyPointRequest.receiptOCR.ReceiptNo, txnDateTime = applyPointRequest.receiptOCR.TransDatetime }; var argStr = JsonConvert.SerializeObject(arg); ProducerMQ(argStr); return(new Result(true, "校验成功,已申请积分!", null)); } return(new Result(false, "校验成功,对ApplyPoint操作失败!", null)); } catch (Exception ex) { Log.Error("CreateApplyPoint", ex); return(new Result(false, ex.Message, null)); } }