Commit e5fb46e4 authored by 徐州's avatar 徐州

完成全部逻辑

parent 5bd3624c
......@@ -82,7 +82,7 @@
<tr class="table-line-td">
<th width="15%">建设单位</th>
<td width="35%">
<input id="jsdw" name="fstzsXm.jsdwmc" style="width:96%;margin-top: 6px;" value="${fstzsXm.jsdwmc}" disabled/>
<input id="jsdw" name="fstzsXm.jsdwmc" style="width:96%;margin-top: 6px;" value="${fstzsXm.jsdwmc}"/>
</td>
......
......@@ -231,7 +231,7 @@
class='f7'>${fstzsXm.jkrlx}
</div>
<div id='f8' draggable='true'
class='f8'>${fstzsXm.zhanghao}
class='f8'>${fstzsXm.kpsjgl.skrzh}
</div>
<c:choose>
......@@ -248,7 +248,7 @@
</c:otherwise>
</c:choose>
<div id='f10' draggable='true'
class='f10'>${fstzsXm.khh}
class='f10'>${fstzsXm.kpsjgl.skrkhh}
</div>
<div id='f11' draggable='true'
class='f11'>${fstzsXm.kpsjgl.xmbm}
......
......@@ -13,6 +13,11 @@
<%@include file="/common/jsLib.jsp"%>
<script>
function reloadDate(){
$('#pagination').datagrid('clearSelections');
search_fstzs();
}
function search_fstzs(){
var queryParams = {
......@@ -22,7 +27,7 @@
"fstzs.yjje": $("#yjje").val(),
"fstzs.jkm": $("#jkm").val(),
"fstzs.status": $("#status").val(),
"fstzs.isKp": $("#isKp").val(),
"fstzs.kpState": $("#kpState").val(),
"kssj":$("#kssj").val(),
"jssj":$("#jssj").val()
};
......@@ -45,48 +50,51 @@
"kssj":$("#kssj").val(),
"jssj":$("#jssj").val()
},
frozenColumns:[[
{field:'id',checkbox:true}
]],
// frozenColumns:[[
// {field:'id',checkbox:true}
// ]],
columns:[[
{field:'op',title:'操作',width:80,align:'center',formatter:function(value,rec){
{field:'op',title:'操作',width:120,align:'center',formatter:function(value,rec){
var result = "";
if(rec.isKp == 0) {
if(rec.kpState == 0) {
result += "<a class='btn_01_mini' onclick=kaipiao('"+rec.id+"') >开票<b></b></a>";
} else if(rec.kpState == 2) {
result += "<a class='btn_01_mini' onclick=kaipiaoCx('"+rec.id+"') >查询<b></b></a>";
}
return result;
}},
{field:'jkm',title:'缴款码',width:100},
{field:'bzrq',title:'编制日期',width:100},
{field:'slbh',title:'受理编号',width:100},
{field:'jsdwmc',title:'建设单位名称',width:100},
{field:'gcxmmc',title:'工程项目名称',width:100},
{field:'jkm',title:'缴款码',width:150},
{field:'bzrq',title:'编制日期',width:150},
{field:'slbh',title:'受理编号',width:150},
{field:'jsdwmc',title:'建设单位名称',width:150},
{field:'gcxmmc',title:'工程项目名称',width:150},
{field:'jkr',title:'缴款人',width:100},
{field:'yjje',title:'金额',width:100},
{field:'pjdm',title:'票据代码',width:100},
{field:'dzph',title:'票据号码',width:100,formatter: function (value, row, index){
{field:'pjdm',title:'票据代码',width:150},
{field:'dzph',title:'票据号码',width:150,formatter: function (value, row, index){
return "<a class='to_path' target='_black' href='" + row.pjUrl + "'>" + value + "<b></b></a>"
}},
{field:'isKp',title:'开票状态',width:100,formatter: function (value, row, index){
{field:'kpState',title:'开票状态',width:100,formatter: function (value, row, index){
if (value == 0) return "未开票";
if (value == 2) return "开票中";
return "已开票";
}},
{field:'isJk',title:'缴款状态',width:100,formatter: function (value, row, index){
if (value == 0) return "未缴款";
return "已缴款";
}},
{field:'jkTime',title:'缴款日期',width:100},
{field:'jkTime',title:'缴款日期',width:120},
{field:'jkqd',title:'缴款渠道',width:100}
]],
toolbar:[{
id:'btnkaipiao',
text:'批量开票',
iconCls:'icon-ok',
handler:function(){
addNew();
}
}
]
]]
// toolbar:[{
// id:'btnkaipiao',
// text:'批量开票',
// iconCls:'icon-ok',
// handler:function(){
// kaipiaoBat();
// }
// }
// ]
}));
});
......@@ -119,6 +127,32 @@
}
function kaipiaoCx(id){
$.ajax({
url : "${ctx}/jsp/fstzs/kaipiaoCx.action",
type: 'post',
dataType: 'json',
data:{
id : id
},
async : false,
error: function (data) {
$.messager.alert('错误', data.message);
},
success: function (data) {
if (data.result) {
$.messager.alert("提示",data.message)
reloadDate()
} else {
$.messager.alert('错误', data.message);
}
}
});
}
</script>
</head>
<body>
......@@ -164,10 +198,11 @@
<td></td>
<th width="12%">开票状态</th>
<td width="12%">
<select name="rfxm.isKp" id="isKp" >
<select name="rfxm.kpState" id="kpState" >
<option value="">请选择</option>
<option value="0">未开票</option>
<option value="1">已开票</option>
<option value="2">开票中</option>
</select>
</td>
</tr>
......
......@@ -31,5 +31,6 @@
<orderEntry type="library" exported="" name="lib" level="project" />
<orderEntry type="library" exported="" name="fr-applet-8.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="TomEE 8.5.47" level="application_server_libraries" />
<orderEntry type="library" name="crypto1" level="project" />
</component>
</module>
\ No newline at end of file
......@@ -28,8 +28,8 @@
<![CDATA[and t.jkm like :jkm]]>
</isNotEmpty>
<isNotEmpty property="isKp">
<![CDATA[and t.isKp = :isKp]]>
<isNotEmpty property="kpState">
<![CDATA[and t.isKp = :kpState]]>
</isNotEmpty>
<isNotEmpty property="kssj">
......
......@@ -86,10 +86,14 @@
<result name="invalid.token">/invalid.jsp</result>
</action>
<!--激活项目,参数传到财政系统-->
<!--开票操作-->
<action name="kaipiao" class="com.jshx.fstzs.web.FstzsAction" method="kaipiao">
</action>
<!--开票查询结果-->
<action name="kaipiaoCx" class="com.jshx.fstzs.web.FstzsAction" method="kaipiaoCx">
</action>
<!--查询缴费状态-->
<action name="queryJfzt" class="com.jshx.fstzs.web.FstzsAction" method="queryJfzt">
</action>
......
......@@ -112,8 +112,10 @@ public class Fstzs extends BaseModel {
/**
* 是否开票
* 0 没开
* 1,已开票
* 2,开票中
*/
private Integer isKp;
private Integer kpState;
/**
* 是否缴款
......@@ -174,7 +176,7 @@ public class Fstzs extends BaseModel {
* 对应项目信息
*/
@ManyToOne(targetEntity = FstzsXm.class, fetch = FetchType.LAZY)
@JoinColumn(name = "XMZJ", insertable = true, updatable = false)
@JoinColumn(name = "XMZJ", insertable = false, updatable = false)
public FstzsXm getFstzsXm() {
return fstzsXm;
}
......@@ -279,12 +281,12 @@ public class Fstzs extends BaseModel {
this.dzph = dzph;
}
public Integer getIsKp() {
return isKp;
public Integer getKpState() {
return kpState;
}
public void setIsKp(Integer isKp) {
this.isKp = isKp;
public void setKpState(Integer kpState) {
this.kpState = kpState;
}
public Integer getIsJk() {
......
......@@ -104,6 +104,7 @@ public class FsRequest {
/**
* 作废电子缴款书
* {"error_message":{"error_code":"0001","error_msg":"缴款书已缴款确认,不能作废!"}}
* @param fstzs
*/
public static FsResult<Boolean> zuofei(Fstzs fstzs) {
......@@ -118,7 +119,7 @@ public class FsRequest {
if(resp.message != null && "0000".equals(resp.message.succCode)) {
return new FsResult<>(true);
}
return new FsResult(resp.errorMessage.errorMsg);
return FsResult.fail(resp.errorMessage.errorMsg);
}
/**
......@@ -155,7 +156,7 @@ public class FsRequest {
* @param jbr
* @return
*/
public static FsResult<KpResp> kaipiao(Fstzs fstzs,String jbr) {
public static FsResult<String> kaipiao(Fstzs fstzs,String jbr) {
//1,stock.billno.get 获取电子票号
Map<String,Object> mapPh = new HashMap<>();
mapPh.put("place_code",getProp("fs-kpdbm"));//开票点编码
......@@ -188,7 +189,7 @@ public class FsRequest {
xml = xml.replaceAll("\\{\\{EInvoiceID}}",eInvoiceID);
xml = xml.replaceAll("\\{\\{EInvoiceCode}}",respPh.message.billBatchCode);
xml = xml.replaceAll("\\{\\{EInvoiceNumber}}",respPh.message.billNo);
xml = xml.replaceAll("\\{\\{random}}",new Random().nextInt(100000) + "");
xml = xml.replaceAll("\\{\\{random}}",((int)((Math.random()*9+1)*100000)) + "");
xml = xml.replaceAll("\\{\\{yjje}}",fstzs.getYjje());
xml = xml.replaceAll("\\{\\{kprq}}",new SimpleDateFormat("yyyyMMdd").format(new Date()));
xml = xml.replaceAll("\\{\\{kpsj}}",new SimpleDateFormat("HH:mm:ss").format(new Date()));
......@@ -205,7 +206,7 @@ public class FsRequest {
map.put("invoice_data",xmlBase64);// 电子票据头部、票面信息进行base64编码后内容。
Map<String,String> signInfo = new HashMap<>();
signInfo.put("value",xmlBase64);//对电子票据头部、票面信息的签名值(签名原文为电子票据数据 Header和EInvoiceData内容),base64格式。
signInfo.put("value",FsSignUtil.sign(xml));//对电子票据头部、票面信息的签名值(签名原文为电子票据数据 Header和EInvoiceData内容),base64格式。
signInfo.put("format","DETACH");//签名格式类型,目前固定 DETACH
signInfo.put("algorithm","SM2");//摘要算法,默认SM2
signInfo.put("time",new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));//签名时间
......@@ -217,10 +218,9 @@ public class FsRequest {
if(resp.errorMessage != null) {
return FsResult.fail(resp.errorMessage.errorMsg);
}
if(resp.message != null) {
KpResp kpResp = kaipiaoCx(kpLsh);
kpResp.lsh = kpLsh;
return new FsResult<>(kpResp);
return new FsResult<>(kpLsh);
}
return FsResult.fail("操作错误!" + new Gson().toJson(resp));
......@@ -237,14 +237,20 @@ public class FsRequest {
* @param kpLsh
* @return
*/
private static KpResp kaipiaoCx(String kpLsh) {
public static FsResult<KpResp> kaipiaoCx(String kpLsh) {
String method = "invoice.jiangsu.get";
Map<String,Object> map = new HashMap<>();
map.put("serial_number",kpLsh);
String request = request(method, map);
FsResp<KpResp> resp = new Gson().fromJson(request,new TypeToken<FsResp<KpResp>>() {
}.getType());
return resp.message;
if(resp.errorMessage != null) {
return FsResult.fail(resp.errorMessage.errorMsg);
}
if(resp.message != null && !TextUtils.isEmpty(resp.message.url)) {
return new FsResult<>(resp.message);
}
return FsResult.fail("开票未完成");
}
......
package com.jshx.fstzs.fsutil;
import cn.com.infosec.netsign.agent.NetSignAgent;
import cn.com.infosec.netsign.agent.NetSignResult;
import cn.com.infosec.netsign.agent.exception.NetSignAgentException;
import cn.com.infosec.netsign.agent.exception.ServerProcessException;
import java.net.URL;
import java.security.cert.X509Certificate;
/**
* 财政签名
*/
public class FsSignUtil {
public static String sign(String old) {
try {
URL url = FsSignUtil.class.getResource("");
NetSignAgent.initialize(url.getPath() + "netsignagent.properties");
} catch (NetSignAgentException e) {
e.printStackTrace();
}
try {
//签名原文
byte[] laintext = old.getBytes() ;
//签名证书DN,null表示用服务器默认证书进行签名
String subject = null ;
//摘要算法,null表示用服务器默认的摘要算法
String digestAlg = null ;
//是否做TSA签名
boolean useTSA = false ;
//签名
NetSignResult result = NetSignAgent.detachedSignature(laintext , subject , digestAlg , useTSA ) ;
//获取byte形式的签名结果
byte[] signedText = result.getByteArrayResult( NetSignResult.SIGN_TEXT ) ;
//获取base64编码后的签名结果
return result.getStringResult( NetSignResult.SIGN_TEXT ) ;
} catch (NetSignAgentException e ) {
e.printStackTrace();
System.out.println( "errorCode:" + e.getErrorCode() );
System.out.println( "errorMsg:" + e.getMessage() );
} catch (ServerProcessException e ) {
e.printStackTrace();
System.out.println( "errorCode:" + e.getErrorCode() );
System.out.println( "errorMsg:" + e.getMessage() );
}
return null;
}
/**
* @param old
* @param signedText base64编码的签名
* @param tsaText base64编码的TSA
*/
public static void design(String old,String signedText,String tsaText) {
try {
// 签名原文
byte[] laintext = old.getBytes();
// 是否需要返回签名证书
boolean needCert = false;
// 验签名
NetSignResult result = NetSignAgent.detachedVerify( laintext ,signedText , tsaText , needCert );
// 签名证书主题
result.getStringResult( NetSignResult.SIGN_SUBJECT );
// 签名证书颁发者主题为
result.getStringResult( NetSignResult.SIGN_ISSUER_SUBJECT );
// 签名证书序列号为
result.getStringResult( NetSignResult.SIGN_SER_NUMBER );
// 签名证书起始时间为
result.getStringResult( NetSignResult.SIGN_START_TIME );
// 签名证书终止时间为
result.getStringResult( NetSignResult.SIGN_END_TIME );
// 签名证书
X509Certificate cert = ( X509Certificate ) result
.getResult( NetSignResult.SIGN_CERT );
} catch ( NetSignAgentException e ) {
e.printStackTrace();
System.out.println( "errorCode:" + e.getErrorCode() );
System.out.println( "errorMsg:" + e.getMessage() );
} catch ( ServerProcessException e ) {
e.printStackTrace();
System.out.println( "errorCode:" + e.getErrorCode() );
System.out.println( "errorMsg:" + e.getMessage() );
}
}
}
######server ip######
#ServerIP=192.168.2.248,192.168.2.248
#ServerPort=40019,5555
#测试签名地址↓
ServerIP=172.16.250.115
ServerPort=18005
Timeout=30000,30000
servicetestistest=yes
servicetestinterval=10000
connectionmode=1
CommunicateMode=1
UsedConnectionPool=false
MaxConnections=5
ZipMode=false
MinZipSize=200
encoding=GBK
orderdn=0
gc=0
snmode=1
......@@ -127,8 +127,8 @@ public class FstzsAction extends BaseAction {
paraMap.put("yjje", "%" + yjje + "%");
}
if (fstzs.getIsKp() != null){
paraMap.put("isKp", fstzs.getIsKp());
if (fstzs.getKpState() != null){
paraMap.put("kpState", fstzs.getKpState());
}
if(!TextUtils.isEmpty(kssj)) {
......@@ -260,6 +260,7 @@ public class FstzsAction extends BaseAction {
public String addFstzs() {
FstzsXm dbXm = fstzsXmService.getById(fstzsXm.getId());
//更新数据库项目状态
dbXm.setJsdwmc(fstzsXm.getJsdwmc());
dbXm.setStatus(1);//状态改为已生成、待复核
dbXm.setJbr(this.getLoginUser().getDisplayName());
dbXm.setBeizhu(fstzsXm.getBeizhu());
......@@ -278,22 +279,6 @@ public class FstzsAction extends BaseAction {
dbXm.setBeizhu(dbXm.getBeizhu() + "," + beizhuAppend);
}
fstzsXmService.update(dbXm);
/**
* TODO 删除测试代码
* 上一个走了,再创建个新的
*/
String time = new SimpleDateFormat("yyyyMMddHHmm").format(new Date());
FstzsXm xm = new FstzsXm();
xm.setSlbh("slbh" + time);
xm.setStatus(0);//状态改为已生成、待复核
xm.setYjje("9000");
xm.setKpsjgl(dbXm.getKpsjgl());
xm.setGcxmmc("项目名称" + time);
xm.setJsdwmc("单位名称" + time);
xm.setDelFlag(0);
xm.setPaymentItemPending(dbXm.getPaymentItemPending());
fstzsXmService.save(xm);
return RELOAD;
}
......@@ -360,7 +345,7 @@ public class FstzsAction extends BaseAction {
i.setSlbh(fstzsXm.getSlbh());
i.setLength(fstzsList.size());
i.setIsJk(0);
i.setIsKp(0);
i.setKpState(0);
return i;
}).forEach(i-> fstzsService.save(i));
}
......@@ -465,26 +450,24 @@ public class FstzsAction extends BaseAction {
message = jkList.get(0).getJkr() + "已缴款,无法作废其他!";
}
if(result) {
list.stream().forEach(i-> {
for (Fstzs f : list) {
// 需要调用财政系统,作废接口
if(i.getStatus() != 2) {//已作废的不再重复作废
FsResult<Boolean> zuofei = FsRequest.zuofei(i);
if(f.getStatus() != 2) {//已作废的不再重复作废
FsResult<Boolean> zuofei = FsRequest.zuofei(f);
if(zuofei.success) {
i.setStatus(2);//已作废
fstzsService.update(i);
f.setStatus(2);//已作废
fstzsService.update(f);
} else {
result = false;
message = zuofei.msg;
break;
}
}
}
});
//获取未作废成功的数据
List<Fstzs> failList = list.stream().filter(i -> i.getStatus() != 2).collect(Collectors.toList());
if(failList == null || failList.size() == 0) {//都作废成功,才修改项目状态
if(result) {
xm.setStatus(4);//已作废
fstzsXmService.update(xm);
} else {
result = false;
message = "请重新操作!";
}
}
this.getResponse().getWriter().println("{\"result\":"+result+",\"message\":\"" + message + "!"+"\"}");
......@@ -501,11 +484,30 @@ public class FstzsAction extends BaseAction {
FstzsXm xm = fstzsXmService.getBySlbh(fstzs.getSlbh());
String jbr = this.getLoginUser().getDisplayName();
fstzs.setFstzsXm(xm);
FsResult<KpResp> kaipiao = FsRequest.kaipiao(fstzs, jbr);
FsResult<String> kaipiao = FsRequest.kaipiao(fstzs, jbr);
if(kaipiao.success) {
fstzs.setIsKp(1);
fstzs.setKpState(2);//非同步返回,需要异步查询
fstzs.setKpLsh(kaipiao.data);
fstzs.setKpJbr(jbr);
fstzs.setKpLsh(kaipiao.data.lsh);
fstzsService.update(fstzs);
message = "开票中,请稍后查询!";
} else {
result = false;
message = kaipiao.msg;
}
this.getResponse().getWriter().println("{\"result\":"+result+",\"message\":\"" + message + "!"+"\"}");
}
public void kaipiaoCx() throws IOException {
boolean result = true;
String message = "操作成功";
Fstzs fstzs = fstzsService.getById(id);
FsResult<KpResp> kaipiao = FsRequest.kaipiaoCx(fstzs.getKpLsh());
if(kaipiao.success) {
fstzs.setKpState(1);//修改为开票完成状态
fstzs.setKpTime(kaipiao.data.date);
fstzs.setDzph(kaipiao.data.billNo);
fstzs.setPjdm(kaipiao.data.billBatchCode);
......@@ -515,9 +517,7 @@ public class FstzsAction extends BaseAction {
result = false;
message = kaipiao.msg;
}
this.getResponse().getWriter().println("{\"result\":"+result+",\"message\":\"" + message + "!"+"\"}");
}
/**
......@@ -567,15 +567,10 @@ public class FstzsAction extends BaseAction {
i.setIsJk(1);
i.setJkTime(jiaokuanzt.data.confirmDate);
i.setJkqd(jiaokuanzt.data.paymentChannel);
} else {
try {
FstzsAction.this.getResponse().getWriter().println("{\"result\":"+false+",\"message\":\"" + jiaokuanzt.msg + "!"+"\"}");
} catch (IOException e) {
e.printStackTrace();
}
fstzsService.update(i);
}
return i;
}).forEach(i-> fstzsService.update(i));
}).forEach(i-> System.out.println("查询缴费状态!"));
}
public Pagination getPagination() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment