12306(4)

接上次继续

  1. 每日车次

*需要多几张表

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);
}

*每日车次

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值