当前位置: 首页 > news >正文

业务:资产管理功能

在这里插入图片描述

文章目录

  • 一、项目背景
    • 1.1概述
    • 1.2编写目的
  • 二、注意点说明
  • 三、页面效果
  • 四、代码
    • AssetManagementController
    • HwinfoAssetManagement
    • HwinfoAssetManagementService
    • HwinfoAssetManagementServiceImpl
    • HwinfoAssetManagementMapper
    • HwinfoAssetManagementMapper.xml
    • SfpAssetManagement
    • SfpAssetManagementService
    • SfpAssetManagementServiceImpl
    • SfpAssetManagementMapper
    • SfpAssetManagementMapper.xml
    • 建表sql

一、项目背景

1.1概述

本设计文档旨在定义一个页面,用于展示和管理资产信息。该页面将整合多种资产类型的信息,包括 FAU(风扇板)、BPB(基带板)、MCB(主控板)、PSU(电源板)、EIB(环境监控板)、RRU(远程射频单元) 和 BBU。通过一个集中化的界面,用户能够高效地查看、管理和分析这些资产的数据。

1.2编写目的

  1. 资产信息整合:提供一个集中的平台,将各种资产(FAU、BPB、MCB、PSU、EIB、RRU 和 BBU)的信息整合在一个页面上,以便于用户能够快速访问和管理这些资产的详细数据。
  2. 用户友好的界面:设计一个直观且用户友好的界面,使用户能够轻松地查看资产状态、规格、位置等信息。通过清晰的布局和导航,提高用户的操作效率和体验。
  3. 定时数据更新:确保资产信息能够定时更新,反映最新的状态和数据。这包括资产的运行状况、维护记录、故障警告等,帮助用户及时做出决策。
  4. 增强数据可视化:通过图表、表格和其他可视化组件,提供资产信息的直观展示,使用户能够快速理解和分析数据,支持数据驱动的决策。
  5. 支持资产管理功能:实现资产的查询基本操作功能,同时支持按条件过滤,支持资产的全面管理和维护。
  6. 提升效率与准确性:通过自动化的数据更新和管理流程,减少人工操作的错误,提高资产管理的效率和准确性。

二、注意点说明

注意点1:功能除了增删改查,还支持手动自动同步更新按钮、导出资产信息excel功能
注意点2:资产统计分:硬件资产、光模块资产。
注意点3:有手动同步按钮和自动同步逻辑,硬件资产自动同步每天1:20:00自动同步,光模块资产自动同步每天1:30:00自动同步。
注意点4:由于需要并行执行命令查询入库,为了用户体验性,采用CountDownLatch监控多线程并行结束时刻,再接口返回处理结果。

三、页面效果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、代码

AssetManagementController

