ScheduleServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. package com.example.cinema.blImpl.management.schedule;
  2. import com.example.cinema.bl.management.ScheduleService;
  3. import com.example.cinema.blImpl.management.hall.HallServiceForBl;
  4. import com.example.cinema.data.management.ScheduleMapper;
  5. import com.example.cinema.vo.*;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. import java.text.ParseException;
  9. import java.text.SimpleDateFormat;
  10. import java.util.*;
  11. /**
  12. * @author fjj
  13. * @date 2019/4/11 4:14 PM
  14. */
  15. @Service
  16. public class ScheduleServiceImpl implements ScheduleService, ScheduleServiceForBl {
  17. private static final String TIME_CONFLICT_ERROR_MESSAGE = "时间段冲突";
  18. private static final String CROSS_DAYS_ERROR_MESSAGE = "起止时间不能跨天";
  19. private static final String DATE_INTERVAL_LESS_THAN_LENGTH_ERROR_MESSAGE = "起止时间段不能少于电影时长或结束时间不能早于开始时间";
  20. private static final String BEFORE_NOW_TIME_ERROR_MESSAGE = "排片日期不能早于当前时间";
  21. private static final String BEFORE_START_DATE_ERROR_MESSAGE = "排片时间不能早于电影上映时间";
  22. private static final String MOVIE_NOT_EXIST_ERROR_MESSAGE = "电影不存在";
  23. private static final String HALL_NOT_EXIST_ERROR_MESSAGE = "影厅不存在";
  24. private static final String VIEW_COUNT_ERROR_MESSAGE = "排片可见限制数错误";
  25. private static final String ID_LIST_NULL_ERROR_MESSAGE = "id列表不可为空";
  26. private static final String VIEW_CONFLICT_ERROR_MESSAGE = "有排片信息已对观众可见,无法删除或修改";
  27. @Autowired
  28. private ScheduleMapper scheduleMapper;
  29. @Autowired
  30. private MovieServiceForBl movieServiceForBl;
  31. @Autowired
  32. private HallServiceForBl hallServiceForBl;
  33. @Override
  34. public ResponseVO addSchedule(ScheduleForm scheduleForm) {
  35. try {
  36. ResponseVO responseVO = preCheck(scheduleForm);
  37. if(!responseVO.getSuccess()){
  38. return responseVO;
  39. }
  40. scheduleMapper.insertOneSchedule(scheduleForm);
  41. return ResponseVO.buildSuccess();
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. return ResponseVO.buildFailure("失败");
  45. }
  46. }
  47. @Override
  48. public ResponseVO updateSchedule(ScheduleForm scheduleForm) {
  49. try {
  50. ResponseVO responseVO = preCheck(scheduleForm);
  51. if(!responseVO.getSuccess()){
  52. return responseVO;
  53. }
  54. //在修改时要检查想要修改的排片信息是否已被观众可见,若可见则无法修改
  55. if(isAudienceCanView(Arrays.asList(scheduleForm.getId()))){
  56. return ResponseVO.buildFailure(VIEW_CONFLICT_ERROR_MESSAGE);
  57. }
  58. scheduleMapper.updateScheduleById(scheduleForm);
  59. return ResponseVO.buildSuccess();
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. return ResponseVO.buildFailure("失败");
  63. }
  64. }
  65. @Override
  66. public ResponseVO getScheduleById(int id) {
  67. try {
  68. return ResponseVO.buildSuccess(scheduleMapper.selectScheduleById(id));
  69. }catch (Exception e){
  70. e.printStackTrace();
  71. return ResponseVO.buildFailure("失败");
  72. }
  73. }
  74. @Override
  75. public ResponseVO getScheduleView() {
  76. try {
  77. return ResponseVO.buildSuccess(scheduleMapper.selectView());
  78. }catch (Exception e){
  79. e.printStackTrace();
  80. return ResponseVO.buildFailure("失败");
  81. }
  82. }
  83. @Override
  84. public ResponseVO searchAudienceSchedule(int movieId) {
  85. try{
  86. //根据view中设置的排片可见限制
  87. int days = scheduleMapper.selectView();
  88. List<ScheduleItem> scheduleItems = scheduleMapper.selectScheduleByMovieId(movieId);
  89. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  90. Date today = simpleDateFormat.parse(simpleDateFormat.format(new Date()));
  91. Date endDate = getNumDayAfterDate(today, days);
  92. List<ScheduleItem> result = new ArrayList<>();
  93. for(ScheduleItem s : scheduleItems){
  94. if(s.getStartTime().before(endDate) && s.getStartTime().after(new Date())){
  95. result.add(s);
  96. }
  97. }
  98. int interval = 1;
  99. if(result.size() > 0){
  100. interval = (int)((result.get(result.size() - 1).getStartTime().getTime() - today.getTime()) / (1000 * 3600 * 24)) + 1;
  101. }
  102. return ResponseVO.buildSuccess(getScheduleVOList(interval, today, result));
  103. }catch (Exception e){
  104. e.printStackTrace();
  105. return ResponseVO.buildFailure("失败");
  106. }
  107. }
  108. @Override
  109. public List<ScheduleItem> getScheduleByMovieIdList(List<Integer> movieIdList) {
  110. try {
  111. return scheduleMapper.selectScheduleByMovieIdList(movieIdList);
  112. }catch (Exception e){
  113. e.printStackTrace();
  114. return null;
  115. }
  116. }
  117. @Override
  118. public ScheduleItem getScheduleItemById(int id) {
  119. try {
  120. return scheduleMapper.selectScheduleById(id);
  121. }catch (Exception e){
  122. e.printStackTrace();
  123. return null;
  124. }
  125. }
  126. @Override
  127. public ResponseVO searchScheduleSevenDays(int hallId, Date startDate) {
  128. try {
  129. // 处理查询表单的起止时间
  130. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  131. startDate = simpleDateFormat.parse(simpleDateFormat.format(startDate));
  132. Date endDate = getNumDayAfterDate(startDate, 7);
  133. // 按照日期整理ScheduleItem
  134. List<ScheduleItem> scheduleItemList = scheduleMapper.selectSchedule(hallId, startDate, endDate);
  135. return ResponseVO.buildSuccess(getScheduleVOList(7, startDate, scheduleItemList));
  136. } catch (ParseException e) {
  137. e.printStackTrace();
  138. return ResponseVO.buildFailure("失败");
  139. }
  140. }
  141. @Override
  142. public ResponseVO setScheduleView(ScheduleViewForm scheduleViewForm) {
  143. try{
  144. if(scheduleViewForm.getDay() < 0){
  145. return ResponseVO.buildFailure(VIEW_COUNT_ERROR_MESSAGE);
  146. }
  147. int num = scheduleMapper.selectViewCount();
  148. if(num == 0){
  149. scheduleMapper.insertOneView(scheduleViewForm);
  150. }
  151. else if(num == 1){
  152. scheduleMapper.updateOneView(scheduleViewForm);
  153. }
  154. else {
  155. return ResponseVO.buildFailure(VIEW_COUNT_ERROR_MESSAGE);
  156. }
  157. return ResponseVO.buildSuccess();
  158. }catch (Exception e){
  159. e.printStackTrace();
  160. return ResponseVO.buildFailure("失败");
  161. }
  162. }
  163. @Override
  164. public ResponseVO deleteBatchOfSchedule(ScheduleBatchDeleteForm scheduleBatchDeleteForm) {
  165. try{
  166. List<Integer> scheduleIdList = scheduleBatchDeleteForm.getScheduleIdList();
  167. if(scheduleIdList.size() == 0){
  168. return ResponseVO.buildFailure(ID_LIST_NULL_ERROR_MESSAGE);
  169. }
  170. if(isAudienceCanView(scheduleIdList)){
  171. return ResponseVO.buildFailure(VIEW_CONFLICT_ERROR_MESSAGE);
  172. }
  173. scheduleMapper.deleteScheduleBatch(scheduleIdList);
  174. return ResponseVO.buildSuccess();
  175. }catch (Exception e){
  176. e.printStackTrace();
  177. return ResponseVO.buildFailure("失败");
  178. }
  179. }
  180. /**
  181. * 获得num天后的日期
  182. * @param oldDate
  183. * @param num
  184. * @return
  185. */
  186. Date getNumDayAfterDate(Date oldDate, int num){
  187. Calendar calendarTime = Calendar.getInstance();
  188. calendarTime.setTime(oldDate);
  189. calendarTime.add(Calendar.DAY_OF_YEAR, num);
  190. return calendarTime.getTime();
  191. }
  192. /**
  193. * 新增或修改排片信息的公共前置检查
  194. * @param scheduleForm
  195. * @return
  196. */
  197. ResponseVO preCheck(ScheduleForm scheduleForm){
  198. try {
  199. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  200. // 检查排片时间是否早于当前时间
  201. if(scheduleForm.getStartTime().before(new Date())){
  202. return ResponseVO.buildFailure(BEFORE_NOW_TIME_ERROR_MESSAGE);
  203. }
  204. // 处理排片跨天错误
  205. if(!simpleDateFormat.format(scheduleForm.getStartTime()).equals(simpleDateFormat.format(scheduleForm.getEndTime()))){
  206. return ResponseVO.buildFailure(CROSS_DAYS_ERROR_MESSAGE);
  207. }
  208. //检查影厅是否存在
  209. if(hallServiceForBl.getHallById(scheduleForm.getHallId()) == null){
  210. return ResponseVO.buildFailure(HALL_NOT_EXIST_ERROR_MESSAGE);
  211. }
  212. // 检查电影是否存在
  213. MovieVO movieVO = movieServiceForBl.getMovieById(scheduleForm.getMovieId());
  214. if(movieVO == null){
  215. return ResponseVO.buildFailure(MOVIE_NOT_EXIST_ERROR_MESSAGE);
  216. }
  217. // 检查电影的上映时间是否和排片时间匹配
  218. if(scheduleForm.getStartTime().before(movieVO.getStartDate())){
  219. return ResponseVO.buildFailure(BEFORE_START_DATE_ERROR_MESSAGE);
  220. }
  221. // 校验排片时间段合法性
  222. int minutes = movieVO.getLength();
  223. Calendar calendarStartTime = Calendar.getInstance();
  224. calendarStartTime.setTime(scheduleForm.getStartTime());
  225. calendarStartTime.add(Calendar.MINUTE, minutes);
  226. Date endTime = calendarStartTime.getTime();
  227. if(scheduleForm.getEndTime().before(endTime)){
  228. return ResponseVO.buildFailure(DATE_INTERVAL_LESS_THAN_LENGTH_ERROR_MESSAGE);
  229. }
  230. // 检查该排片时间段是否和其他排片信息冲突
  231. int id = scheduleForm.getId() == null? 0 : scheduleForm.getId();
  232. if(0 != scheduleMapper.selectScheduleConflictByHallIdAndTime(scheduleForm.getHallId(), scheduleForm.getStartTime(), scheduleForm.getEndTime(),id).size()){
  233. return ResponseVO.buildFailure(TIME_CONFLICT_ERROR_MESSAGE);
  234. }
  235. }catch (Exception e){
  236. e.printStackTrace();
  237. }
  238. return ResponseVO.buildSuccess();
  239. }
  240. boolean isAudienceCanView(List<Integer> scheduleIdList) throws ParseException {
  241. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  242. Date today = simpleDateFormat.parse(simpleDateFormat.format(new Date()));
  243. Date endDate = getNumDayAfterDate(today, scheduleMapper.selectView());
  244. List<ScheduleItem> scheduleList = scheduleMapper.selectScheduleBatch(scheduleIdList);
  245. for(ScheduleItem s : scheduleList){
  246. if(s.getEndTime().before(endDate) && s.getEndTime().after(today)){
  247. return true;
  248. }
  249. }
  250. return false;
  251. }
  252. List<ScheduleVO> getScheduleVOList(int interval,Date startDate, List<ScheduleItem> scheduleItemList ) throws ParseException {
  253. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
  254. List<ScheduleVO> scheduleVOList = new ArrayList<>();
  255. for(int i = 0; i < interval; i++){
  256. Date date = getNumDayAfterDate(startDate, i);
  257. ScheduleVO scheduleVO = new ScheduleVO();
  258. scheduleVO.setDate(date);
  259. List<ScheduleItem> scheduleItems = new ArrayList<>();
  260. for(ScheduleItem scheduleItem : scheduleItemList){
  261. Date startTime = simpleDateFormat.parse(simpleDateFormat.format(scheduleItem.getStartTime()));
  262. if(date.equals(startTime)){
  263. scheduleItems.add(scheduleItem);
  264. }
  265. }
  266. scheduleVO.setScheduleItemList(scheduleItems);
  267. scheduleVOList.add(scheduleVO);
  268. }
  269. return scheduleVOList;
  270. }
  271. }