diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/PressureTestController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/PressureTestController.java new file mode 100644 index 0000000..51c2658 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/PressureTestController.java @@ -0,0 +1,176 @@ +package cn.estsh.i3plus.core.apiservice.controller.base; + +import cn.estsh.i3plus.platform.common.tool.HttpClientTool; +import cn.estsh.i3plus.platform.plugin.opc.pojo.OpcUAParam; +import cn.estsh.i3plus.platform.plugin.opc.service.OpcUAService; +import cn.estsh.i3plus.pojo.base.annotation.AnnoIgnoreLog; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; +import cn.estsh.impp.framework.base.controller.CoreBaseController; +import cn.estsh.impp.framework.boot.exception.ImppBusiException; +import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; +import cn.estsh.impp.framework.boot.util.ResultBean; +import com.alibaba.fastjson.JSON; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaSubscription; +import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +/** + * @Description : + * @Reference : + * @Author : yunhao + * @CreateDate : 2020-01-08 11:53 + * @Modify: + **/ +@RestController +@Api(tags = "压测接口") +@RequestMapping("/impp/pressure-test") +public class PressureTestController extends CoreBaseController { + public static final Logger LOGGER = LoggerFactory.getLogger(PressureTestController.class); + + private static Map uaServiceMap = new Hashtable<>(); + + public static Map upcSub = new Hashtable<>(); + + private OpcUAService getOpcUaService(OpcUAParam opcUAParam){ + if(!uaServiceMap.containsKey(opcUAParam.getServerUrl())){ + OpcUAService opcService = new OpcUAService(); + opcService.connUaService(opcUAParam); + uaServiceMap.put(opcUAParam.getServerUrl(),opcService); + } + return uaServiceMap.get(opcUAParam.getServerUrl()); + } + + @GetMapping("/opc-write") + @ApiOperation(value = "写Opc", notes = "写Opc") + @AnnoIgnoreLog + public ResultBean writeOpc(OpcUAParam opcUA){ + try { + OpcUAService opcService = new OpcUAService(); + boolean editResult = opcService.editOpcParamValue(opcUA); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(editResult); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping("/opc-read") + @ApiOperation(value = "读Opc", notes = "读Opc") + @AnnoIgnoreLog + public ResultBean readOpc(OpcUAParam opcUA){ + try { + Object readResult = getOpcUaService(opcUA).getOpcParamValue(opcUA); + if(readResult == null){ + return ResultBean.fail(); + } + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(readResult); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + + @GetMapping("/opc-sub") + @ApiOperation(value = "订阅Opc", notes = "订阅Opc") + @AnnoIgnoreLog + public ResultBean subOpc(OpcUAParam opcUA,String callbackMethod,String callbackUrl){ + try { + UaSubscription subscription = getOpcUaService(opcUA).createSubscription(opcUA, (uaMonitoredItem, integer) -> { + uaMonitoredItem.setValueConsumer((node, value) -> { + LOGGER.info("OPC订阅回调: {} - {} , callback {}", node.getReadValueId().getNodeId(), value.getValue(), + callbackMethod+callbackUrl); + HashMap param = new HashMap<>(); + param.put("key",node.getReadValueId().getNodeId().toString()); + param.put("value",value.getValue().toString()); + + HttpClientTool.doHttpUrl(CommonEnumUtil.HTTP_METHOD_TYPE.valueOf(callbackMethod), callbackUrl, param); + } ); + }); + upcSub.put(subscription.getSubscriptionId(),opcUA); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(subscription.getSubscriptionId().toString()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping("/remove-opc-sub") + @ApiOperation(value = "移除Opc订阅", notes = "移除Opc订阅") + @AnnoIgnoreLog + public ResultBean removeSubOpc(OpcUAParam opcUA,String subscriptionId){ + try { + getOpcUaService(opcUA).deleteSubscription(opcUA,UInteger.valueOf(subscriptionId)); + upcSub.remove(UInteger.valueOf(subscriptionId)); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping("/remove-all-opc-sub") + @ApiOperation(value = "移除Opc订阅", notes = "移除Opc订阅") + @AnnoIgnoreLog + public ResultBean removeAllSubOpc(OpcUAParam opcUA){ + try { + OpcUAService opcService = getOpcUaService(opcUA); + for (UInteger uInteger : upcSub.keySet()) { + opcService.deleteSubscription(opcUA,uInteger); + } + upcSub.clear(); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping("/show-opc-sub-list") + @ApiOperation(value = "查询Opc订阅", notes = "查询Opc订阅") + @AnnoIgnoreLog + public ResultBean showSubOpcList(){ + try { + HashMap resultMap = new HashMap<>(); + for (UInteger uInteger : upcSub.keySet()) { + resultMap.put(uInteger.toString(), JSON.toJSONString(upcSub.get(uInteger))); + } + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultMap(resultMap); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping("/test-callback") + @ApiOperation(value = "查询Opc订阅", notes = "查询Opc订阅") + @AnnoIgnoreLog + public ResultBean showSubOpcList(String key,String value){ + try { + LOGGER.info("回调:{} : {}", key,value); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(key+":"+value); + }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/SysLocaleResourceController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleResourceController.java index 3c4e701..9f4b659 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleResourceController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleResourceController.java @@ -1,23 +1,28 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; import cn.estsh.i3plus.core.api.iservice.base.ISystemInitService; +import cn.estsh.i3plus.core.api.iservice.busi.ISysFileService; import cn.estsh.i3plus.core.api.iservice.busi.ISysLocaleResourceService; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.exception.BaseImppException; import cn.estsh.i3plus.platform.common.tool.ExcelTool; import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.util.CommonConstWords; +import cn.estsh.i3plus.platform.common.util.FileContentTypeTool; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; +import cn.estsh.i3plus.pojo.platform.bean.SysFile; import cn.estsh.i3plus.pojo.platform.bean.SysLocaleResource; import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.exception.ImppExceptionEnum; +import cn.estsh.impp.framework.boot.fastdfs.FastDFSClient; +import cn.estsh.impp.framework.boot.fastdfs.FastDFSFile; import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; @@ -55,11 +60,17 @@ public class SysLocaleResourceController extends CoreBaseController { private ISysLocaleResourceService sysLocaleResourceService; @Autowired - private ISystemInitService systemInitService; + private ISystemInitService systemInitService;; + + @Autowired + private ISysFileService sysFileService; @Autowired private EntityManager entityManager; + @Autowired + private FastDFSClient dfsClient; + /** * 新增语言资源 * @param sysLocaleResource 语言资源 @@ -329,10 +340,19 @@ public class SysLocaleResourceController extends CoreBaseController { "resourceType", "languageCode", "languageNameRdd", "resourceKey", "resourceValue", "softType" }); + String userAgent = request.getHeader("User-Agent"); + // 针对IE或者以IE为内核的浏览器: + if (userAgent.contains("MSIE") || userAgent.contains("Trident")) { + fileName = java.net.URLEncoder.encode(fileName, "UTF-8"); + } else { + // 非IE浏览器的处理: + fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); + } + InputStream targetStream = new DataInputStream(new FileInputStream(excle)); response.setContentType("application/force-download"); // 设置强制下载不打开 response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); // 设置文件名 - response.addHeader("Content-type", "application/octet-stream"); // 设置文件名 + response.addHeader("Content-type", FileContentTypeTool.getContentType(".xls")); // 设置文件名 BufferedInputStream bis = null; try { @@ -418,6 +438,33 @@ public class SysLocaleResourceController extends CoreBaseController { } } + @GetMapping(value = "/down-template") + @ApiOperation(value = "下载导入模板") + public ResultBean downSysLocaleResourceTemplate() { + try { + startMultiService(); + ExcelTool excelTool = new ExcelTool(entityManager, redisRes); + String importTemplateCode = SysLocaleResource.class.getSimpleName() + "ImportTemplate"; + + // 查询服务器中是否存在模板文件 + SysFile sysFile = sysFileService.getSysFileByFileCode(importTemplateCode); + if(sysFile == null){ + FastDFSFile fastDFSFile = new FastDFSFile(SysLocaleResource.class.getSimpleName() + "ImportTemplate.xls", + excelTool.importTemplate(SysLocaleResource.class), ".xls"); + + sysFile = dfsClient.upload(fastDFSFile,CommonEnumUtil.SOFT_TYPE.CORE.getValue()); + sysFile.setFileCode(importTemplateCode); + sysFileService.insertSysFile(sysFile); + } + + return ResultBean.success("导出成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(sysFile); + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + private Long getResourceKey(String resKey, String languageCode) { if (redisRes.checkKey(CommonConstWords.REDIS_PREFIX_CACHE_LANGUAGE + resKey, languageCode)) { LOGGER.info("查询到已存在资源 {}:{}",resKey,languageCode);