ソースを参照

feat:运力调度order更新

wangweiyu 4 年 前
コミット
680443475b

+ 55 - 0
src/main/java/com/aoyang/tms/controller/TestController.java

@@ -0,0 +1,55 @@
+package com.aoyang.tms.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.aoyang.common.result.Result;
+import com.aoyang.tms.entity.WorkSpot;
+import com.aoyang.tms.feign.result.TmsMongoDoc;
+import com.aoyang.tms.service.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @Description: 作业人员相关接口
+ * @Author guoyong
+ * @Date 2022/4/22 16:50
+ * @Version 1.0
+ */
+@RestController
+@Slf4j
+@Api(value = "测试接口")
+@RequestMapping("/tms/test")
+public class TestController {
+
+    @Resource
+    private WorkSpotService workSpotService;
+    @Resource
+    private MongoTemplate mongoTemplate;
+
+    @ApiOperation(value = "mongo查询测试接口", notes = "判断输入经纬度是否在围栏内")
+    @PostMapping("/mongo")
+    public Result testMongo(@RequestParam String clientId,
+                            @RequestParam Long spotId) {
+        log.info("测试接口 /tms/test/mongo,参数:{}", spotId);
+        WorkSpot spot = workSpotService.getById(spotId);
+        Point point = new Point(Double.valueOf(spot.getLongitude()), Double.valueOf(spot.getLatitude()));
+        Criteria criteria = Criteria.where("clientId").is(clientId);
+        Query query = new Query(criteria);
+        query.with(new Sort(Sort.Direction.DESC, "dateTime"));
+        NearQuery nearQuery = NearQuery.near(point).query(query)
+                .maxDistance(new Distance(spot.getValidDistance(), Metrics.KILOMETERS))
+                .num(2);
+        GeoResults<TmsMongoDoc> geoResults = mongoTemplate.geoNear(nearQuery, TmsMongoDoc.class);
+        return new Result<>(geoResults);
+    }
+}

+ 14 - 2
src/main/java/com/aoyang/tms/entity/WorkOrder.java

@@ -147,6 +147,14 @@ public class WorkOrder implements Serializable {
     @TableField("actual_leave_time")
     private LocalDateTime actualLeaveTime;
 
+    @ApiModelProperty(value = "进入围栏时间")
+    @TableField("enter_time")
+    private LocalDateTime enterTime;
+
+    @ApiModelProperty(value = "离开围栏时间")
+    @TableField("leave_time")
+    private LocalDateTime leaveTime;
+
     @ApiModelProperty(value = "计划重量")
     @TableField("plan_weight")
     private Integer planWeight;
@@ -203,9 +211,13 @@ public class WorkOrder implements Serializable {
     @TableField("jing_weight")
     private String jingWeight;
 
+    @ApiModelProperty(value = "开始执行时间")
+    @TableField("execute_time")
+    private LocalDateTime executeTime;
+
     @ApiModelProperty(value = "运单完成时间")
-    @TableField("complete_date")
-    private LocalDateTime completeDate;
+    @TableField("complete_time")
+    private LocalDateTime completeTime;
 
     @ApiModelProperty(value = "创建人id")
     @TableField("creater")

+ 143 - 0
src/main/java/com/aoyang/tms/job/SpotCheckJob.java

@@ -0,0 +1,143 @@
+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());
+                    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;
+    }
+
+}

+ 1 - 2
src/main/java/com/aoyang/tms/service/impl/WorkOrderServiceImpl.java

@@ -13,7 +13,6 @@ import com.aoyang.tms.mapper.WorkOrderMapper;
 import com.aoyang.tms.service.*;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.BeanUtils;
@@ -229,7 +228,7 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
             workOrderPageListVO.setShipperName(workOrder.getShipperName());
             workOrderPageListVO.setSpotName(workOrder.getSpotName());
             workOrderPageListVO.setCreateDate(workOrder.getCreateDate());
-            workOrderPageListVO.setCompleteDate(workOrder.getCompleteDate());
+            workOrderPageListVO.setCompleteDate(workOrder.getCompleteTime());
             workOrderPageListVO.setCarAndTrailerNumber("[" + workOrder.getCarNumber() + "]");
             if (workOrder.getTrailerNumber() != null) {
                 workOrderPageListVO.setCarAndTrailerNumber(workOrderPageListVO.getCarAndTrailerNumber() + "-[" + workOrder.getTrailerNumber() + "]");