Gts交接
目录
项目说明
- gtsinf-core 公共模块,包含以下内容
- 公共的utils
- vat开票相关的model和interface定义
- gtsinf-service
- 实现了gtsinf-core中"vat开票相关的interface定义",包含了所有厂商对interface的实现
- TaxEntranceController中定义了不同开票厂商发票操作的统一入口
- BaiWangWebServiceController中实现了bw单机版本的发票操作
- BaiWangSDKTaxInterfaceImpl中实现了bw SDK版本的发票操作
- 更多参考Gts-开票服务中对项目的期望描述
- bw-webservice-dllwrap
- 用于打印终端上电脑部署的程序,用于调用打印终端电脑中安装的百旺dll完成上游系统(比如vat)发起的发票开具,打印等服务
- 项目启动后会将自己的服务告知gtsinf-service,以便gtsinf-service根据纳税人识别号找到对应的bw-webservice-dllwrap服务,并完成对打印终端的操作
- gtsinf-ukey
- ukey助手服务,配合机器人完成报税工作
- 用于控制ukey助手设备完成以下操作
- 自检:逐一开启设备的usb端口
- 启用指定usb端口,其他usb端口关闭
- gtsinf-ocr
- 实现了扫描仪的驱动和发票ocr识别
- gtsinf-app
- 前端页面,基于antd+redux开发,用于调用后端restful服务并完成和用户的交互操作.
- 编译后包含index.html,index.js,index.css三个文件.copy到spring-cloud类型的java项目的src\main\resources\static路径中作为项目的一部分,类似于jsp
部署依赖
1.8_32_jdk
- 用于dll调用的32位jdk
- 整合jna,jni等需要的dll和jar包
winsw
- 可以以windows服务的方式运行java程序
- 原理如下
- 将winsw.exe安装为Windows服务
- 服务启动时winsw会读取winsw同文件夹下winsw.xml中的配置.并执行executable参数中指定的可执行程序,同时以配置中arguments参数中的运行参数
- winsw.xml示例如下
<?xml version="1.0" encoding="UTF-8" ?>
<service>
<id>DTT_GTS_BW_WEBSERVICE</id>
<name>DTT_GTS_BW_WEBSERVICE</name>
<description>百旺服务器版组件接口webservice服务</description>
<executable>D:\server\java\1.8_32_jdk\bin\java.exe</executable>
<arguments>-Xrs -Xmx256m -jar "D:\workspace\source\gtsinf-parent\bw-webservice-dllwarp\target\bw-webservice-dllwarp-0.0.1-SNAPSHOT.jar" --server.port=8080</arguments>
<logmode>rotate</logmode>
</service>
项目开发部署说明
导入项目
- 从https://cngdctax-svn01.atrapa.deloitte.com/svn/tms2/18TMSAddOnSourceCode/trunk checkout最新代码
- 在eclipse或intellijj中以maven项目方式导入项目
- 导入后结果如下
调试方式运行项目
- gtsinf-service,bw-webservice-dllwrap,gtsinf-ukey,gtsinf-ocr,gtsinf-app都为spring boot项目,项目自带容器jar包.
- 以bw-webservice-dllwrap为例启动调试方式为
- 更多请在网上阅读spring boot相关内容
编译项目
在gts-parent项目上执行以下命令
- 先执行maven -clean
- 再执行maven -install
- 如果没问题会看到以下结果
java命令行方式运行项目
- 以gtsinf-service为例
- 编译好后在以下路径中找到编译结果:gtsinf-service\target\gtsinf-service-0.0.1-SNAPSHOT.jar
- 使用以下方式运行编译成果,请自行调整自己的路径
D:\server\java\1.8_32_jdk\bin\java -Xrs -Xmx256m -jar "D:\workspace\source\gts\gtsinf-service\target\gtsinf-service-0.0.1-SNAPSHOT.jar" --eureka.client.serviceUrl.defaultZone=http://127.0.0.1:6889/eureka
- 如果不报错,你会看到以下结果
winsw方式运行项目
以gtsinf-service为例
- 修改 INSTALL.bat中的相关路径信息
"C:\Program Files (x86)\deloitte\gts\winsw.exe" install NET START DTT_GTS_TAX_INVOICE_SERVICE
- 修改 UNINSTALL.bat中的相关路径信息
NET STOP DTT_GTS_TAX_INVOICE_SERVICE "C:\Program Files (x86)\deloitte\gts\winsw.exe" uninstall
- 修改 winsw.xml中的相关路径信息
<?xml version="1.0" encoding="UTF-8" ?>
<service>
<id>DTT_GTS_TAX_INVOICE_SERVICE</id>
<name>DTT_GTS_TAX_INVOICE_SERVICE</name>
<description>德勤税控服务</description>
<executable>C:\Program Files (x86)\deloitte\gts\1.8_32_jdk\bin\java.exe</executable>
<arguments>-Xrs -Xmx256m -jar "C:\Program Files (x86)\deloitte\gts\gtsinf-service-0.0.1-SNAPSHOT.jar" --server.port=8080 --deloitte.ws.url="http://127.0.0.1:8081/bwdll/requestServerWithXml"</arguments>
<logmode>rotate</logmode>
</service>
- 安装应用为服务
以管理员运行INSTALL.bat
- 删除服务
以管理员运行UNINSTALL.bat
linux环境下执行
参考上面<<java命令行方式运行项目>>
配置优先级
远程配置 > 命令行参数配置 > application > bootstrap**
项目关键点说明
gtsinf-service
百旺 webservice
百旺 sdk
- 以下xml嵌套以前webservice的xml(业务报文内容)作为主要传输内容.
<?xml version="1.0" encoding="UTF-8"?>
<fwpackage>
<jsnr>
<fwdm>服务代码</fwdm>
<nsrsbh>纳税人识别号</nsrsbh>
<jrdm>接入代码</jrdm>
</jsnr>
<ywnr>
<![CDATA[业务报文内容]]>
</ywnr>
</fwpackage>
- 调用方式参考
String apiUrl="http://127.0.0.1:8080/api/service/bwapi"; //请求路劲
String nsrsbh="91500000747150199A"; //纳税人识别号码
String jrdm="12345678"; //接入代码
BaiwangCouldAPIClient client = new BaiwangCouldAPIClient();
client.login(apiUrl, nsrsbh, jrdm);
String inXml=getJkXml();//获取请求的报文
System.out.println("接口请求报文==="+inXml);
String rtnXml = client.rpc(inXml);
System.out.println("接口返回报文==="+rtnXml);
client.logout();
实现上需要重新实现TaxController, TaxInterface2个接口.都不是很麻烦,可以在以前基础上略作调整.
- 通用返回报文格式
<?xml version="1.0" encoding="UTF-8" ?>
<result>
<rtncode>0</rtncode>
<rtnmsg>如:调用[查询当前未开发票号]成功!</rtnmsg>
<rtndata>
<![CDATA[返回报文内容]]>
</rtndata>
</result>
bw-webservice-dllwrap项目特别说明
- dllwrap依赖
- bw-webservice-dllwrap\src\main\resources中的dll文件不能删除
- 32位jdk 1.8_32_jdk
- gtsinf-ocr\src\main\resources\application.properties参数说明 实际部署时以命令行参数或winsw.xml中的配置为准
- eureka.client.serviceUrl.defaultZone gtsinf-service服务的地址,服务启动后会向这个地址注册自己 eureka.client.serviceUrl.defaultZone=http://127.0.0.1:6889/eureka
找不到dll
- 在百旺自家的服务器web管理界面,下载控件并安装
- 在 C:\Program Files (x86)\税控服务器组件接口下,将所有文件copy到C:\Windows\System32目录,或在path环境变量中设置这个目录
打印边距调整
创建或修改以下文件 C:\Program Files (x86)\税控服务器组件接口\_SKSClog\ybjsz.ini 专票和普票内容参考如下.请自行根据实际情况调整相关数字大小,本调整支持百望云.不过需要把ybjsz.ini文件设置为只读.
[004]
top=2
left=8
打印服务器和终端配置
gtsinf-ocr项目特别说明
- ocr依赖
- 扫描仪驱动
- DllLib
- 32位jdk 1.8_32_jdk
- gtsinf-ocr\src\main\resources\application.properties参数说明 实际部署时以命令行参数或winsw.xml中的配置为准
- scanner.dllPath 文通扫描仪DllLib文件夹目录和JBillOcr.dll文件目录,JBillOcr.dll不能单独存放 scanner.dllPath=D:\\DllLib\\JBillOcr.dll
- scanner.userId 文通授权id scanner.userId=96DC6CD9BDD661E2934A
- scanner.result_base_path 扫描文件和ocr识别结果文件存放根目录 scanner.result_base_path=D:\\temp
orc api
在线云地址为 http://www.netocr.com/developers.do?id=4
我们使用的是私有云.私有云安装参考下面的文档
安装文通服务
对启动的bat文件进行了优化,简化了安装流程.原始安装流程参考
- 下载文件 https://cngdctax-svn01.atrapa.deloitte.com/svn/tms2/18TMSAddOnSourceCode/trunk/install/ocr/X64.rar或从测试服务器获取最新的包
- 将X64.rar解压到c:\x64,目录如下
- 修改C:\X64\tomcat\webapps\cxfServerX\WEB-INF\classes\peizhi.properties中format为format=json
- 安装vcredist2010_x64.exe
- 修改X64\tomcat\webapps\newRecon\WEB-INF\classes\beans.xml中的ip地址
- 将https://cngdctax-svn01.atrapa.deloitte.com/svn/tms2/18TMSAddOnSourceCode/trunk/install/ocr/LicenceFile_10.173.20.8下载后重命名为LicenceFile放在 X64\website\InvoiceLibrary下
- 修改/X64/ShiBie/port.properties中的cardtype属性
cardtype=9
- 运行Start.bat启动程序
- 打开http://localhost:8080/newRecon/查看效果 http://10.173.20.8:8080/newRecon http://localhost:8080/cxfServerX
- 测试发票
- 如果有问题参考<<识别服务64位系统服务器端安装说明.pdf>>
WenTongOcrApiController
USRTMSVATCRBatchScanOriService
授权文件安装
- 找ruanzq@wintone.com.cn得到获取服务器信息的软件运行并获得服务器信息文件
- 将文件给文通ruanzq@wintone.com.cn的到LicenceFile
- 将LicenceFile放到C:\X64\website\InvoiceLibrary
- 重启服务
vat中的使用
- 主要类USRTMSVATCRBatchScanOriService
- 使用webservice方式调用,更多参考上海中心项目#eclipse生成 webservice client
public static String ocrImgWithWebservice(String img) throws Exception {
String endpoint = PropertiesUtils.getProperty("ocr.wt.webservice.endpoint", "ocr.properties");
if (AssertHelper.empty(endpoint)) {
throw new Exception("ocr.properties配置文件中ocr.wt.webservice.endpoint配置错误");
}
CardImgreconProxy proxy = new CardImgreconProxy();
proxy.setEndpoint(endpoint);
return proxy.doVatinvoice("test", img, typeId, outvalue);
}
- wsdl地址为=http://10.173.20.8:8080/cxfServerX/ImgReconCard?wsdl
- 配置文件为ocr.properties
- 大致流程为
- 递归扫描ocr.file.rootpath下所有文件
- 将文件移动到ocr.file.barkuprootpath按年月归档,写入TMSVATCRBatchScanOri
- 处理当前这批文件的pdf文件
- 读取pdf中的图片,通过配置ocr.wt.webservice.endpoint调用文通orc识别,写入TMSVATCRBatchScanTrack记录
- 将文通ocr识别结果写入TMSVATCRBatchScan,TMSVATCRBatchScanL
- TODO 全票面识别时再写入TMSVATCRBatchScanL,现在写没意义
json调用成功报文
{"data":{"message":{"status":0,"value":"识别完成"},"cardsinfo":{"card":{"item":[{"content":"3200174130","desc":"发票代码"},{"content":"02851212","desc":"发票号码"},{"content":"180117","desc":"开票日期"},{"desc":"机器编号"},{"content":"91310000662451927U","desc":"购方税号"},{"content":"91320118773979791B","desc":"销方税号"},{"content":"36698.11","desc":"金额"},{"content":"2201.89","desc":"税额"},{"content":"38900.00","desc":"合计金额"},{"desc":"校验码"},{"content":"01,01,3200174130,02851212,36698.11,20180117,,587D,","desc":"二维码"},{"content":"9678-6327<*<*11/<81588682>5+-1+2/->-13*/32>*/*5<++0957+2/2>29+920391/3<1/+/931*>1+0-9-93+25//+0388+2>45-37+/","desc":"密文"},{"content":"的克(中国)商贸有限公司","desc":"购方名称"},{"content":"南京邦创科技发展有限公司","desc":"销方名称"},{"content":"叁万捌仟玖佰圆整","desc":"大写金额"},{"content":"上海市普陀g西质路1255号第九层021-62766509","desc":"购方地址、电话"},{"content":"花.■行(中国)有阳公司上向稠.支\"404003-1746026206","desc":"购方开户行及账号"},{"content":"南京市高净区砖墙集镇水成路39号025-856970(","desc":"销方地址、电话"},{"content":"中国农业银行南京市迈$桥支行1011050t040006","desc":"销方开户行及账号"},{"desc":"收款人"},{"desc":"复核"},{"content":"徐兆梅","desc":"开票人"},{"desc":"备注"},{"content":"发票联","desc":"发票联"},{"content":".生活服务.清洗费$$项$1$36698.11328$36696.11$6$2201.89","desc":"明细内容"}],"type":20090}}}}
json调用失败报文
{"data":{"message":{"status":-1,"value":"识别失败!ReconClientX:InvoiceRecognizeImage6"}}}
服务器信息
IBizSys环境服务器列表
Server Name 功能 OS User/Passwd IP Address
iBiz App Server 1 应用服务器 Ubuntu16.04 (appuser/84936934) 172.16.150.160
iBiz App Server 2 应用服务器 Ubuntu16.04 (appuser/65484247) 172.16.150.161
iBiz App Server 3 应用服务器 Ubuntu16.04 (appuser/84936934) 172.16.150.162
iBiz App Server 4 应用服务器 Ubuntu16.04 (appuser/67874324) 172.16.150.163
iBiz App Server 5 应用服务器 Ubuntu16.04 (appuser/87324768) 172.16.150.164
iBiz Cloud Server 1 应用服务器 Ubuntu16.04 dttserver/!QAZ@dtt2016 (sudo -i) 172.16.150.198
iBiz Cloud Server 2 应用服务器 Ubuntu16.04 dttserver/!QAZ@dtt2016 (sudo -i) 172.16.150.199
10.173.20.16 user/pass cntaxadm Dtt!2345678
10.173.20.8 tmcadmin Dtt!2345678 10.173.20.9 tmcadmin Dtt!2345678 10040 应用路径 E:\vat_ZG\TOMCAT_10042_VAT 访问 10.173.20.9:10040/VAT 数据库 10.173.20.9:1521:orcl user/PASS TMSVAT/TMSVAT
QR_CODE
波哥,
用INQ_QR_CODE信息覆盖其他字段信息对应关系如下:
示例:01,04,1100171320,22643269,1803.77,20170605,11002120188268216442,A9D1
- 01 – 不知道具体对应的内容,先不管;
- 04 – 发票类型,INQ_INVOICE_TYPE,具体值对应关系如下:
- 01 – 增值税专用发票
- 04 – 增值税普通发票
- 10 – 增值税电子普通发票
- 1100171320 – 发票代码,INQ_INVOICE_CODE
- 22643269 – 发票号码,INQ_INVOICE_NUMBER
- 1803.77 – 发票净额,INQ_TOTAL_AMOUNT
- 20170605 – 开票日期,INQ_BILLING_DATE,需转换为该字段数据存储格式
- 11002120188268216442 – 普票校验码,INQ_CHECKCODE_6
- A9D1 – 不知道对应什么内容,先不管;
如果INQ_QR_CODE里有值,就将INQ_QR_CODE中的信息填到对应的字段中,覆盖掉该字段里原有的信息。如果有什么问题,可以随时找我~~谢谢波哥!
BR, Tinglan
106授权失败
需要生产新的授权,如果更新授权后还是106错误,需要杀死ManagerSrv再启动
linux下安装
需要root权限,进行初始化
useradd -d /home/wintone -m wintone cd /home/wintone sudo mkdir applog sudo chmod -R 777 /home/wintone
复制文件到/home/wintone
cd /home/wintone sudo sh Uncompress.sh
配置bash_profile
编辑wintone 目录下的.bash_profile 文件,在最后一行注释:
#export PATH
并在后面添加如下配置并保存(路径以解压后的实际路径为准):
export JAVA_HOME=/home/wintone/jdk1.7.0_75 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH export LANG=zh_CN.GBK
验证
source .bash_profile java –version
问题解决
ReconClientX:InitInvoice is null
- 授权文件没有或过期
vpn
-Djava.net.preferIPv4Stack=true
gtsinf-ukey项目特别说明
- ukey依赖
- 串口驱动 CP210x_VCP_Win_XP_S2K3_Vista_7.exe
- 32位jdk 1.8_32_jdk
- gtsinf-ukey\src\main\resources\application.properties参数说明 实际部署时以命令行参数或winsw.xml中的配置为准
- serial.bps 串口默认波特率 serial.bps=115200
- serial.configPath 配置文件存放位置 serial.configPath=D:\\temp\\serial
设置设备号
润东:
你看下协议,串口工具里有示例的设置命令
润东:
当时德勤应该是对设置命令的字段自己定义了
润东:
设置命令不判断设置内容的
bo.wang:
设置命令前缀+内容就可以了吗?
bo.wang:
4D 54 1B 80 10 31 32?
bo.wang:
[图片]
bo.wang:
没有看太懂
润东:
第三个字节是命令长度,最后两个字节是校验
润东:
看文档最前面的包格式定义
bo.wang:
[图片]
bo.wang:
我只能看懂这个
bo.wang:
你那个我看不懂......
bo.wang:
我以前看到的文档应该不是这个
bo.wang:
这个东西我看不懂
bo.wang:
我想把设置初始化为ukey-ctrl-2018110601 应该用你的工具咋操作?
润东:
4d 54 长度 80 10 (你要设置内容的十六进制) 两字节校验
润东:
长度为你的数据包长度
bo.wang:
把内容转换为16进制
bo.wang:
4d 54 +长度+16进制内容+80 10?
润东:
校验码如果你程序不能计算你可以随便填两个字节发给hub,hub会把正确的校验值回送回来
润东:
不对
bo.wang:
真心听不懂....以前是马老师做的这个事情
润东:
等下我给你组织下
bo.wang:
你能帮忙远程下么?
bo.wang:
或者你给我下要发送给hub的内容,比如是指设备号为ukey-ctrl-2018110601
bo.wang:
马老师不在德勤了,我也不好联系他...
润东:
4D 54 1B 80 10 75 6B 65 79 2D 63 74 72 6C 2D 32 30 31 38 31 31 30 36 30 31 FF FF
bo.wang:
好的
bo.wang:
ukey-ctrl-2018110602
bo.wang:
ukey-ctrl-2018110603
bo.wang:
麻烦也发下吧,我打开新设备,然后传这一串就可以了吧
润东:
发送后hub会回显校验码,然后用校验码替换掉最后两个字节的FF FF
bo.wang:
哪里看回显,我发了啥都没看到
润东:
你先用我给你发的串口工具连上hub发
润东:
我以为你们做了程序的
润东:
另外两个把倒数第三个字节替换为 32和33发
润东:
串口工具选择16进制发送哦
bo.wang:
这个命令没做
bo.wang:
当时马老师自己做的,其他我都做了
润东:
可以看到串口回显了吗?
bo.wang:
一激动点错了.远程桌面点错了,被我关闭了...稍等
gtsinf-app项目特别说明
- 项目依赖安装nodejs,cnpm参考搭建kafka源码环境
- 导入后初始化
cd gtsinf-app cnpm i
- 编译
cd gtsinf-app npm run build
- 修改前端界面
ocr和ukey的前端页面都在本项目中,可以修改gtsinf-app\src\router.js中的配置来设置首页显示orc内容还是ukey内容
<Router
history={history}>
<Route path="/" component={scanner}/>
<Route path="/pageScanner" component={scanner}/>
<Route path="/pageSerial" component={serial}/>
</Router>
);