实习日志6

1.发现base64编码对同一张图片编码好像不会改变

用word文档的查重,似乎是一模一样的

于是去看了一下CSDN 

1.1.base64编码原理

编码原理

使用 Base64 进行编码,大致可以分为 4 步:

  1. 将原始数据每三个字节作为一组,一共是 24 个 bit
  2. 将 24 个 bit 分为四组,每组 6 个 bit
  3. 在每组前面加两个 00,扩展成 32 个 bit,即四个字节
  4. 根据下标,得到扩展后每个字节的对应符号

1.2.更改代码逻辑

所以可以用base64编码来判断文件是否重复

2.更改数据库,添加字段

2.1.改了下invoice表

2.2.改了一下image表

3.美化界面

3.1.识别界面

3.2.文件上传界面

3.3.数据预览界面()

4.从源码找出了预览图片的请求

4.1.F12的源代码中找出图片预览的代码

4.2.从源代码打开访问链接,查看代码路径

hocalhost:44203/Forguncy/Upload/93ec3707-18f2-4803-b415-66106d47e875_blackpig.png?imageSize=0

 4.3.解析出访问路径的代码

var page = Forguncy.Page;
var imageUrlCell = page.getCell("image_url");
var codeCell = page.getCell("img_code");var img = `http://${window.location.host}/Forguncy/Upload/`+codeCell.getValue();
imageUrlCell.setValue(img);

4.4.将url嵌入页面

5.再次修改代码逻辑

5.1.识别