package com.hero.lte.ems.monitor.controller;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hero.lte.ems.common.tools.CustomStringUtils;
import com.hero.lte.ems.common.tools.LocaleUtil;
import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.mid.service.IBusinessNeService;
import com.hero.lte.ems.mml.entity.MMLRequest;
import com.hero.lte.ems.mml.entity.MMLResponse;
import com.hero.lte.ems.mml.service.IMMLSenderService;
import com.hero.lte.ems.monitor.constants.AssetConst;
import com.hero.lte.ems.monitor.entity.HwinfoAssetManagement;
import com.hero.lte.ems.monitor.entity.SfpAssetManagement;
import com.hero.lte.ems.monitor.service.HwinfoAssetManagementService;
import com.hero.lte.ems.monitor.service.SfpAssetManagementService;
import com.hero.lte.ems.monitor.util.ConstantUtils;
import com.hero.lte.ems.sysconf.model.SysInfo;
import com.hero.lte.ems.topo.entity.Equipment;
import com.hero.lte.ems.topo.service.IEquipmentService;
import com.hero.lte.ems.topo.utils.StringUtils;
import com.hero.lte.ems.vm.newapi.model.VersionQueryClientResp;
import com.hero.lte.ems.vm.newapi.service.IVersionNewQueryService;
import io.swagger.annotations.Api;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.MediaType;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;/*** @author l22898*/
@Api(value = "MonitorTaskController",tags={"资产管理"})
@RestController
@RequestMapping("/lte/ems/sys/assetManagement/")
@EnableScheduling
public class AssetManagementController {private static final Logger logger = LoggerFactory.getLogger(AssetManagementController.class);@Resourceprivate IEquipmentService equipmentService;@Autowiredprivate HwinfoAssetManagementService hwinfoAssetManagementService;@Autowiredprivate SfpAssetManagementService sfpAssetManagementService;@Autowiredprivate IBusinessNeService businessNeService;@Resourceprivate IMMLSenderService mmlSender;@Autowiredprivate SysInfo sysInfo;@Resourceprivate IVersionNewQueryService versionNewQueryService;private final ExecutorService executorObserveInfo = Executors.newFixedThreadPool(ConstantUtils.threadNum());/*** 查询硬件资产信息列表* @param page page* @return 结果*/@ResponseBody@RequestMapping(value = "queryHwinfoAssetManagementList", method = RequestMethod.GET)public Page<HwinfoAssetManagement> queryHwinfoAssetManagementList(HwinfoAssetManagement hwinfoAssetManagement, Page<HwinfoAssetManagement> page){page.setParam(hwinfoAssetManagement);return hwinfoAssetManagementService.queryHwinfoAssetManagementList(page);}/*** 点击“资产信息反构”按钮,触发立即执行更新数据*/@ResponseBody@RequestMapping(value = "syncHwinfoAssetManagementStore", method = RequestMethod.GET)public void syncHwinfoAssetManagementStore(){hwinfoAssetManagementStore();}/** 导出硬件资产信息数据*/@ResponseBody@RequestMapping(value = "exportHwinfoAssetManagementList", method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON,produces = MediaType.APPLICATION_JSON)public void exportHwinfoAssetManagementList(@RequestBody HwinfoAssetManagement hwinfoAssetManagement, HttpServletResponse response){List<HwinfoAssetManagement> list = hwinfoAssetManagementService.queryHwinfoAssetManagementList(hwinfoAssetManagement);Locale local = LocaleUtil.getLocale(sysInfo.getLocale());Boolean isChinese = "zh".equalsIgnoreCase(local.getLanguage());String[] headers=new String[]{AssetConst.en_nodeId, AssetConst.en_deviceName,AssetConst.en_assetType,AssetConst.en_localtion,AssetConst.en_presentState,AssetConst.en_sn,AssetConst.en_vid,AssetConst.en_version};if(isChinese){headers=new String[]{AssetConst.zh_nodeId, AssetConst.zh_deviceName,AssetConst.zh_assetType,AssetConst.zh_localtion,AssetConst.zh_presentState,AssetConst.zh_sn,AssetConst.zh_vid,AssetConst.zh_version};}XSSFWorkbook wb = new XSSFWorkbook();XSSFSheet sheet = wb.createSheet(isChinese ? AssetConst.zh_hwinfoAssetList :AssetConst.en_hwinfoAssetList);XSSFRow row = sheet.createRow(0);//行XSSFCell cell  = null;// 创建单元格样式XSSFCellStyle style = wb.createCellStyle();XSSFFont font = wb.createFont();font.setBold(true); // 设置字体加粗style.setFont(font);//逐个设置标题样式for (int i = 0; i < headers.length; i++) {cell = row.createCell(i);cell.setCellValue(headers[i]);cell.setCellStyle(style);}int n = 1;for (HwinfoAssetManagement item : list) {//循环写入值XSSFRow rowN = sheet.createRow(n);//行for (int i = 0; i < headers.length; i++) {cell = rowN.createCell(i);cell.setCellValue(switchValue(i,item, isChinese));}n++;}sheet.setColumnWidth(1, 4000);sheet.setColumnWidth(2, 4000);sheet.setColumnWidth(3, 8000);sheet.setColumnWidth(4, 4000);sheet.setColumnWidth(5, 4000);sheet.setColumnWidth(6, 4000);sheet.setColumnWidth(7, 4000);String fileName = isChinese ? AssetConst.zh_hwinfo_file_name :AssetConst.en_hwinfo_file_name;String sysPath =  System.getProperty("eam.conf")+File.separator+"excel";String excelPath =sysPath+File.separator+fileName;File dir = new File(sysPath);if(!dir.exists()  && !dir.isDirectory()){dir.mkdir();}//生成文件并返回前端try{FileOutputStream fileOut = new FileOutputStream(excelPath);wb.write(fileOut);fileOut.flush();fileOut.close();File file = new File(excelPath);InputStream ins = new FileInputStream(file);BufferedInputStream bins = new BufferedInputStream(ins);// 放到缓冲流里面OutputStream outs = response.getOutputStream();// 获取文件输出IO流BufferedOutputStream bouts = new BufferedOutputStream(outs);response.setContentType("application/x-download");// 设置response内容的类型response.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(System.currentTimeMillis()/1000+"_"+fileName, "UTF-8"));// 设置头部信息int bytesRead = 0;byte[] buffer = new byte[8192];//开始向网络传输文件流while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {bouts.write(buffer, 0, bytesRead);}bouts.flush();// 这里一定要调用flush()方法ins.close();bins.close();outs.close();}catch(Exception e){e.printStackTrace();}}@Scheduled(cron = "0 20 1 * * ?")public void hwinfoAssetManagementStore() {try {hwinfoAssetManagementService.truncateHwinfoAssetManagement();List<Equipment> list = equipmentService.queryAllEquipment(null);//过滤掉不在线的设备,不在线的设备不能发送mmlList<Equipment> equipments = list.stream().filter(equipment -> {return businessNeService.qryNodeLinkStatus(equipment.getId()) == 1;}).collect(Collectors.toList());CountDownLatch countDownLatch = new CountDownLatch(equipments.size());for (Equipment equipment : equipments) {executorObserveInfo.execute(new Runnable() {@Overridepublic void run() {List<HwinfoAssetManagement> assetList = new ArrayList<>();queryFanInfo(equipment, assetList);queryBpbInfo(equipment, assetList);queryMcbInfo(equipment, assetList);queryPsuInfo(equipment, assetList);queryEibInfo(equipment, assetList);queryRruInfo(equipment, assetList);if (assetList.size() > 0) {hwinfoAssetManagementService.batchInsertHwinfoAssetManagement(assetList);}countDownLatch.countDown();}});}boolean flag = countDownLatch.await(5, TimeUnit.MINUTES);logger.info("hwinfoAssetManagementStore CountDownLatch await result:{}", flag);} catch (Exception e) {logger.error("hwinfoAssetManagementStore an exception occurred when trying to await countDownLatch", e);}}/*** MML查询风扇FAN信息* MML结果长这样:data=[{"MessageContent":"[0-0-0] Present State:  Present"}], neid=null]* @param equipment 设备*/public void queryFanInfo(Equipment equipment, List<HwinfoAssetManagement> assetList) {logger.info("-queryFanInfo-equipmentId:{},assetList:{}", equipment.getId(), assetList);String presentValue = "";String location = "";String presentStateCmd = "SHW CU;" ;Map<Integer, MMLResponse> presentStateResult = sendMMLCmd(presentStateCmd, equipment.getId());MMLResponse presentStateResponse = presentStateResult.get(equipment.getId());List<JSONObject> presentStateDatas = presentStateResponse.getData();if(presentStateDatas != null && !presentStateDatas.isEmpty()) {for (JSONObject jsonObject : presentStateDatas) {presentValue = (String) jsonObject.get("Present");String shNum = (String) jsonObject.get("ShNum");String chNum = (String) jsonObject.get("ChNum");String slNum = (String) jsonObject.get("SlNum");location = "cabinet=" + shNum + ",frame=" + chNum + ",slot=" + slNum;}}if (presentValue.equals("Present")) {String shNum = "";String chNum = "";String slNum = "";String key = "";String value = "";String cmdCell = "DSP HwInfo:HwType = FAN" ;Map<Integer, MMLResponse> stringMMLResponseMapCmdCell = sendMMLCmd(cmdCell, equipment.getId());logger.info("-queryFanInfo-mml command={},neId={},result={}", cmdCell, equipment.getId(),stringMMLResponseMapCmdCell.toString());MMLResponse responseserCell = stringMMLResponseMapCmdCell.get(equipment.getId());List<JSONObject> datasCell = responseserCell.getData();if(datasCell != null && !datasCell.isEmpty()){for (JSONObject json : datasCell) {if (json.containsKey("MessageContent") && json.getString("MessageContent") != null) {String messageContent = json.getString("MessageContent");if (messageContent.contains("[") && messageContent.contains("]")) {Pattern pattern = Pattern.compile("\\[(\\d)+-(\\d)+-(\\d)+\\]\\s*(.+?): \\s*(.+)\\s*(?:\\n|$)");Matcher matcher = pattern.matcher(messageContent);HwinfoAssetManagement hwinfoAssetManagement = new HwinfoAssetManagement();while (matcher.find()) {shNum = matcher.group(1);chNum = matcher.group(2);slNum = matcher.group(3);key = matcher.group(4);value = matcher.group(5);location = "cabinet=" + shNum + ",frame=" + chNum + ",slot=" + slNum;if (org.springframework.util.StringUtils.isEmpty(value)) {continue;}if (CustomStringUtils.containsInvalidCharacters(value)) {continue;}switch (key) {case "SN":hwinfoAssetManagement.setSn(value);break;case "VID":hwinfoAssetManagement.setVid(value);break;default:logger.error("-queryFanInfo no match key:{}", key);break;}}hwinfoAssetManagement.setPresentState("1");hwinfoAssetManagement.setNodeId(equipment.getId());hwinfoAssetManagement.setNodeName(equipment.getName());hwinfoAssetManagement.setAssetType("FAN");hwinfoAssetManagement.setLocaltion(location);assetList.add(hwinfoAssetManagement);}}}}else{logger.info("-queryFanInfo mml command={},neId={},没有data数据", cmdCell, equipment);}} else {HwinfoAssetManagement hwinfoAssetManagement = new HwinfoAssetManagement();hwinfoAssetManagement.setPresentState("0");hwinfoAssetManagement.setNodeId(equipment.getId());hwinfoAssetManagement.setNodeName(equipment.getName());hwinfoAssetManagement.setAssetType("FAN");hwinfoAssetManagement.setLocaltion(location);assetList.add(hwinfoAssetManagement);}logger.info("-queryFanInfo-end!-assetList:{}", assetList);}/*** 查询BPB单板信息* @param equipment equipment* @param assetList assetList*/private void queryBpbInfo(Equipment equipment, List<HwinfoAssetManagement> assetList){logger.info("-queryBpbInfo-equipment:{},assetList:{}", equipment, assetList);String shNum = "";String chNum = "";String slNum = "";String revisonVer="";String serial ="";String location = "";String presentValue = "";//生成查询BPB mml指令String mmlbbunamecmd="SHW BPB;";Map<Integer, MMLResponse> result = sendMMLCmd(mmlbbunamecmd, equipment.getId());logger.info("mml command={},neId={},result={}", mmlbbunamecmd, equipment.getId(),result.toString());MMLResponse response = result.get(equipment.getId());List<JSONObject> datas = response.getData();if(datas != null && !datas.isEmpty()){for (JSONObject jsonObject : datas) {presentValue = jsonObject.get("Present").toString();shNum = (String) jsonObject.get("ShNum");chNum = (String) jsonObject.get("ChNum");slNum = (String) jsonObject.get("SlNum");location = "cabinet=" + shNum + ",frame=" + chNum + ",slot=" + slNum;if (presentValue.equals("Present")) {Integer slotNo = Integer.parseInt(jsonObject.get("SlNum").toString());//生成查询BPB series mml指令String mmlbpbserisecmd="DSP LBPElableInfo : " + "slotNo = " + slotNo+";";Map<Integer, MMLResponse> bpbseresult = sendMMLCmd(mmlbpbserisecmd, equipment.getId());logger.info("mml command={},neId={},result={}", bpbseresult, equipment.getId(),bpbseresult.toString());MMLResponse bpbseriseresultresponse = bpbseresult.get(equipment.getId());List<JSONObject> bpbserisedatas = bpbseriseresultresponse.getData();if(bpbserisedatas !=null && !bpbserisedatas.isEmpty()){Optional<JSONObject> bpbseriseData = bpbserisedatas.stream().findFirst();if(bpbseriseData.isPresent()){JSONObject jsonObjectbpb = bpbseriseData.get();serial = StringUtils.extractedString(jsonObjectbpb.toString(), "boardSerial:", "boardProductDate");if (StringUtils.isGarbage(serial)) serial = "";}}else{serial = "";logger.info("mml command={},neId={},没有data数据", bpbseresult, equipment.getId());}// 底软版本号String mmlbpbRevisioncmd="SHW"+" "+"eSWM"+";";Map<Integer, MMLResponse> bpbRevisionResult = sendMMLCmd(mmlbpbRevisioncmd, equipment.getId());logger.info("mml mmlbpbRevisioncmd command={},neId={},result={}", mmlbpbRevisioncmd, equipment.getId(),bpbRevisionResult.toString());MMLResponse bpbRevisionResponse = bpbRevisionResult.get(equipment.getId());List<JSONObject> bpbRevisionDatas = bpbRevisionResponse.getData();if(bpbRevisionDatas !=null && !bpbRevisionDatas.isEmpty()){Optional<JSONObject> bpbRevisionData = bpbRevisionDatas.stream().findFirst();if(bpbRevisionData.isPresent()){JSONObject jsonObj = bpbRevisionData.get();JSONObject eSWMJsonObject = JSONObject.parseObject(jsonObj.get("MessageContent").toString());// BoardListJSONArray boardList = (JSONArray) eSWMJsonObject.get("BoardList");String slNumCopy = slNum;Optional<String> optional = boardList.stream().filter(filterItem -> slNumCopy.equals(((JSONObject) filterItem).getString("slNum"))).flatMap(flatItem -> {JSONArray swList = ((JSONObject) flatItem).getJSONArray("SwList");return swList.stream().filter(sw -> "1".equals(((JSONObject) sw).get("swtype").toString())).map(sw -> ((JSONObject) sw).get("swver").toString());}).findFirst();if (optional.isPresent()) {revisonVer =optional.get();} else {revisonVer = "";}}}else{logger.info("mml bpbRevisionDatas command={},neId={},没有data数据", mmlbbunamecmd, equipment.getId());}HwinfoAssetManagement hwinfoAssetManagement = new HwinfoAssetManagement();hwinfoAssetManagement.setPresentState("1");hwinfoAssetManagement.setNodeId(equipment.getId());hwinfoAssetManagement.setNodeName(equipment.getName());hwinfoAssetManagement.setAssetType("BPB");hwinfoAssetManagement.setLocaltion(location);hwinfoAssetManagement.setSn(serial);hwinfoAssetManagement.setVid("11500000082765");hwinfoAssetManagement.setVersion(revisonVer);assetList.add(hwinfoAssetManagement);} else {HwinfoAssetManagement hwinfoAssetManagement = new HwinfoAssetManagement();hwinfoAssetManagement.setPresentState("0");hwinfoAssetManagement.setNodeId(equipment.getId());hwinfoAssetManagement.setNodeName(equipment.getName());hwinfoAssetManagement.setAssetType("BPB");hwinfoAssetManagement.setLocaltion(location);assetList.add(hwinfoAssetManagement);}}}else{logger.info("mml command={},neId={},没有data数据", mmlbbunamecmd, equipment.getId());}logger.info("-queryBpbInfo-end!-assetList:{}", assetList);}/*** MML查询单板MCB信息* MML结果长这样:data=[{"MessageContent":"[0-0-7] SN: W150SA0036\n[0-0-7] VID: 11500000082766"}], neid=null]* @param equipment 设备*/public void queryMcbInfo(Equipment equipment, List<HwinfoAssetManagement> assetList) {logger.info("-queryMcbInfo-equipment:{},assetList:{}", equipment, assetList);String presentValue = "";String location = "";String shNum = "";String chNum = "";String slNum = "";String presentStateCmd = "SHW MCB;" ;Map<Integer, MMLResponse> presentStateResult = sendMMLCmd(presentStateCmd, equipment.getId());MMLResponse presentStateResponse = presentStateResult.get(equipment.getId());List<JSONObject> presentStateDatas = presentStateResponse.getData();if(presentStateDatas != null && !presentStateDatas.isEmpty()) {for (JSONObject jsonObject : presentStateDatas) {presentValue = (String) jsonObject.get("Present");shNum = (String) jsonObject.get("ShNum");chNum = (String) jsonObject.get("ChNum");slNum = (String) jsonObject.get("SlNum");location = "cabinet=" + shNum + ",frame=" + chNum + ",slot=" + slNum;if (presentValue.equals("Present")) {HwinfoAssetManagement hwinfoAssetManagement = new HwinfoAssetManagement();String key = "";String value = "";List<Integer> neIds = null;String cmdCell = "DSP HwInfo:HwType = MCB" ;Map<Integer, MMLResponse> stringMMLResponseMapCmdCell = sendMMLCmd(cmdCell, equipment.getId());logger.info("-queryMcbInfo-mml command={},neId={},result={}", cmdCell, equipment.getId(),stringMMLResponseMapCmdCell.toString());MMLResponse responseserCell = stringMMLResponseMapCmdCell.get(equipment.getId());List<JSONObject> datasCell = responseserCell.getData();if(datasCell != null && !datasCell.isEmpty()){for (JSONObject json : datasCell) {if (json.containsKey("MessageContent") && json.getString("MessageContent") != null) {String messageContent = json.getString("MessageContent");if (messageContent.contains("[") && messageContent.contains("]")) {neIds = new ArrayList<>();neIds.add(equipment.getId());Pattern pattern = Pattern.compile("\\[(\\d)+-(\\d)+-(\\d)+\\]\\s*(.+?): \\s*(.+)\\s*(?:\\n|$)");Matcher matcher = pattern.matcher(messageContent);while (matcher.find()) {String mcbSlNum = matcher.group(3);if (mcbSlNum != null && mcbSlNum.equals(slNum)) {key = matcher.group(4);value = matcher.group(5);if (org.springframework.util.StringUtils.isEmpty(value)) {continue;}if (CustomStringUtils.containsInvalidCharacters(value)) {continue;}switch (key) {case "SN":hwinfoAssetManagement.setSn(value);break;case "VID":hwinfoAssetManagement.setVid(value);break;default:logger.error("-queryMcbInfo no match key:{}", key);break;}}}List<VersionQueryClientResp> newResponseList = versionNewQueryService.queryRunVerByNeId(neIds);for (VersionQueryClientResp item : newResponseList) {if (item.getSlotId().equals(slNum) && (item.getAppVersion().contains("BBU") || item.getAppVersion().contains("OBBU"))) {hwinfoAssetManagement.setVersion(item.getAppVersion());}}hwinfoAssetManagement.setPresentState("1");hwinfoAssetManagement.setNodeId(equipment.getId());hwinfoAssetManagement.setNodeName(equipment.getName());hwinfoAssetManagement.setAssetType("MCB");hwinfoAssetManagement.setLocaltion(location);assetList.add(hwinfoAssetManagement);}}}}else{logger.info("-queryMcbInfo mml command={},neId={},没有data数据", cmdCell, equipment);}} else {HwinfoAssetManagement hwinfoAssetManagement = new HwinfoAssetManagement();hwinfoAssetManagement.setPresentState("0");hwinfoAssetManagement.setNodeId(equipment.getId());hwinfoAssetManagement.setNodeName(equipment.getName());hwinfoAssetManagement.setAssetType("MCB");hwinfoAssetManagement.setLocaltion(location);assetList.add(hwinfoAssetManagement);}}}logger.info("-queryMcbInfo-end!-assetList:{}", assetList);}/*** MML查询电源PSU信息* MML结果长这样:data=[{"MessageContent":"[PSU-1] Present State: Present\n[PSU-0] Present State: Present\n"}], neid=null]* @param equipment 设备*/public void queryPsuInfo(Equipment equipment, List<HwinfoAssetManagement> assetList) {logger.info("-queryPsuInfo-equipmentId:{},assetList:{}", equipment.getId(), assetList);String presentValue = "";String location = "";String shNum = "";String chNum = "";String slNum = "";String presentStateCmd = "SHW BBUPM;" ;Map<Integer, MMLResponse> presentStateResult = sendMMLCmd(presentStateCmd, equipment.getId());MMLResponse presentStateResponse = presentStateResult.get(equipment.getId());List<JSONObject> presentStateDatas = presentStateResponse.getData();if(presentStateDatas != null && !presentStateDatas.isEmpty()) {for (JSONObject presentStateJson : presentStateDatas) {presentValue = (String) presentStateJson.get("Present");shNum = (String) presentStateJson.get("ShNum");chNum = (String) presentStateJson.get("ChNum");slNum = (String) presentStateJson.get("SlNum");location = "cabinet=" + shNum + ",frame=" + chNum + ",slot=" + slNum;if (presentValue.equals("Present")) {HwinfoAssetManagement hwinfoAssetManagement = new HwinfoAssetManagement();Pattern pattern = null;Matcher matcher = null;//注意3801和5801返回数据格式不统一,3801:"[PSU-1] Present State: Present\n[PSU-0] Present State: Present\n",而5801:"[0-0-10] Present State: Present\n[0-0-10] Version: psu3_230728\n[0-0-10] SN: \n[0-0-10] VID: \u0010@\n"String type = "3800";String key = "";String value = "";String cmdCell = "DSP HwInfo:HwType = PSU" ;Map<Integer, MMLResponse> stringMMLResponseMapCmdCell = sendMMLCmd(cmdCell, equipment.getId());logger.info("-queryPsuInfo-mml command={},neId={},result={}", cmdCell, equipment.getId(),stringMMLResponseMapCmdCell.toString());MMLResponse responseserCell = stringMMLResponseMapCmdCell.get(equipment.getId());List<JSONObject> datasCell = responseserCell.getData();if(datasCell != null && !datasCell.isEmpty()){for (JSONObject json : datasCell) {if (json.containsKey("MessageContent") && json.getString("MessageContent") != null) {String messageContent = json.getString("MessageContent");if (messageContent.contains("[") && messageContent.contains("]")) {if (messageContent.contains("PSU")) {pattern = Pattern.compile("\\[PSU-(\\d)+\\]\\s*(.+?): \\s*(.+)\\s*\\n");type = "3801";} else {pattern = Pattern.compile("\\[(\\d)+-(\\d)+-(\\d+)\\]\\s*(.+?):\\s*(.*?)\\s*(?=$|\\[\\d+-\\d+-\\d+])");type = "5801";}matcher = pattern.matcher(messageContent);while (matcher.find()) {String psuSlNum = matcher.group(3);if (psuSlNum != null && psuSlNum.equals(slNum)) {if (type.equals("3801")) {key = matcher.group(2);value = matcher.group(3);} else if (type.equals("5801")){key = matcher.group(4);value = matcher.group(5);}if (org.springframework.util.StringUtils.isEmpty(value)) {continue;}if (CustomStringUtils.containsInvalidCharacters(value)) {continue;}switch (key) {case "SN":hwinfoAssetManagement.setSn(value);break;case "VID":hwinfoAssetManagement.setVid(value);break;case "Version":hwinfoAssetManagement.setVersion(value);break;default:logger.error("-queryPsuInfo no match key:{}", key);break;}}}hwinfoAssetManagement.setPresentState("1");hwinfoAssetManagement.setNodeId(equipment.getId());hwinfoAssetManagement.setNodeName(equipment.getName());hwinfoAssetManagement.setAssetType("PSU");hwinfoAssetManagement.setLocaltion(location);assetList.add(hwinfoAssetManagement);}}}} else {logger.info("-queryPsuInfo mml command={},neId={},没有data数据", cmdCell, equipment);}} else {HwinfoAssetManagement hwinfoAssetManagement = new HwinfoAssetManagement();hwinfoAssetManagement.setPresentState("0");hwinfoAssetManagement.setNodeId(equipment.getId());hwinfoAssetManagement.setNodeName(equipment.getName());hwinfoAssetManagement.setAssetType("PSU");hwinfoAssetManagement.setLocaltion(location);assetList.add(hwinfoAssetManagement);}}}logger.info("-queryPsuInfo-end!-assetList:{}", assetList);}/*** MML查询环境监控Eib信息* MML结果长这样:data=[{"MessageContent":"[0-0-11] Present State: Present\n[0-0-11] Version: eib_240221"}], neid=null]* @param equipment 设备*/public void queryEibInfo(Equipment equipment, List<HwinfoAssetManagement> assetList) {logger.info("-queryEibInfo-equipment:{},assetList:{}", equipment, assetList);String presentValue = "";String location = "";String shNum = "";String chNum = "";String slNum = "";String presentStateCmd = "SHW EIB;" ;Map<Integer, MMLResponse> presentStateResult = sendMMLCmd(presentStateCmd, equipment.getId());MMLResponse presentStateResponse = presentStateResult.get(equipment.getId());List<JSONObject> presentStateDatas = presentStateResponse.getData();if(presentStateDatas != null && !presentStateDatas.isEmpty()) {for (JSONObject jsonObject : presentStateDatas) {presentValue = (String) jsonObject.get("Present");shNum = (String) jsonObject.get("ShNum");chNum = (String) jsonObject.get("ChNum");slNum = (String) jsonObject.get("SlNum");location = "cabinet=" + shNum + ",frame=" + chNum + ",slot=" + slNum;}}if (presentValue.equals("Present")) {HwinfoAssetManagement hwinfoAssetManagement = new HwinfoAssetManagement();String key = "";String value = "";String cmdCell = "DSP HwInfo: HwType=\"EIB\"";Map<Integer, MMLResponse> stringMMLResponseMapCmdCell = sendMMLCmd(cmdCell, equipment.getId());logger.info("-queryEibInfo-mml command={},neId={},result={}", cmdCell, equipment.getId(),stringMMLResponseMapCmdCell.toString());MMLResponse responseserCell = stringMMLResponseMapCmdCell.get(equipment.getId());List<JSONObject> datasCell = responseserCell.getData();if(datasCell != null && !datasCell.isEmpty()){for (JSONObject json : datasCell) {if (json.containsKey("MessageContent") && json.getString("MessageContent") != null) {String messageContent = json.getString("MessageContent");if (messageContent.contains("[") && messageContent.contains("]")) {Pattern pattern = Pattern.compile("\\[(\\d)+-(\\d)+-(\\d)+\\]\\s*(.+?): \\s*(.+)\\s*(?:\\n|$)");Matcher matcher = pattern.matcher(messageContent);while (matcher.find()) {slNum = matcher.group(3);if (slNum != null) {key = matcher.group(4);value = matcher.group(5);if (org.springframework.util.StringUtils.isEmpty(value)) {continue;}if (CustomStringUtils.containsInvalidCharacters(value)) {continue;}switch (key) {case "SN":hwinfoAssetManagement.setSn(value);break;case "VID":hwinfoAssetManagement.setVid(value);break;case "Version":hwinfoAssetManagement.setVersion(value);break;default:logger.error("-queryEibInfo no match key:{}", key);break;}}}hwinfoAssetManagement.setPresentState("1");hwinfoAssetManagement.setNodeId(equipment.getId());hwinfoAssetManagement.setNodeName(equipment.getName());hwinfoAssetManagement.setAssetType("EIB");hwinfoAssetManagement.setLocaltion(location);assetList.add(hwinfoAssetManagement);}}}}else{logger.info("-queryEibInfo mml command={},neId={},没有data数据", cmdCell, equipment.getId());}} else {if (!org.springframework.util.StringUtils.isEmpty(location)) {HwinfoAssetManagement hwinfoAssetManagement = new HwinfoAssetManagement();hwinfoAssetManagement.setPresentState("0");hwinfoAssetManagement.setNodeId(equipment.getId());hwinfoAssetManagement.setNodeName(equipment.getName());hwinfoAssetManagement.setAssetType("EIB");hwinfoAssetManagement.setLocaltion(location);assetList.add(hwinfoAssetManagement);}}logger.info("-queryEibInfo-end!-assetList:{}", assetList);}/*** 查询RRU信息* @param equipment equipment* @param assetList assetList*/private void queryRruInfo(Equipment equipment, List<HwinfoAssetManagement> assetList){logger.info("-queryRruInfo-equipment:{},assetList:{}", equipment, assetList);HwinfoAssetManagement hwinfoAssetManagement = null;String shNum = "";String chNum = "";String slNum = "";String key = "";String value = "";String location = "";String presentValue = "";//生成查询所有rru mml指令String mmlcmd="SHW RRU;";Map<Integer, MMLResponse> result = sendMMLCmd(mmlcmd, equipment.getId());logger.info("mml command={},neId={},result={}", mmlcmd, equipment.getId(),result.toString());MMLResponse response = result.get(equipment.getId());List<JSONObject> datas = response.getData();if(datas != null && !datas.isEmpty()){for (JSONObject jsonObject : datas) {hwinfoAssetManagement = new HwinfoAssetManagement();presentValue = jsonObject.get("present").toString();chNum = jsonObject.getString("chNum");shNum = jsonObject.getString("shNum");slNum = jsonObject.getString("slNum");location = "cabinet=" + shNum + ",frame=" + chNum + ",slot=" + slNum;if (presentValue.equals("Present")) {//查询序列号 出厂日期String cmd = "DSP HwInfo : ne= " + equipment.getId() + " , HwType = \"RRU\"";Map<Integer, MMLResponse> stringMMLResponseMap = sendMMLCmd(cmd, equipment.getId());logger.info("mml command={},neId={},result={}", cmd, equipment.getId(),stringMMLResponseMap.toString());MMLResponse responseserCell = stringMMLResponseMap.get(equipment.getId());List<JSONObject> datasCell = responseserCell.getData();if(datasCell != null && !datasCell.isEmpty()){for (JSONObject json : datasCell) {if (json.containsKey("MessageContent") && json.getString("MessageContent") != null) {String messageContent = json.getString("MessageContent");if (!messageContent.contains("Error, none RRU info")) {Pattern pattern = Pattern.compile("\\[RRU-(\\d+)\\]\\s*(.+?):\\s*(.*?)\\s*(?=$|\\[RRU-\\d+\\])");Matcher matcher = pattern.matcher(messageContent);while (matcher.find()) {String rruChNum = matcher.group(1);if (rruChNum != null && rruChNum.equals(chNum)) {key = matcher.group(2);value = matcher.group(3);if (org.springframework.util.StringUtils.isEmpty(value)) {continue;}if (CustomStringUtils.containsInvalidCharacters(value)) {continue;}switch (key) {case "SN":hwinfoAssetManagement.setSn(value);break;case "Version":hwinfoAssetManagement.setVersion(value);break;case "VID":hwinfoAssetManagement.setVid(value);break;default:logger.error(" no match key:{}", key);break;}}}hwinfoAssetManagement.setPresentState("1");hwinfoAssetManagement.setNodeId(equipment.getId());hwinfoAssetManagement.setNodeName(equipment.getName());hwinfoAssetManagement.setAssetType("RRU");hwinfoAssetManagement.setLocaltion(location);assetList.add(hwinfoAssetManagement);}}}}} else {hwinfoAssetManagement = new HwinfoAssetManagement();hwinfoAssetManagement.setPresentState("0");hwinfoAssetManagement.setNodeId(equipment.getId());hwinfoAssetManagement.setNodeName(equipment.getName());hwinfoAssetManagement.setAssetType("RRU");hwinfoAssetManagement.setLocaltion(location);assetList.add(hwinfoAssetManagement);}}}logger.info("-queryRruInfo-end!-assetList:{}", assetList);}//生成查询全部rru或者bbu指令private Map<Integer, MMLResponse> sendMMLCmd(String mmlcmd,Integer equipmentId){Map<Integer, MMLResponse> result = new HashMap<>();MMLRequest request = new MMLRequest(equipmentId, mmlcmd);request.setCmdType(1);  //1是设备//发送mml cmdMMLResponse mmlResponse = mmlSender.sendMMLCommand(request);if("0".equalsIgnoreCase(mmlResponse.getErrorCode())||"OK".equalsIgnoreCase(mmlResponse.getResult())){result.put(equipmentId,mmlResponse);}else{//調用失敗 模拟的数据if(mmlcmd.contains("QRY")&&mmlcmd.contains("Cell")){JSONObject jsonObject=new JSONObject();jsonObject.put("CellId","CellIdDefault");List<JSONObject> objects = new ArrayList<JSONObject>();objects.add(jsonObject);mmlResponse.setData(objects);}if(mmlcmd.contains("QRY")&&mmlcmd.contains("RRU")){JSONObject jsonObject=new JSONObject();jsonObject.put("rruName","rruNameDefault1");jsonObject.put("chNum",199999);jsonObject.put("shNum",199999);jsonObject.put("slNum",199999);JSONObject jsonObject2=new JSONObject();jsonObject2.put("rruName","rruNameDefault2");jsonObject2.put("chNum",299999);jsonObject2.put("shNum",299999);jsonObject2.put("slNum",299999);List<JSONObject> objects = new ArrayList<JSONObject>();objects.add(jsonObject);objects.add(jsonObject2);mmlResponse.setData(objects);}if(mmlcmd.contains("SHW")&&mmlcmd.contains("RRU")){ZonedDateTime now = ZonedDateTime.now().truncatedTo(ChronoUnit.SECONDS);String format = DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(now);if(mmlcmd.contains("199999")){JSONObject jsonObject=new JSONObject();jsonObject.put("elabel","11111111111111");jsonObject.put("boardManu",format);List<JSONObject> objects = new ArrayList<JSONObject>();objects.add(jsonObject);mmlResponse.setData(objects);}if(mmlcmd.contains("299999")){JSONObject jsonObject2=new JSONObject();jsonObject2.put("elabel","2222222222");jsonObject2.put("boardManu",format);List<JSONObject> objects = new ArrayList<JSONObject>();objects.add(jsonObject2);mmlResponse.setData(objects);}}if(mmlcmd.contains("QRY")&&mmlcmd.contains("EnodebCfg")){JSONObject jsonObject=new JSONObject();jsonObject.put("EnodebName","bbuNameDefault");jsonObject.put("EnodebId","bbuIdDefault");List<JSONObject> objects = new ArrayList<JSONObject>();objects.add(jsonObject);mmlResponse.setData(objects);}if(mmlcmd.contains("DSP")&&mmlcmd.contains("LICDEVNO")){JSONObject jsonObject=new JSONObject();jsonObject.put("devNo","devNoDefault");List<JSONObject> objects = new ArrayList<JSONObject>();objects.add(jsonObject);mmlResponse.setData(objects);}result.put(equipmentId,mmlResponse);}return result;}private String switchValue(int order ,HwinfoAssetManagement hwinfoAssetManagement, Boolean isChinese){String value=null;switch(order){case 0:value = hwinfoAssetManagement.getNodeId().toString();break;case 1:if (!org.springframework.util.StringUtils.isEmpty(hwinfoAssetManagement.getNodeName())) {value = hwinfoAssetManagement.getNodeName();}break;case 2:if (!org.springframework.util.StringUtils.isEmpty(hwinfoAssetManagement.getAssetType())) {value = hwinfoAssetManagement.getAssetType();}break;case 3:if (!org.springframework.util.StringUtils.isEmpty(hwinfoAssetManagement.getLocaltion())) {value = hwinfoAssetManagement.getLocaltion();}break;case 4:if (!org.springframework.util.StringUtils.isEmpty(hwinfoAssetManagement.getPresentState())) {String presentState = hwinfoAssetManagement.getPresentState();if (isChinese) {value = presentState.equals("1") ? AssetConst.zh_present : AssetConst.zh_notPresent;} else {value = presentState.equals("1") ? AssetConst.en_present : AssetConst.en_notPresent;}}break;case 5:if (!org.springframework.util.StringUtils.isEmpty(hwinfoAssetManagement.getSn())) {value = hwinfoAssetManagement.getSn();}break;case 6:if (!org.springframework.util.StringUtils.isEmpty(hwinfoAssetManagement.getVid())) {value = hwinfoAssetManagement.getVid();}break;case 7:if (!org.springframework.util.StringUtils.isEmpty(hwinfoAssetManagement.getVersion())) {value = hwinfoAssetManagement.getVersion();}break;default:value ="";break;}return value;}/*** 查询光模块资产信息列表* @param page page* @return 结果*/@ResponseBody@RequestMapping(value = "querySfpAssetManagementList", method = RequestMethod.GET)public Page<SfpAssetManagement> querySfpAssetManagementList(SfpAssetManagement hwinfoAssetManagement, Page<SfpAssetManagement> page){page.setParam(hwinfoAssetManagement);return sfpAssetManagementService.querySfpAssetManagementList(page);}@Scheduled(cron = "0 30 1 * * ?")public void sfpAssetManagementStore() {try {sfpAssetManagementService.truncateSfpAssetManagement();List<Equipment> list = equipmentService.queryAllEquipment(null);//过滤掉不在线的设备,不在线的设备不能发送mmlList<Equipment> equipments = list.stream().filter(equipment -> {return businessNeService.qryNodeLinkStatus(equipment.getId()) == 1;}).collect(Collectors.toList());CountDownLatch countDownLatch = new CountDownLatch(equipments.size());for (Equipment equipment : equipments) {executorObserveInfo.execute(new Runnable() {@Overridepublic void run() {List<SfpAssetManagement> assetList = new ArrayList<>();queryBasebandControlBoardSfpInfo(equipment, assetList);queryMainControlBoardSfpInfo(equipment, assetList);queryRruSfpInfoOfRru(equipment, assetList);if (assetList.size() > 0) {sfpAssetManagementService.batchInsertSfpAssetManagement(assetList);}countDownLatch.countDown();}});}boolean flag = countDownLatch.await(5, TimeUnit.MINUTES);logger.info("sfpAssetManagementStore CountDownLatch await result:{}", flag);} catch (Exception e) {logger.error("sfpAssetManagementStore an exception occurred when trying to await countDownLatch", e);}}/*** 点击“资产信息反构”按钮,触发立即执行更新数据*/@ResponseBody@RequestMapping(value = "syncSfpAssetManagementStore", method = RequestMethod.GET)public void syncSfpAssetManagementStore(){sfpAssetManagementStore();}/** 导出光模块资产信息数据*/@ResponseBody@RequestMapping(value = "exportSfpAssetManagementList", method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON,produces = MediaType.APPLICATION_JSON)public void exportSfpAssetManagementList(@RequestBody SfpAssetManagement sfpAssetManagement, HttpServletResponse response){List<SfpAssetManagement> list = sfpAssetManagementService.querySfpAssetManagementList(sfpAssetManagement);Locale local = LocaleUtil.getLocale(sysInfo.getLocale());Boolean isChinese = "zh".equalsIgnoreCase(local.getLanguage());String[] headers=new String[]{AssetConst.en_nodeId, AssetConst.en_deviceName,AssetConst.en_assetType,AssetConst.en_localtion,AssetConst.en_sn,AssetConst.en_vid,AssetConst.en_version};if(isChinese){headers=new String[]{AssetConst.zh_nodeId, AssetConst.zh_deviceName,AssetConst.zh_assetType,AssetConst.zh_localtion,AssetConst.zh_sn,AssetConst.zh_vid,AssetConst.zh_version};}XSSFWorkbook wb = new XSSFWorkbook();XSSFSheet sheet = wb.createSheet(isChinese ? AssetConst.zh_sfpAssetList :AssetConst.en_sfpAssetList);XSSFRow row = sheet.createRow(0);//行XSSFCell cell  = null;// 创建单元格样式XSSFCellStyle style = wb.createCellStyle();XSSFFont font = wb.createFont();font.setBold(true); // 设置字体加粗style.setFont(font);//逐个设置标题样式for (int i = 0; i < headers.length; i++) {cell = row.createCell(i);cell.setCellValue(headers[i]);cell.setCellStyle(style);}int n = 1;for (SfpAssetManagement item : list) {//循环写入值XSSFRow rowN = sheet.createRow(n);//行for (int i = 0; i < headers.length; i++) {cell = rowN.createCell(i);cell.setCellValue(switchValue(i,item));}n++;}sheet.setColumnWidth(1, 4000);sheet.setColumnWidth(2, 4000);sheet.setColumnWidth(3, 9000);sheet.setColumnWidth(4, 4000);sheet.setColumnWidth(5, 4000);sheet.setColumnWidth(6, 4000);String fileName = isChinese ? AssetConst.zh_sfp_file_name :AssetConst.en_sfp_file_name;String sysPath =  System.getProperty("eam.conf")+File.separator+"excel";String excelPath =sysPath+File.separator+fileName;File dir = new File(sysPath);if(!dir.exists()  && !dir.isDirectory()){dir.mkdir();}//生成文件并返回前端try{FileOutputStream fileOut = new FileOutputStream(excelPath);wb.write(fileOut);fileOut.flush();fileOut.close();File file = new File(excelPath);InputStream ins = new FileInputStream(file);BufferedInputStream bins = new BufferedInputStream(ins);// 放到缓冲流里面OutputStream outs = response.getOutputStream();// 获取文件输出IO流BufferedOutputStream bouts = new BufferedOutputStream(outs);response.setContentType("application/x-download");// 设置response内容的类型response.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(System.currentTimeMillis()/1000+"_"+fileName, "UTF-8"));// 设置头部信息int bytesRead = 0;byte[] buffer = new byte[8192];//开始向网络传输文件流while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {bouts.write(buffer, 0, bytesRead);}bouts.flush();// 这里一定要调用flush()方法ins.close();bins.close();outs.close();}catch(Exception e){e.printStackTrace();}}private String switchValue(int order ,SfpAssetManagement sfpAssetManagement){String value=null;switch(order){case 0:value = sfpAssetManagement.getNodeId().toString();break;case 1:if (!org.springframework.util.StringUtils.isEmpty(sfpAssetManagement.getNodeName())) {value = sfpAssetManagement.getNodeName();}break;case 2:if (!org.springframework.util.StringUtils.isEmpty(sfpAssetManagement.getAssetType())) {value = sfpAssetManagement.getAssetType();}break;case 3:if (!org.springframework.util.StringUtils.isEmpty(sfpAssetManagement.getLocaltion())) {value = sfpAssetManagement.getLocaltion();}break;case 4:if (!org.springframework.util.StringUtils.isEmpty(sfpAssetManagement.getSn())) {value = sfpAssetManagement.getSn();}break;case 5:if (!org.springframework.util.StringUtils.isEmpty(sfpAssetManagement.getVid())) {value = sfpAssetManagement.getVid();}break;case 6:if (!org.springframework.util.StringUtils.isEmpty(sfpAssetManagement.getVersion())) {value = sfpAssetManagement.getVersion();}break;default:value ="";break;}return value;}/*** MML查询基带板的光模块SFP信息* MML结果长这样:data=[{"MessageContent":"SFP0 p_sfp_detect is:0x0\r\nSFP0 p_sfp_rx_los is:0x0\r\nSFP0 p_sfp_tx_fault_stat is:0x0\r\nSFP0 vendor is:Hisense\r\nSFP0 SN Number is:H8478J00216\r\n"}], neid=null]* MML结果长这样:data=[{"MessageContent":"SFP0 p_sfp_detect is:0x0\r\nSFP0 p_sfp_rx_los is:0x0\r\nSFP0 p_sfp_tx_fault_stat is:0x0\r\nNo device!!!\r\n"}], neid=null]*/public void queryBasebandControlBoardSfpInfo(Equipment equipment, List<SfpAssetManagement> assetList) {logger.info("-queryBasebandControlBoardSfpInfo-equipment:{},assetList:{}", equipment, assetList);String shNum = "";String chNum = "";String slNum = "";String location = "";String key = "";String value = "";String cmdCell = "QRY BPB ;";Map<Integer, MMLResponse> stringMMLResponseMapCmdCell = sendMMLCmd(cmdCell, equipment.getId());logger.info("-queryBasebandControlBoardSfpInfo-mml command={},neId={},result={}", cmdCell, equipment.getId(),stringMMLResponseMapCmdCell.toString());MMLResponse responseserCell = stringMMLResponseMapCmdCell.get(equipment.getId());List<JSONObject> datasCell = responseserCell.getData();if(datasCell != null && !datasCell.isEmpty()){for (JSONObject jsonObject : datasCell) {chNum = jsonObject.getString("ChNum");shNum = jsonObject.getString("ShNum");slNum = jsonObject.getString("SlNum");logger.info("-queryBasebandControlBoardSfpInfo-slotNo={}", slNum);for (int i = 1; i < 4; i++) {SfpAssetManagement sfpAssetManagement = null;String basebandControlBoardCmd1 = "DSP BPBSFPInfo: slotNo=\"" + slNum + "\",fiberNo=\"" + i + "\";";Map<Integer, MMLResponse> basebandControlBoardCmd1Map = sendMMLCmd(basebandControlBoardCmd1, equipment.getId());logger.info("-queryBasebandControlBoardSfpInfo-mml command={},neId={},result={}", basebandControlBoardCmd1, equipment.getId(), basebandControlBoardCmd1Map.toString());MMLResponse basebandControlBoardCmd1Response = basebandControlBoardCmd1Map.get(equipment.getId());List<JSONObject> basebandControlBoardCmd1Datas = basebandControlBoardCmd1Response.getData();if(basebandControlBoardCmd1Datas == null || basebandControlBoardCmd1Datas.isEmpty()) {basebandControlBoardCmd1 = "DSP SFPInfo: slotNo=\"" + slNum + "\",fiberNo=\"" + i + "\";";basebandControlBoardCmd1Map = sendMMLCmd(basebandControlBoardCmd1, equipment.getId());basebandControlBoardCmd1Response = basebandControlBoardCmd1Map.get(equipment.getId());basebandControlBoardCmd1Datas = basebandControlBoardCmd1Response.getData();}if(basebandControlBoardCmd1Datas != null && !basebandControlBoardCmd1Datas.isEmpty()){for (JSONObject json : basebandControlBoardCmd1Datas) {if (json.containsKey("MessageContent") && json.getString("MessageContent") != null) {String messageContent = json.getString("MessageContent");if (!messageContent.contains("No device") && !messageContent.contains("is disable,pls check board")) {Pattern pattern = Pattern.compile("SFP(\\d+)\\s+(.+?)\\s+is:(.+?)\\r\\n");Matcher matcher = pattern.matcher(messageContent);String currentSfpIndex = null;while (matcher.find()) {String sfpIndex = matcher.group(1);if (sfpIndex != null) {if (!sfpIndex.equals(currentSfpIndex)) {if (sfpAssetManagement != null) {sfpAssetManagement.setNodeId(equipment.getId());sfpAssetManagement.setNodeName(equipment.getName());sfpAssetManagement.setAssetType("SFP");sfpAssetManagement.setLocaltion(location);assetList.add(sfpAssetManagement);}sfpAssetManagement = new SfpAssetManagement();}key = matcher.group(2);value = matcher.group(3);location = "cabinet=" + shNum + ",frame=" + chNum + ",slot=" + slNum + ",sfp=" + sfpIndex;if (org.springframework.util.StringUtils.isEmpty(value)) {continue;}if (CustomStringUtils.containsInvalidCharacters(value)) {continue;}switch (key) {case "SN Number":sfpAssetManagement.setSn(value);break;case "vendor":sfpAssetManagement.setVid(value);break;default:logger.error("-queryMainControlBoardSfpInfo no match key:{}", key);break;}currentSfpIndex = sfpIndex;}}sfpAssetManagement.setNodeId(equipment.getId());sfpAssetManagement.setNodeName(equipment.getName());sfpAssetManagement.setAssetType("SFP");sfpAssetManagement.setLocaltion(location);assetList.add(sfpAssetManagement);}}}}}}}else{logger.info("-queryBasebandControlBoardSfpInfo mml command={},neId={},没有data数据", cmdCell, equipment);}logger.info("-queryBasebandControlBoardSfpInfo-end!-assetList:{}", assetList);}/*** MML查询主控板的光模块SFP信息* MML结果长这样:data=[{"MessageContent":"[SFP-0] State: 1\n[SFP-0] SN: S9173888841\n[SFP-0] VID: Hisense\n[SFP-0] Version: V1.0nse\n[SFP-0] Type: LTD1302-BH+\n"}], neid=null]*/public void queryMainControlBoardSfpInfo(Equipment equipment, List<SfpAssetManagement> assetList) {logger.info("-queryMainControlBoardSfpInfo-equipment:{},assetList:{}", equipment, assetList);String shNum = "";String chNum = "";String slNum = "";String location = "";String key = "";String value = "";Pattern pattern = null;Matcher matcher = null;String mcbCmd = "DSP HwInfo:HwType = MCB";Map<Integer, MMLResponse> qryMcbMMLResponseMap = sendMMLCmd(mcbCmd, equipment.getId());logger.info("-qryMcbMMLResponseMap-mml command={},neId={},result={}", mcbCmd, equipment.getId(),qryMcbMMLResponseMap.toString());MMLResponse qryMcbMMLResponse = qryMcbMMLResponseMap.get(equipment.getId());List<JSONObject> qryMcbDatas = qryMcbMMLResponse.getData();logger.info("qryMcbDatas:{}", qryMcbDatas);if(qryMcbDatas != null && !qryMcbDatas.isEmpty()) {for (JSONObject jsonObject : qryMcbDatas) {SfpAssetManagement sfpAssetManagement = null;if (jsonObject.containsKey("MessageContent") && jsonObject.getString("MessageContent") != null) {String mcbMessageContent = jsonObject.getString("MessageContent");if (mcbMessageContent.contains("[") && mcbMessageContent.contains("]")) {pattern = Pattern.compile("\\[(\\d)+-(\\d)+-(\\d)+\\]\\s*(.+?): \\s*(.+)\\s*(?:\\n|$)");matcher = pattern.matcher(mcbMessageContent);while (matcher.find()) {slNum = matcher.group(3);if (slNum != null) {shNum = matcher.group(1);chNum = matcher.group(2);}}String cmdCell = "DSP HwInfo:HwType = MCBSFP" ;Map<Integer, MMLResponse> stringMMLResponseMapCmdCell = sendMMLCmd(cmdCell, equipment.getId());logger.info("-stringMMLResponseMapCmdCell-mml command={},neId={},result={}", cmdCell, equipment.getId(),stringMMLResponseMapCmdCell.toString());MMLResponse responseserCell = stringMMLResponseMapCmdCell.get(equipment.getId());List<JSONObject> datasCell = responseserCell.getData();if (datasCell == null || datasCell.isEmpty()) {cmdCell = "DSP HwInfo:HwType = SFP" ;stringMMLResponseMapCmdCell = sendMMLCmd(cmdCell, equipment.getId());responseserCell = stringMMLResponseMapCmdCell.get(equipment.getId());datasCell = responseserCell.getData();}if(datasCell != null && !datasCell.isEmpty()){for (JSONObject json : datasCell) {if (json.containsKey("MessageContent") && json.getString("MessageContent") != null) {String messageContent = json.getString("MessageContent");if (messageContent.contains("[") && messageContent.contains("]")) {pattern = Pattern.compile("\\[SFP-(\\d+)]\\s*(.+?): \\s*(.+)\\s*\\n");matcher = pattern.matcher(messageContent);String currentSfpIndex = null;while (matcher.find()) {String sfpIndex = matcher.group(1);if (sfpIndex != null) {if (!sfpIndex.equals(currentSfpIndex)) {if (sfpAssetManagement != null) {sfpAssetManagement.setNodeId(equipment.getId());sfpAssetManagement.setNodeName(equipment.getName());sfpAssetManagement.setAssetType("SFP");sfpAssetManagement.setLocaltion(location);assetList.add(sfpAssetManagement);}sfpAssetManagement = new SfpAssetManagement();}key = matcher.group(2);value = matcher.group(3);location = "cabinet=" + shNum + ",frame=" + chNum + ",slot=" + slNum + ",sfp=" + sfpIndex;if (org.springframework.util.StringUtils.isEmpty(value)) {continue;}if (CustomStringUtils.containsInvalidCharacters(value)) {continue;}switch (key) {case "SN":sfpAssetManagement.setSn(value);break;case "VID":sfpAssetManagement.setVid(value);break;default:logger.error("-queryMainControlBoardSfpInfo no match key:{}", key);break;}currentSfpIndex = sfpIndex;}}sfpAssetManagement.setNodeId(equipment.getId());sfpAssetManagement.setNodeName(equipment.getName());sfpAssetManagement.setAssetType("SFP");sfpAssetManagement.setLocaltion(location);assetList.add(sfpAssetManagement);}}}}else{logger.info("-queryMainControlBoardSfpInfo mml command={},neId={},没有data数据", cmdCell, equipment);}}}}}logger.info("-queryMainControlBoardSfpInfo-end!-assetList:{}", assetList);}/*** MML查询RRU的光模块RRUSFP信息* MML结果长这样:String messageContent = "[RRU-61] Unsupport get SFP hw info!";* MML结果长这样:String messageContent = "[RRU-61][SFP-1] Present State: Present\n[RRU-61][SFP-1] SN: H8477J00489     \n[RRU-61][SFP-1] VID: Hisense         \n";* MML结果长这样:String messageContent = "[RRU-61][SFP-0] Present State: Present\n[RRU-61][SFP-0] SN: H8477J00480     \n[RRU-61][SFP-0] VID: Hisense0         \n[RRU-61][SFP-1] Present State: Present\n[RRU-61][SFP-1] SN: H8477J00489     \n[RRU-61][SFP-1] VID: Hisense         \n";*/public void queryRruSfpInfoOfRru(Equipment equipment, List<SfpAssetManagement> assetList) {logger.info("-queryRruSfpInfoOfRru-equipment:{},assetList:{}", equipment, assetList);String shNum = "";String chNum = "";String slNum = "";String location = "";String key = "";String value = "";String mcbCmd = "QRY RRU;";Map<Integer, MMLResponse> qryRruMMLResponseMap = sendMMLCmd(mcbCmd, equipment.getId());logger.info("-queryBasebandControlBoardSfpInfo-mml command={},neId={},result={}", mcbCmd, equipment.getId(),qryRruMMLResponseMap.toString());MMLResponse qryRruMMLResponse = qryRruMMLResponseMap.get(equipment.getId());List<JSONObject> qrRruDatas = qryRruMMLResponse.getData();String cmdCell = "DSP HwInfo: HwType=\"RRUSFP\"";Map<Integer, MMLResponse> stringMMLResponseMapCmdCell = sendMMLCmd(cmdCell, equipment.getId());logger.info("-queryRruSfpInfoOfRru-mml command={},neId={},result={}", cmdCell, equipment.getId(),stringMMLResponseMapCmdCell.toString());MMLResponse responseserCell = stringMMLResponseMapCmdCell.get(equipment.getId());List<JSONObject> datasCell = responseserCell.getData();if(qrRruDatas != null && !qrRruDatas.isEmpty()) {for (JSONObject jsonObject : qrRruDatas) {SfpAssetManagement sfpAssetManagement = new SfpAssetManagement();chNum = jsonObject.getString("chNum");shNum = jsonObject.getString("shNum");slNum = jsonObject.getString("slNum");if(datasCell != null && !datasCell.isEmpty()){for (JSONObject json : datasCell) {if (json.containsKey("MessageContent") && json.getString("MessageContent") != null) {String messageContent = json.getString("MessageContent");if (!messageContent.contains("Unsupport get SFP hw info") && !messageContent.contains("Error, none RRU info")) {Pattern pattern = Pattern.compile("\\[RRU-(\\d+)\\]\\[SFP-(\\d+)\\]\\s*(.+?):\\s*(.*?)\\s*(?=$|\\[RRU-\\d+\\])");Matcher matcher = pattern.matcher(messageContent);boolean containRruSfp = false;while (matcher.find()) {String rruChNum = matcher.group(1);String sfpIndex = matcher.group(2);if (sfpIndex != null && rruChNum.equals(chNum)) {containRruSfp = true;key = matcher.group(3);value = matcher.group(4);location = "cabinet=" + shNum + ",frame=" + chNum + ",slot=" + slNum + ",sfp=" + sfpIndex;if (org.springframework.util.StringUtils.isEmpty(value)) {continue;}if (CustomStringUtils.containsInvalidCharacters(value)) {continue;}switch (key) {case "SN":sfpAssetManagement.setSn(value);break;case "VID":sfpAssetManagement.setVid(value);break;default:logger.error("-queryRruSfpInfoOfRru no match key:{}", key);break;}}}if (containRruSfp) {sfpAssetManagement.setNodeId(equipment.getId());sfpAssetManagement.setNodeName(equipment.getName());sfpAssetManagement.setAssetType("SFP");sfpAssetManagement.setLocaltion(location);assetList.add(sfpAssetManagement);}}}}}else{logger.info("-queryRruSfpInfoOfRru mml command={},neId={},没有data数据", cmdCell, equipment);}}}logger.info("-queryRruSfpInfoOfRru-end!-assetList:{}", assetList);}/*** 资产数量统计*/@ResponseBody@RequestMapping(value = "assetQuantityStatistics", method = RequestMethod.GET)public Map<String, Integer> assetQuantityStatistics(){int hwinfoAssetCount = hwinfoAssetManagementService.hwinfoAssetQuantityStatistic();int sfpAssetCount = sfpAssetManagementService.sfpAssetQuantityStatistic();Map<String, Integer> map = new HashMap<>();map.put("hwinfoAssetCount", hwinfoAssetCount);map.put("sfpAssetCount", sfpAssetCount);return map;}/*** 硬件资产类型统计*/@ResponseBody@RequestMapping(value = "hwinfoAssetTypeStatistic", method = RequestMethod.GET)public List<Map<String, Object>> hwinfoAssetTypeStatistic(){return hwinfoAssetManagementService.hwinfoAssetTypeStatistic();}/*** 光模块资产类型统计*/@ResponseBody@RequestMapping(value = "sfpAssetTypeStatistic", method = RequestMethod.GET)public List<Map<String, Object>> sfpAssetTypeStatistic(){return sfpAssetManagementService.sfpAssetTypeStatistic();}
}

HwinfoAssetManagement

package com.hero.lte.ems.monitor.entity;/*** 硬件资产管理*/
public class HwinfoAssetManagement {private Integer id;//网元idprivate Integer nodeId;//起始网元id号private Integer nodeIdBegin;//结束网元id号private Integer nodeIdEnd;//网元名称private String nodeName;//资产类型private String assetType;//资产位置private String localtion;//SN硬件编码private String sn;//VID厂商编码private String vid;//单板版本号private String version;//模糊搜索private String keyword;private String presentState;public String getPresentState() {return presentState;}public void setPresentState(String presentState) {this.presentState = presentState;}public String getKeyword() {return keyword;}public void setKeyword(String keyword) {this.keyword = keyword;}public Integer getNodeIdBegin() {return nodeIdBegin;}public void setNodeIdBegin(Integer nodeIdBegin) {this.nodeIdBegin = nodeIdBegin;}public Integer getNodeIdEnd() {return nodeIdEnd;}public void setNodeIdEnd(Integer nodeIdEnd) {this.nodeIdEnd = nodeIdEnd;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getNodeId() {return nodeId;}public void setNodeId(Integer nodeId) {this.nodeId = nodeId;}public String getNodeName() {return nodeName;}public void setNodeName(String nodeName) {this.nodeName = nodeName;}public String getAssetType() {return assetType;}public void setAssetType(String assetType) {this.assetType = assetType;}public String getLocaltion() {return localtion;}public void setLocaltion(String localtion) {this.localtion = localtion;}public String getSn() {return sn;}public void setSn(String sn) {this.sn = sn;}public String getVid() {return vid;}public void setVid(String vid) {this.vid = vid;}public String getVersion() {return version;}public void setVersion(String version) {this.version = version;}@Overridepublic String toString() {return "HwinfoAssetManagement{" +"id=" + id +", nodeId=" + nodeId +", nodeIdBegin=" + nodeIdBegin +", nodeIdEnd=" + nodeIdEnd +", nodeName='" + nodeName + '\'' +", assetType='" + assetType + '\'' +", localtion='" + localtion + '\'' +", sn='" + sn + '\'' +", vid='" + vid + '\'' +", version='" + version + '\'' +", keyword='" + keyword + '\'' +'}';}
}

HwinfoAssetManagementService

package com.hero.lte.ems.monitor.service;import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.monitor.entity.HwinfoAssetManagement;import java.util.List;
import java.util.Map;public interface HwinfoAssetManagementService {Page<HwinfoAssetManagement> queryHwinfoAssetManagementList(Page<HwinfoAssetManagement> pager);List<HwinfoAssetManagement> queryHwinfoAssetManagementList(HwinfoAssetManagement hwinfoAssetManagement);int batchInsertHwinfoAssetManagement(List<HwinfoAssetManagement> list);int truncateHwinfoAssetManagement();int hwinfoAssetQuantityStatistic();List<Map<String,Object>> hwinfoAssetTypeStatistic();
}

HwinfoAssetManagementServiceImpl

package com.hero.lte.ems.monitor.service.impl;import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.monitor.dao.HwinfoAssetManagementMapper;
import com.hero.lte.ems.monitor.entity.HwinfoAssetManagement;
import com.hero.lte.ems.monitor.service.HwinfoAssetManagementService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;/*** @author l22898*/
@Service
public class HwinfoAssetManagementServiceImpl implements HwinfoAssetManagementService {private static final Logger logger = LoggerFactory.getLogger(HwinfoAssetManagementServiceImpl.class);@Resourceprivate HwinfoAssetManagementMapper hwinfoAssetManagementMapper;@Overridepublic Page<HwinfoAssetManagement> queryHwinfoAssetManagementList(Page<HwinfoAssetManagement> pager) {HwinfoAssetManagement param = pager.getParam();if (!StringUtils.isEmpty(param) && isNumberDashNumber(param.getKeyword())) {if (param.getKeyword().contains("-")) {String[] split = param.getKeyword().split("-");param.setNodeIdBegin(Integer.valueOf(split[0]));param.setNodeIdEnd(Integer.valueOf(split[1]));}}hwinfoAssetManagementMapper.queryHwinfoAssetManagementList(pager, param);return pager;}@Overridepublic List<HwinfoAssetManagement> queryHwinfoAssetManagementList(HwinfoAssetManagement hwinfoAssetManagement) {if (hwinfoAssetManagement.getKeyword().contains("-") && isNumberDashNumber(hwinfoAssetManagement.getKeyword())) {String[] split = hwinfoAssetManagement.getKeyword().split("-");hwinfoAssetManagement.setNodeIdBegin(Integer.valueOf(split[0]));hwinfoAssetManagement.setNodeIdEnd(Integer.valueOf(split[1]));}return hwinfoAssetManagementMapper.queryHwinfoAssetManagementList(hwinfoAssetManagement);}public static boolean isNumberDashNumber(String str) {// 正则表达式判断格式是否为 "数字-数字"String regex = "^\\d+-\\d+$";return Pattern.matches(regex, str);}public static boolean isInteger(String str) {try {Integer.parseInt(str);return true;} catch (NumberFormatException e) {return false;}}@Overridepublic int batchInsertHwinfoAssetManagement(List<HwinfoAssetManagement> list) {return hwinfoAssetManagementMapper.batchInsertHwinfoAssetManagement(list);}@Overridepublic int truncateHwinfoAssetManagement() {return hwinfoAssetManagementMapper.truncateHwinfoAssetManagement();}@Overridepublic int hwinfoAssetQuantityStatistic() {return hwinfoAssetManagementMapper.hwinfoAssetQuantityStatistic();}@Overridepublic List<Map<String, Object>> hwinfoAssetTypeStatistic() {return hwinfoAssetManagementMapper.hwinfoAssetTypeStatistic();}
}

HwinfoAssetManagementMapper

package com.hero.lte.ems.monitor.dao;import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.monitor.entity.HwinfoAssetManagement;
import org.apache.ibatis.annotations.Param;import java.util.List;
import java.util.Map;public interface HwinfoAssetManagementMapper {List<HwinfoAssetManagement> queryHwinfoAssetManagementList(@Param("page") Page pager, @Param("hwinfoAssetManagement") HwinfoAssetManagement hwinfoAssetManagement);List<HwinfoAssetManagement> queryHwinfoAssetManagementList(@Param("hwinfoAssetManagement") HwinfoAssetManagement hwinfoAssetManagement);int batchInsertHwinfoAssetManagement(@Param("list") List<HwinfoAssetManagement> list);int truncateHwinfoAssetManagement();int hwinfoAssetQuantityStatistic();List<Map<String,Object>> hwinfoAssetTypeStatistic();
}

HwinfoAssetManagementMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.hero.lte.ems.monitor.dao.HwinfoAssetManagementMapper"><resultMap id="BaseResultMap" type="com.hero.lte.ems.monitor.entity.HwinfoAssetManagement"><id column="id" property="id" jdbcType="INTEGER"/><result column="node_id" property="nodeId" jdbcType="INTEGER"/><result column="node_name" property="nodeName" jdbcType="VARCHAR"/><result column="asset_type" property="assetType" jdbcType="VARCHAR"/><result column="localtion" property="localtion" jdbcType="VARCHAR"/><result column="sn" property="sn" jdbcType="VARCHAR"/><result column="vid" property="vid" jdbcType="VARCHAR"/><result column="version" property="version" jdbcType="VARCHAR"/><result column="present_state" property="presentState" jdbcType="VARCHAR"/></resultMap><sql id="Base_Column_List">id,node_id,node_name,asset_type,localtion,sn,vid,version,present_state</sql><select id="queryHwinfoAssetManagementList" resultMap="BaseResultMap"><choose><when test="hwinfoAssetManagement.nodeIdBegin != null and hwinfoAssetManagement.nodeIdBegin !=0 and hwinfoAssetManagement.nodeIdEnd != null and hwinfoAssetManagement.nodeIdEnd !=0">select<include refid="Base_Column_List"/>from hwinfo_asset_managementwhere node_id between #{hwinfoAssetManagement.nodeIdBegin} and #{hwinfoAssetManagement.nodeIdEnd} or node_name like CONCAT('%',#{hwinfoAssetManagement.keyword},'%')order by node_id asc</when><otherwise>select<include refid="Base_Column_List"/>from hwinfo_asset_management<if test="hwinfoAssetManagement.keyword != null and hwinfoAssetManagement.keyword !=''" >where asset_type like CONCAT('%',#{hwinfoAssetManagement.keyword},'%') or node_name like CONCAT('%',#{hwinfoAssetManagement.keyword},'%') or node_id like CONCAT('%',#{hwinfoAssetManagement.keyword},'%')</if>order by node_id asc</otherwise></choose></select><insert id="batchInsertHwinfoAssetManagement">insert into hwinfo_asset_management ( node_id,node_name,asset_type,localtion,sn,vid,version,present_state ) values<foreach collection='list' item='item' index='index ' separator=', '>(#{item.nodeId}, #{item.nodeName}, #{item.assetType}, #{item.localtion}, #{item.sn}, #{item.vid}, #{item.version}, #{item.presentState} )</foreach></insert><delete id="truncateHwinfoAssetManagement">TRUNCATE TABLE hwinfo_asset_management</delete><select id="hwinfoAssetQuantityStatistic" resultType="integer">SELECT COUNT(0) FROM  hwinfo_asset_management;</select><select id="hwinfoAssetTypeStatistic" resultType="map">SELECT asset_type as assetType,COUNT(asset_type) as count FROM  hwinfo_asset_management GROUP BY asset_type;</select>
</mapper>

SfpAssetManagement

package com.hero.lte.ems.monitor.entity;/*** 光模块资产管理*/
public class SfpAssetManagement {private Integer id;//网元idprivate Integer nodeId;//起始网元id号private Integer nodeIdBegin;//结束网元id号private Integer nodeIdEnd;//网元名称private String nodeName;//资产类型private String assetType;//资产位置private String localtion;//SN硬件编码private String sn;//VID厂商编码private String vid;//单板版本号private String version;//模糊搜索private String keyword;public String getKeyword() {return keyword;}public void setKeyword(String keyword) {this.keyword = keyword;}public Integer getNodeIdBegin() {return nodeIdBegin;}public void setNodeIdBegin(Integer nodeIdBegin) {this.nodeIdBegin = nodeIdBegin;}public Integer getNodeIdEnd() {return nodeIdEnd;}public void setNodeIdEnd(Integer nodeIdEnd) {this.nodeIdEnd = nodeIdEnd;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getNodeId() {return nodeId;}public void setNodeId(Integer nodeId) {this.nodeId = nodeId;}public String getNodeName() {return nodeName;}public void setNodeName(String nodeName) {this.nodeName = nodeName;}public String getAssetType() {return assetType;}public void setAssetType(String assetType) {this.assetType = assetType;}public String getLocaltion() {return localtion;}public void setLocaltion(String localtion) {this.localtion = localtion;}public String getSn() {return sn;}public void setSn(String sn) {this.sn = sn;}public String getVid() {return vid;}public void setVid(String vid) {this.vid = vid;}public String getVersion() {return version;}public void setVersion(String version) {this.version = version;}@Overridepublic String toString() {return "SfpAssetManagement{" +"id=" + id +", nodeId=" + nodeId +", nodeIdBegin=" + nodeIdBegin +", nodeIdEnd=" + nodeIdEnd +", nodeName='" + nodeName + '\'' +", assetType='" + assetType + '\'' +", localtion='" + localtion + '\'' +", sn='" + sn + '\'' +", vid='" + vid + '\'' +", version='" + version + '\'' +", keyword='" + keyword + '\'' +'}';}
}

SfpAssetManagementService

package com.hero.lte.ems.monitor.service;import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.monitor.entity.SfpAssetManagement;import java.util.List;
import java.util.Map;public interface SfpAssetManagementService {Page<SfpAssetManagement> querySfpAssetManagementList(Page<SfpAssetManagement> pager);List<SfpAssetManagement> querySfpAssetManagementList(SfpAssetManagement sfpAssetManagement);int batchInsertSfpAssetManagement(List<SfpAssetManagement> list);int truncateSfpAssetManagement();int sfpAssetQuantityStatistic();List<Map<String,Object>> sfpAssetTypeStatistic();
}

SfpAssetManagementServiceImpl

package com.hero.lte.ems.monitor.service.impl;import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.monitor.dao.SfpAssetManagementMapper;
import com.hero.lte.ems.monitor.entity.SfpAssetManagement;
import com.hero.lte.ems.monitor.service.SfpAssetManagementService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;/*** @author l22898*/
@Service
public class SfpAssetManagementServiceImpl implements SfpAssetManagementService {private static final Logger logger = LoggerFactory.getLogger(SfpAssetManagementServiceImpl.class);@Resourceprivate SfpAssetManagementMapper sfpAssetManagementMapper;@Overridepublic Page<SfpAssetManagement> querySfpAssetManagementList(Page<SfpAssetManagement> pager) {SfpAssetManagement param = pager.getParam();if (!StringUtils.isEmpty(param) && isNumberDashNumber(param.getKeyword())) {if (param.getKeyword().contains("-")) {String[] split = param.getKeyword().split("-");param.setNodeIdBegin(Integer.valueOf(split[0]));param.setNodeIdEnd(Integer.valueOf(split[1]));}}sfpAssetManagementMapper.querySfpAssetManagementList(pager, param);return pager;}@Overridepublic List<SfpAssetManagement> querySfpAssetManagementList(SfpAssetManagement sfpAssetManagement) {if (sfpAssetManagement.getKeyword().contains("-") && isNumberDashNumber(sfpAssetManagement.getKeyword())) {String[] split = sfpAssetManagement.getKeyword().split("-");sfpAssetManagement.setNodeIdBegin(Integer.valueOf(split[0]));sfpAssetManagement.setNodeIdEnd(Integer.valueOf(split[1]));}return sfpAssetManagementMapper.querySfpAssetManagementList(sfpAssetManagement);}public static boolean isNumberDashNumber(String str) {// 正则表达式判断格式是否为 "数字-数字"String regex = "^\\d+-\\d+$";return Pattern.matches(regex, str);}public static boolean isInteger(String str) {try {Integer.parseInt(str);return true;} catch (NumberFormatException e) {return false;}}@Overridepublic int batchInsertSfpAssetManagement(List<SfpAssetManagement> list) {return sfpAssetManagementMapper.batchInsertSfpAssetManagement(list);}@Overridepublic int truncateSfpAssetManagement() {return sfpAssetManagementMapper.truncateSfpAssetManagement();}@Overridepublic int sfpAssetQuantityStatistic() {return sfpAssetManagementMapper.sfpAssetQuantityStatistic();}@Overridepublic List<Map<String,Object>> sfpAssetTypeStatistic() {return sfpAssetManagementMapper.sfpAssetTypeStatistic();}
}

SfpAssetManagementMapper

package com.hero.lte.ems.monitor.dao;import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.monitor.entity.SfpAssetManagement;
import org.apache.ibatis.annotations.Param;import java.util.List;
import java.util.Map;public interface SfpAssetManagementMapper {List<SfpAssetManagement> querySfpAssetManagementList(@Param("page") Page pager, @Param("sfpAssetManagement") SfpAssetManagement sfpAssetManagement);List<SfpAssetManagement> querySfpAssetManagementList(@Param("sfpAssetManagement") SfpAssetManagement sfpAssetManagement);int batchInsertSfpAssetManagement(@Param("list") List<SfpAssetManagement> list);int truncateSfpAssetManagement();int sfpAssetQuantityStatistic();List<Map<String,Object>> sfpAssetTypeStatistic();
}

SfpAssetManagementMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.hero.lte.ems.monitor.dao.SfpAssetManagementMapper"><resultMap id="BaseResultMap" type="com.hero.lte.ems.monitor.entity.SfpAssetManagement"><id column="id" property="id" jdbcType="INTEGER"/><result column="node_id" property="nodeId" jdbcType="INTEGER"/><result column="node_name" property="nodeName" jdbcType="VARCHAR"/><result column="asset_type" property="assetType" jdbcType="VARCHAR"/><result column="localtion" property="localtion" jdbcType="VARCHAR"/><result column="sn" property="sn" jdbcType="VARCHAR"/><result column="vid" property="vid" jdbcType="VARCHAR"/><result column="version" property="version" jdbcType="VARCHAR"/></resultMap><sql id="Base_Column_List">id,node_id,node_name,asset_type,localtion,sn,vid,version</sql><select id="querySfpAssetManagementList" resultMap="BaseResultMap"><choose><when test="sfpAssetManagement.nodeIdBegin != null and sfpAssetManagement.nodeIdBegin !=0 and sfpAssetManagement.nodeIdEnd != null and sfpAssetManagement.nodeIdEnd !=0">select<include refid="Base_Column_List"/>from sfp_asset_managementwhere node_id between #{sfpAssetManagement.nodeIdBegin} and #{sfpAssetManagement.nodeIdEnd} or node_name like CONCAT('%',#{sfpAssetManagement.keyword},'%')order by node_id asc</when><otherwise>select<include refid="Base_Column_List"/>from sfp_asset_management<if test="sfpAssetManagement.keyword != null and sfpAssetManagement.keyword !=''" >where asset_type like CONCAT('%',#{sfpAssetManagement.keyword},'%') or node_name like CONCAT('%',#{sfpAssetManagement.keyword},'%') or node_id like CONCAT('%',#{sfpAssetManagement.keyword},'%')</if>order by node_id asc</otherwise></choose></select><insert id="batchInsertSfpAssetManagement">insert into sfp_asset_management ( node_id,node_name,asset_type,localtion,sn,vid,version ) values<foreach collection='list' item='item' index='index ' separator=', '>(#{item.nodeId}, #{item.nodeName}, #{item.assetType}, #{item.localtion}, #{item.sn}, #{item.vid}, #{item.version} )</foreach></insert><delete id="truncateSfpAssetManagement">TRUNCATE TABLE sfp_asset_management</delete><select id="sfpAssetQuantityStatistic" resultType="integer">SELECT COUNT(0) FROM  sfp_asset_management;</select><select id="sfpAssetTypeStatistic" resultType="map">SELECT asset_type as assetType,COUNT(asset_type) as count FROM  sfp_asset_management GROUP BY asset_type;</select>
</mapper>

建表sql

DROP TABLE IF EXISTS `hwinfo_asset_management`;
CREATE TABLE `hwinfo_asset_management`  (`id` int(11) NOT NULL AUTO_INCREMENT,`node_id` int(11) NULL DEFAULT NULL COMMENT '网元id',`node_name` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '网元名称',`asset_type` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资产类型',`localtion` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资产位置',`sn` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'SN硬件编码',`vid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'VID厂商编码',`version` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '单板版本号',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '硬件资产管理表' ROW_FORMAT = Compact;DROP TABLE IF EXISTS `sfp_asset_management`;
CREATE TABLE `sfp_asset_management`  (`id` int(11) NOT NULL AUTO_INCREMENT,`node_id` int(11) NULL DEFAULT NULL COMMENT '网元id',`node_name` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '网元名称',`asset_type` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资产类型',`localtion` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资产位置',`sn` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'SN硬件编码',`vid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'VID厂商编码',`version` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '单板版本号',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '光模块资产管理表' ROW_FORMAT = Compact;
http://www.xdnf.cn/news/967195.html

相关文章:

  • 亚远景-ASPICE评估标准解析:汽车软件开发的过程能力模型
  • 【Java多线程从青铜到王者】懒汉模式的优化(九)
  • WebLogic简介
  • 第6章 方法 笔记
  • DevSecOps实践:CI/CD流水线集成SAST工具的完整指南
  • 【LeetCode】二叉树相关算法题
  • 笔记 软件工程复习
  • Vue.js教学第二十二章:vue实战项目商城项目
  • el-upload组件,上传文件失败,:on-error方法失效
  • 人工智能与大数据融合发展:新一代智能系统的演进路径
  • 计算机行业光辉开始暗淡
  • Unity3D中Gfx.WaitForPresent优化方案
  • 性能监控的核心要点
  • RestClient
  • AI书签管理工具开发全记录(二十):打包(完结篇)
  • 零基础学前端-传统前端开发(第一期-开发软件介绍与本系列目标)(VScode安装教程)
  • 群晖Nas - Docker(ContainerManager)上安装GitLab
  • Linux内核 -- INIT_WORK 使用与注意事项
  • Windows 文件路径与文件名限制
  • 如何根据excel表生成sql的insert脚本
  • ABP vNext + Hive 集成:多租户大数据 SQL 查询与报表分析
  • 【iOS】cell的复用以及自定义cell
  • 使用NNI剪枝工具对VGG16网络进行剪枝,同时使用知识蒸馏对剪枝后结果进行优化。(以猫狗二分类为例)
  • 认证与授权的区别与联系
  • 看板任务描述不清如何解决
  • 数据库学习笔记(十五)--变量与定义条件与处理程序
  • 云蝠智能大模型语音智能体:构建心理咨询领域的智能助手
  • leetcode1034. 边界着色-medium
  • 使用mpu6500, PID,互补滤波实现一个简单的飞行自稳控制系统
  • 南昌市新建区委书记陈奕蒙会见深兰科技集团董事长陈海波一行