diff --git a/api/src/main/java/com/sv/api/aop/ControllerLogAspect.java b/api/src/main/java/com/sv/api/aop/ControllerLogAspect.java new file mode 100644 index 0000000..40110e6 --- /dev/null +++ b/api/src/main/java/com/sv/api/aop/ControllerLogAspect.java @@ -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; + } +} diff --git a/api/src/main/java/com/sv/api/controller/VenueController.java b/api/src/main/java/com/sv/api/controller/VenueController.java index fdb55c7..de19315 100644 --- a/api/src/main/java/com/sv/api/controller/VenueController.java +++ b/api/src/main/java/com/sv/api/controller/VenueController.java @@ -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()). diff --git a/api/src/main/java/com/sv/api/controller/WXPayNotifyController.java b/api/src/main/java/com/sv/api/controller/WXPayNotifyController.java index 926eb29..9559868 100644 --- a/api/src/main/java/com/sv/api/controller/WXPayNotifyController.java +++ b/api/src/main/java/com/sv/api/controller/WXPayNotifyController.java @@ -29,17 +29,16 @@ public class WXPayNotifyController { /** * 微信支付后的回调处理 - * - * @return */ @ResponseBody @RequestMapping(value = "/Notify", method = RequestMethod.POST) public WechatNotifyResponse notify(HttpServletRequest request) { try { Map 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 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"); diff --git a/api/src/main/java/com/sv/api/filter/TraceFilter.java b/api/src/main/java/com/sv/api/filter/TraceFilter.java new file mode 100644 index 0000000..e71c03a --- /dev/null +++ b/api/src/main/java/com/sv/api/filter/TraceFilter.java @@ -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() { + } +} diff --git a/api/src/main/java/com/sv/netty/controller/AdminNettyController.java b/api/src/main/java/com/sv/netty/controller/AdminNettyController.java index ff0fde3..7695ab2 100644 --- a/api/src/main/java/com/sv/netty/controller/AdminNettyController.java +++ b/api/src/main/java/com/sv/netty/controller/AdminNettyController.java @@ -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; diff --git a/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java b/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java index e5f5d1f..9836139 100644 --- a/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java +++ b/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java @@ -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 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 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 param = new LinkedMultiValueMap<>(); -// param.add("LingtekID", "5d14229fcb1f5c1a9046f429"); -// param.add("Number", number.toString()); -// HttpEntity> request = new HttpEntity<>(param, headers); -// ResponseEntity 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); diff --git a/api/src/main/resources/config/application.yml b/api/src/main/resources/config/application.yml index 1ecef8c..4495253 100644 --- a/api/src/main/resources/config/application.yml +++ b/api/src/main/resources/config/application.yml @@ -89,7 +89,7 @@ logging: level: com: sv: - mapper: DEBUG + mapper: WARN #netty服务器配置 diff --git a/api/src/main/resources/logback.xml b/api/src/main/resources/logback.xml index 694a62a..bcbfd5a 100644 --- a/api/src/main/resources/logback.xml +++ b/api/src/main/resources/logback.xml @@ -5,8 +5,7 @@ - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n @@ -19,7 +18,7 @@ 30 - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n @@ -35,7 +34,7 @@ 30 - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n @@ -48,15 +47,58 @@ 30 - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n + + ${LOG_HOME}/basketball/basketball.log + + ${LOG_HOME}/basketball/basketball-%d{yyyy-MM-dd}.log + + 30 + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n + + + + + ${LOG_HOME}/controller/controller.log + + ${LOG_HOME}/controller/controller-%d{yyyy-MM-dd}.log + + 30 + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n + + + + - + + + + + + + + + + + + + + + + + diff --git a/api/src/test/java/com/sv/wx/WxServiceTest.java b/api/src/test/java/com/sv/wx/WxServiceTest.java index 0e833d7..20ad9e5 100644 --- a/api/src/test/java/com/sv/wx/WxServiceTest.java +++ b/api/src/test/java/com/sv/wx/WxServiceTest.java @@ -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)); } diff --git a/netty-client/src/main/resources/logback.xml b/netty-client/src/main/resources/logback.xml index cbf1f66..1904235 100644 --- a/netty-client/src/main/resources/logback.xml +++ b/netty-client/src/main/resources/logback.xml @@ -5,8 +5,7 @@ - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n @@ -19,7 +18,7 @@ 30 - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n @@ -35,11 +34,10 @@ 30 - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n - diff --git a/oms/src/main/java/com/ydd/oms/task/BarcodeTimeOrderTask.java b/oms/src/main/java/com/ydd/oms/task/BarcodeTimeOrderTask.java index aaa4c27..555bc12 100644 --- a/oms/src/main/java/com/ydd/oms/task/BarcodeTimeOrderTask.java +++ b/oms/src/main/java/com/ydd/oms/task/BarcodeTimeOrderTask.java @@ -44,53 +44,61 @@ public class BarcodeTimeOrderTask { @Scheduled(cron = "0 0/8 * * * ?") public void execute(){ - logger.error("执行BarcodeTimeOrderTask.execute"); Date date = new Date(); List barcodeOrderTimes = barcodeOrderTimeMapper.endOrderList(date); + logger.info("[定时任务][订单过期] 开始执行, 查询到{}个到期订单", barcodeOrderTimes != null ? barcodeOrderTimes.size() : 0); if (barcodeOrderTimes != null && barcodeOrderTimes.size() > 0){ for (BarcodeOrderTime barcodeOrderTime : barcodeOrderTimes) { - logger.info("用户:" + barcodeOrderTime.getMemberId() + ",在场馆" + barcodeOrderTime.getVenueId() + "已到期"); + logger.info("[定时任务][订单过期] memberId={}, venueId={}, orderSn={}, orderEnd={}, 已到期", + barcodeOrderTime.getMemberId(), barcodeOrderTime.getVenueId(), + barcodeOrderTime.getOrderSn(), barcodeOrderTime.getOrderEnd()); barcodeOrderTime.setStatus(BarCodeStatusEnum.USED.getValue()); barcodeOrderTime.setModifiedTime(date); barcodeOrderTimeMapper.updateByPrimaryKey(barcodeOrderTime); } } + logger.info("[定时任务][订单过期] 执行完毕, 处理{}个订单", barcodeOrderTimes != null ? barcodeOrderTimes.size() : 0); } @Scheduled(cron = "0 0/5 * * * ?") public void refundOrder(){ - logger.error("执行BarcodeTimeOrderTask.refundOrder"); List barcodeOrderTimes = barcodeOrderTimeMapper.needPayOrderList(); + logger.info("[定时任务][订单退款] 开始执行, 查询到{}个待退款订单", barcodeOrderTimes != null ? barcodeOrderTimes.size() : 0); if (barcodeOrderTimes != null && barcodeOrderTimes.size() > 0){ Date date = new Date(); + int refundCount = 0; for (BarcodeOrderTime barcodeOrderTime : barcodeOrderTimes) { boolean isHourlyRefund = barcodeOrderTime.getPayMoney() != null && barcodeOrderTime.getPayMoney().compareTo(BigDecimal.ZERO) > 0; if (!isHourlyRefund) { - // 按次计费:10分钟宽限期 int minutes = DateUtilCard.diffMinute(barcodeOrderTime.getModifiedTime(), date); if (minutes < 10) { + logger.info("[定时任务][订单退款] 按次计费10分钟宽限期内跳过 memberId={}, orderSn={}, 已等待{}分钟", + barcodeOrderTime.getMemberId(), barcodeOrderTime.getOrderSn(), minutes); continue; } } - // 关闭订单 + logger.info("[定时任务][订单退款] 关闭订单 memberId={}, venueId={}, orderSn={}, isHourlyRefund={}, payMoney={}", + barcodeOrderTime.getMemberId(), barcodeOrderTime.getVenueId(), + barcodeOrderTime.getOrderSn(), isHourlyRefund, barcodeOrderTime.getPayMoney()); + barcodeOrderTime.setPaying(0); barcodeOrderTime.setModifiedTime(date); barcodeOrderTime.setStatus(BarCodeStatusEnum.USED.getValue()); barcodeOrderTimeMapper.updateByPrimaryKey(barcodeOrderTime); - // 按时计费退款 if (isHourlyRefund) { - // 如果有补费订单号,跳过退款(与管理员退费逻辑一致) if (!StringUtils.isEmpty(barcodeOrderTime.getOrderAddSn())) { - logger.info("用户" + barcodeOrderTime.getMemberId() + "的订单有补费记录,跳过退款"); + logger.info("[定时任务][订单退款] 有补费记录,跳过退款 memberId={}, orderSn={}, orderAddSn={}", + barcodeOrderTime.getMemberId(), barcodeOrderTime.getOrderSn(), barcodeOrderTime.getOrderAddSn()); continue; } Order order = orderMapper.findOrderSn(barcodeOrderTime.getOrderSn(), barcodeOrderTime.getMemberId()); if (order != null) { BigDecimal refundAmount = barcodeOrderTime.getPayMoney(); - logger.info("用户" + barcodeOrderTime.getMemberId() + "的订单" + barcodeOrderTime.getOrderSn() + "需要退款" + refundAmount + "元"); + logger.info("[定时任务][订单退款] 发起微信退款 memberId={}, orderSn={}, refundAmount={}, orderPrice={}", + barcodeOrderTime.getMemberId(), barcodeOrderTime.getOrderSn(), refundAmount, order.getPrice()); MemberRefund memberRefund = new MemberRefund(); memberRefund.setMemberId(barcodeOrderTime.getMemberId()); memberRefund.setLessonId(barcodeOrderTime.getId()); @@ -102,17 +110,20 @@ public class BarcodeTimeOrderTask { memberRefund.setPlatformId(1); memberRefundMapper.insert(memberRefund); wechatPayService.refundInputMoney(memberRefund, order.getPrice(), refundAmount); + refundCount++; + } else { + logger.warn("[定时任务][订单退款] 未找到原始订单 memberId={}, orderSn={}", + barcodeOrderTime.getMemberId(), barcodeOrderTime.getOrderSn()); } } } + logger.info("[定时任务][订单退款] 执行完毕, 处理{}个订单, 发起{}笔退款", + barcodeOrderTimes.size(), refundCount); + } else { + logger.info("[定时任务][订单退款] 无待退款订单"); } } - /** - * 生成订单号 - * - * @return - */ private String createSn() { return DateFormatUtils.format(new Date(), "yyMMddHHmmss") + RandomStringUtils.randomNumeric(6); } diff --git a/oms/src/main/resources/config/application.yml b/oms/src/main/resources/config/application.yml index a9347fa..6681cfe 100644 --- a/oms/src/main/resources/config/application.yml +++ b/oms/src/main/resources/config/application.yml @@ -92,4 +92,4 @@ logging: level: com: sv: - mapper: DEBUG + mapper: WARN diff --git a/oms/src/main/resources/logback.xml b/oms/src/main/resources/logback.xml index 607a457..195fe56 100644 --- a/oms/src/main/resources/logback.xml +++ b/oms/src/main/resources/logback.xml @@ -5,8 +5,7 @@ - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n @@ -15,10 +14,10 @@ ${LOG_HOME}/common-default.log ${LOG_HOME}/common-default-%d{yyyy-MM-dd}.log - 30 + 30 - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n @@ -30,10 +29,10 @@ ${LOG_HOME}/common-error-%d{yyyy-MM-dd}.log - 30 + 30 - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n @@ -42,10 +41,10 @@ ${LOG_HOME}/task/task.log ${LOG_HOME}/task/task-%d{yyyy-MM-dd}.log - 30 + 30 - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%X{traceId:-no-trace}] - %msg%n @@ -53,7 +52,8 @@ - + + diff --git a/service/src/main/java/com/sv/service/api/MemberCardOrderService.java b/service/src/main/java/com/sv/service/api/MemberCardOrderService.java index 6663457..83881ee 100644 --- a/service/src/main/java/com/sv/service/api/MemberCardOrderService.java +++ b/service/src/main/java/com/sv/service/api/MemberCardOrderService.java @@ -55,38 +55,20 @@ public class MemberCardOrderService extends BaseServiceImpl { @Resource private MemberKeyLock memberKeyLock; - /** - * 创建用户会员卡订单 - * - * @param memberCardOrder 用户会员卡订单 - */ @Transactional public void save(MemberCardOrder memberCardOrder) { if (memberCardOrder.getId() != null && memberCardOrder.getId() > 0) { - // 更新 memberCardOrderMapper.update(memberCardOrder); } else { - // 新建 memberCardOrderMapper.insert(memberCardOrder); } } - /** - * 更新用户会员卡订单 - * - * @param memberCardOrder 用户会员卡订单 - */ @Transactional public void update(MemberCardOrder memberCardOrder) { memberCardOrderMapper.update(memberCardOrder); } - /** - * 删除用户会员卡订单 - * - * @param id 编号 - * @return 删除数量 - */ @Transactional public Integer delete(Integer id) { if (id == null || id <= 0) { @@ -95,12 +77,6 @@ public class MemberCardOrderService extends BaseServiceImpl { return memberCardOrderMapper.delete(id); } - /** - * 删除用户会员卡订单 - * - * @param ids 编号数组 - * @return 删除数量 - */ @Transactional public Integer deleteByIds(Integer[] ids) { if (ids == null || ids.length == 0) { @@ -109,22 +85,10 @@ public class MemberCardOrderService extends BaseServiceImpl { return memberCardOrderMapper.deleteByIds(ids); } - /** - * 查询用户会员卡订单 - * - * @param id 编号 - * @return 用户会员卡订单 - */ public MemberCardOrder findById(Integer id) { return memberCardOrderMapper.findById(id); } - /** - * 查询用户会员卡订单 - * - * @param pagination 分页信息 - * @return 分页结果 - */ public Pagination findPage(Pagination pagination) { PageHelper.startPage(pagination.getPage(), pagination.getPageSize()); PageHelper.orderBy("id desc"); @@ -132,40 +96,29 @@ public class MemberCardOrderService extends BaseServiceImpl { return pagination; } - /** - * 用户购买会员卡 - * @param memberId 用户Id - * @param cardType 卡类型 - * @param type 场馆类型 - * @param venueId 场馆ID - * @return - */ @Transactional public OrderPaySignResponse.WechatPayParam createCardOrder(Integer memberId,Integer cardType, Integer type,Integer venueId,Integer num,Integer platformId,String ip){ synchronized (memberKeyLock.getLock(memberId)) { - // 判断用户是否登录 if (memberId == null){ throw new ServiceException(ExceptionCodeTemplate.NEED_LOGIN); } Member member = memberService.findById(memberId); memberService.verify(member); - // 判断用户是否使用微信登录 MemberAuth memberAuth = memberAuthService.findByMemberId(memberId); if (memberAuth == null){ throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.BUY_ERROR); } - //参数校验 ValidationUtils.assertNotNull(cardType,"请选择卡类型"); ValidationUtils.assertNotNull(type); ValidationUtils.assertNotNull(venueId); - // 根据场馆ID和会员卡类型查找‘会员卡的金额’ VenueCard venueCard = venueCardService.findPrice(cardType,type,venueId); if (venueCard == null) { + logger.warn("[会员卡] 无效的会员卡 memberId={}, cardType={}, type={}, venueId={}", memberId, cardType, type, venueId); throw new ServiceException("无效的会员卡"); } @@ -173,26 +126,18 @@ public class MemberCardOrderService extends BaseServiceImpl { throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.VIP_ERROR); } - // 1.用户会员卡订单 MemberCardOrder order = order( memberId, cardType, type, venueId,platformId); - - // 2.生成订单 - // 订单总价格,保留2位小数 - BigDecimal totalPrice = venueCard.getPrice().multiply(new BigDecimal(num)); + BigDecimal totalPrice = venueCard.getPrice().multiply(new BigDecimal(num)); orderService.createOrder(memberId,order.getOrderSn(),totalPrice,platformId,PayTypeEnum.WEI_XIN.value,OrderTypeEnum.VIP_ORDER.value,OrderPayEnum.ORDER_NO_PAY.value); - // 3.生成用户会员卡的状态为'未激活' -// memberCardService.createCard(order,totalPrice); + logger.info("[会员卡] 创建购卡订单 memberId={}, venueId={}, cardType={}, price={}, orderSn={}", + memberId, venueId, cardType, totalPrice, order.getOrderSn()); - // 4.调支付 OrderPaySignResponse.WechatPayParam wechatPayParam = createUnifiedOrder(order.getOrderSn(), memberId,ip,"购买商品"); return wechatPayParam; } } - /** - * 生成用户会员卡订单 - */ @Transactional public MemberCardOrder order(Integer memberId,Integer cardType,Integer type,Integer venueId, Integer platformId){ @@ -208,36 +153,21 @@ public class MemberCardOrderService extends BaseServiceImpl { return cardOrder; } - /** - * 生成订单号 - * - * @return - */ private String createSn() { return DateFormatUtils.format(new Date(), "yyMMddHHmmss") + RandomStringUtils.randomNumeric(6); } - /** - * 微信下单 - * - * @param orderSn - * @param memberId - * @return - */ @Transactional public OrderPaySignResponse.WechatPayParam createUnifiedOrder(String orderSn, Integer memberId, String ip,String orderTitle) { Order order = orderService.findOrderSn(orderSn, memberId); if (order == null){ + logger.warn("[微信统一下单] 订单不存在 orderSn={}, memberId={}", orderSn, memberId); throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.ORDER_ERROR); } - return wechatPayService.createUnifiedOrder(orderSn, order.getPrice(), ip, memberId,orderTitle); + logger.info("[微信统一下单] orderSn={}, memberId={}, price={}, title={}", orderSn, memberId, order.getPrice(), orderTitle); + return wechatPayService.createUnifiedOrder(orderSn, order.getPrice(), ip, memberId, orderTitle); } - /** - * api 微信回调修改状态 - * @param orderSn - * @return - */ @Transactional public MemberCardOrder paySuccess(String orderSn){ MemberCardOrder memberCard = memberCardOrderMapper.paySuccess(orderSn); @@ -245,8 +175,11 @@ public class MemberCardOrderService extends BaseServiceImpl { memberCard.setPayStatus(OrderPayEnum.PENDING_DELIVERY.value); memberCard.setModifiedTime(new Date()); memberCardOrderMapper.update(memberCard); + logger.info("[会员卡] 支付成功 orderSn={}, memberId={}, cardType={}", + orderSn, memberCard.getMemberId(), memberCard.getCardType()); + } else { + logger.warn("[会员卡] 支付成功但未找到订单 orderSn={}", orderSn); } return memberCard; } } - diff --git a/service/src/main/java/com/sv/service/api/MemberMoneyLogService.java b/service/src/main/java/com/sv/service/api/MemberMoneyLogService.java index 45c9504..473f7b8 100644 --- a/service/src/main/java/com/sv/service/api/MemberMoneyLogService.java +++ b/service/src/main/java/com/sv/service/api/MemberMoneyLogService.java @@ -33,39 +33,25 @@ public class MemberMoneyLogService extends MemberMoney { @Resource private MemberService memberService; - /** - * - * 创建用户余额记录 - * - * @param memberMoneyLog 用户余额记录 - */ @Transactional public void save(MemberMoneyLog memberMoneyLog) { if (memberMoneyLog.getId() != null && memberMoneyLog.getId() > 0) { - // 更新 memberMoneyLogMapper.update(memberMoneyLog); + logger.info("[资金流水] 更新 id={}, memberId={}, type={}, money={}", + memberMoneyLog.getId(), memberMoneyLog.getMemberId(), memberMoneyLog.getType(), memberMoneyLog.getMoney()); } else { - // 新建 memberMoneyLogMapper.insert(memberMoneyLog); + logger.info("[资金流水] 新建 memberId={}, type={}, money={}, payType={}, venueId={}", + memberMoneyLog.getMemberId(), memberMoneyLog.getType(), memberMoneyLog.getMoney(), + memberMoneyLog.getPayType(), memberMoneyLog.getVenueId()); } } - /** - * 更新用户余额记录 - * - * @param memberMoneyLog 用户余额记录 - */ @Transactional public void update(MemberMoneyLog memberMoneyLog) { memberMoneyLogMapper.update(memberMoneyLog); } - /** - * 删除用户余额记录 - * - * @param id 编号 - * @return 删除数量 - */ @Transactional public Integer delete(Integer id) { if (id == null || id <= 0) { @@ -74,12 +60,6 @@ public class MemberMoneyLogService extends MemberMoney { return memberMoneyLogMapper.delete(id); } - /** - * 删除用户余额记录 - * - * @param ids 编号数组 - * @return 删除数量 - */ @Transactional public Integer deleteByIds(Integer[] ids) { if (ids == null || ids.length == 0) { @@ -88,36 +68,18 @@ public class MemberMoneyLogService extends MemberMoney { return memberMoneyLogMapper.deleteByIds(ids); } - /** - * 查询用户余额记录 - * - * @param id 编号 - * @return 用户余额记录 - */ public MemberMoneyLog findById(Integer id) { return memberMoneyLogMapper.findById(id); } - /** - * 查询用户余额记录 - * - * @param pagination 分页信息 - * @return 分页结果 - */ public Pagination findPage(Pagination pagination) { PageHelper.startPage(pagination.getPage(), pagination.getPageSize()); PageHelper.orderBy("id desc"); pagination.setQueryResult(memberMoneyLogMapper.findAll()); return pagination; } - /** - * api 查询用户账单记录 - * - * @param pagination 分页信息 - * @return 分页结果 - */ + public Pagination bill(Pagination pagination, Integer memberId) { - // 判断用户信息 Member member = memberService.findById(memberId); memberService.verify(member); @@ -126,18 +88,11 @@ public class MemberMoneyLogService extends MemberMoney { return pagination; } - /** - * 插入 - */ public void insert(MemberMoneyLog memberMoneyLog){ memberMoneyLogMapper.insert(memberMoneyLog); } - /** - * 插入 - */ public MemberMoneyLog selectLastLog(Integer memberId,Integer venueId){ return memberMoneyLogMapper.selectLastLog(memberId,venueId); } } - diff --git a/service/src/main/java/com/sv/service/api/MemberRefundService.java b/service/src/main/java/com/sv/service/api/MemberRefundService.java index 0e4a565..a42e674 100644 --- a/service/src/main/java/com/sv/service/api/MemberRefundService.java +++ b/service/src/main/java/com/sv/service/api/MemberRefundService.java @@ -51,38 +51,22 @@ public class MemberRefundService extends BaseServiceImpl { @Resource private BarcodeOrderTimeMapper barcodeOrderTimeMapper; - /** - * 创建用户退款记录表 - * - * @param memberRefund 用户退款记录表 - */ @Transactional public void save(MemberRefund memberRefund) { if (memberRefund.getId() != null && memberRefund.getId() > 0) { - // 更新 memberRefundMapper.update(memberRefund); + logger.info("[退款] 更新退款记录 id={}, memberId={}, refundStatus={}", memberRefund.getId(), memberRefund.getMemberId(), memberRefund.getRefundStatus()); } else { - // 新建 memberRefundMapper.insert(memberRefund); + logger.info("[退款] 新建退款记录 memberId={}, orderSn={}, money={}", memberRefund.getMemberId(), memberRefund.getOrderSn(), memberRefund.getMoney()); } } - /** - * 更新用户退款记录表 - * - * @param memberRefund 用户退款记录表 - */ @Transactional public void update(MemberRefund memberRefund) { memberRefundMapper.update(memberRefund); } - /** - * 删除用户退款记录表 - * - * @param id 编号 - * @return 删除数量 - */ @Transactional public Integer delete(Integer id) { if (id == null || id <= 0) { @@ -91,12 +75,6 @@ public class MemberRefundService extends BaseServiceImpl { return memberRefundMapper.delete(id); } - /** - * 删除用户退款记录表 - * - * @param ids 编号数组 - * @return 删除数量 - */ @Transactional public Integer deleteByIds(Integer[] ids) { if (ids == null || ids.length == 0) { @@ -105,22 +83,10 @@ public class MemberRefundService extends BaseServiceImpl { return memberRefundMapper.deleteByIds(ids); } - /** - * 查询用户退款记录表 - * - * @param id 编号 - * @return 用户退款记录表 - */ public MemberRefund findById(Integer id) { return memberRefundMapper.findById(id); } - /** - * 查询用户退款记录表 - * - * @param pagination 分页信息 - * @return 分页结果 - */ public Pagination findPage(Pagination pagination) { PageHelper.startPage(pagination.getPage(), pagination.getPageSize()); PageHelper.orderBy("id desc"); @@ -128,14 +94,11 @@ public class MemberRefundService extends BaseServiceImpl { return pagination; } - /** - * api 取消课程,增加用户退款记录表(微信支付) - */ @Transactional(readOnly = false) public MemberRefund addMemberRefund(Integer memberId, MemberLessonTicketDetailDTO memberLessonTicket, String orderSn,Integer platformId){ - // 根据orderSn查出对应订单信息 Order order = orderService.findOrderSn(orderSn,memberId); if (order == null){ + logger.warn("[退款][取消课程] 订单不存在 memberId={}, orderSn={}", memberId, orderSn); throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.ORDER_ERROR); } @@ -146,22 +109,23 @@ public class MemberRefundService extends BaseServiceImpl { memberRefund.setOrderSn(orderSn); memberRefund.setTransactionId(order.getTradeSn()); memberRefund.setOrderId(order.getId()); - memberRefund.setOutRefundNo(orderService.createSn());//商户退款单号 + memberRefund.setOutRefundNo(orderService.createSn()); memberRefund.setPlatformId(platformId); memberRefundMapper.insert(memberRefund); - + logger.info("[退款][取消课程] 创建退款 memberId={}, orderSn={}, price={}, outRefundNo={}", + memberId, orderSn, order.getPrice(), memberRefund.getOutRefundNo()); return memberRefund; } @Transactional(readOnly = false) public void refund(MemberRefund memberRefund){ + logger.info("[退款] 发起微信退款 memberId={}, orderSn={}, money={}, outRefundNo={}", + memberRefund.getMemberId(), memberRefund.getOrderSn(), memberRefund.getMoney(), memberRefund.getOutRefundNo()); wechatPayService.refundMoney(memberRefund); } - /** - * api 退款微信回调 - */ public BaseResult notifyRefund(@RequestBody Map params,Integer platformId) throws IOException { + logger.info("[退款] 微信退款回调 params={}", params); wechatPayService.notifyRefund(params,platformId); return new BaseResult(); } @@ -171,13 +135,14 @@ public class MemberRefundService extends BaseServiceImpl { */ @Transactional(readOnly = false) public void updateInfo(String refundStatus,String outTradeNo,String successTime,Integer platformId){ - // 通过订单号查询‘用户退款记录表’ try { MemberRefund memberRefund = memberRefundMapper.findByOrderSn(outTradeNo); if (memberRefund == null) { + logger.warn("[退款][回调] 退款记录不存在 outTradeNo={}", outTradeNo); return; } if (refundStatus.equals(memberRefund.getRefundStatus())){ + logger.info("[退款][回调] 状态无变化 outTradeNo={}, refundStatus={}", outTradeNo, refundStatus); return; } memberRefund.setRefundStatus(refundStatus); @@ -187,7 +152,6 @@ public class MemberRefundService extends BaseServiceImpl { memberRefundMapper.update(memberRefund); Integer venueType = null; - // 如果是球场订单(更新总退款金额) add by limqsh BarcodeOrderTime barcodeOrderTime = barcodeOrderTimeMapper.selectByPrimaryKey(memberRefund.getLessonId()); if (barcodeOrderTime != null) { venueType = VenueTypeEnum.BASKETBALL.value; @@ -198,15 +162,16 @@ public class MemberRefundService extends BaseServiceImpl { barcodeOrderTime.setPayMoney(BigDecimal.ZERO); barcodeOrderTime.setModifiedTime(new Date()); barcodeOrderTimeMapper.updateByPrimaryKey(barcodeOrderTime); + logger.info("[退款][回调] 篮球订单退款更新 orderSn={}, addSumPayMoney={}, totalSumPayMoney={}", + memberRefund.getOrderSn(), memberRefund.getMoney(), currentSumPayMoney.add(memberRefund.getMoney())); } } - // 如果是球场订单(更新总退款金额) add by limqsh end - // 记录到‘用户账单(余额,微信,会员卡)记录’ memberMoneyLogService.create(memberRefund.getMemberId(),platformId,MoneyLogEnum.REFUND.value,memberRefund.getMoney(),PayTypeEnum.WEI_XIN.value, null,null,venueType,memberRefund.getLessonId()); + logger.info("[退款][回调] 退款成功 memberId={}, orderSn={}, refundStatus={}, successTime={}", + memberRefund.getMemberId(), outTradeNo, refundStatus, successTime); }catch (Exception e){ - e.printStackTrace(); + logger.error("[退款][回调] 处理异常 outTradeNo={}", outTradeNo, e); } } } - diff --git a/service/src/main/java/com/sv/service/api/OrderService.java b/service/src/main/java/com/sv/service/api/OrderService.java index ec915a3..964a189 100644 --- a/service/src/main/java/com/sv/service/api/OrderService.java +++ b/service/src/main/java/com/sv/service/api/OrderService.java @@ -76,38 +76,20 @@ public class OrderService extends BaseServiceImpl { @Resource private PlatformTransactionManager transactionManager; - /** - * 创建订单 - * - * @param order 订单 - */ @Transactional public void save(Order order) { if (order.getId() != null && order.getId() > 0) { - // 更新 orderMapper.update(order); } else { - // 新建 orderMapper.insert(order); } } - /** - * 更新订单 - * - * @param order 订单 - */ @Transactional public void update(Order order) { orderMapper.update(order); } - /** - * 删除订单 - * - * @param id 编号 - * @return 删除数量 - */ @Transactional public Integer delete(Integer id) { if (id == null || id <= 0) { @@ -116,12 +98,6 @@ public class OrderService extends BaseServiceImpl { return orderMapper.delete(id); } - /** - * 删除订单 - * - * @param ids 编号数组 - * @return 删除数量 - */ @Transactional public Integer deleteByIds(Integer[] ids) { if (ids == null || ids.length == 0) { @@ -130,22 +106,10 @@ public class OrderService extends BaseServiceImpl { return orderMapper.deleteByIds(ids); } - /** - * 查询订单 - * - * @param id 编号 - * @return 订单 - */ public Order findById(Integer id) { return orderMapper.findById(id); } - /** - * 查询订单 - * - * @param pagination 分页信息 - * @return 分页结果 - */ public Pagination findPage(Pagination pagination) { PageHelper.startPage(pagination.getPage(), pagination.getPageSize()); PageHelper.orderBy("id desc"); @@ -153,11 +117,6 @@ public class OrderService extends BaseServiceImpl { return pagination; } - /** - * api 生成订单 - * @param memberId - * @param platformId - */ @Transactional public Order createOrder(Integer memberId, String orderSn,BigDecimal totalPrice,Integer platformId,Integer payType,Integer type,Integer payStatus){ Order order = new Order(); @@ -169,29 +128,20 @@ public class OrderService extends BaseServiceImpl { order.setType(type); order.setPlatformId(platformId); orderMapper.insert(order); + logger.info("[订单] 创建订单 memberId={}, orderSn={}, price={}, type={}", memberId, orderSn, totalPrice, type); return order; } - /** - * 根据用户Id,订单号查询订单 - */ public Order findOrderSn(String orderSn,Integer memberId){ return orderMapper.findOrderSn( orderSn, memberId); } - /** - * api 更新prepay_id - */ @Transactional public void updatePrepayId(String orderSn, String prepayId) { orderMapper.updatePrepayId(orderSn,prepayId); + logger.info("[订单] 更新prepayId orderSn={}", orderSn); } - /** - * api 支付成功 - * - * @param orderId - */ @Transactional public void paySuccess(Integer orderId, String tradeSn){ Order order = new Order(); @@ -200,19 +150,15 @@ public class OrderService extends BaseServiceImpl { order.setTradeSn(tradeSn); order.setPayTime(new Date()); orderMapper.update(order); + logger.info("[订单] 支付成功 orderId={}, tradeSn={}", orderId, tradeSn); } - /** - * api 微信回调 - */ public BaseResult notifyWx(@RequestBody Map params) throws IOException { + logger.info("[订单] 微信支付回调 notify={}", params); wechatPayService.notify(params); return new BaseResult(); } - /** - * api 余额充值 - */ public OrderPaySignResponse.WechatPayParam createRecharge(Integer memberId,Integer platformId,Integer rechargeId,String ip){ Recharge recharge = rechargeService.findById(rechargeId); if (recharge == null) { @@ -225,13 +171,11 @@ public class OrderService extends BaseServiceImpl { Member member = memberService.findById(memberId); memberService.verify(member); - // 判断用户是否使用微信登录 MemberAuth memberAuth = memberAuthService.findByMemberId(memberId); if (memberAuth == null){ throw new ServiceException(ExceptionCodeTemplate.BUY_ERROR); } - // 生成订单 Order order = new Order(); order.setMemberId(memberId); order.setOrderSn(createSn()); @@ -241,30 +185,24 @@ public class OrderService extends BaseServiceImpl { order.setType(OrderTypeEnum.BALANCE_ORDER.value); order.setPlatformId(platformId); orderMapper.insert(order); + logger.info("[充值] 创建充值订单 memberId={}, rechargeId={}, rechargeMoney={}, toMoney={}, orderSn={}", + memberId, rechargeId, recharge.getRechargeMoney(), recharge.getToMoney(), order.getOrderSn()); - // 调微信 OrderPaySignResponse.WechatPayParam wechatPayParam = memberCardOrderService.createUnifiedOrder(order.getOrderSn(), memberId,ip,"余额充值"); return wechatPayParam; } - /** - * api - * 生成订单号 - * - * @return - */ public String createSn() { return DateFormatUtils.format(new Date(), "yyMMddHHmmss") + RandomStringUtils.randomNumeric(6); } /** * 生成进场订单(防重复下单) - * @param memberId - * @return */ - public BasketballPayResult createEnterVenueOrder(Integer venueId, Integer memberId, Integer enterFlag,PayTypeEnum payTypeEnum, BigDecimal price){ + public BasketballPayResult createEnterVenueOrder(Integer venueId, Integer memberId, Integer enterFlag, PayTypeEnum payTypeEnum, BigDecimal price){ Venue venue = venueMapper.findById(venueId); if (venue == null) { + logger.warn("[篮球][下单] 场馆不存在 venueId={}", venueId); throw new ServiceException("未找到该场馆"); } Member member = memberService.findById(memberId); @@ -277,6 +215,7 @@ public class OrderService extends BaseServiceImpl { List priceList = venuePriceMapper.findPrice(venueId); if(priceList == null || priceList.size() <= 0) { + logger.warn("[篮球][下单] 价格非法 memberId={}, venueId={}, priceList为空", memberId, venueId); throw new ServiceException("价格非法!"); } boolean checkPrice = false; @@ -286,12 +225,16 @@ public class OrderService extends BaseServiceImpl { } } if (!checkPrice) { + logger.warn("[篮球][下单] 价格非法 memberId={}, venueId={}, price={}", memberId, venueId, price); throw new ServiceException("价格非法!"); } + logger.info("[篮球][下单] 开始创建订单 memberId={}, venueId={}, enterFlag={}, price={}", memberId, venueId, enterFlag, price); + synchronized (memberKeyLock.getLock(memberId)) { Order pendingOrder = orderMapper.findPendingBasketballOrder(memberId, venueId); if (pendingOrder != null) { + logger.info("[篮球][下单] 存在待处理订单 memberId={}, orderSn={}", memberId, pendingOrder.getOrderSn()); OrderResponse wxResponse = wechatPayService.queryWechatOrder(pendingOrder.getOrderSn()); if (wxResponse != null && wxResponse.isSuccess() && "SUCCESS".equals(wxResponse.getTradeState())) { pendingOrder.setPayStatus(PayStatusEnum.PAYED.value); @@ -299,6 +242,7 @@ public class OrderService extends BaseServiceImpl { pendingOrder.setPayTime(new Date()); orderMapper.update(pendingOrder); venueEnterService.paySuccess(pendingOrder); + logger.info("[篮球][下单] 微信已支付成功 orderSn={}, tradeSn={}", pendingOrder.getOrderSn(), wxResponse.getTransactionId()); BasketballPayResult paidResult = new BasketballPayResult(); paidResult.setPaidFlag(true); @@ -309,8 +253,10 @@ public class OrderService extends BaseServiceImpl { OrderPaySignResponse.WechatPayParam wechatPayParam; if (pendingOrder.getPrepayId() != null) { wechatPayParam = wechatPayService.resignPayParam(pendingOrder.getOrderSn(), pendingOrder.getPrepayId()); + logger.info("[篮球][下单] 复用prepayId orderSn={}", pendingOrder.getOrderSn()); } else { wechatPayParam = memberCardOrderService.createUnifiedOrder(pendingOrder.getOrderSn(), memberId, RequestUtils.getIp(), "入场结算订单"); + logger.info("[篮球][下单] 重新统一下单 orderSn={}", pendingOrder.getOrderSn()); } wechatPayParam.setOrderSn(pendingOrder.getOrderSn()); @@ -339,10 +285,13 @@ public class OrderService extends BaseServiceImpl { order.setParentOrderId(venueId); order.setCreatedId(enterFlag); orderMapper.insert(order); + logger.info("[篮球][下单] 插入新订单 orderSn={}, memberId={}, venueId={}, enterFlag={}", + order.getOrderSn(), memberId, venueId, enterFlag); } transactionManager.commit(txStatus); } catch (RuntimeException e) { transactionManager.rollback(txStatus); + logger.error("[篮球][下单] 事务异常 memberId={}, venueId={}", memberId, venueId, e); throw e; } @@ -354,6 +303,10 @@ public class OrderService extends BaseServiceImpl { lastOrder.setOrderAddSn(order.getOrderSn()); lastOrder.setModifiedTime(new Date()); barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); + logger.info("[篮球][下单] 出场补费订单关联 lastOrderSn={}, addOrderSn={}", + lastOrder.getOrderSn(), order.getOrderSn()); + } else { + logger.warn("[篮球][下单] 出场补费但未找到原始订单 memberId={}", memberId); } } OrderPaySignResponse.WechatPayParam wechatPayParam = memberCardOrderService.createUnifiedOrder(order.getOrderSn(), memberId, RequestUtils.getIp(),"入场结算订单"); @@ -368,4 +321,3 @@ public class OrderService extends BaseServiceImpl { } } - diff --git a/service/src/main/java/com/sv/service/api/VenueEnterService.java b/service/src/main/java/com/sv/service/api/VenueEnterService.java index dccf948..7180a3a 100644 --- a/service/src/main/java/com/sv/service/api/VenueEnterService.java +++ b/service/src/main/java/com/sv/service/api/VenueEnterService.java @@ -40,6 +40,7 @@ import java.util.*; public class VenueEnterService extends BaseServiceImpl { private final Logger logger = LoggerFactory.getLogger(VenueEnterService.class); + private final Logger basketballLog = LoggerFactory.getLogger("BASKETBALL-LOG-NAME"); @Resource private OrderService orderService; @@ -66,35 +67,41 @@ public class VenueEnterService extends BaseServiceImpl { public BasketEnterResult join(Integer memberId, Integer venueId) { BasketEnterResult basketEnterResult = new BasketEnterResult(); basketEnterResult.setFlg(0); - // 判断用户是否登录 if (memberId == null) { throw new ServiceException(com.ydd.framework.core.exception.ExceptionCodeTemplate.NEED_LOGIN); } - // 参数校验 ValidationUtils.assertNotNull(venueId); - // 2. 查询该场馆需要的费用,并比较用户余额是否足够 - // 查询当前时间内,场馆对应的价格 + String time = DateUtilCard.nowTime().toString(); Venue venue = venueMapper.findById(venueId); VenuePrice venuePrice = venuePriceService.findPrice(venueId, time); if (venuePrice == null) { + basketballLog.warn("[篮球][入场] memberId={}, venueId={}, 场馆暂未开放或未设置价格", memberId, venueId); throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); } BigDecimal price = venuePrice.getPrice(); if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()) { - // 按时入场余额需要包含两个小时的场地费 price = price.multiply(new BigDecimal(2)); } + BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); + + basketballLog.info("[篮球][入场] memberId={}, venueId={}, payStyle={}, price={}, lastOrder={}", + memberId, venueId, venue.getPayStyle(), price, + lastOrder != null ? String.format("orderSn=%s,status=%s,paying=%s,lastEnter=%s,orderEnd=%s", + lastOrder.getOrderSn(), lastOrder.getStatus(), lastOrder.getPaying(), + lastOrder.getLastEnter(), lastOrder.getOrderEnd()) : "null"); + boolean hasEffOrder = lastOrder != null && lastOrder.getStatus() == BarCodeStatusEnum.INIT.getValue() && lastOrder.getOrderEnd().after(new Date()); if (!hasEffOrder) { - logger.info(memberId + "&用户创建订单,开始进场,需要支付金额"); + basketballLog.info("[篮球][入场] memberId={}, 无有效订单,创建新订单", memberId); if (price.compareTo(BigDecimal.ZERO) > 0) { Order pendingOrder = orderMapper.findPendingBasketballOrder(memberId, venueId); if (pendingOrder != null) { + basketballLog.info("[篮球][入场] memberId={}, 存在待支付订单 orderSn={}", memberId, pendingOrder.getOrderSn()); OrderResponse wxResponse = wechatPayService.queryWechatOrder(pendingOrder.getOrderSn()); if (wxResponse != null && wxResponse.isSuccess() && "SUCCESS".equals(wxResponse.getTradeState())) { pendingOrder.setPayStatus(PayStatusEnum.PAYED.value); @@ -105,6 +112,8 @@ public class VenueEnterService extends BaseServiceImpl { basketEnterResult.setFlg(0); basketEnterResult.setOrderSn(pendingOrder.getOrderSn()); basketEnterResult.setMsg("已支付成功,请入场"); + basketballLog.info("[篮球][入场] memberId={}, 微信支付已成功 orderSn={}, tradeSn={}", + memberId, pendingOrder.getOrderSn(), wxResponse.getTransactionId()); return basketEnterResult; } basketEnterResult.setFlg(2); @@ -115,6 +124,7 @@ public class VenueEnterService extends BaseServiceImpl { basketEnterResult.setMsg("您有未完成的订单,请继续支付。订单金额" + price + "元"); } basketEnterResult.setMoney(price); + basketballLog.info("[篮球][入场] memberId={}, 待支付订单未完成支付 orderSn={}", memberId, pendingOrder.getOrderSn()); return basketEnterResult; } checkOrderPaying(memberId); @@ -125,8 +135,9 @@ public class VenueEnterService extends BaseServiceImpl { basketEnterResult.setMsg("订单金额" + price + "元,请确认!"); } basketEnterResult.setMoney(price); + basketballLog.info("[篮球][入场] memberId={}, 需支付押金/费用 price={}", memberId, price); } else { - logger.info(memberId + "&用户创建订单,开始进场,免费入场"); + basketballLog.info("[篮球][入场] memberId={}, 免费入场", memberId); Integer timePayHour = 2; if (PayStyleEnum.TIME.getValue() == venue.getPayStyle()) { timePayHour = venue.getTimePayHour() != null ? venue.getTimePayHour() : 4; @@ -136,15 +147,18 @@ public class VenueEnterService extends BaseServiceImpl { } else { basketEnterResult.setOrderSn(lastOrder.getOrderSn()); if (lastOrder.getLastEnter() == null) { - logger.info(memberId + "&支付成功但门禁未开门,允许重试"); + basketballLog.info("[篮球][入场] memberId={}, 支付成功但门禁未开门,允许重试 orderSn={}", + memberId, lastOrder.getOrderSn()); } else { if (lastOrder.getPaying() == 1 && PayStyleEnum.TIME.getValue() == venue.getPayStyle()) { lastOrder.setPaying(0); lastOrder.setModifiedTime(new Date()); barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); - logger.info(memberId + "&用户10分钟内重新入场,沿用原订单"); + basketballLog.info("[篮球][入场] memberId={}, 10分钟内重新入场,沿用原订单 orderSn={}", + memberId, lastOrder.getOrderSn()); } else { - logger.info(memberId + "&用户已在场内,无需重复入场"); + basketballLog.info("[篮球][入场] memberId={}, 用户已在场内,无需重复入场 orderSn={}, paying={}, payStyle={}", + memberId, lastOrder.getOrderSn(), lastOrder.getPaying(), venue.getPayStyle()); } } } @@ -171,25 +185,28 @@ public class VenueEnterService extends BaseServiceImpl { BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(memberId, venueId); if (lastOrder == null || lastOrder.getPaying() == 2) { + basketballLog.warn("[篮球][出场] memberId={}, venueId={}, 无可结算订单 lastOrder={}", + memberId, venueId, lastOrder == null ? "null" : + String.format("orderSn=%s,paying=%s,status=%s", lastOrder.getOrderSn(), lastOrder.getPaying(), lastOrder.getStatus())); return result; } + basketballLog.info("[篮球][出场] memberId={}, venueId={}, payStyle={}, orderSn={}, orderStart={}, lastEnter={}, paying={}", + memberId, venueId, venue.getPayStyle(), lastOrder.getOrderSn(), + lastOrder.getOrderStart(), lastOrder.getLastEnter(), lastOrder.getPaying()); + if (PayStyleEnum.HOUR.getValue() == venue.getPayStyle()) { String enterTime = DateUtilCard.getTimeFromDate(lastOrder.getOrderStart()); Date dateNow = new Date(); - logger.info(memberId + "&用户出场(按时)"); + basketballLog.info("[篮球][出场] memberId={}, 按时计费结算 venueId={}", memberId, venueId); VenuePrice venuePriceEnter = venuePriceService.findPrice(venueId, enterTime); if (venuePriceEnter == null) { - logger.info(memberId + "&用户出场,场馆暂未开放"); + basketballLog.warn("[篮球][出场] memberId={}, 场馆暂未开放 venueId={}", memberId, venueId); throw new ServiceException(ExceptionCodeTemplate.VENUE_ERROR); } BigDecimal basePrice = venuePriceEnter.getPrice(); - // FIXME orderStart 是支付回调时间(paySuccess→createBarcodeTimeOrder 设的 new Date()) - // 门禁异常场景下用户实际入场时间(lastEnter)可能晚于 orderStart, - // 导致结算时长偏多。如需精准计算,应优先取 lastEnter: - // Date startTime = lastOrder.getLastEnter() != null ? lastOrder.getLastEnter() : lastOrder.getOrderStart(); int minutes = DateUtilCard.diffMinute(lastOrder.getOrderStart(), dateNow); BigDecimal actualCost = basePrice.multiply(new BigDecimal(minutes)) @@ -197,8 +214,8 @@ public class VenueEnterService extends BaseServiceImpl { BigDecimal deposit = basePrice.multiply(new BigDecimal(2)); BigDecimal difference = actualCost.subtract(deposit); - logger.info("用户出场$" + memberId + "$经过" + minutes + "分钟,实际费用:" + actualCost + ",押金:" + deposit + ",差额:" - + difference); + basketballLog.info("[篮球][出场] memberId={}, 费用结算: basePrice={}, 停留{}分钟, 实际费用={}, 押金={}, 差额={}", + memberId, basePrice, minutes, actualCost, deposit, difference); if (difference.compareTo(BigDecimal.ZERO) > 0) { Order pendingOrder = orderMapper.findPendingBasketballOrder(memberId, venueId); @@ -212,18 +229,22 @@ public class VenueEnterService extends BaseServiceImpl { paySuccess(pendingOrder); result.setFlg(0); result.setMsg("补交费用已支付成功,出场成功"); + basketballLog.info("[篮球][出场] memberId={}, 补交费用已支付 orderSn={}, tradeSn={}, 补交金额={}", + memberId, pendingOrder.getOrderSn(), wxResponse.getTransactionId(), difference); return result; } result.setFlg(2); result.setMoney(difference); result.setOrderSn(pendingOrder.getOrderSn()); result.setMsg("您有未完成的补交订单,请继续支付。实际费用" + actualCost + "元,需补交" + difference + "元"); + basketballLog.info("[篮球][出场] memberId={}, 需补交费用 orderSn={}, 需补交={}", memberId, pendingOrder.getOrderSn(), difference); return result; } checkOrderPaying(memberId); result.setFlg(2); result.setMoney(difference); result.setMsg("您此次入场" + minutes + "分钟,实际费用" + actualCost + "元,需补交" + difference + "元"); + basketballLog.info("[篮球][出场] memberId={}, 需创建补交订单, 差额={}", memberId, difference); } else if (difference.compareTo(BigDecimal.ZERO) < 0) { BigDecimal refundAmount = difference.abs(); lastOrder.setPayMoney(refundAmount.setScale(2, BigDecimal.ROUND_HALF_UP)); @@ -233,6 +254,8 @@ public class VenueEnterService extends BaseServiceImpl { barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); result.setFlg(0); result.setMsg("出场成功,退款" + refundAmount + "元将在24小时内到账"); + basketballLog.info("[篮球][出场] memberId={}, 退款出场 orderSn={}, 退款金额={}", + memberId, lastOrder.getOrderSn(), refundAmount); } else { lastOrder.setPaying(2); lastOrder.setStatus(BarCodeStatusEnum.USED.getValue()); @@ -240,10 +263,11 @@ public class VenueEnterService extends BaseServiceImpl { barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); result.setFlg(0); result.setMsg("出场成功"); + basketballLog.info("[篮球][出场] memberId={}, 押金等于实际费用,无需补退 orderSn={}", + memberId, lastOrder.getOrderSn()); } } else if (PayStyleEnum.TIME.getValue() == venue.getPayStyle()) { - // 按次计费:出场设置 paying=1,10分钟内可重新入场 - logger.info(memberId + "&用户出场(按次)"); + basketballLog.info("[篮球][出场] memberId={}, 按次计费出场 orderSn={}", memberId, lastOrder.getOrderSn()); lastOrder.setPaying(1); lastOrder.setModifiedTime(new Date()); barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); @@ -263,7 +287,6 @@ public class VenueEnterService extends BaseServiceImpl { if (mOrder == null) { return; } - // 有未支付的订单,且订单未超过两分钟未支付 int diffMinute = DateUtilCard.diffMinute(mOrder.getModifiedTime(), new Date()); if (mOrder != null && PayStatusEnum.NOT_PAY.value == mOrder.getPayStatus() && diffMinute < 2) { throw new ServiceException("您有处理中的订单,或刚刚取消支付,请稍后再试"); @@ -309,10 +332,6 @@ public class VenueEnterService extends BaseServiceImpl { private void createBarcodeTimeOrder(Integer memberId, Integer venueId, Integer timePayHour, String orderSn) { Date startDate = new Date(); Date endDate = DateUtilCard.addHours(startDate, timePayHour); - // // 如果小于2小时,则默认给15分钟宽限期,包时订单 - // if (timePayHour <= 2) { - // endDate = DateUtilCard.addMinute(endDate,15); - // } BarcodeOrderTime barcodeOrderTime = new BarcodeOrderTime(); barcodeOrderTime.setMemberId(memberId); barcodeOrderTime.setVenueId(venueId); @@ -322,6 +341,8 @@ public class VenueEnterService extends BaseServiceImpl { barcodeOrderTime.setPaying(0); barcodeOrderTime.setOrderSn(orderSn); barcodeOrderTimeMapper.insert(barcodeOrderTime); + basketballLog.info("[篮球][订单] 创建订单 memberId={}, venueId={}, orderSn={}, timePayHour={}, start={}, end={}", + memberId, venueId, orderSn, timePayHour, startDate, endDate); } /** @@ -330,18 +351,17 @@ public class VenueEnterService extends BaseServiceImpl { * @param order */ public void paySuccess(Order order) { - // order.getCreatedId() 如果等于1 则是出场的付费 Integer enterFlag = order.getCreatedId(); Integer memberId = order.getMemberId(); Integer venueId = order.getParentOrderId(); Venue venue = venueMapper.findById(venueId); createMemberMoneyLog(MoneyLogEnum.JOIN.value, order.getPrice(), memberId, order.getPlatformId(), PayTypeEnum.WEI_XIN.value, null, venue.getId(), venue.getType()); + basketballLog.info("[篮球][支付成功] memberId={}, venueId={}, orderSn={}, price={}, enterFlag={}", + memberId, venueId, order.getOrderSn(), order.getPrice(), enterFlag); if (EnterEnum.OUT.value != enterFlag) { - Integer timePayHour = 8; // 此处修改押金小时数 + Integer timePayHour = 8; if (PayStyleEnum.TIME.getValue() == venue.getPayStyle()) { - // 按次入场先收钱,且多久不收钱,出场不收钱 - // 该用户上次订单的是否逾期 timePayHour = venue.getTimePayHour(); if (timePayHour == null) { timePayHour = 8; @@ -356,6 +376,11 @@ public class VenueEnterService extends BaseServiceImpl { lastOrder.setStatus(BarCodeStatusEnum.USED.getValue()); lastOrder.setModifiedTime(new Date()); barcodeOrderTimeMapper.updateByPrimaryKey(lastOrder); + basketballLog.info("[篮球][出场结算] 出场补交支付完成 orderSn={}, memberId={}, venueId={}", + order.getOrderSn(), memberId, venueId); + } else { + basketballLog.warn("[篮球][出场结算] 未找到对应订单 orderSn={}, memberId={}, venueId={}", + order.getOrderSn(), memberId, venueId); } } } @@ -368,7 +393,6 @@ public class VenueEnterService extends BaseServiceImpl { * @return */ public Pagination memberOrderEnterList(Integer memberId, Pagination pagination) { - // 判断用户信息 if (memberId == null) { throw new ServiceException(com.ydd.framework.core.exception.ExceptionCodeTemplate.NEED_LOGIN); } @@ -381,7 +405,6 @@ public class VenueEnterService extends BaseServiceImpl { * 我的进场订单明细 */ public MemberEnterOrderDTO memberOrderEnterDetail(Integer memberId, Integer enterId) { - // 判断用户信息 if (memberId == null) { throw new ServiceException(com.ydd.framework.core.exception.ExceptionCodeTemplate.NEED_LOGIN); } @@ -407,7 +430,7 @@ public class VenueEnterService extends BaseServiceImpl { } public void enterOrderAccount(Integer enterId, BigDecimal payMoney) { - logger.info("手动结算【" + enterId + "】,结算金额为:" + payMoney); + basketballLog.info("[篮球][手动结算] enterId={}, 结算金额={}", enterId, payMoney); BarcodeOrderTime barcodeOrder = barcodeOrderTimeMapper.selectByPrimaryKey(enterId); if (barcodeOrder == null) { throw new ServiceException("订单不存在!"); @@ -431,7 +454,7 @@ public class VenueEnterService extends BaseServiceImpl { } barcodeOrder.setPaying(1); barcodeOrder.setPayMoney(payMoney); - logger.info("手动结算【" + enterId + "】,结算金额为:" + payMoney + "成功!"); barcodeOrderTimeMapper.updateByPrimaryKey(barcodeOrder); + basketballLog.info("[篮球][手动结算] enterId={}, 结算成功, 金额={}", enterId, payMoney); } } diff --git a/service/src/main/java/com/sv/service/common/BarcodeService.java b/service/src/main/java/com/sv/service/common/BarcodeService.java index a2e5530..5a07283 100644 --- a/service/src/main/java/com/sv/service/common/BarcodeService.java +++ b/service/src/main/java/com/sv/service/common/BarcodeService.java @@ -40,7 +40,8 @@ public class BarcodeService extends BaseServiceImpl { if (res == null) { barcode = MakeCode.makeCode(venueId, memberId, deviceName, enterEnum.getValue() + ""); Barcode b = new Barcode(); - logger.info("用户扫码【" + memberId + "$" + venueId + "】生成二维码为" + barcode); + logger.info("[生成二维码] memberId={}, venueId={}, orderSn={}, enterEnum={}, deviceName={}, barcode={}", + memberId, venueId, orderSn, enterEnum.getValue(), deviceName, barcode); b.setBarcode(barcode); b.setStatus(BarCodeStatusEnum.INIT.getValue()); b.setMemberId(memberId); @@ -50,6 +51,8 @@ public class BarcodeService extends BaseServiceImpl { barcodeMapper.insert(b); }else { barcode = res.getBarcode(); + logger.info("[生成二维码] 复用已有二维码 memberId={}, venueId={}, barcode={}, enter={}", + memberId, venueId, barcode, res.getEnter()); } return barcode; } @@ -59,18 +62,17 @@ public class BarcodeService extends BaseServiceImpl { barcodeDTO.setUsed(false); Barcode code = barcodeMapper.checkIsUsed(barcode); if (code == null) { - logger.error("二维码不存在!!!"); + logger.error("[二维码校验] 二维码不存在 barcode={}", barcode); throw new ServiceException("二维码不存在!"); } if (BarCodeStatusEnum.USED.value == code.getStatus()){ barcodeDTO.setUsed(true); BarcodeOrderTime lastEnterOrder = barcodeOrderTimeMapper.findLastOrder(code.getMemberId(), code.getVenueId()); barcodeDTO.setEnterId(lastEnterOrder.getId()); + logger.info("[二维码校验] 已使用 memberId={}, venueId={}, enterId={}", code.getMemberId(), code.getVenueId(), lastEnterOrder.getId()); + } else { + logger.info("[二维码校验] 未使用 memberId={}, venueId={}", code.getMemberId(), code.getVenueId()); } - logger.info("barcode check used =====" + barcode); - logger.info("barcode check used =====" + barcodeDTO.isUsed()); - logger.info("barcode check used =====" + barcodeDTO.getEnterId()); return barcodeDTO; } } - diff --git a/service/src/main/java/com/sv/service/common/MemberMoney.java b/service/src/main/java/com/sv/service/common/MemberMoney.java index ef51ef2..5a6d6bb 100644 --- a/service/src/main/java/com/sv/service/common/MemberMoney.java +++ b/service/src/main/java/com/sv/service/common/MemberMoney.java @@ -4,6 +4,8 @@ import com.enums.MoneyLogEnum; import com.sv.entity.MemberMoneyLog; import com.sv.service.api.MemberMoneyLogService; import com.sv.service.api.MemberService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,6 +14,8 @@ import java.math.BigDecimal; @Service public class MemberMoney { + private final Logger logger = LoggerFactory.getLogger(MemberMoney.class); + @Resource private MemberMoneyLogService memberMoneyLogService; @Resource @@ -19,15 +23,6 @@ public class MemberMoney { /** * 修改用户余额,并且生成记录 - * @param memberId - * @param platformId - * @param type - * @param price - * @param payType - * @param cardType - * @param venueId - * @param venueType - * @param lessonId */ @Transactional public void create(Integer memberId, Integer platformId, Integer type, BigDecimal price, Integer payType, @@ -46,8 +41,12 @@ public class MemberMoney { if (type.intValue() != MoneyLogEnum.VIPCARD.value && type.intValue() != MoneyLogEnum.BUY_LESSON.value && type.intValue() != MoneyLogEnum.REFUND.value && type.intValue() != MoneyLogEnum.APPLY_MONEY_SUCCESS.value && type.intValue() != MoneyLogEnum.JOIN.value){ - // 修改用户余额 memberService.updateMoney(memberId,price); + logger.info("[资金] 修改余额 memberId={}, type={}, price={}, payType={}, venueId={}", + memberId, type, price, payType, venueId); + } else { + logger.info("[资金] 记录资金流水(不修改余额) memberId={}, type={}, price={}, payType={}, venueId={}", + memberId, type, price, payType, venueId); } } }