Drew 6 lat temu
rodzic
commit
002d6c98f4

+ 10 - 3
src/main/java/com/izouma/ticketExchange/domain/Schedule.java

@@ -1,14 +1,15 @@
 package com.izouma.ticketExchange.domain;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.annotations.ApiModel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
+import javax.persistence.*;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -49,4 +50,10 @@ public class Schedule extends AuditedEntity {
 
     private LocalDate showDate;
 
+    private Boolean isExpired;
+
+//    @ManyToOne(fetch = FetchType.LAZY)
+//    @JoinColumn(name = "cinemaId", insertable = false, updatable = false)
+//    @NotFound(action = NotFoundAction.IGNORE)
+//    private Show showInfo;
 }

+ 7 - 0
src/main/java/com/izouma/ticketExchange/repo/ScheduleRepo.java

@@ -1,7 +1,14 @@
 package com.izouma.ticketExchange.repo;
 
 import com.izouma.ticketExchange.domain.Schedule;
+import com.izouma.ticketExchange.domain.Show;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
 
 public interface ScheduleRepo extends JpaRepository<Schedule, Long> {
+    List<Schedule> findByCinemaIdAndShowIdAndShowTimeAfter(Long cinemaId, Long showId, LocalDateTime date);
 }

+ 4 - 1
src/main/java/com/izouma/ticketExchange/repo/ShowRepo.java

@@ -6,7 +6,10 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
 
 import java.time.LocalDate;
+import java.util.List;
 
 public interface ShowRepo extends JpaRepository<Show, Long> {
-
+    @Query("select show from Schedule schedule join com.izouma.ticketExchange.domain.Show show on schedule.showId = show.id " +
+            "where schedule.cinemaId = ?1 and schedule.showDate >= ?2 group by show.id")
+    List<Show> getCinemaShows(Long cinemaId, LocalDate date);
 }

+ 19 - 0
src/main/java/com/izouma/ticketExchange/service/CinemaService.java

@@ -2,9 +2,13 @@ package com.izouma.ticketExchange.service;
 
 import com.izouma.ticketExchange.domain.Cinema;
 import com.izouma.ticketExchange.domain.CouponInfo;
+import com.izouma.ticketExchange.domain.Schedule;
+import com.izouma.ticketExchange.domain.Show;
 import com.izouma.ticketExchange.exception.BusinessException;
 import com.izouma.ticketExchange.repo.CinemaRepo;
 import com.izouma.ticketExchange.repo.CouponInfoRepo;
+import com.izouma.ticketExchange.repo.ScheduleRepo;
+import com.izouma.ticketExchange.repo.ShowRepo;
 import com.izouma.ticketExchange.utils.MapUtils;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
@@ -13,7 +17,11 @@ import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.regex.Pattern;
 
 @Service
@@ -21,6 +29,8 @@ import java.util.regex.Pattern;
 public class CinemaService {
     private CinemaRepo     cinemaRepo;
     private CouponInfoRepo couponInfoRepo;
+    private ScheduleRepo   scheduleRepo;
+    private ShowRepo       showRepo;
 
     public Page<Cinema> getByCity(Long cityId, Long couponId, String regionName, Double lat, Double lng, Pageable pageable) {
         CouponInfo couponInfo = couponInfoRepo.findById(couponId).orElseThrow(new BusinessException("无记录"));
@@ -53,4 +63,13 @@ public class CinemaService {
     public String[] getRegions(Long cityId) {
         return cinemaRepo.findRegionsByCityId(cityId);
     }
+
+    public Map getCinemaShows(Long cinemaId, Long couponId, Long showId) {
+        Cinema cinema = cinemaRepo.findById(cinemaId).orElseThrow(new BusinessException("无记录"));
+        List<Show> shows = showRepo.getCinemaShows(cinemaId, LocalDate.now());
+        Map<String, Object> map = new HashMap<>();
+        map.put("cinema", cinema);
+        map.put("shows", shows);
+        return map;
+    }
 }

+ 58 - 0
src/main/java/com/izouma/ticketExchange/service/ScheduleService.java

@@ -0,0 +1,58 @@
+package com.izouma.ticketExchange.service;
+
+import com.izouma.ticketExchange.domain.Schedule;
+import com.izouma.ticketExchange.repo.ScheduleRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static java.time.temporal.ChronoUnit.DAYS;
+
+@Service
+@AllArgsConstructor
+public class ScheduleService {
+    private ScheduleRepo scheduleRepo;
+
+    public List cinemaSchedule(Long cinemaId, Long showId) {
+        List<Schedule> scheduleList = scheduleRepo.findByCinemaIdAndShowIdAndShowTimeAfter(cinemaId, showId, LocalDateTime.now());
+        return scheduleList.stream()
+                           .sorted(Comparator.comparing(Schedule::getShowDate))
+                           .collect(Collectors.groupingBy(schedule -> {
+                               String date = schedule.getShowDate().format(DateTimeFormatter.ofPattern("MM-dd"));
+                               switch ((int) DAYS.between(LocalDate.now(), schedule.getShowDate())) {
+                                   case 0:
+                                       date = "今天" + date;
+                                       break;
+                                   case 1:
+                                       date = "明天" + date;
+                                       break;
+                                   case 2:
+                                       date = "后天" + date;
+                                       break;
+                                   default:
+                                       String[] weekDays = {"周一", "周二", "周三", "周四", "周五", "周六", "周日"};
+                                       date = weekDays[schedule.getShowDate().getDayOfWeek().getValue()] + date;
+                               }
+                               return date;
+                           }, Collectors.mapping(location -> location, Collectors.toList())))
+                           .entrySet()
+                           .stream()
+                           .map((Function<Map.Entry<String, List<Schedule>>, Map>) stringListEntry -> {
+                               Map<String, Object> map = new HashMap<>();
+                               stringListEntry.getValue().sort(Comparator.comparing(Schedule::getShowTime));
+                               map.put("showDate", stringListEntry.getKey());
+                               map.put("schedules", stringListEntry.getValue());
+                               return map;
+                           })
+                           .collect(Collectors.toList());
+    }
+}

+ 51 - 0
src/main/java/com/izouma/ticketExchange/service/SeatService.java

@@ -0,0 +1,51 @@
+package com.izouma.ticketExchange.service;
+
+import com.izouma.ticketExchange.domain.Cinema;
+import com.izouma.ticketExchange.domain.Schedule;
+import com.izouma.ticketExchange.domain.Show;
+import com.izouma.ticketExchange.exception.BusinessException;
+import com.izouma.ticketExchange.repo.CinemaRepo;
+import com.izouma.ticketExchange.repo.ScheduleRepo;
+import com.izouma.ticketExchange.repo.ShowRepo;
+import com.taobao.api.ApiException;
+import com.taobao.api.response.FilmDataThirdPartySeatMapResponse;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
+import java.util.function.ToIntFunction;
+import java.util.stream.Collectors;
+
+import static java.time.temporal.ChronoUnit.DAYS;
+
+@Service
+@AllArgsConstructor
+public class SeatService {
+    private TppService   tppService;
+    private ScheduleRepo scheduleRepo;
+    private ShowRepo     showRepo;
+    private CinemaRepo   cinemaRepo;
+
+    public Map seatMap(Long scheduleId, Long couponId) throws ApiException {
+        Schedule schedule = scheduleRepo.findById(scheduleId).orElseThrow(new BusinessException("无记录"));
+        Show show = showRepo.findById(schedule.getShowId()).orElseThrow(new BusinessException("无记录"));
+        Cinema cinema = cinemaRepo.findById(schedule.getCinemaId()).orElseThrow(new BusinessException("无记录"));
+        FilmDataThirdPartySeatMapResponse.TopSeatMap seatMap = tppService.getSeatMap(scheduleId);
+        Map<String, Object> map = new HashMap<>();
+        map.put("seatMap", seatMap);
+        map.put("show", show);
+        map.put("cinema", cinema);
+        map.put("width", seatMap.getSeats().stream().mapToInt(value -> Math.toIntExact(value.getLeftPx())).max().orElse(0) - seatMap.getSeats().stream().mapToInt(value -> Math.toIntExact(value.getLeftPx())).min().orElse(0));
+        map.put("height", seatMap.getSeats().stream().mapToInt(value -> Math.toIntExact(value.getTopPx())).max().orElse(0) - seatMap.getSeats().stream().mapToInt(value -> Math.toIntExact(value.getTopPx())).min().orElse(0));
+        map.put("rowNames", new ArrayList<>(seatMap.getSeats()
+                                                   .stream()
+                                                   .collect(Collectors.groupingBy(FilmDataThirdPartySeatMapResponse.Seat::getRowName))
+                                                   .keySet())
+                .stream().sorted(Comparator.comparingInt(Integer::parseInt)).collect(Collectors.toList()));
+        return map;
+    }
+}

+ 7 - 2
src/main/java/com/izouma/ticketExchange/service/TppService.java

@@ -175,6 +175,7 @@ public class TppService {
                                          .serviceFee(BigDecimal.valueOf(Optional.ofNullable(s.getServiceFee()).orElse(0L) / 100f))
                                          .showVersion(s.getShowVersion())
                                          .showDate(DateTimeUtils.toLocalDate(s.getShowDate(), "yyyy-MM-dd"))
+                                         .isExpired(s.getIsExpired())
                                          .build());
             });
             scheduleRepo.saveAll(scheduleList);
@@ -184,13 +185,17 @@ public class TppService {
         throw new BusinessException("获取排片失败");
     }
 
-    public void getSeats(Long scheduleId) throws ApiException {
+    public FilmDataThirdPartySeatMapResponse.TopSeatMap getSeatMap(Long scheduleId) throws ApiException {
         FilmDataThirdPartySeatMapRequest req = new FilmDataThirdPartySeatMapRequest();
         req.setPlatform(platform);
         req.setParamsString("{}");
         req.setUserId(userId);
         req.setScheduleId(scheduleId);
         FilmDataThirdPartySeatMapResponse rsp = client.execute(req);
-        System.out.println(rsp.getBody());
+        if (rsp.getResult() != null && rsp.getResult().getReturnCode().equals("0")) {
+            return rsp.getResult().getReturnValue();
+        }
+        log.error("获取座位图失败\n\t{}", rsp.getBody());
+        throw new BusinessException("获取座位图失败");
     }
 }

