1. 程式人生 > >匯入csv檔案,並且update

匯入csv檔案,並且update

<div class="col-lg-12 col-sm-12">
	<div class="form-group pull-right">
		<button type="button" class="btn btn-primary btn-sm" id="btn_project_lc_relation"><i class="fa fa-plus"></i>&nbsp;關聯終端</button>
		<button type="button" class="btn btn-primary btn-sm" id="btn_project_lc_icadd"><i class="fa fa-plus"></i>&nbsp;新建</button>
		<button type="button" class="btn btn-primary btn-sm" id="btn_project_lc_icedit"><i class="fa fa-edit"></i>&nbsp;修改</button>
		<button type="button" class="btn btn-success btn-sm" id="btn_project_lc_icsave"><i class="fa fa-save"></i>&nbsp;提交</button>
		<button type="button" class="btn btn-warning btn-sm" id="btn_project_lc_icdel"><i class="fa fa-close"></i>&nbsp;刪除</button>
	</div>
</div>
function bindBtnClickFunc(){
	// 關聯終端
	$("#btn_project_lc_relation").unbind("click");
	$("#btn_project_lc_relation").on('click', function(){
		btn_project_lc_relation_click();
	});
	
}

//關聯終端
function btn_project_lc_relation_click() {
	var projectid = $("#pj_form_projectid").val();
	if(projectid == undefined || projectid == null || projectid == ""){
		swal('提示',"請選擇關聯的專案!",'warning');
		return;
	}
	showGwMigrateSetWin();
}

要說執行的先後順序,onsubmit在先,先驗證,驗證返回false時,則無法到達action="url"地址。

如果是返回true或者沒有返回值,則通過action轉向url地址。 也就是說onsubmit可以阻止action的提交 。

<%@page pageEncoding="UTF-8"%>
<div class="modal fade" id="gwm_migrate_modal_win" tabindex="-1" role="dialog" aria-labelledby="gwm_migrate_modal_win" aria-hidden="true">
    <div class="modal-dialog modal-lg" data-backdrop="false"> <!-- modal-lg -->
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h5 class="modal-title text-blue">關聯終端</h5>
            </div>
            <div class="modal-body">
            <form id="dev_project_form" action="<%=path%>/osm/devProject.do" method="post" enctype="multipart/form-data"  onsubmit="return devProjectSetformsubmit();">
				<div class="row">
					<input type="hidden" id="dev_form_projectid"   name="dev_form_projectid"   value="" />
					
				</div>
				<div class="row">
					<div class="col-lg-12 col-sm-12">
					<div class="form-group">
						<label for="gwm_migrate_gweuis">終端DEVEUI列表</label>
						<textarea class="form-control" rows="3" id="dev_project_gweuis"  name="dev_project_gweuis" placeholder="多個終端DEVEUI列表用英文逗號分隔,也可批量檔案匯入,直接輸入優先..."></textarea>					
					</div>
					</div>
				</div>
				<div class="row">
					<!-- <div class="col-lg-4 col-sm-4">
						<div class="form-group">
							<label for="gwm_migrate_remark">備註</label>
							<input type="text" class="form-control" id="gwm_migrate_remark" name="gwm_migrate_remark">	
						</div>
					</div> -->
					<div class="col-lg-8 col-sm-8">
					<div class="form-group">
						<label for="gwm_migrate_gweuis">終端DEVEUI檔案匯入</label>
						<input type="file" class="form-control" id="dev_project_file" name="dev_project_file" placeholder="通過csv檔案方式匯入終端DEVEUI..." >						
					</div>
					</div>
				</div>				
				<div class="row">
					<div class="col-lg-6 col-sm-6">
						<label><i class="fa fa-commenting-o"></i><span id="gwm_migrate_progresshint"></span></label>
					</div>
					<!--  progress-striped active 帶有條紋的進度條. -->
	              	<div class="col-lg-6 col-sm-6">
	              		<div class="progress active " style="margin-top: 6px; margin-bottom: 7px;">
						    <div id="gwm_migrate_progress" class="progress-bar progress-bar-success" role="progressbar"
						         aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">
						        <span class="sr-only">進度:0%</span>
						    </div>
						</div>
	              	</div> 
				</div>
				<div class="row">					
				 	<div class="col-lg-12 col-sm-12">
		                <div class="form-group pull-right"> 
		                    <input type="submit" class="btn btn-primary btn-sm" id="btn_gwm_migrate_submit" value="關聯終端" />
							<button type="button" class="btn btn-default btn-sm" id="btn_gwm_migrate_tpdown">
								<i class="fa fa-download"></i>&nbsp;模板下載
							</button>					
							<button type="button" class="btn btn-default btn-sm" data-dismiss="modal"><i class="fa fa-share-square"></i>&nbsp;關閉視窗</button>
						</div>
					</div>
				</div>
			</form>
			</div>
        </div><!-- /.modal-content -->
    </div><!-- /.modal -->
