接上次继续
-
每日车次
*需要多几张表
1.1生成车次
需求:生成:
每日列车--daily_train
每日列车跟站点的关系表--daily_train_station_retation:
每日座位
每日车票
1.先生成每日列表
如果已经生成过当天的列车信息,跟新日期即可,删除后续其他数据,然后重新生成
*1.先生成每日列表--先查询出所有的列车数据
List<Train> trainList = trainService.list(new LambdaQueryWrapper<Train>().eq(Train::getDelFlag, false));
if (CollectionUtils.isNotEmpty(trainList)) {
for (Train train : trainList) {
genTrainData(train,date);
}
}
每日列车--daily_train
* 每日列车跟站点的关系表--datily_train_station_relation
* 每日座位
* 每日车票
查询出所有经停站
查询出所有车厢
List<TrainStation> trainStationList = trainStationService.list(new LambdaQueryWrapper<TrainStation>().eq(TrainStation::getTrainId, train.getId()));
List<Carriage> carriageList = carriageService.list(new LambdaQueryWrapper<Carriage>().eq(Carriage::getTrainId, train.getId()));
if (CollectionUtils.isEmpty(trainStationList)||CollectionUtils.isEmpty(carriageList)) {
return;
}
Date currentDate = new Date();
*每日列车数据
*1.先查询:是否生成过
DailyTrain dailyTrain = this.getOne(new LambdaQueryWrapper<DailyTrain>().eq(DailyTrain::getTrainId, train.getId()).eq(DailyTrain::getTrainDate, date));
if (dailyTrain!=null) {
dailyTrain.setUpdateTime(currentDate);
dailyTrain.setDelFlag(false);
this.updateById(dailyTrain);
}else{
dailyTrain = new DailyTrain();
dailyTrain.setTrainDate(date);
dailyTrain.setTrainId(train.getId());
dailyTrain.setTrainNumber(train.getTrainNumber());
dailyTrain.setTrainType(train.getTrainType());
dailyTrain.setTrainTag(train.getTrainTag());
dailyTrain.setTrainBrand(train.getTrainBrand());
dailyTrain.setStartStation(train.getStartStation());
dailyTrain.setEndStation(train.getEndStation());
dailyTrain.setStartRegion(train.getStartRegion());
dailyTrain.setEndRegion(train.getEndRegion());
dailyTrain.setSaleTime(currentDate);
dailyTrain.setSaleStatus(0);
dailyTrain.setDepartureTime(LocalDateTime.of(date,train.getDepartureTime()));
dailyTrain.setArrivalTime(train.getArrivalTime());
dailyTrain.setEndTime(dailyTrain.getDepartureTime().plusMinutes(dailyTrain.getArrivalTime()));
//总里程
BigDecimal totalKM = new BigDecimal(0);
for (TrainStation trainStation : trainStationList) {
totalKM = totalKM.add(trainStation.getKm());
}
dailyTrain.setTotalKm(totalKM.doubleValue());
dailyTrain.setCreateTime(currentDate);
dailyTrain.setUpdateTime(currentDate);
dailyTrain.setDelFlag(false);
dailyTrain.setId(snowflakeIdWorker.nextId());
this.save(dailyTrain);
}
*用到雪花算法
//删除当天已生成的数据
trainStationRelationService.remove(new LambdaQueryWrapper<TrainStationRelation>()
.eq(TrainStationRelation::getTrainId,train.getId())
.ge(TrainStationRelation::getDepartureTime,date)
.lt(TrainStationRelation::getDepartureTime,date.plusDays(1))
);
List<TrainStationRelation> trainStationRelationList = new ArrayList<>();
//生成站点关系数据
for (int i = 0; i < trainStationList.size()-1; i++) {
TrainStation start = trainStationList.get(i);//起始站
for (int j = i+1; j < trainStationList.size(); j++) {
TrainStation end = trainStationList.get(j);//到达站
TrainStationRelation trainStationRelation = new TrainStationRelation();
trainStationRelation.setTrainId(train.getId());
trainStationRelation.setTrainNumber(train.getTrainNumber());
trainStationRelation.setDeparture(start.getDeparture());
trainStationRelation.setArrival(end.getDeparture());
trainStationRelation.setStartRegion(start.getStartRegion());
trainStationRelation.setEndRegion(end.getStartRegion());
trainStationRelation.setDepartureFlag(start.getSequence().equals("0"));
trainStationRelation.setArrivalFlag(end.getSequence().equals(String.valueOf(trainStationList.size()-1)));
trainStationRelation.setDepartureTime(LocalDateTime.of(date,start.getDepartureTime()));//出发时间
trainStationRelation.setArrivalTime(LocalDateTime.of(date,end.getArrivalTime()));//到达时间
//出发站站序
//到达站站序
//区间总里程
//区间耗时
trainStationRelation.setDepartureIndex(Integer.parseInt(start.getSequence()));
trainStationRelation.setArrivalIndex(Integer.parseInt(end.getSequence()));
//出发时间:LocalDateTime
//到达时间:LocalDateTime
Long between = ChronoUnit.MINUTES.between(trainStationRelation.getDepartureTime(), trainStationRelation.getArrivalTime());
trainStationRelation.setRegionTotalTime(between.intValue());
BigDecimal totalKM = new BigDecimal(0);
for (int k = i+1; k <= j; k++) {
totalKM = totalKM.add(trainStationList.get(k).getKm());
}
trainStationRelation.setRegionKm(totalKM.doubleValue());//区间里程
trainStationRelation.setCreateTime(currentDate);
trainStationRelation.setUpdateTime(currentDate);
trainStationRelation.setDepartureFlag(false);
trainStationRelationList.add(trainStationRelation);
}
}
trainStationRelationService.saveBatch(trainStationRelationList);
*座次,车票
dailySeatService.remove(new LambdaQueryWrapper<DailySeat>()
.eq(DailySeat::getTrainId,train.getId())
.eq(DailySeat::getSeatDate,date)
);
String seatStatus = "";
for (int i = 0; i < trainStationList.size()-1; i++) {
seatStatus+="0";
}
List<DailySeat> dailySeatList = new ArrayList<>();
for (Carriage carriage : carriageList) {//车厢
Integer rowCount = carriage.getRowCount();//行
for (int i = 1; i <= rowCount; i++) {
List<SeatColEnum> colsByType = SeatColEnum.getColsByType(carriage.getCarriageType());
for (SeatColEnum seatColEnum : colsByType) {
DailySeat dailySeat = new DailySeat();
dailySeat.setTrainId(train.getId());
dailySeat.setTrainNumber(train.getTrainNumber());
dailySeat.setSeatDate(date);
dailySeat.setCarriageNumber(carriage.getCarriageNumber());
dailySeat.setSeatType(carriage.getCarriageType());
dailySeat.setSeatStatus(seatStatus);//全部未销售状态
dailySeat.setSeatNumber(i+seatColEnum.getCode());
dailySeat.setCreateTime(currentDate);
dailySeat.setUpdateTime(currentDate);
dailySeat.setDelFlag(false);
dailySeatList.add(dailySeat);
}
}
}
dailySeatService.saveBatch(dailySeatList);
//每日车票表
int ydz = 0;
int edz = 0;
int yw = 0;
int rw = 0;
for (DailySeat dailySeat : dailySeatList) {
if (dailySeat.getSeatType()==2) {
ydz++;
}else if (dailySeat.getSeatType()==4) {
edz++;
}else if (dailySeat.getSeatType()==6) {
yw++;
}else if (dailySeat.getSeatType()==7) {
rw++;
}
}
dailyResiduesTicketService.remove(new LambdaQueryWrapper<DailyResiduesTicket>()
.eq(DailyResiduesTicket::getTrainId,train.getId())
.ge(DailyResiduesTicket::getDepartureDate,date)
.lt(DailyResiduesTicket::getDepartureDate,date.plusDays(1))
);
List<DailyResiduesTicket> dailyResiduesTicketList = new ArrayList<>();
for (TrainStationRelation trainStationRelation : trainStationRelationList) {
DailyResiduesTicket dailyResiduesTicket = new DailyResiduesTicket();
dailyResiduesTicket.setTrainId(train.getId());
dailyResiduesTicket.setTrainNumber(train.getTrainNumber());
dailyResiduesTicket.setTrainStationRelationId(trainStationRelation.getId());
dailyResiduesTicket.setDepartureDate(trainStationRelation.getDepartureTime());
//各个类型座次的数量以及价格
dailyResiduesTicket.setYdzCount(ydz==0?-1:ydz);
dailyResiduesTicket.setEdzCount(edz==0?-1:edz);
dailyResiduesTicket.setYwCount(yw==0?-1:yw);
dailyResiduesTicket.setRwCount(rw==0?-1:rw);
//价格=里程*单价
SeatTypeEnum ydzBasePrice = SeatTypeEnum.getEnumByCode("2");
SeatTypeEnum edzBasePrice = SeatTypeEnum.getEnumByCode("4");
SeatTypeEnum ywBasePrice = SeatTypeEnum.getEnumByCode("6");
SeatTypeEnum rwzBasePrice = SeatTypeEnum.getEnumByCode("7");
Double ydzPrice = ydzBasePrice.getPrice().multiply(new BigDecimal(trainStationRelation.getRegionKm())).doubleValue();
Double edzPrice = edzBasePrice.getPrice().multiply(new BigDecimal(trainStationRelation.getRegionKm())).doubleValue();
Double ywPrice = ywBasePrice.getPrice().multiply(new BigDecimal(trainStationRelation.getRegionKm())).doubleValue();
Double rwPrice = rwzBasePrice.getPrice().multiply(new BigDecimal(trainStationRelation.getRegionKm())).doubleValue();
dailyResiduesTicket.setYdzPrice(ydz==0?-1:ydzPrice);
dailyResiduesTicket.setEdzPrice(edz==0?-1:edzPrice);
dailyResiduesTicket.setYwPrice(yw==0?-1:ywPrice);
dailyResiduesTicket.setRwPrice(rw==0?-1:rwPrice);
//里程,时间
dailyResiduesTicket.setRegionKm(trainStationRelation.getRegionKm());
dailyResiduesTicket.setRegionTime(trainStationRelation.getRegionTotalTime());
dailyResiduesTicket.setDepartureStation(trainStationRelation.getDeparture());
dailyResiduesTicket.setArrivalStation(trainStationRelation.getArrival());
dailyResiduesTicket.setCreateTime(currentDate);
dailyResiduesTicket.setUpdateTime(currentDate);
dailyResiduesTicket.setDelFlag(false);
dailyResiduesTicketList.add(dailyResiduesTicket);
}
dailyResiduesTicketService.saveBatch(dailyResiduesTicketList);
//保存到redis中
/*
* count:YDZ:车次:时间:出发站:到达站-----一等座数量
* count:EDZ:车次:时间:出发站:到达站-----二等座数量
* count:YW:车次:时间:出发站:到达站-----硬卧数量
* count:RW:车次:时间:出发站:到达站-----软弱卧数量
* */
for (TrainStationRelation trainStationRelation : trainStationRelationList) {
String ydzKey = new StringJoiner(":").add("count")
.add("YDZ")
.add(train.getTrainNumber())
.add(date.toString())
.add(trainStationRelation.getDeparture())
.add(trainStationRelation.getArrival()).toString();
String edzKey = new StringJoiner(":").add("count")
.add("EDZ")
.add(train.getTrainNumber())
.add(date.toString())
.add(trainStationRelation.getDeparture())
.add(trainStationRelation.getArrival()).toString();
String ywKey = new StringJoiner(":").add("count")
.add("YW")
.add(train.getTrainNumber())
.add(date.toString())
.add(trainStationRelation.getDeparture())
.add(trainStationRelation.getArrival()).toString();
String rwKey = new StringJoiner(":").add("count")
.add("RW")
.add(train.getTrainNumber())
.add(date.toString())
.add(trainStationRelation.getDeparture())
.add(trainStationRelation.getArrival()).toString();
redisTemplate.boundValueOps(ydzKey).set(ydz==0?-1:ydz);
redisTemplate.boundValueOps(edzKey).set(edz==0?-1:edz);
redisTemplate.boundValueOps(ywKey).set(yw==0?-1:yw);
redisTemplate.boundValueOps(rwKey).set(rw==0?-1:rw);
}