From 78bcb2ef1aea5f4515979a1668a106bb9185201f Mon Sep 17 00:00:00 2001 From: "youhong.ai" Date: Thu, 15 Jun 2023 00:53:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B4=B2=E9=99=85=E9=85=92?= =?UTF-8?q?=E5=BA=97=E5=85=83=E7=B4=A0=E5=BC=80=E5=8F=91=EF=BC=8C=E4=BF=9D?= =?UTF-8?q?=E6=97=B6=E6=8D=B7=E7=BB=84=E7=BB=87=E6=9E=B6=E6=9E=84=E5=9B=BE?= =?UTF-8?q?=E6=AC=A1=E8=B4=A6=E5=8F=B7=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- javascript/common/Utils.js | 48 +++++ javascript/youhong.ai/ihgzhouji/流程代码块.js | 58 +++++ .../youhong.ai/pcn/workflow_code_block.js | 15 +- src/main/java/aiyh/utils/Util.java | 204 ++++-------------- .../aiyh/utils/entity/AZipOutputStream.java | 64 ------ .../java/aiyh/utils/function/Bi3Function.java | 23 ++ .../java/aiyh/utils/function/Bi4Function.java | 24 +++ .../RequestMsgNotifiyController.java | 14 ++ .../contoller/TaskElementController.java | 56 ++++- .../taskele/mapper/TaskElementMapper.java | 18 ++ .../taskele/service/TaskElementService.java | 30 ++- .../controller/UserInfoController.java | 45 ++++ .../userinfoel/mapper/UserInfoMapper.java | 150 +++++++++++++ .../userinfoel/service/UserInfoService.java | 153 +++++++++++++ .../ihgzhouji/userinfoel/vo/UserInfoVo.java | 40 ++++ .../orgchart/mapper/OrgChartMapper.java | 10 +- .../orgchart/service/OrgChartService.java | 56 ++++- .../CreateRequestException.java | 77 +++++++ .../impl/CheckWorkflowRequestParamsImpl.java | 126 +++++++++++ .../CheckWorkflowRequestParamsMapper.java | 61 ++++++ .../pojo/CheckConditionItem.java | 30 +++ .../pojo/CheckCreateConfig.java | 31 +++ .../pojo/CheckCreateConfigDetail.java | 37 ++++ .../util/CheckRuleMethodUtil.java | 139 ++++++++++++ .../util/CheckWorkflowRequestParamsUtil.java | 84 ++++++++ .../java/youhong/ai/taibao/TestTaiBao.java | 7 + .../java/youhong/ai/utiltest/TestApi.java | 153 +++++++++++++ 27 files changed, 1503 insertions(+), 250 deletions(-) create mode 100644 javascript/youhong.ai/ihgzhouji/流程代码块.js delete mode 100644 src/main/java/aiyh/utils/entity/AZipOutputStream.java create mode 100644 src/main/java/aiyh/utils/function/Bi3Function.java create mode 100644 src/main/java/aiyh/utils/function/Bi4Function.java create mode 100644 src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/controller/UserInfoController.java create mode 100644 src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/mapper/UserInfoMapper.java create mode 100644 src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/service/UserInfoService.java create mode 100644 src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/vo/UserInfoVo.java create mode 100644 src/main/java/com/customization/youhong/pcn/createrworkflow/CreateRequestException.java create mode 100644 src/main/java/com/customization/youhong/pcn/createrworkflow/impl/CheckWorkflowRequestParamsImpl.java create mode 100644 src/main/java/com/customization/youhong/pcn/createrworkflow/mapper/CheckWorkflowRequestParamsMapper.java create mode 100644 src/main/java/com/customization/youhong/pcn/createrworkflow/pojo/CheckConditionItem.java create mode 100644 src/main/java/com/customization/youhong/pcn/createrworkflow/pojo/CheckCreateConfig.java create mode 100644 src/main/java/com/customization/youhong/pcn/createrworkflow/pojo/CheckCreateConfigDetail.java create mode 100644 src/main/java/com/customization/youhong/pcn/createrworkflow/util/CheckRuleMethodUtil.java create mode 100644 src/main/java/com/customization/youhong/pcn/createrworkflow/util/CheckWorkflowRequestParamsUtil.java create mode 100644 src/test/java/youhong/ai/utiltest/TestApi.java diff --git a/javascript/common/Utils.js b/javascript/common/Utils.js index 45b545c..c04a3a2 100644 --- a/javascript/common/Utils.js +++ b/javascript/common/Utils.js @@ -161,3 +161,51 @@ class CusUtils { } window.Utils = new CusUtils() + + +const getLeble = function (lable, defaultStr) { + if (!langue[lable + '']) { + return defaultStr; + } + let lableMap = langue[lable + ''] + const userInfo = JSON.parse(localStorage.getItem("theme-account")) + if (!lableMap[userInfo.userLanguage + '']) { + return defaultStr + } + return lableMap[userInfo.userLanguage + ''] +} + + +class LanguageUtil { + + static language = { + '1': { + '8': '英文', + '7': '中文', + '15': '日语' + } + } + + static getLabel(label, defaultStr) { + if (!LanguageUtil.language[label + '']) { + return defaultStr; + } + let languageMap = LanguageUtil.language[label + ''] + let userInfo = JSON.parse(localStorage.getItem("theme-account")) + if (!userInfo) { + userInfo = { + userLanguage: '7' + } + } + + if (!languageMap[userInfo.userLanguage + '']) { + return defaultStr + } + return languageMap[userInfo.userLanguage + ''] + } +} + +// export default CusUtils +ecodeSDK.exp(LanguageUtil) +window.LanguageUtil = LanguageUtil + diff --git a/javascript/youhong.ai/ihgzhouji/流程代码块.js b/javascript/youhong.ai/ihgzhouji/流程代码块.js new file mode 100644 index 0000000..16886c6 --- /dev/null +++ b/javascript/youhong.ai/ihgzhouji/流程代码块.js @@ -0,0 +1,58 @@ +/* ******************* youhong.ai 转交任务提交状态修改 start ******************* */ + +$(() => { + function api(requestOptions = { + url: "", + type: "GET", + data: "", + isAsync: true, + success: () => { + }, + error: () => { + }, + complete: () => { + }, + contentType: 'application/json', + beforeSend: () => { + } + }) { + let options = Object.assign({ + url: "", + type: "GET", + data: "", + isAsync: true, + success: () => { + }, + error: () => { + }, + complete: () => { + }, + contentType: 'application/json', + beforeSend: () => { + } + }, requestOptions) + return $.ajax(options) + } + + WfForm.registerCheckEvent(WfForm.OPER_SUBMIT, callback => { + let obj = {} + obj.actionId = WfForm.getFieldValue(WfForm.convertFieldNameToId('actionid')) + obj.userId = WfForm.getFieldValue(WfForm.convertFieldNameToId('zjr', 'detail_1') + "_0") + api({ + url: "/api/aiyh/ihg/task/submit-task", + type: "POST", + data: JSON.stringify(obj), + isAsync: false, + success(res) { + if (res && res.code === 200) { + callback() + } + }, + complete() { + callback() + } + }) + }) +}) + +/* ******************* youhong.ai 转交任务提交状态修改 end ******************* */ \ No newline at end of file diff --git a/javascript/youhong.ai/pcn/workflow_code_block.js b/javascript/youhong.ai/pcn/workflow_code_block.js index 71111a0..5dca6db 100644 --- a/javascript/youhong.ai/pcn/workflow_code_block.js +++ b/javascript/youhong.ai/pcn/workflow_code_block.js @@ -751,13 +751,12 @@ $(() => { $(() => { let config = { // 基础年假 - base: 21, + base: 20, // 入职日期 dateField: 'jrbsjjtsj', // 年假 targetField: 'nj' } - runJs() function runJs() { @@ -769,20 +768,22 @@ $(() => { WfForm.changeFieldValue(WfForm.convertFieldNameToId(config.targetField), {value: njValue}) } }) - } function calculateBonus(startDate, endDate, config) { const diffInMs = endDate.getTime() - startDate.getTime(); const diffInYears = diffInMs / (1000 * 60 * 60 * 24 * 365); - if (diffInYears < 3) { - return 0; - } else if (diffInYears >= 3 && diffInYears < 6) { return config.base; + } else if (diffInYears >= 3 && diffInYears < 6) { + return config.base + 1; } else { const extraYears = Math.floor((diffInYears - 3) / 3); - return config.base + extraYears * 2; + let resultDay = config.base + extraYears * 2 + if (resultDay >= 25) { + return 25; + } + return resultDay; } } }) diff --git a/src/main/java/aiyh/utils/Util.java b/src/main/java/aiyh/utils/Util.java index bec3d42..99763b9 100644 --- a/src/main/java/aiyh/utils/Util.java +++ b/src/main/java/aiyh/utils/Util.java @@ -77,7 +77,6 @@ import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import java.util.zip.ZipEntry; /** * @author EBU7-dev1-ayh @@ -1599,126 +1598,6 @@ public class Util extends weaver.general.Util { return getUtilService().getApiConfigMainTree(id); } - public static AZipOutputStream createZip(List inputList) throws IOException { - return createZip(inputList, File.separator); - } - - private static AZipOutputStream createZip(List inputList, String base) throws IOException { - FileOutputStream fileOutputStream = null; - - try { - File file = new File(AZipOutputStream.filePath); - if (!file.exists()) { - // 先得到文件的上级目录,并创建上级目录,在创建文件 - file.getParentFile().mkdirs(); - try { - // 创建文件 - file.createNewFile(); - } catch (IOException ex) { - ex.printStackTrace(); - } - } - fileOutputStream = new FileOutputStream(file); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - if (fileOutputStream == null) { - return null; - } - AZipOutputStream zipOut = new AZipOutputStream(fileOutputStream); - int catchLen = 10 * 1024; - for (int i = 0; i < inputList.size(); i++) { - T item = inputList.get(i); - if (item instanceof InputStream) { - // 属于单级文件,直接压缩并返回 - try { - zipOut.putNextEntry(new ZipEntry(base + i)); - } catch (IOException e) { - throw new IOException(e.toString()); - } - byte[] buffer = new byte[catchLen]; - int len = 0; - while ((len = ((InputStream) item).read(buffer)) != -1) { - zipOut.write(buffer, 0, len); - } - zipOut.closeEntry(); - } - if (item instanceof AInputStream) { - try { - zipOut.putNextEntry(new ZipEntry(((AInputStream) item).getFileName())); - } catch (IOException e) { - e.printStackTrace(); - } - byte[] buffer = new byte[catchLen]; - int len = 0; - while ((len = ((AInputStream) item).getInputStream().read(buffer)) != -1) { - try { - zipOut.write(buffer, 0, len); - } catch (IOException e) { - e.printStackTrace(); - } - } - zipOut.closeEntry(); - } - if (item instanceof ListZipEntity) { - ListZipEntity listZipEntity = (ListZipEntity) item; - if (listZipEntity.isDirectory()) { - // 表示属于文件夹,循环添加处理文件夹 - handlerDirectory(listZipEntity.getFileList(), zipOut, base + listZipEntity.getDirectory() + File.separator); - } else { - List aInputStreams = listZipEntity.getaInputStreamList(); - for (AInputStream aInputStream : aInputStreams) { - try { - zipOut.putNextEntry(new ZipEntry(aInputStream.getFileName())); - } catch (IOException e) { - e.printStackTrace(); - } - byte[] buffer = new byte[catchLen]; - int len = 0; - while ((len = (aInputStream.getInputStream()).read(buffer)) != -1) { - try { - zipOut.write(buffer, 0, len); - } catch (IOException e) { - e.printStackTrace(); - } - } - zipOut.closeEntry(); - } - } - } - } - return zipOut; - } - - private static void handlerDirectory(List fileList, AZipOutputStream zipOut, String base) throws IOException { - int catchLen = 10 * 1024; - for (ListZipEntity listZipEntity : fileList) { - if (listZipEntity.isDirectory()) { - // 如果是文件夹 - handlerDirectory(listZipEntity.getFileList(), zipOut, base + listZipEntity.getDirectory() + File.separator); - } else { - List aInputStreams = listZipEntity.getaInputStreamList(); - for (AInputStream aInputStream : aInputStreams) { - try { - zipOut.putNextEntry(new ZipEntry(aInputStream.getFileName())); - } catch (IOException e) { - e.printStackTrace(); - } - byte[] buffer = new byte[catchLen]; - int len = 0; - while ((len = (aInputStream.getInputStream()).read(buffer)) != -1) { - try { - zipOut.write(buffer, 0, len); - } catch (IOException e) { - e.printStackTrace(); - } - } - zipOut.closeEntry(); - } - } - } - } - public static Map queryLanguage(int groupId, int languageId) { return getUtilService().queryLanguage(groupId, languageId); } @@ -2266,47 +2145,46 @@ public class Util extends weaver.general.Util { if (otherLog.containsKey(name)) { return otherLog.get(name); } - if (!otherLog.containsKey(name)) { - synchronized (Util.otherLog) { - if (otherLog.containsKey(name)) { - return otherLog.get(name); - } - Logger cusLog = Logger.getLogger("cus_" + name); - if ("true".equals(System.getProperty("_isDebug"))) { - ConsoleAppender appender = new ConsoleAppender(); - appender.setName("cus_" + name); - appender.setEncoding("UTF-8"); - appender.setThreshold(Priority.DEBUG); - appender.setLayout(new PatternLayout("[%-5p] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%r] [%F.%M:%L] ==> \n %m %x %n")); - appender.activateOptions(); - cusLog.addAppender(appender); - } else { - DailyRollingFileAppender appender = new DailyRollingFileAppender(); - appender.setName("cus_" + name); - appender.setEncoding("UTF-8"); - appender.setDatePattern("'_'yyyyMMdd'.log'"); - String logPath = GCONST.getLogPath(); - try { - Map map = getProperties2Map("logPathConfig", "cus"); - if (map != null) { - if (map.containsKey("logPath")) { - logPath = "".equals(null2String(map.get("logPath"))) ? logPath : null2String(map.get("logPath")); - } + synchronized (Util.otherLog) { + if (otherLog.containsKey(name)) { + return otherLog.get(name); + } + Logger cusLog = Logger.getLogger("cus_" + name); + if ("true".equals(System.getProperty("_isDebug"))) { + ConsoleAppender appender = new ConsoleAppender(); + appender.setName("cus_" + name); + appender.setEncoding("UTF-8"); + appender.setThreshold(Priority.DEBUG); + appender.setLayout(new PatternLayout("[%-5p] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%r] [%F.%M:%L] ==> \n %m %x %n")); + appender.activateOptions(); + cusLog.addAppender(appender); + } else { + DailyRollingFileAppender appender = new DailyRollingFileAppender(); + appender.setName("cus_" + name); + appender.setEncoding("UTF-8"); + appender.setDatePattern("'_'yyyyMMdd'.log'"); + String logPath = GCONST.getLogPath(); + try { + Map map = getProperties2Map("logPathConfig", "cus"); + if (map != null) { + if (map.containsKey("logPath")) { + logPath = "".equals(null2String(map.get("logPath"))) ? logPath : null2String(map.get("logPath")); } - } catch (Exception ignore) { + } + } catch (Exception ignore) { - } - if (!logPath.endsWith(File.separator)) { - logPath = logPath + File.separator; - } - appender.setFile(logPath + "cus" + File.separator + name + File.separator + "cus.log"); - appender.setThreshold(Priority.DEBUG); - appender.setLayout(new PatternLayout("[%-5p] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%r] [%F.%M:%L] ==> \n %m %x %n")); - appender.setAppend(true); - appender.activateOptions(); - cusLog.addAppender(appender); } - cusLog.setAdditivity(false); + if (!logPath.endsWith(File.separator)) { + logPath = logPath + File.separator; + } + appender.setFile(logPath + "cus" + File.separator + name + File.separator + "cus.log"); + appender.setThreshold(Priority.DEBUG); + appender.setLayout(new PatternLayout("[%-5p] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%r] [%F.%M:%L] ==> \n %m %x %n")); + appender.setAppend(true); + appender.activateOptions(); + cusLog.addAppender(appender); + } + cusLog.setAdditivity(false); /* boolean enableDebug = false; try { @@ -2325,12 +2203,10 @@ public class Util extends weaver.general.Util { cusLog.setLevel(Level.INFO); } */ - cusLog.setLevel(Level.INFO); - otherLog.put(name, cusLog); - return cusLog; - } + cusLog.setLevel(Level.INFO); + otherLog.put(name, cusLog); + return cusLog; } - return null; } /** diff --git a/src/main/java/aiyh/utils/entity/AZipOutputStream.java b/src/main/java/aiyh/utils/entity/AZipOutputStream.java deleted file mode 100644 index f49216d..0000000 --- a/src/main/java/aiyh/utils/entity/AZipOutputStream.java +++ /dev/null @@ -1,64 +0,0 @@ -package aiyh.utils.entity; - -import org.jetbrains.annotations.NotNull; -import weaver.file.FileUpload; -import weaver.system.SystemComInfo; - -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.UUID; -import java.util.zip.ZipOutputStream; - -/** - * @author EBU7-dev1-ayh - * @create 2021/10/25 0025 17:38 - * zipoutputstaream - */ - - -public class AZipOutputStream extends ZipOutputStream { - - private ZipOutputStream zipOutputStream; - public static String filePath; - private OutputStream out; - static { - filePath = FileUpload.getCreateDir(new SystemComInfo().getFilesystem()) + "tempfile" + File.separator; - filePath += "zip" + File.separator + System.currentTimeMillis() + UUID.randomUUID() + ".zip"; - } - - public AZipOutputStream(@NotNull OutputStream out) { - super(out); - this.out = out; - } - - public AZipOutputStream(@NotNull OutputStream out, @NotNull Charset charset) { - super(out, charset); - this.out = out; - } - - @Override - public void close() throws IOException { - try { - Files.deleteIfExists(Paths.get(AZipOutputStream.filePath)); - } catch (IOException e) { - e.printStackTrace(); - }finally { - out.flush(); - super.flush(); - super.close(); - out.close(); - } - } - - public ZipOutputStream getZipOutputStream() { - return zipOutputStream; - } - - public void setZipOutputStream(ZipOutputStream zipOutputStream) { - this.zipOutputStream = zipOutputStream; - } -} diff --git a/src/main/java/aiyh/utils/function/Bi3Function.java b/src/main/java/aiyh/utils/function/Bi3Function.java new file mode 100644 index 0000000..037f308 --- /dev/null +++ b/src/main/java/aiyh/utils/function/Bi3Function.java @@ -0,0 +1,23 @@ +package aiyh.utils.function; + +/** + *

