cvStr = this.getCellValue(row, j++);
if (cvStr == null || cvStr.trim().equals("")) {
// 7纬度
osmDev.setGpslat(0D);
} else {
try {
osmDev.setGpslat(Double.valueOf(cvStr.trim()));
} catch (Exception err) {
logger.error("gpsln parse error: " + cvStr.trim());
}
}
全代码:
/**
* //18.10.11加设备的批量导入
* 设备批量(csv文件)导入
*
* @param request
* @param response
* @return
*/
@RequestMapping("devbatchImport")
@ResponseBody
public ClaaAjaxResult devbatchImport(@RequestParam(value="dev_import_file", required=false) CommonsMultipartFile file,
HttpServletRequest request, HttpServletResponse response) throws Exception
{
if(!checkAccessRight(Constants.OPCODE_OSM_DEV_MOD)){
this.addSmLog(MODULE_NAME, SmLogBean.OP_RET_FAIL, "权限不足", "尝试批量导入设备信息", "");
throw this.genNoRightException();
}
ClaaAjaxResult ret = new ClaaAjaxResult();
String randomStr = Long.toUnsignedString(UUID.randomUUID().getLeastSignificantBits());
try{
this.setProgress(randomStr, 1, true, "开始导入设备信息...");
List<OsmDev> devList = new ArrayList<OsmDev>();
// 获得原始文件名
String fileName = file.getOriginalFilename();
logger.info("devbatchImport(): file name=" + fileName);
// 新文件名.
String filePath = this.getUploadPath(request)+randomStr+"_"+ fileName;
filePath = filePath.replaceAll("\\\\", "/");
logger.info("filePath: "+filePath);
// 上传
File f = new File(filePath);
file.transferTo(f);
// 异步解析文件csv
DevImportCSVFileParser gwEuiCsvParser = new DevImportCSVFileParser(f.getAbsolutePath());
List<OsmDev> csvEuiList = gwEuiCsvParser.parseFile();
devList.addAll(csvEuiList);
if(devList.size() == 0){
this.setProgress(randomStr, 100, true, "没有待导入的设备信息!");
ret.setRetCode(ClaaAjaxResult.RET_CODE_OK);
ret.setRetRemark("没有待导入的设备信息!");
return ret;
}
this.addOsmDevs(randomStr, devList);
ret.setRetCode(ClaaAjaxResult.RET_CODE_OK);
// 将随机数返回,用于后续批量导入进度查询。
ret.setRetRemark(randomStr);
}catch(Exception ex){
ret.setRetCode(ClaaAjaxResult.RET_CODE_ERR);
ret.setRetRemark(ex.getMessage());
this.setProgress(randomStr, 100, false, ex.getMessage());
}
this.addOpLog(ret, MODULE_NAME, "批量导入设备", "导入请求提交", "请求批次编号:"+randomStr);
return ret;
}
/**
* 以异步方式进行导入设备
*
* @param excelFile
* @param randomStr
* @param extParaMap
* @throws Exception
*/
private void addOsmDevs(String randomStr, List<OsmDev> devList) throws Exception {
logger.info("Begin process Dev: totalNum="+devList.size());
final User u = this.getLoginUser();
ExecutorService execSvr = Executors.newSingleThreadExecutor();
execSvr.submit(new Runnable(){
@Override
public void run() {
try {
StringBuffer errBuf = new StringBuffer();
int totalNum = devList.size();
totalNum = (totalNum == 0) ? 1 : totalNum;
double stepVal = 100.0 / totalNum;
int cc = 0;
for(OsmDev osmDev : devList){
cc++;
if(osmDev == null){
continue;
}
try {
String deveui = osmDev.getDeveui();
if (deveui == null || deveui.trim().equals("")) {
continue;
}
OsmDev curOsmdev = devService.queryOsmDev(deveui);
if (curOsmdev == null) {
devService.addOsmDevImport(osmDev);
} else {
//设备类型
String csvdevTp = osmDev.getDevType();
if (csvdevTp != null && !csvdevTp.trim().equals("")) {
curOsmdev.setDevType(csvdevTp);
}
//发货单
String csvordno = osmDev.getOrdNo();
if (csvordno != null && !csvordno.trim().equals("") && !"NA".equals(csvordno)) {
curOsmdev.setOrdNo(csvordno);
}
//设备状态
Integer csvdevStatus = osmDev.getDevStatus();
if (csvdevStatus != null) {
curOsmdev.setDevStatus(csvdevStatus);
}
//地址
String csvaddress = osmDev.getAddress();
if (csvaddress != null && !csvaddress.trim().equals("")) {
curOsmdev.setAddress(csvaddress);
}
//归属项目
String csvprojectid = osmDev.getProjectid();
if (csvprojectid != null && !csvprojectid.trim().equals("")) {
curOsmdev.setProjectid(csvprojectid);
}
Double csvlat = osmDev.getGpslat();
if (csvlat != null) {
curOsmdev.setGpslat(csvlat);
}
Double csvlng = osmDev.getGpslng();
if (csvlng != null) {
curOsmdev.setGpslng(csvlng);
}
Float csvalt = osmDev.getGpsalt();
if (csvalt != null) {
curOsmdev.setGpsalt(csvalt);
}
String csvremark = osmDev.getRemark();
if (csvremark != null && !csvremark.trim().equals("")) {
curOsmdev.setRemark(csvremark);
}
devService.modifyDevImport(curOsmdev);
}
setProgress(randomStr, (int) (cc * stepVal), true, "导入设备信息成功");
logger.info("addOsmDev OK: " + osmDev.getDeveui());
} catch(Exception e){
errBuf.append(osmDev.getDeveui()).append("导入设备信息失败:"+e.getMessage()).append("; ");
logger.error("addOsmContracts failed: "+osmDev.getDeveui()+", err="+e.getMessage(), e);
setProgress(randomStr, 100, false, e.getMessage());
}
}
}catch(Exception ex){
logger.error(ex.getMessage(), ex);
setProgress(randomStr, 100, false, ex.getMessage());
}catch(Throwable err){
logger.error(err.getMessage(), err);
setProgress(randomStr, 100, false, err.getMessage());
}finally {
// 停掉线程池.
execSvr.shutdown();
checkProgressMap();
}
}
});
}
/**
* 读取csv中的数据
*
* @return List<String>
* @author
*/
public List<OsmDev> parseFile() {
List<OsmDev> ret = new ArrayList<OsmDev>();
// 1.读取有效数据行
CsvReader reader = null;
List<String[]> rawRowList = new ArrayList<String[]>();
try {
reader = new CsvReader(this.filePath, ',', Charset.forName("UTF-8"));
// 跳过表头 如果需要表头的话,这句可以忽略
reader.readHeaders();
// 去掉空白行.
reader.setSkipEmptyRecords(true);
// trim
reader.setTrimWhitespace(true);
// 逐行读入除表头的数据
while (reader.readRecord()) {
// reader.getRawRecord() 读取原始行字符串.
rawRowList.add(reader.getValues());
}
logger.info("Step.1>>Load file success: " + this.filePath + ", recordNum=" + rawRowList.size());
} catch (Exception e) {
logger.error("Step.1>>Load csv failed: " + this.filePath, e);
return null;
} finally {
reader.close();
reader = null;
}
// 2. 解析各行
/**
* GWEUI
*/
for (String[] row : rawRowList) {
// new contract 对象...
OsmDev osmDev = new OsmDev();
int j = 0;
String cvStr = this.getCellValue(row, j++);
if (cvStr == null) {
cvStr = "";
}
// 1设备编号
osmDev.setDeveui(cvStr.trim());
cvStr = this.getCellValue(row, j++);
if (cvStr == null || cvStr.trim().equals("")) {
// 2发货单,如果发货单没填值,设个默认值NA
osmDev.setOrdNo("NA");
} else {
osmDev.setOrdNo(cvStr);
}
cvStr = this.getCellValue(row, j++);
if (cvStr == null) {
cvStr = "";
}
// 3设备类型
osmDev.setDevType(cvStr.trim());
cvStr = this.getCellValue(row, j++);
if (cvStr != null && !cvStr.trim().equals("")) {
try{
// 4.设备状态
osmDev.setDevStatus(Integer.parseInt(cvStr.trim()));
} catch (Exception err) {
logger.error("gpsln parse error: " + cvStr.trim());
}
}
cvStr = this.getCellValue(row, j++);
if (cvStr == null) {
cvStr = "";
}
// 5终端位置
osmDev.setAddress(cvStr.trim());
cvStr = this.getCellValue(row, j++);
if (cvStr == null) {
cvStr = "";
}
// 6归属项目
osmDev.setProjectid(cvStr.trim());
cvStr = this.getCellValue(row, j++);
if (cvStr == null || cvStr.trim().equals("")) {
// 7纬度
osmDev.setGpslat(0D);
} else {
try {
osmDev.setGpslat(Double.valueOf(cvStr.trim()));
} catch (Exception err) {
logger.error("gpsln parse error: " + cvStr.trim());
}
}
cvStr = this.getCellValue(row, j++);
if (cvStr == null || cvStr.trim().equals("")) {
// 8经度
osmDev.setGpslng(0D);
} else {
try {
osmDev.setGpslng(Double.valueOf(cvStr.trim()));
} catch (Exception err) {
logger.error("gpsln parse error: " + cvStr.trim());
}
}
cvStr = this.getCellValue(row, j++);
if (cvStr == null || cvStr.trim().equals("")) {
// 9海拔
osmDev.setGpsalt(1F);
} else {
try {
osmDev.setGpsalt(Float.valueOf(cvStr.trim()));
} catch (Exception err) {
logger.error("gpsln parse error: " + cvStr.trim());
}
}
cvStr = this.getCellValue(row, j++);
if (cvStr == null) {
cvStr = "";
}
// 10备注
osmDev.setRemark(cvStr.trim());
ret.add(osmDev);
}
logger.info("Step.2>>Parse file success: " + this.filePath);
return ret;
}
/**
* 返回每一行各cell的值
*
* @param row
* @param cellId
* @return
*/
private String getCellValue(String[] row, int cellId) {
if (row == null || row.length <= cellId) {
return "";
}
return row[cellId];
}