// 获取当前页面上名称为account的单元格
// 获取当前页面
var page = Forguncy.Page;
var access_token = page.getCell("access_token").getValue();var invoiceTypeChooseCell = page.getCell("invoice_type_choose");var invoiceCodeCell = page.getCell("invoice_code");
var invoiceNumCell = page.getCell("invoice_num");
var invoiceDateCell = page.getCell("invoice_date");
var invoiceTypeCell = page.getCell("invoice_type");
var checkCodeCell = page.getCell("check_code");
var totalAmountCell = page.getCell("total_amount");
var invoiceImgIdCell = page.getCell("invoice_img_id");var imgIdCell = page.getCell("img_id");
var imageBase64Cell = page.getCell("image_base64");var identifyResultCell = page.getCell("identify_result");var isRepeatCell = page.getCell("is_repeat");
var errorCell = page.getCell("error");var imageBase64 = imageBase64Cell.getValue();//直接发送百度AI识别请求
InvoiceIdentificationPost(imageBase64);function InvoiceIdentificationPost(imageBase64) {//获取单元格的值var data = {//传入请求地址token: access_token, imageUrl: imageBase64};console.log("***发送百度AI*发票识别*请求***");Forguncy.Helper.post("customapi/fapiaoapi/vatinvoicebyimg", data, function (res) {console.log("res:" + res);let jsonData = JSON.parse(res);if (jsonData.words_result === undefined || jsonData.words_result === null) {alert("发送百度AI发票识别请求失败:" + jsonData.error_msg);errorCell.setValue("发送百度AI发票识别请求失败");return;}jsonData = jsonData.words_result;console.log(jsonData);//获取发票类型let invoiceType = invoiceTypeChooseCell.getValue();console.log("获取发票类型:" + invoiceType);//获取不到,自动识别if (invoiceType === "" || invoiceType === null) {console.log(jsonData.InvoiceType);invoiceType = translateInvoiceType(jsonData.InvoiceType);}console.log("识别发票类型:" + invoiceType);//识别不到if (invoiceType === "" || invoiceType === null) {console.log("无法自动识别出发票类型!!!");alert("无法自动识别出发票类型!!!请手动选择发票类型");errorCell.setValue("无法自动识别出发票类型!!!请手动选择发票类型");return;}invoiceCodeCell.setValue(jsonData.InvoiceCode);invoiceNumCell.setValue(jsonData.InvoiceNum);invoiceDateCell.setValue(convertDateFormat(jsonData.InvoiceDate));invoiceTypeCell.setValue(invoiceType);invoiceImgIdCell.setValue(imgIdCell.getValue());let checkCode = jsonData.CheckCode;/*** 处理分类逻辑*/// 发票金额// 增值税专票、电子专票、区块链电子发票、机动车销售发票、货运专票填写不含税金额// 二手车销售发票填写车价合计// 全电发票(专用发票)、全电发票(普通发票)填写价税合计金额// 其他类型发票可为空if (invoiceType == "elec_invoice_special" || invoiceType == "elec_invoice_normal") {console.log("价税合计金额");//价税合计金额totalAmountCell.setValue(jsonData.AmountInFiguers);} else if (invoiceType == "used_vehicle_invoice") {console.log("车价合计");//车价合计totalAmountCell.setValue(jsonData.AmountInFiguers);} else {console.log("不含税金额");// 不含税金额totalAmountCell.setValue(jsonData.TotalAmount);}//invoice_code:全电发票(专用发票)、全电发票(普通发票)此参数可为空if (invoiceType != "elec_invoice_special" && invoiceType != "elec_invoice_normal") {//其他的类型不能为空if (jsonData.InvoiceCode == "" || jsonData.InvoiceCode == null) {alert("发票代码不可为空!!!请核对发票类型");errorCell.setValue("发票代码不可为空!!!请核对发票类型");return;}}//校验码。填写发票校验码后6位。//增值税电子专票、普票、电子普票、卷票、//区块链电子发票、通行费增值税电子普通发票此参数必填;if (invoiceType == "elec_special_vat_invoice" || invoiceType == "normal_invoice" || invoiceType == "elec_normal_invoice" || invoiceType == "roll_normal_invoice" || invoiceType == "blockchain_invoice" || invoiceType == "toll_elec_normal_invoice") {console.log("需要校验码");if (checkCode != "" && checkCode != null) {checkCode = getLastSixDigits(checkCode);console.log(checkCode);checkCodeCell.setValue(checkCode);} else {alert("校验码不可为空!!!请核对发票类型");errorCell.setValue("校验码不可为空!!!请核对发票类型");return;}} else {console.log("不需要校验码");checkCodeCell.setValue(checkCode);}identifyResultCell.setValue(JSON.stringify(jsonData));//后续操作//判断发票是否重复,并修改数据库if (errorCell.getValue() === null) {editDataBase();} else {//重置errorCellerrorCell.setValue(null);}});
}//日期格式转换
function convertDateFormat(inputDateString) {// 使用正则表达式提取数字var numbersArray = inputDateString.match(/\d+/g);// 将数字字符串拼接在一起var outputDateString = numbersArray.join("");return outputDateString;
}//发票类型自动识别转换
function translateInvoiceType(chineseInvoiceType) {var translationMap = {//增值税专票、电子专票、区块链电子发票、机动车销售发票、货运专票填写不含税金额"电子专用发票": "elec_special_vat_invoice","普通发票(电子)": "elec_normal_invoice","电子普通发票": "elec_normal_invoice","普通发票(卷式)": "roll_normal_invoice","卷式普通发票": "roll_normal_invoice","通行费增值税电子普通发票": "toll_elec_normal_invoice","区块链电子发票": "blockchain_invoice", // 全电发票(专用发票)、全电发票(普通发票)填写价税合计金额"全电发票(专用发票)": "elec_invoice_special","电子发票(专用发票)": "elec_invoice_special","全电发票(普通发票)": "elec_invoice_normal","电子发票(普通发票)": "elec_invoice_normal","货运运输业增值税专用发票": "special_freight_transport_invoice","机动车销售发票": "motor_vehicle_invoice", //二手车销售发票填写车价合计"二手车销售发票": "used_vehicle_invoice","普通发票": "normal_invoice","专用发票": "special_vat_invoice",};// 检查输入的中文发票类型是否在映射中,如果是则返回对应的英文翻译,否则返回原始值for (var chineseType in translationMap) {if (chineseInvoiceType.includes(chineseType)) {return translationMap[chineseType];}}// 如果未找到匹配的中文发票类型,则返回空值return "";
}//获取发票校验码后六位数
function getLastSixDigits(str) {// 通过正则表达式匹配字符串中的数字const matches = str.match(/\d+/g);// 如果有匹配到数字if (matches) {// 获取最后一个匹配到的数字const lastNumber = matches[matches.length - 1];// 如果数字的长度大于等于六位,则返回后六位if (lastNumber.length >= 6) {return lastNumber.slice(-6);} else {// 如果数字的长度小于六位,则直接返回该数字return lastNumber;}} else {// 如果没有匹配到数字,则返回空字符串或其他适当的值return "";}
}function editDataBase() {Forguncy.getTableData("invoice", {"invoice_num": page.getCell("invoice_num").getValue()}, function (data) {console.log("发票重复识别");alert("识别到重复发票,请核对发票信息");errorCell.setValue("校验码不可为空!!!请核对发票类型");isRepeatCell.setValue("重复");Forguncy.modifyTablesData({image: {editRows: [{primaryKey: {ID: imgIdCell.getValue()}, values: {is_identify: "重复识别",}}], deleteRows: [{ID: data.img_id}],}, invoice: {// 修改操作editRows: [{primaryKey: {invoice_num: invoiceNumCell.getValue(),}, values: {invoice_code: invoiceCodeCell.getValue(),invoice_date: invoiceDateCell.getValue(),invoice_type: invoiceTypeCell.getValue(),check_code: checkCodeCell.getValue(),total_amount: totalAmountCell.getValue(),is_repeat: isRepeatCell.getValue(),img_id: imgIdCell.getValue()}}]},});}, function (errorMessage) {isRepeatCell.setValue("未重复");Forguncy.modifyTablesData({invoice: {// 添加操作addRows: [{invoice_code: invoiceCodeCell.getValue(),invoice_num: invoiceNumCell.getValue(),invoice_date: invoiceDateCell.getValue(),invoice_type: invoiceTypeCell.getValue(),check_code: checkCodeCell.getValue(),total_amount: totalAmountCell.getValue(),is_repeat: isRepeatCell.getValue(),img_id: imgIdCell.getValue()}]}, image: {editRows: [{primaryKey: {ID: imgIdCell.getValue()}, values: {is_identify: "已识别",}},]}});});
}

5.2验真

// 获取当前页面上名称为account的单元格
// 获取当前页面
var page = Forguncy.Page;
var access_token = page.getCell("access_token").getValue();
var invoiceCode = page.getCell("invoice_code").getValue();
var invoiceNum = page.getCell("invoice_num").getValue();
var invoiceDate = page.getCell("invoice_date").getValue();
var invoiceType = page.getCell("invoice_type").getValue();
var checkCode = page.getCell("check_code").getValue();
var totalAmount = page.getCell("total_amount").getValue();var imgIdCell = page.getCell("invoice_img_id");
var errorCell = page.getCell("error");var verifyResultCell = page.getCell("verify_result");
//重复条件
var isRepeatCell = page.getCell("is_repeat");
var isVerifyCell = page.getCell("is_verify");//获取单元格的值
var data = {//传入请求地址token: access_token,invoice_code: invoiceCode,invoice_num: invoiceNum,invoice_date: invoiceDate,invoice_type: invoiceType,check_code: checkCode,total_amount: totalAmount,
};console.log("************发票信息显示****************");
console.log("代码:" + invoiceCode);
console.log("*号码*:" + invoiceNum);
console.log("日期:" + invoiceDate);
console.log("类型:" + invoiceType);
console.log("校验码:" + checkCode);
console.log("金额:" + totalAmount);
console.log("**************************************");//初始化
isVerifyCell.setValue("不需要");
/*** 判断是否满足验真条件,减少发送请求次数,节约成本*/
if (isRepeatCell.getValue() === null) {//1.判断没有进行发票识别操作alert("请先识别发票");console.log("请先识别发票");} else if (invoiceNum === "" || invoiceType === "" || invoiceDate === "" || invoiceNum === null || invoiceType === null || invoiceDate === null) {//2.判断必须值为空alert("识别失败,无法验真");console.log("识别失败,无法验真");} else if (isRepeatCell.getValue() === "重复") {//3.重复识别,先检索数据库console.log("重复识别,检索数据库中字段");// 检索数据库中invoice_num值对应的对象Forguncy.getTableData("invoice", {"invoice_num": page.getCell("invoice_num").getValue()},function (data) {// 检索到重复识别if (data.result === null) {console.log("发票未验真");isVerifyCell.setValue("需要");InvoiceVerificationPost();}else {if (data.invoice_code !== invoiceCode && invoiceCode !== "") {console.log("发票代码不一致,需要重新验真");isVerifyCell.setValue("需要");}if (data.invoice_date !== invoiceDate) {console.log("发票日期不一致,需要重新验真");isVerifyCell.setValue("需要");}if (data.invoice_type !== invoiceType) {console.log("发票类型不一致,需要重新验真");isVerifyCell.setValue("需要");}if (data.check_code !== checkCode && checkCode !== "") {console.log("校验码不一致,需要重新验真");isVerifyCell.setValue("需要");}if (data.total_amount !== totalAmount && totalAmount !== "") {console.log("发票金额不一致,需要重新验真");isVerifyCell.setValue("需要");}console.log(isVerifyCell.getValue());if (isVerifyCell.getValue() === "不需要") {console.log("发票一致,直接输出验真结果");console.log(data.result);verifyResultCell.setValue(data.result);}}if (isVerifyCell.getValue() === "需要") {InvoiceVerificationPost();//验真后置空isRepeatCell.setValue("");isVerifyCell.setValue("");}},function (errorMessage) {//数据库检索到invoice_num才能进入程序,按逻辑一定能检索到数据库中对象,这个模块无法执行到alert("啊?你黑入程序了??? Error:" + errorMessage);return false;});
}if (isRepeatCell.getValue() === "未重复") {InvoiceVerificationPost();//验真后置空isRepeatCell.setValue("");isVerifyCell.setValue("");
}function InvoiceVerificationPost(){/*** 4.百度AI验真请求,一次两毛*/console.log("发送百度AI验真请求");Forguncy.Helper.post("customapi/fapiaoapi/vatinvoiceverification", data, function (res) {console.log("res:" + res);let jsonData = JSON.parse(res);console.log(jsonData);verifyResultCell.setValue(jsonData.VerifyMessage);Forguncy.modifyTablesData({invoice: {editRows: [{primaryKey:{invoice_num: invoiceNum},values: {result: jsonData.VerifyMessage,}},]},image: {editRows: [{primaryKey:{ID: imgIdCell.getValue()},values: {is_identify: "已验真",}},]}});});
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python解释器的启动方式

Python解释器的启动方式 Python 解释器是一个运行 Python 代码的程序。它读取并执行写成 Python 语言的指令。由于 Python 是一种解释型语言,所以它的代码不需要编译成机器语言就可以直接运行。这就是为什么我们需要一个解释器来逐行读取 Python 代码,将…

QT5.14.2开发的Mysql8.0系统安装部署过程

最近在Windows 11 64位系统下使用QT5.14.2开发了套系统、使用了MYSQL8.0数据库,项目使用mingw-64编译器进行编译,编译完成后使用windeployqt进行发布,并制作安装包,拷贝到工控机Windows10 64位系统上进行安装运行。本文记录下安装…

RedisInsight详细安装教程

简介 RedisInsight 是一个直观高效的 Redis GUI 管理工具,它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控,并且可以在界面上使用 CLI 和连接的 Redis 进行交互(RedisInsight 内置对 Redis 模块支持)。 RedisIn…

试卷扫描转化word的功能有吗?分享4款工具!

试卷扫描转化word的功能有吗?分享4款工具! 随着科技的飞速发展,将试卷扫描并转化为Word文档已经成为我们日常学习和工作的常规需求。但是,市面上的扫描工具众多,如何选择一个既方便又准确的工具呢?本文将为…

Win7 和 Win Server 2008 安装Anaconda报错:Failed to extract packages

在Python官网来看,Python 3.8.18之后,就不再支持Windows7。 对应Anaconda的版本就是anaconda3-2021.05。 下载地址是:https://repo.anaconda.com/archive/Anaconda3-2021.05-Windows-x86_64.exe 相关链接 Python官方下载 Anaconda归档

k8s学习(RKE+k8s+rancher2.x)成长系列之概念介绍(一)

一、前言 本文使用国内大多数中小型企业使用的RKE搭建K8s并拉起高可用Rancher2.x的搭建方式,以相关技术概念为起点,实际环境搭建,程序部署为终点,从0到1的实操演示的学习方式,一步一步,保姆级的方式学习k8…

JavaScript DOM对象的尺寸和位置详解

在DOM对象操作中,其尺寸和位置也是DOM的核心内容,因为js的“交互式应用”几乎少不了对DOM对象的尺寸和位置进行操作,特别是js动画效果。 一、关于DOM对象的尺寸和位置介绍 二、DOM文档对象的尺寸 1、obj.scrollWidth 和 obj.scrollHeight …

JDBC学习笔记

一.什么是JDBC 我们操作数据库是用sql语句,那么怎么编写程序来操作数据库呢?这就要学习JDBC。 JDBC就是使用Java中操作关系型数据库的一套API。全称:( Java DataBase Connectivity ) Java 数据库连接。 JDBC更准确的来说是一套接口/API&…

我的隐私计算学习——联邦学习(5)

笔记内容来自多本书籍、学术资料、白皮书及ChatGPT等工具,经由自己阅读后整理而成。 (七)联邦迁移学习 ​ 相关研究表明,联邦迁移学习不需要主服务器作为各参与方间的协调者,旨在让模型具备举一反三能力,在…

仓储管理系统——软件工程报告(总体设计)③

总体设计 一、需求规定 软件工程仓库存储管理系统的需求规定是确保系统能够满足用户期望、提高工作效率、确保数据安全性和系统可维护性的基石。其涵盖了功能性、性能、数据管理、用户界面和系统可维护性等多个方面。通过严格的验收标准,可以确保系统在实际应用中…

HarmonyOS ArkUI 框架的实现原理和落地实践

HarmonyOS 操作系统特性 首先介绍一下鸿蒙操作系统,鸿蒙操作系统是华为设计的下一代分布式物联网操作系统,它首次引入了面向场景设计的分布式理念,同时能够实现一套操作系统通过裁减的方式适配到某种终端,它是华为面向万物互联理念…

windows根据pid查看端口号

一.什么是PID 任务管理器中的PID指的是进程标识符(Process Identifier),它用于在操作系统中唯一标识一个进程二.查看JAVA程序的PID jps命令即可三.根据PID查看端口 netstat -ano|findstr pid

Gradle学习笔记:Gradle的简介、下载与安装

文章目录 一、什么是Gradle二、为什么选择Gradle三、下载并安装Gradle四、Gradle的bin目录添加到环境变量五、测试Gradle是否安装正常 一、什么是Gradle Gradle是一个开源构建自动化工具,专为大型项目设计。它基于DSL(领域特定语言)编写&…

基于LSTM的负荷预测,基于BILSTM的负荷预测,基于GRU的负荷预测,基于BIGRU的负荷预测,基于BP神经网络的负荷预测

目录 背影 摘要 代码和数据下载:基于LSTM的负荷预测,基于BILSTM的负荷预测,基于GRU的负荷预测,基于BIGRU的负荷预测,基于BP神经网络的负荷预测资源-CSDN文库 https://download.csdn.net/download/abc991835105/8876806…

可视化 | 【d3】桑基图

文章目录 📚d3📚桑基图应用🐇html🐇css🐇js 📚d3 d3.js是一个用于创建数据可视化的JavaScript库,它提供了丰富的API和工具来操作文档对象模型(DOM),使得创建…

蓝桥杯(C++ 左移右移 买二增一 松散子序列 填充 有奖问答 更小的数 )

目录 左移右移 思路: 代码: 买二增一 思路: 代码: 松散子序列 思路: 代码: 填充 思路: 代码 : 有奖问答 思路: 代码: 更小的数 思路&#…

3dmax贴视频纹理

1、准备视频文件 需要avi格式的视频文件 2、创建模型 3、添加纹理 纹理选择avi视频 4、播放

四川尚熠电子商务有限公司引领抖音电商新潮流

随着抖音的火爆,越来越多的商家开始重视抖音电商服务,希望在这个庞大的平台上掘金。四川尚熠电子商务有限公司作为一家专业的抖音电商服务商,凭借其独特的运营策略和专业的服务团队,成为了商家在抖音电商领域的可靠伙伴。 四川尚熠…

C/C++ LeetCode:跳跃问题

个人主页:仍有未知等待探索-CSDN博客 专题分栏:算法_仍有未知等待探索的博客-CSDN博客 题目链接:45. 跳跃游戏 II - 力扣(LeetCode) 一、题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元…

开源CRM客户管理系统-FeelCRM

FeelCRM客户管理系统 开源项目介绍 FeelCRM客户管理系统,符合中小企业业务流程;支持线索管理、客户管理、商机管理、合同管理、审核管理等多个模块;希望能为广大中小企业以及开发者们提供一个更多的可能性;本版本是我公司跨语言…