fix - 彻底优化日志
This commit is contained in:
100
api/src/main/java/com/sv/api/aop/ControllerLogAspect.java
Normal file
100
api/src/main/java/com/sv/api/aop/ControllerLogAspect.java
Normal file
@@ -0,0 +1,100 @@
|
||||
package com.sv.api.aop;
|
||||
|
||||
import com.ydd.framework.core.common.dto.ResponseDTO;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.annotation.Around;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.lang.annotation.Pointcut;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
@Aspect
|
||||
@Component
|
||||
public class ControllerLogAspect {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger("CONTROLLER-LOG-NAME");
|
||||
|
||||
private static final String[] SENSITIVE_PARAMS = {"access_token", "password", "pwd"};
|
||||
|
||||
@Pointcut("execution(* com.sv.api.controller..*.*(..)) || execution(* com.sv.netty.controller..*.*(..))")
|
||||
public void controllerPointcut() {
|
||||
}
|
||||
|
||||
@Around("controllerPointcut()")
|
||||
public Object logRequestResponse(ProceedingJoinPoint pjp) throws Throwable {
|
||||
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
|
||||
|
||||
String method = request.getMethod();
|
||||
String uri = request.getRequestURI();
|
||||
String queryString = sanitizeQueryString(request.getQueryString());
|
||||
String remoteAddr = request.getRemoteAddr();
|
||||
|
||||
Integer memberId = (Integer) request.getAttribute("current_member_id");
|
||||
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
StringBuilder reqLog = new StringBuilder();
|
||||
reqLog.append("[WEB] ").append(method).append(" ").append(uri);
|
||||
if (queryString != null) {
|
||||
reqLog.append("?").append(queryString);
|
||||
}
|
||||
reqLog.append(" | from=").append(remoteAddr);
|
||||
if (memberId != null) {
|
||||
reqLog.append(" | memberId=").append(memberId);
|
||||
}
|
||||
|
||||
Object result;
|
||||
try {
|
||||
result = pjp.proceed();
|
||||
} catch (Throwable t) {
|
||||
long cost = System.currentTimeMillis() - startTime;
|
||||
log.warn(reqLog + " | ERROR=" + t.getClass().getSimpleName() + "[" + t.getMessage() + "] | cost=" + cost + "ms");
|
||||
throw t;
|
||||
}
|
||||
|
||||
long cost = System.currentTimeMillis() - startTime;
|
||||
|
||||
if (result instanceof ResponseDTO) {
|
||||
ResponseDTO dto = (ResponseDTO) result;
|
||||
Object errCode = dto.get(ResponseDTO.ERR_CODE);
|
||||
Object errMsg = dto.get(ResponseDTO.ERR_MSG);
|
||||
dto.remove(ResponseDTO.TIMESTAMP);
|
||||
if (errCode != null && !"0".equals(String.valueOf(errCode))) {
|
||||
log.warn(reqLog + " | errCode=" + errCode + ", errMsg=" + errMsg + " | keys=" + dto.keySet() + " | cost=" + cost + "ms");
|
||||
} else {
|
||||
log.info(reqLog + " | keys=" + dto.keySet() + " | cost=" + cost + "ms");
|
||||
}
|
||||
} else {
|
||||
log.info(reqLog + " | responseType=" + result.getClass().getSimpleName() + " | cost=" + cost + "ms");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private String sanitizeQueryString(String qs) {
|
||||
if (qs == null) return null;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (String param : qs.split("&")) {
|
||||
if (sb.length() > 0) sb.append("&");
|
||||
String[] kv = param.split("=", 2);
|
||||
if (isSensitive(kv[0])) {
|
||||
sb.append(kv[0]).append("=***");
|
||||
} else {
|
||||
sb.append(param);
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private boolean isSensitive(String name) {
|
||||
for (String s : SENSITIVE_PARAMS) {
|
||||
if (s.equalsIgnoreCase(name)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -136,45 +136,55 @@ public class VenueController extends BaseApiController {
|
||||
*/
|
||||
@RequestMapping(value = "/venue/join", method = RequestMethod.GET)
|
||||
public ResponseDTO join(@RequestParam("venueId") Integer venueId) {
|
||||
Integer memberId = getMemberIdByAccessToken();
|
||||
logger.info("[入场] memberId={}, venueId={}", memberId, venueId);
|
||||
Device byDevice = deviceService.findByDevice(venueId);
|
||||
BasketEnterResult join = new BasketEnterResult();
|
||||
if (byDevice == null) {
|
||||
join.setFlg(999);
|
||||
join.setMsg("通讯异常,门禁设备离线中");
|
||||
logger.warn("[入场] memberId={}, venueId={}, 门禁设备离线", memberId, venueId);
|
||||
return ResponseDTO.ok().addAttribute("join", join);
|
||||
}
|
||||
String doorSn = byDevice.getName();
|
||||
boolean lockStat = doorLockUtil.checkDoorLock(doorSn);
|
||||
if (lockStat) {
|
||||
logger.warn("[入场] memberId={}, venueId={}, 门锁被占用 doorSn={}", memberId, venueId, doorSn);
|
||||
throw new ServiceException("有人正在使用门禁,请稍后再试");
|
||||
}
|
||||
Integer memberId = getMemberIdByAccessToken();
|
||||
join = venueEnterService.join(memberId, venueId);
|
||||
logger.info("[入场] 结果 memberId={}, venueId={}, flg={}, msg={}, orderSn={}",
|
||||
memberId, venueId, join.getFlg(), join.getMsg(), join.getOrderSn());
|
||||
return ResponseDTO.ok().addAttribute("join", join);
|
||||
}
|
||||
|
||||
/**
|
||||
* 我要进场
|
||||
* 我要出场
|
||||
*
|
||||
* @param venueId 场馆Id
|
||||
* @return
|
||||
*/
|
||||
@RequestMapping(value = "/venue/out", method = RequestMethod.GET)
|
||||
public ResponseDTO out(@RequestParam("venueId") Integer venueId) {
|
||||
Integer memberId = getMemberIdByAccessToken();
|
||||
logger.info("[出场] memberId={}, venueId={}", memberId, venueId);
|
||||
Device byDevice = deviceService.findByDevice(venueId);
|
||||
BasketEnterResult out = new BasketEnterResult();
|
||||
if (byDevice == null) {
|
||||
out.setFlg(999);
|
||||
out.setMsg("通讯异常,门禁设备离线中");
|
||||
logger.warn("[出场] memberId={}, venueId={}, 门禁设备离线", memberId, venueId);
|
||||
return ResponseDTO.ok().addAttribute("out", out);
|
||||
}
|
||||
String doorSn = byDevice.getName();
|
||||
boolean lockStat = doorLockUtil.checkDoorLock(doorSn);
|
||||
if (lockStat) {
|
||||
logger.warn("[出场] memberId={}, venueId={}, 门锁被占用 doorSn={}", memberId, venueId, doorSn);
|
||||
throw new ServiceException("有人正在使用门禁,请稍后再试");
|
||||
}
|
||||
Integer memberId = getMemberIdByAccessToken();
|
||||
out = venueEnterService.out(memberId, venueId);
|
||||
logger.info("[出场] 结果 memberId={}, venueId={}, flg={}, msg={}, orderSn={}",
|
||||
memberId, venueId, out.getFlg(), out.getMsg(), out.getOrderSn());
|
||||
return ResponseDTO.ok().addAttribute("out", out);
|
||||
}
|
||||
|
||||
@@ -186,6 +196,8 @@ public class VenueController extends BaseApiController {
|
||||
*/
|
||||
@RequestMapping(value = "/venue/generate/barcode", method = RequestMethod.POST)
|
||||
public ResponseDTO generateBarcode(@RequestParam("orderSn") String orderSn,@RequestParam("venueId") Integer venueId,@RequestParam("enterFlag")Integer enterFlag) {
|
||||
Integer memberId = getMemberIdByAccessToken();
|
||||
logger.info("[生成二维码] memberId={}, venueId={}, orderSn={}, enterFlag={}", memberId, venueId, orderSn, enterFlag);
|
||||
Device byDevice = deviceService.findByDevice(venueId);
|
||||
if (byDevice == null) {
|
||||
throw new ServiceException("门禁通讯异常");
|
||||
@@ -195,12 +207,12 @@ public class VenueController extends BaseApiController {
|
||||
if (lockStat) {
|
||||
throw new ServiceException("有人正在使用门禁,请稍后再试");
|
||||
}
|
||||
Integer memberId = getMemberIdByAccessToken();
|
||||
EnterEnum enterEnum = EnterEnum.OUT;
|
||||
if (enterFlag != null) {
|
||||
enterEnum = EnterEnum.getByValue(enterFlag);
|
||||
}
|
||||
String barcode = barcodeService.newBarcode(doorSn,orderSn,enterEnum,venueId,memberId);
|
||||
logger.info("[生成二维码] 成功 memberId={}, barcode={}", memberId, barcode);
|
||||
return ResponseDTO.ok().addAttribute("barcode", barcode);
|
||||
}
|
||||
|
||||
@@ -210,6 +222,8 @@ public class VenueController extends BaseApiController {
|
||||
@RequestMapping(value = "/venue/basketball/pay", method = RequestMethod.POST)
|
||||
@AccessToken
|
||||
public ResponseDTO basketPay(@RequestParam("venueId") Integer venueId,@RequestParam("enterFlag")Integer enterFlag,@RequestParam("payMoney") Double payMoney){
|
||||
Integer memberId = getMemberIdByAccessToken();
|
||||
logger.info("[篮球下单] memberId={}, venueId={}, enterFlag={}, payMoney={}", memberId, venueId, enterFlag, payMoney);
|
||||
Device byDevice = deviceService.findByDevice(venueId);
|
||||
if (byDevice == null) {
|
||||
throw new ServiceException("门禁通讯异常");
|
||||
@@ -219,11 +233,12 @@ public class VenueController extends BaseApiController {
|
||||
if (lockStat) {
|
||||
throw new ServiceException("有人正在使用门禁,请稍后再试");
|
||||
}
|
||||
Integer memberId = getMemberIdByAccessToken();
|
||||
BasketballPayResult result = orderService.createEnterVenueOrder(venueId, memberId, enterFlag, PayTypeEnum.WEI_XIN, new BigDecimal(payMoney));
|
||||
if (result.getPaidFlag()) {
|
||||
logger.info("[篮球下单] 支付成功 memberId={}, orderSn={}", memberId, result.getOrderSn());
|
||||
return ResponseDTO.ok().addAttribute("paid_flag", true).addAttribute("order_sn", result.getOrderSn());
|
||||
}
|
||||
logger.info("[篮球下单] 等待支付 memberId={}, orderSn={}", memberId, result.getOrderSn());
|
||||
return ResponseDTO.ok().
|
||||
addAttribute("paid_flag", false).
|
||||
addAttribute("order_sn", result.getOrderSn()).
|
||||
|
||||
@@ -29,17 +29,16 @@ public class WXPayNotifyController {
|
||||
|
||||
/**
|
||||
* 微信支付后的回调处理
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping(value = "/Notify", method = RequestMethod.POST)
|
||||
public WechatNotifyResponse notify(HttpServletRequest request) {
|
||||
try {
|
||||
Map<String,String> params = XMLUtils.toMap(request.getInputStream());
|
||||
logger.info("[微信回调] 支付通知 params={}", params);
|
||||
orderService.notifyWx(params);
|
||||
} catch (Exception e) {
|
||||
logger.error("微信支付回调验证出错", e);
|
||||
logger.error("[微信回调] 支付通知处理异常", e);
|
||||
return new WechatNotifyResponse("FAIL", "ok");
|
||||
}
|
||||
return new WechatNotifyResponse("SUCCESS", "ok");
|
||||
@@ -53,9 +52,10 @@ public class WXPayNotifyController {
|
||||
public WechatNotifyResponse refund(HttpServletRequest request) {
|
||||
try {
|
||||
Map<String,String> params = XMLUtils.toMap(request.getInputStream());
|
||||
logger.info("[微信回调] 退款通知 params={}", params);
|
||||
memberRefundService.notifyRefund(params,PlatformContext.getValue());
|
||||
}catch (Exception e){
|
||||
logger.error("微信支付回调验证出错", e);
|
||||
logger.error("[微信回调] 退款通知处理异常", e);
|
||||
return new WechatNotifyResponse("FAIL", "ok");
|
||||
}
|
||||
return new WechatNotifyResponse("SUCCESS", "ok");
|
||||
|
||||
46
api/src/main/java/com/sv/api/filter/TraceFilter.java
Normal file
46
api/src/main/java/com/sv/api/filter/TraceFilter.java
Normal file
@@ -0,0 +1,46 @@
|
||||
package com.sv.api.filter;
|
||||
|
||||
import org.slf4j.MDC;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.servlet.Filter;
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.FilterConfig;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.io.IOException;
|
||||
import java.util.UUID;
|
||||
|
||||
@Component
|
||||
public class TraceFilter implements Filter {
|
||||
|
||||
private static final String TRACE_ID = "traceId";
|
||||
|
||||
@Override
|
||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
||||
throws IOException, ServletException {
|
||||
try {
|
||||
String traceId = UUID.randomUUID().toString().replace("-", "").substring(0, 16);
|
||||
if (request instanceof HttpServletRequest) {
|
||||
String headerTraceId = ((HttpServletRequest) request).getHeader("X-Trace-Id");
|
||||
if (headerTraceId != null && !headerTraceId.isEmpty()) {
|
||||
traceId = headerTraceId;
|
||||
}
|
||||
}
|
||||
MDC.put(TRACE_ID, traceId);
|
||||
chain.doFilter(request, response);
|
||||
} finally {
|
||||
MDC.remove(TRACE_ID);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(FilterConfig filterConfig) throws ServletException {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
}
|
||||
}
|
||||
@@ -48,10 +48,13 @@ public class AdminNettyController extends BaseApiController {
|
||||
@RequestMapping(value = "/admin/enter/{id}", method = RequestMethod.POST)
|
||||
public ResponseDTO enter(@PathVariable("id") Integer id) {
|
||||
Device device = deviceService.findById(id);
|
||||
logger.info("[管理员入场] deviceId={}, deviceName={}, venueId={}", id, device != null ? device.getName() : null, device != null ? device.getVenueId() : null);
|
||||
if (!DeviceStatusEnum.ONLINE.value.equals(device.getStatus())){
|
||||
logger.warn("[管理员入场] 设备离线 deviceId={}", id);
|
||||
throw new ServiceException("设备离线!请检查连接");
|
||||
}
|
||||
messageService.adminEnter(device.getName(),device.getVenueId());
|
||||
logger.info("[管理员入场] 开门指令已发送 deviceId={}", id);
|
||||
return ResponseDTO.ok();
|
||||
}
|
||||
|
||||
@@ -62,13 +65,15 @@ public class AdminNettyController extends BaseApiController {
|
||||
@RequestMapping("/user/check/barcode")
|
||||
public ResponseDTO uploadLog(@RequestParam("code") String code) {
|
||||
code = code.substring(1,code.length()-1);
|
||||
logger.info("核销二维码开门了...");
|
||||
String offline = MakeCode.decodeOfflineCode(code);
|
||||
logger.info("[核销二维码] code={}, isOffline={}", code, offline.startsWith("venue-"));
|
||||
if (offline.startsWith("venue-")) {
|
||||
// 这是线下开门的逻辑
|
||||
messageService.offlineOpenDoor(code);
|
||||
} else {
|
||||
VenueBarCode venueBarCode = MakeCode.decodeCode(code);
|
||||
logger.info("[核销二维码] 解析结果: memberId={}, venueId={}, direction={}, deviceName={}",
|
||||
venueBarCode.getMemberId(), venueBarCode.getVenueId(),
|
||||
venueBarCode.getDirection(), venueBarCode.getDeviceName());
|
||||
if (EnterEnum.ENTER.getValue() == venueBarCode.getDirection()) {
|
||||
messageService.enterVenue(code);
|
||||
} else {
|
||||
@@ -81,18 +86,16 @@ public class AdminNettyController extends BaseApiController {
|
||||
@RequestMapping(value = "/admin/out/{id}", method = RequestMethod.POST)
|
||||
public ResponseDTO out(@PathVariable("id") Integer id) {
|
||||
Device device = deviceService.findById(id);
|
||||
logger.info("[管理员出场] deviceId={}, deviceName={}, venueId={}", id, device != null ? device.getName() : null, device != null ? device.getVenueId() : null);
|
||||
if (!DeviceStatusEnum.ONLINE.value.equals(device.getStatus())){
|
||||
logger.warn("[管理员出场] 设备离线 deviceId={}", id);
|
||||
throw new ServiceException("设备离线!请检查连接");
|
||||
}
|
||||
messageService.adminOut(device.getName(),device.getVenueId());
|
||||
logger.info("[管理员出场] 开门指令已发送 deviceId={}", id);
|
||||
return ResponseDTO.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据字符串获取场馆
|
||||
* @param deviceId
|
||||
* @return
|
||||
*/
|
||||
private Integer getVenueId(String deviceId){
|
||||
String venueId = "0";
|
||||
if (deviceId!=null && deviceId.contains(NettyConstant.SPIT_WORD)){
|
||||
@@ -105,11 +108,6 @@ public class AdminNettyController extends BaseApiController {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据字符串获取设备号
|
||||
* @param deviceId
|
||||
* @return
|
||||
*/
|
||||
private String getDeviceName(String deviceId){
|
||||
if (deviceId!=null){
|
||||
return deviceId.split(NettyConstant.SPIT_WORD)[0];
|
||||
@@ -168,17 +166,19 @@ public class AdminNettyController extends BaseApiController {
|
||||
try (FileOutputStream fos = new FileOutputStream(fileName)) {
|
||||
fos.write(commLog.getBytes());
|
||||
}
|
||||
logger.info("[日志上传] deviceSn={}, 普通日志已保存 size={}", deviceSn, commLog.length());
|
||||
}
|
||||
if (errorLog != null) {
|
||||
String fileName = "/home/uploadlog/error-" + deviceSn + "-" + dateStr + "-client.log";
|
||||
try (FileOutputStream fos = new FileOutputStream(fileName)) {
|
||||
fos.write(errorLog.getBytes());
|
||||
}
|
||||
logger.info("[日志上传] deviceSn={}, 错误日志已保存 size={}", deviceSn, errorLog.length());
|
||||
}
|
||||
logger.info("log received from device: " + deviceSn);
|
||||
logger.info("[日志上传] deviceSn={} 处理完成", deviceSn);
|
||||
return ResponseDTO.ok();
|
||||
} catch (Exception e) {
|
||||
logger.error("receive log fail", e);
|
||||
logger.error("[日志上传] 处理失败", e);
|
||||
throw new ServiceException("receive log fail");
|
||||
}
|
||||
}
|
||||
@@ -217,6 +217,7 @@ public class AdminNettyController extends BaseApiController {
|
||||
String barcodeSn = "venue-" + l;
|
||||
String barcode = MakeCode.makeOfflineCode(barcodeSn);
|
||||
deviceService.makeDeviceBarcode(device.getName(),device.getVenueId(),barcode);
|
||||
logger.info("[线下二维码] 生成 doorSn={}, venueId={}, barcodeSn={}", doorSn, device.getVenueId(), barcodeSn);
|
||||
|
||||
String documentPath = getDocument(barcode,barcodeSn);
|
||||
response.setHeader("Content-disposition","attachment; filename=" + barcodeSn + ".docx");
|
||||
@@ -232,8 +233,7 @@ public class AdminNettyController extends BaseApiController {
|
||||
}
|
||||
doorLockUtil.lockBarcode(doorSn);
|
||||
} catch (Exception e) {
|
||||
logger.error(e.getMessage(), e);
|
||||
logger.info("文件下载失败", e.getMessage());
|
||||
logger.error("[线下二维码] 下载失败 doorSn={}", doorSn, e);
|
||||
throw e;
|
||||
} finally {
|
||||
fin.close();
|
||||
@@ -249,24 +249,14 @@ public class AdminNettyController extends BaseApiController {
|
||||
paragraph.setAlignment(ParagraphAlignment.CENTER);
|
||||
XWPFRun run = paragraph.createRun();
|
||||
|
||||
// 入场二维码
|
||||
run.setText("订单号:" + barcodeSn);
|
||||
run.addBreak();
|
||||
// 入场二维码
|
||||
run.setText("二维码使用有效期为2小时,请及时离场!");
|
||||
run.addBreak();
|
||||
String imgFile = VenueBarcodeUtil.generateBarcode(barcode,barcodeSn + ".jpg");
|
||||
int imgFormat = XWPFDocument.PICTURE_TYPE_JPEG;
|
||||
run.addPicture(new FileInputStream(imgFile), imgFormat, "image description",
|
||||
Units.toEMU(200), Units.toEMU(200));
|
||||
// run.addBreak(BreakType.PAGE);
|
||||
// // 出场二维码
|
||||
// run.setText("出场二维码");
|
||||
// run.addBreak();
|
||||
// String imgFile2 = VenueBarcodeUtil.generateBarcode("jdoiawjdoiawioe2","202311162.jpg");
|
||||
// run.addPicture(new FileInputStream(imgFile2), imgFormat, "image description",
|
||||
// Units.toEMU(200), Units.toEMU(200));
|
||||
// 保存文件
|
||||
document.write(new FileOutputStream(newFilePath));
|
||||
document.close();
|
||||
return newFilePath;
|
||||
|
||||
@@ -40,11 +40,6 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
|
||||
private Logger logger = LoggerFactory.getLogger("NETTY-LOG-NAME");
|
||||
|
||||
/**
|
||||
* 存储设备通道类型
|
||||
* 此处存储客户端的channel 信息key 为 【deviceId + venueId】
|
||||
* value: 1Tcp 2WebSocket
|
||||
*/
|
||||
private ConcurrentMap<String, Channel> links = PlatformDependent.newConcurrentHashMap();
|
||||
|
||||
@Resource
|
||||
@@ -85,23 +80,23 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
*/
|
||||
@Override
|
||||
public void online(String clientId, Channel channel, HeartBeat heartBeat) {
|
||||
logger.info("=========" + JsonUtils.encode(heartBeat) + clientId);
|
||||
String deviceName = heartBeat.getDeviceName();
|
||||
Integer venueId = heartBeat.getVenueId();
|
||||
logger.info("[心跳] clientId={}, deviceName={}, venueId={}", clientId, deviceName, venueId);
|
||||
|
||||
Channel oldChannel = getCurrentChannel(deviceName, venueId);
|
||||
if (oldChannel == null) {
|
||||
Venue thisVenue = venueService.findById(venueId);
|
||||
if (thisVenue == null ){
|
||||
logger.error("this client choose venue Error! venueId == " + venueId);
|
||||
logger.error("[心跳] 场馆不存在 deviceName={}, venueId={}", deviceName, venueId);
|
||||
} else {
|
||||
deviceService.online(deviceName, venueId, thisVenue.getType(), clientId);
|
||||
addLinks(deviceName, venueId, channel);
|
||||
logger.info("[心跳] 设备上线 deviceName={}, venueId={}", deviceName, venueId);
|
||||
}
|
||||
} else if (oldChannel != channel) {
|
||||
logger.info("New connection reporting heartbeat for device {}_{}, overwriting old channel.", deviceName, venueId);
|
||||
logger.info("[心跳] 设备重连 deviceName={}_venueId={}, 覆盖旧通道", deviceName, venueId);
|
||||
addLinks(deviceName, venueId, channel);
|
||||
// 也可能需要更新一下 IP
|
||||
Venue thisVenue = venueService.findById(venueId);
|
||||
if (thisVenue != null) {
|
||||
deviceService.online(deviceName, venueId, thisVenue.getType(), clientId);
|
||||
@@ -124,6 +119,7 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
if (currentChannel == null || currentChannel == channel) {
|
||||
removeChannelType(deviceName, venueId);
|
||||
deviceService.offline(deviceName, venueId);
|
||||
logger.warn("[设备下线] deviceName={}, venueId={}", deviceName, venueId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -137,25 +133,25 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
public void footballOpenDoor(Integer ticketId,Integer memberId) {
|
||||
MemberLessonTicket memberLessonTicket = memberLessonTicketMapper.findById(ticketId);
|
||||
if (memberLessonTicket == null) {
|
||||
logger.error("足球开门失败,未找到对应的订单!");
|
||||
logger.error("[足球开门] 未找到对应订单 ticketId={}, memberId={}", ticketId, memberId);
|
||||
throw new ServiceException("足球开门失败,未找到对应的订单!");
|
||||
}
|
||||
VenueLesson venueLesson = venueLessonMapper.findById(memberLessonTicket.getLessonId());
|
||||
LocalTime endTime = venueLesson.getEndTime();
|
||||
LocalTime startTime = venueLesson.getStartTime();
|
||||
if (!startTime.isBefore(LocalTime.now())) {
|
||||
logger.error("足球开门失败,订单尚未开始!");
|
||||
logger.error("[足球开门] 订单尚未开始 orderSn={}, startTime={}", memberLessonTicket.getOrderSn(), startTime);
|
||||
throw new ServiceException("开门失败,订单尚未开始!");
|
||||
}
|
||||
if (!endTime.isAfter(LocalTime.now().plus(15, ChronoUnit.MINUTES))) {
|
||||
logger.error("足球开门失败,订单已结束!");
|
||||
logger.error("[足球开门] 订单已结束 orderSn={}, endTime={}", memberLessonTicket.getOrderSn(), endTime);
|
||||
throw new ServiceException("足球开门失败,订单已结束!");
|
||||
}
|
||||
Device device = deviceService.findByDevice(memberLessonTicket.getVenueId());
|
||||
String doorSn = device.getName();
|
||||
boolean lockStat = doorLockUtil.checkDoorLock(doorSn);
|
||||
if (lockStat) {
|
||||
logger.error("有人正在操作,请稍后再出场!!!");
|
||||
logger.error("[足球开门] 门锁被占用 doorSn={}", doorSn);
|
||||
throw new ServiceException("有人正在操作,请稍后再试");
|
||||
}
|
||||
Channel channel = getCurrentChannel(device.getName(), memberLessonTicket.getVenueId());
|
||||
@@ -170,8 +166,8 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
memberEnterVenueLog.setPayType(EnterVenuePayTypeEnum.WEI_XIN.getValue());
|
||||
memberEnterVenueLogService.save(memberEnterVenueLog);
|
||||
doorLockUtil.lockDoor(doorSn);
|
||||
// writeOffCode(barcode); 足球不需要二维码
|
||||
logger.info("用户" + member.getId() + "&" + member.getNickname() + "足球开门");
|
||||
logger.info("[足球开门] 成功 memberId={}, nickname={}, orderSn={}",
|
||||
member.getId(), member.getNickname(), memberLessonTicket.getOrderSn());
|
||||
ServerMessageUtils.INSTANCE.sendMsg(channel,new VenueMessage(MessageType.ENTER_DOOR,"OK"));
|
||||
}
|
||||
}
|
||||
@@ -185,28 +181,34 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
public void outVenue(String barcode) {
|
||||
VenueBarCode venueBarCode = MakeCode.decodeCode(barcode);
|
||||
String doorSn = venueBarCode.getDeviceName();
|
||||
logger.info("[扫码出场] 开始处理 memberId={}, venueId={}, deviceName={}",
|
||||
venueBarCode.getMemberId(), venueBarCode.getVenueId(), doorSn);
|
||||
boolean lockStat = doorLockUtil.checkDoorLock(doorSn);
|
||||
if (lockStat) {
|
||||
logger.error("有人正在操作,请稍后再出场!!!");
|
||||
throw new ServiceException("有人正在操作,请稍后再试");
|
||||
logger.error("[扫码出场] 门锁被占用 doorSn={}", doorSn);
|
||||
throw new ServiceException("有人正在操作,请稍后再出场!!!");
|
||||
}
|
||||
barcode = MakeCode.reWriteBarcode(barcode);
|
||||
if (!checkBarcode(barcode)){
|
||||
logger.error("二维码已经使用,无法出场");
|
||||
logger.error("[扫码出场] 二维码已使用 barcode={}", barcode);
|
||||
throw new ServiceException("二维码已经使用");
|
||||
}
|
||||
Channel channel = getCurrentChannel(doorSn,venueBarCode.getVenueId());
|
||||
if (channel == null) {
|
||||
logger.error("门禁异常");
|
||||
logger.error("[扫码出场] 门禁离线 doorSn={}, venueId={}", doorSn, venueBarCode.getVenueId());
|
||||
throw new ServiceException("门禁异常离线中");
|
||||
}
|
||||
Member member = memberService.findByMember(venueBarCode.getMemberId());
|
||||
if (member != null) {
|
||||
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueBarCode.getVenueId());
|
||||
if (lastOrder == null) {
|
||||
logger.error("[扫码出场] 未找到有效订单 memberId={}, venueId={}", member.getId(), venueBarCode.getVenueId());
|
||||
throw new ServiceException("未找到入场订单");
|
||||
}
|
||||
lastOrder.setLastOut(new Date());
|
||||
// 不需要补交钱且需要退钱
|
||||
if (lastOrder.getPayMoney() != null && lastOrder.getPayMoney().compareTo(java.math.BigDecimal.ZERO) > 0) {
|
||||
lastOrder.setModifiedTime(new Date());
|
||||
logger.info("[扫码出场] 有退款金额 orderSn={}, payMoney={}", lastOrder.getOrderSn(), lastOrder.getPayMoney());
|
||||
}
|
||||
barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder);
|
||||
MemberEnterVenueLog memberEnterVenueLog = new MemberEnterVenueLog();
|
||||
@@ -218,9 +220,12 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
memberEnterVenueLog.setVenueId(venueBarCode.getVenueId());
|
||||
memberEnterVenueLogService.save(memberEnterVenueLog);
|
||||
doorLockUtil.lockDoor(doorSn);
|
||||
logger.info("用户" + member.getId() + "&" + member.getNickname() + "出场");
|
||||
logger.info("[扫码出场] 成功 memberId={}, nickname={}, orderSn={}, venueId={}",
|
||||
member.getId(), member.getNickname(), lastOrder.getOrderSn(), venueBarCode.getVenueId());
|
||||
writeOffCode(barcode);
|
||||
ServerMessageUtils.INSTANCE.sendMsg(channel,new VenueMessage(MessageType.OUT_DOOR,"OK"));
|
||||
} else {
|
||||
logger.error("[扫码出场] 用户不存在 memberId={}", venueBarCode.getMemberId());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -233,24 +238,30 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
public void enterVenue(String barcode) {
|
||||
VenueBarCode venueBarCode = MakeCode.decodeCode(barcode);
|
||||
String doorSn = venueBarCode.getDeviceName();
|
||||
logger.info("[扫码入场] 开始处理 memberId={}, venueId={}, deviceName={}",
|
||||
venueBarCode.getMemberId(), venueBarCode.getVenueId(), doorSn);
|
||||
boolean lockStat = doorLockUtil.checkDoorLock(doorSn);
|
||||
if (lockStat) {
|
||||
logger.error("有人正在操作,请稍后再试");
|
||||
logger.error("[扫码入场] 门锁被占用 doorSn={}", doorSn);
|
||||
throw new ServiceException("有人正在操作,请稍后再试");
|
||||
}
|
||||
barcode = MakeCode.reWriteBarcode(barcode);
|
||||
if (!checkBarcode(barcode)){
|
||||
logger.error("二维码已经使用,无法入场");
|
||||
logger.error("[扫码入场] 二维码已使用 barcode={}", barcode);
|
||||
throw new ServiceException("二维码已经使用");
|
||||
}
|
||||
Channel channel = getCurrentChannel(doorSn, venueBarCode.getVenueId());
|
||||
if (channel == null) {
|
||||
logger.error("门禁异常");
|
||||
logger.error("[扫码入场] 门禁离线 doorSn={}, venueId={}", doorSn, venueBarCode.getVenueId());
|
||||
throw new ServiceException("门禁异常离线中");
|
||||
}
|
||||
Member member = memberService.findByMember(venueBarCode.getMemberId());
|
||||
if (member != null) {
|
||||
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueBarCode.getVenueId());
|
||||
if (lastOrder == null) {
|
||||
logger.error("[扫码入场] 未找到有效订单 memberId={}, venueId={}", member.getId(), venueBarCode.getVenueId());
|
||||
throw new ServiceException("未找到入场订单");
|
||||
}
|
||||
lastOrder.setLastEnter(new Date());
|
||||
lastOrder.setModifiedTime(new Date());
|
||||
barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder);
|
||||
@@ -264,25 +275,24 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
memberEnterVenueLogService.save(memberEnterVenueLog);
|
||||
doorLockUtil.lockDoor(doorSn);
|
||||
writeOffCode(barcode);
|
||||
logger.info("用户" + member.getId() + "&" + member.getNickname() + "入场");
|
||||
logger.info("[扫码入场] 成功 memberId={}, nickname={}, orderSn={}, venueId={}",
|
||||
member.getId(), member.getNickname(), lastOrder.getOrderSn(), venueBarCode.getVenueId());
|
||||
ServerMessageUtils.INSTANCE.sendMsg(channel,new VenueMessage(MessageType.ENTER_DOOR,"OK"));
|
||||
} else {
|
||||
logger.error("[扫码入场] 用户不存在 memberId={}", venueBarCode.getMemberId());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验二维码是否已被使用
|
||||
* @param barcode
|
||||
* @return
|
||||
*/
|
||||
private boolean checkBarcode(String barcode) {
|
||||
Barcode code = barcodeMapper.checkCodeStatus(barcode);
|
||||
if (code == null) {
|
||||
logger.error("二维码不存在或者已经被使用!!!");
|
||||
logger.error("[二维码校验] 二维码不存在 barcode={}", barcode);
|
||||
throw new ServiceException("二维码不存在或者已经被使用");
|
||||
}
|
||||
if (BarCodeStatusEnum.INIT.getValue()==code.getStatus()){
|
||||
return true;
|
||||
}
|
||||
logger.warn("[二维码校验] 二维码状态异常 barcode={}, status={}", barcode, code.getStatus());
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -290,10 +300,6 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
barcodeMapper.writeOffCode(barcode);
|
||||
}
|
||||
|
||||
/**
|
||||
* 统计目前有多少链接数
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Set<String> countConnection() {
|
||||
return links.keySet();
|
||||
@@ -308,6 +314,7 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
public void testLoad(String deviceName, Integer venueId) {
|
||||
Channel currentChannel = getCurrentChannel(deviceName, venueId);
|
||||
ServerMessageUtils.INSTANCE.sendMsg(currentChannel,new VenueMessage(MessageType.HB,"测试链接"));
|
||||
logger.info("[连接测试] deviceName={}, venueId={}", deviceName, venueId);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -318,6 +325,7 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
public void uploadLog(String deviceName, Integer venueId) {
|
||||
Channel currentChannel = getCurrentChannel(deviceName, venueId);
|
||||
ServerMessageUtils.INSTANCE.sendMsg(currentChannel,new VenueMessage(MessageType.LOG,"upload logs"));
|
||||
logger.info("[上传日志] 指令已发送 deviceName={}, venueId={}", deviceName, venueId);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -328,20 +336,19 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
String barcode = MakeCode.reWriteBarcode(message);
|
||||
BarcodeOffline barcodeOffline = barcodeOfflineMapper.selectByBarcode(barcode);
|
||||
String doorSn = barcodeOffline.getDeviceName();
|
||||
// 校验barcode是否失效
|
||||
Date endTime = barcodeOffline.getEndTime();
|
||||
if (endTime.before(new Date())) {
|
||||
// 二维码已经失效了
|
||||
logger.error("二维码已经失效,无法继续使用");
|
||||
logger.error("[线下开门] 二维码已失效 barcode={}, endTime={}", barcode, endTime);
|
||||
throw new ServiceException("二维码已经失效,无法继续使用");
|
||||
}
|
||||
boolean lockStat = doorLockUtil.checkDoorLock(doorSn);
|
||||
if (lockStat) {
|
||||
logger.error("有人正在操作,请稍后再试!!!");
|
||||
logger.error("[线下开门] 门锁被占用 doorSn={}", doorSn);
|
||||
throw new ServiceException("有人正在操作,请稍后再试!!!");
|
||||
}
|
||||
int i = barcodeEnterLogMapper.countTimesByBarcode(barcode);
|
||||
if (i >= 6) {
|
||||
logger.warn("[线下开门] 进场过于频繁 barcode={}, count={}", barcode, i);
|
||||
throw new ServiceException("线下进场太过频繁,请重新下单!该二维码已经失效!");
|
||||
}
|
||||
BarcodeEnterLog lastByBarcode = barcodeEnterLogMapper.findLastByBarcode(barcode);
|
||||
@@ -356,6 +363,7 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
barcodeEnterLog.setPlatformId(1);
|
||||
barcodeEnterLogMapper.insert(barcodeEnterLog);
|
||||
doorLockUtil.lockDoor(doorSn);
|
||||
logger.info("[线下开门] 出场成功 doorSn={}, venueId={}", doorSn, venueId);
|
||||
ServerMessageUtils.INSTANCE.sendMsg(channel,new VenueMessage(MessageType.OUT_DOOR,"OK"));
|
||||
return;
|
||||
}
|
||||
@@ -366,6 +374,7 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
barcodeEnterLog.setPlatformId(1);
|
||||
barcodeEnterLogMapper.insert(barcodeEnterLog);
|
||||
doorLockUtil.lockDoor(doorSn);
|
||||
logger.info("[线下开门] 入场成功 doorSn={}, venueId={}", doorSn, venueId);
|
||||
ServerMessageUtils.INSTANCE.sendMsg(channel,new VenueMessage(MessageType.ENTER_DOOR,"OK"));
|
||||
}
|
||||
|
||||
@@ -375,76 +384,45 @@ public class ServerMessageHandlerAdapter implements MessageService {
|
||||
*/
|
||||
@Override
|
||||
public void adminEnter(String deviceName, Integer venueId) {
|
||||
// 暂不应该支持
|
||||
Channel channel = getCurrentChannel(deviceName, venueId);
|
||||
if (channel == null) {
|
||||
logger.error("[管理员入场] 设备离线 deviceName={}, venueId={}", deviceName, venueId);
|
||||
throw new ServiceException("设备离线!请检查连接");
|
||||
}
|
||||
logger.info("管理员入场");
|
||||
logger.info("[管理员入场] 开门 deviceName={}, venueId={}", deviceName, venueId);
|
||||
ServerMessageUtils.INSTANCE.sendMsg(channel,new VenueMessage(MessageType.ENTER_DOOR,"OK"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 管理员入场
|
||||
* 管理员出场
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public void adminOut(String deviceName, Integer venueId) {
|
||||
Channel channel = getCurrentChannel(deviceName, venueId);
|
||||
if (channel == null) {
|
||||
logger.error("[管理员出场] 设备离线 deviceName={}, venueId={}", deviceName, venueId);
|
||||
throw new ServiceException("设备离线!请检查连接");
|
||||
}
|
||||
logger.info("管理员开门" + deviceName + "$" + venueId);
|
||||
logger.info("[管理员出场] 开门 deviceName={}, venueId={}", deviceName, venueId);
|
||||
ServerMessageUtils.INSTANCE.sendMsg(channel,new VenueMessage(MessageType.OUT_DOOR,"OK"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 控制硬件,篮球馆的门禁灯光控制
|
||||
* @param number
|
||||
*/
|
||||
// public void sendNumberChange(Integer number) {
|
||||
// HttpHeaders headers = new HttpHeaders();
|
||||
// headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
|
||||
// MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
|
||||
// param.add("LingtekID", "5d14229fcb1f5c1a9046f429");
|
||||
// param.add("Number", number.toString());
|
||||
// HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(param, headers);
|
||||
// ResponseEntity<Result> result = restTemplate.exchange("http://lingtek.jalasmart.com/api/v1/lingtek/number", HttpMethod.PUT, request, Result.class);
|
||||
// logger.info("灯光结果" + JsonMapper.nonDefaultMapper().toJson(result));
|
||||
// }
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 操作连接
|
||||
*/
|
||||
/**
|
||||
* 缓存通道
|
||||
*/
|
||||
public void addLinks(String deviceName, Integer venueId, Channel channel) {
|
||||
String clientId = deviceName + NettyConstant.SPIT_WORD + venueId;
|
||||
links.put(clientId, channel);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前通道
|
||||
*/
|
||||
public Channel getCurrentChannel(String deviceName, Integer venueId){
|
||||
String clientId = deviceName + NettyConstant.SPIT_WORD + venueId;
|
||||
return links.get(clientId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否有该通道
|
||||
*/
|
||||
public boolean contains(String deviceName, Integer venueId) {
|
||||
String clientId = deviceName + NettyConstant.SPIT_WORD + venueId;
|
||||
return links.containsKey(clientId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除通道
|
||||
*/
|
||||
public void removeChannelType(String deviceName, Integer venueId) {
|
||||
String clientId = deviceName + NettyConstant.SPIT_WORD + venueId ;
|
||||
links.remove(clientId);
|
||||
|
||||
@@ -89,7 +89,7 @@ logging:
|
||||
level:
|
||||
com:
|
||||
sv:
|
||||
mapper: DEBUG
|
||||
mapper: WARN
|
||||
|
||||
|
||||
#netty服务器配置
|
||||
|
||||
@@ -5,8 +5,7 @@
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
|
||||
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
@@ -19,7 +18,7 @@
|
||||
<maxHistory>30</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
@@ -35,7 +34,7 @@
|
||||
<maxHistory>30</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
@@ -48,15 +47,58 @@
|
||||
<maxHistory>30</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<appender name="BASKETBALL-LOG"
|
||||
class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${LOG_HOME}/basketball/basketball.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${LOG_HOME}/basketball/basketball-%d{yyyy-MM-dd}.log
|
||||
</fileNamePattern>
|
||||
<maxHistory>30</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<appender name="CONTROLLER-LOG"
|
||||
class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${LOG_HOME}/controller/controller.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${LOG_HOME}/controller/controller-%d{yyyy-MM-dd}.log
|
||||
</fileNamePattern>
|
||||
<maxHistory>30</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!-- Netty 日志 -->
|
||||
<logger name="NETTY-LOG-NAME" level="debug" additivity="false">
|
||||
<appender-ref ref="NETTY-LOG"/>
|
||||
</logger>
|
||||
|
||||
<!-- root -->
|
||||
<!-- 篮球入场/出场业务日志 -->
|
||||
<logger name="BASKETBALL-LOG-NAME" level="info" additivity="false">
|
||||
<appender-ref ref="BASKETBALL-LOG"/>
|
||||
</logger>
|
||||
|
||||
<!-- Web Controller 请求/响应报文日志 -->
|
||||
<logger name="CONTROLLER-LOG-NAME" level="info" additivity="false">
|
||||
<appender-ref ref="CONTROLLER-LOG"/>
|
||||
</logger>
|
||||
|
||||
<!-- 关闭 MyBatis SQL 日志(生产环境不需要打印 SQL) -->
|
||||
<logger name="com.sv.mapper" level="WARN"/>
|
||||
|
||||
<!-- 关闭 Spring 内部无意义日志 -->
|
||||
<logger name="org.springframework.boot.web.filter" level="WARN"/>
|
||||
<logger name="org.springframework.web.servlet" level="WARN"/>
|
||||
|
||||
<root level="info">
|
||||
<appender-ref ref="STDOUT" />
|
||||
<appender-ref ref="COMMON-DEFAULT" />
|
||||
|
||||
@@ -32,8 +32,8 @@ public class WxServiceTest {
|
||||
public void refund(){
|
||||
// wechatPayService.createUnifiedOrder("testlmq20231224",new BigDecimal(0.02),"127.0.0.1","JSAPI", 535);
|
||||
// 根据orderSn查出对应订单信息
|
||||
String orderSn = "260603140301802382";
|
||||
Integer memberId = 1;
|
||||
String orderSn = "260606190922751780";
|
||||
Integer memberId = 64;
|
||||
Order order = orderService.findOrderSn(orderSn,memberId);
|
||||
if (order == null){
|
||||
throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.ORDER_ERROR);
|
||||
@@ -49,7 +49,7 @@ public class WxServiceTest {
|
||||
memberRefund.setOutRefundNo(orderService.createSn());//商户退款单号
|
||||
memberRefund.setPlatformId(1);
|
||||
memberRefundMapper.insert(memberRefund);
|
||||
wechatPayService.refundInputMoney(memberRefund, order.getPrice(), new BigDecimal(0.02));
|
||||
wechatPayService.refundInputMoney(memberRefund, order.getPrice(), new BigDecimal(2.53));
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user