package com.ard.route.service.impl;
|
|
import java.util.List;
|
|
import com.alibaba.fastjson2.JSON;
|
import com.ard.common.core.domain.entity.SysUser;
|
import com.ard.common.utils.DateUtils;
|
import com.ard.common.utils.SecurityUtils;
|
import com.ard.common.utils.uuid.IdUtils;
|
import com.ard.route.domain.route.ArdRouteMission;
|
import com.ard.route.domain.route.ArdRoutePoint;
|
import com.ard.route.domain.route.MissionNot;
|
import com.ard.route.domain.route.UpdateMission;
|
import com.ard.route.mapper.ArdRoutePointMapper;
|
import com.ard.route.websocket.utils.MiWebSocketUtils;
|
import com.ard.system.mapper.SysUserMapper;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import com.ard.route.mapper.ArdRouteMissionMapper;
|
import com.ard.route.service.IArdRouteMissionService;
|
|
import static com.ard.common.utils.SecurityUtils.getUserId;
|
|
|
/**
|
* 航线任务Service业务层处理
|
*
|
* @author xia
|
* @date 2026-01-20
|
*/
|
@Service
|
@Slf4j
|
public class ArdRouteMissionServiceImpl implements IArdRouteMissionService {
|
|
@Autowired
|
private ArdRouteMissionMapper ardRouteMissionMapper;
|
|
@Autowired
|
private ArdRoutePointMapper ardRoutePointMapper;
|
|
@Autowired
|
private SysUserMapper sysUserMapper;
|
|
/**
|
* 查询航线任务
|
*
|
* @param id 航线任务主键
|
* @return 航线任务
|
*/
|
@Override
|
public ArdRouteMission selectArdRouteMissionById(String id) {
|
ArdRouteMission ardRouteMission = ardRouteMissionMapper.selectArdRouteMissionById(id);
|
ardRouteMission.setMissionDetailList(getMissionDetailList(id));
|
return ardRouteMission;
|
}
|
|
/**
|
* 查询航线任务列表
|
*
|
* @param ardRouteMission 航线任务
|
* @return 航线任务
|
*/
|
@Override
|
public List<ArdRouteMission> selectArdRouteMissionList(ArdRouteMission ardRouteMission) {
|
List<ArdRouteMission> list = ardRouteMissionMapper.selectArdRouteMissionList(ardRouteMission);
|
for (ArdRouteMission routeMission : list) {
|
routeMission.setMissionDetailList(getMissionDetailList(routeMission.getId()));
|
}
|
return list;
|
}
|
|
private List<ArdRoutePoint> getMissionDetailList(String missionId) {
|
return ardRoutePointMapper.selectArdRoutePointByMissionId(missionId);
|
}
|
|
/**
|
* 新增航线任务
|
*
|
* @param ardRouteMission 航线任务
|
* @return 结果
|
*/
|
@Override
|
public int insertArdRouteMission(ArdRouteMission ardRouteMission) {
|
ardRouteMission.setId(IdUtils.simpleUUID());
|
ardRouteMission.setExecuteStatus("0");
|
ardRouteMission.setIsRead("0");
|
ardRouteMission.setCreateTime(DateUtils.getNowDate());
|
ardRouteMission.setIssuerTime(DateUtils.getNowDate());
|
ardRouteMission.setIssuerName(getUserName(ardRouteMission.getIssuerId()));
|
dataProcessingRoutePoint(ardRouteMission.getMissionDetailList(),ardRouteMission.getId());
|
try {
|
log.debug("给用户{}定时推送,航线任务信息", ardRouteMission.getIssuerName());
|
MiWebSocketUtils.sendMessage(ardRouteMission.getIssuerId(),JSON.toJSONString(ardRouteMission));
|
} catch (Exception e) {
|
log.error("Error sending message to session {}", ardRouteMission.getIssuerName(), e);
|
}
|
return ardRouteMissionMapper.insertArdRouteMission(ardRouteMission);
|
}
|
|
/**
|
* 修改航线任务
|
*
|
* @param ardRouteMission 航线任务
|
* @return 结果
|
*/
|
@Override
|
public int updateArdRouteMission(ArdRouteMission ardRouteMission) {
|
validateForCreate(ardRouteMission,"2");
|
ardRouteMission.setUpdateTime(DateUtils.getNowDate());
|
ardRouteMission.setIssuerName(getUserName(ardRouteMission.getIssuerId()));
|
// 删除航线任务航点
|
ardRoutePointMapper.deleteArdRoutePointByMissionId(ardRouteMission.getId());
|
// 重新插入航线任务航点
|
dataProcessingRoutePoint(ardRouteMission.getMissionDetailList(),ardRouteMission.getId());
|
return ardRouteMissionMapper.updateArdRouteMission(ardRouteMission);
|
}
|
|
// 获取用户名称
|
private String getUserName(Long userId) {
|
SysUser sysUser = sysUserMapper.selectUserById(userId);
|
return sysUser.getUserName();
|
}
|
|
/**
|
* 航线任务航点对象数据加工
|
*/
|
private void dataProcessingRoutePoint(List<ArdRoutePoint> missionDetailList,String missionId){
|
for (ArdRoutePoint missionDetail : missionDetailList) {
|
missionDetail.setMissionId(missionId);
|
}
|
ardRoutePointMapper.insertArdRoutePointS(missionDetailList);
|
}
|
|
/**
|
* 批量删除航线任务
|
*
|
* @param ids 需要删除的航线任务主键
|
* @return 结果
|
*/
|
@Override
|
public int deleteArdRouteMissionByIds(String[] ids) {
|
// 删除航线任务时只能删除自己的航线任务
|
for (String id : ids) {
|
ArdRouteMission ardRouteMission = ardRouteMissionMapper.selectArdRouteMissionById(id);
|
validateForCreate(ardRouteMission,"1");
|
}
|
// 删除航线任务航点
|
ardRoutePointMapper.deleteArdRoutePointByMissionId(ids[0]);
|
return ardRouteMissionMapper.deleteArdRouteMissionByIds(ids);
|
}
|
|
// 验证,只有当前用户是下发人才能删除修改
|
private void validateForCreate(ArdRouteMission mission,String type) {
|
if (!mission.getIssuerId().equals(getUserId())){
|
if ("1".equals(type)){
|
throw new RuntimeException("只能删除下发自己的航线任务信息【" + mission.getMissionName() + "】,无法执行操作!");
|
}else if ("2".equals(type)){
|
throw new RuntimeException("只能修改下发自己的航线任务信息【" + mission.getMissionName() + "】,无法执行操作!");
|
}
|
}
|
}
|
|
/**
|
* 删除航线任务信息
|
*
|
* @param id 航线任务主键
|
* @return 结果
|
*/
|
@Override
|
public int deleteArdRouteMissionById(String id) {
|
ArdRouteMission ardRouteMission = ardRouteMissionMapper.selectArdRouteMissionById(id);
|
if (ardRouteMission != null){
|
validateForCreate(ardRouteMission,"1");
|
}
|
ardRoutePointMapper.deleteArdRoutePointByMissionId(id);
|
return ardRouteMissionMapper.deleteArdRouteMissionById(id);
|
}
|
|
/**
|
* 修改航线任务状态
|
*
|
* @param id 航线任务主键
|
* @param status 状态类型
|
* @return 结果
|
*/
|
@Override
|
public int updateArdRouteMissionStatus(String id, String status) {
|
ArdRouteMission ardRouteMission = new ArdRouteMission();
|
ardRouteMission.setId(id);
|
ardRouteMission.setExecuteStatus(status);
|
ardRouteMission.setExecuteName(SecurityUtils.getUsername());
|
ardRouteMission.setExecuteTime(DateUtils.getNowDate());
|
ardRouteMission.setUpdateTime(DateUtils.getNowDate());
|
return ardRouteMissionMapper.updateArdRouteMission(ardRouteMission);
|
}
|
|
/**
|
* 批量修改航线任务已读状态
|
*
|
* @param updateMission 批量修改已读类型实体
|
* @return 结果
|
*/
|
@Override
|
public int updateIsRead(UpdateMission updateMission) {
|
if (updateMission == null || updateMission.getIds() == null || updateMission.getIds().length == 0) {
|
return 0;
|
}
|
String[] ids = updateMission.getIds();
|
String isRead = updateMission.getIsRead();
|
return ardRouteMissionMapper.updateIsRead(ids, isRead);
|
}
|
|
/**
|
* 校验航线任务是否可以创建航线
|
*
|
* @param id ID
|
* @return 结果
|
*/
|
@Override
|
public MissionNot selectRouteMissionNot(String id) {
|
// 1. 初始化返回对象,默认允许操作
|
MissionNot missionNot = new MissionNot();
|
missionNot.setIsNot(true);
|
|
// 2. 根据ID查询航线任务
|
ArdRouteMission mission = ardRouteMissionMapper.selectArdRouteMissionById(id);
|
|
// 3. 空值快速返回(任务不存在则无需校验,直接允许操作)
|
if (mission == null) {
|
return missionNot;
|
}
|
|
// 4. 校验任务创建者是否为当前用户
|
// 增加空指针防护:避免issuerId为null导致空指针异常
|
if (mission.getIssuerId() == null || !mission.getIssuerId().equals(getUserId())) {
|
String errorMsg = String.format("创建航线,只能创建下发自己的航线任务信息【%s】,无法执行操作!",
|
mission.getMissionName());
|
missionNot.setInformation(errorMsg);
|
missionNot.setIsNot(false);
|
}
|
|
// 5. 统一返回结果
|
return missionNot;
|
}
|
|
}
|