三个参数的function

+ * + *

create: 2023/6/14 21:30

+ * + * @author youHong.ai + */ +@FunctionalInterface +public interface Bi3Function { + + /** + * Applies this function to the given arguments. + * + * @param a the first function argument + * @param b the second function argument + * @param c the second function argument + * @return the function result + */ + R apply(A a, B b, C c); + +} diff --git a/src/main/java/aiyh/utils/function/Bi4Function.java b/src/main/java/aiyh/utils/function/Bi4Function.java new file mode 100644 index 0000000..efd9a3c --- /dev/null +++ b/src/main/java/aiyh/utils/function/Bi4Function.java @@ -0,0 +1,24 @@ +package aiyh.utils.function; + +/** + *

三个参数的function

+ * + *

create: 2023/6/14 21:30

+ * + * @author youHong.ai + */ +@FunctionalInterface +public interface Bi4Function { + + /** + * Applies this function to the given arguments. + * + * @param a the first function argument + * @param b the second function argument + * @param c the second function argument + * @param d the second function argument + * @return the function result + */ + R apply(A a, B b, C c, D d); + +} diff --git a/src/main/java/com/api/test/aiyh/controller/RequestMsgNotifiyController.java b/src/main/java/com/api/test/aiyh/controller/RequestMsgNotifiyController.java index f3051e8..f98b1c8 100644 --- a/src/main/java/com/api/test/aiyh/controller/RequestMsgNotifiyController.java +++ b/src/main/java/com/api/test/aiyh/controller/RequestMsgNotifiyController.java @@ -1,5 +1,6 @@ package com.api.test.aiyh.controller; +import aiyh.utils.ApiResult; import com.alibaba.fastjson.JSON; import weaver.workflow.msg.MsgPushUtil; import weaver.workflow.msg.entity.MsgEntity; @@ -11,7 +12,9 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** *