</div>
/**
 * 關聯終端設定面板.
 */
var gwm_migrate_modal_winId = "#gwm_migrate_modal_win";
var g_gwm_mirgrate_progresskey = "";

/**
 * 顯示關聯終端設定面板
 * 
 */
function showGwMigrateSetWin(){  
	$(gwm_migrate_modal_winId).unbind("hidden.bs.modal");
    $(gwm_migrate_modal_winId).on("hidden.bs.modal", function() {
        $(this).removeData("bs.modal");
    });
    $(gwm_migrate_modal_winId).unbind('shown.bs.modal');
    $(gwm_migrate_modal_winId).on('shown.bs.modal', function () {
    	$(gwm_migrate_modal_winId).css("top", "36%");
    	$("#dev_project_file").val("");
    	$("#dev_project_gweuis").val("");
    	func_dev_project_set_progress(0, 0, "");
    	// 初始化BossIm列表.
    	/*initGwmBossImSelectList();*/
    	bindGwmMigrateBtnFunc();
    });
	// show modal window
	$(gwm_migrate_modal_winId).modal({backdrop: 'static', keyboard: false});
	//可拖拽
	$(gwm_migrate_modal_winId).draggable({cursor: "move", handle: '.modal-header'});
	//去掉modal遮蔽層
    $(gwm_migrate_modal_winId).modal('show'); 
}

//批量匯入form的ajax提交,防止頁面跳轉. 
function devProjectSetformsubmit(){
	var projectid = $("#pj_form_projectid").val();
	if(projectid == undefined || projectid == null || projectid == ""){
		swal('提示',"請選擇關聯的專案!",'warning');
		return false;
	}
	var gwEuis = $("#dev_project_gweuis").val();
	if(gwEuis == undefined || gwEuis == null || gwEuis == ""){
		var fileName = $("#dev_project_file").val();
		if(fileName == undefined || fileName == null || fileName == ""){
			swal('提示', '請設定終端DEVEUI列表或選擇匯入檔案!','warning');
			return false;
		}				
	}	
	swal({
	  title: "關聯終端",
	  text: "請確認是否要關聯當前專案到目標終端?",
	  type: "warning",
	  showCancelButton: true,
	  confirmButtonColor: "#DD6B55",
	  confirmButtonText: "Yes",
	  closeOnConfirm: true
	},
	function(isConfirm){
		if (isConfirm) {	
			var gwEuis = $("#dev_project_gweuis").val();
			if(gwEuis != undefined && gwEuis != null && gwEuis != ""){
				// 優先按直接輸入的deveui進行關聯終端
				submitGwMigrateWithInput(projectid);	
				return false;
			}
			//給form中賦值
			$("#dev_form_projectid").val(projectid);
			$("#dev_project_form").ajaxSubmit(function(ret) { 
				if(ret.retCode == 0){
					// 服務端處理成功(開始遷移之前),會返回本次操作的編碼,供後續進度查詢.
					g_gwm_mirgrate_progresskey = ret.retRemark;
					on_gwm_migrate_submit();
				} else { 
					swal('提示','關聯終端失敗!\n'+ret.retRemark,'warning');
				}
			}); 
			return false; 
		}
	});
	return false;
}

/**
 * 直接輸入終端deveid
 * 
 * @returns
 */
function submitGwMigrateWithInput(projectid){
	var gweuis = $("#dev_project_gweuis").val(); 
	$.ajax({
	    type: "POST",
	    url: ctx+"/osm/devProjectWithInput.do", 
	    data: {
	    	dev_project_gweuis:gweuis,
	    	projectid: projectid
	    },
	    dataType: 'json',
	    success: function (ret) {
	    	if(ret.retCode == 0){
				// 服務端處理成功(開始遷移之前),會返回本次操作的編碼,供後續進度查詢.
				g_gwm_mirgrate_progresskey = ret.retRemark;
				on_gwm_migrate_submit();
			} else { 
				swal('提示','關聯終端失敗!\n'+ret.retRemark,'warning');
			}
	    },
	    error: function (err) {
	    	var error = "["+err.status+"]"+err.responseText;
	    	if(error.length > 300){
	    		error = error.substr(0, 300);
	    	}	
	    	swal('提示',"關聯終端請求提交失敗!\n"+error,'warning');
	    }
	});
}


/**
 * 按鈕事件繫結
 * 
 * @returns
 */
