文章目录
1、ec9系统说明
如需本地版本,请移步下载资源
https://download.csdn.net/download/u010048119/86444408?spm=1001.2014.3001.5503
1.1、系统核心框架
- 后端增加了分层、aop、ioc、interceptor的支持
- 新架构要求service和command层必须面向接口编程, 同时通过ioc和命令委托方式进行各层的解耦
- 新架构还提供全局interceptor和局部interceptor、service-aop、command-aop的支持,可以进行比如日志记录、声明性事务、安全性,和缓存等等功能的实现和无侵入二开
1.2、系统目录结构
weaver
ecology
classbean
存放编译后的class文件
web-inf
lib
系统依赖jar文件目录
prop
系统配置文件存放
2、环境搭建
2.1、ecology测试环境搭建
步骤1:从服务器上拷贝weaver/ecology代码
从服务器拷贝ecology
相关代码到本地,目录服务器上文件如下图,需拷贝ecology
、resin/resin4
,如果本机已安装jdk
则可以不需拷贝jdk
步骤2:代码复制至本地d:/weaver 文件夹下
步骤3:备份ecology数据库,还原到本地或测试数据库
请一定要记得修改数据库配置文件中的数据库配置
,否则搭建的开发环境也是连接到正式库,那就很有可能会导致正式库中的数据出错
配置文件:d:/weaver/ecology/web-inf/prop/weaver.properties
sqlserver
driverclasses = com.microsoft.sqlserver.jdbc.sqlserverdriver
ecology.url = jdbc:sqlserver://192.168.4.246:1433;databasename=ecology60
ecology.user = sa
ecology.password = ecology
oracle
driverclasses = oracle.jdbc.oracledriver
ecology.url = jdbc:oracle:thin:@192.168.4.238:1521:ecology
ecology.user = nmsy
ecology.password = ecology
2.2、后端开发环境搭建
https://e-cloudstore.com/doc.html?appid=c6a9ae6e47b74d4da04c935ed51d177a
2.3、ecode使用说明
https://e-cloudstore.com/doc.html
2.4、e9技术站
https://e-cloudstore.com/e9/index2.html
2.5、后端代码目录结构
3、数据存储
3.1、流程数据存储
常用流程相关存储说明,详情见表结构说明文档
数据库表名 | 中文说明 |
---|---|
workflow_base | 流程基本信息 |
workflow_bill | 流程表单信息 |
workflow_billfield | 表单字段信息 |
workflow_nodebase | 节点信息 |
workflow_currentoperator | 请求节点操作人 |
workflow_requestlog | 请求签字意见 |
workflow_nownode | 请求当前节点 |
workflow_selectitem | 下拉框信息 |
3.2、人力资源相关数据存储
以下只列举一些常用表结构,更多表结构参考表建构文档。
表名 | 说明 |
---|---|
hrmresource | 人力资源基本信息表 |
hrmresourcemanager | 系统管理员信息表 |
hrmdepartment | 人力资源部门表 |
hrmsubcompany | 人力资源分部表 |
hrmjobtitles | 岗位信息表 |
3.3、文档相关相关数据存储
以下只列举一些常用表结构,更多表结构参考表建构文档。
表名 | 说明 |
---|---|
docdetail | 文档信息表 |
docimagefile | 文档附件图片表 |
imagefile | 文件存放信息表 |
docshare | 文档共享信息表 |
docseccategory | 文档子目录表 |
4、数据源 datasource
后台设置
路径:集成中心
-功能集成
– 数据源设置
程序调用
//引入相关的类
import java.sql.connection;
import java.sql.resultset;
import java.sql.sqlexception;
import weaver.general.basebean;
import weaver.general.staticobj;
import weaver.interfaces.datasource.datasource;
//调用数据源生成jdbc链接
datasource ds = (datasource)staticobj.getservicebyfullname(("datasource.nc"),datasource.class);
//local为配置的数据源标识
connection conn = null ;
try{
conn = ds.getconnection();
resultset rs = conn.createstatement().executequery("select top 10 lastname,password from hrmresource");
while(rs.next()){
system.out.println("name-->"+rs.getstring("lastname")+" pwd-->"+rs.getstring("password"));
}
rs.close();
}catch(exception e){
writelog(e);
}finally{
try {
conn.close();
} catch (sqlexception e) {
}
}
5、流程自定义接口动作
5.1、流程流转过程理解
5.2、自定义接口动作示例代码
该接口主要实现在流程的流转当中,实时通过自定义的动作去操作异构形体系统的数据或者是其他一些特定的操作。
在流程的每个出口或者节点都可以定义这样的自定义动作,从而实现在流程流转过程导入,导出流程的相关信息,或者将流程信息和
其他应用相结合进行数据交互。
注意自定义接口动作代码在退回到第一节点前是生效的,创建时不会生效
编写action
新建action
实现类必须实现接口weaver.interfaces.workflow.action
方法
public string execute(requestinfo request)
。
package weaver.interfaces.workflow.action;
import weaver.general.basebean;
import weaver.soa.workflow.request.detailtableinfo;
import weaver.soa.workflow.request.maintableinfo;
import weaver.soa.workflow.request.property;
import weaver.soa.workflow.request.requestinfo;
public class testaction extends basebean implements action {
public string p1; //自定义参数1
public string p2; //自定义参数2
public string getp1() {
return p1;
}
public void setp1(string p1) {
this.p1 = p1;
}
public string getp2() {
return p2;
}
public void setp2(string p2) {
this.p2 = p2;
}
public string execute(requestinfo requestinfo) {
system.out.println("进入action requestid="+requestinfo.getrequestid());
//请求id
string requestid = requestinfo.getrequestid();
//请求紧急程度
string requestlevel = requestinfo.getrequestlevel();
//当前操作类型 submit:提交/reject:退回
string src = requestinfo.getrequestmanager().getsrc();
//流程id
string workflowid = requestinfo.getworkflowid();
//表单名称 主表
string tablename = requestinfo.getrequestmanager().getbilltablename();
// tablename 中的id
int billid = requestinfo.getrequestmanager().getbillid();//表单数据id
//获取当前操作用户对象
user usr = requestinfo.getrequestmanager().getuser();
//请求标题
string requestname = requestinfo.getrequestmanager().getrequestname();
//当前用户提交时的签字意见
string remark = requestinfo.getrequestmanager().getremark();
//表单id
int formid = requestinfo.getrequestmanager().getformid();
//是否是自定义表单
int isbill = requestinfo.getrequestmanager().getisbill();
//取主表数据
property[] properties = request.getmaintableinfo().getproperty();
// 获取表单主字段信息
for (int i = 0; i < properties.length; i++) {
// 主字段名称
string name = properties[i].getname();
// 主字段对应的值
string value = util.null2string(properties[i].getvalue());
system.out.println(name + " " + value);
}
//取明细数据
detailtable[] detailtable = request.getdetailtableinfo().getdetailtable();
if (detailtable.length > 0) {
// 获取所有明细表
for (int i = 0; i < detailtable.length; i++) {
// 指定明细表
detailtable dt = detailtable[i];
// 当前明细表的所有数据,按行存储
row[] s = dt.getrow();
for (int j = 0; j < s.length; j++) {
// 指定行
row r = s[j];
// 每行数据再按列存储
cell c[] = r.getcell();
for (int k = 0; k < c.length; k++) {
// 指定列
cell c1 = c[k];
// 明细字段名称
string name = c1.getname();
// 明细字段的值
string value = c1.getvalue();
system.out.println(name + " " + value);
}
}
}
}
//控制流程流转,增加以下两行,流程不会向下流转,表单上显示返回的自定义错误信息
requestinfo.getrequestmanager().setmessageid(system.currenttimemillis() + "");
requestinfo.getrequestmanager().setmessagecontent("返回自定义的错误信息");
//必须返回false,否则流程会提交下去
failure_and_continue;
system.out.println("action执行完成 传入参数p1="+this.getp1()+" p2="+this.getp2());
//return返回固定返回`success`
return success ;
}
}
6、流程表单代码块
7、发布webservice
编写接口和实现类
编写接口
/**
* 自定义的webservice接口
*/
package weaver.oatest.webservices;
public interface testservice {
/**
* 输出接收的参数
* @param param
* @return
*/
public string testmethod(string... param);
}
实现类
package weaver.oatest.webservices;
import org.apache.commons.lang.stringutils;
import weaver.general.basebean;
public class testserviceimpl extends basebean implements testservice {
public string testmethod(string... param) {
return "接收到的参数为:"+stringutils.join(param,",");
}
}
发布接口
修改==./ecology/classbean/meta-inf/xfire/services.xml==文件增加要发布的接口,增加下面内容 :
name:为接口名称
namespace:命名空间
serviceclass:接口的报名加类名
implementationclass:接口的实现包名加类名`
<service>
<name>testservice</name>
<namespace>webservices.test.weaver.com.cn</namespace>
<serviceclass>weaver.oatest.webservices.testservice</serviceclass>
<implementationclass>weaver.oatest.webservices.testserviceimpl</implementationclass>
</service>
8、计划任务 cronjob
cronjob
接口,此接口在指定的时间点执行 ,basecronjob
是系统默认的实现了cronjob
的实现类,可以直接继承。
在开发调度动作需要实现e-cology提供的自定义动作接口。
package weaver.interfaces.schedule;
import weaver.conn.recordset;
import weaver.workflow.request.mailandmessage;
import java.util.arraylist;
public class syncrequesttitlejob extends basecronjob {
public void execute() {
//实际执行的业务逻辑
}
}
配置计划任务

9、自定义短信接口
9.1、短信接口
短信集成需要实现接口
package weaver.interfaces.sms;
import weaver.general.timeutil;
import weaver.sms.smsservice;
public class testsms implements smsservice {
//smsid 没用
//phoneno 手机号
//msg 短信内容
public boolean sendsms(string smsid, string phoneno, string msg) {
//实现相应的短信平台的api进行发送
dosend(phoneno,msg);
return true;
}
}
自定义接口配置:
9.2、消息接口
https://www.showdoc.com.cn/p/f217b01ce7c26aa9303ab93fe74eccb7
10、restful创建流程接口&鉴权
https://e-cloudstore.com/ec/api/applist/index.html#/
11、组织结构同步
https://e-cloudstore.com/doc.html?appid=c373a4b01fb74d098b62e2b969081d2d
12、免密登录oa
12.1、前提条件
12.2、oa系统检查配置
12.2.1、接口发布相关
在ecology\web-inf\web.xml最后面配置,如果有该配置,请忽略
<servlet>
<servlet-name>gettoken</servlet-name>
<servlet-class>weaver.weaversso.gettoken</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gettoken</servlet-name>
<url-pattern>/ssologin/gettoken</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>checktoken</servlet-name>
<servlet-class>weaver.weaversso.checktoken</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>checktoken</servlet-name>
<url-pattern>/ssologin/checktoken</url-pattern>
</servlet-mapping>
在ecology\web-inf\web.xml中配置:(需要放在安全补丁包的后面)
<filter>
<filter-name>weaverloginfilter</filter-name>
<filter-class>weaver.weaversso.weaverloginfilter</filter-class>
</filter>
<filter-mapping>
<filter-name>weaverloginfilter</filter-name>
<url-pattern>*.html</url-pattern>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
12.2.2、集成的应用配置相关
需要配置ecology\web-inf\prop\weaverloginclient.properties文件ssss=127.0.0.1
##12.3、获取token的接口
功能说明 | 获取用户登录token |
---|---|
接口地址 | http://oa的pc端访问地址/ssologin/gettoken |
调用方式 | post |
参数说明 | |
---|---|
appid | 应用标识(weaverloginclient.properties文件中左侧标识) |
loginid | oa登录账号 |
返回值说明 | 用户登录令牌 |
---|---|
令牌生成规则 | aes(loginid+“|”+ts+“|”+appid) |
生成的令牌要保存到数据库中securityfilter里需要配置第三方访问oa的服务器白名单,方能确保该方案正常使用
请检查ecology\web-inf\weaver_security_config.xml文件是否有is-login-check配置,若没有,则添加;若有,请调整为false
<is-login-check>false</is-login-check>
token参数只有一次有效,若已被使用,再次使用时,会直接跳转到oa登录页面。
12.3.1、postman请求示例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uxtlrjk7-1679280813349)(e9开发培训.assets/2bdb329b-4aef-4c6b-a00e-bf9e1608d9e0-164969218392812.png)]
12.4、单点登录跳转地址拼接
###12.4.1、pc下的地址拼接
携带拼接ssotoken时,注意拼接位置,e9的很多页面是单页面,不要拼在#路由地址后面,如:
http://192.168.95.101:8088/wui/index.html#/main?ssotoken=xxx
这是错的,需要这样拼:
http://192.168.95.101:8088/wui/index.html?ssotoken=xxx#/main
测试例子:
oa中人员cs001有requestid=5074的流程,对于pc端,流程路径配置:
将上面获取到token值拼接到地址中:
http://192.168.95.101:8088/spa/workflow/index_form.jsp?ssotoken=b4e721ccc7f210d5a44b3f5af2046315bc314d205967e6911fca4361bba5851a#/main/workflow/req?requestid=5074
直接访问,可直接单点登录进入流程页面:
12.4.2、em7的地址拼接
重新申请token值,进行拼接:
http://192.168.95.101:8088/spa/workflow/static4mobileform/index.html?ssotoken=9b3e7c2d58fed69547850d7002549c80541ed138ee450c17c75b25a9996fc846#/req?requestid=5074
移动端访问,也可直接单点登录打开流程页面:
13、注意事项
13.1、system.out
13.2、basebean
import weaver.general.basebean;
basebean basebean = new basebean();
//日志打印
basebean.writelog("xxx");
//读取.properties配置文件的值
//.properties配置文件路径 /ecology/web-inf/prop目录下
basebean.getpropvalue("配置文件名(不含.properties)","键名");
13.3、数据库操作
13.3.1、recordset和recordsettrans
现在提供以下两个方法来替代execute和executesql。
方法名 | 参数 | 说明(示例) |
---|---|---|
executequery(string sql,object… params) | sql:待执行的sql语句params:用于替换sql中的?的参数,可以是0个或多个 | 该方法用于查询,recordset中执行完毕后会返回true|false, recordsettrans执行失败会抛出异常。同时会保留结果集供使用。 遍历结果集的方法和executesql执行后遍历一样。 示例: rs.executequery(“select id,loginid from hrmresource where lastname like ?”,”%王%”)rs.executequery(“select id,loginid from hrmresource where lastname like ? and seclevel >= ?”,”%王%”,30) |
executeupdate(string sql,object… params) | sql:待执行的sql语句params:用于替换sql中的?的参数,可以是0个或多个 | 该方法用于更新记录 recordset中执行完毕后会返回true|false, recordsettrans执行失败会抛出异常。 示例: rs.executeupdate(“insert into hrmresource(loginid,lastname) values(?,?)”,”wangxin”,”王鑫”) rs.executeupdate(“delete from hrmresource where id=?”,id) |
13.3.2、数据库使用事务
使用 weaver.conn.recordsettrans 可以对数据库进行事务操作
参考代码
recordsettrans rst = new recordsettrans();
// 开启事务
rst.setautocommit(false);
string sql = "update hrmresource lastname=? where id=?";
try {
int a = 1/0;
rst.executeupdate(sql, "猪八戒", 2);
// 提交事务
rst.commit();
} catch (exception e) {
e.printstacktrace();
// 事务回滚
rst.rollback();
}
13.3、获取系统配置的访问地址
systemcominfo system = new systemcominfo();
//oa访问地址
string intranet = system.getoaaddress();
发表评论