文章目录
- 一、背景介绍
- 二、页面效果
- 三、代码
- 0.pom.xml
- 1.ImportDevice.vue
- 2.ImportDeviceError.vue
- 3.system.js
- 4.DeviceManageControl
- 5.DeviceManageUserControl
- 6.Repeater
- 7.FileUtils
- 8.ResponseModel
- 9.EnumLongitudeLatitude
- 10.词条
- 四、注意点
- 本人其他相关文章链接
一、背景介绍
项目采用:Arco Design+java+mysql+springboot+vue3
项目中转台存入有2种:
- 第一种南向上报入库;
- 第二种手动添加入库;
但是这两种方式中转台都没有经纬度和海拔值,所以需要导入excel去批量更新经纬度和海拔。
同时参数配置中展示效果有2种:
- 度数显示
- 度分秒显示
因为展示效果有2种,所以excel导入模版也有2种不同的模版,本篇文章就是记录excel导入更新入库,同时记录“度数”和“度分秒”之间的转换方式。
二、页面效果
度数显示
度分秒显示
下载excel模版和导入
数据库表字段设计
导入失败错误提示,展示所有错误的信息
导入接口会返回详细错误提示
三、代码
0.pom.xml
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
1.ImportDevice.vue
<template>
<a-modal :width="570" :align-center="true">
<template #title>
<div class="title">{{ openTitle }}</div>
</template>
<div class="frameParent">
<div class="frameWrapper">
<div class="frameGroup">
<div class="textWrapper">
<div class="text">{{$t('ImportTempletDownLoad')}}</div>
</div>
<div class="frameContainer">
<div class="iconBaseParent">
<div class="iconBase"> <icon-download />
</div>
<div class="text1" @click="templateOne">{{$t('LngLatDegree')}}</div>
</div>
<div class="iconBaseParent">
<div class="iconBase"> <icon-download />
</div>
<div class="text1" @click="templateTwo">{{$t('LngLatDegreeMinuteSecond')}}</div>
</div>
</div>
</div>
</div>
<div class="frameDiv">
<div class="groupWrapper">
<div class="groupDiv">
<div class="textParent">
<div class="text3">{{$t('BrowseImport')}}</div>
<div class="parent">
<a-input class="div" v-model="fileName" disabled />
<a-upload accept=".xlsx, .xls" @change="onChange" :auto-upload="false" :show-file-list="false">
<template #upload-button>
<svg-loader class="frameIcon" name="import-file"></svg-loader>
</template>
</a-upload>
</div>
</div>
</div>
</div>
</div>
</div>
<template #footer>
<a-button @click="closeDevice()">{{$t('cancelLabel')}}</a-button>
<a-button type="primary" @click="saveDevice()">{{$t('ExportTaskEnter')}}</a-button>
</template>
</a-modal>
</template>
<script setup>
import {defineEmits, inject, ref} from "vue";
import { Message } from "@arco-design/web-vue";
import {importDevive} from "@/views/pages/system/system.js";
const t = inject('t')
const openTitle = ref('')
const emits = defineEmits(['receiveImportError','refresh-flag'])
const templateOne = () => {
window.open(`${location.origin}/api/deviceManage/downloadImportTemplateAboutDegrees`)
}
const templateTwo = () => {
window.open(`${location.origin}/api/deviceManage/downloadImportTemplateAboutDMS`)
}
const files = ref([]);
const fileName = ref('');
const onChange = (fileList) => {
files.value = [];
if (fileList.length > 0) {
const lastUploadedFile = fileList[fileList.length - 1];
const lastFileName = lastUploadedFile.name;
fileName.value = lastFileName;
files.value.push(lastUploadedFile)
}
};
const closeDevice =() => {
emits('refresh-flag', 1)
}
const saveDevice = () => {
const uploadedFile = files.value;
const formData = new FormData();
formData.append("file", uploadedFile[0].file);
importDevive(formData).then(response =>{
if (response.code === 200) {
Message.success(t('HeaderSuccessfulResult'))
emits('refresh-flag', 1)
} else {
emits('receiveImportError', response.data);
}
})
};
</script>
<style scoped lang="less">
.text {
position: relative;
line-height: 22px;
}
.textWrapper {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
}
.iconBase {
width: 20px;
position: relative;
height: 20px;
overflow: hidden;
flex-shrink: 0;
}
.text1 {
position: relative;
text-decoration: underline;
line-height: 22px;
cursor: pointer;
}
.iconBaseParent {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 8px;
}
.frameContainer {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 32px;
text-align: center;
color: #3348ff;
}
.frameGroup {
width: 400px;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
gap: 16px;
}
.frameWrapper {
align-self: stretch;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
flex-wrap: wrap;
align-content: center;
padding: 0px 20px 20px;
}
.text3 {
align-self: stretch;
position: relative;
line-height: 22px;
}
.div1 {
position: relative;
}
.div {
position: absolute;
top: 0px;
left: 0px;
border-radius: 8px;
background-color: #fbfcfd;
border: 1px solid #dde4ed;
box-sizing: border-box;
width: 400px;
height: 40px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
padding: 8px 10px;
}
.frameIcon {
position: absolute;
top: 6px;
left: 364px;
width: 28px;
height: 28px;
}
.parent {
width: 400px;
position: relative;
height: 40px;
color: #202b40;
font-family: 'PingFang TC';
}
.textParent {
position: absolute;
top: 0px;
left: 0px;
width: 400px;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
gap: 4px;
}
.groupDiv {
width: 400px;
position: relative;
height: 66px;
}
.groupWrapper {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.frameDiv {
align-self: stretch;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
flex-wrap: wrap;
align-content: center;
padding: 20px;
}
.frameParent {
align-self: stretch;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
color: #778091;
}
.secondaryButton1text {
box-shadow: 0px -2px 2px rgba(48, 48, 48, 0.1) inset, 0px 12px 12px rgba(255, 255, 255, 0.12) inset;
border-radius: 8px;
background-color: #fff;
border: 1px solid #dde4ed;
box-sizing: border-box;
height: 36px;
overflow: hidden;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
padding: 5px 16px;
}
.buttontertiaryButtonnormal {
height: 36px;
display: flex;
flex-direction: row;
align-items: flex-start;
justify-content: flex-start;
}
.primaryButton {
box-shadow: 0px -2px 2px rgba(48, 48, 48, 0.1) inset, 0px 12px 12px rgba(255, 255, 255, 0.12) inset;
border-radius: 8px;
background-color: #004ce5;
height: 36px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
padding: 5px 16px;
box-sizing: border-box;
}
.buttonprimaryButtonnormal {
border-radius: 8px;
display: flex;
flex-direction: row;
align-items: flex-start;
justify-content: flex-start;
text-align: left;
color: #fff;
}
.button {
align-self: stretch;
border-radius: 0px 0px 12px 12px;
background-color: #f6f7f9;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-end;
padding: 16px 20px;
gap: 12px;
text-align: center;
color: #455471;
}
.headerParent {
width: 100%;
position: relative;
border-radius: 12px;
background-color: #fff;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
gap: 20px;
text-align: left;
font-size: 14px;
color: #202b40;
font-family: 'PingFang SC';
}
</style>
2.ImportDeviceError.vue
<template>
<a-modal :width="1200" :align-center="true" :hide-cancel="true">
<template #title>
<div class="title">{{ openTitle }}</div>
</template>
<div class="table-line">
<a-table :data="errorTableData" :bordered="false" :pagination="false" :loading="errorTableLoading" v-model:selected-keys="errorSelectedKeys" row-key="serialNo">
<template #columns>
<a-table-column dataIndex="alias" :title="$t('RepeaterAlias')" :tooltip="true"></a-table-column>
<a-table-column dataIndex="serialNo" :title="$t('SerialNo')" :tooltip="true"></a-table-column>
<a-table-column dataIndex="lng" :title="$t('Longitude_Degree')" :tooltip="true">
<template #cell="{ record }">
<div style="display: flex; align-items: center;">
<a-select v-model="record.lngOr" style="margin-right: 8px;width: 100px" disabled>
<a-option :value=0 :label="$t('EastLongitude')"></a-option>
<a-option :value=1 :label="$t('WestLongitude')"></a-option>
</a-select>
{{record.lng}}
</div>
</template>
</a-table-column>
<a-table-column dataIndex="lat" :title="$t('Latitude_Degree')" :tooltip="true">
<template #cell="{ record }">
<div style="display: flex; align-items: center;">
<a-select v-model="record.latOr" style="margin-right: 8px;width: 100px" disabled>
<a-option :value=0 :label="$t('NorthLatitude')"></a-option>
<a-option :value=1 :label="$t('SouthLatitude')"></a-option>
</a-select>
{{record.lat}}
</div>
</template>
</a-table-column>
<a-table-column dataIndex="elevation" :title="$t('Elevation')" :tooltip="true">
<template #cell="{ record }">
{{record.elevation}}
</template>
</a-table-column>
<a-table-column dataIndex="importErrorMessage" :title="$t('CauseOfImportFailure')" :tooltip="true"></a-table-column>
</template>
</a-table>
</div>
</a-modal>
</template>
<script setup>
import {ref, defineExpose} from "vue";
const errorTableData = ref([])
const errorSelectedKeys = ref([])
const errorTableLoading = ref(false)
const openTitle = ref('')
const setData = (record, title) => {
openTitle.value = title
if (null != record) {
errorTableData.value = record;
}
}
defineExpose({
setData
})
</script>
<style scoped lang="less">
.table-line {
box-sizing: border-box;
width: 1200px;
height: 500px;
}
</style>
3.system.js
import { $http, Method } from "@/http";
export const importDevive = (data) => {
return $http({
url: `/api/deviceManage/importData`,
method: Method.POST,
headers: {
'Content-Type': 'multipart/form-data',
'X-Requested-With': 'XMLHttpRequest'
},
data
})
}
4.DeviceManageControl
@Operation(summary = "导入数据")
@PostMapping(value = "/importData")
public ResponseModel importData(@RequestParam MultipartFile file) {
return deviceManageUserControl.importData(file);
}
5.DeviceManageUserControl
public ResponseModel importData(MultipartFile file) {
String fileName = file.getOriginalFilename();
String extension = FileUtils.getFileExtension(fileName);
if (!extension.equals(".xls") && !extension.equals(".xlsx")) {
return ResponseModel.ofError(languageFind.findKey("Device_Excel_ColumnIsNotExits"));
}
int excelColumnCount = FileUtils.getExcelColumnCount(file);
if (excelColumnCount != 8 && excelColumnCount != 12) {
return ResponseModel.ofError(languageFind.findKey("Device_Excel_ColumnIsNotExits"));
}
if (excelColumnCount > 1000) {
return ResponseModel.ofError(languageFind.findKey("Device_Excel_RepeatData_1000MaximumData"));
}
if (excelColumnCount == 8) {
return writeDegree(file);
} else if (excelColumnCount == 12) {
return writeDegreeMiuSec(file);
}
return ResponseModel.ofSuccess();
}
/**
* 写入度的形式
* @param file 文件
* @return 结果
*/
public ResponseModel writeDegree(MultipartFile file) {
List<Repeater> repeaterList = new ArrayList<>();
List<Repeater> listError = new ArrayList<>();
Repeater repeater = null;
List<String> excelValuesList = new ArrayList<>();
List<String> serialNoList = new ArrayList<>();
try {
Account account = (Account) SecurityUtils.getSubject().getPrincipal();
List<Repeater> authorityRepeaters = commonIClient.getAuthorityRepeaters(account.getUserName());
String fileName = file.getOriginalFilename();
InputStream inputStream = file.getInputStream();
Workbook workbook = null;
if (fileName.indexOf(".xlsx") > 0) {
workbook = new XSSFWorkbook(inputStream);
} else if (fileName.indexOf(".xls") > 0) {
workbook = new HSSFWorkbook(inputStream);
}
Sheet sheet = workbook.getSheetAt(0);
int lastNum = sheet.getLastRowNum();
Row row = sheet.getRow(0);//行
int cellNum = row.getLastCellNum();
Cell ce = null;
for(int i = 1; i < lastNum + 1; i++){
boolean isImport = true;
row = sheet.getRow(i);
for (int j = 0; j < cellNum; j++){
ce = row.getCell(j);
excelValuesList.add(getCellValueByCell(ce));
}
logger.info("writeDegree-excelValuesList:{}", excelValuesList);
if(excelValuesList.size() > 0){
repeater = new Repeater();
if (excelValuesList.get(1) != null && !excelValuesList.get(1).equals("")) {
repeater.setAlias(excelValuesList.get(1));
}
if (excelValuesList.get(2) != null && !excelValuesList.get(2).equals("")) {
String serialNo = excelValuesList.get(2);
repeater.setSerialNo(serialNo);
List<Repeater> hasRepeater = authorityRepeaters.stream().filter(item -> item.getSerialNo().equals(serialNo)).collect(Collectors.toList());
if (hasRepeater == null || hasRepeater.size() == 0) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("SerialNo") + "," + languageFind.findKey("Device_Excel_IsNotExits_IsNotAuthority"));
}
if (serialNoList.contains(serialNo)) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("SerialNo") + "," + languageFind.findKey("Device_Excel_RepeatData_ImportFailure"));
}
serialNoList.add(serialNo);
} else {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("SerialNo") + languageFind.findKey("Device_Excel_SerialNumberIsNotEmpty"));
}
if (!excelValuesList.get(3).toUpperCase().equals("E") && !excelValuesList.get(3).toUpperCase().equals("W")) {
repeater.setLngOr(2);
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_EastWestLng") + languageFind.findKey("Device_Excel_NotValidLngOr"));
} else {
repeater.setLngOr(excelValuesList.get(3).toUpperCase().equals("E") ? 0 : 1);
BigDecimal outLng = BigDecimal.ZERO;
if (!FileUtils.isBigDecimal(excelValuesList.get(4))) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_Lng") + languageFind.findKey("Device_Excel_NotValidValue"));
} else {
outLng = new BigDecimal(excelValuesList.get(4)).abs();
repeater.setLng(BigDecimal.valueOf(repeater.getLngOr() == 0 ? 1 : -1).multiply(outLng));
if (outLng.compareTo(BigDecimal.ZERO) < 0 || outLng.compareTo(new BigDecimal(180)) > 0) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_Lng") + languageFind.findKey("Device_Excel_LngRange"));
} else {
BigDecimal[] longitudeDegreeMiuSec = getLongitudeDegreeMinuteSecond(repeater.getLng(), excelValuesList.get(3));
repeater.setLngDegreeMinuteSecond(longitudeDegreeMiuSec[0].abs() + "°" + longitudeDegreeMiuSec[1].abs() + "′" + longitudeDegreeMiuSec[2].abs() + "″");
repeater.setLngDegree(longitudeDegreeMiuSec[0]);
repeater.setLngMinute(longitudeDegreeMiuSec[1]);
repeater.setLngSecond(longitudeDegreeMiuSec[2]);
}
}
}
if (!excelValuesList.get(5).toUpperCase().equals("N") && !excelValuesList.get(5).toUpperCase().equals("S")) {
repeater.setLatOr(2);
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_SouthNorthLat") + languageFind.findKey("Device_Excel_NotValidLatOr"));
} else {
repeater.setLatOr(excelValuesList.get(5).toUpperCase().equals("N") ? 0 : 1);
BigDecimal outLat = BigDecimal.ZERO;
if (!FileUtils.isBigDecimal(excelValuesList.get(6))) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_Lat") + languageFind.findKey("Device_Excel_NotValidValue"));
} else {
outLat = new BigDecimal(excelValuesList.get(6)).abs();
repeater.setLat(BigDecimal.valueOf(repeater.getLatOr() == 0 ? 1 : -1).multiply(outLat));
if (outLat.compareTo(BigDecimal.ZERO) < 0 || outLat.compareTo(new BigDecimal(90)) > 0) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_Lat") + languageFind.findKey("Device_Excel_LatRange"));
} else {
BigDecimal[] latitudeDegreeMiuSec = getLatitudeDegreeMinuteSecond(repeater.getLat(), excelValuesList.get(5));
repeater.setLatDegreeMinuteSecond(latitudeDegreeMiuSec[0].abs() + "°" + latitudeDegreeMiuSec[1].abs() + "′" + latitudeDegreeMiuSec[2].abs() + "″");
repeater.setLatDegree(latitudeDegreeMiuSec[0]);
repeater.setLatMinute(latitudeDegreeMiuSec[1]);
repeater.setLatSecond(latitudeDegreeMiuSec[2]);
}
}
}
if (excelValuesList.get(7) != null && !excelValuesList.get(7).equals("")) {
BigDecimal outElevation = BigDecimal.ZERO;
if (!FileUtils.isBigDecimal(excelValuesList.get(7))) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_Elevation") + languageFind.findKey("Device_Excel_NotValidValue"));
} else {
outElevation = new BigDecimal(excelValuesList.get(7));
repeater.setElevation(outElevation);
}
} else {
repeater.setElevation(BigDecimal.ZERO);
}
if (isImport) {
repeaterList.add(repeater);
} else {
listError.add(repeater);
}
}
excelValuesList = new ArrayList<>();
}
inputStream.close();
if (listError.size() > 0) {
return ResponseModel.ofError(listError);
} else {
clientService.importRepeaterLngLat(repeaterList);
}
} catch (Exception e) {
return ResponseModel.ofError(e.getMessage());
}
return ResponseModel.ofSuccess();
}
/**
* 写入度分秒形式
* @param file 文件
* @return 结果
*/
public ResponseModel writeDegreeMiuSec(MultipartFile file) {
List<Repeater> repeaterList = new ArrayList<>();
List<Repeater> listError = new ArrayList<>();
Repeater repeater = null;
List<String> excelValuesList = new ArrayList<>();
List<String> serialNoList = new ArrayList<>();
try {
Account account = (Account) SecurityUtils.getSubject().getPrincipal();
List<Repeater> authorityRepeaters = commonIClient.getAuthorityRepeaters(account.getUserName());
String fileName = file.getOriginalFilename();
InputStream inputStream = file.getInputStream();
Workbook workbook = null;
if (fileName.indexOf(".xlsx") > 0) {
workbook = new XSSFWorkbook(inputStream);
} else if (fileName.indexOf(".xls") > 0) {
workbook = new HSSFWorkbook(inputStream);
}
Sheet sheet = workbook.getSheetAt(0);
int lastNum = sheet.getLastRowNum();
Row row = sheet.getRow(0);//行
int cellNum = row.getLastCellNum();
Cell ce = null;
for(int i = 1; i < lastNum + 1; i++){
boolean isImport = true;
row = sheet.getRow(i);
for (int j = 0; j < cellNum; j++){
ce = row.getCell(j);
excelValuesList.add(getCellValueByCell(ce));
}
logger.info("writeDegreeMiuSec-excelValuesList:{}", excelValuesList);
if(excelValuesList.size() > 0){
repeater = new Repeater();
if (excelValuesList.get(1) != null && !excelValuesList.get(1).equals("")) {
repeater.setAlias(excelValuesList.get(1));
}
if (excelValuesList.get(2) != null && !excelValuesList.get(2).equals("")) {
String serialNo = excelValuesList.get(2);
repeater.setSerialNo(serialNo);
List<Repeater> hasRepeater = authorityRepeaters.stream().filter(item -> item.getSerialNo().equals(serialNo)).collect(Collectors.toList());
if (hasRepeater == null || hasRepeater.size() == 0) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("SerialNo") + "," + languageFind.findKey("Device_Excel_IsNotExits_IsNotAuthority"));
}
if (serialNoList.contains(serialNo)) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("SerialNo") + "," + languageFind.findKey("Device_Excel_RepeatData_ImportFailure"));
}
serialNoList.add(serialNo);
} else {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("SerialNo") + languageFind.findKey("Device_Excel_SerialNumberIsNotEmpty"));
}
if (!excelValuesList.get(3).toUpperCase().equals("E") && !excelValuesList.get(3).toUpperCase().equals("W")) {
repeater.setLngOr(2);
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_EastWestLng") + languageFind.findKey("Device_Excel_NotValidLngOr"));
} else {
repeater.setLngOr(excelValuesList.get(3).toUpperCase().equals("E") ? 0 : 1);
BigDecimal outLngDegree = BigDecimal.ZERO;
BigDecimal outLngMinute = BigDecimal.ZERO;
BigDecimal outLngSecond = BigDecimal.ZERO;
if (!FileUtils.isBigDecimal(excelValuesList.get(4))) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_LngDegree") + languageFind.findKey("Device_Excel_NotValidValue"));
}
if (!FileUtils.isBigDecimal(excelValuesList.get(5))) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_LngMinute") + languageFind.findKey("Device_Excel_NotValidValue"));
}
if (!FileUtils.isBigDecimal(excelValuesList.get(6))) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_LngSecond") + languageFind.findKey("Device_Excel_NotValidValue"));
}
outLngDegree = new BigDecimal(excelValuesList.get(4)).abs();
outLngMinute = new BigDecimal(excelValuesList.get(5)).abs();
outLngSecond = new BigDecimal(excelValuesList.get(6)).abs();
repeater.setLngDegreeMinuteSecond(outLngDegree + "°" + outLngMinute + "′" + outLngSecond + "″");
repeater.setLngDegree(BigDecimal.valueOf(repeater.getLngOr() == 0 ? 1 : -1).multiply(outLngDegree));
repeater.setLngMinute(BigDecimal.valueOf(repeater.getLngOr() == 0 ? 1 : -1).multiply(outLngMinute));
repeater.setLngSecond(BigDecimal.valueOf(repeater.getLngOr() == 0 ? 1 : -1).multiply(outLngSecond));
if (outLngDegree.compareTo(BigDecimal.ZERO) < 0 || outLngDegree.compareTo(new BigDecimal(180)) > 0) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_LngDegree") + languageFind.findKey("Device_Excel_LngDegreeRange"));
} else if (outLngMinute.compareTo(BigDecimal.ZERO) < 0 || outLngMinute.compareTo(new BigDecimal(60)) > 0) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_LngMinute") + languageFind.findKey("Device_Excel_LngMinuteRange"));
} else if (outLngSecond.compareTo(BigDecimal.ZERO) < 0 || outLngSecond.compareTo(new BigDecimal(60)) > 0) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_LngSecond") + languageFind.findKey("Device_Excel_LngSecondRange"));
} else {
BigDecimal lng = getLongitudeDegree(repeater.getLngDegree(), repeater.getLngMinute(), repeater.getLngSecond(), excelValuesList.get(3));
repeater.setLng(lng);
}
}
if (!excelValuesList.get(7).toUpperCase().equals("N") && !excelValuesList.get(7).toUpperCase().equals("S")) {
repeater.setLatOr(2);
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_SouthNorthLat") + languageFind.findKey("Device_Excel_NotValidLatOr"));
} else {
repeater.setLatOr(excelValuesList.get(7).toUpperCase().equals("N") ? 0 : 1);
BigDecimal outLatDegree = BigDecimal.ZERO;
BigDecimal outLatMinute = BigDecimal.ZERO;
BigDecimal outLatSecond = BigDecimal.ZERO;
if (!FileUtils.isBigDecimal(excelValuesList.get(8))) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_LatDegree") + languageFind.findKey("Device_Excel_NotValidValue"));
}
if (!FileUtils.isBigDecimal(excelValuesList.get(9))) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_LatMinute") + languageFind.findKey("Device_Excel_NotValidValue"));
}
if (!FileUtils.isBigDecimal(excelValuesList.get(10))) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_LatSecond") + languageFind.findKey("Device_Excel_NotValidValue"));
}
outLatDegree = new BigDecimal(excelValuesList.get(8)).abs();
outLatMinute = new BigDecimal(excelValuesList.get(9)).abs();
outLatSecond = new BigDecimal(excelValuesList.get(10)).abs();
repeater.setLatDegreeMinuteSecond(outLatDegree + "°" + outLatMinute + "′" + outLatSecond + "″");
repeater.setLatDegree(BigDecimal.valueOf(repeater.getLatOr() == 0 ? 1 : -1).multiply(outLatDegree));
repeater.setLatMinute(BigDecimal.valueOf(repeater.getLatOr() == 0 ? 1 : -1).multiply(outLatMinute));
repeater.setLatSecond(BigDecimal.valueOf(repeater.getLatOr() == 0 ? 1 : -1).multiply(outLatSecond));
if (outLatDegree.compareTo(BigDecimal.ZERO) < 0 || outLatDegree.compareTo(new BigDecimal(90)) > 0) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_LatDegree") + languageFind.findKey("Device_Excel_LatDegreeRange"));
}
if (outLatMinute.compareTo(BigDecimal.ZERO) < 0 || outLatMinute.compareTo(new BigDecimal(90)) > 0) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_LatMinute") + languageFind.findKey("Device_Excel_LatMinuteRange"));
}
if (outLatSecond.compareTo(BigDecimal.ZERO) < 0 || outLatSecond.compareTo(new BigDecimal(90)) > 0) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_LatSecond") + languageFind.findKey("Device_Excel_LatSecondRange"));
}
BigDecimal lat = getLatitudeDegree(repeater.getLatDegree(), repeater.getLatMinute(), repeater.getLatSecond(), excelValuesList.get(7));
repeater.setLat(lat);
}
if (excelValuesList.get(11) != null && !excelValuesList.get(11).equals("")) {
BigDecimal outElevation = BigDecimal.ZERO;
if (!FileUtils.isBigDecimal(excelValuesList.get(11))) {
isImport = false;
repeater.setImportErrorMessage(languageFind.findKey("Device_ExcelHeader_Elevation") + languageFind.findKey("Device_Excel_NotValidValue"));
} else {
outElevation = new BigDecimal(excelValuesList.get(11));
repeater.setElevation(outElevation);
}
} else {
repeater.setElevation(BigDecimal.ZERO);
}
if (isImport) {
repeaterList.add(repeater);
} else {
listError.add(repeater);
}
}
excelValuesList = new ArrayList<>();
}
inputStream.close();
if (listError.size() > 0) {
return ResponseModel.ofError(listError);
} else {
clientService.importRepeaterLngLat(repeaterList);
}
} catch (Exception e) {
return ResponseModel.ofError(e.getMessage());
}
return ResponseModel.ofSuccess();
}
/**
* 经度 -> 转度分秒
* @param longitude 经度
* @param enumLongitude 东西经
* @return 结果
*/
public BigDecimal[] getLongitudeDegreeMinuteSecond(BigDecimal longitude, String enumLongitude) {
try {
if (longitude.compareTo(BigDecimal.ZERO) == 0) {
return new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO};
}
longitude = longitude.abs();
BigDecimal degree = longitude.setScale(0, RoundingMode.DOWN);
BigDecimal minute = longitude.subtract(degree).multiply(BigDecimal.valueOf(60)).setScale(0, RoundingMode.DOWN);
BigDecimal second = longitude.subtract(degree).multiply(BigDecimal.valueOf(60)).subtract(minute).multiply(BigDecimal.valueOf(60)).setScale(1, RoundingMode.HALF_UP);
if (enumLongitude.equals(EnumLongitudeLatitude.WEST.getValue())) {
degree = degree.negate();
minute = minute.negate();
second = second.negate();
}
return new BigDecimal[]{degree, minute, second};
} catch (Exception ex) {
logger.error("GetLongitudeDegreeMinuteSecond> Exception:{}" + ex.getMessage());
return new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO};
}
}
/**
* 纬度 -> 转度分秒
* @param latitude 纬度
* @param enumLatitude 南北纬
* @return 结果
*/
public BigDecimal[] getLatitudeDegreeMinuteSecond(BigDecimal latitude, String enumLatitude) {
try {
if (latitude.compareTo(BigDecimal.ZERO) == 0) {
return new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO};
}
latitude = latitude.abs();
BigDecimal degree = latitude.setScale(0, RoundingMode.DOWN);
BigDecimal minute = latitude.subtract(degree).multiply(BigDecimal.valueOf(60)).setScale(0, RoundingMode.DOWN);
BigDecimal second = latitude.subtract(degree).multiply(BigDecimal.valueOf(60)).subtract(minute).multiply(BigDecimal.valueOf(60)).setScale(1, RoundingMode.HALF_UP);
if (enumLatitude.equals(EnumLongitudeLatitude.SOUTH.getValue())) {
degree = degree.negate();
minute = minute.negate();
second = second.negate();
}
return new BigDecimal[]{degree, minute, second};
} catch (Exception ex) {
logger.error("getLatitudeDegreeMinuteSecond> Exception:{}" + ex.getMessage());
return new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO};
}
}
public String getCellValueByCell(Cell cell) {
if (cell == null || cell.toString().trim().equals("")) {
return "";
}
String cellValue = "";
switch (cell.getCellType()) {
case NUMERIC: //数字
double numericValue = cell.getNumericCellValue();
if (numericValue == Math.floor(numericValue)) {
// 如果是整数,直接转换为整数
cellValue = String.valueOf((int) numericValue);
} else {
// 否则,使用 DecimalFormat 保留小数部分
DecimalFormat df = new DecimalFormat("#.##"); // 保留两位小数
cellValue = df.format(numericValue);
}
break;
case STRING: //字符串
cellValue = String.valueOf(cell.getStringCellValue());
break;
case BOOLEAN: //Boolean
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case FORMULA: //公式
cellValue = String.valueOf(cell.getCellFormula());
break;
case BLANK: //空值
cellValue = "";
break;
case ERROR: //故障
cellValue = "非法字符";
break;
default:
cellValue = "未知类型";
break;
}
return cellValue;
}
/**
* 度分秒 -> 转经度
* @param degree 度
* @param minute 分
* @param second 秒
* @param enumLongitude 东西经
* @return 结果
*/
public static BigDecimal getLongitudeDegree(BigDecimal degree, BigDecimal minute, BigDecimal second, String enumLongitude) {
try {
if (degree.compareTo(BigDecimal.ZERO) == 0 && minute.compareTo(BigDecimal.ZERO) == 0 && second.compareTo(BigDecimal.ZERO) == 0) {
return BigDecimal.ZERO;
}
degree = degree.abs();
minute = minute.abs();
second = second.abs();
BigDecimal lng = degree.add(minute.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : minute.divide(BigDecimal.valueOf(60), 8, RoundingMode.HALF_UP))
.add(second.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : second.divide(BigDecimal.valueOf(3600), 8, RoundingMode.HALF_UP)).setScale(8, RoundingMode.HALF_UP);
if (enumLongitude.equals(EnumLongitudeLatitude.WEST.getValue())) {
lng = lng.negate();
}
return lng;
} catch (Exception ex) {
logger.error("getLongitudeDegree> Exception:{}" + ex.getMessage());
return BigDecimal.ZERO;
}
}
/**
* 度分秒 -> 转纬度
* @param degree 度
* @param minute 分
* @param second 秒
* @param enumLongitude 南北纬
* @return 结果
*/
public static BigDecimal getLatitudeDegree(BigDecimal degree, BigDecimal minute, BigDecimal second, String enumLongitude) {
try {
if (degree.compareTo(BigDecimal.ZERO) == 0 && minute.compareTo(BigDecimal.ZERO) == 0 && second.compareTo(BigDecimal.ZERO) == 0) {
return BigDecimal.ZERO;
}
degree = degree.abs();
minute = minute.abs();
second = second.abs();
BigDecimal lat = degree.add(minute.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : minute.divide(BigDecimal.valueOf(60), 8, RoundingMode.HALF_UP))
.add(second.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : second.divide(BigDecimal.valueOf(3600), 8, RoundingMode.HALF_UP)).setScale(8, RoundingMode.HALF_UP);
if (enumLongitude.equals(EnumLongitudeLatitude.SOUTH.getValue())) {
lat = lat.negate();
}
return lat;
} catch (Exception ex) {
logger.error("getLatitudeDegree> Exception:{}" + ex.getMessage());
return BigDecimal.ZERO;
}
}
6.Repeater
package com.xnms.data.contract.database.db;
import org.apache.commons.lang3.builder.ToStringBuilder;
import javax.persistence.*;
import java.math.BigDecimal;
@Entity
@Table(name = "repeater")
public class Repeater {
/// Repeater别名
private String alias;
/// 固件版本号
private String firmwaveNo;
/// rcdb版本号
private String rcdbNo;
/// RepeaterMachineNo
@Transient
private String machineNo;
/// Repeater序列号信息
private String serialNo;
/// Repeater IP地址信息
@Column(name = "IPADDRESS")
private String ipAddress = "";
/// Repeater snmpPort 端口:
private Integer snmpPort = 0;
@Transient
private String siteAlias;
/// Repeater站点所属信息
/// 中转台在当前站点顺序
private Integer siteIndex = 0;
/// Repeater所属站点ID
private Integer siteId = 0;
/// 存储Repeater表唯一ID
@Id
private Integer repeaterId = 0;
/// RadioID ID,中转台ID:
private Integer radioId = 0;
//在线状态【0:在线、1:离线】
private Integer status = 0;
/// (告警/离线/在线等状态)
/// 增加中转台状态,用于拓扑地图根据状态是否显示告警图片,(告警/离线/在线等状态)
@Transient
private Integer rptState = 0;
/// 用于在拓扑地图中标识,是否显示该中转台,默认全部显示,只用在勾选了check后才有选择显示
@Transient
private Integer rptChecked = 1;
/// 中转台类型(语音/数据)
/// 0、语音中转台
/// 1、数据中转台
private Integer type;
/// 当前信道名称
private String channelName = "";
/// 当前发射频率
private String currentTxFrequence = "";
/// 当前接收频率
private String currentRxFrequence = "";
/// 系统类型
/// 1:XPT
/// 0:常规
private Integer systemType;
/// IP 互联
private Integer ipConnectPort;
/// 机器名称(RD980S)
private String modelName;
/// 机器编号(RD980-0000000S-000000-U1-0-C)
private String modelNo;
/// 当前工作模式
/// 1、模拟模式
/// 2、数字模式
private String curMode;
/// 中转台类型
/// 0: Single Site(独立基站);
/// 1: Master(主机);
/// 2 : Slave(从机);
/// 3 : Super Master(超级主机);
/// 4: SubMaster(子网主机)
private Integer repeaterSiteType;
/// 中转台的主机IP地址
private String masterIp;
private String recursionMasterIp;
/// 中转台主机端口
private Integer masterPort;
/// QDS IP
private String serverIp;
private String note1; //中转台备注
private String note2; //中转台备注
private String note3; //中转台备注
private Integer deleted;
/// 中转台接入码
private String repeaterAccessCode;
/// (真实)中转台接入码
private String realAccessCode;
/// 1、不同
/// 0、相同
@Transient
private Integer accessCodeEqual;
/// 导入文件序号
@Transient
private String importExcelXH;
/// 导入时错误信息
@Transient
private String importErrorMessage;
/// 经度
private BigDecimal lng = BigDecimal.ZERO;
/// 纬度
private BigDecimal lat = BigDecimal.ZERO;
/// 海拔
private BigDecimal elevation = BigDecimal.ZERO;
/// 0:东经
/// 1:西经
/// 2: 未知
@Transient
private Integer lngOr;
/// 0:北纬
/// 1:南纬
/// 2:未知
@Transient
private Integer latOr;
/// 经度(度分秒)
@Transient
private String lngDegreeMinuteSecond;
/// 经度(度)
private BigDecimal lngDegree;
/// 经度(分)
private BigDecimal lngMinute;
/// 经度(秒)
private BigDecimal lngSecond;
/// 纬度(度分秒)
@Transient
private String latDegreeMinuteSecond;
/// 纬度(度)
private BigDecimal latDegree;
/// 纬度(分)
private BigDecimal latMinute;
/// 纬度(秒)
private BigDecimal latSecond;
/// SNMP 版本
private String repeaterSnmpVersion = "0";
/// 中转台是否采用SNMPv3协议【0:否、1:是】
@Column(name = "IS_SNMPV3")
private String isSnmpV3 = "0";
/// USM USER
@Column(name = "SNMPV3_USM_USER")
private String snmpV3UsmUser = "admin";
/// 安全等级
/// 0:no AUTH,no Priv
/// 1:AUTH,no Priv
/// 2:AUTH,Priv
@Column(name = "SNMPV3_SECURITY_LEVEL")
private String snmpV3SecurityLevel = "0";
/// 鉴权
/// 公钥类型,鉴权【None、MD5、SHA1】
@Column(name = "SNMPV3_AUTH_ALGORITHM")
private String snmpV3AuthAlgorithm = "None";
/// 鉴权密码
/// 公钥密码
@Column(name = "SNMPV3_AUTH_PASSWORD")
private String snmpV3AuthPassword;
/// 加密
/// 私钥类型,加密【None、DES、AES】
@Column(name = "SNMPV3_PRIVACY_ALGORITHM")
private String snmpV3PrivacyAlgorithm = "None";
/// 加密密码
/// 私钥密码
@Column(name = "SNMPV3_PRIVACY_PASSWORD")
private String snmpV3PrivacyPassword;
/// 手填
@Column(name = "SNMPV3_CONTEXT_NAME")
private String snmpV3ContextName;
@Transient
private Integer Index;
public Integer getIndex() {
return Index;
}
public void setIndex(Integer index) {
Index = index;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public String getFirmwaveNo() {
return firmwaveNo;
}
public void setFirmwaveNo(String firmwaveNo) {
this.firmwaveNo = firmwaveNo;
}
public String getRcdbNo() {
return rcdbNo;
}
public void setRcdbNo(String rcdbNo) {
this.rcdbNo = rcdbNo;
}
public String getMachineNo() {
return machineNo;
}
public void setMachineNo(String machineNo) {
this.machineNo = machineNo;
}
public String getSerialNo() {
return serialNo;
}
public void setSerialNo(String serialNo) {
this.serialNo = serialNo;
}
public String getIpAddress() {
return ipAddress;
}
public void setIpAddress(String ipAddress) {
this.ipAddress = ipAddress;
}
public Integer getSnmpPort() {
return snmpPort;
}
public void setSnmpPort(Integer snmpPort) {
this.snmpPort = snmpPort;
}
public String getSiteAlias() {
return siteAlias;
}
public void setSiteAlias(String siteAlias) {
this.siteAlias = siteAlias;
}
public Integer getSiteIndex() {
return siteIndex;
}
public void setSiteIndex(Integer siteIndex) {
this.siteIndex = siteIndex;
}
public Integer getSiteId() {
return siteId;
}
public void setSiteId(Integer siteId) {
this.siteId = siteId;
}
public Integer getRepeaterId() {
return repeaterId;
}
public void setRepeaterId(Integer repeaterId) {
this.repeaterId = repeaterId;
}
public Integer getRadioId() {
return radioId;
}
public void setRadioId(Integer radioId) {
this.radioId = radioId;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getRptState() {
return rptState;
}
public void setRptState(Integer rptState) {
this.rptState = rptState;
}
public Integer getRptChecked() {
return rptChecked;
}
public void setRptChecked(Integer rptChecked) {
this.rptChecked = rptChecked;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public String getChannelName() {
return channelName;
}
public void setChannelName(String channelName) {
this.channelName = channelName;
}
public String getCurrentTxFrequence() {
return currentTxFrequence;
}
public void setCurrentTxFrequence(String currentTxFrequence) {
this.currentTxFrequence = currentTxFrequence;
}
public String getCurrentRxFrequence() {
return currentRxFrequence;
}
public void setCurrentRxFrequence(String currentRxFrequence) {
this.currentRxFrequence = currentRxFrequence;
}
public Integer getSystemType() {
return systemType;
}
public void setSystemType(Integer systemType) {
this.systemType = systemType;
}
public Integer getIpConnectPort() {
return ipConnectPort;
}
public void setIpConnectPort(Integer ipConnectPort) {
this.ipConnectPort = ipConnectPort;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public String getModelNo() {
return modelNo;
}
public void setModelNo(String modelNo) {
this.modelNo = modelNo;
}
public String getCurMode() {
return curMode;
}
public void setCurMode(String curMode) {
this.curMode = curMode;
}
public Integer getRepeaterSiteType() {
return repeaterSiteType;
}
public void setRepeaterSiteType(Integer repeaterSiteType) {
this.repeaterSiteType = repeaterSiteType;
}
public String getMasterIp() {
return masterIp;
}
public void setMasterIp(String masterIp) {
this.masterIp = masterIp;
}
public Integer getMasterPort() {
return masterPort;
}
public void setMasterPort(Integer masterPort) {
this.masterPort = masterPort;
}
public String getServerIp() {
return serverIp;
}
public void setServerIp(String serverIp) {
this.serverIp = serverIp;
}
public String getNote1() {
return note1;
}
public void setNote1(String note1) {
this.note1 = note1;
}
public String getNote2() {
return note2;
}
public void setNote2(String note2) {
this.note2 = note2;
}
public String getNote3() {
return note3;
}
public void setNote3(String note3) {
this.note3 = note3;
}
public Integer getDeleted() {
return deleted;
}
public void setDeleted(Integer deleted) {
this.deleted = deleted;
}
public String getRepeaterAccessCode() {
return repeaterAccessCode;
}
public void setRepeaterAccessCode(String repeaterAccessCode) {
this.repeaterAccessCode = repeaterAccessCode;
}
public String getRealAccessCode() {
return realAccessCode;
}
public void setRealAccessCode(String realAccessCode) {
this.realAccessCode = realAccessCode;
}
public Integer getAccessCodeEqual() {
return accessCodeEqual;
}
public void setAccessCodeEqual(Integer accessCodeEqual) {
this.accessCodeEqual = accessCodeEqual;
}
public String getImportExcelXH() {
return importExcelXH;
}
public void setImportExcelXH(String importExcelXH) {
this.importExcelXH = importExcelXH;
}
public String getImportErrorMessage() {
return importErrorMessage;
}
public void setImportErrorMessage(String importErrorMessage) {
this.importErrorMessage = importErrorMessage;
}
public BigDecimal getLng() {
return lng;
}
public void setLng(BigDecimal lng) {
this.lng = lng;
}
public BigDecimal getLat() {
return lat;
}
public void setLat(BigDecimal lat) {
this.lat = lat;
}
public BigDecimal getElevation() {
return elevation;
}
public void setElevation(BigDecimal elevation) {
this.elevation = elevation;
}
public Integer getLngOr() {
return lngOr;
}
public void setLngOr(Integer lngOr) {
this.lngOr = lngOr;
}
public Integer getLatOr() {
return latOr;
}
public void setLatOr(Integer latOr) {
this.latOr = latOr;
}
public String getLngDegreeMinuteSecond() {
return lngDegreeMinuteSecond;
}
public void setLngDegreeMinuteSecond(String lngDegreeMinuteSecond) {
this.lngDegreeMinuteSecond = lngDegreeMinuteSecond;
}
public BigDecimal getLngDegree() {
return lngDegree;
}
public void setLngDegree(BigDecimal lngDegree) {
this.lngDegree = lngDegree;
}
public BigDecimal getLngMinute() {
return lngMinute;
}
public void setLngMinute(BigDecimal lngMinute) {
this.lngMinute = lngMinute;
}
public BigDecimal getLngSecond() {
return lngSecond;
}
public void setLngSecond(BigDecimal lngSecond) {
this.lngSecond = lngSecond;
}
public String getLatDegreeMinuteSecond() {
return latDegreeMinuteSecond;
}
public void setLatDegreeMinuteSecond(String latDegreeMinuteSecond) {
this.latDegreeMinuteSecond = latDegreeMinuteSecond;
}
public BigDecimal getLatDegree() {
return latDegree;
}
public void setLatDegree(BigDecimal latDegree) {
this.latDegree = latDegree;
}
public BigDecimal getLatMinute() {
return latMinute;
}
public void setLatMinute(BigDecimal latMinute) {
this.latMinute = latMinute;
}
public BigDecimal getLatSecond() {
return latSecond;
}
public void setLatSecond(BigDecimal latSecond) {
this.latSecond = latSecond;
}
public String getRepeaterSnmpVersion() {
return repeaterSnmpVersion;
}
public void setRepeaterSnmpVersion(String repeaterSnmpVersion) {
this.repeaterSnmpVersion = repeaterSnmpVersion;
}
public String getIsSnmpV3() {
return isSnmpV3;
}
public void setIsSnmpV3(String isSnmpV3) {
this.isSnmpV3 = isSnmpV3;
}
public String getSnmpV3UsmUser() {
return snmpV3UsmUser;
}
public void setSnmpV3UsmUser(String snmpV3UsmUser) {
this.snmpV3UsmUser = snmpV3UsmUser;
}
public String getSnmpV3SecurityLevel() {
return snmpV3SecurityLevel;
}
public void setSnmpV3SecurityLevel(String snmpV3SecurityLevel) {
this.snmpV3SecurityLevel = snmpV3SecurityLevel;
}
public String getSnmpV3AuthAlgorithm() {
return snmpV3AuthAlgorithm;
}
public void setSnmpV3AuthAlgorithm(String snmpV3AuthAlgorithm) {
this.snmpV3AuthAlgorithm = snmpV3AuthAlgorithm;
}
public String getSnmpV3AuthPassword() {
return snmpV3AuthPassword;
}
public void setSnmpV3AuthPassword(String snmpV3AuthPassword) {
this.snmpV3AuthPassword = snmpV3AuthPassword;
}
public String getSnmpV3PrivacyAlgorithm() {
return snmpV3PrivacyAlgorithm;
}
public void setSnmpV3PrivacyAlgorithm(String snmpV3PrivacyAlgorithm) {
this.snmpV3PrivacyAlgorithm = snmpV3PrivacyAlgorithm;
}
public String getSnmpV3PrivacyPassword() {
return snmpV3PrivacyPassword;
}
public void setSnmpV3PrivacyPassword(String snmpV3PrivacyPassword) {
this.snmpV3PrivacyPassword = snmpV3PrivacyPassword;
}
public String getSnmpV3ContextName() {
return snmpV3ContextName;
}
public void setSnmpV3ContextName(String snmpV3ContextName) {
this.snmpV3ContextName = snmpV3ContextName;
}
public String getRecursionMasterIp() {
return recursionMasterIp;
}
public void setRecursionMasterIp(String recursionMasterIp) {
this.recursionMasterIp = recursionMasterIp;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
7.FileUtils
package com.xnms.client.service.utils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.math.BigDecimal;
public class FileUtils {
private static final Logger logger = LoggerFactory.getLogger(FileUtils.class);
/**
* 获取文件后缀扩展名
* @param fileName 文件名
* @return 结果
*/
public static String getFileExtension(String fileName) {
int index = fileName.lastIndexOf(".");
if (index > 0 && index < fileName.length() - 1) {
return fileName.substring(index);
}
return "";
}
/**
* 获取excel的列数
* @param file 文件
* @return 结果
*/
public static int getExcelColumnCount(MultipartFile file) {
int columnCount = 0;
String fileName = file.getOriginalFilename();
Workbook workbook = null;
try {
InputStream inputStream = file.getInputStream();
if (fileName.indexOf(".xlsx") > 0) {
workbook = new XSSFWorkbook(inputStream);
} else if (fileName.indexOf(".xls") > 0) {
workbook = new HSSFWorkbook(inputStream);
}
Sheet sheet = workbook.getSheetAt(0);
Row firstRow = sheet.getRow(0);
if (firstRow != null) {
columnCount = firstRow.getPhysicalNumberOfCells();
}
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
logger.error("getExcelColumnCount-Exception:{}", e.getMessage());
}
return columnCount;
}
/**
* 校验字符串数值是否是BigDecimal类型
* @param str 字符串数值
* @return 结果
*/
public static boolean isBigDecimal(String str) {
try {
new BigDecimal(str);
return true;
} catch (Exception e) {
return false;
}
}
}
8.ResponseModel
package com.xnms.client.service.controller.common;
import com.xnms.data.contract.database.db.Pagination;
public class ResponseModel<T> {
private int code; // 状态码,表示请求是否成功
private String msg; // 信息,通常用于描述错误或操作成功的提示
private T data; // 数据,通常是请求返回的具体内容
private Pagination pagination; // 分页参数,封装分页相关的数据
// 私有构造函数
private ResponseModel(int code, String msg, T data, Pagination pagination) {
this.code = code;
this.msg = msg;
this.data = data;
this.pagination = pagination;
}
// 默认构造函数
private ResponseModel() {
this.code = ConstantsCode.HTTP_OK; // 默认 code 为 200
this.msg = "成功"; // 默认 msg 为 "成功"
this.pagination = null; // 默认 pagination 为 null
}
// 静态方法:只返回数据和分页信息
public static <T> ResponseModel<T> of(T data, Pagination pagination) {
ResponseModel<T> response = new ResponseModel<>();
response.setData(data);
response.setPagination(pagination);
return response;
}
// 静态方法:返回数据和分页信息,默认成功信息
public static <T> ResponseModel<T> ofSuccess(T data, Pagination pagination) {
return new ResponseModel<>(ConstantsCode.HTTP_OK, "成功", data, pagination);
}
public static <T> ResponseModel<T> ofSuccess(T data, String msg, Pagination pagination) {
return new ResponseModel<>(ConstantsCode.HTTP_OK, msg, data, pagination);
}
// 静态方法:返回数据和成功信息,分页信息为空
public static <T> ResponseModel<T> ofSuccess(T data) {
return new ResponseModel<>(ConstantsCode.HTTP_OK, "成功", data, null);
}
public static <T> ResponseModel<T> ofSuccess() {
return new ResponseModel<>(ConstantsCode.HTTP_OK, "成功", null, null);
}
public static <T> ResponseModel<T> ofError(T data) {
return new ResponseModel<>(ConstantsCode.HTTP_INTERNAL_SERVER_ERROR, "失败", data, null);
}
// 静态方法:返回错误信息
public static <T> ResponseModel<T> ofError(String msg) {
return new ResponseModel<>(ConstantsCode.HTTP_INTERNAL_SERVER_ERROR, msg, null, null);
}
public static <T> ResponseModel<T> ofError(int code, String msg) {
return new ResponseModel<>(code, msg, null, null);
}
// 静态方法:只返回分页信息,数据为空
public static <T> ResponseModel<T> ofPagination(Pagination pagination) {
return new ResponseModel<>(ConstantsCode.HTTP_OK, "成功", null, pagination);
}
// 静态方法:无数据,无分页,仅返回状态码和信息
public static <T> ResponseModel<T> ofStatus(int code, String msg) {
return new ResponseModel<>(code, msg, null, null);
}
// Getter 和 Setter 方法
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Pagination getPagination() {
return pagination;
}
public void setPagination(Pagination pagination) {
this.pagination = pagination;
}
}
9.EnumLongitudeLatitude
package com.xnms.client.service.Utility;
//经纬度枚举
public enum EnumLongitudeLatitude {
NORTH("N"),
SOUTH("S"),
EAST("E"),
WEST("W"),
UnKnown("");
private String value;
public String getValue() {
return value;
}
EnumLongitudeLatitude(String value) {
this.value = value;
}
}
10.词条
CauseOfImportFailure=导入失败原因
ImportFailedData=导入数据失败
Device_ExcelHeader_No=序号
Device_ExcelHeader_Alias=别名
Device_ExcelHeader_SerialNumber=序列号
Device_ExcelHeader_EastWestLng=东西经
Device_ExcelHeader_Lng=经度
Device_ExcelHeader_SouthNorthLat=南北纬
Device_ExcelHeader_Lat=纬度
Device_ExcelHeader_Elevation=海拔
Device_ExcelHeader_LngDegree=经度(度)
Device_ExcelHeader_LngMinute=经度(分)
Device_ExcelHeader_LngSecond=经度(秒)
Device_ExcelHeader_LatDegree=纬度(度)
Device_ExcelHeader_LatMinute=纬度(分)
Device_ExcelHeader_LatSecond=纬度(秒)
Device_Excel_ColumnIsInUse=文件被占用
Device_Excel_ColumnIsNotExits=模板格式错误
Device_Excel_SerialNumberIsNotEmpty=不能为空
Device_Excel_IsNotExits_IsNotAuthority=不存在或没有权限
Device_Excel_NotValidValue=不是有效数值
Device_Excel_NotValidLngOr=值为E或W
Device_Excel_NotValidLatOr=值为S或N
Device_Excel_LngRange=超出经度范围0-180
Device_Excel_LngDegreeRange=超出经度(度)范围 0-180
Device_Excel_LngMinuteRange=超出经度(分)范围 0-60
Device_Excel_LngSecondRange=超出经度(秒)范围 0-60
Device_Excel_LatRange=超出纬度范围0-90
Device_Excel_LatDegreeRange=超出纬度(度)范围 0-90
Device_Excel_LatMinuteRange=超出纬度(分)范围 0-60
Device_Excel_LatSecondRange=超出纬度(秒)范围 0-60
Device_Excel_RepeatData_ImportFailure=重复数据,导入失败.
Device_Excel_RepeatData_1000MaximumData=最大数据1000条
Device_Excel_DataNotAllowedToImport=未找到可以导入的数据
四、注意点
注意点1:
页面设备管理哪里可以直接手动修改经纬度和高海拔,该设计是考虑当你想单一修改个别设备时可以直接修改保存,而无需导入excel去修改。
注意点2:
点击“导入”按钮时可以看到,允许下载2套不同模版。
注意点3:
导入excel如果校验成功,则直接弹窗提示“导入成功”,或者其他词条;而有部分校验失败的地方则展示所有错误信息,方便精确知道哪行信息未通过。
注意点4:
上传经纬度(度数)excel时同步更新度、分、秒字段;同理上传经纬度(度分秒)excel时同步更新经纬度字段;因为实体有字段会动态拼接“度数字符串”和“度分秒字符串”返回前端进行展示。
注意点5:
- 经度 -> 转度分秒 => 对应方法getLongitudeDegreeMinuteSecond()
- 纬度 -> 转度分秒 => 对应方法getLatitudeDegreeMinuteSecond()
- 度分秒 -> 转经度 => 对应方法getLongitudeDegree()
- 度分秒 -> 转纬度 => 对应方法getLatitudeDegree()
本人其他相关文章链接
1.vue3 开发电子地图功能
2.vue java 实现大地图切片上传
3.java导入excel更新设备经纬度度数或者度分秒
4.快速上手Vue3国际化 (i18n)