function bindGwmMigrateBtnFunc(){
	$("#btn_gwm_migrate_tpdown").unbind("click");
	$("#btn_gwm_migrate_tpdown").on('click', function(){
		btn_gwm_migrate_tpdown_click();
	});
	/*$('#gwm_migrate_destbimname').change(function () {
		var destBimId = $('#gwm_migrate_destbimname').val();
		$("#gwm_migrate_destbimid").val(destBimId);
	});*/
}

/**
 * GwEUI批量遷移模板csv檔案下載
 * @returns
 */
function btn_gwm_migrate_tpdown_click(){
	window.location.href=ctx+"/resources/template/ZTE-CLAA-Gw-batch-devproject-import-template.csv";
}

/**
 * 點選GW批量遷移的提交按鈕,啟動定時器查詢匯入進度
 * 
 * @returns
 */
function on_gwm_migrate_submit(){
	// 初始化進度條》
	func_dev_project_set_progress(0, 0, " ");
	$('#btn_gwm_migrate_submit').attr('disabled', true);
	// 啟動定時器.
	var counter = 0; 
	var progTimer = setInterval(function() {
		var ajaxPara = {progresskey: g_gwm_mirgrate_progresskey}; 
	  	var ajaxUrl = ctx+"/osm/migrateProgressQry.do";
	  	$.ajax({
		    type: "POST",
		    url: ajaxUrl, 
		    data: ajaxPara,
		    dataType: 'json',
		    success: function (ret) {
		    	counter = counter + 1;
		    	if(ret && ret != null){
		    		var flag = 0;
		    		if(ret.succ == false){
		    			flag = 1;
		    		}
		    		func_dev_project_set_progress(ret.progVal, flag, ret.progRemark);
		    		if(ret.progVal >= 100 || counter > 1200){
		    			clearInterval(progTimer);
		    			$('#btn_gwm_migrate_submit').attr('disabled', false);
		    		}
		    		if(counter > 20 && g_gwm_mirgrate_progresskey == ""){
		    			clearInterval(progTimer);
		    			$('#btn_gwm_migrate_submit').attr('disabled', false);
		    			func_dev_project_set_progress(100, 0, ""); 
		    		}
		    	}
		    },
		    error: function (err) {
		    	$('#btn_gwm_migrate_submit').attr('disabled', false);
		    	var error = "["+err.status+"]"+err.responseText;
		    	if(error.length > 300){
		    		error = error.substr(0, 300)+"...";
		    	}
		    	func_dev_project_set_progress(100, 1, error); 
		    	clearInterval(progTimer);
		    	
		    }
		});
		
	}, 1000);
	// return true;
}

/**
 * 設定進度條進度
 * 
 * @param progressVal 進度值,0~100;
 * @param flag: 0--成功;1--失敗;
 * @returns
  progress-bar-danger   紅色
  progress-bar-warning  黃色
  progress-bar-info     藍色
  progress-bar-success  綠色
 */
function func_dev_project_set_progress(progressVal, flag, remark){
	// 失敗.
	if(flag == 1){
		$("#gwm_migrate_progress").removeClass("progress-bar-success");
		$("#gwm_migrate_progress").addClass("progress-bar-danger");
	} else if(flag == 0){
		$("#gwm_migrate_progress").removeClass("progress-bar-danger");
		$("#gwm_migrate_progress").addClass("progress-bar-success");
	}
	$("#gwm_migrate_progress").css("width",progressVal + "%").text(progressVal + "%");
	$("#gwm_migrate_progresshint").html(remark);	
}

後臺程式碼:

/**
 * 關聯終端(csv檔案)手動輸入
 * 
 * @param request
 * @param response
 * @return
 */
