生活小妙招
1.没必要所有前端操作都要使用 ecode,比如我们只是想修改流程中某些字段的值,我们可以直接在流程页面的代码块中写JS。【因为复写组件会出现多次请求的问题】
- 节点操作 Action 获取表单名的方式
// strRequestID: 表单requestid
String strRequestID = request.getRequestid();
// strTableName: 表单名称
String strTableName = request.getRequestManager().getBillTableName();
//如果非手动提交,通过formid获取表单id
if(strTableName == null || "".equals(strTableName)){
//strFormid: 表单id
int strFormid = request.getRequestManager().getFormid();
// 查找表单名称
RecordSet rs = new RecordSet();
rs.execute("select tablename from workflow_bill where id = '" + strFormid+"' ");
if(rs.next()){
strTableName = Util.null2String(rs.getString("tablename"));
}
writeLog("非手动提交,通过formid获取表单id:" +strFormid +"表单名称:" +strTableName);
}
3.获取请求响应解决中文乱码问题
log.info("return value 1->" + response);
log.info("return value 2->" + new String(response.getBytes("GBK")));
// 这里 GBK 根据需要替换
log.info("return value 3->" + new String(response.getBytes("ISO-8859-1"), "GBK"));
4.现在推荐使用打印日志的方式
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
private final Log log = LogFactory.getLog(this.getClass());
5.节点附加操作设置返回异常信息
request.getRequestManager().setMessageid("10008");
request.getRequestManager().setMessagecontent("设置的错误信息");
return FAILURE_AND_CONTINUE;
6.从配置中读取数据
// key 是我们在 D:\weaver\Ecology\ecology0925\ecology\WEB-INF\prop 下 XXX.properties 文件名, value 是我们键值对的 key
new BaseBean().getPropValue("key", "value");
7.通过获取数据接口拿到对应的SQL
- 通过载荷中的 dataKey 拼接 /api/ec/dev/table/getxml?dataKey=xxx 就可以获取到对应的 SQL
8.报错打印日志
log.info("=============== e.getMessage() ===============: " + e.getMessage());
StackTraceElement[] stackTrace = e.getStackTrace();
log.info("=============== stackTrace[0].getLineNumber() ===============: " + stackTrace[0].getLineNumber());
9.查看表锁以及解除表锁
select SESS_ID,SQL_TEXT,STATE,USER_NAME,TRX_ID,APPNAME,CLNT_IP from v$sessions where "SESS_ID" in (select SESS_ID from v$trx where "ID" in (select TRX_ID from v$lock where "BLOCKED"=1)) ---查看正锁的会话
select SESS_ID,SQL_TEXT,STATE,USER_NAME,TRX_ID,APPNAME,CLNT_IP from v$sessions where "SESS_ID" in (select SESS_ID from v$trx where "ID" in (select WAIT_FOR_ID from v$trxwait)) ---查看正锁的会话 所等待的会话
sp_close_session(922343544)
10.建模在批量编辑后获取变更的值
window.cubeStore.Search.doBatchStorage()
11.对于页面扩展自定义按钮的链接地址也是可以写JS的
(function(){
let ids = ModeList.getCheckedID()
if(ids == null || ids == ''){
ModeList.showMessage("请先勾选要比对的文件");
return;
}
let size = ModeList.getCheckedID().split(",").length;
if(size > 2){
window.weaJs.alert("仅可以勾选两个版本");
return;
}
if(size < 2){
window.weaJs.alert("需要勾选两个版本");
return;
}
window.open("/spa/custom/static/index.html#/main/cs/app/ef0a8ec748704239b10af7f4ff50955d_MainRoot?ids=" + ids)
})()
12.节点Action
package weaver.spdbank.action;
import weaver.general.Util;
import weaver.hrm.User;
import weaver.interfaces.workflow.action.Action;
import weaver.soa.workflow.request.Cell;
import weaver.soa.workflow.request.DetailTable;
import weaver.soa.workflow.request.Property;
import weaver.soa.workflow.request.RequestInfo;
import weaver.soa.workflow.request.Row;
import weaver.workflow.request.RequestManager;
import javax.servlet.http.HttpServletRequest;
/**
* <Description> 项目开发培训:自定义接口动作(流程) <br>
* @author han.mengyu <br>
* @version 1.0 <br>
* @createDate 2022/4/19 <br>
* @see weaver.spdbank.action <br>
*/
public class DevWorkflowAction implements Action {
/**
* 自定义参数
*/
public String defaultParam;
@Override
public String execute(RequestInfo requestInfo) {
RequestManager requestManager = requestInfo.getRequestManager();
HttpServletRequest request = requestManager.getRequest();
String requestId = requestInfo.getRequestid();//请求ID
String reqId = Util.null2String(request.getParameter("requestid"));//请求ID
String requestLevel = requestInfo.getRequestlevel();//请求紧急程度
//当前操作类型 submit:提交/reject:退回
String src = requestManager.getSrc();
String workflowId = requestInfo.getWorkflowid();//流程ID
String tableName = requestManager.getBillTableName();//表单名称
int billId = requestManager.getBillid();//表单数据ID
User usr = requestManager.getUser();//获取当前操作用户对象
String requestName = requestManager.getRequestname();//请求标题
String remark = requestManager.getRemark();//当前用户提交时的签字意见
int formId = requestManager.getFormid();//表单ID
int isBill = requestManager.getIsbill();//是否是自定义表单
//取主表数据
Property[] properties = requestInfo.getMainTableInfo().getProperty();// 获取表单主字段信息
for (Property property : properties) {
String name = property.getName();// 主字段名称
String value = Util.null2String(property.getValue());// 主字段对应的值
}
//取明细数据
DetailTable[] detailTable = requestInfo.getDetailTableInfo().getDetailTable();// 获取所有明细表
if (detailTable.length > 0) {
// 指定明细表
for (DetailTable dt : detailTable) {
Row[] s = dt.getRow();// 当前明细表的所有数据,按行存储
// 指定行
for (Row r : s) {
Cell[] c = r.getCell();// 每行数据再按列存储
// 指定列
for (Cell c1 : c) {
String name = c1.getName();// 明细字段名称
String value = c1.getValue();// 明细字段的值
}
}
}
}
//控制流程流转,增加以下两行,流程不会向下流转,表单上显示返回的自定义错误信息
requestManager.setMessagecontent("返回自定义的错误信息");
requestManager.setMessageid("错误信息编号");
// return返回固定返回`SUCCESS`,
// 当return `FAILURE_AND_CONTINUE`时,表单上会提示附加操作失败
return SUCCESS;
}
public String getDefaultParam() {
return defaultParam;
}
public void setDefaultParam(String defaultParam) {
this.defaultParam = defaultParam;
}
}
13.前端获取系统登录用户
JSON.parse(localStorage.getItem('theme-account')).userid
14.后端获取系统登录用户
User user = HrmUserVarify.getUser(request, response);
int uid = user.getUID();
15.通过 imageid 去访问图片
(1) 使用系统工具类进行加密
public static String getdic(String id) {
// 字符数组转十六进制字符串
DesUtils des = null;
try {
des = new DesUtils();
} catch (Exception exception) {
// empty catch block
}
String ddcode = "1_" + id;
try {
ddcode = des.encrypt(ddcode);
} catch (Exception exception) {
// empty catch block
}
return ddcode;
}
(2) 然后返回加密后的路径
String imagePath = "/weaver/weaver.file.FileDownload?filecid=" + imageId + "&ddcode=cbb4d18ff8dd4245" + ddcode;
13.客户模块数据逻辑删除恢复
-- 查询删除日志 替换操作日记
select * from SysMaintenanceLog where operatetype ='3' and operateitem ='99' and operatedate ='?' order by id desc;
-- 根据获取到的 relateditemid 更新
update CRM_CustomerInfo set deleted= 0 where id in (?,?)
-- 更新
update CRM_ShareInfo set deleted=0 where relateditemid in(?,?)
14.JS 两种方式发送请求
var options = {
url: '/api/deletedata/updateDeleteStatus',
method: 'POST',
params : {
option: 1,
},
};
window.weaJs.callApi(options).then(function(res) {
console.log('res', res);
});
ecCom.WeaTools.callApi('/api/doc/getReadUsers', 'POST',{docid: this.props.docid}).then((res) =>{
console.log(res)
this.setState({
read:res
})
res.map((value) => {
readArray.push(value)
})
});
15.开启数据库缓存地址
commcache/cacheMonitor.jsp
16.给一个流程监控的查看权限,然后再建模的跳转的那个链接后边加上&ismonitor=1
17.后端接口获取表名
// 获取表名
String tableName = "formtable_main_%s";
RecordSet recordSet = new RecordSet();
String formidSQL = "SELECT FORMID FROM WORKFLOW_REQUESTBASE A LEFT JOIN WORKFLOW_BASE B ON A.WORKFLOWID = B.ID WHERE REQUESTID = " + requestid;
log.info("formidSQL = " + formidSQL);
recordSet.executeQuery(formidSQL);
recordSet.next();
int formid = Util.getIntValue(recordSet.getString("formid"));
if (formid > 0) {
throw new Exception("formid 的值不正确 " + formid);
} else {
formid = formid * -1;
log.info("修改后 formid = " + formid);
}
tableName = String.format(tableName, formid);
log.info("tableName = " + tableName);
18.根据主表字段隐藏明细表的列
<script>
// 监听字段值变化
WfForm.bindFieldChangeEvent("field35215", function(obj, id, value) {
dealFunc(value)
});
// 监听新增明细行
WfForm.registerAction(WfForm.ACTION_ADDROW+"1", function(index){
dealFunc(WfForm.getFieldValue("field35215"))
});
// 处理逻辑
function dealFunc(value){
/* detail_1_1_X X为第几列,data-fieldname="XXX" XXX为字段名, .hide() 隐藏, .show() 显示*/
if (value == 0) {
// 电子
$('.detail_1_1_2, .detail_1_1_4, .detail_1_1_6, .detail_1_1_8').hide();
$('[data-fieldname="yzgsmc"], [data-fieldname="wlyzmc"], [data-fieldname="wlyywj"], [data-fieldname="bz"]').parent().hide();
$('.detail_1_1_3, .detail_1_1_7').show(); // 显示其他列
$('[data-fieldname="dzyzmc"], [data-fieldname="dzyywj"]').parent().show()
} else if (value == 1) {
// 物理
$('.detail_1_1_4, .detail_1_1_6').show(); // 显示其他列
$(' [data-fieldname="wlyzmc"], [data-fieldname="wlyywj"]').parent().show()
$('.detail_1_1_2, .detail_1_1_3, .detail_1_1_7, .detail_1_1_8').hide();
$('[data-fieldname="yzgsmc"], [data-fieldname="dzyzmc"], [data-fieldname="dzyywj"],[data-fieldname="bz"]').parent().hide();
} else if (value == 2) {
// 线下
$('.detail_1_1_3, .detail_1_1_4, .detail_1_1_6, .detail_1_1_7').hide();
$('[data-fieldname="dzyzmc"], [data-fieldname="wlyzmc"],[data-fieldname="wlyywj"],[data-fieldname="dzyywj"]').parent().hide();
$('.detail_1_1_2, .detail_1_1_8').show(); // 显示其他列
$('[data-fieldname="yzgsmc"], [data-fieldname="bz"]').parent().show()
}
}
</script>
19.通过页面扩展按钮打开新页面的链接配置
(function(){
let ids = ModeList.getCheckedID()
if(ids == null || ids == ''){
window.weaJs.alert("请先勾选要比对的文件");
return;
}
let size = ModeList.getCheckedID().split(",").length;
if(size > 2){
window.weaJs.alert("仅可以勾选两个版本");
return;
}
if(size < 2){
window.weaJs.alert("需要勾选两个版本");
return;
}
window.open("/spa/custom/static/index.html#/main/cs/app/ef0a8ec748704239b10af7f4ff50955d_MainRoot?ids=" + ids)
})()
20.金融街发票识别代码块,包含移动引擎发送请求使用 AJAX
<!-- 发票云根据发票类型添加明细行-->
<script type="text/javascript" >
// 监听明细表新增明细行
WfForm.registerAction(WfForm.ACTION_ADDROW+"1", function(index){
if(WfForm.getFieldValue("field27577") == 0){
WfForm.changeFieldValue("field27577", {value:1});
}
})
// 监听字段变化
WfForm.bindFieldChangeEvent("field27577", function(obj,id,value){
if(value == 1){
// 获取所有发票ID
var rowArr = WfForm.getDetailAllRowIndexStr("detail_1").split(",")
var fpbh = WfForm.convertFieldNameToId("fpbh", "detail_1")
var yskm = WfForm.convertFieldNameToId("mx1fykm", "detail_1")
var je = WfForm.convertFieldNameToId("mx1bxje", "detail_1")
var fpsx = WfForm.convertFieldNameToId("mx1_fpsx", "detail_1")
var ids = ''
for(var i=0; i<rowArr.length; i++){
var rowIndex = rowArr[i];
if(rowIndex !== ""){
var fieldMark = fpbh + "_" + rowIndex; //遍历明细行字段
var id = WfForm.getFieldValue(fieldMark)
ids = ids + id + ","
}
}
let invoiceID = ids.substring(0, ids.length - 1)
// 调用后端接口
if(WfForm.isMobile()){
var xhr = new XMLHttpRequest();
xhr.open("POST", "/api/generateDetail/datas?invoiceID="+ invoiceID + "&workflowID="+ WfForm.getBaseInfo().workflowid, true);
xhr.setRequestHeader("Content-Type", "application/json");
var data = "";
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var res = JSON.parse(xhr.responseText);
WfForm.delDetailRow("detail_1", "all");
for(let i = 0; i < res.count; i++){
if(res.data[i]["id"] !== null){
// TODO field23822 对应发票编号,23816对应预算科目,23821对应发票属性,23817对应金额
WfForm.addDetailRow("detail_1",{field23822 :{
value: res.data[i]["id"],
specialobj:[
{id:res.data[i]["id"],name:res.data[i]["invoiceNumber"]},
]
},
field23816 : {
value: res.data[i]["yskmId"],
specialobj:[
{id:res.data[i]["yskmId"],name:res.data[i]["yskmName"]},
]
},
field23821 :{
value: res.data[i]["fpsx"]
},
field23817 :{
value: res.data[i]["je"]
}
})
}
}
window.setTimeout(function(){
WfForm.changeFieldValue("field27577",{value:0});
}, 1000)
}
}
xhr.send(data);
}else{
ecCom.WeaTools.callApi('/api/generateDetail/datas', 'POST',{invoiceID: invoiceID, workflowID : WfForm.getBaseInfo().workflowid}).then((res) =>{
if(res.code != 200){
return
}
WfForm.delDetailRow("detail_1", "all");
// 遍历循环添加明细行
for(let i = 0; i < res.count; i++){
if(res.data[i]["id"] !== null){
// TODO field23822 对应发票编号,23816对应预算科目,23821对应发票属性,23817对应金额
WfForm.addDetailRow("detail_1",{field23822 :{
value: res.data[i]["id"],
specialobj:[
{id:res.data[i]["id"],name:res.data[i]["invoiceNumber"]},
]
},
field23816 : {
value: res.data[i]["yskmId"],
specialobj:[
{id:res.data[i]["yskmId"],name:res.data[i]["yskmName"]},
]
},
field23821 :{
value: res.data[i]["fpsx"]
},
field23817 :{
value: res.data[i]["je"]
}
})
}
}
window.setTimeout(function(){
WfForm.changeFieldValue("field27577",{value:0});
}, 1000);
})
}
}
})
</script>
21.对于流程代码块移动端不生效的一个解决方案
问题原因:技术咨询
解决办法:pc端和移动端浏览按钮组件本就不同,不能一段代码通用,需要代码块开发调整逻辑。
1、登录ecology帐号密码
2、访问ecology域名+/spa/em/mobile.html,打开网页上的移动端界面,找到对应流程表单
3、F12在Element中找到移动端要点击的组件,在组件上绑定点击事件
22.光大信托套用模版代码块
<script type="text/javascript" src="/gdcontract/gdcontract.js "></script>
<script >
jQuery().ready(function(){
WfForm.registerCheckEvent(WfForm.OPER_SAVE, function(callback){
var All = WfForm.getDetailAllRowIndexStr("detail_1").split(",");
var Checked = WfForm.getDetailCheckedRowIndexStr("detail_1").split(",");
for(var i=0; i<All.length; i++){
for(var j=0; j<Checked.length; j++){
if(All[i] == Checked[j]){
WfForm.changeFieldValue("field26325_" +All[i], {value:"1"});
break;
}else{
WfForm.changeFieldValue("field26325_" +All[i], {value:"0"});
}
}
}
callback(); //继续提交需调用callback,不调用代表阻断
});
});
</script>
<script>
//合同编号自动生成
WfForm.bindFieldChangeEvent("field25325", function(obj,id,value){
var xmbh = WfForm.getFieldValue("field25325");
var All = WfForm.getDetailAllRowIndexStr("detail_1").split(",");
for(var i=0; i<All.length; i++){
var fieldvalue = "";
var arr = WfForm.getFieldValue("field20329_" +All[i]).split("-");
fieldvalue = WfForm.getFieldValue("field24326_" +All[i]);
WfForm.changeFieldValue("field20329_" +All[i], {value: xmbh +"-" +fieldvalue +"-XXX"});
}
});
WfForm.bindDetailFieldChangeEvent("field24326", function(id,rowIndex,value){
var xmbh = WfForm.getFieldValue("field25325");
var All = WfForm.getDetailAllRowIndexStr("detail_1").split(",");
for(var i=0; i<All.length; i++){
var fieldvalue = "";
var fieldhtbh = "XXX";
var arr = "";
if(WfForm.getFieldValue("field20329_" +All[i]) != null || WfForm.getFieldValue("field20329_" +All[i]) != ""){
arr = WfForm.getFieldValue("field20329_" +All[i]).split("-");
}
fieldvalue = WfForm.getFieldValue("field24326_" +All[i]);
if(arr != "" && "XXX" != arr[2]){
fieldhtbh = arr[2];
}
WfForm.changeFieldValue("field20329_" +All[i], {value: xmbh +"-" +fieldvalue + "-" +fieldhtbh});
}
});
</script>
<script>
//合同编号重复提示,判断合同附件是否与模板名称一致
WfForm.registerCheckEvent(WfForm.OPER_SUBMIT, function(callback){
var All = WfForm.getDetailAllRowIndexStr("detail_1").split(",");
var htbh = "";
var htbhzj = "";
var htmb = "";
var htfj = "";
var detailLine = WfForm.getDetailRowCount("detail_1");
for(var i=0; i<All.length; i++){
htbh += WfForm.getFieldValue("field20329_" +All[i]) +",";
htbhzj += WfForm.getDetailRowKey("field20329_" +All[i]) +",";
if(WfForm.getFieldValue("field10325_" +All[i]) == ''){
htmb +="-1,";
}else{
htmb += WfForm.getFieldValue("field10325_" +All[i]) +",";
}
htfj += WfForm.getFieldValue("field8333_" +All[i]) +",";
}
$.post("/weavernorth/docNameRepetition.jsp", {"htbh":htbh, "htbhzj":htbhzj, "formid":formid.value, "htmb":htmb, "htfj":htfj, "detailLine":detailLine},
function(data){
var status=JSON.parse(data).isHTBH;
var modelAndFile=JSON.parse(data).modelAndFile;
//if(status != ""){
//WfForm.showConfirm("合同编号为:" +status +"; 已存在,不能提交", function(){
//});
// }
if(modelAndFile != ""){
WfForm.showConfirm("合同编号为:" +modelAndFile +"; 名称不一致,是否继续提交?", function(){
callback();
});
//}else if(status == "" && modelAndFile == ""){
}else if(modelAndFile == ""){
callback();
}
});
});
</script>
<script>
//特定上传附件字段屏蔽其上传附件、删除附件的功能
jQuery().ready(function(){
// WfForm.registerAction(WfForm.ACTION_ADDROW+1, function(index){//新增明细默认注册加+事件
// addDialog();
// });
var uploadfieldid = 'field8333';//明细附件上传字段fieldid
let flag = 'field43334';
setInterval(function(){
var rowindexArr=WfForm.getDetailAllRowIndexStr("detail_1").split(',');//detail_1表示明细表1,可修改为detail_2、detail_3等
rowindexArr.map(function(data){
//if(WfForm.getFieldCurViewAttr(uploadfieldid+'_'+data)==3){
if(WfForm.getFieldValue(flag+'_'+data) == 0){
console.log("选择了套用模板")
$('.'+uploadfieldid+'_'+data+'_swapDiv .wea-upload-container').css('display','none');
$('.'+uploadfieldid+'_'+data+'_swapDiv .wea-upload-list-item-ops .anticon-cross').css('visibility','hidden');
}else{
$('.'+uploadfieldid+'_'+data+'_swapDiv .wea-upload-container').css('display','');
$('.'+uploadfieldid+'_'+data+'_swapDiv .wea-upload-list-item-ops .anticon-cross').css('visibility','');
console.log("不做处理")
}
})
},100);
});
</script>
<script>
//控制定稿标识显示编辑正文字段
jQuery(document).ready(function () {
setTimeout(function () {
editBtn();
}, 300)
})
function editBtn() {
var linkId = "field27826"; //明细行隐藏字段id(控制定稿隐藏功能)
var selectId = "field27825"; //选择框字段id(是否定稿)
var detailTable = "1" //监听的第几个明细表
var editNode = false //当前节点是否存在用来判断按钮显隐的选择框字段 存在-> true 不存在-> false
var rowArr = WfForm.getDetailAllRowIndexStr("detail_"+detailTable).split(",");
for (var i = 0; i < rowArr.length; i++) {
var rowIndex = rowArr[i];
if (rowIndex !== "") {
var linkVal = WfForm.getFieldValue(linkId+"_"+rowIndex)
editNode && listenSelect(rowIndex, linkId, selectId)
if (linkVal == "") {
} else if (linkVal == 0) {
jQuery("tr[data-rowindex='"+rowIndex+"'] li").each(function () {
if (jQuery(this).text() == "编辑正文") {
jQuery(this).hide()
}
})
} else if (linkVal == 1) {
jQuery("tr[data-rowindex='"+rowIndex+"'] li").each(function () {
if (jQuery(this).text() == "编辑正文") {
jQuery(this).show()
}
})
}
}
}
WfForm.registerAction(WfForm.ACTION_ADDROW + detailTable, function (index) { //监听明细表添加
editNode && listenSelect(index, linkId, selectId)
!editNode && listenLink(index, linkId)
});
function listenSelect(index, linkId, selectId) {
jQuery("#"+selectId+"_"+index).bindPropertyChange(function (obj, id, value) {
if (value == 0) {
jQuery("tr[data-rowindex='"+index+"'] li").each(function () {
if (jQuery(this).text() == "编辑正文") {
jQuery(this).hide()
WfForm.changeFieldValue(linkId+"_"+index, { value: "0" })
}
})
}
if (value == 1) {
jQuery("tr[data-rowindex='"+index+"'] li").each(function () {
if (jQuery(this).text() == "编辑正文") {
jQuery(this).show()
WfForm.changeFieldValue(linkId+"_"+index, { value: "1" })
}
})
}
});
}
function listenLink(index, linkId) {
var linkVal = WfForm.getFieldValue(linkId+"_"+index)
if (linkVal == "") {
var _index = index - 1;
var flag = false;
var pre_linkVal = WfForm.getFieldValue(linkId+"_"+_index)
if (pre_linkVal) {
jQuery("tr[data-rowindex='"+_index+"'] li").each(function () {
if (jQuery(this).text() == "编辑正文") {
var attr = jQuery(this).css("display")
attr == "none" ? (flag = false) : (flag = true)
}
})
}
jQuery("tr[data-rowindex='"+index+"'] li").each(function () {
if (jQuery(this).text() == "编辑正文") {
flag ? jQuery(this).show() : jQuery(this).hide();
}
})
} else if (linkVal == "0") {
jQuery("tr[data-rowindex='"+index+"'] li").each(function () {
if (jQuery(this).text() == "编辑正文") {
jQuery(this).hide()
}
})
} else if (linkVal == 1) {
jQuery("tr[data-rowindex='"+index+"'] li").each(function () {
if (jQuery(this).text() == "编辑正文") {
jQuery(this).show()
}
})
}
}
}
</script>
将Base64格式的文件保存到系统中
// imageFileManager.saveImageFileByInputStream传入输入流,将附件保存到oa中,其中返回id为物理id;
// docSaveService.accForDoc 传入目录id,物理id,用户id;将物理id转化为文档id供后续使用。
byte[] file = Base64.getDecoder().decode(params.getString("file")); // 解密 Base64 文件流
InputStream in = new ByteArrayInputStream(file);
ImageFileManager imageFileManager = new ImageFileManager();
DocSaveService docSaveService = new DocSaveService();
String fileName = Util.null2String(params.get("filename")) + Util.null2String(params.get("fileType")); // xxx.xxx
int annexId = imageFileManager.saveImageFileByInputStream(in, fileName);
int docid = docSaveService.accForDoc(secid, annexId, 1); // 目录ID、物理ID、UserId
创建系统提醒工作流
// 假设你已经有了相应的参数值
String requestname = "系统提醒工作流-人员离职";
int docid = 0; // 文档ID
int crmid = 0; // 客户ID
int prjid = 0; // 项目ID
int meetingid = 0; // 会议ID
String resource = "1"; // 创建人用户名
String operators = "1"; // 操作者用户名
String remark = "备注信息";
new weaver.system.SysRemindWorkflow().setSysRemindInfo(requestname, docid, crmid, prjid, meetingid, Integer.parseInt(resource), operators, remark);