1、关于盖章的说明
a、先取终版文件,再取盖章终版文件,如果盖章动作触发时,盖章终版文件有值,那么会将盖章终版文件传给后端接口去盖章。
如果盖章终版文件没有值,则会取终版文件去盖章,该逻辑为了适应多人多次盖章情况。
b、盖章位置的确定为关键字和偏移坐标共同确定,如需修改关键字,则修改建模【电子签章】配置信息,如需修改偏移量请参照
【2、关于配置信息】中的offset参数的值。
c、维护建模信息时,注意必要信息必须有。签章时根据流程id(workflowid)、当前操作者去查询对应唯一的签章的sn、终版文件数据库字段名、盖章终版文件数据库字段名、签章关键字这些信息。目前建模维护信息只能适配一人一章情况,一人多章暂不支持。
d、盖章后的文件目录和终版文件的目录是一致的。权限请根据实际需要调整知识目录的默认共享权限。
1.1、建模维护的签章必要信息
必要信息如图:
**流程id:**代码中已适配多版本流程id,流程存新版后无需修改。
**签章人姓名:**对应流程中点击签章按钮的操作者。
**终版文件:**表示的是对应流程中的终版文件的数据库字段名。
**盖章终版文件:**表示的是对应流程中的盖章终版文件的数据库字段名。
**签章SN:**签章系统提供。
关键字:必须和要盖章的文件中的关键字一致,例如:关键字维护的是市文明办,那么对应盖章文件中的关键字也需要是市文明办。因为签章会根据关键字模糊匹配,避免出现错乱。
2、配置部署说明
2.1、关于配置信息
配置文件为:ecology/WEB-INF/prop/wn_casign.properties
offset:该值为全局统一,如果盖章无法水平垂直对齐,需要调整盖文件中的关键字水平中心线的对齐。
#签章服务地址 根据实际填写
host=
# 签章提供的 client_id
client_id=aGViY2FfdGVzdDpoZWJjYUAyMDIz
# 默认1 1为pdf签章 2为ofd签章
signtype=1
# 需签章或者批注页码,例如1,2,3等,0代表所有页,n代表最后一页,页码从1开始
page=0
#章的偏移坐标
offset=-50,-50
#0:坐标定位;1:关键字定位
type=1
#如果印章对应的服务端证书,设置了认证,则必须提供。暂时不需要填
authCode=
2.2、表单代码块
2.2.1、插入代码块
表单代码块代码位置:ecology/weavernorth/ca/签章节点js代码块.html,将文件用文本文档打开,全选粘贴到表单需要签章节点
的代码块中,注意不要同步节点,避免不必要的问题。
2.2.2、配置盖章按钮
在表单设计器需要加盖章按钮的位置右键单元格-自定义属性,设置id、name的值为gz。注意id、name必须是gz
3、核心代码逻辑
package engine.casign;
import cn.hutool.json.JSONObject;
import weaver.conn.RecordSet;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
import weaver.integration.logging.Logger;
import weaver.integration.logging.LoggerFactory;
import weavernorth.ca.signutil.SignUtil;
import weavernorth.ca.signutil.WorkflowUtil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
/**
* @Classname CASignNatureWebAction
* @Description 签章后端服务API
* @Version 1.0.0
* @Date 2023/9/8 10:24
* @Created by
*/
public class CASignNatureWebAction {
private Logger log = LoggerFactory.getLogger(CASignNatureWebAction.class);
@POST
@Path("/sign")
@Produces(MediaType.APPLICATION_JSON)
public JSONObject caSign(@Context HttpServletRequest request, @Context HttpServletResponse response) {
JSONObject result = new JSONObject();
try {
User user = HrmUserVarify.getUser(request, response);
if (user == null) {
result.put("code", "E");
result.put("msg", "当前用户获取失败!");
return result;
}
String workflowid = request.getParameter("workflowid");
if ("".equals(workflowid) || workflowid == null) {
result.put("code", "E");
result.put("msg", "workflowid未获取到!");
return result;
}
String requestid = request.getParameter("requestid");
if ("".equals(requestid) || requestid == null) {
result.put("code", "E");
result.put("msg", "requestid未获取到!");
return result;
}
String docid = request.getParameter("docid");
if ("".equals(docid) || docid == null) {
result.put("code", "E");
result.put("msg", "盖章文件id未获取到!");
return result;
}
JSONObject signPropObj = SignUtil.getSignProp(workflowid, user.getUID() + "");
if (signPropObj.size() <= 0) {
result.put("code", "E");
result.put("msg", "无法获取对应签章信息,请检查建模相关配置");
return result;
}
String qzsn = signPropObj.getStr("qzsn");
String qzgjz = signPropObj.getStr("qzgjz");
JSONObject signResultObj = SignUtil.CASignNature(qzsn, qzgjz, workflowid, Integer.parseInt(docid), user);
log.info("signResultObj{}:" + signResultObj);
if ("S".equals(signResultObj.getStr("code"))) {
String updateDocid = signResultObj.getStr("data");
String mainTableName = WorkflowUtil.getTableNameByWFid(workflowid);
//终版盖章文件的数据库字段名
String gzzbwj_DataBaseFieldName = signPropObj.getStr("gzzbwj");
RecordSet rs = new RecordSet();
String sql = "update " + mainTableName + " set " + gzzbwj_DataBaseFieldName + "='" + updateDocid + "' where requestid=?";
if (rs.executeUpdate(sql, requestid)) {
result.put("code", "S");
result.put("msg", "签章逻辑处理成功!");
return result;
}
} else {
result.put("code", "E");
result.put("msg", "签章失败,请联系管理员!");
return result;
}
} catch (Exception e) {
e.printStackTrace();
log.error("签章动作异常", e);
result.put("code", "E");
result.put("msg", "签章异常," + e.getMessage() + ",请联系管理员!");
return result;
}
return result;
}
}