From 0a79e4295745bc59c0f8b8624218df7a226d14b9 Mon Sep 17 00:00:00 2001
From: linwei <872216696@qq.com>
Date: Thu, 26 Feb 2026 18:10:24 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdDeviceCallServiceImpl.java |  148 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 148 insertions(+), 0 deletions(-)

diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdDeviceCallServiceImpl.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdDeviceCallServiceImpl.java
new file mode 100644
index 0000000..ad3d739
--- /dev/null
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdDeviceCallServiceImpl.java
@@ -0,0 +1,148 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.sxkj.gd.workorder.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.AllArgsConstructor;
+import org.springblade.core.tool.utils.StringUtil;
+import org.sxkj.gd.workorder.dto.GdDeviceCallDetailExternalSaveDTO;
+import org.sxkj.gd.workorder.entity.GdDeviceCallDetailEntity;
+import org.sxkj.gd.workorder.entity.GdDeviceCallEntity;
+import org.sxkj.gd.workorder.entity.GdManageDeviceEntity;
+import org.sxkj.gd.workorder.entity.GdPatrolTaskEntity;
+import org.sxkj.gd.workorder.service.IGdDeviceCallDetailService;
+import org.sxkj.gd.workorder.service.IGdManageDeviceService;
+import org.sxkj.gd.workorder.service.IGdPatrolTaskService;
+import org.sxkj.gd.workorder.vo.GdDeviceCallVO;
+import org.sxkj.gd.workorder.excel.GdDeviceCallExcel;
+import org.sxkj.gd.workorder.mapper.GdDeviceCallMapper;
+import org.sxkj.gd.workorder.service.IGdDeviceCallService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.sxkj.system.cache.SysCache;
+import org.sxkj.system.cache.UserCache;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 设备调用表 服务实现类
+ *
+ * @author Aix
+ * @since 2026-02-26
+ */
+@Service
+@AllArgsConstructor
+public class GdDeviceCallServiceImpl extends BaseServiceImpl<GdDeviceCallMapper, GdDeviceCallEntity> implements IGdDeviceCallService {
+
+	private final IGdDeviceCallDetailService gdDeviceCallDetailService;
+	private final IGdPatrolTaskService gdPatrolTaskService;
+	private final IGdManageDeviceService gdManageDeviceService;
+
+	@Override
+	public IPage<GdDeviceCallVO> selectGdDeviceCallPage(IPage<GdDeviceCallVO> page, GdDeviceCallVO gdDeviceCall) {
+		return page.setRecords(baseMapper.selectGdDeviceCallPage(page, gdDeviceCall));
+	}
+
+	@Override
+	public boolean saveGdDeviceCallExternal(List<GdDeviceCallDetailExternalSaveDTO> dtos) {
+
+		// 保存设备调用
+		GdPatrolTaskEntity patrolTask = gdPatrolTaskService.getById(dtos.get(0).getPatrolTaskId());
+		if (patrolTask == null) {
+			return false;
+		}
+		GdDeviceCallEntity callEntity = new GdDeviceCallEntity();
+		callEntity.setId(patrolTask.getId());
+		callEntity.setPatrolTaskName(patrolTask.getPatrolTaskName());
+		callEntity.setTaskDepartment(SysCache.getDeptName(patrolTask.getCreateDept()));
+		callEntity.setTaskDepartmentId(patrolTask.getCreateDept());
+		callEntity.setTaskInitiator(UserCache.getUser(patrolTask.getCreateUser()).getName());
+		callEntity.setTaskInitiatorId(patrolTask.getCreateUser());
+		callEntity.setPlanExecuteTime(patrolTask.getExecuteTime());
+		callEntity.setActualExecuteTime(dtos.get(0).getOccurTime());// 第一条数据的发生时间
+
+		// 计算飞行时长(毫秒转分钟)
+		// 计算飞行时长(处理可能的空值情况)
+		Date startTime = dtos.get(0).getOccurTime();
+		Date endTime = dtos.get(dtos.size() - 1).getOccurTime();
+
+		if (startTime == null || endTime == null) {
+			log.warn("时间数据不完整,无法计算飞行时长");
+			callEntity.setFlightDuration(0L);
+		} else {
+			long flightDurationMs = endTime.getTime() - startTime.getTime();
+			// 可以选择不同的时间单位
+			callEntity.setFlightDuration(flightDurationMs / 1000); // 秒
+		}
+
+
+		// 计算总飞行距离
+		double totalDistance = dtos.stream()
+			.mapToDouble(GdDeviceCallDetailExternalSaveDTO::getFlightDistance)
+			.sum();
+		callEntity.setFlightDistance(totalDistance);
+
+		// 设备ID&名称
+		String deviceSn = dtos.get(0).getDeviceSn();
+		Long deviceId = null;
+		String deviceName = null;
+
+		if (StringUtil.hasText(deviceSn)) {
+			GdManageDeviceEntity gdManageDevice = gdManageDeviceService.getOne(
+				Wrappers.lambdaQuery(GdManageDeviceEntity.class)
+					.eq(GdManageDeviceEntity::getDeviceSn, deviceSn),
+				false
+			);
+			deviceId = gdManageDevice.getId();
+			deviceName = gdManageDevice.getDeviceName();
+		}
+
+		callEntity.setDeviceId(deviceId);
+		callEntity.setDeviceName(deviceName);
+
+		// 保存设备调用详情
+		if (baseMapper.insert(callEntity) <= 0) {
+			return false;
+		}
+
+		List<GdDeviceCallDetailEntity> detailEntities = dtos.stream().map(dto -> {
+			GdDeviceCallDetailEntity entity = new GdDeviceCallDetailEntity();
+			entity.setCallId(dto.getPatrolTaskId());
+			entity.setDeviceStatus(dto.getDeviceStatus());
+			entity.setOccurTime(dto.getOccurTime());
+			entity.setFlightDistance(dto.getFlightDistance());
+			entity.setSort(dto.getSort());
+			return entity;
+		}).collect(Collectors.toList());
+
+		return gdDeviceCallDetailService.saveBatch(detailEntities);
+	}
+
+	@Override
+	public List<GdDeviceCallExcel> exportGdDeviceCall(Wrapper<GdDeviceCallEntity> queryWrapper) {
+		List<GdDeviceCallExcel> gdDeviceCallList = baseMapper.exportGdDeviceCall(queryWrapper);
+		//gdDeviceCallList.forEach(gdDeviceCall -> {
+		//	gdDeviceCall.setTypeName(DictCache.getValue(DictEnum.YES_NO, GdDeviceCall.getType()));
+		//});
+		return gdDeviceCallList;
+	}
+
+}

--
Gitblit v1.9.3