匯入csv檔案,並且update
阿新 • • 發佈:2018-12-09
<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> 關聯終端</button> <button type="button" class="btn btn-primary btn-sm" id="btn_project_lc_icadd"><i class="fa fa-plus"></i> 新建</button> <button type="button" class="btn btn-primary btn-sm" id="btn_project_lc_icedit"><i class="fa fa-edit"></i> 修改</button> <button type="button" class="btn btn-success btn-sm" id="btn_project_lc_icsave"><i class="fa fa-save"></i> 提交</button> <button type="button" class="btn btn-warning btn-sm" id="btn_project_lc_icdel"><i class="fa fa-close"></i> 刪除</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">×</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> 模板下載 </button> <button type="button" class="btn btn-default btn-sm" data-dismiss="modal"><i class="fa fa-share-square"></i> 關閉視窗</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>