Browse Source

shopself-workflow

master
xiamaofa 2 years ago
commit
38e0637a6f
  1. 122
      build.gradle
  2. 13
      encrypt.xml
  3. BIN
      lib/commons-dbcp2-2.1.1.jar
  4. BIN
      lib/commons-pool2-2.4.2.jar
  5. 30
      plugin.xml
  6. 21
      src/main/java/com/eco/plugin/wink/workflow/controller/ControllerRegisterProvider.java
  7. 150
      src/main/java/com/eco/plugin/wink/workflow/controller/ControllerSelf.java
  8. 178
      src/main/java/com/eco/plugin/wink/workflow/controller/DataProcessingController.java
  9. 47
      src/main/java/com/eco/plugin/wink/workflow/controller/FormController.java
  10. 133
      src/main/java/com/eco/plugin/wink/workflow/controller/WorkflowConfigController.java
  11. 315
      src/main/java/com/eco/plugin/wink/workflow/controller/WorkflowProcessController.java
  12. 162
      src/main/java/com/eco/plugin/wink/workflow/db/bean/DBLinkEntity.java
  13. 79
      src/main/java/com/eco/plugin/wink/workflow/db/bean/FormDefEntity.java
  14. 67
      src/main/java/com/eco/plugin/wink/workflow/db/bean/FormDetailEntity.java
  15. 67
      src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowDefEntity.java
  16. 91
      src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowNodeEntity.java
  17. 125
      src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowProcessEntity.java
  18. 225
      src/main/java/com/eco/plugin/wink/workflow/db/controller/FormDbController.java
  19. 228
      src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkFlowController.java
  20. 115
      src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkFlowProcessController.java
  21. 205
      src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkflowConfigDbController.java
  22. 57
      src/main/java/com/eco/plugin/wink/workflow/db/dao/DBLinkDao.java
  23. 67
      src/main/java/com/eco/plugin/wink/workflow/db/dao/FormDefDao.java
  24. 61
      src/main/java/com/eco/plugin/wink/workflow/db/dao/FormFieldDao.java
  25. 62
      src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowDefDao.java
  26. 57
      src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowNodeDao.java
  27. 61
      src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowProcessDao.java
  28. 55
      src/main/java/com/eco/plugin/wink/workflow/kit/CustomRoleServiceKit.java
  29. 115
      src/main/java/com/eco/plugin/wink/workflow/kit/UserServiceKit.java
  30. 235
      src/main/java/com/eco/plugin/wink/workflow/utils/DateUtilSelf.java
  31. 32
      src/main/java/com/eco/plugin/wink/workflow/utils/FRRoleUtils.java
  32. 235
      src/main/java/com/eco/plugin/wink/workflow/utils/FRUserUtils.java
  33. 332
      src/main/java/com/eco/plugin/wink/workflow/utils/FRUtils.java
  34. 186
      src/main/java/com/eco/plugin/wink/workflow/utils/JDBCUtils.java
  35. 108
      src/main/java/com/eco/plugin/wink/workflow/utils/ResponseUtils.java
  36. 329
      src/main/java/com/eco/plugin/wink/workflow/utils/Utils.java
  37. 37
      src/main/java/com/eco/plugin/wink/workflow/webresource/WebResourceProvider.java
  38. 3954
      src/main/resources/com/eco/plugin/wink/workflow/js/ui.js

122
build.gradle

@ -0,0 +1,122 @@
apply plugin: 'java'
ext {
/**
* jar的路径
* 1.jar需要打包到zip中,lib根目录下
* 2.jar仅仅是编译时需要lib下子目录下即可
*/
libPath = "$projectDir/../webroot/WEB-INF/lib"
/**
* class进行加密保护
*/
guard = false
def pluginInfo = getPluginInfo()
pluginPre = "fine-plugin"
pluginName = pluginInfo.id
pluginVersion = pluginInfo.version
outputPath = "$projectDir/../webroot/WEB-INF/plugins/plugin-" + pluginName + "-1.0/classes"
}
group = 'com.fr.plugin'
version = '10.0'
sourceCompatibility = '8'
sourceSets {
main {
java.outputDir = file(outputPath)
output.resourcesDir = file(outputPath)
}
}
ant.importBuild("encrypt.xml")
//ant变量
ant.projectDir = projectDir
ant.references["compile.classpath"] = ant.path {
fileset(dir: libPath, includes: '**/*.jar')
fileset(dir: ".",includes:"**/*.jar" )
}
classes.dependsOn('clean')
task copyFiles(type: Copy,dependsOn: 'classes'){
from outputPath
into "$projectDir/classes"
}
task preJar(type:Copy,dependsOn: guard ? 'compile_encrypt_javas' : 'compile_plain_javas'){
from "$projectDir/classes"
into "$projectDir/transform-classes"
include "**/*.*"
}
jar.dependsOn("preJar")
task makeJar(type: Jar,dependsOn: preJar){
from fileTree(dir: "$projectDir/transform-classes")
baseName pluginPre
appendix pluginName
version pluginVersion
destinationDir = file("$buildDir/libs")
doLast(){
delete file("$projectDir/classes")
delete file("$projectDir/transform-classes")
}
}
task copyFile(type: Copy,dependsOn: ["makeJar"]){
from "$buildDir/libs"
from("$projectDir/lib") {
include "*.jar"
}
from "$projectDir/plugin.xml"
into file("$buildDir/temp/plugin")
}
task zip(type:Zip,dependsOn:["copyFile"]){
from "$buildDir/temp/plugin"
destinationDir file("$buildDir/install")
baseName pluginPre
appendix pluginName
version pluginVersion
}
//build时包含哪些文件,
processResources {
// exclude everything
// *.css没效果
// exclude '**/*.css'
// except this file
// include 'xx.xml'
}
/*读取plugin.xml中的version*/
def getPluginInfo(){
def xmlFile = file("plugin.xml")
if (!xmlFile.exists()) {
return ["id":"none", "version":"1.0.0"]
}
def plugin = new XmlParser().parse(xmlFile)
def version = plugin.version[0].text()
def id = plugin.id[0].text()
return ["id":id,"version":version]
}
repositories {
mavenLocal()
maven {
url = uri('http://mvn.finedevelop.com/repository/maven-public/')
}
}
dependencies {
//使jar
implementation fileTree(dir: 'lib', include: ['**/*.jar'])
implementation fileTree(dir: libPath, include: ['**/*.jar'])
}

13
encrypt.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project>
<target name="compile_encrypt_javas" depends="copyFiles">
<echo message="加密文件"/>
<echo message="${projectDir}"/>
<taskdef name="pretreatment" classname="com.fr.plugin.pack.PluginPretreatmentTask">
<classpath refid="compile.classpath"/>
</taskdef>
<pretreatment baseDir="${projectDir}"/>
</target>
<target name="compile_plain_javas" depends="copyFiles">
</target>
</project>

BIN
lib/commons-dbcp2-2.1.1.jar

Binary file not shown.

BIN
lib/commons-pool2-2.4.2.jar

Binary file not shown.

30
plugin.xml

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><plugin>
<id>com.eco.plugin.wink.workflow</id>
<name><![CDATA[流程管理插件]]></name>
<active>yes</active>
<version>1.0.1</version>
<env-version>10.0</env-version>
<jartime>2018-07-31</jartime>
<vendor>wink</vendor>
<description><![CDATA[流程管理插件]]></description>
<change-notes><![CDATA[
2022-09-13 代码初始化
]]></change-notes>
<main-package>com.eco.plugin.wink.workflow</main-package>
<extra-decision>
<WebResourceProvider class="com.eco.plugin.wink.workflow.webresource.WebResourceProvider"/>
<ControllerRegisterProvider class="com.eco.plugin.wink.workflow.controller.ControllerRegisterProvider"/>
</extra-decision>
<extra-core>
<DBAccessProvider class="com.eco.plugin.wink.workflow.db.controller.WorkFlowController"/>
<DBAccessProvider class="com.eco.plugin.wink.workflow.db.controller.FormDbController"/>
<DBAccessProvider class="com.eco.plugin.wink.workflow.db.controller.WorkflowConfigDbController"/>
<DBAccessProvider class="com.eco.plugin.wink.workflow.db.controller.WorkFlowProcessController"/>
</extra-core>
<function-recorder class="com.eco.plugin.wink.workflow.webresource.WebResourceProvider"/>
</plugin>

21
src/main/java/com/eco/plugin/wink/workflow/controller/ControllerRegisterProvider.java

@ -0,0 +1,21 @@
package com.eco.plugin.wink.workflow.controller;
import com.fr.decision.fun.impl.AbstractControllerRegisterProvider;
import com.fr.plugin.context.PluginContexts;
import com.fr.stable.fun.Authorize;
@Authorize(callSignKey = "com.eco.plugin.wink.zjgintegrate")
public class ControllerRegisterProvider extends AbstractControllerRegisterProvider {
@Override
public Class<?>[] getControllers() {
if(!PluginContexts.currentContext().isAvailable()) {
return new Class[]{};
}
return new Class[]{
ControllerSelf.class,FormController.class,WorkflowConfigController.class,
DataProcessingController.class,WorkflowProcessController.class
};
}
}

150
src/main/java/com/eco/plugin/wink/workflow/controller/ControllerSelf.java

@ -0,0 +1,150 @@
package com.eco.plugin.wink.workflow.controller;
import com.eco.plugin.wink.workflow.db.bean.DBLinkEntity;
import com.eco.plugin.wink.workflow.db.bean.FormDefEntity;
import com.eco.plugin.wink.workflow.db.bean.FormDetailEntity;
import com.eco.plugin.wink.workflow.db.controller.WorkFlowController;
import com.eco.plugin.wink.workflow.utils.DateUtilSelf;
import com.eco.plugin.wink.workflow.utils.ResponseUtils;
import com.eco.plugin.wink.workflow.utils.Utils;
import com.fr.decision.webservice.annotation.LoginStatusChecker;
import com.fr.json.JSONArray;
import com.fr.json.JSONObject;
import com.fr.plugin.transform.FunctionRecorder;
import com.fr.third.springframework.stereotype.Controller;
import com.fr.third.springframework.web.bind.annotation.PostMapping;
import com.fr.third.springframework.web.bind.annotation.RequestBody;
import com.fr.third.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Controller
@LoginStatusChecker(required = false)
@FunctionRecorder
public class ControllerSelf {
/**
* 获取全部数据库链接
* @param req
* @param res
*/
@PostMapping(value = "/workflow/getAllDbLink")
@ResponseBody
public void getAllDbLink(HttpServletRequest req,HttpServletResponse res){
List<DBLinkEntity> dbLinkList = WorkFlowController.getAllDBLink();
ResponseUtils.response(res,new JSONObject().put("data",dbLinkList));
}
/**
* 根据id获取单个数据库链接
* @param req
* @param res
*/
@PostMapping(value = "/workflow/getDbLinkById")
@ResponseBody
public DBLinkEntity getDbLinkById(HttpServletRequest req,HttpServletResponse res){
String id = Utils.getRequestBody(req).getString("id");
DBLinkEntity dbLink = WorkFlowController.getDBLinkById(id);
return dbLink;
}
@PostMapping(value = "/workflow/addDbLink")
@ResponseBody
public void addDbLink(HttpServletRequest req, HttpServletResponse res, @RequestBody DBLinkEntity dbLink){
String now = DateUtilSelf.getNow();
if(Utils.isNullStr(dbLink.getId())){
dbLink.setId(UUID.randomUUID().toString());
dbLink.setCreatetime(now);
}
if(Utils.isNotNullStr(dbLink.getId())){
dbLink.setCreatetime(WorkFlowController.getDBLinkById(dbLink.getId()).getCreatetime());
}
dbLink.setUpdatetime(now);
WorkFlowController.singleDBLink(dbLink,null);
ResponseUtils.successResponse(res,"success");
}
@PostMapping(value = "/workflow/deleteDBLink")
@ResponseBody
public void deleteDBLink(HttpServletRequest req, HttpServletResponse res, @RequestBody DBLinkEntity dbLink){
WorkFlowController.singleDBLink(null,dbLink);
ResponseUtils.successResponse(res,"success");
}
@PostMapping(value = "/workflow/importForm")
@ResponseBody
public void importForm(HttpServletRequest req, HttpServletResponse res){
JSONObject json = Utils.getRequestBody(req);
String paramstr = json.getString("data");
JSONArray params = new JSONArray(paramstr);
for(int i=0;i<params.length();i++){
JSONObject param = params.getJSONObject(i);
String formid = addForm(param);
addFormField(formid,param.getJsonArray("fields"));
}
ResponseUtils.successResponse(res,"success");
}
@PostMapping(value = "/workflow/getFormList")
@ResponseBody
public void getFormList(HttpServletRequest req, HttpServletResponse res){
JSONObject json = Utils.getRequestBody(req);
String formid = addForm(json);
addFormField(formid,json.getJsonArray("fields"));
ResponseUtils.successResponse(res,"success");
}
private void addFormField(String formid, JSONArray fields) {
List<FormDetailEntity> formDetailEntitys = new ArrayList<>();
for(int i=0;i< fields.length();i++){
FormDetailEntity fde = new FormDetailEntity();
String id = UUID.randomUUID().toString();
JSONObject field = fields.getJSONObject(i);
String fieldname = field.getString("fieldname");
String fielddesc = field.getString("fielddesc");
fde.setId(id);
fde.setFormid(formid);
fde.setFieldname(fieldname);
fde.setFielddec(fielddesc);
fde.setSort(String.valueOf(i));
formDetailEntitys.add(fde);
}
WorkFlowController.batch(formDetailEntitys,null);
}
/**
* 添加表单
* @param json
* @return
*/
private String addForm(JSONObject json) {
String tablename = json.getString("tablename");
String formname = json.getString("formname");
FormDefEntity fde = new FormDefEntity();
String id = UUID.randomUUID().toString();
fde.setId(id);
fde.setTablename(tablename);
fde.setFormname(formname);
String now = DateUtilSelf.getNow();
fde.setCreatetime(now);
fde.setUpdatetime(now);
//可用
fde.setStatus("0");
WorkFlowController.singleForm(fde,null);
return id;
}
}

178
src/main/java/com/eco/plugin/wink/workflow/controller/DataProcessingController.java

@ -0,0 +1,178 @@
package com.eco.plugin.wink.workflow.controller;
import com.eco.plugin.wink.workflow.db.bean.FormDefEntity;
import com.eco.plugin.wink.workflow.db.bean.FormDetailEntity;
import com.eco.plugin.wink.workflow.db.bean.WorkflowDefEntity;
import com.eco.plugin.wink.workflow.db.bean.WorkflowNodeEntity;
import com.eco.plugin.wink.workflow.db.controller.FormDbController;
import com.eco.plugin.wink.workflow.db.controller.WorkflowConfigDbController;
import com.eco.plugin.wink.workflow.utils.*;
import com.fr.decision.webservice.annotation.LoginStatusChecker;
import com.fr.json.JSONArray;
import com.fr.json.JSONObject;
import com.fr.third.springframework.stereotype.Controller;
import com.fr.third.springframework.web.bind.annotation.PostMapping;
import com.fr.third.springframework.web.bind.annotation.ResponseBody;
import org.nfunk.jep.function.Str;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
@Controller
@LoginStatusChecker(required = false)
public class DataProcessingController {
@PostMapping(value = "/workflow/dataprocess/add")
@ResponseBody
public void add(HttpServletRequest req, HttpServletResponse res) throws Exception {
JSONObject json = Utils.getRequestBody(req);
String formid = json.getString("formid");
FormDefEntity form = FormDbController.getById(formid);
JSONArray fields = json.getJSONArray("field");
String sql = generateInsertSql(req,form,fields);
FRUtils.FRLogInfo("sql:"+sql);
JDBCUtils.update(sql);
}
@PostMapping(value = "/workflow/dataprocess/getPageData")
@ResponseBody
public void getPageData(HttpServletRequest req, HttpServletResponse res) throws Exception {
JSONObject json = Utils.getRequestBody(req);
String formid = json.getString("formid");
int page = json.getInt("page");
int count = json.getInt("count");
String createTime = json.getString("createtime");
//1、数据录入 2、数据审核
String from = json.getString("from");
FormDefEntity form = FormDbController.getById(formid);
String sql = generateQuerySql(form);
if(Utils.isNotNullStr(createTime)){
sql += " where createtime >= "+createTime;
}
String username =FRUserUtils.getCurrentUser(req).getUserName();
if("1".equals(from)){
sql+= sql.contains("where") ? " and createuser = '"+username+"'": " where createuser='"+username+"'";
}else{
sql+= sql.contains("where") ? " and currentuser like '%["+username+"]%'" : " where currentuser like '%["+username+"]%'";
}
sql += " order by createtime limit "+(page - 1)*count+","+count;
FRUtils.FRLogInfo("sql:"+sql);
String[] column = getColumn(form);
List<Map<String,Object>> items = JDBCUtils.getResult(sql,column,formid);
String countSql = "select count(id) from " + form.getTablename();
Map<String,Object> result = new HashMap<>();
result.put("page",page);
result.put("count",count);
result.put("items",items);
ResponseUtils.successResponse(res,new JSONObject().put("page",page).put("count",count).put("items",items).put("total",JDBCUtils.getCount(countSql)).toString());
}
@PostMapping(value = "/workflow/dataprocess/getData")
@ResponseBody
public Map<String,Object> getData(HttpServletRequest req, HttpServletResponse res) throws Exception {
JSONObject json = Utils.getRequestBody(req);
String formid = json.getString("formid");
String dataid = json.getString("dataid");
FormDefEntity form = FormDbController.getById(formid);
String sql = generateQuerySql(form);
sql += " where id='"+dataid+"'";
String[] column = getColumn(form);
List<Map<String,Object>> items = JDBCUtils.getResult(sql,column,formid);
return items.get(0);
}
@PostMapping(value = "/workflow/dataprocess/delete")
@ResponseBody
public void delete(HttpServletRequest req, HttpServletResponse res) throws Exception {
JSONObject json = Utils.getRequestBody(req);
String formid = json.getString("formid");
String dataid = json.getString("dataid");
FormDefEntity form = FormDbController.getById(formid);
String sql = generateDeleteSql(form);
sql += " where id='"+dataid+"'";
JDBCUtils.update(sql);
}
private String generateDeleteSql(FormDefEntity form) {
String sql = "delete from "+form.getTablename();
return sql ;
}
/**
* 获取列名
* @param form
* @return
*/
private String[] getColumn(FormDefEntity form){
List<FormDetailEntity> fields = FormDbController.getFieldByFormId(form.getId());
String[] column = new String[fields.size()];
for(int i=0;i<fields.size();i++){
column[i] = fields.get(i).getFieldname();
}
return column;
}
/**
* 生成查询sql
* @param form
* @return
*/
private String generateQuerySql(FormDefEntity form) {
String sql = "select ";
List<FormDetailEntity> fields = FormDbController.getFieldByFormId(form.getId());
for(FormDetailEntity field : fields){
sql += field.getFieldname()+",";
}
return sql.substring(0,sql.length()-1) + " from " + form.getTablename();
}
/**
* 生成插入sql
* @param form
* @param fields
* @return
*/
private static String generateInsertSql(HttpServletRequest req,FormDefEntity form, JSONArray fields) throws Exception {
String insertsql = "insert into " + form.getTablename() +"(id";
String valuesql =" values('"+UUID.randomUUID().toString()+"'";
for(int i=0;i<fields.length();i++){
JSONObject field = fields.getJSONObject(i);
insertsql+= ","+field.getString("field");
valuesql+=",'"+field.getString("value")+"'";
}
insertsql+=",status,createtime,createuser)";
valuesql+= ",'','"+DateUtilSelf.getNow()+"','"+FRUserUtils.getCurrentUser(req).getUserName()+"')";
return insertsql+valuesql;
}
}

47
src/main/java/com/eco/plugin/wink/workflow/controller/FormController.java

@ -0,0 +1,47 @@
package com.eco.plugin.wink.workflow.controller;
import com.eco.plugin.wink.workflow.db.bean.FormDefEntity;
import com.eco.plugin.wink.workflow.db.bean.FormDetailEntity;
import com.eco.plugin.wink.workflow.db.controller.FormDbController;
import com.eco.plugin.wink.workflow.utils.ResponseUtils;
import com.eco.plugin.wink.workflow.utils.Utils;
import com.fr.decision.webservice.annotation.LoginStatusChecker;
import com.fr.json.JSONObject;
import com.fr.third.springframework.stereotype.Controller;
import com.fr.third.springframework.web.bind.annotation.PostMapping;
import com.fr.third.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@Controller
@LoginStatusChecker(required = false)
public class FormController {
/**
* 获取全部表单
* @param req
* @param res
*/
@PostMapping(value = "/workflow/form/getFormList")
@ResponseBody
public void getFormList(HttpServletRequest req,HttpServletResponse res){
List<FormDefEntity> formDefEntityList = FormDbController.getFormList();
ResponseUtils.response(res,new JSONObject().put("data",formDefEntityList));
}
/**
* 根据表单id获取字段列表
* @param req
* @param res
*/
@PostMapping(value = "/workflow/form/getFieldByFormId")
@ResponseBody
public void getFieldByFormId(HttpServletRequest req,HttpServletResponse res){
JSONObject param = Utils.getRequestBody(req);
String formid = param.getString("id");
List<FormDetailEntity> formDetailEntityList = FormDbController.getFieldByFormId(formid);
ResponseUtils.response(res,new JSONObject().put("data",formDetailEntityList));
}
}

133
src/main/java/com/eco/plugin/wink/workflow/controller/WorkflowConfigController.java

@ -0,0 +1,133 @@
package com.eco.plugin.wink.workflow.controller;
import com.eco.plugin.wink.workflow.db.bean.FormDefEntity;
import com.eco.plugin.wink.workflow.db.bean.WorkflowDefEntity;
import com.eco.plugin.wink.workflow.db.bean.WorkflowNodeEntity;
import com.eco.plugin.wink.workflow.db.controller.FormDbController;
import com.eco.plugin.wink.workflow.db.controller.WorkflowConfigDbController;
import com.eco.plugin.wink.workflow.utils.DateUtilSelf;
import com.eco.plugin.wink.workflow.utils.ResponseUtils;
import com.eco.plugin.wink.workflow.utils.Utils;
import com.fr.decision.webservice.annotation.LoginStatusChecker;
import com.fr.json.JSONArray;
import com.fr.json.JSONObject;
import com.fr.third.springframework.stereotype.Controller;
import com.fr.third.springframework.web.bind.annotation.PostMapping;
import com.fr.third.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Controller
@LoginStatusChecker(required = false)
public class WorkflowConfigController {
@PostMapping(value = "/workflow/config/importWorkFlow")
@ResponseBody
public void importWorkFlow(HttpServletRequest req, HttpServletResponse res){
JSONObject json = Utils.getRequestBody(req);
String paramstr = json.getString("data");
JSONArray params = new JSONArray(paramstr);
for(int i=0;i<params.length();i++){
String result = importFlow(params.getJSONObject(i));
}
ResponseUtils.successResponse(res,"success");
}
/**
* 导入流程
* @param param
* @return
*/
private String importFlow(JSONObject param) {
String id = addWorkflowDef(param);
String result = addWorkflowNode(id,param.getJsonArray("workflowNodes"));
return result;
}
/**
* 添加流程节点
* @param id
* @param workflowNodes
* @return
*/
private String addWorkflowNode(String id, JSONArray workflowNodes) {
String[] ids = id.split(",");
String formid = ids[1];
String workflowDefId = ids[0];
List<WorkflowNodeEntity> nodelist = new ArrayList<>();
for(int i=0;i<workflowNodes.size();i++){
JSONObject node = workflowNodes.getJSONObject(i);
WorkflowNodeEntity workflowNodeEntity = new WorkflowNodeEntity();
workflowNodeEntity.setId(UUID.randomUUID().toString());
workflowNodeEntity.setWorkflowid(workflowDefId);
workflowNodeEntity.setFormid(formid);
workflowNodeEntity.setNode(node.getString("node"));
workflowNodeEntity.setNodename(node.getString("nodename"));
workflowNodeEntity.setSort(String.valueOf(i));
workflowNodeEntity.setRolename(node.getString("rolename"));
nodelist.add(workflowNodeEntity);
}
WorkflowConfigDbController.batchWorkflowNode(nodelist,null);
return "";
}
/**
* 添加流程定义
* @param param
* @return
*/
private String addWorkflowDef(JSONObject param){
String tablename = param.getString("tablename");
FormDefEntity formDefEntity = FormDbController.getByTablename(tablename);
String formid = formDefEntity.getId();
String workflowcode = param.getString("workflowcode");
String workflowname = param.getString("workflowname");
String createtime = DateUtilSelf.getNow();
WorkflowDefEntity workflowDefEntity = new WorkflowDefEntity();
String id = UUID.randomUUID().toString();
workflowDefEntity.setId(id);
workflowDefEntity.setWorkflowcode(workflowcode);
workflowDefEntity.setWorkflowname(workflowname);
workflowDefEntity.setCreatetime(createtime);
workflowDefEntity.setFormid(formid);
WorkflowConfigDbController.singleWorkflowDef(workflowDefEntity,null);
return id+","+formid;
}
/**
* 获取全部流程定义
* @param req
* @param res
*/
@PostMapping(value = "/workflow/config/getWorkflowDefList")
@ResponseBody
public void getFormList(HttpServletRequest req,HttpServletResponse res){
List<WorkflowDefEntity> workflowDefEntityList = WorkflowConfigDbController.getWrokflowDefList();
ResponseUtils.response(res,new JSONObject().put("data",workflowDefEntityList));
}
/**
* 根据流程id获取流程节点
* @param req
* @param res
*/
@PostMapping(value = "/workflow/config/getNodeByWorkflowId")
@ResponseBody
public void getFieldByFormId(HttpServletRequest req,HttpServletResponse res){
JSONObject param = Utils.getRequestBody(req);
String workflowid = param.getString("id");
List<WorkflowNodeEntity> workflowNodeEntityList = WorkflowConfigDbController.getNodesByWorkflowId(workflowid);
ResponseUtils.response(res,new JSONObject().put("data",workflowNodeEntityList));
}
}

315
src/main/java/com/eco/plugin/wink/workflow/controller/WorkflowProcessController.java

@ -0,0 +1,315 @@
package com.eco.plugin.wink.workflow.controller;
import com.eco.plugin.wink.workflow.db.bean.FormDefEntity;
import com.eco.plugin.wink.workflow.db.bean.WorkflowDefEntity;
import com.eco.plugin.wink.workflow.db.bean.WorkflowNodeEntity;
import com.eco.plugin.wink.workflow.db.bean.WorkflowProcessEntity;
import com.eco.plugin.wink.workflow.db.controller.FormDbController;
import com.eco.plugin.wink.workflow.db.controller.WorkFlowProcessController;
import com.eco.plugin.wink.workflow.db.controller.WorkflowConfigDbController;
import com.eco.plugin.wink.workflow.kit.UserServiceKit;
import com.eco.plugin.wink.workflow.utils.*;
import com.fr.decision.authority.data.User;
import com.fr.decision.webservice.annotation.LoginStatusChecker;
import com.fr.json.JSONArray;
import com.fr.json.JSONObject;
import com.fr.stable.query.data.DataList;
import com.fr.third.springframework.stereotype.Controller;
import com.fr.third.springframework.web.bind.annotation.PostMapping;
import com.fr.third.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
@Controller
@LoginStatusChecker(required = false)
public class WorkflowProcessController {
/**
* 发起流程
* @param req
* @param res
*/
@PostMapping(value = "/workflow/process/start")
@ResponseBody
public void importWorkFlow(HttpServletRequest req, HttpServletResponse res){
JSONObject json = Utils.getRequestBody(req);
//处理当前流程节点
try {
operateWorkflow(json,req,"start");
} catch (Exception e) {
ResponseUtils.failedResponse(res,"发起失败:"+e.getMessage());
return ;
}
ResponseUtils.successResponse(res,"发起成功");
}
/**
* 审核流程
* @param req
* @param res
*/
@PostMapping(value = "/workflow/process/approve")
@ResponseBody
public void approve(HttpServletRequest req, HttpServletResponse res){
JSONObject json = Utils.getRequestBody(req);
//处理当前流程节点
try {
operateWorkflow(json,req,"approve");
} catch (Exception e) {
ResponseUtils.failedResponse(res,"审核失败:"+e.getMessage());
return ;
}
ResponseUtils.successResponse(res,"审核成功");
}
/**
* 处理流程
* @param param
* @param req
* @param type start 发起 approve审核
*/
private void operateWorkflow(JSONObject param,HttpServletRequest req,String type) throws Exception {
//参数
String formid = param.getString("formid");
String dataid = param.getString("dataid");
String comment = param.getString("comment");
//表单定义
FormDefEntity form = FormDbController.getById(formid);
//流程定义
WorkflowDefEntity workflowDefEntity = WorkflowConfigDbController.getByFormid(formid);
//流程节点
List<WorkflowNodeEntity> nodes = WorkflowConfigDbController.getNodesByWorkflowId(workflowDefEntity.getId());
//当前用户
User user = FRUserUtils.getCurrentUser(req);
//流程执行列表
List<WorkflowProcessEntity> processList = new ArrayList<>();
if(!"start".equals(type)){
processList = WorkFlowProcessController.getByFormidAndDataid(formid,dataid);
}
List<WorkflowProcessEntity> process = new ArrayList<>();
WorkflowProcessEntity currentNodeProcess = getCurrenNode(user,formid,dataid,nodes,processList);
WorkflowProcessEntity nextNodeProcess = getNextNodeProcess(currentNodeProcess,nodes,formid,dataid);
if(Utils.isNotNullStr(comment)){
currentNodeProcess.setComment(comment);
}
process.add(currentNodeProcess);
process.add(nextNodeProcess);
//操作流程处理表
WorkFlowProcessController.batch(process,null);
updateDataStatus(dataid,formid,nextNodeProcess,nodes);
}
/**
* 获取下个节点
* @param currentNodeProcess
* @param nodes
* @param formid
* @param dataid
* @return
* @throws Exception
*/
private WorkflowProcessEntity getNextNodeProcess(WorkflowProcessEntity currentNodeProcess, List<WorkflowNodeEntity> nodes, String formid, String dataid) throws Exception {
WorkflowProcessEntity current = new WorkflowProcessEntity();
current.setId(UUID.randomUUID().toString());
current.setFormid(formid);
current.setDataid(dataid);
current.setCreatetime(DateUtilSelf.getNow());
current.setLastnode(currentNodeProcess.getCurrentnode());
//结束
if(Utils.isNullStr(currentNodeProcess.getNextnode())){
current.setCurrentnode("结束");
WorkflowNodeEntity finnalNode = nodes.get(nodes.size() -1 );
String sort = String.valueOf(Integer.valueOf(finnalNode.getSort()) + 1);
current.setSort(sort);
}else{
Map<String,WorkflowNodeEntity> map = getNextAndThirdNodeByNode(currentNodeProcess.getNextnode(),nodes);
WorkflowNodeEntity currentNode = map.get("current");
WorkflowNodeEntity nextNode = map.get("next");
current.setCurrentnode(currentNode.getNode());
String checker = getChecker(currentNode.getRolename());
current.setOperateruser(checker);
if(nextNode != null){
current.setNextnode(nextNode.getNode());
}
current.setSort(currentNode.getSort());
}
return current;
}
/**
* 获取当前节点
* @param user
* @param formid
* @param dataid
* @param nodes
* @param processList
* @return
*/
private WorkflowProcessEntity getCurrenNode(User user, String formid, String dataid, List<WorkflowNodeEntity> nodes,List<WorkflowProcessEntity> processList){
boolean isStart = processList == null || processList.size() <= 0;
String currentNodeCode = isStart ? "" : processList.get(processList.size() -1).getCurrentnode();
Map<String,WorkflowNodeEntity> map = getCurrentAndNextByNode(currentNodeCode,nodes);
WorkflowNodeEntity currentNode = map.get("current");
WorkflowNodeEntity nextNode = map.get("next");
WorkflowProcessEntity current = new WorkflowProcessEntity();
//发起
if(isStart){
current.setId(UUID.randomUUID().toString());
current.setFormid(formid);
current.setDataid(dataid);
current.setCurrentnode(currentNode.getNode());
current.setNextnode(nextNode.getNode());
current.setOperateruser(user.getUserName());
current.setSort(currentNode.getSort());
current.setCreatetime(DateUtilSelf.getNow());
}else{
current = processList.get(processList.size() -1);
current.setOperateruser(current.getOperateruser()+"("+user.getUserName()+")");
}
return current;
}
/**
* 修改数据审核状态
* @param
*/
private void updateDataStatus(String dataid,String formid,WorkflowProcessEntity current,List<WorkflowNodeEntity> nodes) throws Exception {
FormDefEntity formDef = FormDbController.getById(formid);
String tablename = formDef.getTablename();
String nodename = "";
String currentuser = "";
if(current.getCurrentnode().equals("结束")){
nodename = "结束";
}else{
for (WorkflowNodeEntity node : nodes){
if(node.getNode().equals(current.getCurrentnode())){
nodename = node.getNodename();
currentuser = getCheckerForData(node.getRolename());
break;
}
}
}
String sql = "update " + tablename + " set status='"+nodename+"',currentuser='"+currentuser+"' where id = '"+dataid+"'";
JDBCUtils.update(sql);
}
/**
* 根据节点编码获取当前节点和下个节点
* @param node
* @param nodes
* @return
*/
private Map<String,WorkflowNodeEntity> getCurrentAndNextByNode(String node,List<WorkflowNodeEntity> nodes){
Map<String,WorkflowNodeEntity> map = new HashMap<>();
//发起流程 直接返回前两个节点
if(Utils.isNullStr(node)){
map.put("current",nodes.get(0));
map.put("next",nodes.get(1));
return map;
}
//审核流程
for(int i=0;i<nodes.size();i++){
WorkflowNodeEntity currentNode = nodes.get(i);
if(!currentNode.getNode().equals(node)){
continue;
}
map.put("current",currentNode);
map.put("next",null);
if(i != nodes.size() -1){
map.put("next",nodes.get(nodes.size() -1));
}
break;
}
return map;
}
/**
* 根据当前节点获取下个和下下个节点
* @param node
* @param nodes
* @return
*/
private Map<String,WorkflowNodeEntity> getNextAndThirdNodeByNode(String node,List<WorkflowNodeEntity> nodes){
Map<String,WorkflowNodeEntity> map = new HashMap<>();
for(int i=0;i<nodes.size();i++){
WorkflowNodeEntity currentNode = nodes.get(i);
if(!currentNode.getNode().equals(node)){
continue;
}
map.put("current",currentNode);
map.put("next",null);
if(i != nodes.size() -1){
map.put("next",nodes.get(nodes.size() -1));
}
break;
}
return map;
}
/**
* 根据角色名称获取审核人
* @param rolename
* @return
*/
private String getChecker(String rolename) throws Exception {
// return "xiamaofa";
List<User> users = UserServiceKit.getInstance().getAllUsersByRolename(rolename);
String checker = "";
for(User user : users){
checker+=","+user.getUserName();
}
checker = checker.replaceFirst(",","");
return checker;
}
/**
* 根据角色名称获取审核人-修改data审核人用
* @param rolename
* @return
*/
private String getCheckerForData(String rolename) throws Exception {
// return "[xiamaofa]";
List<User> users = UserServiceKit.getInstance().getAllUsersByRolename(rolename);
String checker = "";
for(User user : users){
checker+=",["+user.getUserName()+"]";
}
checker = checker.replaceFirst(",","");
return checker;
}
}

162
src/main/java/com/eco/plugin/wink/workflow/db/bean/DBLinkEntity.java

@ -0,0 +1,162 @@
package com.eco.plugin.wink.workflow.db.bean;
import com.fr.stable.db.entity.BaseEntity;
import com.fr.stable.db.entity.TableAssociation;
import com.fr.third.javax.persistence.Column;
import com.fr.third.javax.persistence.Entity;
import com.fr.third.javax.persistence.Table;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-07-29
* 数据库链接信息表
**/
@Entity
@Table(name = "plugin_wink_shop_workflow_entity_dblink")
@TableAssociation(associated = true)
public class DBLinkEntity extends BaseEntity {
//数据库类型
@Column(name = "dbtype")
private String dbtype = null;
//驱动
@Column(name = "driver")
private String driver = null;
//数据库名称
@Column(name = "dbname")
private String dbname = null;
//主机
@Column(name = "host")
private String host = null;
//端口
@Column(name = "port")
private String port = null;
//用户名
@Column(name = "username")
private String username = null;
//密码
@Column(name = "password")
private String password = null;
//编码
@Column(name = "encode")
private String encode = null;
//模式
@Column(name = "mode")
private String mode = null;
//数据库链接
@Column(name = "url")
private String url = null;
//创建时间
@Column(name = "createtime")
private String createtime = null;
//修改时间
@Column(name = "updatetime")
private String updatetime = null;
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
public String getUpdatetime() {
return updatetime;
}
public void setUpdatetime(String updatetime) {
this.updatetime = updatetime;
}
public String getDbtype() {
return dbtype;
}
public void setDbtype(String dbtype) {
this.dbtype = dbtype;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getDbname() {
return dbname;
}
public void setDbname(String dbname) {
this.dbname = dbname;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEncode() {
return encode;
}
public void setEncode(String encode) {
this.encode = encode;
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}

79
src/main/java/com/eco/plugin/wink/workflow/db/bean/FormDefEntity.java

@ -0,0 +1,79 @@
package com.eco.plugin.wink.workflow.db.bean;
import com.fr.stable.db.entity.BaseEntity;
import com.fr.stable.db.entity.TableAssociation;
import com.fr.third.javax.persistence.Column;
import com.fr.third.javax.persistence.Entity;
import com.fr.third.javax.persistence.Table;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-07-29
* 表单定义表
**/
@Entity
@Table(name = "plugin_wink_shop_workflow_form_def")
@TableAssociation(associated = true)
public class FormDefEntity extends BaseEntity {
//表名
@Column(name = "tablename")
private String tablename = null;
//表单名称
@Column(name = "formname")
private String formname = null;
//创建时间
@Column(name = "createtime")
private String createtime = null;
//修改时间
@Column(name = "updatetime")
private String updatetime = null;
//状态 --预留字段
@Column(name = "status")
private String status = null;
public String getTablename() {
return tablename;
}
public void setTablename(String tablename) {
this.tablename = tablename;
}
public String getFormname() {
return formname;
}
public void setFormname(String formname) {
this.formname = formname;
}
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
public String getUpdatetime() {
return updatetime;
}
public void setUpdatetime(String updatetime) {
this.updatetime = updatetime;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}

67
src/main/java/com/eco/plugin/wink/workflow/db/bean/FormDetailEntity.java

@ -0,0 +1,67 @@
package com.eco.plugin.wink.workflow.db.bean;
import com.fr.stable.db.entity.BaseEntity;
import com.fr.stable.db.entity.TableAssociation;
import com.fr.third.javax.persistence.Column;
import com.fr.third.javax.persistence.Entity;
import com.fr.third.javax.persistence.Table;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-07-29
* 表单明细表
**/
@Entity
@Table(name = "plugin_wink_shop_workflow_form_detail")
@TableAssociation(associated = true)
public class FormDetailEntity extends BaseEntity {
//表单id
@Column(name = "formid")
private String formid = null;
//字段名
@Column(name = "fieldname")
private String fieldname = null;
//字段描述
@Column(name = "fielddec")
private String fielddec = null;
//排序
@Column(name = "sort")
private String sort = null;
public String getFormid() {
return formid;
}
public void setFormid(String formid) {
this.formid = formid;
}
public String getFieldname() {
return fieldname;
}
public void setFieldname(String fieldname) {
this.fieldname = fieldname;
}
public String getFielddec() {
return fielddec;
}
public void setFielddec(String fielddec) {
this.fielddec = fielddec;
}
public String getSort() {
return sort;
}
public void setSort(String sort) {
this.sort = sort;
}
}

67
src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowDefEntity.java

@ -0,0 +1,67 @@
package com.eco.plugin.wink.workflow.db.bean;
import com.fr.stable.db.entity.BaseEntity;
import com.fr.stable.db.entity.TableAssociation;
import com.fr.third.javax.persistence.Column;
import com.fr.third.javax.persistence.Entity;
import com.fr.third.javax.persistence.Table;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-07-29
* 流程节点
**/
@Entity
@Table(name = "plugin_wink_shop_workflow_def")
@TableAssociation(associated = true)
public class WorkflowDefEntity extends BaseEntity {
//表单id
@Column(name = "formid")
private String formid = null;
//流程编码
@Column(name = "workflowcode")
private String workflowcode = null;
//流程名称
@Column(name = "workflowname")
private String workflowname = null;
//创建时间
@Column(name = "createtime")
private String createtime = null;
public String getFormid() {
return formid;
}
public void setFormid(String formid) {
this.formid = formid;
}
public String getWorkflowcode() {
return workflowcode;
}
public void setWorkflowcode(String workflowcode) {
this.workflowcode = workflowcode;
}
public String getWorkflowname() {
return workflowname;
}
public void setWorkflowname(String workflowname) {
this.workflowname = workflowname;
}
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
}

91
src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowNodeEntity.java

@ -0,0 +1,91 @@
package com.eco.plugin.wink.workflow.db.bean;
import com.fr.stable.db.entity.BaseEntity;
import com.fr.stable.db.entity.TableAssociation;
import com.fr.third.javax.persistence.Column;
import com.fr.third.javax.persistence.Entity;
import com.fr.third.javax.persistence.Table;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-07-29
* 流程定义表
**/
@Entity
@Table(name = "plugin_wink_shop_workflow_node")
@TableAssociation(associated = true)
public class WorkflowNodeEntity extends BaseEntity {
//表单id
@Column(name = "formid")
private String formid = null;
//流程id
@Column(name = "workflowid")
private String workflowid = null;
//节点编码 ---预留字段
@Column(name = "node")
private String node = null;
//节点名称
@Column(name = "nodename")
private String nodename = null;
//排序
@Column(name = "sort")
private String sort = null;
//角色名称
@Column(name = "rolename")
private String rolename = null;
public String getRolename() {
return rolename;
}
public void setRolename(String rolename) {
this.rolename = rolename;
}
public String getFormid() {
return formid;
}
public void setFormid(String formid) {
this.formid = formid;
}
public String getNode() {
return node;
}
public void setNode(String node) {
this.node = node;
}
public String getNodename() {
return nodename;
}
public void setNodename(String nodename) {
this.nodename = nodename;
}
public String getSort() {
return sort;
}
public void setSort(String sort) {
this.sort = sort;
}
public String getWorkflowid() {
return workflowid;
}
public void setWorkflowid(String workflowid) {
this.workflowid = workflowid;
}
}

125
src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowProcessEntity.java

@ -0,0 +1,125 @@
package com.eco.plugin.wink.workflow.db.bean;
import com.fr.stable.db.entity.BaseEntity;
import com.fr.stable.db.entity.TableAssociation;
import com.fr.third.javax.persistence.*;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-07-29
* 流程执行表
**/
@Entity
@Table(name = "plugin_wink_shop_workflow_process")
@TableAssociation(associated = true)
public class WorkflowProcessEntity extends BaseEntity {
//表单id
@Column(name = "formid")
private String formid = null;
//实体数据id
@Column(name = "dataid")
private String dataid = null;
//上个流程节点
@Column(name = "lastnode")
private String lastnode = null;
//当前流程节点
@Column(name = "currentnode")
private String currentnode = null;
//下个流程节点
@Column(name = "nextnode")
private String nextnode = null;
//经办人
@Column(name = "operateruser")
private String operateruser = null;
//排序
@Column(name = "sort")
private String sort = null;
//创建时间
@Column(name = "createtime")
private String createtime = null;
//审核意见
@Column(name = "comment")
private String comment = null;
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getFormid() {
return formid;
}
public void setFormid(String formid) {
this.formid = formid;
}
public String getDataid() {
return dataid;
}
public void setDataid(String dataid) {
this.dataid = dataid;
}
public String getLastnode() {
return lastnode;
}
public void setLastnode(String lastnode) {
this.lastnode = lastnode;
}
public String getCurrentnode() {
return currentnode;
}
public void setCurrentnode(String currentnode) {
this.currentnode = currentnode;
}
public String getNextnode() {
return nextnode;
}
public void setNextnode(String nextnode) {
this.nextnode = nextnode;
}
public String getOperateruser() {
return operateruser;
}
public void setOperateruser(String operateruser) {
this.operateruser = operateruser;
}
public String getSort() {
return sort;
}
public void setSort(String sort) {
this.sort = sort;
}
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
}

225
src/main/java/com/eco/plugin/wink/workflow/db/controller/FormDbController.java

@ -0,0 +1,225 @@
package com.eco.plugin.wink.workflow.db.controller;
import com.eco.plugin.wink.workflow.db.bean.FormDefEntity;
import com.eco.plugin.wink.workflow.db.bean.FormDetailEntity;
import com.eco.plugin.wink.workflow.db.dao.FormDefDao;
import com.eco.plugin.wink.workflow.db.dao.FormFieldDao;
import com.eco.plugin.wink.workflow.utils.FRUtils;
import com.fr.db.fun.impl.AbstractDBAccessProvider;
import com.fr.record.analyzer.EnableMetrics;
import com.fr.stable.db.accessor.DBAccessor;
import com.fr.stable.db.action.DBAction;
import com.fr.stable.db.dao.DAOContext;
import com.fr.stable.db.dao.DAOProvider;
import java.util.ArrayList;
import java.util.List;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-07-29
**/
@EnableMetrics
public class FormDbController extends AbstractDBAccessProvider {
private static DBAccessor accessor;
public static DBAccessor getAccessor() {
return accessor;
}
@Override
public DAOProvider[] registerDAO() {
return new DAOProvider[]{
FormDefDao.DAO, FormFieldDao.DAO
};
}
@Override
public void onDBAvailable(DBAccessor accessor) {
FormDbController.accessor = accessor;
}
/**
* 单个操作表单
* @param addOrUpdate
* @param delete
* @return
*/
public static boolean singleForm(FormDefEntity addOrUpdate, FormDefEntity delete){
//新增或者删除
if(addOrUpdate != null ){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
FormDefEntity ae =context.getDAO(FormDefDao.class).getById(addOrUpdate.getId());
if(ae != null ){
context.getDAO(FormDefDao.class).update(addOrUpdate);
}else{
context.getDAO(FormDefDao.class).add(addOrUpdate);
}
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("singleForm exception ->"+e.getMessage() + addOrUpdate.toString());
}
}
if(delete != null ){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
context.getDAO(FormDefDao.class).remove(delete.getId());
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("singleForm delete exception ->"+e.getMessage() + delete.toString());
}
}
return true;
}
/**
* 批量操作表单字段
* @param addOrUpdate
* @param delete
* @return
*/
public static boolean batch(List<FormDetailEntity> addOrUpdate, List<FormDetailEntity> delete){
//新增或者删除
if(addOrUpdate != null && addOrUpdate.size() > 0){
for(final FormDetailEntity dbe : addOrUpdate){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
FormDetailEntity ae =context.getDAO(FormFieldDao.class).getById(dbe.getId());
if(ae != null ){
context.getDAO(FormFieldDao.class).update(dbe);
}else{
context.getDAO(FormFieldDao.class).add(dbe);
}
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("batch addOrUpdate formfield exception ->"+e.getMessage() + dbe.toString());
}
}
}
if(delete != null && delete.size() > 0){
for(final FormDetailEntity dbe : delete){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
context.getDAO(FormFieldDao.class).remove(dbe.getId());
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("batch formfiled delete exception ->"+e.getMessage() + dbe.toString());
}
}
}
return true;
}
/**
* 获取所有表单信息
* @param
* @return
*/
public static List<FormDefEntity> getFormList(){
try{
return accessor.runQueryAction(new DBAction<List<FormDefEntity>>() {
@Override
public List<FormDefEntity> run(DAOContext context) throws Exception {
List<FormDefEntity> result = context.getDAO(FormDefDao.class).getAll();
return result == null ? new ArrayList<FormDefEntity>() : result;
}
});
}catch(Throwable e){
FRUtils.FRLogError("exception getAllDBLink:"+e.getMessage());
}
return new ArrayList<FormDefEntity>();
}
/**
* 根据tablename获取表单
* @param
* @return
*/
public static FormDefEntity getByTablename(final String tablename){
try{
return accessor.runQueryAction(new DBAction<FormDefEntity>() {
@Override
public FormDefEntity run(DAOContext context) throws Exception {
FormDefEntity result = context.getDAO(FormDefDao.class).getByTablename(tablename);
return result == null ? new FormDefEntity() : result;
}
});
}catch(Throwable e){
FRUtils.FRLogError("exception getAllDBLink:"+e.getMessage());
}
return new FormDefEntity();
}
/**
* 根据id获取表单
* @param
* @return
*/
public static FormDefEntity getById(final String id){
try{
return accessor.runQueryAction(new DBAction<FormDefEntity>() {
@Override
public FormDefEntity run(DAOContext context) throws Exception {
FormDefEntity result = context.getDAO(FormDefDao.class).getById(id);
return result == null ? new FormDefEntity() : result;
}
});
}catch(Throwable e){
FRUtils.FRLogError("exception getById:"+e.getMessage());
}
return new FormDefEntity();
}
/**
* 根据表单id获取字段列表
* @param
* @return
*/
public static List<FormDetailEntity> getFieldByFormId(String formid){
try{
return accessor.runQueryAction(new DBAction<List<FormDetailEntity>>() {
@Override
public List<FormDetailEntity> run(DAOContext context) throws Exception {
List<FormDetailEntity> result = context.getDAO(FormFieldDao.class).getFieldById(formid);
return result == null ? new ArrayList<FormDetailEntity>() : result;
}
});
}catch(Throwable e){
FRUtils.FRLogError("exception getAllDBLink:"+e.getMessage());
}
return new ArrayList<FormDetailEntity>();
}
}

