|
@@ -3,11 +3,9 @@ package com.jiayue.ipfcst.service;
|
|
|
import com.jiayue.ipfcst.common.core.exception.BusinessException;
|
|
|
import com.jiayue.ipfcst.common.core.util.CommonUtil;
|
|
|
import com.jiayue.ipfcst.common.core.util.DateMomentUtil;
|
|
|
-import com.jiayue.ipfcst.common.data.entity.ElectricField;
|
|
|
-import com.jiayue.ipfcst.common.data.entity.Nwp;
|
|
|
-import com.jiayue.ipfcst.common.data.entity.SysParameter;
|
|
|
-import com.jiayue.ipfcst.common.data.entity.WindTowerStatusData;
|
|
|
+import com.jiayue.ipfcst.common.data.entity.*;
|
|
|
import com.jiayue.ipfcst.common.data.repository.NwpRepository;
|
|
|
+import com.jiayue.ipfcst.common.data.repository.NwpSpeedModifiedRespository;
|
|
|
import com.jiayue.ipfcst.common.data.repository.SysParameterRepository;
|
|
|
import com.jiayue.ipfcst.common.data.repository.WindTowerStatusDataRepository;
|
|
|
import com.jiayue.ipfcst.common.data.service.BaseService;
|
|
@@ -46,11 +44,18 @@ public class NwpService extends BaseService {
|
|
|
|
|
|
private final WindTowerStatusDataRepository windTowerStatusDataRepository;
|
|
|
|
|
|
+ private final NwpSpeedModifiedRespository nwpSpeedModifiedRespository;
|
|
|
+
|
|
|
+ private final NwpSpeedModifiedService nwpSpeedModifiedService;
|
|
|
+
|
|
|
@Autowired
|
|
|
- public NwpService(NwpRepository nwpRepository, SysParameterRepository sysParameterRepository, WindTowerStatusDataRepository windTowerStatusDataRepository){
|
|
|
+ public NwpService(NwpRepository nwpRepository, SysParameterRepository sysParameterRepository, WindTowerStatusDataRepository windTowerStatusDataRepository,
|
|
|
+ NwpSpeedModifiedRespository nwpSpeedModifiedRespository,NwpSpeedModifiedService nwpSpeedModifiedService){
|
|
|
this.nwpRepository = nwpRepository;
|
|
|
this.sysParameterRepository = sysParameterRepository;
|
|
|
this.windTowerStatusDataRepository = windTowerStatusDataRepository;
|
|
|
+ this.nwpSpeedModifiedRespository = nwpSpeedModifiedRespository;
|
|
|
+ this.nwpSpeedModifiedService = nwpSpeedModifiedService;
|
|
|
}
|
|
|
/**
|
|
|
* 按时间查询实时NWP yh
|
|
@@ -61,9 +66,6 @@ public class NwpService extends BaseService {
|
|
|
@Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
|
|
|
public Map<String,Object> findByForecastTimeBetween(Long startTime, Long endTime) throws BusinessException {
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
Map<String,Object> map = new HashMap<>();
|
|
|
List<Nwp> list = new ArrayList<>();
|
|
|
List<Nwp> checkList = new ArrayList<>();
|
|
@@ -169,7 +171,7 @@ public class NwpService extends BaseService {
|
|
|
map.put("times",times);
|
|
|
map.put("datas",datas);
|
|
|
Map<String,Object> nMap = findRealNwpByTimeBetween(startTime, endTime);
|
|
|
- map.put("ndatas",nMap.get("ndatas"));
|
|
|
+ map.put("nDatas",nMap.get("nDatas"));
|
|
|
map.put("ncName",nMap.get("ncName"));
|
|
|
return map;
|
|
|
}
|
|
@@ -217,26 +219,23 @@ public class NwpService extends BaseService {
|
|
|
List<BigDecimal> ws100Collect= new ArrayList<>();
|
|
|
List<BigDecimal> ws170Collect= new ArrayList<>();
|
|
|
Map<String,String> map1 = new HashMap<>();
|
|
|
- if(electricField.getElectricFieldTypeEnum().getCode() == 1){
|
|
|
|
|
|
- }else{
|
|
|
- ws10Collect = checkList.stream().map(WindTowerStatusData::getWsInst10).collect(Collectors.toList());
|
|
|
- ws30Collect = checkList.stream().map(WindTowerStatusData::getWsInst30).collect(Collectors.toList());
|
|
|
- ws50Collect = checkList.stream().map(WindTowerStatusData::getWsInst50).collect(Collectors.toList());
|
|
|
- ws70Collect = checkList.stream().map(WindTowerStatusData::getWsInst70).collect(Collectors.toList());
|
|
|
- ws80Collect = checkList.stream().map(WindTowerStatusData::getWsInst80).collect(Collectors.toList());
|
|
|
- ws90Collect = checkList.stream().map(WindTowerStatusData::getWsInst90).collect(Collectors.toList());
|
|
|
- ws100Collect = checkList.stream().map(WindTowerStatusData::getWsInst100).collect(Collectors.toList());
|
|
|
- ws170Collect = checkList.stream().map(WindTowerStatusData::getWsInst110).collect(Collectors.toList());
|
|
|
- datas.put("wsInst10",ws10Collect);
|
|
|
- datas.put("wsInst30",ws30Collect);
|
|
|
- datas.put("wsInst50",ws50Collect);
|
|
|
- datas.put("wsInst70",ws70Collect);
|
|
|
- datas.put("wsInst80",ws80Collect);
|
|
|
- datas.put("wsInst90",ws90Collect);
|
|
|
- datas.put("wsInst100",ws100Collect);
|
|
|
- datas.put("wsInst170",ws170Collect);
|
|
|
- }
|
|
|
+ ws10Collect = checkList.stream().map(WindTowerStatusData::getWsInst10).collect(Collectors.toList());
|
|
|
+ ws30Collect = checkList.stream().map(WindTowerStatusData::getWsInst30).collect(Collectors.toList());
|
|
|
+ ws50Collect = checkList.stream().map(WindTowerStatusData::getWsInst50).collect(Collectors.toList());
|
|
|
+ ws70Collect = checkList.stream().map(WindTowerStatusData::getWsInst70).collect(Collectors.toList());
|
|
|
+ ws80Collect = checkList.stream().map(WindTowerStatusData::getWsInst80).collect(Collectors.toList());
|
|
|
+ ws90Collect = checkList.stream().map(WindTowerStatusData::getWsInst90).collect(Collectors.toList());
|
|
|
+ ws100Collect = checkList.stream().map(WindTowerStatusData::getWsInst100).collect(Collectors.toList());
|
|
|
+ ws170Collect = checkList.stream().map(WindTowerStatusData::getWsInst110).collect(Collectors.toList());
|
|
|
+ datas.put("wsInst10",ws10Collect);
|
|
|
+ datas.put("wsInst30",ws30Collect);
|
|
|
+ datas.put("wsInst50",ws50Collect);
|
|
|
+ datas.put("wsInst70",ws70Collect);
|
|
|
+ datas.put("wsInst80",ws80Collect);
|
|
|
+ datas.put("wsInst90",ws90Collect);
|
|
|
+ datas.put("wsInst100",ws100Collect);
|
|
|
+ datas.put("wsInst170",ws170Collect);
|
|
|
|
|
|
map1.put("wsInst10","实时10米风速");
|
|
|
map1.put("wsInst30","实时30米风速");
|
|
@@ -247,7 +246,7 @@ public class NwpService extends BaseService {
|
|
|
map1.put("wsInst100","实时100米风速");
|
|
|
map1.put("wsInst170","实时170米风速");
|
|
|
|
|
|
- map.put("ndatas", datas);
|
|
|
+ map.put("nDatas", datas);
|
|
|
map.put("ncName", map1);
|
|
|
return map;
|
|
|
|
|
@@ -386,6 +385,235 @@ public class NwpService extends BaseService {
|
|
|
|
|
|
|
|
|
/**
|
|
|
+ * 修改风速 预览
|
|
|
+ *
|
|
|
+ * @param startTime
|
|
|
+ * @param endTime
|
|
|
+ * @return
|
|
|
+ * @throws BusinessException
|
|
|
+ */
|
|
|
+ @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
|
|
|
+ public Map<String,Object> modifySpeedPreview(Long startTime, Long endTime, String num, Integer modify) throws BusinessException {
|
|
|
+
|
|
|
+ // 返回值 map
|
|
|
+ Map<String,Object> map = new HashMap<>();
|
|
|
+ // nwp数据
|
|
|
+ List<Nwp> list = new ArrayList<>();
|
|
|
+ // 修改后 nwp数据
|
|
|
+ List<NwpSpeedModified> modifiedList = new ArrayList<>();
|
|
|
+ // 间隔15分钟的nwp数据
|
|
|
+ List<Nwp> checkList = new ArrayList<>();
|
|
|
+ // 返回值 预测nwp
|
|
|
+ Map<String,Object> datas = new LinkedHashMap<>();
|
|
|
+ // 返回值 修改后nwp
|
|
|
+ Map<String,Object> modifyDatas = new LinkedHashMap<>();
|
|
|
+ // nwp时间区间数据并排序
|
|
|
+ list = nwpRepository.findByPreTimeBetween(startTime, endTime);
|
|
|
+ list.sort(Comparator.comparing(Nwp::getPreTime));
|
|
|
+ // 修改后nwp时间区间数据并排序
|
|
|
+ modifiedList = nwpSpeedModifiedRespository.findBymodifyTimeBetween(startTime,endTime);
|
|
|
+ modifiedList.sort(Comparator.comparing(NwpSpeedModified::getModifyTime));
|
|
|
+ // 时间区间
|
|
|
+ long startTimeLong = startTime;
|
|
|
+ long endTimeLong = endTime;
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ // 间隔时间
|
|
|
+ long timeStep = 900000L;
|
|
|
+ if(startTimeLong%timeStep !=0){
|
|
|
+ startTimeLong = startTimeLong -(startTimeLong%timeStep);
|
|
|
+ }
|
|
|
+ // x坐标数据
|
|
|
+ List<String> times = new ArrayList<>();
|
|
|
+ // 修改后nwp数据
|
|
|
+ List<NwpSpeedModified> nwpSpeedModifieds = new ArrayList<>();
|
|
|
+
|
|
|
+ for(long i = startTimeLong;i<endTimeLong;i=i+timeStep){
|
|
|
+ long finalI = i;
|
|
|
+ List<Nwp> p = list.stream().filter(t -> t.getPreTime() == finalI).collect(Collectors.toList());
|
|
|
+ if (p != null && p.size() > 0) {
|
|
|
+ Nwp nwp = p.get(0);
|
|
|
+ // 间隔15分钟的nwp数据
|
|
|
+ checkList.add(nwp);
|
|
|
+ // NwpSpeedModified对象(原nwp * 系数)
|
|
|
+ NwpSpeedModified nwpSpeedModified = caculateSpeed(nwp, num);
|
|
|
+ nwpSpeedModifieds.add(nwpSpeedModified);
|
|
|
+ }else{
|
|
|
+ checkList.add(new Nwp());
|
|
|
+ nwpSpeedModifieds.add(new NwpSpeedModified());
|
|
|
+ }
|
|
|
+ String timeFormat = sdf.format(new Date(i));
|
|
|
+ times.add(timeFormat);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 把-99 替换成 null
|
|
|
+ this.defaultReplace(checkList);
|
|
|
+ this.nwpSpeedDefaultReplace(nwpSpeedModifieds);
|
|
|
+
|
|
|
+ // 如果当前时间区间有修改后的值 ,展示修改后的值
|
|
|
+ if(modifiedList.size() < 1 && num.equals(1) || !(num.equals("1"))){
|
|
|
+ modifiedList = nwpSpeedModifieds;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存修改后的值
|
|
|
+ if(modify == 1){
|
|
|
+ nwpSpeedModifiedRespository.saveAll(modifiedList);
|
|
|
+ }
|
|
|
+
|
|
|
+ ElectricField electricField = this.getElectricField();
|
|
|
+ List<BigDecimal> ws10Collect = new ArrayList<>();
|
|
|
+ List<BigDecimal> ws30Collect= new ArrayList<>();
|
|
|
+ List<BigDecimal> ws50Collect= new ArrayList<>();
|
|
|
+ List<BigDecimal> ws70Collect= new ArrayList<>();
|
|
|
+ List<BigDecimal> ws80Collect= new ArrayList<>();
|
|
|
+ List<BigDecimal> ws90Collect= new ArrayList<>();
|
|
|
+ List<BigDecimal> ws100Collect= new ArrayList<>();
|
|
|
+ List<BigDecimal> ws170Collect= new ArrayList<>();
|
|
|
+ // 曲线名
|
|
|
+ Map<String,String> map1 = new HashMap<>();
|
|
|
+ Map<String,String> modifyMap = new HashMap<>();
|
|
|
+
|
|
|
+ if(electricField.getElectricFieldTypeEnum().getCode() == 2){
|
|
|
+ ws10Collect = checkList.stream().map(Nwp::getWs10).collect(Collectors.toList());
|
|
|
+ ws30Collect = checkList.stream().map(Nwp::getWs30).collect(Collectors.toList());
|
|
|
+ ws50Collect = checkList.stream().map(Nwp::getWs50).collect(Collectors.toList());
|
|
|
+ ws70Collect = checkList.stream().map(Nwp::getWs70).collect(Collectors.toList());
|
|
|
+ ws80Collect = checkList.stream().map(Nwp::getWs80).collect(Collectors.toList());
|
|
|
+ ws90Collect = checkList.stream().map(Nwp::getWs90).collect(Collectors.toList());
|
|
|
+ ws100Collect = checkList.stream().map(Nwp::getWs100).collect(Collectors.toList());
|
|
|
+ ws170Collect = checkList.stream().map(Nwp::getWs170).collect(Collectors.toList());
|
|
|
+ datas.put("ws10",ws10Collect);
|
|
|
+ datas.put("ws30",ws30Collect);
|
|
|
+ datas.put("ws50",ws50Collect);
|
|
|
+ datas.put("ws70",ws70Collect);
|
|
|
+ datas.put("ws80",ws80Collect);
|
|
|
+ datas.put("ws90",ws90Collect);
|
|
|
+ datas.put("ws100",ws100Collect);
|
|
|
+ datas.put("ws170",ws170Collect);
|
|
|
+
|
|
|
+ List<BigDecimal> ws10ModifyList = modifiedList.stream().map(NwpSpeedModified::getWs10).collect(Collectors.toList());
|
|
|
+ List<BigDecimal> ws30ModifyList = modifiedList.stream().map(NwpSpeedModified::getWs30).collect(Collectors.toList());
|
|
|
+ List<BigDecimal> ws50ModifyList = modifiedList.stream().map(NwpSpeedModified::getWs50).collect(Collectors.toList());
|
|
|
+ List<BigDecimal> ws70ModifyList = modifiedList.stream().map(NwpSpeedModified::getWs70).collect(Collectors.toList());
|
|
|
+ List<BigDecimal> ws80ModifyList = modifiedList.stream().map(NwpSpeedModified::getWs80).collect(Collectors.toList());
|
|
|
+ List<BigDecimal> ws90ModifyList = modifiedList.stream().map(NwpSpeedModified::getWs90).collect(Collectors.toList());
|
|
|
+ List<BigDecimal> ws100ModifyList = modifiedList.stream().map(NwpSpeedModified::getWs100).collect(Collectors.toList());
|
|
|
+ List<BigDecimal> ws170ModifyList = modifiedList.stream().map(NwpSpeedModified::getWs170).collect(Collectors.toList());
|
|
|
+
|
|
|
+ modifyDatas.put("ws10Modify", ws10ModifyList);
|
|
|
+ modifyDatas.put("ws30Modify", ws30ModifyList);
|
|
|
+ modifyDatas.put("ws50Modify", ws50ModifyList);
|
|
|
+ modifyDatas.put("ws70Modify", ws70ModifyList);
|
|
|
+ modifyDatas.put("ws80Modify", ws80ModifyList);
|
|
|
+ modifyDatas.put("ws90Modify", ws90ModifyList);
|
|
|
+ modifyDatas.put("ws100Modify", ws100ModifyList);
|
|
|
+ modifyDatas.put("ws170Modify", ws170ModifyList);
|
|
|
+
|
|
|
+ try {
|
|
|
+ SysParameter sysParameter = sysParameterRepository.findBySysKeyEquals("NWP_CHANGE_WIND");
|
|
|
+ if (sysParameter != null) {
|
|
|
+ String nwpChangeWind = sysParameter.getSysValue();
|
|
|
+ String[] windChangeName = nwpChangeWind.split(",");
|
|
|
+ if (windChangeName.length == 16) {
|
|
|
+ map1.put("ws10",windChangeName[0]+"米风速");
|
|
|
+ map1.put("ws30",windChangeName[1]+"米风速");
|
|
|
+ map1.put("ws50",windChangeName[2]+"米风速");
|
|
|
+ map1.put("ws70",windChangeName[3]+"米风速");
|
|
|
+ map1.put("ws80",windChangeName[4]+"米风速");
|
|
|
+ map1.put("ws90",windChangeName[5]+"米风速");
|
|
|
+ map1.put("ws100",windChangeName[6]+"米风速");
|
|
|
+ map1.put("ws170",windChangeName[7]+"米风速");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (RuntimeException e) {
|
|
|
+ String errorInfo = "NWP风速风向别名参数获取失败" + CommonUtil.printStackTraceToString(e);
|
|
|
+ log.error(errorInfo, e);
|
|
|
+ }
|
|
|
+ if (map1.isEmpty()){
|
|
|
+ map1.put("ws10","10米风速");
|
|
|
+ map1.put("ws30","30米风速");
|
|
|
+ map1.put("ws50","50米风速");
|
|
|
+ map1.put("ws70","70米风速");
|
|
|
+ map1.put("ws80","80米风速");
|
|
|
+ map1.put("ws90","90米风速");
|
|
|
+ map1.put("ws100","100米风速");
|
|
|
+ map1.put("ws170","170米风速");
|
|
|
+ }
|
|
|
+ modifyMap.put("ws10Modify","修改后10米风速");
|
|
|
+ modifyMap.put("ws30Modify","修改后30米风速");
|
|
|
+ modifyMap.put("ws50Modify","修改后50米风速");
|
|
|
+ modifyMap.put("ws70Modify","修改后70米风速");
|
|
|
+ modifyMap.put("ws80Modify","修改后80米风速");
|
|
|
+ modifyMap.put("ws90Modify","修改后90米风速");
|
|
|
+ modifyMap.put("ws100Modify","修改后100米风速");
|
|
|
+ modifyMap.put("ws170Modify","修改后170米风速");
|
|
|
+ }
|
|
|
+
|
|
|
+ map.put("cName",map1);
|
|
|
+ map.put("modifyName", modifyMap);
|
|
|
+ map.put("times",times);
|
|
|
+ map.put("datas",datas);
|
|
|
+ map.put("modifyDatas",modifyDatas);
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改风速
|
|
|
+ * @param nwp
|
|
|
+ * @param num
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public NwpSpeedModified caculateSpeed(Nwp nwp, String num){
|
|
|
+ NwpSpeedModified nwpSpeedModified = new NwpSpeedModified();
|
|
|
+ if(nwp.getWs10().compareTo(BigDecimal.ZERO) == 1){
|
|
|
+ nwpSpeedModified.setWs10(nwp.getWs10().multiply(new BigDecimal(num)));
|
|
|
+ }
|
|
|
+ if(nwp.getWs30().compareTo(BigDecimal.ZERO) == 1){
|
|
|
+ nwpSpeedModified.setWs30(nwp.getWs30().multiply(new BigDecimal(num)));
|
|
|
+ }
|
|
|
+ if(nwp.getWs50().compareTo(BigDecimal.ZERO) == 1){
|
|
|
+ nwpSpeedModified.setWs50(nwp.getWs50().multiply(new BigDecimal(num)));
|
|
|
+ }
|
|
|
+ if(nwp.getWs70().compareTo(BigDecimal.ZERO) == 1){
|
|
|
+ nwpSpeedModified.setWs70(nwp.getWs70().multiply(new BigDecimal(num)));
|
|
|
+ }
|
|
|
+ if(nwp.getWs80().compareTo(BigDecimal.ZERO) == 1){
|
|
|
+ nwpSpeedModified.setWs80(nwp.getWs80().multiply(new BigDecimal(num)));
|
|
|
+ }
|
|
|
+ if(nwp.getWs90().compareTo(BigDecimal.ZERO) == 1){
|
|
|
+ nwpSpeedModified.setWs90(nwp.getWs90().multiply(new BigDecimal(num)));
|
|
|
+ }
|
|
|
+ if(nwp.getWs100().compareTo(BigDecimal.ZERO) == 1){
|
|
|
+ nwpSpeedModified.setWs100(nwp.getWs100().multiply(new BigDecimal(num)));
|
|
|
+ }
|
|
|
+ if(nwp.getWs170().compareTo(BigDecimal.ZERO) == 1){
|
|
|
+ nwpSpeedModified.setWs170(nwp.getWs170().multiply(new BigDecimal(num)));
|
|
|
+ }
|
|
|
+ nwpSpeedModified.setModifyTime(nwp.getPreTime());
|
|
|
+ return nwpSpeedModified;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算修改风速
|
|
|
+ *
|
|
|
+ * @param nwpList
|
|
|
+ * @param num
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<BigDecimal> getModifyDatas(List<BigDecimal> nwpList, String num){
|
|
|
+ List<BigDecimal> tempList = new ArrayList<>();
|
|
|
+ for (BigDecimal collect : nwpList) {
|
|
|
+
|
|
|
+ if(collect != null){
|
|
|
+ BigDecimal multiply = collect.multiply(new BigDecimal(num));
|
|
|
+ tempList.add(multiply);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return tempList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 根据时间 分页查询 NWP数据 yh
|
|
|
*
|
|
|
* @param startTime 开始时间
|
|
@@ -738,6 +966,42 @@ public class NwpService extends BaseService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 对集合进行 -99替换null操作,主要用于图标展示空值
|
|
|
+ *
|
|
|
+ * @param datas 需要替换集合
|
|
|
+ */
|
|
|
+ public void nwpSpeedDefaultReplace(List<NwpSpeedModified> datas){
|
|
|
+ BigDecimal nullBig = new BigDecimal(-99);
|
|
|
+ for(NwpSpeedModified i :datas){
|
|
|
+
|
|
|
+ if(i.getWs10().compareTo(nullBig)==0){
|
|
|
+ i.setWs10(null);
|
|
|
+ }
|
|
|
+ if(i.getWs30().compareTo(nullBig)==0){
|
|
|
+ i.setWs30(null);
|
|
|
+ }
|
|
|
+ if(i.getWs50().compareTo(nullBig)==0){
|
|
|
+ i.setWs50(null);
|
|
|
+ }
|
|
|
+ if(i.getWs70().compareTo(nullBig)==0){
|
|
|
+ i.setWs70(null);
|
|
|
+ }
|
|
|
+ if(i.getWs80().compareTo(nullBig)==0){
|
|
|
+ i.setWs80(null);
|
|
|
+ }
|
|
|
+ if(i.getWs90().compareTo(nullBig)==0){
|
|
|
+ i.setWs90(null);
|
|
|
+ }
|
|
|
+ if(i.getWs100().compareTo(nullBig)==0){
|
|
|
+ i.setWs100(null);
|
|
|
+ }
|
|
|
+ if(i.getWs170().compareTo(nullBig)==0){
|
|
|
+ i.setWs170(null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* (统计查询:nwp风速统计(吉林22))
|
|
|
* @param startTime 开始时间
|
|
|
* @param endTime 结束时间
|