Commit cd16e914 authored by daniel's avatar daniel

fix(bus): 新增分页+返回工具重构

parent 713ee32c
package com.dlbridge.jadp.common.web;
import lombok.Data;
/**
* 通用接口返回结果
*/
@Data
public class Result<T> {
private int code;
private String msg;
private T content;
private boolean status;
public Result() {}
// ✅ 泛型安全的成功结果(无 content)
public static <T> Result<T> success() {
Result<T> result = new Result<>();
result.setCode(ResultStatus.SUCCESS.code);
result.setMsg(ResultStatus.SUCCESS.msg);
result.setStatus(true);
return result;
}
// ✅ 泛型安全的成功结果(带 content)
public static <T> Result<T> success(T content) {
Result<T> result = success();
result.setContent(content);
return result;
}
// ✅ 泛型安全的失败结果
public static <T> Result<T> fail() {
Result<T> result = new Result<>();
result.setCode(ResultStatus.FAIL.code);
result.setMsg(ResultStatus.FAIL.msg);
result.setStatus(false);
return result;
}
// ✅ 可自定义失败信息
public static <T> Result<T> fail(String msg) {
Result<T> result = fail();
result.setMsg(msg);
return result;
}
}
\ No newline at end of file
package com.dlbridge.jadp.common.web;
public enum ResultStatus {
SUCCESS(200, "成功"),
FAIL(-1, "失败");
final int code;
final String msg;
ResultStatus(int code, String msg) {
this.code = code;
this.msg = msg;
}
public String toString() {
return this.msg;
}
}
package com.dlbridge.jadp.plugins.cmpt.dao.mapper;
import com.dlbridge.jadp.plugins.cmpt.dto.BusSchedule;
import com.dlbridge.jadp.plugins.cmpt.dto.BusStation;
import com.dlbridge.jadp.plugins.cmpt.dto.BusTicketVerification;
import com.dlbridge.jadp.plugins.cmpt.dto.BusVerificationRecord;
import com.dlbridge.jadp.plugins.cmpt.dao.model.param.BusVerifyRecordParam;
import com.dlbridge.jadp.plugins.cmpt.dto.*;
import feign.Param;
import java.util.List;
......@@ -65,4 +63,12 @@ public interface BusMapper {
List<BusVerificationRecord> selectVerificationRecord(@Param("cmptId") Integer cmptId, @Param("verifierId") String verifierId, @Param("ticketNo") String ticketNo);
/**
* 查询班车核销记录列表
* @param queryDTO 查询参数
* @return 班车核销记录分页列表
*/
List<BusVerificationRecord> selectVerifyRecordByPage(BusVerifyRecordParam queryDTO);
}
......@@ -208,5 +208,28 @@
AND bvr.ticket_no = #{ticketNo}
</if>
</select>
<select id="selectVerifyRecordByPage" resultType="com.dlbridge.jadp.plugins.cmpt.dto.BusVerificationRecord">
SELECT
bvr.id,
bvr.schedule_id scheduleId,
bvr.verifier_id verifierId,
bvr.verification_time verificationTime,
bvr.ticket_id ticketId,
btv.cmpt_id cmptId,
btv.ticket_no ticketNo,
btv.passenger_name passengerName,
bs.schedule_name scheduleName,
bs.license_plate licensePlate
FROM gksite.bus_verification_record bvr
INNER JOIN gksite.bus_ticket_verification btv ON btv.id = bvr.ticket_id
INNER JOIN gksite.bus_schedule bs ON bs.id = bvr.schedule_id
WHERE 1 = 1
AND bvr.cmpt_id = #{cmptId}
<if test="verifierId != null and verifierId != ''">
AND bvr.verifier_id = #{verifierId}
</if>
<if test="ticketNo != null and ticketNo != '' ">
AND bvr.ticket_no = #{ticketNo}
</if>
</select>
</mapper>
\ No newline at end of file
package com.dlbridge.jadp.plugins.cmpt.dao.model.param;
import com.dlbridge.jadp.plugins.cmpt.dto.PageDTO;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false)
@Data
public class BusVerifyRecordParam extends PageDTO {
private Integer cmptId;
private String ticketNo;
private Integer scheduleId;
private String idNumber;
private Long qrTimestamp;
private String verifierId;
private String deviceId;
}
package com.dlbridge.jadp.plugins.cmpt.service;
import com.dlbridge.jadp.common.web.Result;
import com.dlbridge.jadp.plugins.cmpt.dao.mapper.BusMapper;
import com.dlbridge.jadp.plugins.cmpt.dao.model.param.BusParam;
import com.dlbridge.jadp.plugins.cmpt.dao.model.param.BusVerifyRecordParam;
import com.dlbridge.jadp.plugins.cmpt.dao.model.vo.BusVerifyStatistics;
import com.dlbridge.jadp.plugins.cmpt.dto.BusSchedule;
import com.dlbridge.jadp.plugins.cmpt.dto.BusStation;
import com.dlbridge.jadp.plugins.cmpt.dto.BusTicketVerification;
import com.dlbridge.jadp.plugins.cmpt.dto.BusVerificationRecord;
import com.dlbridge.jadp.plugins.cmpt.dto.*;
import com.dlbridge.jadp.plugins.cmpt.utils.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.neusoft.www.utils.web.Result;
import feign.Param;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.dlbridge.jadp.plugins.cmpt.utils.PageConvertUtil;
import javax.annotation.Resource;
import java.io.ByteArrayOutputStream;
......@@ -94,25 +95,25 @@ public class BusService {
@Transactional
public Result verifyTicket(BusParam param) {
if (param.getCmptId() == null || param.getScheduleId() == null || StringUtils.isBlank(param.getTicketNo()) || param.getQrTimestamp() == null) {
return Result.fail().setMsg("主要参数不能为空");
return Result.fail("主要参数不能为空");
}
// 验证二维码时效性(1分钟)
long currentTime = System.currentTimeMillis();
if (currentTime - param.getQrTimestamp() > 60000) {
return Result.fail().setMsg("二维码已过期,请重新生成");
return Result.fail("二维码已过期,请重新生成");
}
// 查询票务信息
BusTicketVerification ticket = busMapper.selectTicketForVerification(param.getCmptId(), param.getTicketNo(), param.getScheduleId());
if (ticket == null) {
return Result.fail().setMsg("未找到有效的车票信息");
return Result.fail("未找到有效的车票信息");
}
// 检查是否允许多次核销
if (ticket.getAllowMultipleVerification() == 0) {
if (ticket.getVerificationCount() > 0) {
return Result.fail().setMsg("该车票已核销,不支持多次核销");
return Result.fail("该车票已核销,不支持多次核销");
}
}
......@@ -190,4 +191,37 @@ public class BusService {
.collect(Collectors.toList());
}
/**
* 查询班车核销记录列表
* @param queryDTO 查询参数
* @return 班车核销记录分页列表
*/
// public Page<List<BusVerificationRecord>> verifyPageRecord(BusVerifyRecordDTO queryDTO) {
// // int pageNum = queryDTO.getPageNum();
// // int pageSize = queryDTO.getPageSize();
// // // 使用 PageHelper 进行分页
// // PageHelper.startPage(pageNum, pageSize);
// //
// // List<BusVerificationRecord> feedbackList = busMapper.selectVerifyRecordByPage(queryDTO);
// // int total = busMapper.selectVerifyRecordCount(queryDTO);
// //
// // Page<List<BusVerificationRecord>> page = new Page<>();
// // page.setTotal(total);
// // page.setFirst(pageNum == 1);
// // page.setLast(pageNum * pageSize >= total);
// // page.setCurrent(pageNum);
// // page.setSize(pageSize);
// // page.setContent(feedbackList);
// //
// // return page;
// PageHelper.startPage(queryDTO.getPageNum(), queryDTO.getPageSize());
// List<BusVerificationRecord> list = busMapper.selectVerifyRecordByPage(queryDTO);
// return new PageInfo<>(list);
// }
public Page<List<BusVerificationRecord>> verifyPageRecord(BusVerifyRecordParam queryDTO) {
PageHelper.startPage(queryDTO.getPageNum(), queryDTO.getPageSize());
List<BusVerificationRecord> list = busMapper.selectVerifyRecordByPage(queryDTO);
PageInfo<BusVerificationRecord> pageInfo = new PageInfo<>(list);
return PageConvertUtil.convert(pageInfo);
}
}
package com.dlbridge.jadp.plugins.cmpt.utils;
import com.github.pagehelper.PageInfo;
import java.util.List;
/**
* 分页结果转换工具类
*/
public class PageConvertUtil {
/**
* 将 PageInfo<T> 转换为自定义 Page<List<T>>
*
* @param pageInfo PageHelper 分页结果
* @param <T> 数据类型
* @return 自定义分页对象
*/
public static <T> Page<List<T>> convert(PageInfo<T> pageInfo) {
Page<List<T>> page = new Page<>();
page.setTotal((int) pageInfo.getTotal());
page.setCurrent(pageInfo.getPageNum());
page.setSize(pageInfo.getPageSize());
page.setContent(pageInfo.getList());
// 是否第一页、最后一页
page.setFirst(pageInfo.isIsFirstPage());
page.setLast(pageInfo.isIsLastPage());
return page;
}
}
package com.dlbridge.jadp.plugins.cmpt.web;
import com.dlbridge.jadp.common.web.Result;
import com.dlbridge.jadp.plugins.cmpt.dao.model.param.BusParam;
import com.dlbridge.jadp.plugins.cmpt.dao.model.param.BusVerifyRecordParam;
import com.dlbridge.jadp.plugins.cmpt.dao.model.vo.BusVerifyStatistics;
import com.dlbridge.jadp.plugins.cmpt.dto.BusSchedule;
import com.dlbridge.jadp.plugins.cmpt.dto.BusStation;
import com.dlbridge.jadp.plugins.cmpt.dto.BusTicketVerification;
import com.dlbridge.jadp.plugins.cmpt.dto.BusVerificationRecord;
import com.dlbridge.jadp.plugins.cmpt.dto.*;
import com.dlbridge.jadp.plugins.cmpt.service.BusService;
import com.neusoft.www.utils.web.Result;
import com.dlbridge.jadp.plugins.cmpt.utils.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
......@@ -19,39 +20,42 @@ import javax.annotation.Resource;
import java.util.List;
@Controller
@RequestMapping("gk/bus/")
@RequestMapping("gk/bus")
@Api(value = "班车模块", tags = "班车模块")
public class BusController {
@Resource
private BusService busService;
/**
* 查询个人购票列表
* @return
* @return 个人购票列表
*/
@ResponseBody
@ApiOperation(value = "获取个人购票列表", notes = "获取个人购票列表")
@RequestMapping(value = "/mine/tickets", method = RequestMethod.POST)
public Result getPersonalTickets(@RequestBody BusParam param) {
public Result<List<BusTicketVerification>> getPersonalTickets(@RequestBody BusParam param) {
List<BusTicketVerification> tickets = busService.selectTicketByIdNumber(param.getCmptId(), param.getIdNumber());
return Result.success().setContent(tickets);
return Result.success(tickets);
}
/**
* 查询车票详情
* @param param
* @return
* @param param 查询参数
* @return 车票详情
*/
@ResponseBody
@RequestMapping(value = "/ticket/detail", method = RequestMethod.POST)
public Result getTicketDetail(@RequestBody BusParam param) {
@ApiOperation(value = "获取车票详情", notes = "获取车票详情")
public Result<BusTicketVerification> getTicketDetail(@RequestBody BusParam param) {
BusTicketVerification ticket = busService.getTicketDetail(param.getCmptId(), param.getTicketNo());
return Result.success().setContent(ticket);
return Result.success(ticket);
}
/**
* 生成车票二维码
* @param cmptId
* @param ticketNo
* @return
* @param cmptId 赛事ID
* @param ticketNo 车票号
* @return 乘车二维码图片
*/
@RequestMapping("/ticket/qrcode/{cmptId}/{ticketNo}")
public ResponseEntity<byte[]> generateBusQRCode(@PathVariable("cmptId") Integer cmptId, @PathVariable("ticketNo") String ticketNo) {
......@@ -65,69 +69,87 @@ public class BusController {
/**
* 车票核销接口
* @return
* @return 核销结果
*/
@ResponseBody
@ApiOperation(value = "核销车票", notes = "核销车票")
@RequestMapping(value = "/ticket/verify", method = RequestMethod.POST)
public Result verifyTicket(@RequestBody BusParam param) {
public Result<?> verifyTicket(@RequestBody BusParam param) {
return busService.verifyTicket(param);
}
/**
* 查询赛事班车列表接口
* @return
* @return 班车列表
*/
@ResponseBody
@ApiOperation(value = "获取赛事班车列表", notes = "获取赛事班车列表")
@RequestMapping(value = "/schedules", method = RequestMethod.POST)
public Result selectSchedulesByCmptId(@RequestBody BusParam param) {
public Result<?> selectSchedulesByCmptId(@RequestBody BusParam param) {
List<BusSchedule> schedules = busService.selectSchedulesByCmptId(param.getCmptId());
List<BusStation> stations = busService.selectStationsByScheduleId(param.getScheduleId());
return Result.success().setContent(schedules);
return Result.success(schedules);
}
/**
* 查询班次途经站点列表
* @return
* @return 班次途经站点列表
*/
@ResponseBody
@ApiOperation(value = "获取班次途经站点列表", notes = "获取班次途经站点列表")
@RequestMapping(value = "/schedule-stations", method = RequestMethod.POST)
public Result selectStationsByScheduleId(@RequestBody BusParam param) {
public Result<?> selectStationsByScheduleId(@RequestBody BusParam param) {
List<BusStation> stations = busService.selectStationsByScheduleId(param.getScheduleId());
return Result.success().setContent(stations);
return Result.success(stations);
}
/**
* 查询赛事班车站点列表
* @return
* @return 班车站点列表
*/
@ResponseBody
@ApiOperation(value = "获取赛事班车站点列表", notes = "获取赛事班车站点列表")
@RequestMapping(value = "/cmpt-stations", method = RequestMethod.POST)
public Result selectStationsByCmptId(@RequestBody BusParam param) {
public Result<?> selectStationsByCmptId(@RequestBody BusParam param) {
List<BusStation> stations = busService.selectStationsByCmptId(param.getCmptId());
return Result.success().setContent(stations);
return Result.success(stations);
}
/**
* 查询核销记录接口
* @return
* @return 核销记录列表
*/
@ResponseBody
@ApiOperation(value = "获取核销记录", notes = "获取核销记录")
@RequestMapping(value = "/verification-record", method = RequestMethod.POST)
public Result selectVerificationRecord(@RequestBody BusParam param) {
public Result<?> selectVerificationRecord(@RequestBody BusParam param) {
List<BusVerificationRecord> records = busService.selectVerificationRecord(param.getCmptId(), param.getVerifierId(), param.getTicketNo());
return Result.success().setContent(records);
return Result.success(records);
}
/**
* 赛事核销统计
* @param cmptId 赛事ID
* @return
* @return 核销统计列表
*/
@ResponseBody
@ApiOperation(value = "获取赛事核销统计", notes = "获取赛事核销统计")
@RequestMapping(value = "/verify-statistics/{cmptId}", method = RequestMethod.GET)
public Result busVerifyStatistics(@PathVariable("cmptId") Integer cmptId) {
public Result<?> busVerifyStatistics(@PathVariable("cmptId") Integer cmptId) {
List<BusVerifyStatistics> statistics = busService.busVerifyStatistics(cmptId);
return Result.success().setContent(statistics);
return Result.success(statistics);
}
/**
* 查询班车核销记录分页列表接口
* @param queryDTO 查询参数
* @return 班车核销记录分页列表
*/
@PostMapping("/verification-page-record")
@ApiOperation(value = "获取操作日志列表", notes = "获取操作日志列表")
public Result<?> verifyPageRecord(@RequestBody BusVerifyRecordParam queryDTO) {
Page<List<BusVerificationRecord>> result = busService.verifyPageRecord(queryDTO);
return Result.success(result);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment