| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.dsh.other.entity.*; |
| | | import com.dsh.other.enums.EnableStatusEnum; |
| | | import com.dsh.other.enums.QrLinkTypeEnum; |
| | | import com.dsh.other.enums.SiteBookingStatusEnum; |
| | | import com.dsh.other.mapper.QrLinkMapper; |
| | | import com.dsh.other.feignclient.CourseRecordClient; |
| | | import com.dsh.other.feignclient.account.CityManagerClient; |
| | | import com.dsh.other.feignclient.activity.UserCouponClient; |
| | |
| | | import io.swagger.annotations.ApiImplicitParam; |
| | | import io.swagger.annotations.ApiImplicitParams; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | |
| | | import java.time.DayOfWeek; |
| | | import java.time.LocalDate; |
| | | import java.util.*; |
| | | import java.security.SecureRandom; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @RestController |
| | | @RequestMapping("") |
| | | @Slf4j |
| | | public class SiteController { |
| | | |
| | | private static final char[] ENTRY_CODE_CHARS = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz".toCharArray(); |
| | | private final SecureRandom entryCodeRandom = new SecureRandom(); |
| | | |
| | | @Autowired |
| | | private ISiteService siteService; |
| | |
| | | |
| | | @Autowired |
| | | private ISiteBookingService siteBookingService; |
| | | |
| | | @Resource |
| | | private QrLinkMapper qrLinkMapper; |
| | | |
| | | @Resource |
| | | private UserCouponClient userCouponClient; |
| | |
| | | @RequestMapping("/base/site/getList") |
| | | @ResponseBody |
| | | public List<Site> getList() { |
| | | return siteService.list(new QueryWrapper<Site>().ne("state", 3)); |
| | | return siteService.list(new QueryWrapper<Site>() |
| | | .ne("state", 3) |
| | | .orderByDesc("insertTime") |
| | | .orderByDesc("id")); |
| | | } |
| | | |
| | | /** |
| | |
| | | String trade_no = map.get("trade_no"); |
| | | SiteBooking siteBooking = siteBookingService.getOne(new QueryWrapper<SiteBooking>() |
| | | .eq("orderNo", code).eq("state", 1)); |
| | | if (siteBooking == null) { |
| | | throw new IllegalStateException("未找到支付宝回调对应的场地预约订单:" + code); |
| | | } |
| | | if (siteBooking.getStatus() == 0) { |
| | | siteBooking.setPayTime(new Date()); |
| | | siteBooking.setStatus(1); |
| | | siteBooking.setPayOrderNo(trade_no); |
| | | siteBookingService.updateById(siteBooking); |
| | | } |
| | | // 已处理的重复通知也必须确认 success,避免支付宝持续重试。 |
| | | PrintWriter out = response.getWriter(); |
| | | out.write("success"); |
| | | out.flush(); |
| | | out.close(); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | } |
| | | } |
| | | |
| | | @ResponseBody |
| | | @GetMapping("/api/site/entryQr") |
| | | @ApiOperation(value = "获取订场进场二维码", tags = {"用户—预约场地"}) |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(value = "预约数据 id", name = "bookingId", dataType = "int", required = true), |
| | | @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header") |
| | | }) |
| | | public ResultUtil<Map<String, Object>> entryQr(Integer bookingId) { |
| | | try { |
| | | Integer uid = tokenUtil.getUserIdFormRedis(); |
| | | if (uid == null) return ResultUtil.tokenErr(); |
| | | SiteBooking booking = siteBookingService.getById(bookingId); |
| | | if (booking == null || !uid.equals(booking.getAppUserId())) return ResultUtil.error("预约记录不存在"); |
| | | if (SiteBookingStatusEnum.EXPIRED.getCode().equals(booking.getStatus()) |
| | | || SiteBookingStatusEnum.CANCELED.getCode().equals(booking.getStatus())) { |
| | | return ResultUtil.error("当前预约不可使用二维码"); |
| | | } |
| | | QrLink link = qrLinkMapper.selectOne(new QueryWrapper<QrLink>() |
| | | .eq("type", QrLinkTypeEnum.BOOKING_ENTRY.getCode()) |
| | | .eq("bookingId", bookingId) |
| | | .eq("enabled", EnableStatusEnum.ENABLED.getCode()) |
| | | .last("limit 1")); |
| | | if (link == null || (link.getExpiresAt() != null && link.getExpiresAt().before(new Date()))) { |
| | | link = createEntryQrLink(booking, bookingId); |
| | | } |
| | | Map<String, Object> data = new HashMap<>(); |
| | | data.put("shortCode", link.getShortCode()); |
| | | data.put("url", "https://online.daowepark.com/other/q/" + link.getShortCode()); |
| | | data.put("expiresAt", link.getExpiresAt()); |
| | | return ResultUtil.success(data); |
| | | } catch (Exception e) { |
| | | log.error("[SITE_ENTRY_QR] generate failed, bookingId={}", bookingId, e); |
| | | return ResultUtil.runErr(); |
| | | } |
| | | } |
| | | |
| | | /** 创建与预约记录绑定的进场二维码短链。 */ |
| | | private QrLink createEntryQrLink(SiteBooking booking, Integer bookingId) { |
| | | QrLink link = new QrLink(); |
| | | link.setType(QrLinkTypeEnum.BOOKING_ENTRY.getCode()); |
| | | link.setBookingId(bookingId); |
| | | link.setStoreId(booking.getStoreId()); |
| | | link.setSiteId(booking.getSiteId()); |
| | | link.setEnabled(EnableStatusEnum.ENABLED.getCode()); |
| | | link.setExpiresAt(booking.getEndTime()); |
| | | link.setShortCode(nextEntryQrCode()); |
| | | qrLinkMapper.insert(link); |
| | | return link; |
| | | } |
| | | |
| | | /** 生成数据库中尚未使用的十位进场二维码短码。 */ |
| | | private String nextEntryQrCode() { |
| | | String code; |
| | | do { |
| | | StringBuilder builder = new StringBuilder(10); |
| | | for (int index = 0; index < 10; index++) { |
| | | builder.append(ENTRY_CODE_CHARS[entryCodeRandom.nextInt(ENTRY_CODE_CHARS.length)]); |
| | | } |
| | | code = builder.toString(); |
| | | } while (qrLinkMapper.selectCount(new QueryWrapper<QrLink>().eq("shortCode", code)) > 0); |
| | | return code; |
| | | } |
| | | |
| | | public List<Integer> getIds(Integer siteId) { |
| | | HttpRequest httpRequest = HttpRequest.get("https://port.daowepark.com/v7/user_api/general/get_space_area?space_id=" + siteId); |
| | | HttpResponse execute = httpRequest.execute(); |