From f7415fe02366cbfb34bd327861cd6938047fdb73 Mon Sep 17 00:00:00 2001 From: "yunhao.wang" Date: Sun, 13 Jan 2019 15:48:43 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=9A=E7=94=A8=E5=AF=BC=E5=87=BA=20?= =?UTF-8?q?=E5=8D=95=E5=8F=B7=E8=A7=84=E5=88=99=E5=AF=BC=E5=85=A5=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=20=E7=B3=BB=E7=BB=9F=E5=8F=82=E6=95=B0=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/api/iservice/busi/ISysConfigService.java | 8 + .../api/iservice/busi/ISysDictionaryService.java | 9 + .../controller/busi/SysConfigController.java | 15 ++ .../controller/busi/SysEnumController.java | 14 ++ .../controller/busi/SysOrderNoRuleController.java | 10 +- .../apiservice/mq/MessageLetterQueueReceiver.java | 7 +- .../serviceimpl/busi/SysConfigService.java | 6 + .../serviceimpl/busi/SysDictionaryService.java | 7 + .../i3plus/core/apiservice/util/ExcelUtil.java | 200 +++++++++------------ .../apiservice/websocket/MessageWebSocket.java | 12 +- .../src/main/resources/application-dev.properties | 2 +- .../src/main/resources/init/sys-config.xlsx | Bin 33811 -> 37800 bytes 12 files changed, 159 insertions(+), 131 deletions(-) diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysConfigService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysConfigService.java index 581b816..9bc45ea 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysConfigService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysConfigService.java @@ -83,4 +83,12 @@ public interface ISysConfigService { @ApiOperation(value = "根据系统配置代码修改配置项") void updateSysConfigByCode(String code,String value); + /** + * 根据系统参数组来查找系统参数 + * @param group + * @return + */ + @ApiOperation(value = "根据系统参数组来查找系统参数") + List findSysConfigByGroup(Integer group); + } diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysDictionaryService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysDictionaryService.java index 85ce4c6..9f1d1fa 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysDictionaryService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysDictionaryService.java @@ -112,4 +112,13 @@ public interface ISysDictionaryService { */ @ApiOperation(value = "根据父节点 以及当前节点值 获取字典信息") SysDictionary getSysDictionaryByParentCodeAndValue(String parentCode,String value); + + /** + * 根据父节点 以及当前节点名称 获取字典信息 + * @param parentCode 父级代码 + * @param name 字典值 + * @return + */ + @ApiOperation(value = "根据父节点 以及当前节点名称 获取字典信息") + SysDictionary getSysDictionaryByParentCodeAndName(String parentCode,String name); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java index 030cac2..63c6147 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java @@ -43,6 +43,7 @@ public class SysConfigController extends CoreBaseController { @Autowired private ISysConfigService sysConfigService; + @Autowired private MailUtil mailUtil; @@ -248,4 +249,18 @@ public class SysConfigController extends CoreBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + + @GetMapping("/find-group/{group}") + @ApiOperation(value = "根据参数组查询系统参数") + public ResultBean findSysConfigByGroup(@PathVariable("group") Integer group){ + try { + ValidatorBean.checkNotNull(group,"参数组不能为空"); + List sysConfigList = sysConfigService.findSysConfigByGroup(group); + return ResultBean.success("查询成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(sysConfigList); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysEnumController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysEnumController.java index 02845e8..3bbcbf4 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysEnumController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysEnumController.java @@ -161,4 +161,18 @@ public class SysEnumController extends CoreBaseController{ return new ResultBean(true, "操作成功", Arrays.asList(ImppEnumUtil.SYS_VALUE_TYPE.values())); } + + @GetMapping("/sys-math-symbol") + @ApiOperation(value = "数学表达式", notes = "数学表达式") + public ResultBean getSysMathSymbol(){ + return new ResultBean(true, "操作成功", + Arrays.asList(CommonEnumUtil.MATH_SYMBOL.values())); + } + + @GetMapping("/sys-config-group") + @ApiOperation(value = "系统配置组", notes = "系统配置组") + public ResultBean getSysConfigGroup(){ + return new ResultBean(true, "操作成功", + Arrays.asList(ImppEnumUtil.SYS_CONFIG_GROUP.values())); + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java index dee27de..37e86cd 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java @@ -290,15 +290,7 @@ public class SysOrderNoRuleController extends CoreBaseController { public ResultBean importSysOrderNoRule(@RequestParam("file") MultipartFile file){ try { List sysOrderNoRuleList = ExcelUtil.importData(file.getOriginalFilename(),file.getInputStream(),SysOrderNoRule.class); - for (SysOrderNoRule item : sysOrderNoRuleList) { - //校验及初始化数据 - validatorSysOrderNoRule(item); - item.setOrderNoRuleStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); - item.setSerialNo(CommonEnumUtil.PARENT.DEFAULT.getValue()); - - sysOrderNoRuleService.insertSysOrderNoRule(item); - } - + sysOrderNoRuleService.insertSysOrderNoRuleList(sysOrderNoRuleList); return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageLetterQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageLetterQueueReceiver.java index 147bd22..693bd0f 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageLetterQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageLetterQueueReceiver.java @@ -9,7 +9,7 @@ import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SysMessage; import cn.estsh.i3plus.pojo.platform.bean.SysRefUserMessage; import cn.estsh.i3plus.pojo.platform.bean.SysUser; -import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.databind.ObjectMapper; import com.rabbitmq.client.Channel; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -58,7 +58,8 @@ public class MessageLetterQueueReceiver { SysRefUserMessage refUserMessage; SysUser sysUser; - List userMessage; + List userMessage; + ObjectMapper mapper = new ObjectMapper(); for (int i = 0; i < messageReceiver.length; i++) { sysUser = sysUserService.getSysUserById(Long.parseLong(messageReceiver[i])); @@ -80,7 +81,7 @@ public class MessageLetterQueueReceiver { userMessage = sysMessageService.findSysRefUserMessageByUserIdAndStatus(sysUser.getId(), ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); MessageWebSocket.sendMessage(sysUser.getUserInfoId(), - JSON.toJSONString(userMessage) + mapper.writeValueAsString(userMessage) ); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysConfigService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysConfigService.java index 745b9cf..b33b313 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysConfigService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysConfigService.java @@ -105,4 +105,10 @@ public class SysConfigService implements ISysConfigService { SysConfigRDao.updateByProperties("configCode",value,"configValue",value); } + @Override + @ApiOperation(value = "根据系统参数组来查找系统参数") + public List findSysConfigByGroup(Integer group) { + return SysConfigRDao.findByProperty("configGroup",group); + } + } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java index ad4ea82..3039946 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysDictionaryService.java @@ -192,4 +192,11 @@ public class SysDictionaryService implements ISysDictionaryService { return sysDictionaryRDao.getByProperty(new String[]{"parentCodeRdd","dictionaryValue"}, new Object[]{parentCode,value}); } + + @Override + @ApiOperation(value = "根据父节点 以及当前节点名称 获取字典信息") + public SysDictionary getSysDictionaryByParentCodeAndName(String parentCode, String name) { + return sysDictionaryRDao.getByProperty(new String[]{"parentCodeRdd","name"}, + new Object[]{parentCode,name}); + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ExcelUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ExcelUtil.java index fcb58fc..fb410d1 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ExcelUtil.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/ExcelUtil.java @@ -20,10 +20,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -80,7 +77,6 @@ public class ExcelUtil { this.rabbitTemplate = rabbitTemplate; } - /** * 导出 * @@ -130,13 +126,13 @@ public class ExcelUtil { HSSFRow hssfRow; Method method; AnnoOutputColumn outputColumn; - Object CellValue; + Object cellValue; for (int i = 0; i < data.size(); i++) { hssfRow = sheet.createRow(i + 1); for (int j = 0; j < fields.length; j++) { fields[j].setAccessible(true); - CellValue = fields[j].get(data.get(i)); + cellValue = fields[j].get(data.get(i)); // 判断是否存在引用关系 if (fields[j].isAnnotationPresent(AnnoOutputColumn.class)) { @@ -148,19 +144,19 @@ public class ExcelUtil { outputColumn.refForeignKey() + "Of" + StringTool.toUpperCaseFirstOne(outputColumn.value()), outputColumn.refClass().getDeclaredMethod("get" + StringTool.toUpperCaseFirstOne(outputColumn.refForeignKey())).getReturnType()); - CellValue = method.invoke(data.get(i), CellValue); - }else if(outputColumn.refClass().equals(SysDictionary.class) && CellValue != null){ - CellValue = sysDictionaryService.getSysDictionaryByParentCodeAndValue(outputColumn.refForeignKey(), String.valueOf(CellValue)).getName(); + cellValue = method.invoke(data.get(i), cellValue); + }else if(outputColumn.refClass().equals(SysDictionary.class) && cellValue != null){ + cellValue = sysDictionaryService.getSysDictionaryByParentCodeAndValue(outputColumn.refForeignKey(), String.valueOf(cellValue)).getName(); } else if(!outputColumn.refClass().equals(Object.class) && !outputColumn.refClass().equals(SysDictionary.class)){ - CellValue = selectByProperty(outputColumn.refClass(), outputColumn.value(), outputColumn.refForeignKey(), CellValue); + cellValue = selectByProperty(outputColumn.refClass(), outputColumn.value(), outputColumn.refForeignKey(), cellValue); } } // excel 文本框最大长度 - if(String.valueOf(CellValue).length() > 30000){ - hssfRow.createCell(j, CellType.STRING).setCellValue(String.valueOf(CellValue).substring(0,30000)); + if(String.valueOf(cellValue).length() > 30000){ + hssfRow.createCell(j, CellType.STRING).setCellValue(String.valueOf(cellValue).substring(0,30000)); }else{ - hssfRow.createCell(j, CellType.STRING).setCellValue(String.valueOf(CellValue)); + hssfRow.createCell(j, CellType.STRING).setCellValue(String.valueOf(cellValue)); } } @@ -228,11 +224,12 @@ public class ExcelUtil { // excel列名与字段名映射 Map colName = new HashMap<>(); - ApiParam fieldAnno; - for (Field field : importClass.getDeclaredFields()) { - if (field.isAnnotationPresent(ApiParam.class)) { - fieldAnno = field.getAnnotation(ApiParam.class); - colName.put(fieldAnno.value(), field); + for (Field field : ReflexTool.getAllField(importClass.getName())) { + if (field.isAnnotationPresent(AnnoOutputColumn.class) + && !StringUtils.isBlank(field.getAnnotation(AnnoOutputColumn.class).name())) { + colName.put(field.getAnnotation(AnnoOutputColumn.class).name(), field); + } else if (field.isAnnotationPresent(ApiParam.class)) { + colName.put(field.getAnnotation(ApiParam.class).value(), field); } } @@ -247,61 +244,42 @@ public class ExcelUtil { Row row; Object obj; Object cellValue = null; + AnnoOutputColumn inputColumn; + Method method; + for (int i = 1; i <= sheet.getLastRowNum(); i++) { row = sheet.getRow(i); obj = importClass.newInstance(); for (int j = 0; j < fields.length; j++) { - row.getCell(j).setCellType(CellType.STRING); - if ("".equals(row.getCell(j).getStringCellValue())) { - cellValue = null; - } else if (fields[j].getType() == String.class) { + // 判断是否存在引用关系 + if (fields[j].isAnnotationPresent(AnnoOutputColumn.class)) { + inputColumn = fields[j].getAnnotation(AnnoOutputColumn.class); cellValue = row.getCell(j).getStringCellValue(); - } else if (fields[j].getType() == Integer.class) { - cellValue = Integer.parseInt(row.getCell(j).getStringCellValue()); - } else if (fields[j].getType() == Long.class) { - cellValue = Long.parseLong(row.getCell(j).getStringCellValue()); + + // 判断是否为枚举字段 + if (inputColumn.refClass().isEnum()) { + method = inputColumn.refClass().getDeclaredMethod( + inputColumn.value() + "Of" + StringTool.toUpperCaseFirstOne(inputColumn.refForeignKey()), + inputColumn.refClass().getDeclaredMethod("get" + + StringTool.toUpperCaseFirstOne(inputColumn.value())).getReturnType()); + cellValue = method.invoke(null,cellValue); + }else if(inputColumn.refClass().equals(SysDictionary.class) && cellValue != null){ + cellValue = sysDictionaryService.getSysDictionaryByParentCodeAndName(inputColumn.refForeignKey(), String.valueOf(cellValue)).getName(); + } else if(!inputColumn.refClass().equals(Object.class) && !inputColumn.refClass().equals(SysDictionary.class)){ + cellValue = selectByProperty(inputColumn.refClass(), inputColumn.refForeignKey(), inputColumn.value(), cellValue); + } + }else{ + cellValue = getExcelCell(row.getCell(j),fields[j].getType()); } - importClass.getDeclaredMethod("set" + StringTool.toUpperCaseFirstOne(fields[j].getName()), fields[j].getType()) - .invoke(obj, cellValue); + fields[j].setAccessible(true); + fields[j].set(obj,cellValue); } dataList.add(obj); } - } catch (IOException e) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.IO_EXCEPTION.getCode()) - .setErrorDetail("IO输入输出异常") - .build(); - } catch (IllegalAccessException e) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.REFLEX_EXCEPTION.getCode()) - .setErrorDetail("无法访问导入类") - .setErrorSolution("请检查导入类访问修饰符") - .build(); - } catch (InstantiationException e) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.REFLEX_EXCEPTION.getCode()) - .setErrorDetail("无法实例化导入类") - .setErrorSolution("请检查导入类是拥有无参构造方法") - .build(); - } catch (InvocationTargetException e) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.REFLEX_EXCEPTION.getCode()) - .setErrorDetail("属性set方法实现错误") - .setErrorSolution("请检查属性set方法参数类型是否正确") - .build(); - } catch (NoSuchMethodException e) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.REFLEX_EXCEPTION.getCode()) - .setErrorDetail("没有找到属性set方法") - .setErrorSolution("请检查属性set方法是否存在") - .build(); + } catch (Exception e){ + e.printStackTrace(); } return dataList; } @@ -328,20 +306,28 @@ public class ExcelUtil { // 创建表头 HSSFRow tableHeader = sheet.createRow(0); - HSSFRow tableData = sheet.createRow(1); // 类数据 - Field[] declaredFields = exportClass.getDeclaredFields(); - ApiParam fieldAnno; + Field[] fields = ReflexTool.getAllField(exportClass.getName()); int col = 0; - for (int i = 0; i < declaredFields.length; i++) { - if (declaredFields[i].isAnnotationPresent(ApiParam.class)) { - fieldAnno = declaredFields[i].getAnnotation(ApiParam.class); - if (!fieldAnno.hidden()) { - tableHeader.createCell(col, CellType.STRING).setCellValue(fieldAnno.value()); + for (int i = 0; i < fields.length; i++) { + if (fields[i].isAnnotationPresent(AnnoOutputColumn.class)) { + // 是否隐藏列 + if(!fields[i].getAnnotation(AnnoOutputColumn.class).hidden()){ + if (fields[i].isAnnotationPresent(AnnoOutputColumn.class)) { + tableHeader.createCell(col, CellType.STRING).setCellValue(fields[i].getAnnotation(AnnoOutputColumn.class).name()); + } - tableData.createCell(col, CellType.STRING).setCellValue(fieldAnno.example()); + // 优先使用 AnnoOutputColumn.name() + if (fields[i].isAnnotationPresent(ApiParam.class) && StringUtils.isBlank(fields[i].getAnnotation(AnnoOutputColumn.class).name())) { + tableHeader.createCell(col, CellType.STRING).setCellValue(fields[i].getAnnotation(ApiParam.class).value()); + } + col++; + } + } else { + if (fields[i].isAnnotationPresent(ApiParam.class)) { + tableHeader.createCell(col, CellType.STRING).setCellValue(fields[i].getAnnotation(ApiParam.class).value()); col++; } } @@ -368,7 +354,6 @@ public class ExcelUtil { /** * 获取实体列集合 - * * @param pojoClass * @return */ @@ -381,7 +366,6 @@ public class ExcelUtil { colName.put(fields[i].getName(),fields[i].getAnnotation(ApiParam.class).value()); } - if (fields[i].isAnnotationPresent(AnnoOutputColumn.class)) { // 判断是否隐藏 if(fields[i].getAnnotation(AnnoOutputColumn.class).hidden()){ @@ -397,6 +381,7 @@ public class ExcelUtil { } /** + * 查询外键信息 * @param persistentClass * @param colName * @param propertyName @@ -409,7 +394,36 @@ public class ExcelUtil { return entityManager.createQuery(queryString).setParameter(propertyName, value).getSingleResult(); } + /** + * 获取excel单元格值 + * @param cell + * @param cellClass + * @return + */ + private static Object getExcelCell(Cell cell, Class cellClass) { + if (cell != null) { + cell.setCellType(CellType.STRING); + + if ("".equals(cell.getStringCellValue()) || "null".equals(cell.getStringCellValue())) { + return null; + } else if (cellClass == String.class) { + return cell.getStringCellValue(); + } else if (cellClass == Integer.class) { + return Integer.parseInt(cell.getStringCellValue()); + } else if (cellClass == Long.class) { + return Long.parseLong(cell.getStringCellValue()); + } else if (cellClass == Double.class) { + return Long.parseLong(cell.getStringCellValue()); + } + } + return null; + } + /** + * 发送包含文件列表的站内信 + * @param fileList + * @param userId + */ public static void sendStationLetter(List fileList, Long userId){ StringBuffer letter = new StringBuffer(); letter.append("导出文件列表:"); @@ -433,42 +447,4 @@ public class ExcelUtil { rabbitTemplate.convertAndSend(PlatformConstWords.IMPP_MESSAGE_LETTER_QUEUE,sysMessage); } - public static void main(String[] args) { -// List sysTools = new ArrayList<>(); -// SysTool sysTool = new SysTool(); -// for (int i = 0; i < 14; i++) { -// sysTool.setName("ddd"); -// sysTools.add(sysTool); -// } -// String[] colName = new String[]{"name", "toolTypeNameRdd", "toolStatus", "toolIp", "toolPort", "toolConnType", "toolDataType", "toolOperating", "toolDescription"}; -// try { -// FileOutputStream ds = new FileOutputStream("E://testOut.xls"); -// ds.write(ExcelUtil.exportData(sysTools, SysTool.class, colName)); -// ds.flush(); -// ds.close(); -//// ExcelUtil.importData("testOut.xls", new FileInputStream("E://testOut.xls"), SysTool.class); -//// ExcelUtil.importTemplate(new FileOutputStream("E://testOut.xls"), SysTool.class, colName); -// -// } catch (IOException e) { -// e.printStackTrace(); -// } - SysTool st = new SysTool(); - st.setName("测试"); - st.setId(1L); - - try { - System.out.println(SysTool.class.getField("id").isAccessible()); - System.out.println("取值:"+ SysTool.class.getField("id").get(st)); - System.out.println(SysTool.class.getDeclaredField("name").isAccessible()); - Field field = SysTool.class.getDeclaredField("name"); - field.setAccessible(true); - System.out.println("取值:"+ field.get(st)); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - - - } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java index 969b4d4..7ffdbe8 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java @@ -21,7 +21,7 @@ import java.util.concurrent.ConcurrentMap; * @CreateDate : 2018-11-24 16:57 * @Modify: **/ -@ServerEndpoint(value= PlatformConstWords.BASE_URL + "/message-websocket/{userId}") +@ServerEndpoint(value= PlatformConstWords.WEBSOCKET_URL + "/message-websocket/{userId}") @Component public class MessageWebSocket { @@ -84,11 +84,11 @@ public class MessageWebSocket { public static void sendMessage(Long userId, String message){ try { MessageWebSocket websocket = webSocketSet.get(userId); - if (message.equals("heartBit") && websocket.session != null){ - websocket.session.getBasicRemote().sendText(message + "=" + sendCount); - sendCount++; - }else{ - if(websocket != null){ + if(websocket != null) { + if (message.equals("heartBit")) { + websocket.session.getBasicRemote().sendText(message + "=" + sendCount); + sendCount++; + } else { websocket.session.getBasicRemote().sendText(message); } } diff --git a/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties b/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties index 734b8da..b21c055 100644 --- a/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties +++ b/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties @@ -1,7 +1,7 @@ #项目端口 server.port=8100 #本机ip -impp.server.ip=192.168.1.40 +impp.server.ip=192.168.1.56 #console控制台服务(zipkin追踪全路径) impp.console.ip=http://csd.estsh.com diff --git a/modules/i3plus-core-apiservice/src/main/resources/init/sys-config.xlsx b/modules/i3plus-core-apiservice/src/main/resources/init/sys-config.xlsx index 94b84796ae6eccc0eb3eba9c8b65507f95a71bcc..db2137d67d877eed62ce58f9835b4f5b9aa793bd 100644 GIT binary patch delta 21914 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 Q$GRrJZdPJj(F>9U05_x>NB{r; delta 17989 zcmcJ%1yqz>^ezr4h#(=--O?SR0@5wrCEeW;uP80ujevA_gGhIGNu$8f3^2rh!0-F~ z!n^)={qDW2Sax z{A;lG)B6gp-zO1wrok6y^V<$71>05;FNUPem_&T`eZvT;bEWIl#J0dC(?n!q1mp^l zQmy2bfC0X?EFVxmD}GWLeb@sFlTHzhr|6fOW7dh3!ED%bUrj{;tNn{y5wA9#s6q;> zanSts`Smb8B2KOV;)FZPnt2CpLqsKAJPS&IJ`d|FU6aOfMh$_bd#dOsN-<0^A`j7} zQXMJ^1R@lNZJV(bB8*V=Y!1H6(4Cz?j@naZ5kc zp9Z9n?kUVE-sBdV@2FD?v=5@4=Bxw>?7s6MB{Y4A(xbo}(332={u z4)QY294SF{_BDZr)N&>I5@cg^CiwGc4otLl#y{{*B`Y%m8LRJ~M#W@ID%wUl3QG^t zZ;%*D=MH2%NU+GTSd^_m6v!`)`SF$J!Qv*sz4WctE7IiI%W(1fl3ku;R8(SkWil_1 zgk@KbN7)80Ttr&+SKrsa5QUjchpY;qe-j8c5xBv6FW(j}sgPhr5YR-nfWV&__ zs4xc6uWmo8UD4skRjcRiqZPENo#)WfcO^Z3=GE4*9iC^SPO1zJ&7~LGD^zI@Dp{7S zsj*Gb&-EJyWp2<`KXy|6oILw6CRf`8UdzKDt7#02=kaz>p?Vkp*4cxc>mtGz*H@uH z3$`-BBPt$knl9(qdR>CKz2P-xXtv)(Ro;7CarICN4r$>ql45`i28InB#m9sPu-;~W za*C!6fkdS563+Au>6SKj)c8c{OLX>*SueFWrA=`rRnl{UQWkn#`bdj$Qxk>o3V z=5_YNW7V=^l(L3c+XWeGnP>oH^0k2d5_v7`HaGF}c{M}o zy&65eYR;>@B5w}eDm)t(dPr(?L(^KUrfSmc$5z`8Jh)!G@M>%Vp6{r-wp>MUa;5Pv zEftMzfFP?EW>d`N+WhmN_M4+Ah|N%&d6)}-`TXkc>D1m*D2OX;2`~)Q1(ASUfDI8e zG~&I*o8xt}il(b|fsJd5Bk`O|Z3Z)V^_U;eS^mH898EI~G^9QSy-yALoU;x@C*@9C&GuUz_OKK;_zn zvc>PJ#kk}K|9XxeK;!p1b7U5C<)3JEzB>Q0|GaSzThH0`@<531!!^X~3Q}=#)e1U| zOPfO5ZdlOJp&}&Sksa3MO40@U@&|H6ai%%6dJW7qEL_=a*Lu0uK9_bl0AIG88=bbq z#Xa+KL%D)1pQxOFzJ{EB8@o8#1^a8yzq}l}%2`l#Tj*;81TMn{_HL@1Zw{TF{#aSa z+xc>h`S#}fP^DLMl!Gc^6LJm&r(y18ckkiehc3uflH6d^9RCI0g|gAe=0X}|OfIx{ z0lc}eVdvU3y5!Oe45S=x?|n#f`RL%bJ9Vl%In*$5wK%TJMD-#vE>hP&3wv)z63|=w z?ATY5@m<%)#iaM+&Lo-!53^KH2{Qyz zUc;sUFhC5*rUtHQQW=?aYV-iFXoHBpFo;3gP_<)2!_}Ey!}-;#;``9i3`Y?ibU4Lpr?wf zraYlyTkoSgN?@$Zi#|)l(lsOAVbiush>J9sDT$Mbq6n0E;a0;x4m6qFDx`H!FPv4mgDFEI8 zr6yOOy4GM8W&4Z~gPPN7};{6W8iU02hOVo@ss)k-vGt=44|@ukG< z^B*AY}+A1{!aL>zAT3ZlOS=^U&KrR(9f2tXcG#@5V0Rff07zv=i& zbOkjn;OV>g$+zL%e5p^4T*pWL4}M0M2)j0Q8eFDJCfwakA7Tp;aR6f582pxxc_n3g z>@5<7%hbv`+oNfsZO^^p)<*KJlI$}Va%=YaoH~?zTvK2__40^2$%w2$8}zl7PDFq|aNsIa4P1_ST5yu> zar6GV*ki+nwLs*0REKuOOW8W!Bo#19=RPga?b(f+y8s!{?x=2Gx#rF<4_;mwS9R-d z(TmKN^zyoVF*pjFkB?JzfUH+H(<{fFQ!skkFp<3E)Y-*|$nwB25G0qqKHN#i(*9=}i$@~nvN$uQQ-o2(s$vD8d1k@7b zzBKWj339Ho%{%K+d-Zn4o#wG5U64JR5!BR_8q}2Z(emW#M3XAHxq^HpWZBqM?GG;o zNSIJvSV}-m7@In`4*I)Cse+pe#A8s+`HgRw5}SkwNpUl?n}M1mz+r3i(}jw)L0@7swDhaV6T+B zunSYr(k>cP!8(C=n_4v-oo-_`+9fRX#Yn$J;tgZ{^97@YnsR5My{;T7Q=T<+@mAM!Rr7_tJpnRJMLNhB!g(!>b|x#2jj&C+_H|g02MoQDt&N)S<)Y z?{>h==g8)%0e!xzQ0_2yi3>$ka~cXEDw9kv)#GmY{D*8`>zCGBzX7P@e;EI}`9q`;XQC=OW-ACfPu;n(9deC_h8(<&DOwf39r+W%3mBKji-35dl9l<^PT{ zsIK|6s&X!F{GU-pyVKA^v$OLyJMsROPJblqtq8a)>t9LyzgYJFY!&by&uaN?jI69V z{#y_Z|IMQRvFK8DWVZo(iNF^~{6~GHe)va9-?HOaYcm#A$~t`StssA(oQKZ zgLX3ahyN&@^8c9#fOgye+0OsnjclN{Lf-rEz;=#q|8>V%V{ zL(Tw|bN(rJiua!UL;eyf=lWCb9Pd5*hg=#e=f0I2<(Q(exJ$sf%TRk`-uuiUp1AOw zrEtytQyDunYGdaXLq8yo_GPXSQn{wTbBryqI6YS{X6DXdoeE=u`!ZFQl+3aKqhk2N zb4iQ%_dBAQ(yYCpWUdJ=_?at=oD+PUdlG{*Ps@oU`x(mMa7YML*L6@0E(~8b45PD$6dx%Jc zLg)4i(t8P!muR4Yzc7)iB0}bKq1czq{^r0fRO&~^?rQ_x0JY!whkc(I>DEnaKRpy> zW2AC-4mA3;!n|szVNv~)?K#3D8(ave(YQBbNz0_QkQ@k2Ro4 z#^)lWQ6@i_3)K;v52a~nA$Sz2e-xk6f#Ga^;2GoCR;b94$%gbeQt)^NW!L+(1ffU+ z0jQ(qzRBtn&d{t7wSdM(&)8N4_|eJmc3LFRxiBR1vzvTXdDD(f#e;p>PYBH_C>kd8 zYmW-5p_|#w3v`!=kjn|qHQC^2coS=|>|>SZFb%mWYA#L|pwITThPUv!&~rSnIZ4@Q z=%W#lGz&lG4EnBV8BGJZO{s!xgVy`SUl5rj+2C6iQOr6-69D~V_M>DwD0)!#JFwzA zIK?;A!WV*9*+Ne7V=9VgZ*iumgJZ8l=((k-(>_6zTjXe}A)y}&cR&Q1|6WZ5k;(EN zAmV{dBpyiqt{N1w$J$pHr}!P=#p#lYVXWHOy+j{3N?h3U=vneVLgTvKLI}-@uni}` zH`y182o$#NVlPh@C^T!XJ(z}IQ)|`k1hv~t4+j01a)CZ~AKhm5$YpVOMcG{zEZ=4U zX+y;JPp);+dAbYsDtC;daSGOQYWLkI;x{@(&jpyE^{lQg)Ac@3$2&p?${w^}FFEjU z)R=Gc6EHEZl7XT-OV2WA5zcWE4yIDvXFnS8C<(8qxHEGwQDU=%^XMEupMx3q$S9wI z+1^hDS~(!&an(1IQ=|z7x3GBL!Q#OEqy>(mg{B7rt&8xr;1vh3DF_;fhShDM1YbiV zF~OV(dC3AzHsXOBBpywmzzV56>G7MZ3u~xjb#Lyty@zez2{mEJo%!V_w}-8F+@dk8 z6&Br<#`}})255<_`P^Z}q-KhWu>FFu0S~2z2LhV3mF3o zd2pn(fU{6!T8Ah!5q*4~5pw?{0!kU) zwSbCPvC$vei$2=b4K5DmJe zW18;u;OX9lL5|!{PVh&WvyE+Kn|gta$<^Oc@~6fv6?Dp#-!?vI5ymmB^_SdLZ6Y*` z6nR7L!`?N|TYsZ`ldtaV2bABosu>_;p6xCfXpwpD72f88ywT5GI5)b>1yyW&Y_+>O z@B5?9`|on0hJoWj+(}C8LNJp-%;lwddD3?y%V-ikUTBL(nRH}`e}j#yCn^C2kF03= zXDjx(1GblerOz^)gE`#h7I7fc&6v!@_ikns>T5GIt~r;InGVZjzmoco_5RYkbW4Ia zPC|*~!8YVx9gxmU%1Bs{eufk;7V?lt0NRbxcqnf>t_R0c##jY|4768% z>E@8Mhc+p3=s(cNd}TO$&+P4yw^jK^^UAyP)Jvm##?U;7|7*|g0z?+bJ~>*rFmrKw z=Kd7uxLWnURE3m44hz~U+NOYRzewv-IuVr~*e!X6b6lZK8IdPPo(tRN_GY6+AnDmm zyZ4aP&z((i?a+rOvpRUVy~zd(T;E@}L~%Ry={HlgX^_jx7Cwgydxs6Vpy*LjGccA_ z$K+rv57>S2YJYJ^$}wTqU2>(_e+#gPsokU6CQhsc7p>^TK^Ne^wq0r)s|82iKK?Nk z+F_Hz!%G(8&KwARKy=DM>4EM`bRee$hrMRqOGYrS>u=|#A+eCufZzC8x0DH3eRW%k z8vdO*_i!28J^9+?I7hY)4at?%!XncZ;=(GU!7IwiL8#f^Dc1FJv`cIa3s5Q1cp7kI0I2Rx>xN!}jpUXHE2 z()?8eFo#;^gvP`%8N0=@x;Q3Z%%g(=#+p=k0yZq7b%459E$oK}He}3i_w=nAZ|7CF z=uL*06*9`}b@Hlzq_ewq&Q5kRk!^c%Gpfn1iTSbKEbr%M{?Q0M!}-y8lNnVNMR)2e zSyq3#{c=h{6UC{7nH1Ee4s0KFFV4D`SAX^~n-u(;VfWjZkotH2X=Bq1-$LqsJk(x> zx325{AO~@?@JAL>2~gr*%>B59TmsDY7vx2L&j;?9fIO=E{1y*<`3Ub0^hf3d01@E4oE^v0V0R&C_J)dF`}vhpvz>R`T`ZIsDaM5bM0g=8Vg z4~A-*y^kzLW@l9HkUEb23n?qkaWg3ScVeX90T|i*F93h$l;uxifPW^HndV>2{Ee8; zzs&uO@T}kJHT@moBkKQB3(Zxhrq)@E1mO212KN3!cy4r;&!OCD3N+rwCsf<7ABf0 zx79nM@)HpNTE0~iayfriHLdEukh&u_I_59F|3-k`ZwXNS9RU%_zf-FeV+Z`ElI4G^ zSMgtZ3*FQFPY^7mC}aL?tc8q5epRNsmIZhHFz6Q|)%ZU+{%n))e~E9~B=ECON@V_y z0EOJ&5s*v!I|B6osrQfe8~Z!89cX&A;_J?Hv^?zOf1n9|e(h@Ic=_@TS)N-CFdQ_*b|7F8@0M%%g$d5sUI$0tA1jS6=RSdhbX7PVJT9 zKRYzElP&_|1ci*Pa(|u}rPY5wF>;^&h4id>?%1E_)c7y)-_F0;o_|)rU13SM{f>Z) zcX0yF}bhTkdLVuw=zT0*+Rx|xqJ=`9&Nh%9>uWVb$SK9O1rjmu1_8qvK}3o>FD^ewZ@T3sJ+;~I-(y@ z%*;H*Jcwg5%fMP4r?9EOz)>0)OS?+{JE}HGEs_F=gf#baY@)~gXaky>-Kh@^|>W9%{nTW zEzIw?s?;i~)^JhvMM$=Uqif3lg()xa+Y z)@?>@S+Z*0Wj6)ul3W^9%vllp^LuJ9d1=^yfyknZ#+e;I{_en1UGU}!2vYOGrp8|K z(&GlOukI!=sc4Fmo|{WaW>)oI;+k7HJ@rD*sixuABD!gwxlSDV5_W?YRdx>($y(-z z4H@)CsSaZ3JtD+Fa)P!)hB&6*UXA(9y$(;|;EXc;Y*F-O{eo)e)78W`1bH+AaObl{ zS9|XGK40A2ML&)Q$8*c3@m-zzFPvV*fyYK%vD_lM9gSu)%gh2eVjCzuH4=bJ&=P}m zCQYUz4v`U^%7#BpKQkKtjpGgV(dG)Nu$i1srCNf2d4DVrtK9y;E+{CXUsw{D>AS>? zIkvbq#8PL<&{p1ZtfXEoGf2sxBOCTu4mh@g)GK3#P+I`_LsCf(bT zRGXgSmxcW=I2-uJVUp6$6Dh&;k*Ow;a9$amnKY98@(<%hFBPH>k5!3E&0lMho$L6f zn>+zJiFu;P(z7?^jxViqNel&*RT7@1bPKP$*s1uN!KJ!qmb_7Se_Dr?0z?tuNO9%J?o*q z2PJQ+<0>9@0pWhDO~tCq3rQ8SAd4yME^nQqrER7*~Y-6 zcQbQZ^HLI2k676DxEO`>r3td0{VW zn!1XGFd>)bLSKMC;#pzfSIko~@P(cB8SB z$y81%D8aCkP16F`-zMgE&xcS0K97Rc?H_Pmtb@sWpE&KXJ!qjDJb*2-;m+0JV590u z7StpU5LR%G-mqQ&1EMLGZ_n5qp7~N#ys`VrWn$~Gr8hiDcyeYY*VcdDx{lO2#zWbCN=AV`L2;hJ^}k|UF4ot`uW=^9;o;H1d6`XFisir&ZYeao*I07Fp@t=^CVq#kj@ z2S#~w;Kqog$EmB4=-ryQG0L3Z?ZmR`G6O$eYYP&L zo?O^`JrhzbC*me>1q4r)up@z~(u=3l-$F{|@3A}gyy?qCzd6X4MblWibmc{}Z$16t z4jg!3+fD0L&{3)rt~}sZLn(ccHgkF2I-`?v5+Tu5h0eUu`9yjZR-i0eJ_@&Owe0BD8GSjCd{hlGA_N^w7d`#Wea&v$CKjEv#!~2B+fN4jCBS zk)ly@h&tRA@}p^M*5OIqCA^uFsfxuQd=(l~`tfdtrod|z)Zj9*kU=5*;G28vvBk5D zniw)0?6jwdr~sO4I+DI*1PRO{XsDfa3xopKGEn+}ovHoXgellhWCYiqBcbs%g1RRZ1+Fq`gzTq5xWBt-ffL&tX%Mc~g?ns1o!G zu|!W~G<%Mh5m2K03f>JhGV;<&>AHmm-6uXsRHSh#>#m~B47a#Yd*#{NA-Fc-{yvWt zex`It*xI#Nu2*04xD&Uhoars06EaRkjJYW>dPj-(@GBN#obj}+K$9^74O&B$ff7d?Q1 zdBu8nJ1)oF?YK#rHglqwK1;~Q{OBGv?Nm!d*xoM`Yt*>NU`84To+-I2#dA~)_s z3gv_Yc-Y4XMMh6698^f+3Wz`#7i~vgo4naZG3)+yHgCQ6vivD^P5dEsHxQe?g1|jx zCl9r*hRg85tGLQT{`t$Zwi87iuYzhb4fhqmHh1H?y7;4di!RliBZ+ELqd3|jb5i4c zSJkE3BDf$!dev#nv}N00faS;D>drS3B4Z<*Fpr9!$YU;9;?wWxe2LNDnToS+Cb;PH zRcky)JFH3KmWYE2D3@^b?c#RJFS1xqnmpMc_CR;vnf22>$jqaac6X-r7P;#%ojwi# zD52Y}_}pLMp$KlT19mFBAY<2+Bu`DAUR}SKi5F;*CSiAnT`Cl;VMR~1E$(|; zVGN%6&5*^4)dQxXmKorT+zGBMcT^iloQ_!TI6RE^l5}aPYe9OzmVINcwF}mt;dl4C zxhl9R$7^eeUVOgLj@EE7b@@GqqhV>%zD>9(y^;IHGvn>Jxk^bxCCP(Sv--rf7pxH_ zi+mL|al!d#b#9)$lPAs~+1-T`{Rh+2r>ljS7aL<-{ zFO{5{Z;njOnF>G47*LgzsOSy#m^s=ryI2^&01&$=;;8(!WS~~lg}WJ_iv{)5tUB)iRmI(ssQP7m1cG=l=Br4NaR((8t6;OxKn>V> z;|OCZJXn2fGICzHo_gJTlFy7CI=3?4Z^Z^Ibo4DvBt;BTi96vl_r4b!6% z1lN7~YCn%|`xLk0rz7NK>LX|XYasfq3659gnHezUMd%)dz4g4EG+n|)Fxnr)#j%ft z9+3-whQ**j3AZeyd1onhKP|u9I&4DygUe2!PchGDvj7Lu4RrERn1(fU;sb!@ix0x*x(U4)KOrVGeDSu{|!1B zIZCM%x}GQ!DJxrTxbZ^j8w|Y+m3PGwl=`r6QHYPt-f2f7vMay@MzlW7FPwWKeY<;@ zGfY93XzrP}CfCCtO%9Z2U-xIx#oO zV(*#v1fdJy#FIG8(T?`m=|@Q$8H4#}7-wP25vMo#wre%@LR3Np(yYy5FD>Px1L*bySixW0b6MBW9mG{F+1mk zXa@BqQZTdgd|9~UYMp03EN5CRjD5@Q?$~r$ZXK!u9%_Nu9+BK${#HDZ9zX!Zb@j*M z@58{fVZp$l{QRn!gQJ_Jk;CoTKCd&|HjI;Fuv9a%>Y^~~1pFpF|J=jt5FV@~V zW`X5_a-Ri8Gr4;ndv$sSp+<9o#*E`ni+w z>@Gj|CpbwM3c!a&OgTh|0IuW;y>YA;KlH89B9v+R75nc$Wu1+L<4y3mo~f176dhFc zp+Q#KCl{s9nxyEWjl}A)8+l^!bvaGCn~)y2H%qaQs?{tVXTASG+vVF@yuFec?s^X& z^mAuj>q%$wLrxV(0X${ROk{O8wzt)5f-CU%a}kKt32%!#pMH} zPhOQ!lm}ChiQnY%sYJq6m+L5DC5F6y^Ph$Ow!Oo>87wWRUE%hUAa=Y$9UHuXiq$O{W>BzxZ}0 z$$`fnNsA~f5l4Sj(2n1XBSV2;R}4QrELS|jEy=KyKzY#0&DY? zGzei4Kl(>Qv#HVN4#p5()4wJ2B@bj{j7C-gc~5_Tn|r9*r3{46qaDO38;jW{X0K!C za9+^wIlWAu3!3~96Ml@vGN)%Q3xX3jcIj##986L>9{%uYyGG|QVnUR`5}1%uH7FFw znPXiDQC2Gmun?7L=MAT7z3Idt%?Q-`w5ho9*#W^j6{4xnHcinnws^jp_H^|+uQ`c{ zubO3&@&0qtT~EMLz$2F^jO44>D^yX(q=;3lRH3p3>~(a`G_{%U$Hv@Gx2ZiB6kd^# zb|g@v%$C3Ach5>%II)dwrVAWtsIghPxvXz%*B8QTBvg?}Xf`sNU3uFI(QUce9@qn} z&lD>VEJ1~=H7r&+h|fmLcXI~%sz+V4v&R<6KE%sN_;CZ$+B?_5@{mh-iSN|@@A6EV zKE(;*VX>O0rES;H+kDaulgLZO*?)e&Wm0q$*VCPgH_+I`VTrhYES>0B!c=V8(b&KB zyCYYUSn*z}*HoPy%@}6ek!7p~k+Ps~Q1V?A0H~Q`#TstTf&dx}rQ zaIY5=uF<&9Uwdi60FOR#_#{5Y@bkgHpmLyoP?tEL;^L3M53k`%$5E|u-%o`|B>p*i zQ4mM##gO6NS72nJ>CJ)j2X?oI?0APeAO}ce!(PK4NC#N*RVX8!4@XfP8TZodCOLjs zo;YD2^n772NgTx`<>X;DRUS{?r#$->8x<~39E9fU{2>lT*c#;lFWtrR<0J2P2?Kp1 zJ;xUHg)5P?12mG@*JjcWq!+@ok`v;L3e*q-THn}wqM^-~?KWr6pV-?5J%sq+DcA8) zh-nF9wlxFZe2REm6$tu5p0F05m|uB$`fa(*Kb7hU#rqnatx-m(^6g2XI+2Ug1bN~t z#s;#-k}^>GHJxd8N`-=FOnb~0%S;Mi^_8o6C%&uM}cobh7-|#;kwN> zo9qvIJF15bC;4u8gCP8A3Bxxkl+>0-U7{HY<7>DyhntlQ!pPP-?<;F0u|L#u>Yk&V zfE2xHy7QUsK;Qhd?oqPwG~w?W+Rk z?Vi-l3g5~Y`zNqB%#j_ceCuYv26NeVt`<(9O@RnMsuLOGQp{FnAlcK>Z(}zHAB$$K z6`J*QoUSkR__1-$HG7DcQ|l!{xQcntp`eL-dgp3cPFd8OUhz`3xSOZ72^LGaT+cobZo%?@@kS z5a}iuasy$+Q;@GV6n(*&rbIeb+ul9>Hn{eoBA3$q1+q%Bnd$Tw_S*7S78ZV=q_W)< z+3j`cYnA6>vZKlI=%m<6s(`6Q$yZqj8snj-?j}Cz}qK9)kTYEH%6MZ zs_7@|vP1-j9%(+Jj#9-~?HA$6`q)Jthv$+got=@HaQ2O6E1r?-ITwODZv$zF00GQ& zI#=DkF&uYYrXkKeO{gin67QGuj3#-}p_)Y5xOXo|AOl?W6+R9)#|MB|d5fb z1%+#2L>k*@@M}inn;!esyraEY>#9*C>*TkrZw|zf<)ai#tE|M8{E%$vlMch89^)vB zJgSEj*11qswd|t5k70b$#Uqxp=`qnfQcbe4pT-(8&RAba6XZ7Kq{TB9W^)!*pyt+qG{ z=jM>_1b44)_zX~};62m#*<~u^0w`etpGa+~Ht3uDd+;|xJ)TL~PZF|r_dj@lle5im z#fhw_Dm*9c*}2%0nJaRpL9FX>TY9<4>u>n+L+%G=mTCnyG0Gr$m`GZk9;?vB$v)dq zxb57vN)-(I@%JJhR}RSyo*VUk`6!PcT<`@UmC~x$F;sHXF{sRl3elWmFI;Dy2B642 zQmyDnEGJrkd%bdok8B&QC}#KI(TTXQ7^Mk?!k)~+y=QH5A7H*SP(NAq@q6C=xXoQ4Xq z!@qu}BVNp_9#j>3@d6Y6pQfJNA~|-#L0BGh$#$< z@b1%@doVCFi2q&`%mH0QNBHaA=zlNR;J(vRAI1#V!yiQ^jTIS=PWbOvy1zV&6^&vD zCn5az)#R@Q>QYfA;nak`suKo=;@2#6#HbJ@Ye*2)9?k*xN%3xo6~O_QsRSKTMcGEs z!DTDoNv({KqH;pfqlP2#;qp|Xb|Vzw=yah^lu^c!%y0!Jcf$tgkiqtDh#rMSc$dS_ ho}dr?L72z?uv+9AB@o36$Lb#SE{YuCiP!Dq{|C1Fl=c7s