ceshi

@@ -36,4 +39,15 @@ public class RequestMsgNotifiyController { new MsgPushUtil().pushMsg(operateMsg); return ""; } + + @GET + @Path("/test/cus-api") + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + public String testCusApiJiaoYan() { + Map result = new HashMap<>(8); + result.put("key", "asldfjalksd"); + result.put("name", "test"); + return ApiResult.success(result); + } } diff --git a/src/main/java/com/api/youhong/ai/ihgzhouji/taskele/contoller/TaskElementController.java b/src/main/java/com/api/youhong/ai/ihgzhouji/taskele/contoller/TaskElementController.java index dfef1fc..6070c98 100644 --- a/src/main/java/com/api/youhong/ai/ihgzhouji/taskele/contoller/TaskElementController.java +++ b/src/main/java/com/api/youhong/ai/ihgzhouji/taskele/contoller/TaskElementController.java @@ -28,6 +28,14 @@ public class TaskElementController { private final TaskElementService service = new TaskElementService(); + /** + *

查询任务列表

+ * + * @param request 请求体 + * @param response 响应体 + * @param itemGroup 分组值 + * @return 任务列表 + */ @Path("/list-get") @GET @Produces(MediaType.APPLICATION_JSON) @@ -36,13 +44,22 @@ public class TaskElementController { @QueryParam("itemGroup") String itemGroup) { User user = HrmUserVarify.getUser(request, response); try { - return ApiResult.success(service.getList(user,itemGroup)); + return ApiResult.success(service.getList(user, itemGroup)); } catch (Exception e) { log.error("get task list error!\n" + Util.getErrString(e)); return ApiResult.error("system error!"); } } + /** + *

搜索任务信息

+ * + * @param request 请求体 + * @param response 响应体 + * @param params 请求参数 + * @param configId 配置id + * @return 任务信息列表 + */ @Path("/search-list") @POST @Produces(MediaType.APPLICATION_JSON) @@ -61,6 +78,13 @@ public class TaskElementController { } + /** + *

查询按钮权限

+ * + * @param request 请求体 + * @param response 响应体 + * @return 按钮权限信息 + */ @Path("/get-btn") @GET @Produces(MediaType.APPLICATION_JSON) @@ -77,6 +101,11 @@ public class TaskElementController { } + /** + *

清除配置信息

+ * + * @return 是否成功 + */ @Path("/clear-config") @GET @Produces(MediaType.APPLICATION_JSON) @@ -89,4 +118,29 @@ public class TaskElementController { return ApiResult.error("system error!"); } } + + + /** + *

提交转发任务修改状态

+ * + * @param request 请求体 + * @param response 响应体 + * @param params 请求参数 + * @return 更新状态 + */ + @Path("/submit-task") + @POST + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + public String submitTask(@Context HttpServletRequest request, + @Context HttpServletResponse response, + @RequestBody Map params) { + try { + User user = HrmUserVarify.getUser(request, response); + return ApiResult.success(service.submitTask(user, params)); + } catch (Exception e) { + log.error("提交转交任务状态写入失败!" + Util.getErrString(e)); + return ApiResult.error("system error!"); + } + } } diff --git a/src/main/java/com/api/youhong/ai/ihgzhouji/taskele/mapper/TaskElementMapper.java b/src/main/java/com/api/youhong/ai/ihgzhouji/taskele/mapper/TaskElementMapper.java index 194616b..9278b84 100644 --- a/src/main/java/com/api/youhong/ai/ihgzhouji/taskele/mapper/TaskElementMapper.java +++ b/src/main/java/com/api/youhong/ai/ihgzhouji/taskele/mapper/TaskElementMapper.java @@ -150,4 +150,22 @@ public interface TaskElementMapper { String selectConvert(@SqlString String sql, @ParamMapper("value") String o); + /** + *

查询主表ID

+ * + * @param actionId actionId + * @return 主表id + */ + @Select("select id from uf_rwtzeq where touchpointbh = #{actionId}") + String selectTaskMainId(String actionId); + + /** + *

更新被转交任务状态

+ * + * @param userId 当前用户 + * @param mainId 主表ID + * @return 更新状态 + */ + @Update("update uf_rwtzeq_dt1 set zjwczt = 0 where zjr = #{userId} and mainid = #{mainId}") + boolean updateTaskHandoverStatus(@ParamMapper("userId") String userId, @ParamMapper("mainId") String mainId); } diff --git a/src/main/java/com/api/youhong/ai/ihgzhouji/taskele/service/TaskElementService.java b/src/main/java/com/api/youhong/ai/ihgzhouji/taskele/service/TaskElementService.java index 86d3704..9fbb345 100644 --- a/src/main/java/com/api/youhong/ai/ihgzhouji/taskele/service/TaskElementService.java +++ b/src/main/java/com/api/youhong/ai/ihgzhouji/taskele/service/TaskElementService.java @@ -5,6 +5,7 @@ import aiyh.utils.excention.CustomerException; import aiyh.utils.tool.cn.hutool.core.collection.CollectionUtil; import aiyh.utils.tool.cn.hutool.core.lang.Assert; import aiyh.utils.tool.cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.api.youhong.ai.ihgzhouji.taskele.entity.IhgTaskElementConfigItem; import com.api.youhong.ai.ihgzhouji.taskele.mapper.TaskElementMapper; import com.api.youhong.ai.ihgzhouji.taskele.mapstruct.TaskElementMapstruct; @@ -48,11 +49,11 @@ public class TaskElementService { return config; } - public List getList(User user,String itemGroup) { + public List getList(User user, String itemGroup) { List ihgTaskElementConfItemList = null; if (StrUtil.isBlank(itemGroup)) { ihgTaskElementConfItemList = mapper.selectConfig(); - }else { + } else { ihgTaskElementConfItemList = mapper.selectConfigByGroup(itemGroup); } if (CollectionUtil.isEmpty(ihgTaskElementConfItemList)) { @@ -243,4 +244,29 @@ public class TaskElementService { } return result; } + + /** + *

提交转交任务修改转交任务状态

+ * + * @param user 当前登录用户 + * @param params 请求参数 + * @return 是否更新成功 + */ + public Object submitTask(User user, Map params) { + String actionId = Util.null2String(params.get("actionId")); + String userId = Util.null2String(params.get("userId")); + if (!userId.equals(Util.null2String(user.getUID()))) { + throw new CustomerException("被转交人和当前登录人不一致!"); + } + String mainId = mapper.selectTaskMainId(actionId); + if (StrUtil.isBlank(mainId)) { + throw new CustomerException("无法查询到对应的任务信息!"); + } + // 更新被转交人转交任务状态 + boolean flag = mapper.updateTaskHandoverStatus(userId, mainId); + if (!flag) { + log.error("更新被转交任务状态失败!当前用户信息以及请求参数:" + JSON.toJSONString(params)); + } + return flag; + } } diff --git a/src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/controller/UserInfoController.java b/src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/controller/UserInfoController.java new file mode 100644 index 0000000..da6fe29 --- /dev/null +++ b/src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/controller/UserInfoController.java @@ -0,0 +1,45 @@ +package com.api.youhong.ai.ihgzhouji.userinfoel.controller; + +import aiyh.utils.ApiResult; +import aiyh.utils.Util; +import com.api.youhong.ai.ihgzhouji.userinfoel.service.UserInfoService; +import org.apache.log4j.Logger; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; + +/** + *

获取用户信息

+ * + *

create: 2023/6/11 22:11

+ * + * @author youHong.ai + */ +@Path("/aiyh/user-info") +public class UserInfoController { + + private final Logger log = Util.getLogger(); + + private final UserInfoService service = new UserInfoService(); + + + @GET + @Path("/get") + @Produces(MediaType.APPLICATION_JSON) + public String getUserInfo(@Context HttpServletRequest request, @Context HttpServletResponse response) { + try { + User user = HrmUserVarify.getUser(request, response); + return ApiResult.success(service.getUserInfo(user)); + } catch (Exception e) { + log.error("获取用户信息失败!" + Util.getErrString(e)); + return ApiResult.error("system error!"); + } + } +} diff --git a/src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/mapper/UserInfoMapper.java b/src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/mapper/UserInfoMapper.java new file mode 100644 index 0000000..6767fc8 --- /dev/null +++ b/src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/mapper/UserInfoMapper.java @@ -0,0 +1,150 @@ +package com.api.youhong.ai.ihgzhouji.userinfoel.mapper; + +import aiyh.utils.annotation.recordset.ParamMapper; +import aiyh.utils.annotation.recordset.Select; +import aiyh.utils.annotation.recordset.SqlMapper; +import aiyh.utils.annotation.recordset.SqlString; +import weaver.hrm.User; + +import java.util.List; +import java.util.Map; + +/** + *

+ * + *

create: 2023/6/11 22:25

+ * + * @author youHong.ai + */ +@SqlMapper +public interface UserInfoMapper { + + /** + *

查询按钮权限

+ * + * @param sql 按钮权限sql + * @param user 当前用户 + * @return 查询到的数据 + */ + @Select(custom = true) + Map selectAuthoritySql(@SqlString String sql, User user); + + /** + *

查询是否是酒店人员

+ * + * @param uid 当前人员 + * @return 酒店数量 + */ + /*@Select("select count(id)\n" + + "from uf_hotelinfo\n" + + "where\n" + + " concat(',',salesmarketingleader,',') like concat(',',#{uID},',')\n" + + "or concat(',',revenueleader,',') like concat(',',#{uID},',')\n" + + "or concat(',',financeleader,',') like concat(',',#{uID},',')\n" + + "or concat(',',fbleader,',') like concat(',',#{uID},',')\n" + + "or concat(',',hrleader,',') like concat(',',#{uID},',')\n" + + "or concat(',',generalmanager,',') like concat(',', #{uID},',')")*/ + @Select("select count(id) from uf_hotelinfo where\n" + + "concat(',',olt,',') like concat(',',#{userId},',')\n" + + "or concat(',',vpo,',') like concat(',',#{userId},',')\n" + + "or concat(',',opsconsultant,',') like concat(',',#{userId},',')\n" + + "or concat(',',humanresources,',') like concat(',',#{userId},',')\n" + + "or concat(',',commercialperformance,',') like concat(',',#{userId},',')\n" + + "or concat(',',revenuemanagement,',') like concat(',',#{userId},',')\n" + + "or concat(',',financebusinesssupport,',') like concat(',',#{userId},',')\n" + + "or concat(',',rbeoperations,',') like concat(',',#{userId},',')\n" + + "or concat(',',engineering,',') like concat(',',#{userId},',')\n" + + "or concat(',',headofopsconsultant,',') like concat(',',#{userId},',')\n" + + "or concat(',',headofhumanresources,',') like concat(',',#{userId},',')\n" + + "or concat(',',headofcommercialperformance,',') like concat(',',#{userId},',')\n" + + "or concat(',',headofrevenuemanagement,',') like concat(',',#{userId},',')\n" + + "or concat(',',headoffinancebusinesssupport,',') like concat(',',#{userId},',')\n" + + "or concat(',',headofrbeoperations,',') like concat(',',#{userId},',')\n" + + "or concat(',',headofengineering,',') like concat(',',#{userId},',')") + Integer selectIsHotel(int uid); + + /** + *

查询酒店信息

+ * + * @param hotelIndex 酒店编码 + * @return 酒店信息 + */ + @Select("select * from v_commercial \n" + + " where holidex = #{hotelIndex}") + Map selectHotelInfo(String hotelIndex); + + /** + *

查询人员信息

+ * + * @param uid 当前人员 + * @return 人员信息 + */ + @Select("select id,lastname,messagerurl,departmentid from hrmresource where id = #{userId}") + Map selectHrmInfo(int uid); + + /** + *

查询角色信息

+ * + * @param uid 当前人员 + * @param hotelIndex 酒店编码 + * @return 角色信息 + */ + @Select("select * from uf_hotelinfo where\n" + + "(concat(',',olt,',') like concat(',',#{userId},',')\n" + + "or concat(',',vpo,',') like concat(',',#{userId},',')\n" + + "or concat(',',subregionadmin,',') like concat(',',#{userId},',')\n" + + "or concat(',',opsconsultant,',') like concat(',',#{userId},',')\n" + + "or concat(',',humanresources,',') like concat(',',#{userId},',')\n" + + "or concat(',',commercialperformance,',') like concat(',',#{userId},',')\n" + + "or concat(',',revenuemanagement,',') like concat(',',#{userId},',')\n" + + "or concat(',',financebusinesssupport,',') like concat(',',#{userId},',')\n" + + "or concat(',',rbeoperations,',') like concat(',',#{userId},',')\n" + + "or concat(',',engineering,',') like concat(',',#{userId},',')\n" + + "or concat(',',headofopsconsultant,',') like concat(',',#{userId},',')\n" + + "or concat(',',headofhumanresources,',') like concat(',',#{userId},',')\n" + + "or concat(',',headofcommercialperformance,',') like concat(',',#{userId},',')\n" + + "or concat(',',headofrevenuemanagement,',') like concat(',',#{userId},',')\n" + + "or concat(',',headoffinancebusinesssupport,',') like concat(',',#{userId},',')\n" + + "or concat(',',headofrbeoperations,',') like concat(',',#{userId},',')\n" + + "or concat(',',headofengineering,',') like concat(',',#{userId},',')\n" + + "or concat(',',generalmanager,',') like concat(',',#{userId},',')\n" + + "or concat(',',salesmarketingleader,',') like concat(',',#{userId},',')\n" + + "or concat(',',revenueleader,',') like concat(',',#{userId},',')\n" + + "or concat(',',financeleader,',') like concat(',',#{userId},',')\n" + + "or concat(',',fbleader,',') like concat(',',#{userId},',')\n" + + "or concat(',',hrleader,',') like concat(',',#{userId},',')) " + + "and holidex = #{hotelIndex}") + List> selectRoles(@ParamMapper("userId") int uid, @ParamMapper("hotelIndex") String hotelIndex); + + /** + *

查询部门信息

+ * + * @param departmentId 部门id + * @return 部门信息 + */ + @Select("select id,departmentname,departmentcode,departmentmark from hrmdepartment where id = #{departmentId}") + Map selectDepartmentInfo(String departmentId); + + /** + *

查询所有下级部门信息

+ * + * @param gCSupportCenterId 支持中心部门 + * @return 所有部门信息 + */ + @Select("select *\n" + + "from (\n" + + "WITH RECURSIVE subdepts AS (\n" + + "SELECT id, DEPARTMENTNAME, SUPDEPID\n" + + "FROM HrmDepartment\n" + + "WHERE id = #{gCSupportCenterId}\n" + + "UNION ALL\n" + + "SELECT\n" + + " d.id, \n" + + " d.DEPARTMENTNAME,\n" + + " d.SUPDEPID\n" + + "FROM HrmDepartment d\n" + + "JOIN subdepts sd ON d.SUPDEPID = sd.id)\n" + + " SELECT *\n" + + " FROM subdepts) temp;") + List> selectGCSupportCenterDep(String gCSupportCenterId); +} diff --git a/src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/service/UserInfoService.java b/src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/service/UserInfoService.java new file mode 100644 index 0000000..6f360fd --- /dev/null +++ b/src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/service/UserInfoService.java @@ -0,0 +1,153 @@ +package com.api.youhong.ai.ihgzhouji.userinfoel.service; + +import aiyh.utils.Util; +import aiyh.utils.excention.CustomerException; +import aiyh.utils.tool.cn.hutool.core.collection.CollectionUtil; +import aiyh.utils.tool.cn.hutool.core.util.StrUtil; +import com.api.youhong.ai.ihgzhouji.userinfoel.mapper.UserInfoMapper; +import com.api.youhong.ai.ihgzhouji.userinfoel.vo.UserInfoVo; +import weaver.hrm.User; + +import java.util.*; + +/** + * @author youhong.ai + */ +public class UserInfoService { + private final UserInfoMapper mapper = Util.getMapper(UserInfoMapper.class); + private final static Map ROLES_MAP = new HashMap<>(); + + + /** + *

获取用户信息

+ * + * @param user 当前登录用户 + * @return 用户信息 + */ + public UserInfoVo getUserInfo(User user) { + UserInfoVo userInfoVo = new UserInfoVo(); + String taskDispatchAuthority = Util.getCusConfigValue("TaskDispatchAuthority"); + String taskAcceptanceAuthority = Util.getCusConfigValue("TaskAcceptanceAuthority"); + String gCSupportCenterId = Util.getCusConfigValue("GCSupportCenterId"); + // 查询任务下发 + if (StrUtil.isNotBlank(taskDispatchAuthority)) { + Map map = this.mapper.selectAuthoritySql(taskDispatchAuthority, user); + if (CollectionUtil.isNotEmpty(map)) { + userInfoVo.setTaskDispatch(true); + } + } + // 查询任务清单 + if (StrUtil.isNotBlank(taskAcceptanceAuthority)) { + Map map = this.mapper.selectAuthoritySql(taskAcceptanceAuthority, user); + if (CollectionUtil.isNotEmpty(map)) { + userInfoVo.setTaskAcceptance(true); + } + } + + // 查询用户信息 + Map userInfo = this.mapper.selectHrmInfo(user.getUID()); + if (CollectionUtil.isNotEmpty(userInfo)) { + userInfoVo.setUserInfo(userInfo); + // 查询支持中心所有部门 + List> depList = mapper.selectGCSupportCenterDep(gCSupportCenterId); + Map department = findMapById(depList, user.getUserDepartment()); + String hotelIndex = null; + if (CollectionUtil.isEmpty(department)) { + // 不属于支持中心人,查询对应酒店信息 + String lastname = Util.null2String(userInfo.get("lastname")); + if (StrUtil.isBlank(lastname)) { + throw new CustomerException("获取酒店人员信息失败!未查询到人员姓名"); + } + + String[] split = lastname.split("-"); + if (split.length <= 1) { + throw new CustomerException("获取酒店人员信息失败!lastName中不存在酒店代码"); + } + hotelIndex = split[split.length - 1]; + Map hotelInfo = this.mapper.selectHotelInfo(hotelIndex); + userInfoVo.setHotelInfo(hotelInfo); + } else { + // 支持中心,显示部门信息 + userInfoVo.setDepartmentInfo(department); + } + // 如果存在酒店信息 + if (StrUtil.isNotBlank(hotelIndex)) { + List> hotelRoles = this.mapper.selectRoles(user.getUID(), hotelIndex); + if (CollectionUtil.isEmpty(hotelRoles)) { + return userInfoVo; + } + Set roleNames = new HashSet<>(); + // 循环酒店角色信息 + for (Map hotelRole : hotelRoles) { + // 循环酒店角色名称 + for (Map.Entry entry : ROLES_MAP.entrySet()) { + String key = entry.getKey(); + if (!hotelRole.containsKey(key)) { + continue; + } + String value = Util.null2String(hotelRole.get(key)); + // 如果在酒店名称中找到对应的人,则为角色名 + if (StrUtil.isBlank(value)) { + continue; + } + String[] split = value.split(","); + List strings = Arrays.asList(split); + if (strings.contains(Util.null2String(user.getUID()))) { + roleNames.add(entry.getValue()); + } + } + } + userInfoVo.setRoleNames(roleNames); + } + } + return userInfoVo; + } + + + /** + *

查找对应的部门

+ * + * @param dataList 部门列表 + * @param id 部门id + * @return 部门信息 + */ + public static Map findMapById(List> dataList, int id) { + for (Map map : dataList) { + if (map.containsKey("id") && Integer.parseInt(Util.null2String(map.get("id"))) == id) { + return map; + } + } + return null; + } + + /* + *

获取酒店角色信息

+ * + * @return 酒店角色信息 + */ + static { + ROLES_MAP.put("olt", "OLT"); + ROLES_MAP.put("vpo", "VPO"); + ROLES_MAP.put("subregionadmin", "Sub Region Admin"); + ROLES_MAP.put("opsconsultant", "Ops Consultant"); + ROLES_MAP.put("humanresources", "Human Resources"); + ROLES_MAP.put("commercialperformance", "Commercial Performance"); + ROLES_MAP.put("revenuemanagement", "Revenue Management"); + ROLES_MAP.put("financebusinesssupport", "Finance & Business Support"); + ROLES_MAP.put("rbeoperations", "RB&E Operations"); + ROLES_MAP.put("engineering", "Engineering"); + ROLES_MAP.put("headofopsconsultant", "Head of Ops Consultant"); + ROLES_MAP.put("headofhumanresources", "Head of Human Resources"); + ROLES_MAP.put("headofcommercialperformance", "Head of Commercial Performance"); + ROLES_MAP.put("headofrevenuemanagement", "Head of Revenue Management"); + ROLES_MAP.put("headoffinancebusinesssupport", "Head of Finance & Business Support"); + ROLES_MAP.put("headofrbeoperations", "Head of RB&E Operations"); + ROLES_MAP.put("headofengineering", "Head of Engineering"); + ROLES_MAP.put("generalmanager", "General Manager"); + ROLES_MAP.put("salesmarketingleader", "Sales & Marketing leader"); + ROLES_MAP.put("revenueleader", "Revenue Leader"); + ROLES_MAP.put("financeleader", "Finance Leader"); + ROLES_MAP.put("fbleader", "F&B Leader"); + ROLES_MAP.put("hrleader", "HR Leader"); + } +} diff --git a/src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/vo/UserInfoVo.java b/src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/vo/UserInfoVo.java new file mode 100644 index 0000000..73f67f2 --- /dev/null +++ b/src/main/java/com/api/youhong/ai/ihgzhouji/userinfoel/vo/UserInfoVo.java @@ -0,0 +1,40 @@ +package com.api.youhong.ai.ihgzhouji.userinfoel.vo; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.util.Map; +import java.util.Set; + +/** + *

用户信息

+ * + *

create: 2023/6/11 22:16

+ * + * @author youHong.ai + */ +@Getter +@Setter +@ToString +public class UserInfoVo { + + /** 任务下发权限 */ + private boolean taskDispatch; + + /** 任务接收权限 */ + private boolean taskAcceptance; + + /** 酒店信息 */ + Map hotelInfo; + + /** 用户信息 */ + Map userInfo; + + /** 角色 */ + Set roleNames; + + /** 部门信息 */ + Map departmentInfo; + +} diff --git a/src/main/java/com/api/youhong/ai/pcn/organization/orgchart/mapper/OrgChartMapper.java b/src/main/java/com/api/youhong/ai/pcn/organization/orgchart/mapper/OrgChartMapper.java index 0259a64..12da35f 100644 --- a/src/main/java/com/api/youhong/ai/pcn/organization/orgchart/mapper/OrgChartMapper.java +++ b/src/main/java/com/api/youhong/ai/pcn/organization/orgchart/mapper/OrgChartMapper.java @@ -42,15 +42,15 @@ public interface OrgChartMapper { " job.JOBTITLENAME job_title_name, " + " uftb.$t{parentField} type_of_employment " + "from hrmresource hrm " + - " left join hrmjobtitles job on hrm.JOBTITLE = job.id " + - " left join cus_fielddata cus on cus.ID = hrm.ID " + + " inner join hrmjobtitles job on hrm.JOBTITLE = job.id " + + " inner join cus_fielddata cus on cus.ID = hrm.ID " + " and cus.SCOPE = 'HrmCustomFieldByInfoType' " + " and cus.SCOPEID = 1 " + - " left join cus_fielddata cus1 on cus1.id = hrm.id" + + " inner join cus_fielddata cus1 on cus1.id = hrm.id" + " and cus1.scope = 'HrmCustomFieldByInfoType' " + " and cus1.scopeid = -1" + - " left join hrmdepartment dept on dept.id = hrm.DEPARTMENTID " + - " left join $t{typeOfEmploymentTable} uftb on uftb.$t{typeOfEmploymentIdField} = cus1.$t{typeOfEmploymentFiled} " + + " inner join hrmdepartment dept on dept.id = hrm.DEPARTMENTID " + + " inner join $t{typeOfEmploymentTable} uftb on uftb.$t{typeOfEmploymentIdField} = cus1.$t{typeOfEmploymentFiled} " + "where hrm.status in (0, 1)") List selectAll(@ParamMapper("typeOfEmploymentFiled") String typeOfEmploymentField, @ParamMapper("lastNameEnField") String lastNameEnField, diff --git a/src/main/java/com/api/youhong/ai/pcn/organization/orgchart/service/OrgChartService.java b/src/main/java/com/api/youhong/ai/pcn/organization/orgchart/service/OrgChartService.java index e4f79e7..b4606e3 100644 --- a/src/main/java/com/api/youhong/ai/pcn/organization/orgchart/service/OrgChartService.java +++ b/src/main/java/com/api/youhong/ai/pcn/organization/orgchart/service/OrgChartService.java @@ -47,6 +47,11 @@ public class OrgChartService { if (userId == 1) { return systemAdminTree(hrmResourceDtoList); } + /* ******************* 次账号处理逻辑 ******************* */ + String accountType = logInUser.getAccount_type(); + if ("1".equals(accountType)) { + return secondaryAccountTree(hrmResourceDtoList); + } filterCurrentSubCom(hrmResourceDtoList, currentUser, logInUser); /* ******************* 查询当前用户的是否全部展示或显示小红点的配置信息 ******************* */ ShowPointOrAll showPointOrAll = mapper.selectShowPointOrAll(userId); @@ -111,6 +116,7 @@ public class OrgChartService { if (userId == 1) { return systemAdminTree(hrmResourceDtoList); } + filterCurrentSubCom(hrmResourceDtoList, currentUser, logInUser); List orgChartNodeVoList = null; /* ******************* 转换dto为Vo并且设置根节点标识 ******************* */ @@ -145,6 +151,8 @@ public class OrgChartService { * @param logInUser 当前登陆用户 * @author youHong.ai ****************************************** */ + + private void filterCurrentSubCom(List hrmResourceDtoList, AtomicReference currentUser, User logInUser) { @@ -192,15 +200,49 @@ public class OrgChartService { .with(OrgChartNodeVo::setCurrent, true) .endSet()) .collect(Collectors.toList()); - return Util.listToTree(collect, OrgChartNodeVo::getId, OrgChartNodeVo::getManagerId, + List orgChartNodeVoList = Util.listToTree(collect, OrgChartNodeVo::getId, OrgChartNodeVo::getManagerId, OrgChartNodeVo::getChildren, OrgChartNodeVo::setChildren, parentId -> parentId == null || parentId <= 0) - .stream().peek(item -> Builder.startSet(item) - .with(OrgChartNodeVo::setIsRoot, true) - .with(OrgChartNodeVo::setCurrent, true) - .endSet()) - .peek(item -> recursionChildrenNums(item, 0)) - .collect(Collectors.toList()); + .stream().peek(item -> Builder.startSet(item) + .with(OrgChartNodeVo::setIsRoot, true) + .with(OrgChartNodeVo::setCurrent, true) + .endSet()) + .peek(item -> recursionChildrenNums(item, 0)) + .collect(Collectors.toList()); + sortByNameFirstLetter(orgChartNodeVoList); + return orgChartNodeVoList; + } + + /** + *

次账号返回数据数据

+ * 2023/06/13 17:15 + * ************************************************************ + * + * @param hrmResourceDtoList 人力资源dtolist + * @return List 树型list + * @author youHong.ai ****************************************** + */ + private List secondaryAccountTree(List hrmResourceDtoList) { + List collect = hrmResourceDtoList.stream() + .map(struct::hrmResourceDtoToVo) + .peek(item -> Builder.startSet(item) + .with(OrgChartNodeVo::setShow, 1) + .with(OrgChartNodeVo::setShowBrother, 1) + .with(OrgChartNodeVo::setShowChildren, 1) + .with(OrgChartNodeVo::setCurrent, true) + .endSet()) + .collect(Collectors.toList()); + List orgChartNodeVoList = Util.listToTree(collect, OrgChartNodeVo::getId, OrgChartNodeVo::getManagerId, + OrgChartNodeVo::getChildren, OrgChartNodeVo::setChildren, + parentId -> parentId == null || parentId <= 0) + .stream().peek(item -> Builder.startSet(item) + .with(OrgChartNodeVo::setIsRoot, true) + .with(OrgChartNodeVo::setCurrent, true) + .endSet()) + .peek(item -> recursionChildrenNums(item, 0)) + .collect(Collectors.toList()); + sortByNameFirstLetter(orgChartNodeVoList); + return orgChartNodeVoList; } /** diff --git a/src/main/java/com/customization/youhong/pcn/createrworkflow/CreateRequestException.java b/src/main/java/com/customization/youhong/pcn/createrworkflow/CreateRequestException.java new file mode 100644 index 0000000..0fbda38 --- /dev/null +++ b/src/main/java/com/customization/youhong/pcn/createrworkflow/CreateRequestException.java @@ -0,0 +1,77 @@ +package com.customization.youhong.pcn.createrworkflow; + +import aiyh.utils.Util; +import com.engine.workflow.constant.PAResponseCode; +import org.apache.log4j.Logger; + +/** + *

创建流程参数校验异常信息

+ * + *

create: 2023/6/14 15:22

+ * + * @author youHong.ai + */ +public class CreateRequestException extends RuntimeException { + private final Logger logger = Util.getLogger(); + private final String msg; + private Throwable throwable; + private Integer code = -1; + + private PAResponseCode responseCode; + + public CreateRequestException(Throwable throwable) { + super(throwable); + this.msg = throwable.getMessage(); + } + + public CreateRequestException(String msg) { + super(msg); + this.msg = msg; + } + + + public CreateRequestException(String msg, PAResponseCode responseCode) { + super(msg); + this.msg = msg; + this.responseCode = responseCode; + } + + public CreateRequestException(String msg, String... obj) { + super(Util.logStr(msg, obj)); + this.msg = Util.logStr(msg, obj); + } + + public CreateRequestException(String msg, Integer code) { + super(msg); + this.code = code; + this.msg = msg; + } + + public CreateRequestException(String msg, Integer code, Throwable throwable) { + super(msg, throwable); + this.code = code; + this.msg = msg; + } + + public CreateRequestException(String msg, Throwable throwable) { + super(msg, throwable); + this.msg = msg; + this.throwable = throwable; + } + + public String getMsg() { + return msg; + } + + public Integer getCode() { + return code; + } + + public PAResponseCode getResponseCode() { + return responseCode; + } + + public String getMessage() { + return this.msg; + } +} diff --git a/src/main/java/com/customization/youhong/pcn/createrworkflow/impl/CheckWorkflowRequestParamsImpl.java b/src/main/java/com/customization/youhong/pcn/createrworkflow/impl/CheckWorkflowRequestParamsImpl.java new file mode 100644 index 0000000..d1012aa --- /dev/null +++ b/src/main/java/com/customization/youhong/pcn/createrworkflow/impl/CheckWorkflowRequestParamsImpl.java @@ -0,0 +1,126 @@ +package com.customization.youhong.pcn.createrworkflow.impl; + +import aiyh.utils.Util; +import com.customization.youhong.pcn.createrworkflow.CreateRequestException; +import com.customization.youhong.pcn.createrworkflow.mapper.CheckWorkflowRequestParamsMapper; +import com.customization.youhong.pcn.createrworkflow.util.CheckWorkflowRequestParamsUtil; +import com.engine.core.cfg.annotation.ServiceDynamicProxy; +import com.engine.core.cfg.annotation.ServiceMethodDynamicProxy; +import com.engine.core.impl.aop.AbstractServiceProxy; +import com.engine.workflow.constant.PAResponseCode; +import com.engine.workflow.entity.publicApi.PAResponseEntity; +import com.engine.workflow.entity.publicApi.ReqOperateRequestEntity; +import com.engine.workflow.publicApi.WorkflowRequestOperatePA; +import com.engine.workflow.publicApi.impl.WorkflowRequestOperatePAImpl; +import org.apache.log4j.Logger; +import weaver.hrm.User; + +import java.util.HashMap; +import java.util.Map; + +/** + *

检查流程创建流程参数

+ * + *

create: 2023/6/14 14:14

+ * + * @author youHong.ai + */ + +@ServiceDynamicProxy(target = WorkflowRequestOperatePAImpl.class, desc = "公共接口创建流程对流程参数校验") +public class CheckWorkflowRequestParamsImpl extends AbstractServiceProxy implements WorkflowRequestOperatePA { + + private final Logger log = Util.getLogger("workflow"); + + private final CheckWorkflowRequestParamsMapper mapper = Util.getMapper(CheckWorkflowRequestParamsMapper.class); + + private final CheckWorkflowRequestParamsUtil checkUtil = new CheckWorkflowRequestParamsUtil(); + + @Override + @ServiceMethodDynamicProxy(desc = "子流程触发时,做流程转数据") + public PAResponseEntity doCreateRequest(User user, ReqOperateRequestEntity requestParam) { + try { + try { + checkUtil.checkRequestParam(user, requestParam); + return (PAResponseEntity) executeMethod(user, requestParam); + } catch (CreateRequestException e) { + PAResponseEntity paResponseEntity = new PAResponseEntity(); + paResponseEntity.setCode(e.getResponseCode()); + Map errorMsg = new HashMap<>(8); + errorMsg.put("msg", e.getMsg()); + paResponseEntity.setErrMsg(errorMsg); + return paResponseEntity; + } catch (Exception e) { + log.error("自定义流程创建校验请求参数出错:" + Util.getErrString(e)); + PAResponseEntity paResponseEntity = new PAResponseEntity(); + paResponseEntity.setCode(PAResponseCode.SYSTEM_INNER_ERROR); + Map errorMsg = new HashMap<>(8); + errorMsg.put("msg", "system error!"); + paResponseEntity.setErrMsg(errorMsg); + return paResponseEntity; + } + } catch (Exception e) { + log.error("自定义流程创建校验请求参数出错:" + Util.getErrString(e)); + return (PAResponseEntity) executeMethod(user, requestParam); + } + } + + @Override + public PAResponseEntity withdrawRequest(User user, ReqOperateRequestEntity requestParam) { + return null; + } + + @Override + public PAResponseEntity submitRequest(User user, ReqOperateRequestEntity requestParam) { + return null; + } + + @Override + public PAResponseEntity forwardRequest(User user, ReqOperateRequestEntity requestParam) { + return null; + } + + @Override + public PAResponseEntity rejectRequest(User user, ReqOperateRequestEntity requestParam) { + return null; + } + + @Override + public PAResponseEntity doForceDrawBack(User user, ReqOperateRequestEntity requestParam) { + return null; + } + + @Override + public PAResponseEntity doForceOver(User user, ReqOperateRequestEntity requestParam) { + return null; + } + + @Override + public PAResponseEntity deleteRequest(User user, ReqOperateRequestEntity requestParam) { + return null; + } + + @Override + public PAResponseEntity saveRequestLog(User user, ReqOperateRequestEntity requestParam) { + return null; + } + + @Override + public PAResponseEntity doIntervenor(User user, ReqOperateRequestEntity requestParam) { + return null; + } + + @Override + public PAResponseEntity getNodeOperator(User user, ReqOperateRequestEntity requestParam) { + return null; + } + + @Override + public PAResponseEntity getNodeMenu(User user, ReqOperateRequestEntity requestParam) { + return null; + } + + @Override + public PAResponseEntity getCanRejectNodes(User user, ReqOperateRequestEntity request2Entity) { + return null; + } +} diff --git a/src/main/java/com/customization/youhong/pcn/createrworkflow/mapper/CheckWorkflowRequestParamsMapper.java b/src/main/java/com/customization/youhong/pcn/createrworkflow/mapper/CheckWorkflowRequestParamsMapper.java new file mode 100644 index 0000000..f13c335 --- /dev/null +++ b/src/main/java/com/customization/youhong/pcn/createrworkflow/mapper/CheckWorkflowRequestParamsMapper.java @@ -0,0 +1,61 @@ +package com.customization.youhong.pcn.createrworkflow.mapper; + +import aiyh.utils.annotation.recordset.*; +import com.customization.youhong.pcn.createrworkflow.pojo.CheckConditionItem; +import com.customization.youhong.pcn.createrworkflow.pojo.CheckCreateConfig; +import com.customization.youhong.pcn.createrworkflow.pojo.CheckCreateConfigDetail; +import weaver.hrm.User; + +import java.util.List; +import java.util.Map; + +/** + *

mapper

+ * + *

create: 2023/6/14 14:20

+ * + * @author youHong.ai + */ +@SqlMapper +public interface CheckWorkflowRequestParamsMapper { + + + @Select("select * from table where workflow_type = #{workflowId}") + @CollectionMappings({ + @CollectionMapping( + property = "detailList", + column = "id", + id = @Id(value = String.class, methodId = 1) + ), + @CollectionMapping( + property = "conditionGroupItems", + column = "id", + id = @Id(value = String.class, methodId = 2) + ), + }) + CheckCreateConfig selectCheckConfig(int workflowId); + + + @Select("select * from table_dt1 where mainid = #{mainId}") + @Associations({ + @Association( + property = "workflowField", + column = "workflow_field", + select = "aiyh.utils.mapper.UtilMapper.selectFieldInfo", + id = @Id(Integer.class) + ) + }) + @CollectionMethod(value = 1, desc = "查询明细表1,参数校验配置") + List selectCheckDetail(String mainId); + + + @Select("select * from table_dt2 where mainid = #{mainId}") + @CollectionMethod(value = 2, desc = "查询明细表2,条件配置参数") + List selectConditionDetail(String mainId); + + + @Select(custom = true) + Map selectCustomerSql(@SqlString String sql, + @ParamMapper("value") String value, + @ParamMapper("user") User user); +} diff --git a/src/main/java/com/customization/youhong/pcn/createrworkflow/pojo/CheckConditionItem.java b/src/main/java/com/customization/youhong/pcn/createrworkflow/pojo/CheckConditionItem.java new file mode 100644 index 0000000..3caea4e --- /dev/null +++ b/src/main/java/com/customization/youhong/pcn/createrworkflow/pojo/CheckConditionItem.java @@ -0,0 +1,30 @@ +package com.customization.youhong.pcn.createrworkflow.pojo; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + *

+ * + *

create: 2023/6/14 17:52

+ * + * @author youHong.ai + */ +@Getter +@Setter +@ToString +public class CheckConditionItem { + + /** id */ + private Integer id; + + /** 条件名称 */ + private String conditionName; + + /** 条件规则 */ + private Integer conditionRule; + + /** 条件自定义 */ + private String customerValue; +} diff --git a/src/main/java/com/customization/youhong/pcn/createrworkflow/pojo/CheckCreateConfig.java b/src/main/java/com/customization/youhong/pcn/createrworkflow/pojo/CheckCreateConfig.java new file mode 100644 index 0000000..2763cc5 --- /dev/null +++ b/src/main/java/com/customization/youhong/pcn/createrworkflow/pojo/CheckCreateConfig.java @@ -0,0 +1,31 @@ +package com.customization.youhong.pcn.createrworkflow.pojo; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.util.List; + +/** + *

检查流程请求参数校验配置信息

+ * + *

create: 2023/6/14 17:21

+ * + * @author youHong.ai + */ +@Getter +@Setter +@ToString +public class CheckCreateConfig { + /** 流程id */ + private Integer workflowId; + + /** 描述 */ + private String desc; + + /** 检查配置明细 */ + private List detailList; + + /** 条件分组配置 */ + private List conditionGroupItems; +} diff --git a/src/main/java/com/customization/youhong/pcn/createrworkflow/pojo/CheckCreateConfigDetail.java b/src/main/java/com/customization/youhong/pcn/createrworkflow/pojo/CheckCreateConfigDetail.java new file mode 100644 index 0000000..01f38a7 --- /dev/null +++ b/src/main/java/com/customization/youhong/pcn/createrworkflow/pojo/CheckCreateConfigDetail.java @@ -0,0 +1,37 @@ +package com.customization.youhong.pcn.createrworkflow.pojo; + +import aiyh.utils.entity.FieldViewInfo; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + *

+ * + *

create: 2023/6/14 17:24

+ * + * @author youHong.ai + */ +@Getter +@Setter +@ToString +public class CheckCreateConfigDetail { + + /** id */ + private Integer id; + + /** 流程字段 */ + private FieldViewInfo workflowField; + + /** 是否允许为null */ + private String allowNull; + + /** 校验规则 */ + private String checkRule; + + /** 自定义值 */ + private String customerValue; + + /** 校验表达式 */ + private String checkExpression; +} diff --git a/src/main/java/com/customization/youhong/pcn/createrworkflow/util/CheckRuleMethodUtil.java b/src/main/java/com/customization/youhong/pcn/createrworkflow/util/CheckRuleMethodUtil.java new file mode 100644 index 0000000..dc65634 --- /dev/null +++ b/src/main/java/com/customization/youhong/pcn/createrworkflow/util/CheckRuleMethodUtil.java @@ -0,0 +1,139 @@ +package com.customization.youhong.pcn.createrworkflow.util; + +import aiyh.utils.ScriptUtil; +import aiyh.utils.Util; +import aiyh.utils.annotation.MethodRuleNo; +import aiyh.utils.function.Bi4Function; +import aiyh.utils.tool.cn.hutool.core.collection.CollectionUtil; +import aiyh.utils.tool.cn.hutool.core.util.StrUtil; +import com.customization.youhong.pcn.createrworkflow.mapper.CheckWorkflowRequestParamsMapper; +import com.customization.youhong.pcn.createrworkflow.pojo.CheckConditionItem; +import com.customization.youhong.pcn.createrworkflow.pojo.CheckCreateConfigDetail; +import org.apache.log4j.Logger; +import weaver.hrm.User; +import weaver.workflow.webservices.WorkflowRequestTableField; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + *

检查方法校验工具

+ * + *

create: 2023/6/14 18:30

+ * + * @author youHong.ai + */ +public class CheckRuleMethodUtil { + + private static final Logger log = Util.getLogger(); + + private static final CheckWorkflowRequestParamsMapper MAPPER = Util.getMapper(CheckWorkflowRequestParamsMapper.class); + public static final Map + > CHECK_RULE_MAP = new HashMap<>(8); + + static { + try { + Class checkRuleMethodUtilClass = CheckRuleMethodUtil.class; + Method[] methods = checkRuleMethodUtilClass.getDeclaredMethods(); + for (Method method : methods) { + + if (method.isAnnotationPresent(MethodRuleNo.class)) { + MethodRuleNo annotation = method.getAnnotation(MethodRuleNo.class); + int value = annotation.value(); + CHECK_RULE_MAP.put(value, (workflowRequestTableField, checkCreateConfigDetail, checkConditionItem, user) -> { + try { + return (Boolean) method.invoke(null, workflowRequestTableField, checkCreateConfigDetail, checkConditionItem, user); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + }); + } + } + } catch (Exception e) { + log.error("初始化CheckRuleMethodUtil失败!" + Util.getErrString(e)); + } + + } + + @MethodRuleNo(value = 0, desc = "不为null") + public static boolean noNull(WorkflowRequestTableField workflowRequestTableField, + CheckCreateConfigDetail checkCreateConfigDetail, + CheckConditionItem checkConditionItem, User user) { + return StrUtil.isNotBlank(workflowRequestTableField.getFieldValue()); + } + + @MethodRuleNo(value = 1, desc = "整数类型") + public static boolean isNumber(WorkflowRequestTableField workflowRequestTableField, + CheckCreateConfigDetail checkCreateConfigDetail, + CheckConditionItem checkConditionItem, User user) { + try { + Integer.parseInt(workflowRequestTableField.getFieldValue()); + return true; + } catch (Exception e) { + return false; + } + } + + @MethodRuleNo(value = 2, desc = "小数类型") + public static boolean isDouble(WorkflowRequestTableField workflowRequestTableField, + CheckCreateConfigDetail checkCreateConfigDetail, + CheckConditionItem checkConditionItem, User user) { + try { + Double.parseDouble(workflowRequestTableField.getFieldValue()); + return true; + } catch (Exception e) { + return false; + } + } + + @MethodRuleNo(value = 3, desc = "枚举值") + public static boolean isEnumerate(WorkflowRequestTableField workflowRequestTableField, + CheckCreateConfigDetail checkCreateConfigDetail, + CheckConditionItem checkConditionItem, User user) { + String fieldValue = workflowRequestTableField.getFieldValue(); + String customerValue = checkCreateConfigDetail.getCustomerValue(); + if (StrUtil.isNotBlank(customerValue)) { + String[] split = customerValue.split(","); + return Arrays.asList(split).contains(fieldValue); + } + return false; + } + + @MethodRuleNo(value = 4, desc = "自定义sql存在值") + public static boolean customerSqlHasValue(WorkflowRequestTableField workflowRequestTableField, + CheckCreateConfigDetail checkCreateConfigDetail, + CheckConditionItem checkConditionItem, User user) { + String fieldValue = workflowRequestTableField.getFieldValue(); + String customerValue = checkCreateConfigDetail.getCustomerValue(); + Map map = MAPPER.selectCustomerSql(customerValue, fieldValue, user); + return CollectionUtil.isNotEmpty(map); + } + + @MethodRuleNo(value = 5, desc = "自定义sql校验表达式") + public static boolean customerSqlCheck(WorkflowRequestTableField workflowRequestTableField, + CheckCreateConfigDetail checkCreateConfigDetail, + CheckConditionItem checkConditionItem, User user) { + String fieldValue = workflowRequestTableField.getFieldValue(); + String customerValue = checkCreateConfigDetail.getCustomerValue(); + Map map = MAPPER.selectCustomerSql(customerValue, fieldValue, user); + if (CollectionUtil.isNotEmpty(map)) { + String checkExpression = checkCreateConfigDetail.getCheckExpression(); + if (StrUtil.isNotBlank(checkExpression)) { + return (Boolean) ScriptUtil.invokeScript(checkExpression, map); + } + } + return false; + } + + +} diff --git a/src/main/java/com/customization/youhong/pcn/createrworkflow/util/CheckWorkflowRequestParamsUtil.java b/src/main/java/com/customization/youhong/pcn/createrworkflow/util/CheckWorkflowRequestParamsUtil.java new file mode 100644 index 0000000..e4eeca4 --- /dev/null +++ b/src/main/java/com/customization/youhong/pcn/createrworkflow/util/CheckWorkflowRequestParamsUtil.java @@ -0,0 +1,84 @@ +package com.customization.youhong.pcn.createrworkflow.util; + +import aiyh.utils.Util; +import aiyh.utils.tool.cn.hutool.core.collection.CollectionUtil; +import com.customization.youhong.pcn.createrworkflow.CreateRequestException; +import com.customization.youhong.pcn.createrworkflow.mapper.CheckWorkflowRequestParamsMapper; +import com.customization.youhong.pcn.createrworkflow.pojo.CheckConditionItem; +import com.customization.youhong.pcn.createrworkflow.pojo.CheckCreateConfig; +import com.customization.youhong.pcn.createrworkflow.pojo.CheckCreateConfigDetail; +import com.engine.workflow.entity.publicApi.ReqOperateRequestEntity; +import weaver.hrm.User; +import weaver.workflow.webservices.WorkflowRequestTableField; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + *

工具

+ * + *

create: 2023/6/14 14:20

+ * + * @author youHong.ai + */ +public class CheckWorkflowRequestParamsUtil { + + private final CheckWorkflowRequestParamsMapper mapper = Util.getMapper(CheckWorkflowRequestParamsMapper.class); + + + /** + * ************************************************************ + *

checkRequestParam 自定义参数校验

+ * 2023/6/14 15:31 + * + * @param user: 当前用户 + * @param requestParam: 请求参数 + * @author youHong.ai + * ************************************************************ + */ + public void checkRequestParam(User user, ReqOperateRequestEntity requestParam) throws CreateRequestException { + int workflowId = requestParam.getWorkflowId(); + CheckCreateConfig checkCreateConfig = mapper.selectCheckConfig(workflowId); + if (Objects.isNull(checkCreateConfig)) { + return; + } + List detailList = checkCreateConfig.getDetailList(); + if (CollectionUtil.isEmpty(detailList)) { + return; + } + Map checkConditionItemMap; + List conditionGroupItems = checkCreateConfig.getConditionGroupItems(); + if (CollectionUtil.isNotEmpty(conditionGroupItems)) { + checkConditionItemMap = + conditionGroupItems.stream() + .collect( + Collectors.toMap( + CheckConditionItem::getConditionName, + value -> value + )); + } else { + checkConditionItemMap = new HashMap<>(8); + } + Map checkDetailMap = + detailList.stream() + .collect( + Collectors.toMap( + item -> item.getWorkflowField().getFieldName(), + value -> value + ) + ); + checkMainData(checkDetailMap, checkConditionItemMap, requestParam); + } + + private void checkMainData(Map checkDetailMap, + Map checkConditionItemMap, + ReqOperateRequestEntity requestParam) { + List mainData = requestParam.getMainData(); + for (WorkflowRequestTableField mainDatum : mainData) { + String fieldName = mainDatum.getFieldName(); + } + } +} diff --git a/src/test/java/youhong/ai/taibao/TestTaiBao.java b/src/test/java/youhong/ai/taibao/TestTaiBao.java index d159dfc..5982a67 100644 --- a/src/test/java/youhong/ai/taibao/TestTaiBao.java +++ b/src/test/java/youhong/ai/taibao/TestTaiBao.java @@ -4,6 +4,7 @@ import aiyh.utils.Util; import basetest.BaseTest; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; +import com.api.doc.detail.util.DocDownloadCheckUtil; import com.api.youhong.ai.taibao.fcuntionlist.service.FunctionListService; import com.api.youhong.ai.taibao.qikan.service.PeriodicalService; import com.cloudstore.dev.api.util.Util_DataCache; @@ -193,4 +194,10 @@ public class TestTaiBao extends BaseTest { System.out.println(JSON.toJSONString(subRequestEntities)); } + + + @Test + public void testjlsdfj() { + System.out.println(DocDownloadCheckUtil.DncodeFileid("a1c0c56773deeff8d8f7f235f3eb3db0d2b34cbedb9ff32262414a3c6c4b9a393fc01656cc42ddaf07cd9319d68901a734f710fbddd167603")); + } } diff --git a/src/test/java/youhong/ai/utiltest/TestApi.java b/src/test/java/youhong/ai/utiltest/TestApi.java new file mode 100644 index 0000000..fb9d2ef --- /dev/null +++ b/src/test/java/youhong/ai/utiltest/TestApi.java @@ -0,0 +1,153 @@ +package youhong.ai.utiltest; + +import aiyh.utils.httpUtil.ResponeVo; +import aiyh.utils.httpUtil.util.HttpUtils; +import basetest.BaseTest; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import org.junit.Test; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + *

测试调用api

+ * + *

create: 2023/6/13 20:04

+ * + * @author youHong.ai + */ +public class TestApi extends BaseTest { + + Map SYSTEM_CACHE = new HashMap<>(); + + String APPID = "c6d2b3f5-5c1c-4b90-bad7-4a9b3b2c4bca"; + + @Test + public void testApi() { + String api = "https://ecology.yeyaguitu.cn/api/aiyh/test/req-msg/test/cus-api"; + String token = (String) testGetoken("https://ecology.yeyaguitu.cn").get("token"); + String spk = SYSTEM_CACHE.get("SERVER_PUBLIC_KEY"); + // 封装请求头参数 + RSA rsa = new RSA(null, spk); + // 对用户信息进行加密传输,暂仅支持传输OA用户ID + String encryptUserid = rsa.encryptBase64("1", CharsetUtil.CHARSET_UTF_8, KeyType.PublicKey); + Map head = new HashMap<>(); + head.put("appid", APPID); + head.put("token", token); + head.put("userid", encryptUserid); + HttpUtils httpUtils = new HttpUtils(); + ResponeVo responeVo = null; + try { + responeVo = httpUtils.apiGet(api, head); + } catch (IOException e) { + throw new RuntimeException(e); + } + System.out.println(JSON.toJSONString(responeVo)); + } + + /** + * 第一步: + *

+ * 调用ecology注册接口,根据appid进行注册,将返回服务端公钥和Secret信息 + */ + public Map testRegist(String address) { + // 获取当前系统RSA加密的公钥 + RSA rsa = new RSA(); + String publicKey = rsa.getPublicKeyBase64(); + String privateKey = rsa.getPrivateKeyBase64(); + // 客户端RSA私钥 + SYSTEM_CACHE.put("LOCAL_PRIVATE_KEY", privateKey); + // 客户端RSA公钥 + SYSTEM_CACHE.put("LOCAL_PUBLIC_KEY", publicKey); + // 调用ECOLOGY系统接口进行注册 + String data = HttpRequest.post(address + "/api/ec/dev/auth/regist") + .header("appid", APPID) + .header("cpk", publicKey) + .timeout(2000) + .execute().body(); + // 打印ECOLOGY响应信息 + System.out.println("testRegist():" + data); + Map datas = JSONUtil.parseObj(data); + // ECOLOGY返回的系统公钥 + SYSTEM_CACHE.put("SERVER_PUBLIC_KEY", StrUtil.nullToEmpty((String) datas.get("spk"))); + // ECOLOGY返回的系统密钥 + SYSTEM_CACHE.put("SERVER_SECRET", StrUtil.nullToEmpty((String) datas.get("secrit"))); + return datas; + } + + /** + * 第二步: + *

+ * 通过第一步中注册系统返回信息进行获取token信息 + */ + public Map testGetoken(String address) { + // 从系统缓存或者数据库中获取ECOLOGY系统公钥和Secret信息 + String secret = SYSTEM_CACHE.get("SERVER_SECRET"); + String spk = SYSTEM_CACHE.get("SERVER_PUBLIC_KEY"); + // 如果为空,说明还未进行注册,调用注册接口进行注册认证与数据更新 + if (Objects.isNull(secret) || Objects.isNull(spk)) { + testRegist(address); + // 重新获取最新ECOLOGY系统公钥和Secret信息 + secret = SYSTEM_CACHE.get("SERVER_SECRET"); + spk = SYSTEM_CACHE.get("SERVER_PUBLIC_KEY"); + } + // 公钥加密,所以RSA对象私钥为null + RSA rsa = new RSA(null, spk); + // 对秘钥进行加密传输,防止篡改数据 + String encryptSecret = rsa.encryptBase64(secret, CharsetUtil.CHARSET_UTF_8, KeyType.PublicKey); + // 调用ECOLOGY系统接口进行注册 + String data = HttpRequest.post(address + "/api/ec/dev/auth/applytoken") + .header("appid", APPID) + .header("secret", encryptSecret) + .header("time", "3600") + .execute().body(); + System.out.println("testGetoken():" + data); + Map datas = JSONUtil.parseObj(data); + // ECOLOGY返回的token + // TODO 为Token缓存设置过期时间 + SYSTEM_CACHE.put("SERVER_TOKEN", StrUtil.nullToEmpty((String) datas.get("token"))); + return datas; + } + + /** + * 第三步: + *

+ * 调用ecology系统的rest接口,请求头部带上token和用户标识认证信息 + * + * @param address ecology系统地址 + * @param api rest api 接口地址(该测试代码仅支持GET请求) + * @param jsonParams 请求参数json串 + *

+ * 注意:ECOLOGY系统所有POST接口调用请求头请设置 "Content-Type","application/x-www-form-urlencoded; charset=utf-8" + */ + public String testRestful(String address, String api, String jsonParams) { + // ECOLOGY返回的token + String token = SYSTEM_CACHE.get("SERVER_TOKEN"); + if (StrUtil.isEmpty(token)) { + token = (String) testGetoken(address).get("token"); + } + String spk = SYSTEM_CACHE.get("SERVER_PUBLIC_KEY"); + // 封装请求头参数 + RSA rsa = new RSA(null, spk); + // 对用户信息进行加密传输,暂仅支持传输OA用户ID + String encryptUserid = rsa.encryptBase64("1", CharsetUtil.CHARSET_UTF_8, KeyType.PublicKey); + // 调用ECOLOGY系统接口,注意此处的disableCookie,可翻阅hutool的文档查看 + String data = HttpRequest + .get(address + api) + .header("appid", APPID) + .header("token", token) + .header("userid", encryptUserid) + .body(jsonParams) + .execute().body(); + System.out.println("testRestful():" + data); + return data; + } +}