diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/domain/aspect/LogAspect.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/domain/aspect/LogAspect.java new file mode 100644 index 00000000..2ce344c3 --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/domain/aspect/LogAspect.java @@ -0,0 +1,140 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.common.domain.aspect; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import io.netty.util.internal.ThrowableUtil; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.nl.common.utils.*; +import org.nl.config.lucene.LuceneAppender; +import org.slf4j.MDC; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Zheng Jie + * @date 2018-11-24 + */ +@Component +@Aspect +@Slf4j +public class LogAspect { + + + + /** + * 配置环绕通知,使用在方法logPointcut()上注册的切入点 + * + * @param joinPoint join point for advice + */ + @Around("@annotation(logInfo)") + public Object logAround(ProceedingJoinPoint joinPoint,org.nl.common.anno.Log logInfo) throws Throwable { + + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + String params = getParameter(method, joinPoint.getArgs()); + HttpServletRequest request = RequestHolder.getHttpServletRequest(); + String url = request.getRequestURI(); + String requestIp = IPUtil.getIp(request); + MDC.put("requestMethod",url); + MDC.put("requestIp", requestIp); + MDC.put("requestTime", DateUtil.now()); + LuceneAppender.traceIdTL.set(BaseCode.intToChars(IdUtil.getLongId())); + Object result = null; + long comming = System.currentTimeMillis(); + try { + log.info("[--request--][请求接口:{}][请求参数:{}]",url,params); + result = joinPoint.proceed(); +// //是否把日志存到日志表 +// if (logInfo.isAddLogTable()) { +// Log log = new Log("INFO", System.currentTimeMillis() - comming); +// logService.save(getUsername(), StringUtils.getBrowser(request), requestIp, joinPoint, log); +// } + }catch (Exception ex){ + StringBuffer errorStack = new StringBuffer(); + errorStack.append("
【异常堆栈:"); + String errorMsg = ex.getMessage(); + int x = 0; + StackTraceElement[] stackTrace = ex.getStackTrace(); + if (stackTrace!=null && stackTrace.length>0){ + for (StackTraceElement stack : stackTrace) { + x++;errorStack.append(stack.toString().replaceAll("<",">")).append("
"); + if (x>10){ break; } + } + } + log.error("[-requestError-][请求接口:{}]【异常信息:{}】[请求参数:{}] {}", url,errorMsg,params, errorStack.append("】").toString()); + throw ex; + }finally { + log.info("[--response--][请求接口:{} 执行结束][耗时:{}s]",url,(System.currentTimeMillis() - comming)/1000); + MDC.clear(); + LuceneAppender.traceIdTL.remove(); + } + return result; + } + + /** + * 根据方法和传入的参数获取请求参数 + */ + private String getParameter(Method method, Object[] args) { + List argList = new ArrayList<>(); + Parameter[] parameters = method.getParameters(); + for (int i = 0; i < parameters.length; i++) { + //将RequestBody注解修饰的参数作为请求参数 + RequestBody requestBody = parameters[i].getAnnotation(RequestBody.class); + if (requestBody != null) { + argList.add(args[i]); + } + //将RequestParam注解修饰的参数作为请求参数 + RequestParam requestParam = parameters[i].getAnnotation(RequestParam.class); + if (requestParam != null) { + Map map = new HashMap<>(); + String key = parameters[i].getName(); + if (!StrUtil.isEmpty(requestParam.value())) { + key = requestParam.value(); + } + map.put(key, args[i]); + argList.add(map); + } + } + if (argList.size() == 0) { + return ""; + } + return argList.size() == 1 ? JSONUtil.toJsonStr(argList.get(0)) : JSONUtil.toJsonStr(argList); + } + + public String getUsername() { + try { + return SecurityUtils.getCurrentUsername(); + } catch (Exception e) { + return ""; + } + } +} diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/utils/RequestHolder.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/utils/RequestHolder.java new file mode 100644 index 00000000..27352b99 --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/utils/RequestHolder.java @@ -0,0 +1,34 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.common.utils; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; + +/** + * 获取 HttpServletRequest + * @author Zheng Jie + * @date 2018-11-24 + */ +public class RequestHolder { + + public static HttpServletRequest getHttpServletRequest() { + return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + } +} diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/clientSocket/HeartClientServer.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/clientSocket/HeartClientServer.java index 2ea8fe06..96f33f7f 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/clientSocket/HeartClientServer.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/clientSocket/HeartClientServer.java @@ -47,7 +47,7 @@ public class HeartClientServer extends AbstraceServer { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline() - .addLast("client-idle-handler", new IdleStateHandler(0, 5,0 , TimeUnit.SECONDS)) + .addLast("client-idle-handler", new IdleStateHandler(8, 0,0 , TimeUnit.SECONDS)) .addLast( new StringEncoder()) .addLast( new StringDecoder()) .addLast(new HeartConsumerHandler(body)); @@ -85,6 +85,7 @@ public class HeartClientServer extends AbstraceServer { channelFuture.channel().eventLoop().schedule(() -> doConnect(),6,TimeUnit.SECONDS); } }); + connect.channel().closeFuture().sync(); } catch (Exception t){ t.getStackTrace(); this.doDestroy(); @@ -93,6 +94,7 @@ public class HeartClientServer extends AbstraceServer { public void pingpong() { new Thread(()->{ while (channel!=null && channel.isActive()){ + System.out.println("----ppp-----"); try { Thread.sleep(2000); } catch (InterruptedException e) { diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/clientSocket/HeartConsumerHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/clientSocket/HeartConsumerHandler.java index bb0daa12..14fda989 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/clientSocket/HeartConsumerHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/clientSocket/HeartConsumerHandler.java @@ -28,8 +28,7 @@ public class HeartConsumerHandler extends SimpleChannelInboundHandler { System.out.println("断开连接---"); //重新建立 ctx.close(); - server.channel.close(); - server.channel.flush(); + server.doConnect(); } @Override @@ -50,10 +49,10 @@ public class HeartConsumerHandler extends SimpleChannelInboundHandler { if (evt instanceof IdleStateEvent){ IdleStateEvent stateEvent = (IdleStateEvent) evt; System.out.println(((IdleStateEvent) evt).state().toString()); - if (stateEvent.state() == IdleState.WRITER_IDLE) { + if (stateEvent.state() == IdleState.READER_IDLE) { //如果五秒内写失败,说明服务网络异常 ctx.close(); - server.doDisConnect(); + server.doConnect(); } } } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/clientSocket/RunClientHeartMain.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/clientSocket/RunClientHeartMain.java index eb2ef767..aac10d5f 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/clientSocket/RunClientHeartMain.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/clientSocket/RunClientHeartMain.java @@ -15,6 +15,6 @@ import java.nio.charset.StandardCharsets; */ public class RunClientHeartMain { public static void main(String[] args) throws InterruptedException { - HeartClientServer heartServer = new HeartClientServer(new InetSocketAddress("192.168.10.48", 20889)); + HeartClientServer heartServer = new HeartClientServer(new InetSocketAddress("192.168.10.60", 20889)); } } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/serverSocket/RunHeartMain.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/serverSocket/RunHeartMain.java index bed1da98..92df845d 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/serverSocket/RunHeartMain.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/websocket/heartSocket/serverSocket/RunHeartMain.java @@ -15,7 +15,7 @@ import java.nio.charset.StandardCharsets; */ public class RunHeartMain { public static void main(String[] args) throws InterruptedException { - HeartServer heartServer = new HeartServer(new InetSocketAddress("192.168.10.57", 20889)); + HeartServer heartServer = new HeartServer(new InetSocketAddress("192.168.10.60", 20889)); // while (true){ // Thread.sleep(5000); // for (Channel value : HeartServer.Heart_Connection.values()) { diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/base_manage/supplier/service/dao/BmSupplier.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/base_manage/supplier/service/dao/BmSupplier.java index 5f53cf2a..ca037a31 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/base_manage/supplier/service/dao/BmSupplier.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/base_manage/supplier/service/dao/BmSupplier.java @@ -1,5 +1,6 @@ package org.nl.wms.base_manage.supplier.service.dao; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; @@ -22,6 +23,7 @@ public class BmSupplier implements Serializable { /** * 供应商标识 */ + @TableId private Long supp_id; /** diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/early_manage/service/early_deferral/dao/AlmEarlyDeferralDetail.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/early_manage/service/early_deferral/dao/AlmEarlyDeferralDetail.java index 0ca2d594..dbb1eb6f 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/early_manage/service/early_deferral/dao/AlmEarlyDeferralDetail.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/early_manage/service/early_deferral/dao/AlmEarlyDeferralDetail.java @@ -1,6 +1,7 @@ package org.nl.wms.early_manage.service.early_deferral.dao; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import lombok.Data; @@ -8,7 +9,7 @@ import lombok.EqualsAndHashCode; /** *

- * + * *

* * @author generator @@ -20,7 +21,7 @@ import lombok.EqualsAndHashCode; public class AlmEarlyDeferralDetail implements Serializable { private static final long serialVersionUID = 1L; - + @TableId private String detail_id; private String deferral_id; diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/early_manage/service/early_dtl/dao/AlmEarlyDtl.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/early_manage/service/early_dtl/dao/AlmEarlyDtl.java index c15122f1..79717fdc 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/early_manage/service/early_dtl/dao/AlmEarlyDtl.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/early_manage/service/early_dtl/dao/AlmEarlyDtl.java @@ -1,5 +1,6 @@ package org.nl.wms.early_manage.service.early_dtl.dao; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import lombok.Data; @@ -23,6 +24,7 @@ public class AlmEarlyDtl implements Serializable { /** * 安全库存方案id */ + @TableId private String alm_id; /** diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/devicemanage/DeviceManageController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/devicemanage/DeviceManageController.java new file mode 100644 index 00000000..9216c430 --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/devicemanage/DeviceManageController.java @@ -0,0 +1,74 @@ +package org.nl.wms.pda_manage.devicemanage; + + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.commons.lang3.StringUtils; +import org.nl.common.TableDataInfo; +import org.nl.common.anno.Log; +import org.nl.common.domain.exception.BadRequestException; +import org.nl.common.domain.exception.handler.ApiError; +import org.nl.wms.dispatch_manage.point.service.ISchBasePointService; +import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint; +import org.nl.wms.external_system.acs.service.AcsToWmsService; +import org.nl.wms.external_system.acs.service.WmsToAcsService; +import org.nl.wms.pda_manage.palletio.service.PalletIostorinvService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.text.Format; + +/** + *

+ * 出入库单主表 前端控制器 + *

+ * + * @author generator + * @since 2024-03-28 + */ +@RestController +@RequestMapping("api/deviceManage") +public class DeviceManageController { + + @Autowired + private WmsToAcsService wmsToAcsService; + @Autowired + private ISchBasePointService iSchBasePointService; + + + @PostMapping("/changeMode/switchInOut") + @SaIgnore + @Log("切换出入库模式") + public ResponseEntity changeModeIO(@RequestBody JSONObject form) { + wmsToAcsService.changeMode(form.getString("device_code"),"switchInOut",form.getString("mode")); + return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK); + } + @PostMapping("/changeMode/pinkStartStop") + @SaIgnore + @Log("切换拣选工位启停模式") + public ResponseEntity changeModePick(@RequestBody JSONObject form) { + wmsToAcsService.changeMode(form.getString("device_code"),"pinkStartStop",form.getString("mode")); + return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK); + } + @PostMapping("/toCommandTP") + @SaIgnore + @Log("下发输送线运动命令") + public ResponseEntity toCommandTP(@RequestBody JSONObject form) { + String device_code = form.getString("device_code"); + SchBasePoint code = iSchBasePointService.getOne(new QueryWrapper().eq("code", device_code)); + if (code!=null && !code.getIs_used()){ + return new ResponseEntity<>(ApiError.error(String.format("输送线%s模式不正确不允许下发运动",device_code)),HttpStatus.OK); + } + wmsToAcsService.toCommand(device_code,form.getString("cmd")); + return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK); + } + + +} + diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/group/GroupController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/group/GroupController.java new file mode 100644 index 00000000..b8a546cd --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/group/GroupController.java @@ -0,0 +1,49 @@ +package org.nl.wms.pda_manage.group; + + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import org.nl.common.TableDataInfo; +import org.nl.common.anno.Log; +import org.nl.wms.pda_manage.palletio.service.PalletIostorinvService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 出入库单主表 前端控制器 + *

+ * + * @author generator + * @since 2024-03-28 + */ +@RestController +@RequestMapping("api/group") +public class GroupController { + + @Autowired + private PalletIostorinvService palletIostorinvService; + + + @PostMapping("in") + @SaIgnore + @Log("手持托盘入库") + public ResponseEntity inStorage(@RequestBody JSONObject form) { + palletIostorinvService.inStorage(form); + return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK); + } + @PostMapping("out") + @SaIgnore + @Log("手持托盘出库") + public ResponseEntity outStorage(@RequestBody JSONObject form) { + palletIostorinvService.outStorage(form); + return new ResponseEntity<>(HttpStatus.OK); + } + +} + diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/IOStorageController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/IOStorageController.java new file mode 100644 index 00000000..6ad3695c --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/IOStorageController.java @@ -0,0 +1,68 @@ +package org.nl.wms.pda_manage.iostorage; + + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.apache.commons.lang3.StringUtils; +import org.nl.common.TableDataInfo; +import org.nl.common.anno.Log; +import org.nl.common.domain.exception.BadRequestException; +import org.nl.common.enums.StatusEnum; +import org.nl.wms.flow_manage.flow.service.execution.IActRuExecutionService; +import org.nl.wms.flow_manage.flow.service.execution.dao.ActRuExecution; +import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService; +import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater; +import org.nl.wms.pda_manage.palletio.service.PalletIostorinvService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 出入库单主表 前端控制器 + *

+ * + * @author generator + * @since 2024-03-28 + */ +@RestController +@RequestMapping("api/ioStorage") +public class IOStorageController { + + @Autowired + private IMdPbVehicleMaterService iMdPbVehicleMaterService; + @Autowired + private IActRuExecutionService iActRuExecutionService; + + + @PostMapping("out") + @SaIgnore + @Log("出库却润") + public ResponseEntity outStorage(@RequestBody JSONObject form) { + String vehicle_code = form.getString("vehicle_code"); + MdPbVehicleMater one = iMdPbVehicleMaterService.getOne(new QueryWrapper() + .eq("vehicle_code", vehicle_code).eq("is_delete", false)); + String proc_inst_id = one.getProc_inst_id(); + if (!StringUtils.isEmpty(proc_inst_id)){ + String parent_id = iActRuExecutionService.getParentByChild(proc_inst_id); + ActRuExecution ruExecution = iActRuExecutionService.getOne(new QueryWrapper() + .eq("proc_inst_id",parent_id) + .lt("status", StatusEnum.FLOW_STATUS.code("完成"))); + if (ruExecution!=null){ + throw new BadRequestException(String.format("当前载具%s业务流程%s未完成",vehicle_code,parent_id)); + } + } + iMdPbVehicleMaterService.update(new UpdateWrapper() + .set("is_delete",true) + .eq("id",one.getId())); + return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK); + } + +} + diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/controller/logserver/LuceneLogController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/controller/logserver/LuceneLogController.java new file mode 100644 index 00000000..f216ee30 --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/controller/logserver/LuceneLogController.java @@ -0,0 +1,70 @@ +package org.nl.wms.system_manage.controller.logserver; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.anno.Log; + +import org.nl.wms.system_manage.service.logserver.LogQuery; +import org.nl.wms.system_manage.service.logserver.LuceneLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +/** + * @author ldjun + * @version 1.0 + * @date 2023年01月29日 18:55 + * @desc desc + */ + +@RestController +@RequestMapping("/api/esLog") +@Slf4j +public class LuceneLogController { + + @Autowired + private LuceneLogService luceneLogService; + + + @GetMapping("/labels/{type}") + //("获取标签") + public ResponseEntity labelsValues(@PathVariable String type) { + return new ResponseEntity<>(luceneLogService.getLabelsValues(type), HttpStatus.OK); + } + + @PostMapping("/query") + //("日志查询") + public ResponseEntity queryAll(@RequestBody LogQuery query) { + return new ResponseEntity<>(luceneLogService.query(query), HttpStatus.OK); + } + @DeleteMapping("/clearLogs") + //("清空日志") + public ResponseEntity clearLogs(@RequestBody LogQuery query) { + luceneLogService.clearLogs(query); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/thread") + @SaIgnore + @Log("线程追踪测试") + //("清空日志") + public ResponseEntity thread(@RequestBody LogQuery query) { + log.info("线程链路测试"+Thread.currentThread().getName()); + log.error("线程链路测试"+Thread.currentThread().getName()); + luceneLogService.syncdemo(); + Thread thread = new Thread(()->{ + try { + Thread.sleep(5000); + log.info("线程链路测试"+Thread.currentThread().getName()); + log.error("线程链路测试"+Thread.currentThread().getName()); + log.info("线程链路测试"+Thread.currentThread().getName()); + }catch (Exception ex){ + ex.printStackTrace(); + } + }); + thread.start(); + return new ResponseEntity<>(HttpStatus.OK); + } + +} diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/logserver/LogQuery.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/logserver/LogQuery.java new file mode 100644 index 00000000..da094e38 --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/logserver/LogQuery.java @@ -0,0 +1,47 @@ +package org.nl.wms.system_manage.service.logserver; + +import lombok.Data; + +import java.util.Date; + +/* + * @author ZZQ + * @Date 2023/2/8 5:18 下午 + */ +@Data +public class LogQuery { + /** + * 创建时间范围查询 + */ + private Date startTime; + private Date endTime; + /** + * 追踪id + */ + private String traceId; + private String requestMethod; + /** + * 日志内容模糊匹配 + */ + private String message; + /** + * 日志级别 + */ + private String logLevel; + /** + * 系统标签 + */ + private String system; + /** + * 是否只查询Http相关请求 + */ + private Boolean isRequest = Boolean.TRUE; + /** + * 是否过滤wql日志 + */ + private Boolean filterSql = Boolean.TRUE; + + private Integer size = 20; + + private Integer page = 1; +} diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/logserver/LogRepositoryDTO.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/logserver/LogRepositoryDTO.java new file mode 100644 index 00000000..7bdc0f30 --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/logserver/LogRepositoryDTO.java @@ -0,0 +1,27 @@ +package org.nl.wms.system_manage.service.logserver; + +import lombok.Data; +import org.springframework.data.annotation.Id; + +/* + * @author ZZQ + * @Date 2023/2/8 4:06 下午 + */ +//@Document(indexName = "#{@ESConfig.index}", type = "mes_log") +@Data +public class LogRepositoryDTO { + + private String message; + private String host; + private String logLevel; + private String logger; + private String requestTime; + private String requestIp; + @Id + private String id; + private String traceId; + private String requestMethod; + private String thread; + private String system; + +} diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/logserver/LuceneLogService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/logserver/LuceneLogService.java new file mode 100644 index 00000000..1ec06a96 --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/logserver/LuceneLogService.java @@ -0,0 +1,32 @@ +package org.nl.wms.system_manage.service.logserver; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * @author ldjun + * @version 1.0 + * @date 2023年02月07日 14:34 + * @desc desc + */ +public interface LuceneLogService { + + /** + * 清空日志 + */ + void clearLogs(LogQuery query); + /** + * 获取labels和values树 + * @return + */ + JSONArray getLabelsValues(String type); + + /** + * 日志查询 + * @param logQuery + * @return + */ + JSONObject query(LogQuery logQuery); + + void syncdemo(); +} diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/logserver/LuceneLogServiceImpl.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/logserver/LuceneLogServiceImpl.java new file mode 100644 index 00000000..6d682453 --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/logserver/LuceneLogServiceImpl.java @@ -0,0 +1,172 @@ +package org.nl.wms.system_manage.service.logserver; + +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.db.PageResult; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.lucene.document.Document; +import org.apache.lucene.index.DirectoryReader; +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.Term; +import org.apache.lucene.queryparser.classic.QueryParser; +import org.apache.lucene.search.*; +import org.apache.lucene.store.FSDirectory; +import org.apache.lucene.util.BytesRef; +import org.nl.common.domain.exception.BadRequestException; +import org.nl.config.lucene.LuceneAppender; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.wltea.analyzer.lucene.IKAnalyzer; + +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +@Service +@Slf4j +public class LuceneLogServiceImpl implements LuceneLogService { + + static String[] INFO_LEVEL = new String[]{"DEBUG","INFO","WARN","ERROR"}; + + @Value("${lucene.index.path}") + private String indexUrl; + + @Override + public void clearLogs(LogQuery query) { + try { + IndexWriter indexWriter = LuceneAppender.indexWriter; + if (indexWriter != null){ + BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder(); + DateTime offset = DateUtil.offset(new Date(), DateField.HOUR_OF_DAY, -10); + TermRangeQuery termRangeQuery = new TermRangeQuery( + "requestTime",null, + new BytesRef(DateUtil.format(offset, "yyyy-MM-dd HH:mm:ss.SSS")), true, true); + booleanQueryBuilder.add(termRangeQuery,BooleanClause.Occur.MUST); + indexWriter.deleteDocuments(termRangeQuery); + indexWriter.commit(); + } + }catch (Exception ex){ + throw new BadRequestException("删除失败:"+ex.getMessage()); + } + } + + @Override + public JSONArray getLabelsValues(String type) { + JSONArray result = new JSONArray(); + for (String v : INFO_LEVEL) { + JSONObject item = new JSONObject(); + item.put("label", v); + item.put("value", v); + result.add(item); + } + return result; + } + + + @Override + public JSONObject query(LogQuery logQuery) { + JSONObject res = new JSONObject(); + PageResult page = new PageResult(); + page.setPage(logQuery.getPage()); + page.setPageSize(logQuery.getSize()); + try { + FSDirectory directory = FSDirectory.open(Paths.get(indexUrl)); + DirectoryReader open = DirectoryReader.open(directory); + IndexSearcher searcher = new IndexSearcher(open); + // 创建排序对象,需要排序字段SortField,参数:字段的名称、字段的类型、是否反转如果是false,升序。true降序 + BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder(); + //时间范围查询 + Date startDate = logQuery.getStartTime(); + Date endDate = logQuery.getEndTime(); + + if (startDate == null){ + Calendar calendar=Calendar.getInstance(); + calendar.set(1970, 0, 1); + startDate = calendar.getTime(); } + if (endDate == null){ endDate = new DateTime(); } + TermRangeQuery termRangeQuery = new TermRangeQuery( + "requestTime", + new BytesRef(DateUtil.format(startDate, "yyyy-MM-dd HH:mm:ss.SSS")), + new BytesRef(DateUtil.format(endDate, "yyyy-MM-dd HH:mm:ss.SSS")), true, true); + booleanQueryBuilder.add(termRangeQuery,BooleanClause.Occur.MUST); + + // 字段之间的与或非关系,MUST表示and,MUST_NOT表示not,SHOULD表示or,有几个fields就必须有几个clauses + if (ObjectUtil.isNotEmpty(logQuery.getTraceId())){ + TermQuery termQuery = new TermQuery(new Term("traceId", logQuery.getTraceId())); + booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); + } + if (ObjectUtil.isNotEmpty(logQuery.getLogLevel())){ + TermQuery termQuery = new TermQuery(new Term("logLevel", logQuery.getLogLevel())); + booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); + } + if (ObjectUtil.isNotEmpty(logQuery.getSystem())) { + TermQuery termQuery = new TermQuery(new Term("system", logQuery.getSystem())); + booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); + } + if (ObjectUtil.isNotEmpty(logQuery.getRequestMethod())) { + TermQuery termQuery = new TermQuery(new Term("requestMethod", logQuery.getRequestMethod())); + booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST); + } + if (Boolean.TRUE.equals(logQuery.getIsRequest())) { + Term traceid = new Term("traceId"); + TermQuery termQuery = new TermQuery(traceid); + booleanQueryBuilder.add(termQuery, BooleanClause.Occur.MUST_NOT); + } + if (ObjectUtil.isNotEmpty(logQuery.getMessage())){ + //查询解析器 + QueryParser queryParser = new QueryParser("message", new IKAnalyzer(true)); + Query query = queryParser.parse(logQuery.getMessage()); + booleanQueryBuilder.add(query, BooleanClause.Occur.MUST); + } + + TopFieldCollector collector = TopFieldCollector.create(new Sort(new SortField("time", SortField.Type.LONG,true)), 20000, 0); + searcher.search(booleanQueryBuilder.build(), collector); + TopDocs topDocs = collector.topDocs((logQuery.getPage()-1)*logQuery.getSize(), logQuery.getSize()); + int totalSize = collector.getTotalHits(); + ScoreDoc[] scoreDocs = topDocs.scoreDocs; + + List list = new ArrayList<>(); + for (ScoreDoc scoreDoc : scoreDocs) { + Document doc = open.document(scoreDoc.doc); + LogRepositoryDTO dto = new LogRepositoryDTO(); + dto.setSystem(doc.get("system")); + dto.setTraceId(doc.get("traceId")); + dto.setLogger(doc.get("logger")); + dto.setLogLevel(doc.get("logLevel")); + dto.setMessage(doc.get("message")); + dto.setRequestIp(doc.get("requestIp")); + dto.setRequestMethod(doc.get("requestMethod")); + dto.setRequestTime(doc.get("requestTime")); + dto.setThread(doc.get("thread")); + list.add(dto); + } + open.close(); + directory.close(); + page.addAll(list); + page.setTotal(scoreDocs.length); + res.put("total", totalSize); + }catch (Exception ex){ + ex.printStackTrace(); + } + res.put("page",page); + return res; + + } + + + @Override + @Async + public void syncdemo() { + log.info("Async线程链路测试"+Thread.currentThread().getName()); + log.error("Async线程链路测试"+Thread.currentThread().getName()); + log.info("Async线程链路测试"+Thread.currentThread().getName()); + log.info("线程链路测试"+Thread.currentThread().getName()); + } +}