package com.fdkankan.manage_jp.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fdkankan.fyun.face.FYunFileServiceInterface;
import com.fdkankan.manage_jp.common.PageInfo;
import com.fdkankan.manage_jp.entity.*;
import com.fdkankan.manage_jp.httpClient.service.LaserService;
import com.fdkankan.manage_jp.mapper.IProjectSceneGpsMapper;
import com.fdkankan.manage_jp.mapper.ISceneProMapper;
import com.fdkankan.manage_jp.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.manage_jp.vo.request.ProjectParam;
import com.fdkankan.manage_jp.vo.request.SceneGpsParam;
import com.fdkankan.manage_jp.vo.request.SceneParam;
import com.fdkankan.manage_jp.vo.response.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author
* @since 2024-08-16
*/
@Service
@Slf4j
public class ProjectSceneGpsServiceImpl extends ServiceImpl implements IProjectSceneGpsService {
@Autowired
IScenePlusService scenePlusService;
@Autowired
IScenePlusExtService scenePlusExtService;
@Autowired
FYunFileServiceInterface fYunFileServiceInterface;
@Autowired
LaserService laserService;
@Autowired
IUserRoleService userRoleService;
@Override
public List getNotGpsScene() {
return this.getBaseMapper().getNotGpsScene();
}
@Override
public ProjectSceneGps addGps(SceneGpsDb sceneGpsDb) {
SceneGpsVo sceneGpsVo = getByLaserEdit(sceneGpsDb.getNum());
// if(sceneGpsDb.getSceneSource() == 4 || sceneGpsDb.getSceneSource() == 5){
// sceneGpsVo = getByLaserEdit(sceneGpsDb.getNum());
// }else {
// sceneGpsVo = getByHomeParameters(sceneGpsDb.getDataSource());
// }
if(sceneGpsVo == null && StrUtil.isNotBlank(sceneGpsDb.getGps())){
String gps = sceneGpsDb.getGps();
SceneExtGpsVo extGpsVo = JSONObject.parseObject(gps,SceneExtGpsVo.class);
sceneGpsVo = new SceneGpsVo(extGpsVo.getLatitude(),extGpsVo.getLongitude(),extGpsVo.getAltitude(),1);
}
if(sceneGpsVo != null
&& StrUtil.isNotBlank(sceneGpsVo.getLat())
&& StrUtil.isNotBlank(sceneGpsVo.getLon())
&& StrUtil.isNotBlank(sceneGpsVo.getAlt())){
ProjectSceneGps sceneGps = new ProjectSceneGps();
sceneGps.setNum(sceneGpsDb.getNum());
sceneGps.setWebSite(sceneGpsDb.getWebSite());
sceneGps.setLat(sceneGpsVo.getLat());
sceneGps.setLon(sceneGpsVo.getLon());
sceneGps.setAlt(sceneGpsVo.getAlt());
sceneGps.setGpsSource(sceneGpsVo.getGpsSource());
sceneGps.setSceneSource(sceneGpsDb.getSceneSource());
return sceneGps;
}
return null;
}
private SceneGpsVo getByLaserEdit(String num) {
return laserService.getLocation(num);
}
private SceneGpsVo getByHomeParameters(String dataSource) {
dataSource = dataSource.replaceAll("/mnt/data", "home");
boolean parametersFlag = fYunFileServiceInterface.fileExist(dataSource+"/parameters.json");
if (parametersFlag) {
JSONObject parameters = JSONObject.parseObject(fYunFileServiceInterface.getFileContent(dataSource+"/parameters.json"));
JSONArray parametersArray = parameters.getJSONArray("parameters");
for (Object o : parametersArray) {
JSONObject parameter = (JSONObject) o;
JSONObject ggaLocation = parameter.getJSONObject("value").getJSONObject("ggaLocation");
if (ObjectUtil.isNotEmpty(ggaLocation)
&& StrUtil.isNotEmpty(ggaLocation.getString("lon"))
&& StrUtil.isNotEmpty(ggaLocation.getString("lat"))
&& StrUtil.isNotEmpty(ggaLocation.getString("alt"))) {
log.info("从rtk获取gps信息:{}", parameters);
return new SceneGpsVo(ggaLocation.getString("lat"),ggaLocation.getString("lon"),ggaLocation.getString("alt"),0);
}
}
}
return null;
}
@Override
public void updateGps(String num,String lat,String lon,Integer type) {
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(ProjectSceneGps::getNum,num);
wrapper.set(ProjectSceneGps::getLat,lat);
wrapper.set(ProjectSceneGps::getLon,lon);
wrapper.set(ProjectSceneGps::getGpsSource,type);
this.update(wrapper);
}
@Autowired
ISceneProMapper sceneProMapper;
@Autowired
ITmContractorNumService tmContractorNumService;
@Autowired
IProjectService projectService;
@Autowired
IProjectNumService projectNumService;
private void commonParam(SceneGpsParam param){
}
@Override
public Object listSceneGps(SceneGpsParam param){
if(param.getUserId() == null){
return new ArrayList<>();
}
List roleIdList = userRoleService.getByUserId((param.getUserId()));
List roleIds = roleIdList.stream().map(UserRole::getRoleId).collect(Collectors.toList());
if(roleIds.contains(5L)) { //平台管理员
param.setUserId(null);
param.setCompanyId(null);
}
List numList = tmContractorNumService.getNumListByCompanyId(param.getCompanyId());
param.setCooperateSceneCodes(numList);
Page sceneGpsDbVpPage = this.getBaseMapper().listGps(new Page<>(param.getPageNum(), param.getPageSize()), param);
return PageInfo.PageInfo(sceneGpsDbVpPage);
}
@Override
public Object allSceneGps(SceneGpsParam param) {
if(param.getUserId() == null){
return new ArrayList<>();
}
List roleIdList = userRoleService.getByUserId((param.getUserId()));
List roleIds = roleIdList.stream().map(UserRole::getRoleId).collect(Collectors.toList());
HashMap> projectNumMap = new HashMap<>();
HashMap projectMap = new HashMap<>();
if(param.getType() == 0){ //项目场景
List projectList = new ArrayList<>();
if(!roleIds.contains(5L) && param.getProjectId() == null) { //平台管理员
projectList = projectService.listByCompanyId(param.getCompanyId());
}else if(param.getProjectId() == null){
projectList = projectService.listShow();
}else {
Project project = projectService.getById(param.getProjectId());
projectList = Arrays.asList(project);
}
if(projectList == null || projectList.isEmpty()){
return new ArrayList<>();
}
for (Project project : projectList) {
projectMap.put(project.getId(),project);
}
List projectIds = projectList.stream().map(Project::getId).collect(Collectors.toList());
List projectNums = projectNumService.getByProjectId(projectIds);
for (ProjectNum projectNum : projectNums) {
if(projectNumMap.get(projectNum.getProjectId()) == null){
List proNumList = new ArrayList<>();
proNumList.add(projectNum.getNum());
projectNumMap.put(projectNum.getProjectId(),proNumList);
}else {
projectNumMap.get(projectNum.getProjectId()).add(projectNum.getNum());
}
}
List numList = projectNums.stream().map(ProjectNum::getNum).collect(Collectors.toList());
param.setNumList(numList);
}
if(param.getType() == 1 ){
if(roleIds.contains(5L)) { //平台管理员
param.setUserId(null);
param.setCompanyId(null);
}
List numList = tmContractorNumService.getNumListByCompanyId(param.getCompanyId());
param.setCooperateSceneCodes(numList);
if(param.getProjectId() != null){
Project project = projectService.getById(param.getProjectId());
if(project == null){
return PageInfo.PageInfoEmpty(param.getPageNum(),param.getPageSize());
}
List projectNumList = projectNumService.getByProjectId(Arrays.asList(param.getProjectId()));
if(projectNumList== null || projectNumList.isEmpty()){
return PageInfo.PageInfoEmpty(param.getPageNum(),param.getPageSize());
}
List projectNums = projectNumList.stream().map(ProjectNum::getNum).collect(Collectors.toList());
param.setNumList(projectNums);
}
}
Page sceneGpsDbVpPage = this.getBaseMapper().listGps(new Page<>(1, Integer.MAX_VALUE), param);
List sceneGpsDbVps = sceneGpsDbVpPage.getRecords();
if(param.getType() == 1){
return sceneGpsDbVps;
}
if(param.getType() == 0){
List< ProjectSceneMapVo> voList = new ArrayList<>();
HashMap scenMap = new HashMap<>();
for (SceneGpsDbVp sceneGpsDbVp : sceneGpsDbVps) {
scenMap.put(sceneGpsDbVp.getNum(),sceneGpsDbVp);
}
for (Integer projectId : projectMap.keySet()) {
ProjectSceneMapVo vo = new ProjectSceneMapVo();
BeanUtils.copyProperties(projectMap.get(projectId),vo);
vo.setTitle(projectMap.get(projectId).getProjectName());
vo.setId(projectId);
List list = projectNumMap.get(projectId);
List listScene = new ArrayList<>();
if(list != null){
for (String num : list) {
SceneGpsDbVp sceneGpsDbVp = scenMap.get(num);
if(sceneGpsDbVp != null){
listScene.add(sceneGpsDbVp);
}
}
}
vo.setSceneList(listScene);
voList.add(vo);
}
return voList;
}
return new ArrayList<>();
}
@Override
public ProjectSceneGps getByNum(String num) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProjectSceneGps::getNum,num);
return this.getOne(wrapper);
}
@Override
public void deleteByNumList(List numList) {
if(numList == null || numList.isEmpty()){
return;
}
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(ProjectSceneGps::getNum,numList);
this.remove(wrapper);
}
}