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));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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,11 +34,10 @@
|
||||
<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>
|
||||
|
||||
<!-- root -->
|
||||
<root level="info">
|
||||
<appender-ref ref="STDOUT" />
|
||||
<appender-ref ref="COMMON-DEFAULT" />
|
||||
|
||||
@@ -44,53 +44,61 @@ public class BarcodeTimeOrderTask {
|
||||
|
||||
@Scheduled(cron = "0 0/8 * * * ?")
|
||||
public void execute(){
|
||||
logger.error("执行BarcodeTimeOrderTask.execute");
|
||||
Date date = new Date();
|
||||
List<BarcodeOrderTime> 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<BarcodeOrderTime> 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);
|
||||
}
|
||||
|
||||
@@ -92,4 +92,4 @@ logging:
|
||||
level:
|
||||
com:
|
||||
sv:
|
||||
mapper: DEBUG
|
||||
mapper: WARN
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -15,10 +14,10 @@
|
||||
<file>${LOG_HOME}/common-default.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${LOG_HOME}/common-default-%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<MaxHistory>30</MaxHistory>
|
||||
<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>
|
||||
|
||||
@@ -30,10 +29,10 @@
|
||||
</filter>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${LOG_HOME}/common-error-%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<MaxHistory>30</MaxHistory>
|
||||
<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>
|
||||
|
||||
@@ -42,10 +41,10 @@
|
||||
<file>${LOG_HOME}/task/task.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${LOG_HOME}/task/task-%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<MaxHistory>30</MaxHistory>
|
||||
<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>
|
||||
|
||||
@@ -53,7 +52,8 @@
|
||||
<appender-ref ref="TASK-SERVICE" />
|
||||
</logger>
|
||||
|
||||
<!-- root -->
|
||||
<logger name="com.sv.mapper" level="WARN"/>
|
||||
|
||||
<root level="info">
|
||||
<appender-ref ref="STDOUT" />
|
||||
<appender-ref ref="COMMON-DEFAULT" />
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<String,String> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<String,String> 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<VenuePrice> 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 {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user