+ 11 - 2
src/main/java/com/izouma/ticketExchange/web/CinemaController.java

@@ -1,7 +1,11 @@
 package com.izouma.ticketExchange.web;
 
 import com.izouma.ticketExchange.domain.Cinema;
+import com.izouma.ticketExchange.domain.Show;
+import com.izouma.ticketExchange.exception.BusinessException;
+import com.izouma.ticketExchange.repo.CinemaRepo;
 import com.izouma.ticketExchange.service.CinemaService;
+import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -13,11 +17,11 @@ import java.util.Map;
 
 @RestController
 @RequestMapping("/cinema")
+@AllArgsConstructor
 public class CinemaController {
-    @Autowired
     private CinemaService cinemaService;
 
-    @GetMapping("city/{cityId}")
+    @GetMapping("/city/{cityId}")
     public Map getByCity(@PathVariable Long cityId, Long couponId, String regionName,
                          Double lat, Double lng, Pageable pageable) {
         Map<String, Object> map = new HashMap<>();
@@ -25,4 +29,9 @@ public class CinemaController {
         map.put("regions", cinemaService.getRegions(cityId));
         return map;
     }
+
+    @GetMapping("/{cinemaId}/shows")
+    public Map shows(@PathVariable Long cinemaId, Long couponId, Long showId) {
+        return cinemaService.getCinemaShows(cinemaId, couponId, showId);
+    }
 }

+ 21 - 0
src/main/java/com/izouma/ticketExchange/web/ScheduleController.java

@@ -0,0 +1,21 @@
+package com.izouma.ticketExchange.web;
+
+import com.izouma.ticketExchange.service.ScheduleService;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/schedule")
+@AllArgsConstructor
+public class ScheduleController {
+
+    private ScheduleService scheduleService;
+
+    @GetMapping("/cinema/{cinemaId}")
+    public List cinemaSchedule(@PathVariable Long cinemaId, @RequestParam Long showId) {
+        return scheduleService.cinemaSchedule(cinemaId, showId);
+    }
+}

+ 20 - 0
src/main/java/com/izouma/ticketExchange/web/SeatController.java

@@ -0,0 +1,20 @@
+package com.izouma.ticketExchange.web;
+
+import com.izouma.ticketExchange.service.SeatService;
+import com.taobao.api.ApiException;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("/seat")
+@AllArgsConstructor
+public class SeatController {
+    private SeatService seatService;
+
+    @GetMapping("/schedule/{scheduleId}/map")
+    public Map seatMap(@PathVariable Long scheduleId, @RequestParam Long couponId) throws ApiException {
+        return seatService.seatMap(scheduleId, couponId);
+    }
+}

+ 2 - 2
src/main/resources/application.yaml

@@ -53,8 +53,8 @@ wx:
         app_id: wx2375cba2eec2c479
         app_secret: 28e4829124860d9ef9e2f32aeefd1111
     ma:
-        app_id: wx47bde0e3d49633b4
-        app_secret: 152f70e353fb0b42a656678b34d41252
+        app_id: wxe78560e8a4b64f58
+        app_secret: 2f716237b0d10d9269016d201aa10f23
         msg_token: msgToken
         msg_aes_key: aesKey
         msg_format: JSON

+ 17 - 0
src/test/java/com/izouma/ticketExchange/CommonTest.java

@@ -23,6 +23,9 @@ import java.lang.reflect.Method;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.IsoFields;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -31,6 +34,7 @@ import java.util.regex.Pattern;
 
 import static java.nio.file.StandardOpenOption.CREATE;
 import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING;
+import static java.time.temporal.ChronoUnit.DAYS;
 
 public class CommonTest {
     @Test
@@ -130,4 +134,17 @@ public class CommonTest {
     public void testEnum() {
         System.out.println("100.0米".replaceAll("\\.0(米|千米)$", "$1"));
     }
+
+    @Test
+    public void testDaysBetween() {
+        System.out.println(DAYS.between(LocalDate.now(), LocalDate.parse("2019-11-06")));
+    }
+
+    @Test
+    public void testWeek() {
+        System.out.println(LocalDate.parse("2019-11-06").getDayOfWeek().getValue());
+
+        ZonedDateTime now = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
+        System.out.printf("Week %d%n", now.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));
+    }
 }

+ 1 - 1
src/test/java/com/izouma/ticketExchange/service/TppServiceTest.java

@@ -36,6 +36,6 @@ public class TppServiceTest extends ApplicationTests {
 
     @Test
     public void getSeats() throws ApiException {
-        tppService.getSeats(729164896L);
+        tppService.getSeatMap(729164896L);
     }
 }