228
src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkFlowController.java

@ -0,0 +1,228 @@
package com.eco.plugin.wink.workflow.db.controller;
import com.eco.plugin.wink.workflow.db.bean.DBLinkEntity;
import com.eco.plugin.wink.workflow.db.bean.FormDefEntity;
import com.eco.plugin.wink.workflow.db.bean.FormDetailEntity;
import com.eco.plugin.wink.workflow.db.dao.DBLinkDao;
import com.eco.plugin.wink.workflow.db.dao.FormDefDao;
import com.eco.plugin.wink.workflow.db.dao.FormFieldDao;
import com.eco.plugin.wink.workflow.utils.FRUtils;
import com.fr.db.fun.impl.AbstractDBAccessProvider;
import com.fr.plugin.transform.FunctionRecorder;
import com.fr.record.analyzer.EnableMetrics;
import com.fr.stable.db.accessor.DBAccessor;
import com.fr.stable.db.action.DBAction;
import com.fr.stable.db.dao.DAOContext;
import com.fr.stable.db.dao.DAOProvider;
import java.util.ArrayList;
import java.util.List;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-07-29
**/
@EnableMetrics
public class WorkFlowController extends AbstractDBAccessProvider {
private static DBAccessor accessor;
public static DBAccessor getAccessor() {
return accessor;
}
@Override
public DAOProvider[] registerDAO() {
return new DAOProvider[]{
DBLinkDao.DAO, FormDefDao.DAO, FormFieldDao.DAO
};
}
@Override
public void onDBAvailable(DBAccessor accessor) {
WorkFlowController.accessor = accessor;
}
/**
* 单个操作数据库链接
* @param addOrUpdate
* @param delete
* @return
*/
public static boolean singleDBLink(DBLinkEntity addOrUpdate,DBLinkEntity delete){
//新增或者删除
if(addOrUpdate != null ){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
DBLinkEntity ae =context.getDAO(DBLinkDao.class).getById(addOrUpdate.getId());
if(ae != null ){
context.getDAO(DBLinkDao.class).update(addOrUpdate);
}else{
context.getDAO(DBLinkDao.class).add(addOrUpdate);
}
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("singleDBLink exception ->"+e.getMessage() + addOrUpdate.toString());
}
}
if(delete != null ){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
context.getDAO(DBLinkDao.class).remove(delete.getId());
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("singleDBLink delete exception ->"+e.getMessage() + delete.toString());
}
}
return true;
}
/**
* 获取所有数据库链接信息
* @param
* @return
*/
public static List<DBLinkEntity> getAllDBLink(){
try{
return accessor.runQueryAction(new DBAction<List<DBLinkEntity>>() {
@Override
public List<DBLinkEntity> run(DAOContext context) throws Exception {
List<DBLinkEntity> result = context.getDAO(DBLinkDao.class).getAll();
return result == null ? new ArrayList<DBLinkEntity>() : result;
}
});
}catch(Throwable e){
FRUtils.FRLogError("exception getAllDBLink:"+e.getMessage());
}
return new ArrayList<DBLinkEntity>();
}
/**
* 根据id获取信息
* @param id
* @return
*/
public static DBLinkEntity getDBLinkById(final String id){
try{
return accessor.runQueryAction(new DBAction<DBLinkEntity>() {
@Override
public DBLinkEntity run(DAOContext context) throws Exception {
DBLinkEntity result = context.getDAO(DBLinkDao.class).getById(id);
return result == null ? new DBLinkEntity() : result;
}
});
}catch(Throwable e){
FRUtils.FRLogError("exception getDBLinkById:"+e.getMessage());
}
return new DBLinkEntity();
}
/**
* 单个操作表单
* @param addOrUpdate
* @param delete
* @return
*/
public static boolean singleForm(FormDefEntity addOrUpdate, FormDefEntity delete){
//新增或者删除
if(addOrUpdate != null ){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
FormDefEntity ae =context.getDAO(FormDefDao.class).getById(addOrUpdate.getId());
if(ae != null ){
context.getDAO(FormDefDao.class).update(addOrUpdate);
}else{
context.getDAO(FormDefDao.class).add(addOrUpdate);
}
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("singleForm exception ->"+e.getMessage() + addOrUpdate.toString());
}
}
if(delete != null ){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
context.getDAO(FormDefDao.class).remove(delete.getId());
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("singleForm delete exception ->"+e.getMessage() + delete.toString());
}
}
return true;
}
/**
* 批量操作表单字段
* @param addOrUpdate
* @param delete
* @return
*/
public static boolean batch(List<FormDetailEntity> addOrUpdate, List<FormDetailEntity> delete){
//新增或者删除
if(addOrUpdate != null && addOrUpdate.size() > 0){
for(final FormDetailEntity dbe : addOrUpdate){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
FormDetailEntity ae =context.getDAO(FormFieldDao.class).getById(dbe.getId());
if(ae != null ){
context.getDAO(FormFieldDao.class).update(dbe);
}else{
context.getDAO(FormFieldDao.class).add(dbe);
}
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("batch addOrUpdate formfield exception ->"+e.getMessage() + dbe.toString());
}
}
}
if(delete != null && delete.size() > 0){
for(final FormDetailEntity dbe : delete){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
context.getDAO(FormFieldDao.class).remove(dbe.getId());
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("batch formfiled delete exception ->"+e.getMessage() + dbe.toString());
}
}
}
return true;
}
}

115
src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkFlowProcessController.java

@ -0,0 +1,115 @@
package com.eco.plugin.wink.workflow.db.controller;
import com.eco.plugin.wink.workflow.db.bean.DBLinkEntity;
import com.eco.plugin.wink.workflow.db.bean.WorkflowProcessEntity;
import com.eco.plugin.wink.workflow.db.dao.DBLinkDao;
import com.eco.plugin.wink.workflow.db.dao.WorkflowProcessDao;
import com.eco.plugin.wink.workflow.utils.FRUtils;
import com.fr.db.fun.impl.AbstractDBAccessProvider;
import com.fr.record.analyzer.EnableMetrics;
import com.fr.stable.db.accessor.DBAccessor;
import com.fr.stable.db.action.DBAction;
import com.fr.stable.db.dao.DAOContext;
import com.fr.stable.db.dao.DAOProvider;
import java.util.ArrayList;
import java.util.List;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-07-29
**/
@EnableMetrics
public class WorkFlowProcessController extends AbstractDBAccessProvider {
private static DBAccessor accessor;
public static DBAccessor getAccessor() {
return accessor;
}
@Override
public DAOProvider[] registerDAO() {
return new DAOProvider[]{
WorkflowProcessDao.DAO
};
}
@Override
public void onDBAvailable(DBAccessor accessor) {
WorkFlowProcessController.accessor = accessor;
}
/**
* 批量发起审核
* @param addOrUpdate
* @param delete
* @return
*/
public static boolean batch(List<WorkflowProcessEntity> addOrUpdate, List<WorkflowProcessEntity> delete){
//新增或者删除
if(addOrUpdate != null && addOrUpdate.size() > 0){
for(final WorkflowProcessEntity dbe : addOrUpdate){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
WorkflowProcessEntity ae =context.getDAO(WorkflowProcessDao.class).getById(dbe.getId());
if(ae != null ){
context.getDAO(WorkflowProcessDao.class).update(dbe);
}else{
context.getDAO(WorkflowProcessDao.class).add(dbe);
}
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("batch addOrUpdate formfield exception ->"+e.getMessage() + dbe.toString());
}
}
}
if(delete != null && delete.size() > 0){
for(final WorkflowProcessEntity dbe : delete){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
context.getDAO(WorkflowProcessDao.class).remove(dbe.getId());
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("batch formfiled delete exception ->"+e.getMessage() + dbe.toString());
}
}
}
return true;
}
/**
* 根据formid和dataid获取流程
* @param
* @return
*/
public static List<WorkflowProcessEntity> getByFormidAndDataid(String formid,String dataid){
try{
return accessor.runQueryAction(new DBAction<List<WorkflowProcessEntity>>() {
@Override
public List<WorkflowProcessEntity> run(DAOContext context) throws Exception {
List<WorkflowProcessEntity> result = context.getDAO(WorkflowProcessDao.class).getByFormidAndDataid(formid,dataid);
return result == null ? new ArrayList<WorkflowProcessEntity>() : result;
}
});
}catch(Throwable e){
FRUtils.FRLogError("exception getAllDBLink:"+e.getMessage());
}
return new ArrayList<WorkflowProcessEntity>();
}
}

205
src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkflowConfigDbController.java

@ -0,0 +1,205 @@
package com.eco.plugin.wink.workflow.db.controller;
import com.eco.plugin.wink.workflow.db.bean.WorkflowDefEntity;
import com.eco.plugin.wink.workflow.db.bean.WorkflowNodeEntity;
import com.eco.plugin.wink.workflow.db.dao.WorkflowDefDao;
import com.eco.plugin.wink.workflow.db.dao.WorkflowNodeDao;
import com.eco.plugin.wink.workflow.db.dao.WorkflowDefDao;
import com.eco.plugin.wink.workflow.db.dao.WorkflowNodeDao;
import com.eco.plugin.wink.workflow.utils.FRUtils;
import com.fr.db.fun.impl.AbstractDBAccessProvider;
import com.fr.record.analyzer.EnableMetrics;
import com.fr.stable.db.accessor.DBAccessor;
import com.fr.stable.db.action.DBAction;
import com.fr.stable.db.dao.DAOContext;
import com.fr.stable.db.dao.DAOProvider;
import java.util.ArrayList;
import java.util.List;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-07-29
**/
@EnableMetrics
public class WorkflowConfigDbController extends AbstractDBAccessProvider {
private static DBAccessor accessor;
public static DBAccessor getAccessor() {
return accessor;
}
@Override
public DAOProvider[] registerDAO() {
return new DAOProvider[]{
WorkflowDefDao.DAO, WorkflowNodeDao.DAO
};
}
@Override
public void onDBAvailable(DBAccessor accessor) {
WorkflowConfigDbController.accessor = accessor;
}
/**
* 单个操作流程定义
* @param addOrUpdate
* @param delete
* @return
*/
public static boolean singleWorkflowDef(WorkflowDefEntity addOrUpdate, WorkflowDefEntity delete){
//新增或者删除
if(addOrUpdate != null ){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
WorkflowDefEntity ae =context.getDAO(WorkflowDefDao.class).getById(addOrUpdate.getId());
if(ae != null ){
context.getDAO(WorkflowDefDao.class).update(addOrUpdate);
}else{
context.getDAO(WorkflowDefDao.class).add(addOrUpdate);
}
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("singleWorkflowDef exception ->"+e.getMessage() + addOrUpdate.toString());
}
}
if(delete != null ){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
context.getDAO(WorkflowDefDao.class).remove(delete.getId());
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("singleWorkflowDef delete exception ->"+e.getMessage() + delete.toString());
}
}
return true;
}
/**
* 批量操作流程节点
* @param addOrUpdate
* @param delete
* @return
*/
public static boolean batchWorkflowNode(List<WorkflowNodeEntity> addOrUpdate, List<WorkflowNodeEntity> delete){
//新增或者删除
if(addOrUpdate != null && addOrUpdate.size() > 0){
for(final WorkflowNodeEntity dbe : addOrUpdate){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
WorkflowNodeEntity ae =context.getDAO(WorkflowNodeDao.class).getById(dbe.getId());
if(ae != null ){
context.getDAO(WorkflowNodeDao.class).update(dbe);
}else{
context.getDAO(WorkflowNodeDao.class).add(dbe);
}
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("batch addOrUpdate batchWorkflowNode exception ->"+e.getMessage() + dbe.toString());
}
}
}
if(delete != null && delete.size() > 0){
for(final WorkflowNodeEntity dbe : delete){
try{
accessor.runDMLAction(new DBAction<Boolean>() {
@Override
public Boolean run(DAOContext context) throws Exception {
context.getDAO(WorkflowNodeDao.class).remove(dbe.getId());
return true;
}
});
}catch(Throwable e){
FRUtils.FRLogError("batch batchWorkflowNode delete exception ->"+e.getMessage() + dbe.toString());
}
}
}
return true;
}
/**
* 获取所有流程定义信息
* @param
* @return
*/
public static List<WorkflowDefEntity> getWrokflowDefList(){
try{
return accessor.runQueryAction(new DBAction<List<WorkflowDefEntity>>() {
@Override
public List<WorkflowDefEntity> run(DAOContext context) throws Exception {
List<WorkflowDefEntity> result = context.getDAO(WorkflowDefDao.class).getAll();
return result == null ? new ArrayList<WorkflowDefEntity>() : result;
}
});
}catch(Throwable e){
FRUtils.FRLogError("exception getWrokflowDefList:"+e.getMessage());
}
return new ArrayList<WorkflowDefEntity>();
}
/**
* 根据表单获取流程定义
* @param formid
* @return
*/
public static WorkflowDefEntity getByFormid(String formid){
try{
return accessor.runQueryAction(new DBAction<WorkflowDefEntity>() {
@Override
public WorkflowDefEntity run(DAOContext context) throws Exception {
WorkflowDefEntity result = context.getDAO(WorkflowDefDao.class).getByFormid(formid);
return result == null ? new WorkflowDefEntity() : result;
}
});
}catch(Throwable e){
FRUtils.FRLogError("exception getWrokflowDefList:"+e.getMessage());
}
return new WorkflowDefEntity();
}
/**
* 根据workflowid获取流程节点
* @param
* @return
*/
public static List<WorkflowNodeEntity> getNodesByWorkflowId(String formid){
try{
return accessor.runQueryAction(new DBAction<List<WorkflowNodeEntity>>() {
@Override
public List<WorkflowNodeEntity> run(DAOContext context) throws Exception {
List<WorkflowNodeEntity> result = context.getDAO(WorkflowNodeDao.class).getFieldById(formid);
return result == null ? new ArrayList<WorkflowNodeEntity>() : result;
}
});
}catch(Throwable e){
FRUtils.FRLogError("exception getNodesByWorkflowId:"+e.getMessage());
}
return new ArrayList<WorkflowNodeEntity>();
}
}

57
src/main/java/com/eco/plugin/wink/workflow/db/dao/DBLinkDao.java

@ -0,0 +1,57 @@
package com.eco.plugin.wink.workflow.db.dao;
import com.eco.plugin.wink.workflow.db.bean.DBLinkEntity;
import com.fr.stable.db.dao.BaseDAO;
import com.fr.stable.db.dao.DAOProvider;
import com.fr.stable.db.session.DAOSession;
import com.fr.stable.query.QueryFactory;
import com.fr.stable.query.restriction.RestrictionFactory;
import java.util.List;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-12-03
**/
public class DBLinkDao extends BaseDAO<DBLinkEntity> {
public DBLinkDao(DAOSession session) {
super(session);
}
@Override
protected Class<DBLinkEntity> getEntityClass() {
return DBLinkEntity.class;
}
public final static DAOProvider DAO = new DAOProvider() {
@Override
public Class getEntityClass() {
return DBLinkEntity.class;
}
@Override
public Class<? extends BaseDAO> getDAOClass() {
return DBLinkDao.class;
}
};
public void add(DBLinkEntity entity) throws Exception {
getSession().persist(entity);
}
public void remove(String id) throws Exception {
getSession().remove(QueryFactory.create()
.addRestriction(RestrictionFactory.eq("id", id)),
this.getEntityClass());
}
public void update(DBLinkEntity entity) throws Exception {
getSession().merge(entity);
}
public List<DBLinkEntity> getAll () throws Exception {
return getSession().find(QueryFactory.create().addSort("createtime",false),DBLinkEntity.class);
}
}

67
src/main/java/com/eco/plugin/wink/workflow/db/dao/FormDefDao.java

@ -0,0 +1,67 @@
package com.eco.plugin.wink.workflow.db.dao;
import com.eco.plugin.wink.workflow.db.bean.FormDefEntity;
import com.fr.stable.db.dao.BaseDAO;
import com.fr.stable.db.dao.DAOProvider;
import com.fr.stable.db.session.DAOSession;
import com.fr.stable.query.QueryFactory;
import com.fr.stable.query.restriction.RestrictionFactory;
import java.util.List;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-12-03
**/
public class FormDefDao extends BaseDAO<FormDefEntity> {
public FormDefDao(DAOSession session) {
super(session);
}
@Override
protected Class<FormDefEntity> getEntityClass() {
return FormDefEntity.class;
}
public final static DAOProvider DAO = new DAOProvider() {
@Override
public Class getEntityClass() {
return FormDefEntity.class;
}
@Override
public Class<? extends BaseDAO> getDAOClass() {
return FormDefDao.class;
}
};
public void add(FormDefEntity entity) throws Exception {
getSession().persist(entity);
}
public void remove(String id) throws Exception {
getSession().remove(QueryFactory.create()
.addRestriction(RestrictionFactory.eq("id", id)),
this.getEntityClass());
}
public void update(FormDefEntity entity) throws Exception {
getSession().merge(entity);
}
public List<FormDefEntity> getAll () throws Exception {
return getSession().find(QueryFactory.create().addSort("createtime",false),FormDefEntity.class);
}
/**
* 根据表名获取表单定义对象
* @param tablename
* @return
* @throws Exception
*/
public FormDefEntity getByTablename(String tablename) throws Exception {
return getSession().findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("tablename",tablename)),FormDefEntity.class);
}
}

61
src/main/java/com/eco/plugin/wink/workflow/db/dao/FormFieldDao.java

@ -0,0 +1,61 @@
package com.eco.plugin.wink.workflow.db.dao;
import com.eco.plugin.wink.workflow.db.bean.FormDetailEntity;
import com.fr.stable.db.dao.BaseDAO;
import com.fr.stable.db.dao.DAOProvider;
import com.fr.stable.db.session.DAOSession;
import com.fr.stable.query.QueryFactory;
import com.fr.stable.query.restriction.RestrictionFactory;
import java.util.List;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-12-03
**/
public class FormFieldDao extends BaseDAO<FormDetailEntity> {
public FormFieldDao(DAOSession session) {
super(session);
}
@Override
protected Class<FormDetailEntity> getEntityClass() {
return FormDetailEntity.class;
}
public final static DAOProvider DAO = new DAOProvider() {
@Override
public Class getEntityClass() {
return FormDetailEntity.class;
}
@Override
public Class<? extends BaseDAO> getDAOClass() {
return FormFieldDao.class;
}
};
public void add(FormDetailEntity entity) throws Exception {
getSession().persist(entity);
}
public void remove(String id) throws Exception {
getSession().remove(QueryFactory.create()
.addRestriction(RestrictionFactory.eq("id", id)),
this.getEntityClass());
}
public void update(FormDetailEntity entity) throws Exception {
getSession().merge(entity);
}
// public List<FormDetailEntity> getAll () throws Exception {
//// return getSession().find(QueryFactory.create().addSort("createtime",false),FormDetailEntity.class);
// }
public List<FormDetailEntity> getFieldById(String formid) throws Exception{
return getSession().find(QueryFactory.create().addRestriction(RestrictionFactory.eq("formid",formid)).addSort("sort",false),FormDetailEntity.class);
}
}

62
src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowDefDao.java

@ -0,0 +1,62 @@
package com.eco.plugin.wink.workflow.db.dao;
import com.eco.plugin.wink.workflow.db.bean.WorkflowDefEntity;
import com.fr.stable.db.dao.BaseDAO;
import com.fr.stable.db.dao.DAOProvider;
import com.fr.stable.db.session.DAOSession;
import com.fr.stable.query.QueryFactory;
import com.fr.stable.query.restriction.RestrictionFactory;
import java.util.List;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-12-03
**/
public class WorkflowDefDao extends BaseDAO<WorkflowDefEntity> {
public WorkflowDefDao(DAOSession session) {
super(session);
}
@Override
protected Class<WorkflowDefEntity> getEntityClass() {
return WorkflowDefEntity.class;
}
public final static DAOProvider DAO = new DAOProvider() {
@Override
public Class getEntityClass() {
return WorkflowDefEntity.class;
}
@Override
public Class<? extends BaseDAO> getDAOClass() {
return WorkflowDefDao.class;
}
};
public void add(WorkflowDefEntity entity) throws Exception {
getSession().persist(entity);
}
public void remove(String id) throws Exception {
getSession().remove(QueryFactory.create()
.addRestriction(RestrictionFactory.eq("id", id)),
this.getEntityClass());
}
public void update(WorkflowDefEntity entity) throws Exception {
getSession().merge(entity);
}
public List<WorkflowDefEntity> getAll () throws Exception {
return getSession().find(QueryFactory.create().addSort("createtime",false),WorkflowDefEntity.class);
}
//根据formid获取流程定义
public WorkflowDefEntity getByFormid (String formid) throws Exception {
return getSession().findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("formid",formid)).addSort("createtime",false),WorkflowDefEntity.class);
}
}

57
src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowNodeDao.java

@ -0,0 +1,57 @@
package com.eco.plugin.wink.workflow.db.dao;
import com.eco.plugin.wink.workflow.db.bean.WorkflowNodeEntity;
import com.fr.stable.db.dao.BaseDAO;
import com.fr.stable.db.dao.DAOProvider;
import com.fr.stable.db.session.DAOSession;
import com.fr.stable.query.QueryFactory;
import com.fr.stable.query.restriction.RestrictionFactory;
import java.util.List;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-12-03
**/
public class WorkflowNodeDao extends BaseDAO<WorkflowNodeEntity> {
public WorkflowNodeDao(DAOSession session) {
super(session);
}
@Override
protected Class<WorkflowNodeEntity> getEntityClass() {
return WorkflowNodeEntity.class;
}
public final static DAOProvider DAO = new DAOProvider() {
@Override
public Class getEntityClass() {
return WorkflowNodeEntity.class;
}
@Override
public Class<? extends BaseDAO> getDAOClass() {
return WorkflowNodeDao.class;
}
};
public void add(WorkflowNodeEntity entity) throws Exception {
getSession().persist(entity);
}
public void remove(String id) throws Exception {
getSession().remove(QueryFactory.create()
.addRestriction(RestrictionFactory.eq("id", id)),
this.getEntityClass());
}
public void update(WorkflowNodeEntity entity) throws Exception {
getSession().merge(entity);
}
public List<WorkflowNodeEntity> getFieldById(String workflowId) throws Exception{
return getSession().find(QueryFactory.create().addRestriction(RestrictionFactory.eq("workflowid",workflowId)).addSort("sort",false),WorkflowNodeEntity.class);
}
}

61
src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowProcessDao.java

@ -0,0 +1,61 @@
package com.eco.plugin.wink.workflow.db.dao;
import com.eco.plugin.wink.workflow.db.bean.WorkflowProcessEntity;
import com.fr.stable.db.dao.BaseDAO;
import com.fr.stable.db.dao.DAOProvider;
import com.fr.stable.db.session.DAOSession;
import com.fr.stable.query.QueryFactory;
import com.fr.stable.query.restriction.RestrictionFactory;
import java.util.List;
/**
* @author wink
* @version 10.0
* Created by wink on 2021-12-03
**/
public class WorkflowProcessDao extends BaseDAO<WorkflowProcessEntity> {
public WorkflowProcessDao(DAOSession session) {
super(session);
}
@Override
protected Class<WorkflowProcessEntity> getEntityClass() {
return WorkflowProcessEntity.class;
}
public final static DAOProvider DAO = new DAOProvider() {
@Override
public Class getEntityClass() {
return WorkflowProcessEntity.class;
}
@Override
public Class<? extends BaseDAO> getDAOClass() {
return WorkflowProcessDao.class;
}
};
public void add(WorkflowProcessEntity entity) throws Exception {
getSession().persist(entity);
}
public void remove(String id) throws Exception {
getSession().remove(QueryFactory.create()
.addRestriction(RestrictionFactory.eq("id", id)),
this.getEntityClass());
}
public void update(WorkflowProcessEntity entity) throws Exception {
getSession().merge(entity);
}
public List<WorkflowProcessEntity> getAll () throws Exception {
return getSession().find(QueryFactory.create().addSort("createtime",false),WorkflowProcessEntity.class);
}
public List<WorkflowProcessEntity> getByFormidAndDataid (String formid,String dataid) throws Exception {
return getSession().find(QueryFactory.create().addRestriction(RestrictionFactory.eq("formid",formid)).addRestriction(RestrictionFactory.eq("dataid",dataid)).addSort("createtime",false).addSort("sort",false),WorkflowProcessEntity.class);
}
}

