泛微OA有关开发功能记录
本地开发环境搭建
安装Ecology9.0.exe
正常安装流程,设置参数配置
注意点:指定JDK1.8,JDK路径为已经配置好的JDK路径
eg: E:\environment\jdk
安装 Resin4 服务
双击启动,中途有可能安装.net相关依赖
进入地址:localhost:80配置数据库
修改产品安装验证码
连接数据库地址,初始化数据库
需要修改mysql的ini文件的配置
1 |
|
数据表创建完成后,进入登录页面卡死,可以先停止Resin,在重新start,等着比较慢可以按空格,之后进入localhost:80页面直到进入登录界面
创建项目
创建工程
- 打开idea,new Project,选择一个Java项目,路径选择安装Ecology9.0.exe的路径
压缩文件
复制到
设置编译后的class文件路径
设置类库
注意这边设置lib类库:对应的路径在Classes可看到
安装Resin服务插件支持
设置源文件夹
一般情况下,部署的产品的ecology文件夹中没有src文件夹,需要手工增加。
在【Project Structure】界面点击【Modules】,点【Sources】选择src目录。如果没有src目录就先在项目中创建。
注意点:
项目启动Resin时,注意要关闭服务中的Resin服务
当项目启动报错
要先看下项目路径D:\WEAVER\ecology\classbean是否有对应文件,如果没有,将最开始的classbean.zip在该文件夹下解压
重新初始化数据库该如何操作
清除weaver.properties内容,重启项目,会自动进入重新初始化数据库界面。
定时任务
- 进入后端应用中心
- 点击集成中心
- 点击计划任务设置定时任务(设置类的全限定类名)
定时任务类
- 在src目录下创建对应的类去继承BaseCronJob,重写execute方法
数据库操作
事务有关处理(这样可以事务回滚)
1 |
|
获取数据表主键id
1 |
|
获取数据库多条数据
1 |
|
OA的GetDataUtil
1 |
|
OA的LogUtil
1 |
|
流程错误在流程页面显示报错信息
主要在catch中设置如下代码
1 |
|
流程处理
- ecology系统配置
- 配置接口白名单
- 发放/生成许可证(appid)
- 外部系统编码实现认证(RSA加密)
- 向oa系统发送许可证信息进行认证(这个接口参数loginid和pwd就是oa系统的登录名和密码)
- 获取token(注册认证返回的spk作为密钥,加密返回的secret生成新的secret作为参数)
- 开始调用对应的系统业务接口(比如流程等,这里用到的userid是hrmresource表的id通过认证返回的spk密钥加密)
步骤
创建类继承BaseAction,重写execute方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180package com.action;
import cn.hutool.http.HttpException;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import com.alibaba.fastjson.JSON;
import com.constant.WorkFlowConstant;
import com.entity.dto.CrmApiConstant;
import com.entity.vo.CrmCustomerBackLog;
import com.util.*;
import lombok.extern.slf4j.Slf4j;
import weaver.conn.RecordSet;
import weaver.hrm.User;
import weaver.interfaces.workflow.action.BaseAction;
import weaver.soa.workflow.request.MainTableInfo;
import weaver.soa.workflow.request.Property;
import weaver.soa.workflow.request.RequestInfo;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
/**
* @description: CRM客分部信息流程返回
*/
@Slf4j
public class CrmKfbBackAction extends BaseAction {
@Override
public String execute(RequestInfo requestInfo) {
if(requestInfo == null || requestInfo.getMainTableInfo() == null || requestInfo.getMainTableInfo().getPropertyCount() == 0 ){
//assert 封装的方法 判断对象是否为空
assert requestInfo != null;
requestInfo.getRequestManager().setMessageid("leaveAction");
requestInfo.getRequestManager().setMessagecontent("未获取到表单信息!");
return "0";
}
String nextNodeType = requestInfo.getRequestManager().getNextNodetype();
//当前操作类型 submit:提交/reject:退回 审批节点或审批类型
String src = requestInfo.getRequestManager().getSrc();
boolean b = src.equals(WorkFlowConstant.WORK_FLOW_SUBMIT_TYPE) || src.equals(WorkFlowConstant.WORK_FLOW_INTERVENOR_TYPE);
//判断是提交或者归档没有下一个节点人,则直接返回
if(b && StringUtils.isEmpty(nextNodeType)){
return "1";
}
//记录日志
CrmCustomerBackLog crmCustomerBackLog = new CrmCustomerBackLog();
JSONObject json = new JSONObject();
//请求类型 客分部
crmCustomerBackLog.setRequestType("2");
//备注 审批意见
String remark = requestInfo.getRequestManager().getRemark();
//传递参数
String param=null;
try{
crmCustomerBackLog.setRequestId(requestInfo.getRequestid());
crmCustomerBackLog.setWorkFlowId(requestInfo.getWorkflowid());
//获取当前操作用户对象
User user = requestInfo.getRequestManager().getUser();
//请求标题
String requestname = requestInfo.getRequestManager().getRequestname();
//获取当前用户提交时的签字意见
String status2 = requestInfo.getRequestManager().getStatus();
String lastOperator = requestInfo.getLastoperator();
log.info("remark="+remark);
if (StringUtils.isEmpty(remark)){
remark="";
}
log.info("usr=" + JSON.toJSONString(user));
log.info("requestname=" + requestname);
log.info("status=" + status2);
log.info("lastOperator=" + lastOperator);
log.info("CrmKfbBackAction-src=" + src);
//获取主表信息
MainTableInfo main = requestInfo.getMainTableInfo();
//主表字段
Property[] property = main.getProperty();
//获取对应的字段去返回
//客分部编号
String kfbbh = RequestInfoUtils.getPropertyByName(property , "kfbbh");
//客分部id
String divisionId = RequestInfoUtils.getPropertyByName(property , "kfbid");
//审批人
String approvalUserName = user.getLastname();
byte status;
if (b){
//正常提交
status=8;
}else{
status=2;
if (StringUtils.isEmpty(remark)){
remark = "审批不通过,请联系审核员确认";
}
}
//获取当前操作者的id
String approverID = user.getLoginid();
//先去登录
JSONObject loginJson = new JSONObject();
loginJson.set("userName",CrmApiConstant.USERNAME);
loginJson.set("userPassword",CrmApiConstant.PASSWORD);
String loginResult="";
try {
loginResult = HttpUtil.createPost(CrmApiConstant.LOGIN_URL).addHeaders(null).body(String.valueOf(loginJson)).execute().body();
} catch (HttpException e) {
log.info("登录失败,异常信息:"+e.getMessage());
e.printStackTrace();
}
log.info("登录回调返回信息:"+loginResult);
Map<String, String> headerMap = new HashMap<>();
com.alibaba.fastjson.JSONObject loginJsonObject = com.alibaba.fastjson.JSONObject.parseObject(loginResult);
if (!loginJsonObject.get("success").toString().equals("true")){
//代表登录失败
crmCustomerBackLog.setResult("请求异常,CRM登录返回调用异常" + loginResult);
}else{
//登录成功 获取token
com.alibaba.fastjson.JSONObject data = com.alibaba.fastjson.JSONObject.parseObject(loginJsonObject.get("data").toString());
String accessToken = data.get("access_token").toString();
headerMap.put("Authorization",accessToken);
}
json.set("divisionCode",kfbbh);
json.set("divisionId",divisionId);
json.set("approvalUserName", approvalUserName);
json.set("remark", remark);
json.set("approvalType", src);
log.info("封装的JSON数据:"+json);
param = String.valueOf(json);
crmCustomerBackLog.setCreateBy(approverID);
String result;
try {
//执行请求到客分部
crmCustomerBackLog.setRequestUrl(CrmApiConstant.KFB_URL);
result = HttpUtil.createPost(CrmApiConstant.KFB_URL).addHeaders(headerMap).body(String.valueOf(json)).execute().body();
}catch (Exception e){
result = "请求CRM客分部异常,异常信息:" + e.getMessage();
crmCustomerBackLog.setStatus("2");
}
log.info("CRM客分部回调result = " + result);
if(StringUtils.isEmpty(result)){
crmCustomerBackLog.setResult("请求异常,CRM客户分部接口返回为空");
crmCustomerBackLog.setStatus("2");
}
com.alibaba.fastjson.JSONObject resultJson = com.alibaba.fastjson.JSONObject.parseObject(result);
log.info("转换为json后resultJson = " + JSON.toJSONString(resultJson));
if (!resultJson.get("success").toString().equals("true")){
//失败
crmCustomerBackLog.setResult("请求异常,CRM客分部返回调用异常" + resultJson);
crmCustomerBackLog.setStatus("2");
}else{
//成功
crmCustomerBackLog.setResult(result);
crmCustomerBackLog.setStatus("1");
}
}catch (Exception e){
crmCustomerBackLog.setResult(e.getMessage());
crmCustomerBackLog.setStatus("2");
log.error("流程触发发生异常="+e);
}finally {
crmCustomerBackLog.setRemark(src + remark);
crmCustomerBackLog.setParam(param);
log.info("流程触发进入新增");
log.info("crmCustomerBackLog="+JSON.toJSONString(crmCustomerBackLog));
String insertSql = "INSERT INTO crm_customer_back_log (request_id , work_flow_id , request_url , remark , param , result , status ,request_type, create_by , create_time) VALUES(? , ? , ? , ? , ? , ? , ?,? , ? , ?)";
RecordSet recordSet = new RecordSet();
recordSet.executeUpdate(insertSql , crmCustomerBackLog.getRequestId() , crmCustomerBackLog.getWorkFlowId() , crmCustomerBackLog.getRequestUrl() , crmCustomerBackLog.getRemark() , crmCustomerBackLog.getParam() ,crmCustomerBackLog.getResult() , crmCustomerBackLog.getStatus() ,crmCustomerBackLog.getRequestType(), crmCustomerBackLog.getCreateBy() , LocalDateTime.now());
}
return "1";
}
}进入系统->后端应用中心->集成中心->流程流转集成->注册自定义接口
设置流程的节点前后附加操作
金蝶连接生成凭证
配置文件
1 |
|
1 |
|
1 |
|
1 |
|
泛微OA有关开发功能记录
http://example.com/2023/09/21/OA随笔/泛微OA有关开发功能记录/