当前位置: 代码网 > it编程>数据库>MsSqlserver > 泛微E9二次开发资料完整总结版

泛微E9二次开发资料完整总结版

2024年08月01日 MsSqlserver 我要评论
这是一个简单的流程图对应实际的流程流转过程该接口主要实现在流程的流转当中,实时通过自定义的动作去操作异构形体系统的数据或者是其他一些特定的操作。在流程的每个出口或者节点都可以定义这样的自定义动作,从而实现在流程流转过程导入,导出流程的相关信息,或者将流程信息和其他应用相结合进行数据交互。注意自定义接口动作代码在退回到第一节点前是生效的,创建时不会生效编写Action新建Action实现类必须实现接口方法。//自定义参数1 public String p2;

1、ec9系统说明

如需本地版本,请移步下载资源
https://download.csdn.net/download/u010048119/86444408?spm=1001.2014.3001.5503

1.1、系统核心框架

image-20220315110246299

  • 后端增加了分层、aop、ioc、interceptor的支持
  • 新架构要求service和command层必须面向接口编程, 同时通过ioc和命令委托方式进行各层的解耦
  • 新架构还提供全局interceptor和局部interceptor、service-aop、command-aop的支持,可以进行比如日志记录、声明性事务、安全性,和缓存等等功能的实现和无侵入二开

image-20220315151709001

1.2、系统目录结构

weaver

ecology
classbean 存放编译后的class文件
web-inf
lib 系统依赖jar文件目录
prop 系统配置文件存放

2、环境搭建

2.1、ecology测试环境搭建

步骤1:从服务器上拷贝weaver/ecology代码
从服务器拷贝ecology相关代码到本地,目录服务器上文件如下图,需拷贝ecologyresin/resin4,如果本机已安装jdk则可以不需拷贝jdk

image-20210917145946880

步骤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、后端代码目录结构

image-20220523143556166

image-20220523143645054

image-20220523143712127

image-20220523143752345

image-20220523143817623

image-20220523143839332

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

后台设置
路径:集成中心-功能集成数据源设置

image-20210916113553525

程序调用

//引入相关的类
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、流程流转过程理解

image-20220315143624985

image-20220315143451919

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

image-20210916130452425

image-20210916130508262

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() {
       //实际执行的业务逻辑
    } 
}

配置计划任务

image-20210916144519498

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

自定义接口配置:

image-20210917145023378

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文件中左侧标识)
loginidoa登录账号
返回值说明用户登录令牌
令牌生成规则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、获取系统配置的访问地址

image-20220325171431255

 systemcominfo system = new systemcominfo();
//oa访问地址
string intranet = system.getoaaddress();

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com