@RequestMapping("devProjectWithInput")
@ResponseBody
public ClaaAjaxResult devProjectWithInput(HttpServletRequest request, HttpServletResponse response) throws Exception 
{
	ClaaAjaxResult ret = new ClaaAjaxResult();
	String randomStr = Long.toUnsignedString(UUID.randomUUID().getLeastSignificantBits());
	try{		
		String deveuis = request.getParameter("dev_project_gweuis"); // 逗號分隔.
		String projectid = request.getParameter("projectid"); 
		// 在gweui輸入框中批量設定了gwEUI!.
		this.setProgress(randomStr, 1, true, "開始處理關聯終端...");
		List<String> deveuiList = new ArrayList<String>();
		if(deveuis != null && !deveuis.trim().equals("")){
			String[] gwEuiArr = deveuis.trim().split(",");
			for(String gweui : gwEuiArr){
				if(gweui == null || gweui.trim().equals("")){
					continue;
				}
				if(deveuiList.contains(gweui.trim())){
					continue;
				}
				deveuiList.add(gweui.trim());
			}
		} 
		if(deveuiList.size() == 0){
			this.setProgress(randomStr, 100, true, "沒有待關聯的終端!");
			ret.setRetCode(ClaaAjaxResult.RET_CODE_OK);
			ret.setRetRemark("沒有待關聯的終端!");
			return ret;
		}
		/*GwMigrateBean migrate = new GwMigrateBean();
		migrate.setDESTBIMID(destBimId);
		migrate.setDESTBIMNAME(destBimNm);
		migrate.setDESTMSPID(destMspId);
		migrate.setDESTMSPIDTYPE(Integer.parseInt(destMspTpStr));
		migrate.setOPTIME(new Timestamp(System.currentTimeMillis()));
		migrate.setREMARK(remark);
		migrate.setSRCBIMID(srcBimId);
		migrate.setSRCBIMNAME(srcBimNm);
		migrate.setSTATE(GwMigrateBean.STATE_INIT);*/
		//this.migrateGwInAsyncWay(migrate, randomStr, gwEUIList);	
		
		OsmDev osmDev = new OsmDev();
		osmDev.setProjectid(projectid);
		this.modifyOsmDevs(osmDev, randomStr, deveuiList);	
		
		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;
}



/**
 * 關聯終端(csv檔案)匯入
 * 
 * @param request
 * @param response
 * @return
 */
@RequestMapping("devProject")
@ResponseBody
public ClaaAjaxResult devProject(@RequestParam(value="dev_project_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{		
		String projectid = request.getParameter("dev_form_projectid"); 
		
		// 在gweui輸入框中批量設定了gwEUI!.
		this.setProgress(randomStr, 1, true, "開始處理關聯終端...");
		List<String> deveuiList = new ArrayList<String>();
		// 獲得原始檔名  
		String fileName = file.getOriginalFilename();  	        
		logger.info("gwbatchImport(): origin 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
		GwMigrateCSVFileParser gwEuiCsvParser = new GwMigrateCSVFileParser(f.getAbsolutePath());
		List<String> csvEuiList = gwEuiCsvParser.parseFile();
		deveuiList.addAll(csvEuiList);			
		if(deveuiList.size() == 0){
			this.setProgress(randomStr, 100, true, "沒有待關聯的終端!");
			ret.setRetCode(ClaaAjaxResult.RET_CODE_OK);
			ret.setRetRemark("沒有待關聯的終端!");
			return ret;
		}
		
		OsmDev osmDev = new OsmDev();
		osmDev.setProjectid(projectid);
		this.modifyOsmDevs(osmDev, randomStr, deveuiList);
		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 modifyOsmDevs(OsmDev osmDev, String randomStr, List<String> deveuiList) throws Exception {
	logger.info("Begin process gateway migration: totalNum="+deveuiList.size());
	final User u = this.getLoginUser();
	ExecutorService execSvr = Executors.newSingleThreadExecutor();
	execSvr.submit(new Runnable(){
		@Override
		public void run() {
			try {
				StringBuffer errBuf = new StringBuffer();
				int errCount = 0; 
				int totalNum = deveuiList.size();
				totalNum = (totalNum == 0) ? 1 : totalNum;					
				double stepVal = 100.0 / totalNum;
				int cc = 0;
				for(String deveui : deveuiList){
					cc++; 
					osmDev.setDeveui(deveui);
					try{
						projectService.modifyOsmDevs(osmDev);
						setProgress(randomStr, (int)(cc*stepVal), true, "關聯終端成功:"+deveui);
						logger.info("Migrate gateway OK: "+deveui);
					} catch(Exception e){
						errBuf.append(deveui).append("關聯失敗:"+e.getMessage()).append("; ");
						logger.error("Migrate gateway failed: "+deveui+", err="+e.getMessage(), e);
					}
				}
				if(errCount > 0){
					String err = errBuf.toString();
					logger.warn("Migrate gateway errinfo: "+err);
					int len = err.length();
					len = (len > 200) ? 200 : len;
					setProgress(randomStr, 100, false, err.substring(0, len)+"(詳見系統日誌)...");
				} else {
					setProgress(randomStr, 100, true, "success");
				}
				logger.info("Finish migrate gateway!");
			}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(); 
			}
		}
	});		
}
public void modifyOsmDevs(OsmDev osmDev) throws Exception;

public void modifyOsmDevs(OsmDev osmDev) throws Exception {
	this.projectMapper.modifyOsmDevs(osmDev);
}

public void modifyOsmDevs(@Param("osmDev") OsmDev osmDev) throws Exception;
<update id="modifyOsmDevs"> 
	 update osmdb.t_osm_dev t  
	 <set>
		<if test='osmDev.projectid != null and osmDev.projectid != "" '>
			t.projectid = #{osmDev.projectid, jdbcType=VARCHAR}, 
		</if>
	 </set>
	 <if test='osmDev.deveui != null and osmDev.deveui != "" '>
			where t.deveui = #{osmDev.deveui, jdbcType=VARCHAR}  
	 </if>
</update>