55
src/main/java/com/eco/plugin/wink/workflow/kit/CustomRoleServiceKit.java

@ -0,0 +1,55 @@
package com.eco.plugin.wink.workflow.kit;
import com.eco.plugin.wink.workflow.utils.FRUserUtils;
import com.eco.plugin.wink.workflow.utils.FRUtils;
import com.fr.decision.authority.AuthorityContext;
import com.fr.decision.authority.base.constant.SoftRoleType;
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType;
import com.fr.decision.authority.data.CustomRole;
import com.fr.decision.authority.data.User;
import com.fr.decision.base.util.UUIDUtil;
import com.fr.decision.privilege.encrpt.PasswordValidator;
import com.fr.decision.webservice.bean.user.RoleBean;
import com.fr.decision.webservice.bean.user.UserBean;
import com.fr.decision.webservice.exception.general.DuplicatedNameException;
import com.fr.decision.webservice.exception.general.SpecialCharProhibitException;
import com.fr.decision.webservice.exception.login.UserPasswordCanNotEmptyException;
import com.fr.decision.webservice.utils.CharLimitType;
import com.fr.decision.webservice.utils.ControllerFactory;
import com.fr.decision.webservice.utils.UserSourceFactory;
import com.fr.decision.webservice.utils.WebServiceUtils;
import com.fr.decision.webservice.v10.user.CustomRoleService;
import com.fr.decision.webservice.v10.user.UserService;
import com.fr.stable.StringUtils;
import com.fr.stable.query.QueryFactory;
import com.fr.stable.query.condition.QueryCondition;
import com.fr.stable.query.restriction.Restriction;
import com.fr.stable.query.restriction.RestrictionFactory;
/**
* 普通角色Service
*/
public class CustomRoleServiceKit extends CustomRoleService {
private static volatile CustomRoleServiceKit roleServiceKit = null;
public CustomRoleServiceKit() {
}
public static CustomRoleServiceKit getInstance() {
if (roleServiceKit == null) {
roleServiceKit = new CustomRoleServiceKit();
}
return roleServiceKit;
}
/**
* 根据角色名获取角色信息
* @param rolename
* @return
* @throws Exception
*/
public CustomRole getByRolename(String rolename) throws Exception {
CustomRole customRole = AuthorityContext.getInstance().getCustomRoleController().findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("name",rolename)));
return customRole;
}
}

115
src/main/java/com/eco/plugin/wink/workflow/kit/UserServiceKit.java

@ -0,0 +1,115 @@
package com.eco.plugin.wink.workflow.kit;
import com.eco.plugin.wink.workflow.utils.FRUserUtils;
import com.eco.plugin.wink.workflow.utils.FRUtils;
import com.fr.decision.authority.AuthorityContext;
import com.fr.decision.authority.base.constant.SoftRoleType;
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType;
import com.fr.decision.authority.data.CustomRole;
import com.fr.decision.authority.data.User;
import com.fr.decision.base.util.UUIDUtil;
import com.fr.decision.privilege.encrpt.PasswordValidator;
import com.fr.decision.webservice.bean.user.UserBean;
import com.fr.decision.webservice.exception.general.DuplicatedNameException;
import com.fr.decision.webservice.exception.general.SpecialCharProhibitException;
import com.fr.decision.webservice.exception.login.UserPasswordCanNotEmptyException;
import com.fr.decision.webservice.utils.CharLimitType;
import com.fr.decision.webservice.utils.ControllerFactory;
import com.fr.decision.webservice.utils.UserSourceFactory;
import com.fr.decision.webservice.utils.WebServiceUtils;
import com.fr.decision.webservice.v10.user.UserService;
import com.fr.stable.StringUtils;
import com.fr.stable.query.QueryFactory;
import com.fr.stable.query.condition.QueryCondition;
import com.fr.stable.query.data.DataList;
import com.fr.stable.query.restriction.Restriction;
import com.fr.stable.query.restriction.RestrictionFactory;
import java.util.List;
public class UserServiceKit extends UserService {
private static volatile UserServiceKit userServiceKit = null;
public UserServiceKit() {
}
public static UserServiceKit getInstance() {
if (userServiceKit == null) {
userServiceKit = new UserServiceKit();
}
return userServiceKit;
}
public void editUser(UserBean userBean, String var2) throws Exception {
this.editUserInfo(userBean);
if (userBean.isResetPassword()) {
this.resetPassword(userBean);
}
this.updateUserRoles(var2, userBean);
this.updateUserDepartmentPost(var2, userBean);
}
/**
* 添加用户
* @param userBean
* @throws Exception
*/
public void addUser(UserBean userBean) throws Exception {
if (StringUtils.isEmpty(userBean.getPassword())) {
throw new UserPasswordCanNotEmptyException();
} else {
String username = userBean.getUsername();
String mobile = userBean.getMobile();
String email = userBean.getEmail();
String id = userBean.getId();
String psd = userBean.getPassword();
this.checkUsernameLegal(username, CharLimitType.USER_LIMIT);
this.checkNonRequiredField(mobile, CharLimitType.MOBILE_LIMIT);
this.checkNonRequiredField(email, CharLimitType.EMAIL_LIMIT);
this.checkDuplicatedUser(username);
String salt = UUIDUtil.generate();
PasswordValidator var8 = UserSourceFactory.getInstance().getUserSource(ManualOperationType.KEY).getPasswordValidator();
User user = (new User()).userName(username).realName(userBean.getRealName()).password(var8.encode(username, psd, salt)).salt(salt).email(userBean.getEmail()).mobile(userBean.getMobile()).creationType(ManualOperationType.KEY).lastOperationType(ManualOperationType.KEY).enable(true).id(id);
FRUtils.FRLogInfo(user.toString());
AuthorityContext.getInstance().getUserController().add(user);
this.deleteSoftData(user.getUserName());
}
}
/**
* 获取角色下所有用户
* @param rolename
* @return
* @throws Exception
*/
public List<User> getAllUsersByRolename(String rolename) throws Exception{
UserBean userBean = FRUserUtils.getAdminUser();
CustomRole customRole = CustomRoleServiceKit.getInstance().getByRolename(rolename);
return ControllerFactory.getInstance().getUserController(userBean.getUsername()).findAllUsersByCustomRole(userBean.getId(), customRole.getId(), "", false).getList();
}
private void checkUsernameLegal(String var1, CharLimitType var2) throws SpecialCharProhibitException {
if (WebServiceUtils.containSQLChars(var1) || WebServiceUtils.containIllegalChars(var2, var1)) {
throw new SpecialCharProhibitException();
}
}
private void checkNonRequiredField(String var1, CharLimitType var2) {
if (StringUtils.isNotEmpty(var1) && WebServiceUtils.containIllegalChars(var2, var1)) {
throw new SpecialCharProhibitException();
}
}
private void checkDuplicatedUser(String var1) throws Exception {
User var2 = this.getUserByUserName(var1);
if (var2 != null) {
throw new DuplicatedNameException("Duplicated names! ", var1);
}
}
private void deleteSoftData(String var1) throws Exception {
QueryCondition var2 = QueryFactory.create().addRestriction(RestrictionFactory.and(new Restriction[]{RestrictionFactory.eq("deletedName", var1), RestrictionFactory.eq("type", SoftRoleType.USER)}));
AuthorityContext.getInstance().getSoftDataController().remove(var2);
}
}

235
src/main/java/com/eco/plugin/wink/workflow/utils/DateUtilSelf.java

@ -0,0 +1,235 @@
package com.eco.plugin.wink.workflow.utils;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class DateUtilSelf {
/**
* 获取当前时间 格式 yyyy-MM-dd HH:mm:ss
* @return
*/
public static String getNow() {
return DateToString(new Date(),"yyyy-MM-dd HH:mm:ss");
}
/**
* 日期转换为日期字符串
* @param date
* @param formatStr
* @return String
*/
public static String DateToString(Date date,String formatStr) {
SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
String dateStr = sdf.format(date).toString();
return dateStr;
}
/**
* 日期字符串转换日期
* @param dateStr
* @param formatStr
* @return Date
*/
public static Date strToDate(String dateStr,String formatStr){
SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
Date date = null;
try {
date = sdf.parse(dateStr);
}
catch(Exception e) {
}
return date;
}
/**
* Date转Timestamp
* @param date
* @return
*/
public static Timestamp dateToTimestamp(Date date) {
Date transDate = DateUtilSelf.strToDate(DateUtilSelf.DateToString(date, "yyyy-MM-dd hh:mm:ss"),"yyyy-MM-dd hh:mm:ss");
Timestamp timestamp = new Timestamp(transDate.getTime());
return timestamp;
}
/**
* Date字符串转Timestamp
* @param dateStr
* @param format
* @return
*/
public static Timestamp strToTimestamp(String dateStr,String format) {
Date date = strToDate(dateStr,format);
Timestamp timestamp = new Timestamp(date.getTime());
return timestamp;
}
/**
* 获取两个日期字符串之间的天数
* @param startDateStr
* @param endDateStr
* @param formatStr
* @return
*/
public static int getDays(String startDateStr,String endDateStr,String formatStr) {
Date startDate = strToDate(startDateStr,formatStr);
Date endDate = strToDate(endDateStr,formatStr);
long startTime = startDate.getTime();
long endTime = endDate.getTime();
int days = (int) ((endTime - startTime)/(60*60*24*1000));
return days;
}
/**
* 获取给定时间之前之后的时间
* @param type
* @param dateStr
* @param count
* @param formatStr
* @return
*/
public static String getAfterDateStr(int type,String dateStr,int count,String formatStr) {
Date startDate = strToDate(dateStr,formatStr);
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
calendar.add(type, count);
String endDateStr = DateToString(calendar.getTime(),formatStr);
return endDateStr;
}
/**
* 获取给定时间之前之后的时间
* @param type
* @param date
* @param count
* @param formatStr
* @return
*/
public static String getAfterDateStr(int type,Date date,int count,String formatStr) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(type, count);
String endDateStr = DateToString(calendar.getTime(),formatStr);
return endDateStr;
}
/**
* 获取给定时间之前之后的时间
* @param type
* @param date
* @param count
* @return
*/
public static Date getAfterDateStr(int type,Date date,int count) {
Calendar dateResult = Calendar.getInstance();
dateResult.setTime(date);
dateResult.add(type, count);
return dateResult.getTime();
}
/**
* 时间戳转日期
* @param timestamp
* @return
*/
public static Date timestampToDate(Timestamp timestamp) {
Date date = new Date(timestamp.getTime());
return date;
}
/**
* 时间戳转时间字符串
* @param timestamp
* @param format 日期格式
* @return
*/
public static String timestampToStr(Timestamp timestamp,String format) {
Date date = timestampToDate(timestamp);
String timeStr = DateToString(date, format);
return timeStr;
}
/**
* 获取所给日期length天内每s一天的日期
* @param date 所给日期yyyy-MM-dd
* @param length 长度
* @return
*/
public static List<String> getDateList(String date,int length){
List<String> dateList = new ArrayList<String>();
String format = "yyyy-MM-dd";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//获取length天后的日期
String targetDate = getAfterDateStr(Calendar.DATE,date,length,format);
Date start = null;
Date end = null;
if(length >= 0) {
start = strToDate(date,format);
end = strToDate(targetDate,format);
}else {
start = strToDate(targetDate,format);
end = strToDate(date,format);
}
Calendar calBegin = Calendar.getInstance();
calBegin.setTime(start);
Calendar calEnd = Calendar.getInstance();
calEnd.setTime(end);
while (end.after(calBegin.getTime())) {
calBegin.add(Calendar.DATE, 1);
String dayStr = sdf.format(calBegin.getTime());
dateList.add(dayStr);
}
return dateList;
}
/**
* 比较startDate是否在endDate之前
* @param startDate
* @param endDate
* @param format
* @return 0 两个日期相等 <0 开始日期在结束日期之前 >0 开始日期在结束日期之后
*/
public static int comparisonDate(String startDate,String endDate,String format) {
Date start = strToDate(startDate,format);
Date end = strToDate(endDate,format);
return start.compareTo(end);
}
//获取当前日期年、月、日、时、分、秒
public static int getCount(int type){
Calendar calendar = Calendar.getInstance();
return calendar.get(type);
}
}

32
src/main/java/com/eco/plugin/wink/workflow/utils/FRRoleUtils.java

@ -0,0 +1,32 @@
package com.eco.plugin.wink.workflow.utils;
import com.fr.decision.authority.data.CustomRole;
import com.fr.decision.webservice.bean.user.RoleBean;
import com.fr.decision.webservice.v10.user.CustomRoleService;
import com.fr.decision.webservice.v10.user.controller.SuperCustomRoleController;
public class FRRoleUtils {
/**
* 获取角色service
* @return
*/
private static CustomRoleService getRoleService(){
return CustomRoleService.getInstance();
}
/**
* 获取全部角色
* @return
* @throws Exception
*/
public static CustomRole[] getAllRole() throws Exception {
// List<RoleBean> roleBean = UserMiddleRoleService.getInstance().getAllCustomRoles();
CustomRole[] roles = SuperCustomRoleController.KEY.getAllCustomRoles((String)null, "");
return roles;
}
public static RoleBean getRoleByName(String rolename) throws Exception {
return getRoleService().getCustomRole(rolename);
}
}

235
src/main/java/com/eco/plugin/wink/workflow/utils/FRUserUtils.java

