@caos
2015-09-02T16:14:47.000000Z
字数 4922
阅读 2156
工作
在朔黄项目中的流程审批采用了自动电子签章生成的方法来根据具体的流程记录在润乾报表文件中动态生成用户保存的签章图片,并嵌入到报表中,报表使用了润乾4.5版本的设计器,用户的个人签章图片已经在数据库中存储在 shdcm_signature 表中为BOLB类型的二进制文件,根据此情况,我们一共有两种方式实现自动签章的效果:
SQL
SELECT SS.PICTURE pic
FROM SHDCM_SIGNATURE ss,
(SELECT F.TRANSACT_PERSON_ID
FROM DENO_FLOW_RECORD F, DENO_PAYMENT_RECORD p
WHERE F.DENOMINATE_ID = p.id
AND f.id = (SELECT MAX(f.id)
FROM DENO_FLOW_RECORD F, DENO_PAYMENT_RECORD p
WHERE F.DENOMINATE_ID = p.id
AND F.RECORD_TYPE_ID = 2
and P.YEAR_PERIOD = ?
and p.SEASON_PERIOD = ?
and p.CONTRACT_ID = ?
AND F.TACHE LIKE '%起草申请单%'
)
)E
WHERE SS.OWNER_ID = e.TRANSACT_PERSON_ID
package com.itclub.deno.dianziqianzhang.supervisorPayment;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.runqian.report4.usermodel.CellGraphConfig;
import com.runqian.report4.usermodel.Context;
import com.runqian.report4.usermodel.ICellGraphGenerator;
//工程付款申请流程 施工单位复审
public class FuHe implements ICellGraphGenerator {
/* 数据图层
* (non-Javadoc)
* @see com.runqian.report4.usermodel.ICellGraphGenerator#generate(com.runqian.report4.usermodel.Context, com.runqian.report4.usermodel.CellGraphConfig)
*/
public byte[] generate(Context arg0, CellGraphConfig arg1) {
Connection con1 = null;
byte[] imagebyte=null;
Long uuid=null;
// 读取程序全局添加的数据源
Context initCtx = arg0;//全局context
//String defDsName="report"; //数据源名
String defDsName = initCtx.getDefDataSourceName();
java.util.Map paramMap = initCtx.getParamMap(false);
System.out.println(paramMap);
String contractId=(String)paramMap.get("contract_id");
String year=(String)paramMap.get("year");
String season=(String)paramMap.get("season");
String seasonTime=(String)paramMap.get("season_time");
List<Object> uuidList = getUuid(contractId,year,season,seasonTime,defDsName,arg0);
if(uuidList!=null&&uuidList.size()>0){
uuid = (Long) uuidList.get(0);
}
try {
con1 = initCtx.getConnectionFactory(defDsName).getConnection();
} catch (Exception e) {
System.out.println( "[ConnectionManager] - 获取数据库连接失败" );
e.printStackTrace();
}
ResultSet rs1=null;
Statement stmt1=null;
String sql1="select picture ,ID from shdcm_signature where owner_id="+uuid+" and owner_type=680 ORDER BY ID DESC"; //得到签字图片
try {
stmt1 = con1.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs1=stmt1.executeQuery(sql1);
System.out.println(rs1.getRow());
if (rs1.next()) {
// BLOB blob = (BLOB) rs1.getBlob("picture");
Long id = rs1.getLong("id");
System.out.println(id);
Blob blob = rs1.getBlob("picture");
System.out.println(blob);
InputStream stream = blob.getBinaryStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for(int b; (b=stream.read())>=0;){
baos.write(b);
}
imagebyte = baos.toByteArray();
System.out.println("获取二进制数据库完成");
}
else imagebyte =null; //如果状态位state=0 或者记录为空则返回null图片
rs1.close();
stmt1.close();
con1.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return imagebyte;
}
private List<Object> getUuid(String contractId, String year, String season, String seasonTime,String defDsName, Context arg0) {
Connection con = null;
Context initCtx = arg0;//全局context
List<Object> uuidList = new ArrayList<Object>();
try {
con = initCtx.getConnectionFactory(defDsName).getConnection();
} catch (Exception e) {
System.out.println( "[ConnectionManager] - 获取数据库连接失败" );
e.printStackTrace();
}
ResultSet rs=null;
Statement stmt=null;
String sql1="SELECT F.TRANSACT_PERSON_ID FROM DENO_FLOW_RECORD F WHERE F.ID = " +
" (SELECT MAX(F.ID) FROM DENO_FLOW_RECORD F, DENO_PAYMENT_RECORD R WHERE F.DENOMINATE_ID = R.ID " +
" AND F.RECORD_TYPE_ID = 2 AND R.CONTRACT_ID = "+contractId+" AND R.YEAR_PERIOD = "+year+
" AND R.SEASON_PERIOD = "+season+" and R.CONTRACT_TYPE_ID = 717"+
" and R.payment_season_time = "+seasonTime+" AND F.TACHE like '%监理单位复审%')";
try {
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs=stmt.executeQuery(sql1);
if (rs.next()) {
Long uuid = rs.getLong(1);
uuidList.add(uuid);
}
rs.close();
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return uuidList;
}
}
这两点都能够通过sql查询的方式获得用户的图片签章文件,不过两者同样使用流程任务的任务节点名称作为过滤条件查询对应的签章。
/*施工付款单
*总数据集
*/
SELECT SS.PICTURE pic,
e.transact_date "处理时间",
e.transact_person_id,
e.transact_opinion "审批意见",
e.transact_unit_name
FROM SHDCM_SIGNATURE ss,
(SELECT F.TRANSACT_PERSON_ID,
f.transact_date,
f.transact_opinion,
f.transact_unit_name
FROM DENO_FLOW_RECORD F, DENO_PAYMENT_RECORD p
WHERE F.DENOMINATE_ID = p.id
AND f.id = (SELECT MAX(f.id)
FROM DENO_FLOW_RECORD F, DENO_PAYMENT_RECORD p
WHERE F.DENOMINATE_ID = p.id
AND F.RECORD_TYPE_ID = 2
and P.YEAR_PERIOD = ?
and p.SEASON_PERIOD = ?
and p.CONTRACT_ID = ?
and p.payment_season_time = ?
AND F.TACHE LIKE '%分公司领导_审批%'
)
)E
WHERE SS.OWNER_ID = e.TRANSACT_PERSON_ID
/*部门字段*/
=if(fengognsilingdaoQZ.select(transact_unit_name)==null,'分公司领导审批',fengognsilingdaoQZ.select(transact_unit_name))
/*审批意见*/
=" "+fengognsilingdaoQZ.select(审批意见)
/*签章*/
=fengognsilingdaoQZ.select(pic)
/*审批时间*/
=year(fengognsilingdaoQZ.select(处理时间))+"年"+month(fengognsilingdaoQZ.select(处理时间))+"月"+day(fengognsilingdaoQZ.select(处理时间))+"日"