Gts交接

来自ling
跳转至: 导航搜索

bat启动bat

项目说明

  • gtsinf-core 公共模块,包含以下内容
  1. 公共的utils
  2. vat开票相关的model和interface定义
  • gtsinf-service
  1. 实现了gtsinf-core中"vat开票相关的interface定义",包含了所有厂商对interface的实现
  2. TaxEntranceController中定义了不同开票厂商发票操作的统一入口
  3. BaiWangWebServiceController中实现了bw单机版本的发票操作
  4. BaiWangSDKTaxInterfaceImpl中实现了bw SDK版本的发票操作
  5. 更多参考Gts-开票服务中对项目的期望描述
  • bw-webservice-dllwrap
  1. 用于打印终端上电脑部署的程序,用于调用打印终端电脑中安装的百旺dll完成上游系统(比如vat)发起的发票开具,打印等服务
  2. 项目启动后会将自己的服务告知gtsinf-service,以便gtsinf-service根据纳税人识别号找到对应的bw-webservice-dllwrap服务,并完成对打印终端的操作
  • gtsinf-ukey
  1. ukey助手服务,配合机器人完成报税工作
  2. 用于控制ukey助手设备完成以下操作
    1. 自检:逐一开启设备的usb端口
    2. 启用指定usb端口,其他usb端口关闭
  • gtsinf-ocr
  1. 实现了扫描仪的驱动和发票ocr识别
  • gtsinf-app
  1. 前端页面,基于antd+redux开发,用于调用后端restful服务并完成和用户的交互操作.
  2. 编译后包含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项目方式导入项目
  • 导入后结果如下

Gts-inport-result.PNG

调试方式运行项目

  • gtsinf-service,bw-webservice-dllwrap,gtsinf-ukey,gtsinf-ocr,gtsinf-app都为spring boot项目,项目自带容器jar包.
  • 以bw-webservice-dllwrap为例启动调试方式为

Gts-debug.PNG

  • 更多请在网上阅读spring boot相关内容

编译项目

在gts-parent项目上执行以下命令

  • 先执行maven -clean

Gts-clean.PNG

  • 再执行maven -install

Gts-install.PNG

  • 如果没问题会看到以下结果

Gts-sucess.PNG

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
  • 如果不报错,你会看到以下结果

Gts-cmd-java-run-jar.PNG

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项目特别说明

参考百旺dll版本部署

  • dllwrap依赖
    • bw-webservice-dllwrap\src\main\resources中的dll文件不能删除
    • 32位jdk 1.8_32_jdk
  • gtsinf-ocr\src\main\resources\application.properties参数说明 实际部署时以命令行参数或winsw.xml中的配置为准
  1. 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中的配置为准
  1. scanner.dllPath 文通扫描仪DllLib文件夹目录和JBillOcr.dll文件目录,JBillOcr.dll不能单独存放 scanner.dllPath=D:\\DllLib\\JBillOcr.dll
  2. scanner.userId 文通授权id scanner.userId=96DC6CD9BDD661E2934A
  3. scanner.result_base_path 扫描文件和ocr识别结果文件存放根目录 scanner.result_base_path=D:\\temp

orc api

在线云地址为 http://www.netocr.com/developers.do?id=4

我们使用的是私有云.私有云安装参考下面的文档

安装文通服务

对启动的bat文件进行了优化,简化了安装流程.原始安装流程参考

Wentongocr01.PNG

  • 修改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启动程序

Wentongocr02.PNG

Testinvoice3.PNG

  • 如果有问题参考<<识别服务64位系统服务器端安装说明.pdf>>

WenTongOcrApiController

WenTongOcrApiController

USRTMSVATCRBatchScanOriService

授权文件安装

  • 找ruanzq@wintone.com.cn得到获取服务器信息的软件运行并获得服务器信息文件
  • 将文件给文通ruanzq@wintone.com.cn的到LicenceFile
  • 将LicenceFile放到C:\X64\website\InvoiceLibrary
  • 重启服务

vat中的使用

	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依赖
  • gtsinf-ukey\src\main\resources\application.properties参数说明 实际部署时以命令行参数或winsw.xml中的配置为准
  1. serial.bps 串口默认波特率 serial.bps=115200
  2. serial.configPath 配置文件存放位置 serial.configPath=D:\\temp\\serial

设置设备号

下载文件:USB HUB通讯协议.rar

润东:
你看下协议,串口工具里有示例的设置命令

润东:
当时德勤应该是对设置命令的字段自己定义了

润东:
设置命令不判断设置内容的

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项目特别说明

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>
  );