@ -0,0 +1,235 @@
package com.eco.plugin.wink.workflow.utils;
import com.fr.decision.authority.AuthorityContext;
import com.fr.decision.authority.controller.UserController;
import com.fr.decision.authority.data.User;
import com.fr.decision.privilege.TransmissionTool;
import com.fr.decision.webservice.bean.user.*;
import com.fr.decision.webservice.v10.login.ExtendTokenProcessor;
import com.fr.decision.webservice.v10.login.LoginService;
import com.fr.decision.webservice.v10.user.UserService;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class FRUserUtils {
/**
* 获取用户Service
* @return
*/
public static UserService getUserService(){
return UserService.getInstance();
}
/**
* 获取全量用户
* @return
* @throws Exception
*/
public static List<UserAdditionBean> getAllUsers() throws Exception {
// List<UserBean> userbean = UserMiddleRoleService.getInstance().getAllUsers(false);
List<UserAdditionBean> users = new ArrayList<UserAdditionBean>();
getAllUser(getAdminUser().getUsername(),0,1000,users);
return users;
}
/**
*
* @param adminUsername 管理员用户名
* @param page 页数
* @param num 每页的数据
* @param users 保存用户的列表
*/
private static void getAllUser(String adminUsername,int page,int num,List<UserAdditionBean> users) throws Exception {
Map<String,Object> result = getUserService().getAllUsers(adminUsername,page,num,"","",true);
Long total = (Long)result.get("total");
List<UserAdditionBean> item = (List<UserAdditionBean>)result.get("items");
users.addAll(item);
page = page+1;
if(page * num >= total){
return ;
}
getAllUser(adminUsername,page,num,users);
}
/**
* 添加用户
* @param userBean
*/
public static void addUser(UserBean userBean) throws Exception {
userBean.setPassword(TransmissionTool.defaultEncrypt(userBean.getPassword()));
getUserService().addUser(userBean);
}
/**
* 删除用户
* @param userBean
*/
public static void updateUser(User userBean) throws Exception {
UserController userController = AuthorityContext.getInstance().getUserController();
userController.update(userBean);
// UserServiceKit.getInstance().editUser(userBean,getAdminUser().getId());
}
/**
* 删除用户
* @param user
* @return
*/
public static int deleteUser(User user) throws Exception {
String userId = user.getId();
UserUpdateBean userUpdateBean = new UserUpdateBean();
userUpdateBean.setRemoveUserIds(new String[]{userId});
return getUserService().deleteUsers(userUpdateBean);
}
/**
* 根据用户名获取用户实体
* @param userName
* @return
*/
public static User getUserByUserName(String userName) throws Exception {
return getUserService().getUserByUserName(userName);
}
/**
* 根据用户名获取用户实体
* @param userName
* @return
*/
public static UserBean getUserBeanByUserName(String userName ) throws Exception {
String id = getUserService().getUserByUserName(userName).getId();
return getUser(id);
}
/**
* 根据id获取用户
* @param id
* @return
* @throws Exception
*/
public static UserBean getUser(String id) throws Exception {
return getUserService().getUser(id);
}
/**
* 判断是否是管理员
* @param username
* @return
*/
public static boolean isAdmin(String username) throws Exception{
return getUserService().isAdmin(getUserByUserName(username).getId());
}
/**
* 禁用启用用户
* @param userId
* @param state false 禁用 true 启用
* @throws Exception 异常说明失败
*/
public static void forbidUser(String userId,boolean state) throws Exception {
getUserService().forbidUser(userId,state);
}
/**
* 修改用户部门
* @param departmentId
* @param postId
// * @param ud
* @throws Exception
*/
public static void updateDepartmentPostUsers(String departmentId, String postId, String userid) throws Exception {
AuthorityContext.getInstance().getUserController().addUserToDepartmentAndPost(userid, departmentId, postId);
// getUserService().updateDepartmentPostUsers(departmentId,postId,ud);
}
// /**
// * 验证密码是否正确
// * @param psd 明文密码
// * @param user 根据用户名获取得用户对象
// * @return
// */
// public static boolean checkPsd(String psd,User user){
// String shaPsd = CipherUtils.jdksha256(psd);
//
// return shaPsd.equals(user.getPassword());
// }
public static User getCurrentUser(HttpServletRequest req) throws Exception {
String username = LoginService.getInstance().getCurrentUserNameFromRequestCookie(req);
if(Utils.isNullStr(username)){
return null;
}
return getUserByUserName(username);
}
public static UserBean getCurrentUserBean(HttpServletRequest req) throws Exception {
String username = LoginService.getInstance().getCurrentUserNameFromRequestCookie(req);
if(Utils.isNullStr(username)){
return null;
}
return getUserBeanByUserName(username);
}
/**
* 获取用户部门角色
* @param username
* @return
* @throws Exception
*/
private static UserRolesBean getUserRolesBean(String username) throws Exception {
return FRUserUtils.getUserService().getUserDepAndCustomRoles(username);
}
/**
* 获取部门职务
* @param username
* @return
* @throws Exception
*/
public static List<DepRoleBean> getDepRoleBean(String username) throws Exception{
return getUserRolesBean(username).getDepRoles();
}
/**
* 获取角色
* @param username
* @return
* @throws Exception
*/
public static List<String> getCustomRoles(String username) throws Exception{
return getUserRolesBean(username).getCustomRoles();
}
public static UserBean getAdminUser() throws Exception {
String adminid = getUserService().getAdminUserIdList().get(0);
return getUser(adminid);
}
public static String getUsernameFromToken(String token){
String username = ExtendTokenProcessor.KEY.getUsername(token);
return username;
}
/**
* 通过参数获取用户
* @param mobile
* @return
*/
public static List<User> getUsersFromMobile(String mobile) throws Exception {
List<User> users = getUserService().getUsersFromMobile(mobile);
return users;
}
}

332
src/main/java/com/eco/plugin/wink/workflow/utils/FRUtils.java

@ -0,0 +1,332 @@
package com.eco.plugin.wink.workflow.utils;
import com.fr.base.ServerConfig;
import com.fr.base.TableData;
import com.fr.base.TemplateUtils;
import com.fr.decision.authority.AuthorityContext;
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType;
import com.fr.decision.authority.data.User;
import com.fr.decision.base.util.UUIDUtil;
import com.fr.decision.privilege.encrpt.PasswordValidator;
import com.fr.decision.webservice.bean.authentication.OriginUrlResponseBean;
import com.fr.decision.webservice.interceptor.handler.ReportTemplateRequestChecker;
import com.fr.decision.webservice.login.LogInOutResultInfo;
import com.fr.decision.webservice.utils.DecisionServiceConstants;
import com.fr.decision.webservice.utils.DecisionStatusService;
import com.fr.decision.webservice.utils.UserSourceFactory;
import com.fr.decision.webservice.v10.login.LoginService;
import com.fr.decision.webservice.v10.login.event.LogInOutEvent;
import com.fr.decision.webservice.v10.user.UserService;
import com.fr.event.EventDispatcher;
import com.fr.file.TableDataConfig;
import com.fr.general.data.DataModel;
import com.fr.log.FineLoggerFactory;
import com.fr.script.Calculator;
import com.fr.stable.StringUtils;
import com.fr.stable.query.QueryFactory;
import com.fr.stable.query.restriction.RestrictionFactory;
import com.fr.third.springframework.web.method.HandlerMethod;
import com.fr.web.controller.ReportRequestService;
import com.fr.web.utils.WebUtils;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
public class FRUtils {
/**
* 判断用户是否存在
* @param userName
* @return
*/
public static boolean isUserExist(String userName){
if (StringUtils.isEmpty(userName)) {
return false;
} else {
try {
List userList = AuthorityContext.getInstance().getUserController().find(QueryFactory.create().addRestriction(RestrictionFactory.eq("userName", userName)));
return userList != null && !userList.isEmpty();
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage());
return false;
}
}
}
/**
* 判断是否登录FR
* @param req
* @return
*/
public static boolean isLogin(HttpServletRequest req){
return LoginService.getInstance().isLogged(req);
}
/**
* 帆软登录
* @param httpServletRequest
* @param httpServletResponse
* @param userName
* @param url
*/
public static void login(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String userName,String url){
FineLoggerFactory.getLogger().info("FRLOG:用户名:"+userName);
FineLoggerFactory.getLogger().info("FRLOG:跳转链接:"+url);
//判断用户名是否为空
if(!Utils.isNullStr(userName)){
if(isUserExist(userName)){
String FRToken = "";
try {
//HttpSession session = httpServletRequest.getSession(true);
FRToken = LoginService.getInstance().login(httpServletRequest, httpServletResponse, userName);
//httpServletRequest.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME,FRToken);
//session.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, FRToken);
EventDispatcher.fire(LogInOutEvent.LOGIN,new LogInOutResultInfo(httpServletRequest,httpServletResponse,userName,true));
FineLoggerFactory.getLogger().info("FRLOG:登陆成功!");
if(!Utils.isNullStr(url)){
httpServletResponse.sendRedirect(url);
}
} catch (Exception e) {
ResponseUtils.failedResponse(httpServletResponse,"登录异常,请联系管理员!");
FineLoggerFactory.getLogger().info("FRLOG:登录异常,请联系管理员!");
FineLoggerFactory.getLogger().info("FRLOGException:"+e.getMessage());
}
}else{
ResponseUtils.failedResponse(httpServletResponse,"用户在报表系统中不存在!");
FineLoggerFactory.getLogger().info("FRLOG:用户在报表系统中不存在!");
}
}else{
ResponseUtils.failedResponse(httpServletResponse,"用户名不能为空!");
FineLoggerFactory.getLogger().info("FRLOG:用户名不能为空!");
}
}
/**
* 帆软登录
* @param httpServletRequest
* @param httpServletResponse
* @param token
* @param url
*/
public static void loginByToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String token,String url){
FineLoggerFactory.getLogger().info("FRLOG:token:"+token);
FineLoggerFactory.getLogger().info("FRLOG:跳转链接:"+url);
//判断用户名是否为空
if(!Utils.isNullStr(token)){
writeToken2Cookie(httpServletResponse,token,-1);
HttpSession session = httpServletRequest.getSession(true);
httpServletRequest.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME,token);
session.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, token);
if(!Utils.isNullStr(url)){
try {
httpServletResponse.sendRedirect(url);
} catch (IOException e) {
ResponseUtils.failedResponse(httpServletResponse,"跳转异常!");
FineLoggerFactory.getLogger().info("FRLOG:跳转异常!");
}
}
}else{
ResponseUtils.failedResponse(httpServletResponse,"token不能为空!");
FineLoggerFactory.getLogger().info("FRLOG:token不能为空!");
}
}
/**
* 获取token
* @param httpServletRequest
* @param httpServletResponse
* @param username
* @return
*/
public static String getToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String username){
String token = "";
try {
token = LoginService.getInstance().login(httpServletRequest, httpServletResponse, username);
} catch (Exception e) {
FineLoggerFactory.getLogger().info("FRLOG:获取token失败"+e.getMessage());
}
return token;
}
private static void writeToken2Cookie(HttpServletResponse req, String token, int num) {
try {
if (StringUtils.isNotEmpty(token)) {
Cookie cookie = new Cookie("fine_auth_token", token);
long maxAge = num == -2 ? 1209600000L : (long)num;
cookie.setMaxAge((int)maxAge);
cookie.setPath(ServerConfig.getInstance().getCookiePath());
req.addCookie(cookie);
Cookie rememberCookie = new Cookie("fine_remember_login", String.valueOf(num == -2 ? -2 : -1));
rememberCookie.setMaxAge((int)maxAge);
rememberCookie.setPath(ServerConfig.getInstance().getCookiePath());
req.addCookie(rememberCookie);
} else {
FineLoggerFactory.getLogger().error("empty token cannot save.");
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
/**
* 后台登出
* @param httpServletRequest
* @param httpServletResponse
*/
public static void logoutByToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String token)
{
httpServletRequest.setAttribute("fine_auth_token",token);
logout(httpServletRequest,httpServletResponse);
}
/**
*
* @param httpServletRequest
* @param httpServletResponse
*/
public static void logout(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse)
{
if(!isLogin(httpServletRequest)){
return ;
}
try {
LoginService.getInstance().logout(httpServletRequest,httpServletResponse);
} catch (Exception e) {
ResponseUtils.failedResponse(httpServletResponse,"登出异常,请联系管理员!");
FineLoggerFactory.getLogger().info("FRLOG:登出异常,请联系管理员!");
FineLoggerFactory.getLogger().info("FRLOGException:"+e.getMessage());
}
}
/**
* 打印FR日志
* @param message
*/
public static void FRLogInfo(String message){
FineLoggerFactory.getLogger().info("FRLOG:"+message);
}
/**
* 打印FR日志-error
* @param message
*/
public static void FRLogError(String message){
FineLoggerFactory.getLogger().error("FRLOG:"+message);
}
/**
* 根据用户名获取用户信息
* @param userName
* @return
*/
public static User getFRUserByUserName(String userName){
try {
return UserService.getInstance().getUserByUserName(userName);
} catch (Exception e) {
FRLogInfo("获取用户信息异常:"+e.getMessage());
}
return null;
}
/**
* 解密FR密码
* @param password
* @return
*/
// public static String decryptFRPsd(String password){
// FRLogInfo("解密密码:"+password);
// return TransmissionTool.decrypt(password);
// }
/**
* 根据明文密码生成数据库中的密码用户密码校验用
* @return
*/
public static String getDBPsd(String username,String password){
PasswordValidator pv = UserSourceFactory.getInstance().getUserSource(ManualOperationType.KEY).getPasswordValidator();
String uuid = UUIDUtil.generate();
return pv.encode(username, password, uuid);
}
/**
* 获取带参数的访问链接
* @return
*/
public static String getAllUrl(HttpServletRequest httpServletRequest){
return WebUtils.getOriginalURL(httpServletRequest);
}
/**
* 根据originKey获取源链接
* @param req
* @return
* @throws Exception
*/
public static String getOriginUrl(HttpServletRequest req) throws Exception {
String origin = req.getParameter("origin");
if (StringUtils.isNotEmpty(origin)) {
OriginUrlResponseBean originUrlResponseBean = (OriginUrlResponseBean) DecisionStatusService.originUrlStatusService().get(origin);
DecisionStatusService.originUrlStatusService().delete(origin);
if (originUrlResponseBean != null) {
return originUrlResponseBean.getOriginUrl();
}
}
return new OriginUrlResponseBean(TemplateUtils.render("${fineServletURL}")).getOriginUrl();
}
/**
* 判断是否开启模板认证
* @param
* @return
* @throws Exception
*/
public static boolean isTempAuth(HttpServletRequest req,HttpServletResponse res) throws Exception {
ReportTemplateRequestChecker checker = new ReportTemplateRequestChecker();
HandlerMethod hm = new HandlerMethod(new ReportRequestService(),ReportRequestService.class.getMethod("preview", HttpServletRequest.class, HttpServletResponse.class, String.class));
return checker.checkRequest(req,res,hm);
}
/**
* 获取数据集数据
* @param serverDataSetName
* @return
*/
public static DataModel getTableData(String serverDataSetName){
TableData userInfo = TableDataConfig.getInstance().getTableData(serverDataSetName);
DataModel userInfoDM = userInfo.createDataModel(Calculator.createCalculator());
// userInfoDM.getRowCount();
// userInfoDM.getColumnIndex();
// userInfoDM.getValueAt()
return userInfoDM;
}
public static String getIndex(HttpServletRequest req){
String url = req.getScheme()+"://"+req.getServerName()+":"+String.valueOf(req.getServerPort())+req.getRequestURI();
return url;
}
}

186
src/main/java/com/eco/plugin/wink/workflow/utils/JDBCUtils.java

@ -0,0 +1,186 @@
package com.eco.plugin.wink.workflow.utils;
import com.eco.plugin.wink.workflow.db.bean.DBLinkEntity;
import com.eco.plugin.wink.workflow.db.controller.WorkFlowController;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
public class JDBCUtils {
private static Properties properties = new Properties();
private static DataSource dataSource;
static{
DBLinkEntity dbLink = WorkFlowController.getAllDBLink().get(0);
properties.setProperty("driverClassName","com.mysql.jdbc.Driver");
properties.setProperty("url",dbLink.getUrl()+"?useSSL=false&useUnicode=true&characterEncoding=UTF-8");
properties.setProperty("username",dbLink.getUsername());
properties.setProperty("password",dbLink.getPassword());
properties.setProperty("initialSize","30");
properties.setProperty("maxTotal","30");
properties.setProperty("maxIdle","10");
properties.setProperty("minIdle","5");
properties.setProperty("maxWailMillis","1000");
properties.setProperty("removeAbandonedOnMaintenance","true");
properties.setProperty("removeAbandonedOnBorrow","true");
properties.setProperty("removeAbandonedTimeout","300");
try {
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
FRUtils.FRLogError("创建链接池异常:"+e.getMessage());
}
}
public static Connection getConnect(){
Connection connection = null;
try{
connection = dataSource.getConnection();
}catch(Exception e){
FRUtils.FRLogError("获取数据库连接异常:"+e.getMessage());
}
return connection;
}
/**
* 更新
* @param sql
* @return
*/
public static int update(String sql){
Connection conn=null;
Statement st=null;
int count = 0;
try {
conn = getConnect();
st = conn.createStatement();
count = st.executeUpdate(sql);
} catch (SQLException e) {
FRUtils.FRLogError("执行updata语句异常");
} finally {
release(conn, st, null);
}
return count;
}
/**
* 获取数据
* @param sql
* @param columns
* @return
*/
public static List<Map<String,Object>> getResult(String sql, String[] columns,String formid){
List<Map<String,Object>> result = new ArrayList<Map<String,Object>>();
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
conn = getConnect();
st = conn.createStatement();
rs = st.executeQuery(sql);
//遍历查询每条记录
while(rs.next()) {
Map<String,Object> map = new HashMap<String,Object>();
for(String column : columns){
map.put(column,rs.getString(column));
}
map.put("formid",formid);
result.add(map);
}
} catch (SQLException e) {
FRUtils.FRLogInfo("获取数据异常:"+e.getMessage());
} finally {
release(conn, st, rs);
}
return result;
}
/**
* 获取数量
* @param sql
* @return
*/
public static int getCount(String sql){
int count = 0;
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
conn = getConnect();
st = conn.createStatement();
rs = st.executeQuery(sql);
//遍历查询每条记录
while(rs.next()) {
count = rs.getInt(1);
}
} catch (SQLException e) {
FRUtils.FRLogInfo("获取数量异常:"+e.getMessage());
} finally {
release(conn, st, rs);
}
return count;
}
private static void release(Connection conn, Statement st, ResultSet rs) {
closeRs(rs);
closeSt(st);
closeConn(conn);
}
private static void closeRs(ResultSet rs) {
try {
if(rs!=null) {
rs.close();
}
} catch (SQLException e) {
FRUtils.FRLogError("关闭rs异常");
} finally {
rs=null;
}
}
private static void closeSt(Statement st) {
try {
if(st!=null) {
st.close();
}
} catch (SQLException e) {
FRUtils.FRLogError("关闭st异常");
} finally {
st=null;
}
}
private static void closeConn(Connection conn) {
try {
if(conn!=null) {
conn.close();
}
} catch (SQLException e) {
FRUtils.FRLogError("关闭connect异常");
} finally {
conn=null;
}
}
}

108
src/main/java/com/eco/plugin/wink/workflow/utils/ResponseUtils.java

@ -0,0 +1,108 @@
package com.eco.plugin.wink.workflow.utils;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.web.utils.WebUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
public class ResponseUtils {
private static final int SUCCESS = 200;
private static final int FAILED = -1;
public static void successResponse(HttpServletResponse res, String body) {
response(res, body, SUCCESS);
}
public static void failedResponse(HttpServletResponse res, String body) {
response(res, body, FAILED);
}
private static void response(HttpServletResponse res, String body, int code) {
JSONObject object = new JSONObject();
PrintWriter pw;
try {
object.put("code", code);
object.put("data", body);
pw = WebUtils.createPrintWriter(res);
} catch (Exception e) {
FineLoggerFactory.getLogger().info(e.getMessage());
return;
}
res.setContentType("application/json;charset=utf-8");
String result = object.toString();
pw.println(result);
pw.flush();
pw.close();
}
public static void response(HttpServletResponse res,JSONObject json){
PrintWriter pw;
try {
pw = WebUtils.createPrintWriter(res);
} catch (Exception e) {
FineLoggerFactory.getLogger().info(e.getMessage());
return;
}
res.setContentType("application/json;charset=utf-8");
String result = json.toString();
pw.println(result);
pw.flush();
pw.close();
}
public static void responseText(HttpServletResponse res,String text){
PrintWriter pw;
try {
pw = WebUtils.createPrintWriter(res);
} catch (Exception e) {
FineLoggerFactory.getLogger().info(e.getMessage());
return;
}
res.setContentType("text/html;charset=utf-8");
pw.println(text);
pw.flush();
pw.close();
}
public static void responseXml(HttpServletResponse res,String xml){
PrintWriter pw;
try {
pw = WebUtils.createPrintWriter(res);
} catch (Exception e) {
FineLoggerFactory.getLogger().info(e.getMessage());
return;
}
res.setContentType("text/xml;charset=utf-8");
pw.println(xml);
pw.flush();
pw.close();
}
public static void setCSRFHeader(HttpServletResponse httpServletResponse){
httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,HEAD,PUT,PATCH");
httpServletResponse.setHeader("Access-Control-Max-Age", "36000");
httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,Authorization,authorization");
}
public static void responseJsonp(HttpServletRequest req, HttpServletResponse res, JSONObject json){
PrintWriter pw;
try {
pw = WebUtils.createPrintWriter(res);
} catch (Exception e) {
FineLoggerFactory.getLogger().info(e.getMessage());
return;
}
res.setContentType("text/javascript;charset=utf-8;charset=utf-8");
String result = json.toString();
String jsonp=req.getParameter("callback");
pw.println(jsonp+"("+result+")");
pw.flush();
pw.close();
}
}

329
src/main/java/com/eco/plugin/wink/workflow/utils/Utils.java

@ -0,0 +1,329 @@
package com.eco.plugin.wink.workflow.utils;
import com.fr.base.TemplateUtils;
import com.fr.data.NetworkHelper;
import com.fr.decision.webservice.v10.user.UserService;
import com.fr.io.utils.ResourceIOUtils;
import com.fr.json.JSONObject;
import com.fr.stable.CodeUtils;
import com.fr.stable.StringUtils;
import com.fr.third.org.apache.commons.codec.digest.DigestUtils;
import com.fr.web.utils.WebUtils;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Utils {
/**
* 判断字符串是否为空
* @param str
* @return true 空字符串 false 非空字符串
*/
public static boolean isNullStr(String str){
return !(str != null && !str.isEmpty() && !"null".equals(str));
}
/**
* 判断字符串是否非空
* @param str
* @return
*/
public static boolean isNotNullStr(String str){
return !isNullStr(str);
}
/**
* MD5加密
* @param str
* @return
*/
public static String getMd5Str(String str)
{
return DigestUtils.md5Hex(str);
}
/**
* 帆软shaEncode加密
*/
public static String shaEncode(String str){
return CodeUtils.sha256Encode(str);
}
/**
* 获取uuid
*/
public static String uuid(){
return UUID.randomUUID().toString();
}
/**
* 替换空字符串
* @param str
* @param replace
* @return
*/
public static String replaceNullStr(String str,String replace){
if(isNullStr(str)){
return replace;
}
return str;
}
/**
* 获取请求体
* @param req
* @return
*/
public static JSONObject getRequestBody(HttpServletRequest req){
StringBuffer sb = new StringBuffer();
String line = null;
try {
BufferedReader reader = req.getReader();
while ((line = reader.readLine()) != null)
sb.append(line);
} catch (Exception e) {
FRUtils.FRLogInfo("getRequestBody:exception:"+e.getMessage());
}
//将空格和换行符替换掉避免使用反序列化工具解析对象时失败
String jsonString = sb.toString().replaceAll("\\s","").replaceAll("\n","");
FRUtils.FRLogInfo("reqBody:"+jsonString);
JSONObject json = new JSONObject(jsonString);
return json;
}
/**
* 获取ip
* @return
*/
public static String getIp(HttpServletRequest req){
String realIp = req.getHeader("X-Real-IP");
String fw = req.getHeader("X-Forwarded-For");
if (StringUtils.isNotEmpty(fw) && !"unKnown".equalsIgnoreCase(fw)) {
int para3 = fw.indexOf(",");
return para3 != -1 ? fw.substring(0, para3) : fw;
} else {
fw = realIp;
if (StringUtils.isNotEmpty(realIp) && !"unKnown".equalsIgnoreCase(realIp)) {
return realIp;
} else {
if (StringUtils.isBlank(realIp) || "unknown".equalsIgnoreCase(realIp)) {
fw = req.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(fw) || "unknown".equalsIgnoreCase(fw)) {
fw = req.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(fw) || "unknown".equalsIgnoreCase(fw)) {
fw = req.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isBlank(fw) || "unknown".equalsIgnoreCase(fw)) {
fw = req.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isBlank(fw) || "unknown".equalsIgnoreCase(fw)) {
fw = req.getRemoteAddr();
}
return fw;
}
}
}
/**
* 根据key获取cookie
* @param req
* @return
*/
public static String getCookieByKey(HttpServletRequest req,String key){
Cookie[] cookies = req.getCookies();
String cookie = "";
if(cookies == null || cookies.length <=0){
return "";
}
for(int i = 0; i < cookies.length; i++) {
Cookie item = cookies[i];
if (item.getName().equalsIgnoreCase(key)) {
cookie = item.getValue();
}
}
FRUtils.FRLogInfo("cookie:"+cookie);
return cookie;
}
/**
* 判断是否是手机端的链接
* @param req
* @return
*/
public static boolean isMobile(HttpServletRequest req) {
String[] mobileArray = {"iPhone", "iPad", "android", "windows phone", "xiaomi"};
String userAgent = req.getHeader("user-agent");
if (userAgent != null && userAgent.toUpperCase().contains("MOBILE")) {
for(String mobile : mobileArray) {
if(userAgent.toUpperCase().contains(mobile.toUpperCase())) {
return true;
}
}
}
return NetworkHelper.getDevice(req).isMobile();
}
/**
* 只编码中文
* @param url
* @return
*/
public static String encodeCH(String url ){
Matcher matcher = Pattern.compile("[\\u4e00-\\u9fa5]").matcher(url);
while(matcher.find()){
String chn = matcher.group();
url = url.replaceAll(chn, URLEncoder.encode(chn));
}
return url;
}
/**
* 获取web-inf文件夹下的文件
* filename /resources/ip4enc.properties
*/
public static InputStream getResourcesFile(String filename){
return ResourceIOUtils.read(filename);
}
/**
*
* @param res
* @param path /com/fr/plugin/loginAuth/html/getMac.html
* @param parameterMap
*/
public static void toErrorPage(HttpServletResponse res,String path,Map<String, String> parameterMap){
if(parameterMap == null){
parameterMap = new HashMap<String, String>();
}
try {
String macPage = TemplateUtils.renderTemplate(path, parameterMap);
WebUtils.printAsString(res, macPage);
}catch (Exception e){
FRUtils.FRLogError("跳转页面异常");
}
}
/**
* 判断是否是管理员
* @param username
* @return
*/
public static boolean isAdmin(String username) throws Exception{
return UserService.getInstance().isAdmin(UserService.getInstance().getUserByUserName(username).getId());
}
/**
* 去掉浏览器中的参数
* @param url
* @param param
* @return
*/
public static String removeParam(String url,String param){
if(!url.contains("?"+param) && !url.contains("&"+param)){
return url;
}
return url.substring(0,url.indexOf(url.contains("?"+param) ? "?"+param : "&"+param));
}
/**
* 获取跳转链接
* @param req
* @param param
* @return
*/
public static String getRedirectUrl(HttpServletRequest req,String param){
String url = FRUtils.getAllUrl(req);
if(isNotNullStr(param)){
url = removeParam(url,param);
}
url = encodeCH(url);
return url;
}
/**
* 去除空格换行
* @param str
* @return
*/
public static String trim(String str){
return str.trim().replaceAll("\n","").replaceAll("\r","");
}
/**
* list 转化为指定字符分割的字符串
* @param list
* @param list
* @return
*/
public static String listToStr(List<String> list, String split){
String result = "";
if(list == null || list.size() <= 0){
return result;
}
for(String str : list){
result+=","+str;
}
result = result.substring(1);
return result;
}
/**
* array 转化为指定字符分割的字符串
* @param list
* @param list
* @return
*/
public static String arrayToStr(String[] list, String split){
String result = "";
if(list == null ||list.length <= 0){
return result;
}
for(int i=0;i<list.length;i++){
String str = list[i];
result+=","+str;
}
result = result.substring(1);
return result;
}
}

37
src/main/java/com/eco/plugin/wink/workflow/webresource/WebResourceProvider.java

@ -0,0 +1,37 @@
package com.eco.plugin.wink.workflow.webresource;
import com.fr.decision.fun.impl.AbstractWebResourceProvider;
import com.fr.decision.web.MainComponent;
import com.fr.plugin.transform.FunctionRecorder;
import com.fr.web.struct.Atom;
import com.fr.web.struct.Component;
import com.fr.web.struct.browser.RequestClient;
import com.fr.web.struct.category.ScriptPath;
import com.fr.web.struct.category.StylePath;
/**
* Created by wink on 2021-12-03
*/
@FunctionRecorder
public class WebResourceProvider extends AbstractWebResourceProvider {
@Override
public Atom attach() {
return MainComponent.KEY;
}
@Override
public Atom client() {
return new Component() {
@Override
public ScriptPath script(RequestClient requestClient) {
return ScriptPath.build("/com/eco/plugin/wink/workflow/js/ui.js");
}
@Override
public StylePath style(RequestClient requestClient) {
return StylePath.EMPTY;
// return StylePath.build("/com/fr/plugin/jdfSSO/css/icon.css");
}
};
}
}

3954
src/main/resources/com/eco/plugin/wink/workflow/js/ui.js

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save