From 38e0637a6f90e24c711ffe5274431ea03e866708 Mon Sep 17 00:00:00 2001 From: xiamaofa <951755725@qq.com> Date: Fri, 16 Sep 2022 14:56:50 +0800 Subject: [PATCH] shopself-workflow --- build.gradle | 122 + encrypt.xml | 13 + lib/commons-dbcp2-2.1.1.jar | Bin 0 -> 174167 bytes lib/commons-pool2-2.4.2.jar | Bin 0 -> 111969 bytes plugin.xml | 30 + .../ControllerRegisterProvider.java | 21 + .../workflow/controller/ControllerSelf.java | 150 + .../controller/DataProcessingController.java | 178 + .../workflow/controller/FormController.java | 47 + .../controller/WorkflowConfigController.java | 133 + .../controller/WorkflowProcessController.java | 315 ++ .../wink/workflow/db/bean/DBLinkEntity.java | 162 + .../wink/workflow/db/bean/FormDefEntity.java | 79 + .../workflow/db/bean/FormDetailEntity.java | 67 + .../workflow/db/bean/WorkflowDefEntity.java | 67 + .../workflow/db/bean/WorkflowNodeEntity.java | 91 + .../db/bean/WorkflowProcessEntity.java | 125 + .../db/controller/FormDbController.java | 225 + .../db/controller/WorkFlowController.java | 228 + .../controller/WorkFlowProcessController.java | 115 + .../WorkflowConfigDbController.java | 205 + .../wink/workflow/db/dao/DBLinkDao.java | 57 + .../wink/workflow/db/dao/FormDefDao.java | 67 + .../wink/workflow/db/dao/FormFieldDao.java | 61 + .../wink/workflow/db/dao/WorkflowDefDao.java | 62 + .../wink/workflow/db/dao/WorkflowNodeDao.java | 57 + .../workflow/db/dao/WorkflowProcessDao.java | 61 + .../workflow/kit/CustomRoleServiceKit.java | 55 + .../wink/workflow/kit/UserServiceKit.java | 115 + .../wink/workflow/utils/DateUtilSelf.java | 235 + .../wink/workflow/utils/FRRoleUtils.java | 32 + .../wink/workflow/utils/FRUserUtils.java | 235 + .../plugin/wink/workflow/utils/FRUtils.java | 332 ++ .../plugin/wink/workflow/utils/JDBCUtils.java | 186 + .../wink/workflow/utils/ResponseUtils.java | 108 + .../eco/plugin/wink/workflow/utils/Utils.java | 329 ++ .../webresource/WebResourceProvider.java | 37 + .../com/eco/plugin/wink/workflow/js/ui.js | 3954 +++++++++++++++++ 38 files changed, 8356 insertions(+) create mode 100644 build.gradle create mode 100644 encrypt.xml create mode 100644 lib/commons-dbcp2-2.1.1.jar create mode 100644 lib/commons-pool2-2.4.2.jar create mode 100644 plugin.xml create mode 100644 src/main/java/com/eco/plugin/wink/workflow/controller/ControllerRegisterProvider.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/controller/ControllerSelf.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/controller/DataProcessingController.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/controller/FormController.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/controller/WorkflowConfigController.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/controller/WorkflowProcessController.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/bean/DBLinkEntity.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/bean/FormDefEntity.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/bean/FormDetailEntity.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowDefEntity.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowNodeEntity.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowProcessEntity.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/controller/FormDbController.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkFlowController.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkFlowProcessController.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkflowConfigDbController.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/dao/DBLinkDao.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/dao/FormDefDao.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/dao/FormFieldDao.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowDefDao.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowNodeDao.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowProcessDao.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/kit/CustomRoleServiceKit.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/kit/UserServiceKit.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/utils/DateUtilSelf.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/utils/FRRoleUtils.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/utils/FRUserUtils.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/utils/FRUtils.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/utils/JDBCUtils.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/utils/ResponseUtils.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/utils/Utils.java create mode 100644 src/main/java/com/eco/plugin/wink/workflow/webresource/WebResourceProvider.java create mode 100644 src/main/resources/com/eco/plugin/wink/workflow/js/ui.js diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..c56b872 --- /dev/null +++ b/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']) +} + diff --git a/encrypt.xml b/encrypt.xml new file mode 100644 index 0000000..1401cd1 --- /dev/null +++ b/encrypt.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/commons-dbcp2-2.1.1.jar b/lib/commons-dbcp2-2.1.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..674f3676381c28c82e8aded21e2937cd1335130c GIT binary patch literal 174167 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 z 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 F{|8Hs=A-}s literal 0 HcmV?d00001 diff --git a/lib/commons-pool2-2.4.2.jar b/lib/commons-pool2-2.4.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..fdf8b6faafa2fdbbc8fc6e24595c623232abaec6 GIT binary patch literal 111969 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 z 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%0As8V_kq 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 + com.eco.plugin.wink.workflow + + yes + 1.0.1 + 10.0 + 2018-07-31 + wink + + + com.eco.plugin.wink.workflow + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/eco/plugin/wink/workflow/controller/ControllerRegisterProvider.java b/src/main/java/com/eco/plugin/wink/workflow/controller/ControllerRegisterProvider.java new file mode 100644 index 0000000..75741ca --- /dev/null +++ b/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 + }; + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/controller/ControllerSelf.java b/src/main/java/com/eco/plugin/wink/workflow/controller/ControllerSelf.java new file mode 100644 index 0000000..4da10db --- /dev/null +++ b/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 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 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; + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/controller/DataProcessingController.java b/src/main/java/com/eco/plugin/wink/workflow/controller/DataProcessingController.java new file mode 100644 index 0000000..0649d9c --- /dev/null +++ b/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> items = JDBCUtils.getResult(sql,column,formid); + + String countSql = "select count(id) from " + form.getTablename(); + + Map 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 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> 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 fields = FormDbController.getFieldByFormId(form.getId()); + String[] column = new String[fields.size()]; + + for(int i=0;i 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 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 formDetailEntityList = FormDbController.getFieldByFormId(formid); + ResponseUtils.response(res,new JSONObject().put("data",formDetailEntityList)); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/controller/WorkflowConfigController.java b/src/main/java/com/eco/plugin/wink/workflow/controller/WorkflowConfigController.java new file mode 100644 index 0000000..98d7d47 --- /dev/null +++ b/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 nodelist = new ArrayList<>(); + for(int i=0;i 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 workflowNodeEntityList = WorkflowConfigDbController.getNodesByWorkflowId(workflowid); + ResponseUtils.response(res,new JSONObject().put("data",workflowNodeEntityList)); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/controller/WorkflowProcessController.java b/src/main/java/com/eco/plugin/wink/workflow/controller/WorkflowProcessController.java new file mode 100644 index 0000000..593a0ec --- /dev/null +++ b/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 nodes = WorkflowConfigDbController.getNodesByWorkflowId(workflowDefEntity.getId()); + //当前用户 + User user = FRUserUtils.getCurrentUser(req); + + //流程执行列表 + List processList = new ArrayList<>(); + + if(!"start".equals(type)){ + processList = WorkFlowProcessController.getByFormidAndDataid(formid,dataid); + } + + List 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 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 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 nodes,List processList){ + boolean isStart = processList == null || processList.size() <= 0; + String currentNodeCode = isStart ? "" : processList.get(processList.size() -1).getCurrentnode(); + Map 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 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 getCurrentAndNextByNode(String node,List nodes){ + Map 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 getNextAndThirdNodeByNode(String node,List nodes){ + Map map = new HashMap<>(); + + for(int i=0;i 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 users = UserServiceKit.getInstance().getAllUsersByRolename(rolename); + String checker = ""; + for(User user : users){ + checker+=",["+user.getUserName()+"]"; + } + + checker = checker.replaceFirst(",",""); + return checker; + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/bean/DBLinkEntity.java b/src/main/java/com/eco/plugin/wink/workflow/db/bean/DBLinkEntity.java new file mode 100644 index 0000000..63274f8 --- /dev/null +++ b/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; + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/bean/FormDefEntity.java b/src/main/java/com/eco/plugin/wink/workflow/db/bean/FormDefEntity.java new file mode 100644 index 0000000..8c2180d --- /dev/null +++ b/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; + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/bean/FormDetailEntity.java b/src/main/java/com/eco/plugin/wink/workflow/db/bean/FormDetailEntity.java new file mode 100644 index 0000000..8300401 --- /dev/null +++ b/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; + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowDefEntity.java b/src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowDefEntity.java new file mode 100644 index 0000000..50dd4ea --- /dev/null +++ b/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; + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowNodeEntity.java b/src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowNodeEntity.java new file mode 100644 index 0000000..dffd353 --- /dev/null +++ b/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; + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowProcessEntity.java b/src/main/java/com/eco/plugin/wink/workflow/db/bean/WorkflowProcessEntity.java new file mode 100644 index 0000000..7964a18 --- /dev/null +++ b/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; + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/controller/FormDbController.java b/src/main/java/com/eco/plugin/wink/workflow/db/controller/FormDbController.java new file mode 100644 index 0000000..b1b628d --- /dev/null +++ b/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() { + @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() { + @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 addOrUpdate, List delete){ + //新增或者删除 + if(addOrUpdate != null && addOrUpdate.size() > 0){ + for(final FormDetailEntity dbe : addOrUpdate){ + + try{ + accessor.runDMLAction(new DBAction() { + @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() { + @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 getFormList(){ + try{ + return accessor.runQueryAction(new DBAction>() { + @Override + public List run(DAOContext context) throws Exception { + List result = context.getDAO(FormDefDao.class).getAll(); + + return result == null ? new ArrayList() : result; + } + }); + }catch(Throwable e){ + FRUtils.FRLogError("exception getAllDBLink:"+e.getMessage()); + } + + return new ArrayList(); + } + + /** + * 根据tablename获取表单 + * @param + * @return + */ + public static FormDefEntity getByTablename(final String tablename){ + try{ + return accessor.runQueryAction(new DBAction() { + @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() { + @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 getFieldByFormId(String formid){ + try{ + return accessor.runQueryAction(new DBAction>() { + @Override + public List run(DAOContext context) throws Exception { + List result = context.getDAO(FormFieldDao.class).getFieldById(formid); + + return result == null ? new ArrayList() : result; + } + }); + }catch(Throwable e){ + FRUtils.FRLogError("exception getAllDBLink:"+e.getMessage()); + } + + return new ArrayList(); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkFlowController.java b/src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkFlowController.java new file mode 100644 index 0000000..2f245ec --- /dev/null +++ b/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() { + @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() { + @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 getAllDBLink(){ + try{ + return accessor.runQueryAction(new DBAction>() { + @Override + public List run(DAOContext context) throws Exception { + List result = context.getDAO(DBLinkDao.class).getAll(); + + return result == null ? new ArrayList() : result; + } + }); + }catch(Throwable e){ + FRUtils.FRLogError("exception getAllDBLink:"+e.getMessage()); + } + + return new ArrayList(); + } + + /** + * 根据id获取信息 + * @param id + * @return + */ + public static DBLinkEntity getDBLinkById(final String id){ + try{ + return accessor.runQueryAction(new DBAction() { + @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() { + @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() { + @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 addOrUpdate, List delete){ + //新增或者删除 + if(addOrUpdate != null && addOrUpdate.size() > 0){ + for(final FormDetailEntity dbe : addOrUpdate){ + + try{ + accessor.runDMLAction(new DBAction() { + @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() { + @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; + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkFlowProcessController.java b/src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkFlowProcessController.java new file mode 100644 index 0000000..c7a4641 --- /dev/null +++ b/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 addOrUpdate, List delete){ + //新增或者删除 + if(addOrUpdate != null && addOrUpdate.size() > 0){ + for(final WorkflowProcessEntity dbe : addOrUpdate){ + + try{ + accessor.runDMLAction(new DBAction() { + @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() { + @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 getByFormidAndDataid(String formid,String dataid){ + try{ + return accessor.runQueryAction(new DBAction>() { + @Override + public List run(DAOContext context) throws Exception { + List result = context.getDAO(WorkflowProcessDao.class).getByFormidAndDataid(formid,dataid); + + return result == null ? new ArrayList() : result; + } + }); + }catch(Throwable e){ + FRUtils.FRLogError("exception getAllDBLink:"+e.getMessage()); + } + + return new ArrayList(); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkflowConfigDbController.java b/src/main/java/com/eco/plugin/wink/workflow/db/controller/WorkflowConfigDbController.java new file mode 100644 index 0000000..359a4f4 --- /dev/null +++ b/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() { + @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() { + @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 addOrUpdate, List delete){ + //新增或者删除 + if(addOrUpdate != null && addOrUpdate.size() > 0){ + for(final WorkflowNodeEntity dbe : addOrUpdate){ + + try{ + accessor.runDMLAction(new DBAction() { + @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() { + @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 getWrokflowDefList(){ + try{ + return accessor.runQueryAction(new DBAction>() { + @Override + public List run(DAOContext context) throws Exception { + List result = context.getDAO(WorkflowDefDao.class).getAll(); + + return result == null ? new ArrayList() : result; + } + }); + }catch(Throwable e){ + FRUtils.FRLogError("exception getWrokflowDefList:"+e.getMessage()); + } + + return new ArrayList(); + } + + /** + * 根据表单获取流程定义 + * @param formid + * @return + */ + public static WorkflowDefEntity getByFormid(String formid){ + try{ + return accessor.runQueryAction(new DBAction() { + @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 getNodesByWorkflowId(String formid){ + try{ + return accessor.runQueryAction(new DBAction>() { + @Override + public List run(DAOContext context) throws Exception { + List result = context.getDAO(WorkflowNodeDao.class).getFieldById(formid); + + return result == null ? new ArrayList() : result; + } + }); + }catch(Throwable e){ + FRUtils.FRLogError("exception getNodesByWorkflowId:"+e.getMessage()); + } + + return new ArrayList(); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/dao/DBLinkDao.java b/src/main/java/com/eco/plugin/wink/workflow/db/dao/DBLinkDao.java new file mode 100644 index 0000000..c051a56 --- /dev/null +++ b/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 { + + public DBLinkDao(DAOSession session) { + super(session); + } + + @Override + protected Class getEntityClass() { + return DBLinkEntity.class; + } + + public final static DAOProvider DAO = new DAOProvider() { + @Override + public Class getEntityClass() { + return DBLinkEntity.class; + } + + @Override + public Class 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 getAll () throws Exception { + return getSession().find(QueryFactory.create().addSort("createtime",false),DBLinkEntity.class); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/dao/FormDefDao.java b/src/main/java/com/eco/plugin/wink/workflow/db/dao/FormDefDao.java new file mode 100644 index 0000000..d8e73d1 --- /dev/null +++ b/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 { + + public FormDefDao(DAOSession session) { + super(session); + } + + @Override + protected Class getEntityClass() { + return FormDefEntity.class; + } + + public final static DAOProvider DAO = new DAOProvider() { + @Override + public Class getEntityClass() { + return FormDefEntity.class; + } + + @Override + public Class 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 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); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/dao/FormFieldDao.java b/src/main/java/com/eco/plugin/wink/workflow/db/dao/FormFieldDao.java new file mode 100644 index 0000000..f862d27 --- /dev/null +++ b/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 { + + public FormFieldDao(DAOSession session) { + super(session); + } + + @Override + protected Class getEntityClass() { + return FormDetailEntity.class; + } + + public final static DAOProvider DAO = new DAOProvider() { + @Override + public Class getEntityClass() { + return FormDetailEntity.class; + } + + @Override + public Class 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 getAll () throws Exception { +//// return getSession().find(QueryFactory.create().addSort("createtime",false),FormDetailEntity.class); +// } + + public List getFieldById(String formid) throws Exception{ + return getSession().find(QueryFactory.create().addRestriction(RestrictionFactory.eq("formid",formid)).addSort("sort",false),FormDetailEntity.class); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowDefDao.java b/src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowDefDao.java new file mode 100644 index 0000000..a5ae236 --- /dev/null +++ b/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 { + + public WorkflowDefDao(DAOSession session) { + super(session); + } + + @Override + protected Class getEntityClass() { + return WorkflowDefEntity.class; + } + + public final static DAOProvider DAO = new DAOProvider() { + @Override + public Class getEntityClass() { + return WorkflowDefEntity.class; + } + + @Override + public Class 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 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); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowNodeDao.java b/src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowNodeDao.java new file mode 100644 index 0000000..b15c40b --- /dev/null +++ b/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 { + + public WorkflowNodeDao(DAOSession session) { + super(session); + } + + @Override + protected Class getEntityClass() { + return WorkflowNodeEntity.class; + } + + public final static DAOProvider DAO = new DAOProvider() { + @Override + public Class getEntityClass() { + return WorkflowNodeEntity.class; + } + + @Override + public Class 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 getFieldById(String workflowId) throws Exception{ + return getSession().find(QueryFactory.create().addRestriction(RestrictionFactory.eq("workflowid",workflowId)).addSort("sort",false),WorkflowNodeEntity.class); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowProcessDao.java b/src/main/java/com/eco/plugin/wink/workflow/db/dao/WorkflowProcessDao.java new file mode 100644 index 0000000..e688107 --- /dev/null +++ b/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 { + + public WorkflowProcessDao(DAOSession session) { + super(session); + } + + @Override + protected Class getEntityClass() { + return WorkflowProcessEntity.class; + } + + public final static DAOProvider DAO = new DAOProvider() { + @Override + public Class getEntityClass() { + return WorkflowProcessEntity.class; + } + + @Override + public Class 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 getAll () throws Exception { + return getSession().find(QueryFactory.create().addSort("createtime",false),WorkflowProcessEntity.class); + } + + public List 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); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/kit/CustomRoleServiceKit.java b/src/main/java/com/eco/plugin/wink/workflow/kit/CustomRoleServiceKit.java new file mode 100644 index 0000000..8f230a2 --- /dev/null +++ b/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; + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/kit/UserServiceKit.java b/src/main/java/com/eco/plugin/wink/workflow/kit/UserServiceKit.java new file mode 100644 index 0000000..cb99856 --- /dev/null +++ b/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 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); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/utils/DateUtilSelf.java b/src/main/java/com/eco/plugin/wink/workflow/utils/DateUtilSelf.java new file mode 100644 index 0000000..aa96977 --- /dev/null +++ b/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 getDateList(String date,int length){ + List dateList = new ArrayList(); + 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); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/utils/FRRoleUtils.java b/src/main/java/com/eco/plugin/wink/workflow/utils/FRRoleUtils.java new file mode 100644 index 0000000..218f1d3 --- /dev/null +++ b/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 = UserMiddleRoleService.getInstance().getAllCustomRoles(); + CustomRole[] roles = SuperCustomRoleController.KEY.getAllCustomRoles((String)null, ""); + return roles; + } + + public static RoleBean getRoleByName(String rolename) throws Exception { + return getRoleService().getCustomRole(rolename); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/utils/FRUserUtils.java b/src/main/java/com/eco/plugin/wink/workflow/utils/FRUserUtils.java new file mode 100644 index 0000000..08e6ad1 --- /dev/null +++ b/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 getAllUsers() throws Exception { +// List userbean = UserMiddleRoleService.getInstance().getAllUsers(false); + List users = new ArrayList(); + 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 users) throws Exception { + Map result = getUserService().getAllUsers(adminUsername,page,num,"","",true); + Long total = (Long)result.get("total"); + List item = (List)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 getDepRoleBean(String username) throws Exception{ + return getUserRolesBean(username).getDepRoles(); + } + + /** + * 获取角色 + * @param username + * @return + * @throws Exception + */ + public static List 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 getUsersFromMobile(String mobile) throws Exception { + List users = getUserService().getUsersFromMobile(mobile); + return users; + } + +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/utils/FRUtils.java b/src/main/java/com/eco/plugin/wink/workflow/utils/FRUtils.java new file mode 100644 index 0000000..143fe83 --- /dev/null +++ b/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; + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/utils/JDBCUtils.java b/src/main/java/com/eco/plugin/wink/workflow/utils/JDBCUtils.java new file mode 100644 index 0000000..c51d8d2 --- /dev/null +++ b/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> getResult(String sql, String[] columns,String formid){ + List> result = new ArrayList>(); + + Connection conn=null; + Statement st=null; + ResultSet rs=null; + + try { + conn = getConnect(); + st = conn.createStatement(); + rs = st.executeQuery(sql); + //遍历查询每条记录 + while(rs.next()) { + Map map = new HashMap(); + + 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; + } + } + +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/utils/ResponseUtils.java b/src/main/java/com/eco/plugin/wink/workflow/utils/ResponseUtils.java new file mode 100644 index 0000000..a1072eb --- /dev/null +++ b/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(); + } +} diff --git a/src/main/java/com/eco/plugin/wink/workflow/utils/Utils.java b/src/main/java/com/eco/plugin/wink/workflow/utils/Utils.java new file mode 100644 index 0000000..23729e3 --- /dev/null +++ b/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 parameterMap){ + if(parameterMap == null){ + parameterMap = new HashMap(); + } + + 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 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