Commit 07602a7b authored by kang.nie@inzymeits.com's avatar kang.nie@inzymeits.com
Browse files

提交代码

parent e0c7be76
package com.ssi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ssi.entity.VmsTerminal;
import com.ssi.response.SSIPage;
import com.ssi.response.SSIResponse;
import java.util.Map;
/**
* 终端表
*
* @author zhang liyao
* @email
* @date 2020-07-16 09:32:59
*/
public interface VmsTerminalService extends IService<VmsTerminal> {
SSIPage queryPage(Map<String, Object> params);
SSIResponse saveTerminal(VmsTerminal vmsTerminal);
SSIResponse videoMonitor(String vin);
}
package com.ssi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ssi.entity.VmsTerminalVersion;
import com.ssi.response.SSIPage;
import java.util.Map;
/**
* 终端版本表
*
* @author zhang liyao
* @email
* @date 2020-07-16 13:36:49
*/
public interface VmsTerminalVersionService extends IService<VmsTerminalVersion> {
SSIPage queryPage(Map<String, Object> params);
}
package com.ssi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ssi.entity.VmsTosOrderDailyKpi;
import java.util.List;
import java.util.Map;
/**
* @author dt
* @description:
* @create 2022-10-28 16:44
*/
public interface VmsTosOrderDailyKpiService extends IService<VmsTosOrderDailyKpi> {
/**
* 预处理任务
* @param vins
* @return
*/
Boolean analysisTosOrderDailyKpi(String vins);
/**
* 查询
* @param day
* @param vehicleNum
* @return
*/
List<Map<String, String>> getOrderDailyKpi(String day, String vehicleNum);
}
package com.ssi.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ssi.entity.VmsTosOrdersAnalysis;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 任务分析表
*
* @author hli
* @email
* @date 2021-01-11 14:00:36
*/
public interface VmsTosOrdersAnalysisService extends IService<VmsTosOrdersAnalysis> {
IPage<VmsTosOrdersAnalysis> queryPage(int current, int size, VmsTosOrdersAnalysis vmsTosOrdersAnalysis);
void runTosAnalysisTask(LocalDateTime startTime, LocalDateTime endTime);
void reAnalysis(LocalDate date);
}
package com.ssi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ssi.entity.VmsTosOrdersOee;
import com.ssi.entity.vo.VmsTosOrdersKPIVo;
import java.time.LocalDateTime;
import java.util.List;
/**
*
* @author hli
* @email
* @date 2021-02-04 11:00:44
*/
public interface VmsTosOrdersOeeService extends IService<VmsTosOrdersOee> {
void runTosOeeTask(LocalDateTime startTime, LocalDateTime endTime);
List taskOee(VmsTosOrdersKPIVo vmsTosOrders);
}
package com.ssi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ssi.entity.VmsTosOrders;
import com.ssi.entity.vo.TaskKPIVo;
import com.ssi.entity.vo.VmsTosOrdersKPIVo;
import com.ssi.entity.vo.VmsTosOrdersVo;
import com.ssi.response.SSIPage;
import com.ssi.response.SSIResponse;
import javax.servlet.http.HttpServletResponse;
import java.text.ParseException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* @author zhang liyao
* @email
* @date 2020-07-11 13:12:01
*/
public interface VmsTosOrdersService extends IService<VmsTosOrders> {
Map<String, VmsTosOrders> getAllVehicleLatestWork();
Map<String, Object> getOrdersByVin(String vin);
SSIResponse getVehicleTrip(String vin, Long startTime, Long endTime, String troubleTypeId);
SSIResponse getMileTimeByTime(String vin, Long startTime, Long stopTime);
SSIPage queryPage(VmsTosOrdersVo vmsTosOrdersVo);
SSIPage queryPageByAllStatus(VmsTosOrdersVo vmsTosOrdersVo);
void export(VmsTosOrdersVo vmsTosOrdersVo, HttpServletResponse response);
SSIResponse getTripByAlert(String vin, String alertId);
SSIResponse queryContainerNumOneDay(LocalDateTime startTime, LocalDateTime endTime);
SSIResponse queryContainerNum();
SSIResponse queryContainerNumByDay(LocalDateTime startTime, LocalDateTime endTime) throws Exception;
SSIResponse queryContainerAvgTimeOneDay(LocalDateTime startTime, LocalDateTime endTime);
SSIResponse queryContainerAvgTime();
SSIResponse getNumByVin(String vin);
SSIResponse getVehicleByPadMac(String padMac, String taskNo);
SSIResponse getTaskHistory(String taskNo);
SSIPage listInProcess(VmsTosOrdersVo vmsTosOrdersVo);
SSIPage realTimeTasks(VmsTosOrdersVo vmsTosOrdersVo);
List getDailyKpi(LocalDateTime startTime, LocalDateTime endTime,String vehicleNum);
//任务KPI-效率OEE分析
List taskKPI(VmsTosOrdersKPIVo vmsTosOrders) throws Exception;
SSIResponse forceCancel(String taskNo);
}
package com.ssi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ssi.entity.VmsTosOriginalOrders;
import com.ssi.entity.vo.VmsTosOrdersVo;
import com.ssi.response.SSIPage;
/**
*
*/
public interface VmsTosOriginalOrdersService extends IService<VmsTosOriginalOrders> {
SSIPage queryPageByCondition(VmsTosOrdersVo vmsTosOrdersVo);
}
package com.ssi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.google.gson.JsonObject;
import com.ssi.entity.VmsTrafficLightInfo;
import com.ssi.response.SSIPage;
/**
*
*/
public interface VmsTrafficLightInfoService extends IService<VmsTrafficLightInfo> {
SSIPage queryPage(VmsTrafficLightInfo req);
String manual(VmsTrafficLightInfo req);
}
package com.ssi.service;
import com.ssi.entity.VmsVehicleAlertProcess;
import com.baomidou.mybatisplus.extension.service.IService;
/**
*
*/
public interface VmsVehicleAlertProcessService extends IService<VmsVehicleAlertProcess> {
}
package com.ssi.service;
import com.ssi.entity.dto.VmsVehicleVinFreeTimeDto;
/**
* @author dt
* @description: 车辆空闲时间 service
* @create 2022-11-09 18:28
*/
public interface VmsVehicleFreeTimeService {
/**
* 查询车辆时间范围内的空闲时间
* @param vmsVehicleVinFreeTimeDto
* @return
*/
VmsVehicleVinFreeTimeDto getVehicleFreeTime(VmsVehicleVinFreeTimeDto vmsVehicleVinFreeTimeDto);
}
package com.ssi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ssi.entity.VmsVehicle;
import com.ssi.entity.vo.VehicleControlStatusVo;
import com.ssi.entity.vo.VehicleStatusVo;
import com.ssi.response.SSIPage;
import com.ssi.response.SSIResponse;
import java.util.List;
import java.util.Map;
/**
* 车辆表
*
* @author zhang liyao
* @email
* @date 2020-07-08 15:38:37
*/
public interface VmsVehicleService extends IService<VmsVehicle> {
SSIPage queryPage(Map<String, Object> params);
List<VmsVehicle> getNormalVehicle();
List<VmsVehicle> getNormalVehicleByVehicleNum(String vehicleNum,Integer vehicleType);
List<VmsVehicle> listAndCache();
SSIResponse listForMonitor(List<VmsVehicle> vehicleList);
SSIResponse vehicleStatusForMonitor(List<VmsVehicle> vehicleList);
VehicleStatusVo vehicleStatusDist(List<VmsVehicle> vehicleList);
SSIResponse saveVehicle(VmsVehicle vehicle);
SSIResponse transportCapacity();
List<VehicleControlStatusVo> getVehicleByLocation(String location, Integer distance);
Map getVmsCranePosMapInfo(String name);
List<Map>getVmsVehicle();
}
package com.ssi.service;
import java.util.Set;
/**
* Description:
*
* @author LiXiaoCong
* @version 2019/9/20 11:45
*/
public interface WebSocketDataBackService {
int playBack(String sessionId,
String backorId,
String scenesId,
Set<String> vins,
Long startTime,
Long stopTime);
void close(String sessionId, String playBackId);
}
package com.ssi.service.impl;
import com.alibaba.fastjson.JSON;
import com.alicp.jetcache.anno.CacheRefresh;
import com.alicp.jetcache.anno.Cached;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.ssi.constant.enums.VehicleTaskLabelEnum;
import com.ssi.entity.VmsVehicle;
import com.ssi.entity.VmsVehicleOperateTask;
import com.ssi.entity.VmsChargingTotal;
import com.ssi.entity.VmsTosOrders;
import com.ssi.entity.vo.OperateDataVo;
import com.ssi.entity.vo.VehicleStatusVo;
import com.ssi.mapper.VmsCarryCapacityAnalysisMapper;
import com.ssi.mapper.VmsVehicleOperateTaskMapper;
import com.ssi.mapper.VmsChargingTotalMapper;
import com.ssi.model.RedisDataModel;
import com.ssi.response.SSIResponse;
import com.ssi.service.BigScreenService;
import com.ssi.service.VmsVehicleService;
import com.ssi.service.VmsTosOrdersService;
import com.ssi.task.TaskOperateExecutor;
import com.ssi.utils.ToolUtils;
import com.ssi.utils.VehicleUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* 大屏接口服务层实现类
* @author ZhangLiYao
* @version 1.0
* @date 2020/8/10 9:51
*/
@Service("screenService")
public class BigScreenServiceImpl implements BigScreenService {
@Autowired
private TaskOperateExecutor taskOperateExecutor;
@Autowired
private VmsVehicleOperateTaskMapper vmsVehicleOperateTaskMapper;
@Autowired
private VmsChargingTotalMapper vmsChargingTotalMapper;
@Autowired
private VmsVehicleService vmsVehicleService;
@Autowired
private VmsTosOrdersService vmsTosOrdersService;
@Autowired
private RedisDataModel redisDataModel;
@Autowired
private BigScreenService bigScreenService;
@Autowired
private VmsCarryCapacityAnalysisMapper vmsCarryCapacityAnalysisMapper;
@Value("${order.latestOrderKeyPrefix:harbor:command:status}")
private String latestOrderKeyPrefix;
@Value("${ivccs.vehicle.latestData.redis.prefix:ivccs:vms:vehicle:latest}")
private String latestRedisKeyPrefix;
@Value("${vehicle.latestData.redis.postfix:harbor_D00A}")
private String realPostfix;
/**
* 大屏获取运营数据
*/
@Override
@Cached(name = "bigScreenServiceImpl:getOperateData", expire = 60, timeUnit = TimeUnit.SECONDS)
@CacheRefresh(refresh = 20, stopRefreshAfterLastAccess = 1440, timeUnit = TimeUnit.SECONDS)
public SSIResponse getOperateData(List<String> vins, Date startDate, Date endDate) {
/*OperateDataVo operateDataVo = new OperateDataVo(BigDecimal.valueOf(0), BigDecimal.valueOf(0));
List<VmsVehicleOperateTask> vmsVehicleOperateTasks = vmsVehicleOperateTaskMapper.selectList(new LambdaQueryWrapper<VmsVehicleOperateTask>()
.eq(StringUtils.isNotBlank(vin), VmsVehicleOperateTask::getVin, vin));
vmsVehicleOperateTasks.stream().forEach(vmsVehicleOperateTask -> {
operateDataVo.setTravelmile(operateDataVo.getTravelmile()
.add(vmsVehicleOperateTask.getOperateMile().divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP)));
operateDataVo.setTravelTime(operateDataVo.getTravelTime()
.add(vmsVehicleOperateTask.getOperateTime().divide(new BigDecimal(60 * 60 * 1000), 2, BigDecimal.ROUND_HALF_UP)));
});
long[] today = getToday();
List<String> vins = Lists.newArrayList();
if (StringUtils.isNotBlank(vin)) {
vins = Arrays.asList(vin.split(","));
} else {
vins = vmsVehicleService.list().stream().map(VmsVehicle::getVin).collect(Collectors.toList());
}
for (String curVin : vins) {
addData(operateDataVo, curVin, today[0], System.currentTimeMillis());
}*/
OperateDataVo operateDataVo = vmsCarryCapacityAnalysisMapper.getOverallOperateData(vins,startDate,endDate);
return SSIResponse.ok(operateDataVo);
}
/**
* 车辆状态分布
*/
@Override
public SSIResponse getVehicleStatusDist() {
List<VmsVehicle> vehicleList = vmsVehicleService.getNormalVehicle();
VehicleStatusVo vehicleStatusVo = vmsVehicleService.vehicleStatusDist(vehicleList);
return SSIResponse.ok(vehicleStatusVo);
}
/**
* 大屏查询单车信息
*/
@Override
public SSIResponse getVehicleInfo(String vin) {
Map<String, Object> resultMap = new HashMap<>();
//车辆信息添加
VmsVehicle vehicle = vmsVehicleService.getOne(new LambdaQueryWrapper<VmsVehicle>().eq(VmsVehicle::getVin, vin));
resultMap.put("vehicleNum", vehicle.getVehicleNum());
resultMap.put("vin", vehicle.getVin());
Map<String, Object> realMap = redisDataModel.getJson2Map(String.format("%s:%s-%s", latestRedisKeyPrefix, vehicle.getVin(), realPostfix));
if (realMap == null) {
realMap = Maps.newHashMap();
}
resultMap.put("soc", realMap.get("soc"));
//运营信息添加
SSIResponse operateResponse = bigScreenService.getOperateData(Arrays.asList(vin),null,null);
OperateDataVo operateDataVo = (OperateDataVo) operateResponse.getData();
resultMap.put("travelMile", operateDataVo.getTravelmile());
resultMap.put("travelTime", operateDataVo.getTravelTime());
//任务箱数添加
SSIResponse ordersNumResponse = vmsTosOrdersService.getNumByVin(vin);
Map<String, Integer> ordersNum = (Map<String, Integer>) ordersNumResponse.getData();
resultMap.putAll(ordersNum);
//任务状态添加
Map<String, Object> orderMap = redisDataModel.getJson2Map(String.format("%s:%s", latestOrderKeyPrefix, vehicle.getVin()));
VmsTosOrders vmsTosOrders = JSON.parseObject(JSON.toJSONString(orderMap), VmsTosOrders.class);
if (vmsTosOrders != null && !VehicleUtil.isTaskOver(vmsTosOrders.getStatus())) {
resultMap.put("taskType", vmsTosOrders.getVehicleTaskLabel());
} else {
resultMap.put("taskType", VehicleTaskLabelEnum.PARK.getCode());
}
Integer chargeNum = vmsChargingTotalMapper.selectCount(new LambdaQueryWrapper<VmsChargingTotal>().eq(VmsChargingTotal::getVin, vin));
resultMap.put("chargeNum", chargeNum);
resultMap.put("mileage", realMap.get("mileage"));
return SSIResponse.ok(resultMap);
}
private long[] getToday() {
Calendar calendar = Calendar.getInstance();
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
long start = calendar.getTime().getTime();
Calendar calendar2 = Calendar.getInstance();
calendar2.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
long end = calendar2.getTime().getTime();
long[] result = new long[]{start, end};
return result;
}
private void addData(OperateDataVo operateDataVo, String vin, long start, long end) {
VmsVehicleOperateTask vehicleOpreateToday = taskOperateExecutor.getVehicleOpreateByTime(vin, start, end);
if (vehicleOpreateToday != null) {
operateDataVo.setTravelmile(operateDataVo.getTravelmile().add(vehicleOpreateToday.getOperateMile()));
operateDataVo.setTravelTime(operateDataVo.getTravelTime().add(vehicleOpreateToday.getOperateTime()));
}
}
}
package com.ssi.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ssi.constant.URL;
import com.ssi.entity.CargoShipConfigInfo;
import com.ssi.entity.VmsAreaBusinessInfo;
import com.ssi.entity.VmsShipInfo;
import com.ssi.entity.map.MapDataDto;
import com.ssi.entity.vo.CargoShipConfigDto;
import com.ssi.entity.vo.LocationVo;
import com.ssi.response.SSIPage;
import com.ssi.service.CargoShipConfigInfoService;
import com.ssi.mapper.CargoShipConfigInfoMapper;
import com.ssi.service.VmsAreaBusinessInfoService;
import com.ssi.service.VmsCranePadBindService;
import com.ssi.service.VmsShipsDrawingService;
import com.ssi.utils.RestTemplateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.common.recycler.Recycler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mapping.PreferredConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.swing.tree.TreeNode;
import java.awt.geom.Path2D;
import java.util.*;
import java.util.stream.Collectors;
/**
*
*/
@Service
@DS("mysql")
@Slf4j
public class CargoShipConfigInfoServiceImpl extends ServiceImpl<CargoShipConfigInfoMapper, CargoShipConfigInfo>
implements CargoShipConfigInfoService{
@Value("${map-edit-url}")
private String mapUrl;
@Autowired
private VmsCranePadBindService vmsCranePadBindService;
@Autowired
private VmsAreaBusinessInfoService vmsAreaBusinessInfoService;
@Autowired
private VmsShipsDrawingService vmsShipsDrawingService;
@Override
public List<CargoShipConfigDto> queryOnWorkingList() {
List<CargoShipConfigDto> dtos = this.baseMapper.queryOnWorkingList(new CargoShipConfigDto());
dtos.parallelStream().forEach(cargoShipConfigDto -> {
if(StringUtils.isNotBlank(cargoShipConfigDto.getPassArea())){
cargoShipConfigDto.setPassAreaObj(JSONObject.parseObject(cargoShipConfigDto.getPassArea()));
}
cargoShipConfigDto.setYardBayObj(JSONObject.parseObject(cargoShipConfigDto.getYardBay()));
});
return dtos;
}
@Override
@Transactional(rollbackFor = Throwable.class )
public void enableConfig(List<CargoShipConfigDto> cargoShipConfigDtos) {
clearShipInfo(cargoShipConfigDtos);
for (CargoShipConfigDto cargoShipConfigDto:cargoShipConfigDtos) {
if(cargoShipConfigDto.getIsActive().compareTo((byte)1)==0){
//激活或更新配置需先取消其它配置
// this.baseMapper.updateByIsActive();
//桥吊配置确认
if(checkBridgeStatus(cargoShipConfigDto)){
continue;
}
//调用路径规划端接口,设置桥吊缓冲区、桥吊扭锁站对应
if(StringUtils.isNotBlank(cargoShipConfigDto.getPassArea())){
JSONObject passAreaObj = JSONObject.parseObject(cargoShipConfigDto.getPassArea());
String upArea = passAreaObj.getString("upArea");
String downArea = passAreaObj.getString("downArea");
String upAreaId = passAreaObj.getString("upAreaId");
String downAreaId = passAreaObj.getString("downAreaId");
//激活当前配置删除其它配置
vmsAreaBusinessInfoService.remove(new QueryWrapper<VmsAreaBusinessInfo>().eq("area_type",5));
updatePassArea(cargoShipConfigDto.getBridgeNo(),upArea,upAreaId,"1");
updatePassArea(cargoShipConfigDto.getBridgeNo(),downArea,downAreaId,"2");
}
if(StringUtils.isNotBlank(cargoShipConfigDto.getLockArea())){
log.info("激活扭锁信息");
String[] lockAreas = cargoShipConfigDto.getLockArea().split(",");
Arrays.stream(lockAreas).forEach(lockArea->{
vmsCranePadBindService.updateCraneBind(null,null,lockArea,cargoShipConfigDto.getBridgeNo());
});
}
}else{//配置移除
}
//保存当前配置
this.save(cargoShipConfigDto);
}
}
@Override
public JSONObject listByCondition(CargoShipConfigDto cargoShipConfigDto) {
JSONObject result = new JSONObject();
List<CargoShipConfigDto> dtos = this.baseMapper.queryOnWorkingList(cargoShipConfigDto);
List<String> workBridge = new ArrayList<>();
dtos.parallelStream().forEach(dto -> {
if(StringUtils.isNotBlank(dto.getPassArea())){
dto.setPassAreaObj(JSONObject.parseObject(dto.getPassArea()));
}
dto.setYardBayObj(JSONObject.parseObject(dto.getYardBay()));
workBridge.add(dto.getBridgeNo());
});
result.put("workBridge",workBridge);
result.put("result",dtos);
return result;
}
private void clearShipInfo(List<CargoShipConfigDto> cargoShipConfigDtos) {
/* CargoShipConfigInfo delEntity = new CargoShipConfigInfo();
//delEntity.setCode(cargoShipConfigDtos.get(0).getCode());
delEntity.setName(cargoShipConfigDtos.get(0).getName());*/
this.baseMapper.delete(new LambdaQueryWrapper<CargoShipConfigInfo>().eq(CargoShipConfigInfo::getName,cargoShipConfigDtos.get(0).getName()));
}
private Boolean checkBridgeStatus(CargoShipConfigDto cargoShipConfigDto) {
assert cargoShipConfigDto.getBridgeNo() != null:"bridgeNo不能为null";
// SSIPage ssiPage = vmsShipsDrawingService.queryPage(new HashMap<String, Object>() {{
// put("pageSize", 999);
// put("pageIndex", 1);
// }});
// List<VmsShipInfo> shipCodes = (List<VmsShipInfo>)ssiPage.getList();
// List<String> voyageNo = shipCodes.stream().map(VmsShipInfo::getVoyageNo).collect(Collectors.toList());
List<CargoShipConfigInfo> list = this.lambdaQuery().eq(CargoShipConfigInfo::getBridgeNo, cargoShipConfigDto.getBridgeNo())
.ne(CargoShipConfigInfo::getCode,cargoShipConfigDto.getCode())
.list();
for (CargoShipConfigInfo oldCargo: list) {
// if(oldCargo.getIsActive().compareTo((byte)1) == 0&&voyageNo.contains(oldCargo.getCode())){
// return true;
// }
this.baseMapper.deleteById(oldCargo.getId());
}
return false;
}
@Override
public List<JSONObject> qryEnableCacheArea(String beginLocation, String endLocation) {
//计算坐标点
List<LocationVo> orderLocations = getOrderLocation(beginLocation,endLocation);
//绘制区域
Path2D.Double ruleArea = drawRuleArea(orderLocations);
//获取所有缓冲区
List<JSONObject> bufferArray = qryCacheArea();
Iterator<JSONObject> iterator = bufferArray.iterator();
while (iterator.hasNext()){
JSONObject buffeArea =iterator.next();
boolean contains = ruleArea.contains(buffeArea.getDouble("centerlng"), buffeArea.getDouble("centerlat"));
if(contains){
iterator.remove();
continue;
}
boolean locateCheck1 = ruleArea.contains(buffeArea.getDouble("lng1"), buffeArea.getDouble("lat1"));
boolean locateCheck2 = ruleArea.contains(buffeArea.getDouble("lng2"), buffeArea.getDouble("lat2"));
boolean locateCheck3 = ruleArea.contains(buffeArea.getDouble("lng3"), buffeArea.getDouble("lat3"));
boolean locateCheck4 = ruleArea.contains(buffeArea.getDouble("lng4"), buffeArea.getDouble("lat4"));
if(locateCheck1||locateCheck2||locateCheck3||locateCheck4){
iterator.remove();
}
}
return bufferArray;
}
private List<JSONObject> qryCacheArea(){
JSONObject param = new JSONObject();
param.put("state", "0");// 可正常使用
log.debug(String.format("绘制地图区域请求发送:----%s", param.toJSONString()));
String result = RestTemplateUtil.post(String.format("%s%s", mapUrl, URL.MAP_QUERY_URL), param.toJSONString(), null);
log.debug(String.format("绘制地图区域请求返回结果:----%s", result));
JSONObject jsonObject = JSONObject.parseObject(result);
if(Objects.nonNull(jsonObject)&&jsonObject.getInteger("code")==1){
JSONArray data = jsonObject.getJSONArray("data");
List<JSONObject> results = data.toJavaList(JSONObject.class).stream().filter((obj) -> {
if (!"1,5".contains(obj.getString("type"))) {
return false;
}
return true;
}).sorted((a, b) -> {
String oa = a.getString("name").replaceAll("^\\w","");
String ob = b.getString("name").replaceAll("^\\w","");
return Integer.valueOf(oa).compareTo(Integer.valueOf(ob));
}).collect(Collectors.toList());
return results;
}
return Collections.emptyList();
}
public Path2D.Double drawRuleArea( List<LocationVo> orderLocations) {
Path2D.Double generalPath = new Path2D.Double();
Double startLng = null;
Double startLat = null;
for(LocationVo entity:orderLocations){
if(startLng == null||startLat == null){
startLng = entity.getLon();
startLat = entity.getLat();
generalPath.moveTo(startLng,startLat);
}else {
generalPath.lineTo(entity.getLon(),entity.getLat());
}
}
generalPath.lineTo(startLng,startLat);
generalPath.closePath();
return generalPath;
}
private List<LocationVo> getOrderLocation(String beginLocation, String endLocation) {
String[] startLocation = beginLocation.replaceAll(";", "").split(",");
String[] lastLocation = endLocation.replaceAll(";", "").split(",");
if(startLocation.length!=2||lastLocation.length!=2){
return null;
}
List<LocationVo> locationVos = new ArrayList<>();
Double startLongitude = Double.valueOf(startLocation[0]);
Double startLatitude = Double.valueOf(startLocation[1]);
Double lastLongitude = Double.valueOf(lastLocation[0]);
Double lastLatitude = Double.valueOf(lastLocation[1]);
if(startLongitude > lastLongitude){
startLongitude = startLongitude - 0.000175;
lastLongitude = lastLongitude + 0.000175;
}else {
startLongitude = startLongitude + 0.000175;
lastLongitude = lastLongitude - 0.000175;
}
locationVos.add(new LocationVo(startLongitude,startLatitude,null));
locationVos.add(new LocationVo(startLongitude+0.000189,startLatitude+0.000720,null));
locationVos.add(new LocationVo(lastLongitude+0.000189,lastLatitude+0.000720,null));
locationVos.add(new LocationVo(lastLongitude,lastLatitude,null));
return locationVos;
}
private String updatePassArea(String bridgeNos,String passArea,String passAreaId,String placeType){
if(StringUtils.isBlank(passArea)){
return null;
}
MapDataDto mapdata = new MapDataDto();
mapdata.setId(passAreaId);
mapdata.setNumber(passArea);
mapdata.setTaskType(Integer.valueOf(placeType));
mapdata.setBridge(bridgeNos);
mapdata.setBridgeNo(bridgeNos);
mapdata.setPlacetype(placeType);
mapdata.setType("5");
mapdata.setState("0");
mapdata.setField("F");
mapdata.setName(passArea);
String paramData = JSONObject.toJSONString(mapdata);
log.info(String.format("绘制地图区域update请求发送:----%s", paramData));
String result = RestTemplateUtil.post(String.format("%s%s", mapUrl, URL.MAP_EDIT_URL), paramData, null);
log.info(String.format("绘制地图区域update返回结果:----%s", result));
JSONObject jsonObject = JSONObject.parseObject(result);
if(Objects.nonNull(jsonObject)&&jsonObject.getInteger("code")==1){//成功则更新
vmsAreaBusinessInfoService.updatePassArea(mapdata);
}
return result;
}
}
package com.ssi.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ssi.constant.RedisKey;
import com.ssi.entity.CraneInfo;
import com.ssi.entity.VmsIndividuationConfig;
import com.ssi.model.CraneInfoRedis;
import com.ssi.model.RedisDataModel;
import com.ssi.response.SSIResponse;
import com.ssi.service.CraneInfoService;
import java.util.HashMap;
import com.ssi.service.VmsAreaBusinessInfoService;
import com.ssi.service.VmsCranePadBindService;
import com.ssi.service.VmsIndividuationConfigService;
import lombok.val;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 吊具信息服务层实现类
*/
@Service
public class CraneInfoServiceImpl implements CraneInfoService {
@Autowired
private RedisDataModel redisDataModel;
@Autowired
private VmsIndividuationConfigService individuationConfigService;
@Value("${harbor.crane.realTimeInfoKeyPrefix}")
private String craneRealTimeInfoKeyPrefix;
@Value("${harbor.crane.confirm}")
private String craneConfirmKeyPrefix;
@Autowired
private VmsAreaBusinessInfoService vmsAreaBusinessInfoService;
/**
* 获取桥吊、场吊信息列表
*/
@Override
public SSIResponse queryCraneList(CraneInfo craneInfo) {
List<Object> resList = queryCraneListFromRedis(craneInfo);
if (resList != null) {
for (Object object: resList){
JSONObject object1 = (JSONObject) object;
int portType = object1.getIntValue("portType");
if(1==portType){
List<String> portCode = vmsAreaBusinessInfoService.getByCrane(object1.getString("portCode"),craneInfo.getTaskType(),craneInfo.getTaskTypes());
object1.put("passArea",portCode);
object1.put("taskType",craneInfo.getTaskType());
}
}
return SSIResponse.ok(resList);
}
return SSIResponse.no("未查询到数据");
}
@Override
public Map<String, CraneInfoRedis> queryCraneListFromRedis() {
if (redisDataModel.keys(RedisKey.CRANE_INFO.getKeyPrefix() + "*").size() == 0){
return null;
}
val d = redisDataModel.mgetForMap(
redisDataModel.keys(RedisKey.CRANE_INFO.getKeyPrefix() + "*"));
Map<String, CraneInfoRedis> map = new HashMap<>();
d.forEach((key, value) -> {
if (value != null) {
map.put(StringUtils.removeStart(key, RedisKey.CRANE_INFO.getKeyPrefix()),
JSON.parseObject((String) value, CraneInfoRedis.class));
}
});
return map;
}
@Override
public List<Object> queryCraneListFromRedis(CraneInfo craneInfo) {
Set<String> keys = redisDataModel.keys(craneRealTimeInfoKeyPrefix + "*");
if (CollectionUtils.isNotEmpty(keys)) {
List<String> list = redisDataModel.mget(keys.toArray(new String[keys.size()]));
Integer craneType = craneInfo != null ? craneInfo.getCraneType() : null;
String craneNo = craneInfo != null ? craneInfo.getCraneNo() : null;
if (CollectionUtils.isNotEmpty(list)) {
List<Object> res = list.stream().map(s -> JSON.parseObject(s)).filter(obj -> {
if (craneType != null) {
Integer type = (Integer) obj.get("portType");
if (!craneType.equals(type)) {
return false;
}
}
if (craneNo != null) {
String code = String.valueOf(obj.get("portCode"));
if (!code.startsWith(craneNo)) {
return false;
}
}
return true;
}).collect(Collectors.toList());
return res;
}
}
return null;
}
/**
* 获取桥吊、场吊、龙锁装卸区信息列表
*/
@Override
public SSIResponse queryCraneLockAreaList(CraneInfo craneInfo) {
List<Object> resList = queryCraneListFromRedis(craneInfo);
//暂时不用先注释掉
/*String craneNo = craneInfo != null ? craneInfo.getCraneNo() : null;
if(craneNo == null || "扭锁装卸区".startsWith(craneNo)){
JSONObject object = new JSONObject();
object.put("portCode", "扭锁装卸区");
object.put("portType",3);
resList.add(object);
}*/
if (resList != null) {
return SSIResponse.ok(resList);
}
return SSIResponse.no("未查询到数据");
}
@Override
public Map queryCraneConfirmInfo(String craneNo) {
return redisDataModel.getJson2Map(craneConfirmKeyPrefix + ":" + craneNo);
}
@Override
public SSIResponse queryCraneColor(String craneNo) {
VmsIndividuationConfig vmsIndividuationConfig = individuationConfigService.lambdaQuery().eq(VmsIndividuationConfig::getConfigKey, "crane_color_config").one();
String configValue = vmsIndividuationConfig.getConfigValue();
JSONObject jsonObject = JSON.parseObject(configValue);
if (jsonObject != null) {
return SSIResponse.ok(StringUtils.isNotBlank(craneNo)? jsonObject.getString(craneNo):jsonObject);
}
return SSIResponse.no("未查询到数据");
}
}
package com.ssi.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ssi.controller.OperationAnalysisController;
import com.ssi.entity.VmsChargingTotal;
import com.ssi.entity.VmsKpiAnalysis;
import com.ssi.entity.VmsVehicle;
import com.ssi.entity.dto.AnalyseTaskOrderResp;
import com.ssi.entity.dto.VehicleTaskOrderReq;
import com.ssi.entity.vo.*;
import com.ssi.mapper.VmsCarryCapacityAnalysisMapper;
import com.ssi.mapper.VmsChargingTotalMapper;
import com.ssi.mapper.VmsTosOrdersAnalysisMapper;
import com.ssi.mapper.VmsTosOrdersMapper;
import com.ssi.response.SSIResponse;
import com.ssi.service.*;
import com.ssi.utils.ChargeDailyTimeUtil;
import com.ssi.utils.DateUtils;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.*;
/**
* 运营分析服务实现类
*/
@Service
public class OperationAnalysisServiceImpl implements OperationAnalysisService {
@Autowired
private VmsVehicleService vmsVehicleService;
@Autowired
private VmsChargingPileService vmsChargingPileService;
@Autowired
private VmsTosOrdersMapper vmsTosOrdersMapper;
@Autowired
private BigScreenService bigScreenService;
@Autowired
private VmsCarryCapacityAnalysisMapper vmsCarryCapacityAnalysisMapper;
@Autowired
private VmsChargingTotalMapper vmsChargingTotalMapper;
@Autowired
private VmsTosOrdersAnalysisMapper vmsTosOrdersAnalysisMapper;
@Autowired
private VmsKpiAnalysisService vmsKpiAnalysisService;
/**
* 各项总体数据
* @param vins
* @param interval
*/
@Override
public SSIResponse overallData(List<String> vins, List<Date> interval) {
Map<String, Object> res = new HashMap();
//车辆总数
//int totalVehicle = vmsVehicleService.lambdaQuery().eq(VmsVehicle::getStatus, 0).count();
int totalVehicle = vmsVehicleService.lambdaQuery().eq(VmsVehicle::getStatus, 0)
.in(VmsVehicle::getVehicleType,2).count();
res.put("totalVehicle", totalVehicle);
Date startDate = new Date();
Date endDate = new Date();
if(CollectionUtils.isNotEmpty(interval)){
startDate = interval.get(0);
startDate.setHours(0);
endDate = org.apache.commons.lang3.time.DateUtils.addDays(interval.get(1), 1);
endDate.setHours(0);
}else {
startDate = org.apache.commons.lang3.time.DateUtils.addDays(startDate, -1);
startDate.setHours(0);
endDate.setHours(0);
}
//车辆有效使用率
double vehicleEffectiveUseRate = vmsCarryCapacityAnalysisMapper.getVehicleEffectiveUseRate(vins,startDate,endDate);
res.put("vehicleEffectiveUseRate", vehicleEffectiveUseRate);
//充电桩总数
int totalChargingPile = vmsChargingPileService.count();
res.put("totalChargingPile", totalChargingPile);
//充电桩利用率
double chargingPileUseRate = vmsChargingTotalMapper.getChargingPileUseRate(vins,startDate,endDate);
res.put("chargingPileUseRate", chargingPileUseRate);
//充电次数
res.put("chargingNum",vmsChargingTotalMapper.queryChargingTimes(vins,startDate,endDate));
/* //行驶时长(小时)
SSIResponse operateData = bigScreenService.getOperateData(vins,startDate,endDate);
OperateDataVo operateDataVo = (OperateDataVo) operateData.getData();
BigDecimal travelTime = operateDataVo.getTravelTime();
res.put("travelTime", travelTime);
//行驶里程(公里)
BigDecimal travelMile = operateDataVo.getTravelmile();
res.put("travelMile", travelMile);
//装船箱数
TaskAnalysisVo numVo = vmsTosOrdersMapper.queryContainerNum(vins,startDate,endDate);
res.put("loadContainerNum", numVo.getLoadContainerNum());
//卸船箱数
res.put("unloadContainerNum", numVo.getUnloadContainerNum());
//理货箱数
res.put("handleContainerNum", numVo.getHandleContainerNum());
//平均每箱装船时间
TaskAnalysisVo timeVo = vmsTosOrdersMapper.queryContainerAvgTime(vins,startDate,endDate);
res.put("loadContainerAvgTime", timeVo.getLoadContainerAvgTime());
//平均每箱卸船时间
res.put("unloadContainerAvgTime", timeVo.getUnloadContainerAvgTime());
//平均每箱理货时间
res.put("handleContainerAvgTime", timeVo.getHandleContainerAvgTime());
TaskAnalysisVo orderNum = vmsTosOrdersMapper.queryOrderNum(vins,startDate,endDate);
//装船任务数
res.put("loadOrderNum", orderNum.getLoadContainerNum());
//卸船任务数
res.put("unloadOrderNum", orderNum.getUnloadContainerNum());
//理货任务数
res.put("handleOrderNum", orderNum.getHandleContainerNum());
//总任务数
res.put("totalOrderNum", orderNum.getHandleContainerNum()+ orderNum.getUnloadContainerNum()+orderNum.getLoadContainerNum());
*/
KpiCostTimeVo qryKpi = new KpiCostTimeVo();
qryKpi.setStartTime(startDate);
qryKpi.setEndTime(endDate);
qryKpi.setVins(vins);
VmsKpiAnalysis vmsKpiAnalysis = vmsKpiAnalysisService.staticsSpeciParam(qryKpi);
//总耗电量
res.put("consume_total",Objects.nonNull(vmsKpiAnalysis)?vmsKpiAnalysis.getEnergyConsumption():0);
//行驶时长(小时)
res.put("travelTime",Objects.nonNull(vmsKpiAnalysis)?vmsKpiAnalysis.getWorkTime():0);
//行驶里程(公里)
res.put("travelMile",Objects.nonNull(vmsKpiAnalysis)?vmsKpiAnalysis.getMileage():0);
JSONObject jsonObject = vmsKpiAnalysisService.taskIndexAnalysis(qryKpi);
//总任务数
//装船任务数
//装船箱数(标准)
//装船箱数(自然)
//平均装箱时间
//卸箱任务数
//卸箱箱数(标准)
//卸箱箱数(自然)
//平均卸船时间
//理货任务数
//理货箱数(标准)
//理货箱数(自然)
//平均理货时间
res.putAll(jsonObject);
return SSIResponse.ok(res);
}
/**
* 运输效率趋势图
*/
@Override
public SSIResponse getTaskTrend(Integer timeType) throws Exception {
switch (timeType) {
//日
case 1:
LocalDateTime startTime = LocalDateTime.of(
LocalDateTime.now().minus(1, ChronoUnit.DAYS).toLocalDate(), LocalTime.MIN);
LocalDateTime endTime = LocalDateTime.of(
LocalDateTime.now().minus(1, ChronoUnit.DAYS).toLocalDate(), LocalTime.MAX);
Long startTimeStamp = startTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
List<TaskAnalysisVo> taskTrendByHour = vmsTosOrdersMapper.getTaskTrendByHour(startTime,
endTime, startTimeStamp);
return SSIResponse.ok(TaskAnalysisVo.fillBlankHour(taskTrendByHour, TaskAnalysisVo.class));
//周
case 2:
startTime = LocalDateTime.of(LocalDateTime.now().minus(7, ChronoUnit.DAYS).toLocalDate(),
LocalTime.MIN);
endTime = LocalDateTime.of(LocalDateTime.now().minus(1, ChronoUnit.DAYS).toLocalDate(),
LocalTime.MAX);
List<TaskAnalysisVo> taskTrendByDay = vmsTosOrdersAnalysisMapper.getTaskTrendByDay(
startTime, endTime);
return SSIResponse.ok(
TaskAnalysisVo.fillBlankDay(taskTrendByDay, TaskAnalysisVo.class, startTime, endTime));
//月
case 3:
startTime = LocalDateTime.of(LocalDateTime.now().minus(30, ChronoUnit.DAYS).toLocalDate(),
LocalTime.MIN);
endTime = LocalDateTime.of(LocalDateTime.now().minus(1, ChronoUnit.DAYS).toLocalDate(),
LocalTime.MAX);
taskTrendByDay = vmsTosOrdersAnalysisMapper.getTaskTrendByDay(startTime, endTime);
return SSIResponse.ok(
TaskAnalysisVo.fillBlankDay(taskTrendByDay, TaskAnalysisVo.class, startTime, endTime));
}
return null;
}
/**
* 停车等待时长分析
*/
@Override
public SSIResponse getStopWaitTimeRate(Long startTime) {
Map stopWaitTimeRate = vmsCarryCapacityAnalysisMapper.getStopWaitTimeRate(startTime);
return SSIResponse.ok(stopWaitTimeRate);
}
/**
* 运载力趋势图(空载里程、满载里程)
*/
@Override
public SSIResponse getTaskMileTrend(Integer timeType) throws Exception {
LocalDateTime startTime = null;
LocalDateTime endTime = null;
switch (timeType) {
case 2:
startTime = LocalDateTime.of(LocalDateTime.now().minus(7, ChronoUnit.DAYS).toLocalDate(),
LocalTime.MIN);
endTime = LocalDateTime.of(LocalDateTime.now().minus(1, ChronoUnit.DAYS).toLocalDate(),
LocalTime.MAX);
break;
case 3:
startTime = LocalDateTime.of(LocalDateTime.now().minus(30, ChronoUnit.DAYS).toLocalDate(),
LocalTime.MIN);
endTime = LocalDateTime.of(LocalDateTime.now().minus(1, ChronoUnit.DAYS).toLocalDate(),
LocalTime.MAX);
break;
}
List<TaskMileTrendByDayVo> taskMileTrendByDay = vmsCarryCapacityAnalysisMapper.getTaskMileTrendByDay(
startTime, endTime);
return SSIResponse.ok(
TaskMileTrendByDayVo.fillBlankDay(taskMileTrendByDay, TaskMileTrendByDayVo.class, startTime,
endTime));
}
/**
* 充电桩利用率、充电时长趋势图
*/
@Override
public SSIResponse getChargingPileUseTrend(Integer timeType) throws Exception {
switch (timeType) {
case 1:
LocalDateTime startTime = LocalDateTime.of(
LocalDateTime.now().minus(1, ChronoUnit.DAYS).toLocalDate(), LocalTime.MIN);
LocalDateTime endTime = LocalDateTime.of(
LocalDateTime.now().minus(1, ChronoUnit.DAYS).toLocalDate(), LocalTime.MAX);
List<VmsChargingTotal> startList = vmsChargingTotalMapper.selectList(
new LambdaQueryWrapper<VmsChargingTotal>()
.or(vmsChargingTotalLambdaQueryWrapper -> {
vmsChargingTotalLambdaQueryWrapper.gt(VmsChargingTotal::getStartTime,
startTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli())
.lt(VmsChargingTotal::getStartTime,
endTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
})
.or(vmsChargingTotalLambdaQueryWrapper -> {
vmsChargingTotalLambdaQueryWrapper.gt(VmsChargingTotal::getEndTime,
startTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli())
.lt(VmsChargingTotal::getEndTime,
endTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
})
);
ChargeDailyTimeUtil chargeDailyTimeUtil = new ChargeDailyTimeUtil(
Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()));
startList.stream().forEach(vmsChargingTotal -> {
Long startTime1 = vmsChargingTotal.getStartTime();
Long endTime1 = vmsChargingTotal.getEndTime();
chargeDailyTimeUtil.add(startTime1, endTime1,
vmsChargingTotal.getChargingEnergy().doubleValue());
});
chargeDailyTimeUtil.finish(2);
return SSIResponse.ok(chargeDailyTimeUtil.getDailyTimeBeanList());
case 2:
startTime = LocalDateTime.of(LocalDateTime.now().minus(7, ChronoUnit.DAYS).toLocalDate(),
LocalTime.MIN);
endTime = LocalDateTime.of(LocalDateTime.now().minus(1, ChronoUnit.DAYS).toLocalDate(),
LocalTime.MAX);
List<ChargingPileUseRateTrendByDayVo> chargingPileUseRateTrendByDay = vmsChargingTotalMapper.getChargingPileUseRateTrendByDay(
startTime, endTime);
return SSIResponse.ok(
ChargingPileUseRateTrendByDayVo.fillBlankDay(chargingPileUseRateTrendByDay,
ChargingPileUseRateTrendByDayVo.class, startTime, endTime));
case 3:
startTime = LocalDateTime.of(LocalDateTime.now().minus(30, ChronoUnit.DAYS).toLocalDate(),
LocalTime.MIN);
endTime = LocalDateTime.of(LocalDateTime.now().minus(1, ChronoUnit.DAYS).toLocalDate(),
LocalTime.MAX);
chargingPileUseRateTrendByDay = vmsChargingTotalMapper.getChargingPileUseRateTrendByDay(
startTime, endTime);
return SSIResponse.ok(
ChargingPileUseRateTrendByDayVo.fillBlankDay(chargingPileUseRateTrendByDay,
ChargingPileUseRateTrendByDayVo.class, startTime, endTime));
}
return SSIResponse.ok();
}
/**
* 平均一周充电频次分析
*/
@Override
public SSIResponse getChargingFrequencyByVehicle() {
List<Map> chargingFrequencyByVehicle = vmsChargingTotalMapper.getChargingFrequencyByVehicle();
return SSIResponse.ok(chargingFrequencyByVehicle);
}
/**
* 平均一周充电频次平均值
*/
@Override
public SSIResponse getOverallChargingFrequency() {
double overallChargingFrequency = vmsChargingTotalMapper.getOverallChargingFrequency();
return SSIResponse.ok(overallChargingFrequency);
}
/**
* 车辆使用率/里程/时长/能耗分析
*/
@Override
public SSIResponse getUseInfoByVehicle() {
List<UseInfoByVehicleVo> useInfoByVehicle = vmsCarryCapacityAnalysisMapper.getUseInfoByVehicle();
double useRateTotal = 0;
for (UseInfoByVehicleVo vehicleVo : useInfoByVehicle) {
useRateTotal += vehicleVo.getUseRate();
}
double useRateLeft = 0;
for (UseInfoByVehicleVo vehicleVo : useInfoByVehicle) {
vehicleVo.setUseRate(new BigDecimal(vehicleVo.getUseRate() / useRateTotal)
.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
useRateLeft += vehicleVo.getUseRate();
}
if (useInfoByVehicle.size()>0){//判断对象不为空
useInfoByVehicle.get(0).setUseRate(useInfoByVehicle.get(0).getUseRate() - (useRateLeft - 1));
}
return SSIResponse.ok(useInfoByVehicle);
}
@Override
public SSIResponse getVehicleTaskOrder(VehicleTaskOrderReq req) {
Date startDate;
Date endDate;
if(Objects.nonNull(req.getStartDate())&&Objects.nonNull(req.getEndDate())){
startDate = req.getStartDate();
endDate = req.getEndDate();
if(startDate.compareTo(endDate)==0){
startDate.setHours(0);
endDate.setHours(23);
}
}else {
startDate = new Date();
startDate.setHours(1);
endDate = new Date();
}
Date indexDate = startDate;
List<AnalyseTaskOrderResp> result = new ArrayList<>();
do{
AnalyseTaskOrderResp analyseTaskOrderResp = new AnalyseTaskOrderResp();
String dateStr = "";
Integer flag = 0;
if(startDate.getDay()!=endDate.getDay()){
dateStr = DateUtils.format(indexDate, DateUtils.DATE_PATTERN);
analyseTaskOrderResp.setDate(DateUtils.format(indexDate, "MM.dd"));
}else {
flag = 1;
dateStr = DateUtils.format(indexDate, "yyyyMMddHH");
analyseTaskOrderResp.setHour(indexDate.getHours());
}
analyseTaskOrderResp.setDateStr(dateStr);
result.add(analyseTaskOrderResp);
//获取任务总数
analyseTaskOrderResp.setTotalTask(calculateTotalList(req.getTotalType(),dateStr,req.getVins(),flag));
//装船任务数据
analyseTaskOrderResp.setLoadTask(calculateLoadList(req.getLoadType(),dateStr,req.getVins(),flag));
//卸船任务数据
analyseTaskOrderResp.setUnloadTask(calculateUnloadList(req.getUnloadType(),dateStr,req.getVins(),flag));
//搬移任务数据
analyseTaskOrderResp.setMoveTask(calculateMoveList(req.getMoveType(),dateStr,req.getVins(),flag));
//指令数据
analyseTaskOrderResp.setTotalOrder(calculateOrderList(req.getOrderType(),dateStr,req.getVins(),flag));
//修改时间戳
if(startDate.getDay()==endDate.getDay()){
indexDate = org.apache.commons.lang3.time.DateUtils.addHours(indexDate, 1);
}else {
indexDate = org.apache.commons.lang3.time.DateUtils.addDays(indexDate, 1);
}
}while (indexDate.compareTo(endDate)<=0);
return SSIResponse.ok(result);
}
private Integer calculateOrderList(Integer orderType, String indexDate, List<String> vin,Integer flag) {
Integer result = 0;
orderType = Objects.isNull(orderType) ? 0 : orderType;
switch (orderType){
case 1:
result = vmsTosOrdersMapper.queryOrdersByDate(vin,indexDate,1,flag);
break;
case 2:
result = vmsTosOrdersMapper.queryOrdersByDate(vin,indexDate,2,flag);
break;
case 3:
result = vmsTosOrdersMapper.queryOrdersByDate(vin,indexDate,3,flag);
break;
case 4:
result = vmsTosOrdersMapper.queryOrdersByDate(vin,indexDate,4,flag);
break;
default:
result = vmsTosOrdersMapper.queryOrdersByDate(vin,indexDate,1,flag);
break;
}
return result;
}
private Integer calculateMoveList(Integer moveType, String indexDate, List<String> vin, Integer flag) {
Integer result = 0;
moveType = Objects.isNull(moveType) ? 0 : moveType;
switch (moveType){
case 1:
result = vmsTosOrdersMapper.queryOrderNumByDate(vin,indexDate,4,flag);
break;
case 2:
result = vmsTosOrdersMapper.queryTosOrderByDate(vin,indexDate,4,flag);
break;
case 3:
result = vmsTosOrdersMapper.staticsAppCaveOrdersByDate(vin, indexDate, 4,flag);
break;
case 4:
result = vmsTosOrdersMapper.staticsContainerNumsByDate(vin, indexDate,4,flag);
break;
default:
result = vmsTosOrdersMapper.queryOrderNumByDate(vin,indexDate,4,flag);
break;
}
return result;
}
private Integer calculateUnloadList(Integer unloadType, String indexDate, List<String> vin, Integer flag) {
Integer result = 0;
unloadType = Objects.isNull(unloadType) ? 0 : unloadType;
switch (unloadType){
case 1:
result = vmsTosOrdersMapper.queryOrderNumByDate(vin,indexDate,3,flag);
break;
case 2:
result = vmsTosOrdersMapper.queryTosOrderByDate(vin,indexDate,3,flag);
break;
case 3:
result = vmsTosOrdersMapper.staticsAppCaveOrdersByDate(vin, indexDate, 3,flag);
break;
case 4:
result = vmsTosOrdersMapper.staticsContainerNumsByDate(vin, indexDate,3,flag);
break;
default:
result = vmsTosOrdersMapper.queryOrderNumByDate(vin,indexDate,3,flag);
break;
}
return result;
}
private Integer calculateLoadList(Integer loadType,String indexDate, List<String> vin, Integer flag) {
Integer result = 0;
loadType = Objects.isNull(loadType) ? 0 : loadType;
switch (loadType){
case 1:
result = vmsTosOrdersMapper.queryOrderNumByDate(vin,indexDate,2,flag);
break;
case 2:
result = vmsTosOrdersMapper.queryTosOrderByDate(vin,indexDate,2,flag);
break;
case 3:
result = vmsTosOrdersMapper.staticsAppCaveOrdersByDate(vin, indexDate, 2,flag);
break;
case 4:
result = vmsTosOrdersMapper.staticsContainerNumsByDate(vin, indexDate,2,flag);
break;
default:
result = vmsTosOrdersMapper.queryOrderNumByDate(vin,indexDate,2,flag);
break;
}
return result;
}
private Integer calculateTotalList(Integer totalType, String indexDate, List<String> vin, Integer flag) {
Integer result = 0;
totalType = Objects.isNull(totalType) ? 0 : totalType;
switch (totalType){
case 1:
result = vmsTosOrdersMapper.queryOrderNumByDate(vin,indexDate,1,flag);
break;
case 2:
result = vmsTosOrdersMapper.queryTosOrderByDate(vin,indexDate,1,flag);
break;
case 3:
result = vmsTosOrdersMapper.staticsAppCaveOrdersByDate(vin, indexDate, 1,flag);
break;
case 4:
result = vmsTosOrdersMapper.staticsContainerNumsByDate(vin, indexDate,1,flag);
break;
default:
result = vmsTosOrdersMapper.queryOrderNumByDate(vin,indexDate,1,flag);
break;
}
return result;
}
}
package com.ssi.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ssi.entity.V2xEvent;
import com.ssi.mapper.V2xEventMapper;
import com.ssi.service.V2xEventService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 车路协调
*/
@Service("V2xEventService")
@Slf4j
public class V2xEventServiceImpl extends ServiceImpl<V2xEventMapper, V2xEvent> implements V2xEventService {
@Autowired
private V2xEventMapper v2xEventMapper;
@Override
public List<V2xEvent> selectHistory() {
return v2xEventMapper.selectHistory();
}
}
package com.ssi.service.impl;
import cn.afterturn.easypoi.handler.impl.ExcelDataHandlerDefaultImpl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ssi.entity.vo.VehicleCommandVo;
import com.ssi.mapper.VehicleCommandMapper;
import com.ssi.model.VehicleElasticSearchModel;
import com.ssi.service.VehicleCommandService;
import com.ssi.utils.PoiUtils;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.client.transport.TransportClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 无人集卡作业明细
* @author yinjiangqiao
* @version 1.0
* @date 2022/7/4 9:51
*/
@Service("VehicleCommandService")
@DS("oracle")
public class VehicleCommandServiceImpl implements VehicleCommandService {
@Autowired
private VehicleCommandMapper vehicleCommandMapper;
@Autowired
protected TransportClient transportClient;
@Autowired
private VehicleElasticSearchModel vehicleElasticSearchModel;
@Override
public IPage<VehicleCommandVo> vehicleTypeCommandList(String queryStartTime,String queryEndTime,String truckNo,Integer pageNum,Integer pageSize) {
Map params = new HashMap();
params.put("queryStartTime", queryStartTime);
params.put("queryEndTime", queryEndTime);
params.put("truckNo", truckNo);
IPage<VehicleCommandVo> page = new Page<>(pageNum, pageSize);
page = vehicleCommandMapper.vehicleTypeCommandList(page,params);
// List<VehicleCommandVo> list = new ArrayList<>();
// VehicleCommandVo vehicleCommandVo = new VehicleCommandVo();
// vehicleCommandVo.setArriveTime("");
// vehicleCommandVo.setCntr("NAKU5187743");
// vehicleCommandVo.setCntrSizCod("40");
// vehicleCommandVo.setCyWorkTime("");
// vehicleCommandVo.setQueueType("卸船");
// vehicleCommandVo.setShipName("A ASO");
// vehicleCommandVo.setShipNo("42707");
// vehicleCommandVo.setShipWorkTime("2022-07-13 10:55:02");
// vehicleCommandVo.setTruckNo("911");
// vehicleCommandVo.setVoyage("voyage");
// vehicleCommandVo.setTaskNo("AE221706DE843714E0540017A4771C09");
// list.add(vehicleCommandVo);
// page.setRecords(list);
// String year = DateUtils.format(new Date(), "yyyy");
// page.getRecords().stream().forEach(vehicleCommand -> {
// String taskNo = vehicleCommand.getTaskNo();
// List<TaskStatusHistory> lists = vehicleElasticSearchModel.searchTaskHistory(taskNo, year);
// if(lists.size()==0){
// return;
// }
// for(TaskStatusHistory askStatusHistory:lists){
// if(askStatusHistory.getStatus()==42){
// vehicleCommand.setTosTime(DateUtils.format(new Date(askStatusHistory.getCollectTime()), "yyyy-MM-dd yyyy-MM-dd HH:mm:ss"));
// }
// }
// });
return page;
}
@Override
public List<VehicleCommandVo> exportCommandList(String queryStartTime, String queryEndTime, String truckNo, Integer pageNum, Integer pageSize) {
Map params = new HashMap();
params.put("queryStartTime", queryStartTime);
params.put("queryEndTime", queryEndTime);
params.put("truckNo", truckNo);
params.put("pageSize",pageSize);
params.put("pageNum",pageNum);
return vehicleCommandMapper.exportCommandList(params);
}
@Override
public void export(String queryStartTime, String queryEndTime, String truckNo, Integer pageIndex, Integer pageSize, String exportType, HttpServletResponse response) {
if(StringUtils.equals(exportType,"1")){
pageSize = 100000;
}
List<VehicleCommandVo> list = exportCommandList(queryStartTime,queryEndTime,truckNo,pageIndex,pageSize);
ExcelDataHandlerDefaultImpl<Object> excelDataHandler = new ExcelDataHandlerDefaultImpl<Object>() {
@Override
public String[] getNeedHandlerFields() {
return new String[]{"航次","车号","船号","作业类型","尺码","箱位置","箱号","收到TOS指令时间","单车到桥下时间","桥边确认","堆场确认","作业时长"};
}
@Override
public Object exportHandler(Object obj, String name, Object value) {
if ("航次".equals(name)) {
VehicleCommandVo order = (VehicleCommandVo) obj;
return order.getVoyage();
}
if ("车号".equals(name)) {
VehicleCommandVo order = (VehicleCommandVo) obj;
return order.getTruckNo();
}
if ("船号".equals(name)) {
VehicleCommandVo order = (VehicleCommandVo) obj;
return order.getShipNo();
}
if ("作业类型".equals(name)) {
VehicleCommandVo order = (VehicleCommandVo) obj;
return order.getQueueType();
}
if ("尺码".equals(name)) {
VehicleCommandVo order = (VehicleCommandVo) obj;
return order.getCntrSizCod();
}
if ("箱位置".equals(name)) {
VehicleCommandVo order = (VehicleCommandVo) obj;
return order.getTruckPosition();
}
if ("箱号".equals(name)) {
VehicleCommandVo order = (VehicleCommandVo) obj;
return order.getCntr();
}
if ("收到TOS指令时间".equals(name)) {
VehicleCommandVo order = (VehicleCommandVo) obj;
return order.getTosTime();
}
if ("单车到桥下时间".equals(name)) {
VehicleCommandVo order = (VehicleCommandVo) obj;
return order.getArriveTime();
}
if ("桥边确认".equals(name)) {
VehicleCommandVo order = (VehicleCommandVo) obj;
return order.getShipWorkTime();
}
if ("堆场确认".equals(name)) {
VehicleCommandVo order = (VehicleCommandVo) obj;
return order.getCyWorkTime();
}
if ("作业时长".equals(name)) {
VehicleCommandVo order = (VehicleCommandVo) obj;
return order.getTime();
}
return super.exportHandler(obj, name, value);
}
};
PoiUtils.exportExcel(excelDataHandler, list, "无人集卡明细清单", "无人集卡明细清单", VehicleCommandVo.class, "无人集卡明细清单" + ".xls", true, response);
}
}
package com.ssi.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ssi.entity.VmsVehicleEmergencyStop;
import com.ssi.entity.vo.VmsVehicleEmergencyVo;
import com.ssi.mapper.VehicleEmergencyMapper;
import com.ssi.mapper.VmsVehicleMapper;
import com.ssi.model.RedisDataModel;
import com.ssi.response.AccessResponse;
import com.ssi.response.SSIPage;
import com.ssi.response.SSIResponse;
import com.ssi.service.VehicleEmergencyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 故障历史服务实现类
*/
@Service("vehicleEmergencyService")
@Slf4j
public class VehicleEmergencyServiceImpl extends ServiceImpl<VehicleEmergencyMapper, VmsVehicleEmergencyStop> implements VehicleEmergencyService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private VmsVehicleMapper vmsVehicleMapper;
@Autowired
private RedisDataModel redisDataModel;
@Value("${harbor.remote.emergencyParking}")
private String emergencyParkingKeyPrefix;
@Value("${command-url}")
private String commandUrl;
/**
* 故障列表分页
*/
@Override
public SSIPage queryPage(Map<String, Object> params) {
Integer pageSize = params.get("pageSize") == null ? 0 : (Integer) params.get("pageSize");
Integer pageIndex = params.get("pageIndex") == null ? 10 : (Integer) params.get("pageIndex");
Long startTime = (Long) params.get("startTime");
Long stopTime = (Long) params.get("stopTime");
Date startDate = startTime == null ? null : new Date(startTime);
Date stopDate = stopTime == null ? null : new Date(stopTime);
params.put("startTime",startDate);
params.put("stopTime",stopDate);
IPage<VmsVehicleEmergencyVo> page = new Page<>(pageIndex, pageSize);
page = this.getBaseMapper().getEmergencyRecordList(page,params);
return new SSIPage(page);
}
/**
* 紧急停车
* @param vin 车辆vin
* @param emergencyType 紧停类型
*/
@Override
public SSIResponse emergency(String vin, Integer emergencyType) {
// preCheck
log.info(String.format("调用紧停接口,vin:%s,emergencyType:%s", vin, emergencyType));
Map<String, Object> emergencyMap = redisDataModel.getJson2Map(emergencyParkingKeyPrefix + ":" + vin);
if (emergencyMap != null) {
Integer emergencyStatus = (Integer) emergencyMap.get("emergencyStatus");
if (emergencyStatus == 1 && emergencyType == 1) {
return SSIResponse.no("车辆已处于非紧停状态中");
}
if (emergencyStatus == 2 && emergencyType == 2) {
return SSIResponse.no("车辆已处于紧停状态中");
}
}
// execute
String url = commandUrl + "/remote/app/emergency";
Map param = new HashMap();
param.put("vin", vin);
//遥控类型 1-紧急停车;2-取消紧停
param.put("emergencyType", emergencyType);
AccessResponse accessResponse = restTemplate.postForObject(url, param, AccessResponse.class);
if (accessResponse.isSuccess()) {
log.info(String.format("调用紧停接口成功,vin:%s,emergencyType:%s", vin, emergencyType));
return SSIResponse.ok();
} else {
String msg = accessResponse.getStatus().getDetails();
log.info(String.format("调用紧停接口失败,vin:%s,emergencyType:%s,msg:%s", vin, emergencyType, msg));
return SSIResponse.no(msg);
}
}
}
package com.ssi.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ssi.entity.VmsVehicleEmergencyStop;
import com.ssi.entity.VmsVehicleRemoteInstruction;
import com.ssi.entity.vo.VmsVehicleEmergencyVo;
import com.ssi.entity.vo.VmsVehicleRemoteInstructionVo;
import com.ssi.mapper.VehicleEmergencyMapper;
import com.ssi.mapper.VehicleRemoteInstructionMapper;
import com.ssi.mapper.VmsVehicleMapper;
import com.ssi.model.RedisDataModel;
import com.ssi.response.AccessResponse;
import com.ssi.response.SSIPage;
import com.ssi.response.SSIResponse;
import com.ssi.service.VehicleEmergencyService;
import com.ssi.service.VehicleRemoteInstructionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 故障历史服务实现类
*/
@Service("VehicleRemoteInstructionService")
@Slf4j
public class VehicleRemoteInstructionServiceImpl extends ServiceImpl<VehicleRemoteInstructionMapper, VmsVehicleRemoteInstruction> implements VehicleRemoteInstructionService {
/**
* 故障列表分页
*/
@Override
public SSIPage queryPage(Map<String, Object> params) {
Integer pageSize = params.get("pageSize") == null ? 0 : (Integer) params.get("pageSize");
Integer pageIndex = params.get("pageIndex") == null ? 10 : (Integer) params.get("pageIndex");
Long startTime = (Long) params.get("startTime");
Long stopTime = (Long) params.get("stopTime");
Date startDate = startTime == null ? null : new Date(startTime);
Date stopDate = stopTime == null ? null : new Date(stopTime);
params.put("startTime",startDate);
params.put("stopTime",stopDate);
IPage<VmsVehicleRemoteInstructionVo> page = new Page<>(pageIndex, pageSize);
page = this.getBaseMapper().getRemoteInstructionList(page,params);
return new SSIPage(page);
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment