فهرست منبع

feat:行车日志

wangweiyu 4 سال پیش
والد
کامیت
d18e3871ac

+ 85 - 0
src/main/java/com/aoyang/tms/common/WorkLogTypeEnum.java

@@ -0,0 +1,85 @@
+package com.aoyang.tms.common;
+
+/**
+ * @Description: 作业状态枚举类
+ * @Author guoyong
+ * @Date 2022/4/20 17:05
+ * @Version 1.0
+ */
+public enum WorkLogTypeEnum {
+
+    /**
+     * 执行 装车运单, 开始 出车前检查
+     */
+    START(1, "执行 装车运单, 开始\"出车前检查\""),
+
+    ENGIN_ON(2, "车辆启动"),
+
+    FINISH_PRE_CHECK(10, "完成\"出车前检查\",开始\"出车作业\""),
+
+
+    LOAD_POINT_ARRIVED(20, "到达装车点,开始\"装车等待\""),
+
+    LOAD_START(21, "开始\"装车\""),
+
+    LOAD_END(22, "结束\"装车\""),
+
+    ENTER_LOAD_SPOT(28, "车辆进入\"装车点围栏\""),
+
+    LEAVE_LOAD_SPOT(29, "车辆离开\"装车点围栏\""),
+
+    LOAD_COMPLETE(30, "完成 装车运单"),
+
+
+    UNLOAD_POINT_EXECUTE(40, "执行 卸车运单, 前往卸车点"),
+
+    UNLOAD_POINT_ARRIVED(50, "到达卸车点,开始\"卸车等待\""),
+
+    UNLOAD_START(51, "开始\"卸车\""),
+
+    UNLOAD_END(52, "结束\"卸车\""),
+
+    ENTER_UNLOAD_SPOT(58, "车辆进入\"卸车点围栏\""),
+
+    LEAVE_UNLOAD_SPOT(59, "车辆离开\"卸车点围栏\""),
+
+    UNLOAD_COMPLETE(30, "完成 卸车运单"),
+
+
+    RETURN_POINT_ARRIVED(80, "到达 收车点,开始\"收车后检查\""),
+
+    CLOSED(90, "完成\"收车后检查\",行车结束"),
+
+
+    REPAIR_START(60, "开始\"途中维修\""),
+
+    REPAIR_END(61, "结束\"途中维修\""),
+
+    REST_START(62, "开始\"途中休息\""),
+
+    REST_END(63, "结束\"途中休息\""),
+
+    ;
+
+
+    public Integer type;
+    public String workLogTitle;
+
+    WorkLogTypeEnum(Integer type, String workLogTitle) {
+        this.type = type;
+        this.workLogTitle = workLogTitle;
+    }
+
+    public static String getWorkLogTitle(Integer type) {
+        if (type == null) {
+            return "";
+        }
+        WorkLogTypeEnum[] workLogTypeEnums = values();
+        for (WorkLogTypeEnum typenum : workLogTypeEnums) {
+            if (typenum.type.equals(type)) {
+                return typenum.workLogTitle;
+            }
+        }
+        return null;
+    }
+}

+ 161 - 140
src/main/java/com/aoyang/tms/job/SpotCheckJob.java

@@ -1,143 +1,164 @@
-//package com.aoyang.tms.job;
-//
-//import com.aoyang.tms.entity.*;
-//import com.aoyang.tms.feign.result.TmsMongoDoc;
-//import com.aoyang.tms.service.*;
-//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-//import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-//import com.xxl.job.core.biz.model.ReturnT;
-//import com.xxl.job.core.handler.annotation.XxlJob;
-//import com.xxl.job.core.log.XxlJobLogger;
-//import lombok.extern.slf4j.Slf4j;
-//import org.springframework.data.domain.Sort;
-//import org.springframework.data.geo.*;
-//import org.springframework.data.mongodb.core.MongoTemplate;
-//import org.springframework.data.mongodb.core.query.Criteria;
-//import org.springframework.data.mongodb.core.query.NearQuery;
-//import org.springframework.data.mongodb.core.query.Query;
-//import org.springframework.stereotype.Component;
-//
-//import javax.annotation.Resource;
-//import java.time.LocalDateTime;
-//import java.util.List;
-//
-///**
-// * @Description: 围栏位置自动检查定时任务
-// * @version: v1.0.0
-// * @date: 2021-06-10 13:35:44
-// */
-//@Slf4j
-//@Component
-//public class SpotCheckJob {
-//
-//    @Resource
-//    private WorkCycleService workCycleService;
-//    @Resource
-//    private WorkOrderService workOrderService;
-//    @Resource
-//    private TruckService truckService;
-//    @Resource
-//    private WorkSpotService workSpotService;
-//    @Resource
-//    private TruckSimCardService truckSimCardService;
-//    @Resource
-//    private MongoTemplate mongoTemplate;
-//    @Resource
-//    private CommonService commonService;
-//
-//    /**
-//     * 围栏位置自动检查定时任务
-//     */
-//    @XxlJob("spotCheckHandler")
-//    public ReturnT<String> SpotCheckHandler(String param) throws Exception {
-//        log.info("围栏位置信息检查 SpotCheckJob. {}", param);
-//        // TODO 物流客户
-//        Long orgId = null;
-//        long startTime = System.currentTimeMillis();
-//        XxlJobLogger.log("spotCheckHandler is start ");
-//        List<Truck> truckList = truckService.list(new QueryWrapper<Truck>().eq("org_id", orgId).eq("status", 0));
-//        for (Truck truck : truckList) {
-//            try {
-//                Long truckId = truck.getTruckId();
-//                TruckSimCard truckSimCard = truckSimCardService.getOne(new QueryWrapper<TruckSimCard>().eq("truck_id", truckId));
-//                if (truckSimCard == null) {
-//                    log.info("车辆{} 不存在simcard信息.", truck.getCarNumber());
-//                    continue;
-//                }
-//                QueryWrapper<WorkCycle> queryWrapper = new QueryWrapper<>();
-//                queryWrapper.eq("truck_id", truckId);
-//                queryWrapper.eq("status", 1);
-//                WorkCycle workCycle = workCycleService.getOne(queryWrapper);
-//                if (workCycle == null) {
-//                    continue;
-//                }
-//                List<WorkOrder> workOrders = workOrderService.list(new QueryWrapper<WorkOrder>().eq("cycle_id", workCycle.getId()));
-//                for (WorkOrder workOrder : workOrders) {
-//                    if (workOrder.getLeaveTime() != null) {
-//                        // 已离开围栏
-//                        continue;
-//                    }
-//                    LocalDateTime workStartTime = workOrder.getWorkStartTime();
-//                    WorkSpot spot = workSpotService.getById(workOrder.getSpotId());
+package com.aoyang.tms.job;
+
+import com.aoyang.tms.common.WorkLogTypeEnum;
+import com.aoyang.tms.entity.*;
+import com.aoyang.tms.feign.result.TmsMongoDoc;
+import com.aoyang.tms.service.*;
+import com.aoyang.tms.util.RegionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.xxl.job.core.log.XxlJobLogger;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.geo.*;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.NearQuery;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @Description: 围栏位置自动检查定时任务
+ * @version: v1.0.0
+ * @date: 2021-06-10 13:35:44
+ */
+@Slf4j
+@Component
+public class SpotCheckJob {
+
+    @Resource
+    private WorkCycleService workCycleService;
+    @Resource
+    private WorkOrderService workOrderService;
+    @Resource
+    private TruckService truckService;
+    @Resource
+    private WorkSpotService workSpotService;
+    @Resource
+    private TruckSimCardService truckSimCardService;
+    @Resource
+    private WorkLogService workLogService;
+    @Resource
+    private MongoTemplate mongoTemplate;
+    @Resource
+    private CommonService commonService;
+
+    /**
+     * 围栏位置自动检查定时任务
+     */
+    @XxlJob("spotCheckHandler")
+    public ReturnT<String> SpotCheckHandler(String param) throws Exception {
+        log.info("围栏位置信息检查 SpotCheckJob. {}", param);
+        // TODO 物流客户
+        Long orgId = null;
+        long startTime = System.currentTimeMillis();
+        XxlJobLogger.log("spotCheckHandler is start ");
+        List<Truck> truckList = truckService.list(new QueryWrapper<Truck>().eq("org_id", orgId).eq("status", 0));
+        for (Truck truck : truckList) {
+            try {
+                Long truckId = truck.getTruckId();
+                TruckSimCard truckSimCard = truckSimCardService.getOne(new QueryWrapper<TruckSimCard>().eq("truck_id", truckId));
+                if (truckSimCard == null) {
+                    log.info("车辆{} 不存在simcard信息.", truck.getCarNumber());
+                    continue;
+                }
+                QueryWrapper<WorkCycle> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("truck_id", truckId);
+                queryWrapper.eq("status", 1);
+                WorkCycle workCycle = workCycleService.getOne(queryWrapper);
+                if (workCycle == null) {
+                    continue;
+                }
+                List<WorkOrder> workOrders = workOrderService.list(new QueryWrapper<WorkOrder>().eq("cycle_id", workCycle.getId()));
+                for (WorkOrder workOrder : workOrders) {
+                    if (workOrder.getLeaveTime() != null) {
+                        // 已离开围栏
+                        continue;
+                    }
+                    LocalDateTime workStartTime = workOrder.getExecuteTime();
+                    WorkSpot spot = workSpotService.getById(workOrder.getSpotId());
 //                    String latitude = spot.getLatitude();
 //                    String longitude = spot.getLongitude();
 //                    Point point = new Point(Double.valueOf(longitude), Double.valueOf(latitude));
-//                    if (workOrder.getEnterTime() == null) {
-//                        // 未进入围栏
-//                        Criteria criteria = Criteria.where("clientId").is(truckSimCard.getClientId());
-//                        criteria.andOperator(Criteria.where("createTime").gt(workStartTime));
-//                        Query query = new Query(criteria);
-//                        query.with(new Sort(Sort.Direction.ASC, "dateTime"));
-//                        NearQuery nearQuery = NearQuery.near(point).query(query)
-//                                .maxDistance(new Distance(spot.getValidDistance(), Metrics.KILOMETERS))
-//                                .num(1);
-//                        GeoResults<TmsMongoDoc> geoResults = mongoTemplate.geoNear(nearQuery, TmsMongoDoc.class);
-//                        if (geoResults == null) {
-//                            continue;
-//                        }
-//                        List<GeoResult<TmsMongoDoc>> content = geoResults.getContent();
-//                        if (content == null || content.size() == 0) {
-//                            continue;
-//                        }
-//                        TmsMongoDoc loc = content.get(0).getContent();
-//                        // 设置WorkOrder出入围栏标识
-//                        workOrder.setEnterTime(loc.getCreateTime());
-//                        workOrderService.updateById(workOrder);
-//                        // TODO 记录行车日志
-//
-//                    } else if (workOrder.getLeaveTime() == null) {
-//                        // 已进入围栏 无进入围栏标识,则无需判断离开围栏
-//                        Query query = new Query(Criteria.where("clientId").is(truckSimCard.getClientId()));
-//                        query.with(new Sort(Sort.Direction.DESC, "dateTime"));
-//                        query.limit(10);
-//                        NearQuery nearQuery = NearQuery.near(point).query(query).num(1)
-//                                .maxDistance(new Distance(spot.getValidDistance(), Metrics.KILOMETERS));
-//                        GeoResults<TmsMongoDoc> geoResults = mongoTemplate.geoNear(nearQuery, TmsMongoDoc.class);
-//                        if (geoResults == null || geoResults.getContent() == null || geoResults.getContent().size() == 0) {
-//                            // 设置WorkOrder出入围栏标识
-//                            workOrder.setEnterTime(LocalDateTime.now());
-//                            workOrderService.updateById(workOrder);
-//                            // TODO 记录行车日志
-//
-//                        }
-//                    }
-//
-//                }
-//            } catch (Exception e) {
-//                log.error("围栏位置自动检查定时任务异常 truck:{} msg:{}", truck.getCarNumber(), e);
-//                throw e;
-//            }
-//        }
-//        workCycleService.list();
-//        long endTime = System.currentTimeMillis();
-//        XxlJobLogger.log("spotCheckHandler finish. cost:{} sec", (endTime - startTime)/1000);
-//        log.info("围栏位置信息检查 SpotCheckJob completed. cost:{} sec", (endTime - startTime)/1000);
-//        return ReturnT.SUCCESS;
-//    }
-//
-//    private TmsMongoDoc getGeoNear() {
-//        return null;
-//    }
-//
-//}
+                    String regionDatas = spot.getRegionData();
+                    String[] dataList = regionDatas.split(";");
+                    Double[] lon = new Double[dataList.length];
+                    Double[] lat = new Double[dataList.length];
+                    for (int i=0;i<dataList.length;i++) {
+                        String data = dataList[i];
+                        String[] split = data.split(",");
+                        lon[i] = Double.valueOf(split[0]);
+                        lat[i] = Double.valueOf(split[1]);
+                    }
+                    if (workOrder.getEnterTime() == null) {
+                        // 未进入围栏
+                        Criteria criteria = Criteria.where("clientId").is(truckSimCard.getClientId());
+                        criteria.andOperator(Criteria.where("createTime").gt(workStartTime));
+                        Query query = new Query(criteria);
+                        List<TmsMongoDoc> tmsMongoDocs = mongoTemplate.find(query, TmsMongoDoc.class);
+                        if (tmsMongoDocs == null || tmsMongoDocs.size() < 1) {
+                            continue;
+                        }
+                        for (TmsMongoDoc doc : tmsMongoDocs) {
+                            boolean flag =  RegionUtil.isInPolygon(Double.valueOf(doc.getLongitude()),
+                                    Double.valueOf(doc.getLatitude()), lon, lat);
+                            if (flag) {
+                                // 设置WorkOrder出入围栏标识
+                                workOrder.setEnterTime(doc.getCreateTime());
+                                workOrderService.updateById(workOrder);
+                                // 记录行车日志
+                                workLogService.logWorkCycleInfo(workOrder.getType() == 1?
+                                        WorkLogTypeEnum.ENTER_LOAD_SPOT : WorkLogTypeEnum.ENTER_UNLOAD_SPOT, workOrder);
+                                break;
+                            }
+                        }
+
+                    } else if (workOrder.getLeaveTime() == null) {
+                        // 已进入围栏 无进入围栏标识,则无需判断离开围栏
+                        Criteria criteria = Criteria.where("clientId").is(truckSimCard.getClientId());
+                        criteria.andOperator(Criteria.where("createTime").gt(workOrder.getEnterTime()));
+                        Query query = new Query(criteria);
+                        List<TmsMongoDoc> tmsMongoDocs = mongoTemplate.find(query, TmsMongoDoc.class);
+                        if (tmsMongoDocs == null || tmsMongoDocs.size() < 1) {
+                            continue;
+                        }
+                        for (TmsMongoDoc doc : tmsMongoDocs) {
+                            boolean flag =  RegionUtil.isInPolygon(Double.valueOf(doc.getLongitude()),
+                                    Double.valueOf(doc.getLatitude()), lon, lat);
+                            if (flag) {
+                                // 设置WorkOrder出入围栏标识
+                                workOrder.setLeaveTime(doc.getCreateTime());
+                                workOrderService.updateById(workOrder);
+                                // 记录行车日志
+                                workLogService.logWorkCycleInfo(workOrder.getType() == 1?
+                                        WorkLogTypeEnum.ENTER_LOAD_SPOT : WorkLogTypeEnum.ENTER_UNLOAD_SPOT, workOrder);
+                                break;
+                            }
+                        }
+                    }
+
+                }
+            } catch (Exception e) {
+                log.error("围栏位置自动检查定时任务异常 truck:{} msg:{}", truck.getCarNumber(), e);
+                throw e;
+            }
+        }
+        workCycleService.list();
+        long endTime = System.currentTimeMillis();
+        XxlJobLogger.log("spotCheckHandler finish. cost:{} sec", (endTime - startTime)/1000);
+        log.info("围栏位置信息检查 SpotCheckJob completed. cost:{} sec", (endTime - startTime)/1000);
+        return ReturnT.SUCCESS;
+    }
+
+    private TmsMongoDoc getGeoNear() {
+        return null;
+    }
+
+}

+ 4 - 0
src/main/java/com/aoyang/tms/service/WorkLogService.java

@@ -1,6 +1,8 @@
 package com.aoyang.tms.service;
 
+import com.aoyang.tms.common.WorkLogTypeEnum;
 import com.aoyang.tms.entity.WorkLog;
+import com.aoyang.tms.entity.WorkOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
@@ -13,4 +15,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface WorkLogService extends IService<WorkLog> {
 
+    public Boolean logWorkCycleInfo(WorkLogTypeEnum type, WorkOrder workOrder);
+
 }

+ 29 - 0
src/main/java/com/aoyang/tms/service/impl/WorkLogServiceImpl.java

@@ -1,11 +1,16 @@
 package com.aoyang.tms.service.impl;
 
+import com.aoyang.tms.common.WorkLogTypeEnum;
 import com.aoyang.tms.entity.WorkLog;
+import com.aoyang.tms.entity.WorkOrder;
 import com.aoyang.tms.mapper.WorkLogMapper;
 import com.aoyang.tms.service.WorkLogService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+
 /**
  * <p>
  * 车辆行车日志表 服务实现类
@@ -17,4 +22,28 @@ import org.springframework.stereotype.Service;
 @Service
 public class WorkLogServiceImpl extends ServiceImpl<WorkLogMapper, WorkLog> implements WorkLogService {
 
+    @Override
+    public Boolean logWorkCycleInfo(WorkLogTypeEnum type, WorkOrder workOrder) {
+        WorkLog workLog = new WorkLog();
+        workLog.setTitle(type.workLogTitle);
+        if (type.equals(WorkLogTypeEnum.ENTER_LOAD_SPOT) || type.equals(WorkLogTypeEnum.LEAVE_LOAD_SPOT)
+                || type.equals(WorkLogTypeEnum.ENTER_UNLOAD_SPOT) || type.equals(WorkLogTypeEnum.LEAVE_UNLOAD_SPOT)) {
+            // 进入离开围栏日志
+            if (workOrder == null) {
+                log.error("记录围栏行车日志错误:运单不存在");
+                return false;
+            }
+            BeanUtils.copyProperties(workOrder, workLog);
+            workLog.setId(null);
+            // 日志内容
+            workLog.setNote(type.workLogTitle + " " + workOrder.getSpotName());
+            workLog.setCreaterName("自动上报");
+            workLog.setCreateDate(workOrder.getType() == 1? workOrder.getEnterTime() : workOrder.getLeaveTime());
+        } else if ( 1 == 2) {
+            // TODO others
+            workLog.setNote("lalallala");
+        }
+
+        return save(workLog);
+    }
 }