F7控件監聽css
f7控件的監聽是指,在點擊F7控件時,對控件內的內容進行選中後出發該事件監聽;經過參數value能夠獲取當前F7控件的一些值信息。html
1 //人力編制方案監聽 回寫計劃期間 及分錄數據 2 initalRecruitment :function() { 3 var self = this; 4 if(this.getHistoryOperateState() != "VIEW"){ 5 $("#hrPlaitProject").shrPromptBox("option", { 6 onchange : function (e, value) { 7 if(value.current == null){ 8 return; 9 } 10 var currentId = value.current.id; 11 self.remoteCall({ 12 method : 'getEntry', 13 param : { 14 plaitProjectId : currentId 15 }, 16 success : function(data) { 17 $("#planPeriod").val(data.planPeriod); 18 self.initalEntry(data.entryData); 19 } 20 }); 21 } 22 }); 23 } 24 }
初始化F7控件值web
將初始化方法寫入到initalizeDOM() 初始化頁面方法中。給F7賦值時,須要提供id,name 格式數據。sql
1 /*初始化單位*/ 2 initAdminOrg: function(){ 3 var self = this; 4 self.remoteCall({ 5 method : "getCurrentCompany", 6 success : function(data) { 7 if(data != undefined && data != null) { 8 var adminOrg = {id:data.orgId,name:data.orgName}; 9 $("#unitOrg").shrPromptBox("setValue", adminOrg); 10 } 11 } 12 }); 13 }
初始化F7時,添加過濾後端
組裝好filter後,給F7控件設置過濾條件Filter。此處的list 須要進行處理,由於不符合 ‘1’,‘2’,‘3’ 格式。app
1 /*初始化攜帶證件的 證件類型F7*/ 2 initCredentialType: function(data){ 3 var self = this; 4 if(data != '' && data != null){ 5 var personId = data; 6 self.remoteCall({ 7 method : 'getPersonCredentialTypeId', 8 param : { 9 personId : personId 10 }, 11 success : function(datas) { 12 if(datas != '' && datas != null){ 13 var list = datas.types; 14 var filter = "id in ('" +list + "')"; 15 $("#credential").shrPromptBox("setFilter",filter); 16 } 17 } 18 }); 19 } 20 21 }
此處爲過濾條件的獲取Handler,着重對list進行處理。ide
1 * 2 * <p> 3 * Title: getPersonCredentialTypeIdAction 4 * </p> 5 * <p> 6 * Description: 7 * </p> 8 * 獲取出境員工的 出入境證件信息 證件類型id 9 * 10 * @param request 11 * @param response 12 * @param modelMap 13 * @throws SHRWebException 14 */ 15 public void getPersonCredentialTypeIdAction(HttpServletRequest request, HttpServletResponse response, 16 ModelMap modelMap) throws SHRWebException { 17 String personId = request.getParameter("personId"); 18 StringBuilder sb = new StringBuilder(); 19 if (StringUtils.isEmpty(personId)) { 20 throw new ShrWebBizException("初始化攜帶證件類型失敗!"); 21 } 22 try { 23 // 出入境證件信息 24 String sql = "select cftypesid from CT_E_EntryAndExitCredential where cfpersonid = '" + personId 25 + "'"; 26 IRowSet rowSet = DbUtil.executeQuery(ctx, sql); 27 List<String> list = new ArrayList<String>(); 28 while (rowSet.next()) { 29 String typeId = rowSet.getString("cftypesid"); 30 list.add(typeId); 31 } 32 33 for (int i = 0; i < list.size(); i++) { 34 String str = list.get(i); 35 sb.append(str); 36 if (i < list.size() - 1) { 37 sb.append("','"); 38 } 39 } 40 modelMap.put("types", sb.toString()); 41 42 JSONUtils.writeJson(response, modelMap); 43 } catch (BOSException e) { 44 e.printStackTrace(); 45 throw new ShrWebBizException("初始化證件類型中獲取出入境證件失敗!" + e); 46 } catch (SQLException e) { 47 e.printStackTrace(); 48 logger.error("執行sql失敗!" + e); 49 } 50 }
對分錄進行賦值post
首先是在視圖中定義好分錄及字段。以下:ui
...... //其他部分省略
<editGrid name="entrys" sorterItems="department asc" > <column name="familyMember" required="true" readonly="true" editable="false" width="185"/> <column name="name" required="true" readonly="true" editable="false" width="200"/> <column name="sex" readonly="true" editable="false" width="110"/> <column name="nationality" readonly="true" editable="false" width="110"/> <column name="company" rreadonly="true" editable="false" width="110"/> <column name="telphone" readonly="true" editable="false" width="110"/> </editGrid>
......
分錄賦值:this
//根據人力編制方案 初始化招聘計劃明細waf initalEntry: function(datas){ var rowdatas = datas; for(var i = 0, len = rowdatas.length; i < len; i++){ var info = rowdatas[i]; var datarow = { "adminOrg":info.adminOrg, "postion":info.postion, "plaitNum":info.plaitNum, "missNum":info.missNum }; waf("#entrys").jqGrid('addRow',{data:datarow}); } }
監聽分錄中的F7控件
視圖:
1 <group name="detail" caption="八級工報名明細" > 2 <editGrid name="entrys" sorterItems="department asc" > 3 <column name="person" required="true" label="姓名" uipk="shr.custm.person.F7" width="80"/> 4 <column name="gender" readonly="true" editable="false" width="50" /> 5 <column name="birthDate" readonly="true" editable="false" width="120"/> 6 <column name="education" readonly="true" editable="false" width="120"/> 7 <column name="applyWorkType" width="110" required="true"/> 8 <column name="applyLeavel" width="110" required="true"/> 9 <column name="applyType" width="110" required="true"/> 10 <column name="workYears" required="true"/> 11 <column name="entryDate" readonly="true" editable="false" width="120"/> 12 <column name="mType" readonly="true" editable="false" width="120"/> 13 <column name="remark" readonly="true" editable="false" width="110"/> 14 <column name="turnInto" readonly="true" editable="false" width="80"/> 15 </editGrid> 16 </group>
監聽值改變事件
1 tableCellChange: function(){ 2 var self = this; 3 var grid = waf("#entrys"); 4 grid.wafGrid("option", { 5 afterSaveCell:function (rowid, cellname, value, iRow, iCol) { 6 if(cellname=="person") { // 只監聽person 列的值改變 7 self.assignData(rowid); 8 } 9 } 10 }); 11 12 }
分錄grid當前行賦值
1 assignData: function(rowid){ 2 var self = this; 3 var person = $("#entrys").jqGrid('getCell',rowid,"person"); 4 if(person == null || person == ''){ 5 return; 6 } 7 var personId = person.id; 8 self.remoteCall({ 9 method:'getPersonData', 10 param : { 11 personId : personId 12 }, 13 success:function(data){ 14 if(data != '' && data != null){ 15 var gender = data.gender; 16 var birthday = data.birthday; 17 var degree = data.degree; 18 var entreDate = data.entreDate; 19 var typeName = data.typeName; 20 21 $("#entrys").jqGrid('setCell',rowid,"gender",gender); 22 $("#entrys").jqGrid('setCell',rowid,"birthDate",birthday); 23 $("#entrys").jqGrid('setCell',rowid,"education",degree); 24 $("#entrys").jqGrid('setCell',rowid,"entryDate",entreDate); 25 $("#entrys").jqGrid('setCell',rowid,"mType",typeName); 26 27 } 28 } 29 }); 30 }
單選按鈕
視圖:視圖中只定義一個出境類型的div,而後使用js進行填充單選組內容。
1 <group> 2 <div id="exitType"> 3 <div class="col-lg-4"> 4 <div class="field_label" title="出境類型">出境類型</div> 5 </div> 6 <div class="field-ctrl"> 7 <div class="radiowrap"> 8 <!-- 出境類型 --> 9 </div> 10 </div> 11 </div> 12 </group>
1 //初始化出境類型 2 initRecruitmentTypeContent: function(){ 3 var self = this; 4 if(this.getOperateState() != "VIEW"){ 5 self.remoteCall({ 6 method : "getExitTypeContent", 7 success : function(data){ 8 if(data != undefined) { 9 var recTypeHTML = ""; 10 for(var i=0; i<data.length; i++) { 11 var type = data[i]; 12 recTypeHTML += '<input name="exitType" type="radio" id="exitType'+type.number+'" class="radio" data-pk="'+type.id+'" data-name="'+type.name+'" /> <label for="exitType'+type.number+'" class="radio_label">'+type.name+'</label>'; 13 } 14 $("#exitType").find(".radiowrap").html(recTypeHTML); 15 } 16 } 17 }); 18 } 19 }
向服務端發送請求(經常使用)
method對應的參數名就是handler中的該參數名+Action方法
1 self.remoteCall({ 2 method : 'getEntry', 3 param : { 4 plaitProjectId : currentId 5 }, 6 success : function(data) { 7 $("#planPeriod").val(data.planPeriod); 8 self.initalEntry(data.entryData); 9 } 10 });
控件值改變時間(文本框 日期控件等)
1 $('#endDate').change(function(){ 2 self.countApplyDays(); 3 });
頁面彈框提示
showInfo showWarning等。其中hideAfter指得的控件消失時間(s)。
1 shr.showWarning({ 2 message:"截止日期不能小於起始日期", 3 hideAfter:5 4 });
頁面按鈕
提交生效
提交生效 指得是當前業務單據直接保存並審覈經過。
通常有兩種狀況,在handler中須要進行區分:
1. 當前業務單據完成信息錄入操做後,直接點擊的提交生效按鈕。(即該業務單據還沒有保存,此時傳遞到Handler的model中是不會有單據id的;此時業務單據若是有分錄信息的話,該model中也是能夠獲取的)
2. 當前業務單據完成信息錄入後,點進行了保存操做,然後點擊提交生效。(則在Handler中就不須要對該單據信息進行保存了,只須要更新單據狀態爲審批經過及其餘業務邏輯處理便可;此時保存後的單據,在提交生效Handler中獲取model 時,獲取不到分錄信息的,須要根據單據id查詢分錄信息)
1 /** 2 * 單據提交生效 3 * @param {} event 4 */ 5 submitEffectAction : function (event) { 6 var _self = this; 7 _self.remoteCall({ 8 method:'canSubmitEffect', 9 success:function(data){ 10 if("success" == data.state){ 11 if(_self.getOperateState() == 'VIEW' ){//&& _self.checkBillState() 12 shr.showConfirm('您確認要提交生效嗎?', function() { 13 _self.prepareSubmitEffect(event, 'submitEffect'); 14 }); 15 }else{ 16 if (_self.validate() && _self.verify() ) { //&& _self.checkBillState() 17 shr.showConfirm('您確認要提交生效嗎?', function() { 18 _self.prepareSubmitEffect(event, 'submitEffect'); 19 }); 20 } 21 } 22 } 23 } 24 }); 25 }, 26 prepareSubmitEffect : function (event, action){ 27 var _self = this; 28 var data = _self.assembleSaveData(action); 29 30 var target; 31 if (event && event.currentTarget) { 32 target = event.currentTarget; 33 } 34 35 shr.doAction({ 36 target: target, 37 url: _self.dynamicPage_url, 38 type: 'post', 39 data: data, 40 success : function(response) { 41 _self.back(); 42 } 43 }); 44 },
保存
保存邏輯通常不須要重寫,可是若是單據上有一些單據處理的內容,好比單選組信息,次數就須要重寫saveAction,從新用
assembleSaveData()方法進行對傳遞到服務端的數據進行組裝。獲取到數據之後單獨對該選中的單選組信息進行保存。保存、提交、提交生效方法都會調用該方法。
assembleSaveData()方法通常狀況下不須要重寫,該方法就是爲了組裝傳遞至服務端數據model。好比此處的 須要對單選組信息出境類型進行單獨保存。Handler中經過 String exitTypeId = request.getParameter("exitType"); 進行獲取 data.exitType = _self.getRecuritmentTypeDate() 的值。
1 //組裝保存時傳至服務端的數據 (當須要傳輸單據上別的數據的時候 能夠在這個方法中組裝數據傳遞到後端) 2 assembleSaveData: function(action){ 3 var _self = this; 4 var data =_self.prepareParam(action + 'Action'); 5 data.method = action; 6 data.operateState = _self.getOperateState(); 7 data.model = shr.toJSON(_self.assembleModel()); 8 9 var model = data.model; 10 if(model != undefined && model != "") { 11 data.model = model.replace(/<pre\sclass=\\"textarea-format\\">/gi,"").replace(/<\/pre>/gi,""); //抹掉由於在view界面中對富文本調.html()方法而帶出的標籤 12 } 13 14 data.exitType = _self.getRecuritmentTypeDate(); 15 16 // relatedFieldId 17 var relatedFieldId = this.getRelatedFieldId(); 18 if (relatedFieldId) { 19 data.relatedFieldId = relatedFieldId; 20 } 21 22 return data; 23 }, 24 //獲取選中的出境類型 id 25 getRecuritmentTypeDate : function(){ 26 var type = $("#exitType input[type='radio']:checked"); 27 var recTypeId = $(type).attr("data-pk"); 28 return recTypeId; 29 }
1 /** 2 * 單據保存 重寫 3 * @param {} event 4 */ 5 saveAction: function(event) { 6 var _self = this; 7 if (_self.validate() && _self.verify()) { 8 //_self.refreshNowBillState(); 9 10 _self.doSave(event, 'save'); 11 12 }else{ 13 if(_self != top){// in iframe 14 shr.setIframeHeight(window.name); 15 } 16 17 } 18 }, 19 /** 20 * 保存真正執行方法 21 */ 22 doSave: function(event, action) { 23 var _self = this; 24 var data = _self.assembleSaveData(action); 25 26 var target; 27 if (event && event.currentTarget) { 28 target = event.currentTarget; 29 } 30 31 shr.doAction({ 32 target: target, 33 url: _self.dynamicPage_url, 34 type: 'post', 35 data: data, 36 success : function(response) { 37 if (_self.isFromF7()) { 38 // 來自F7,關閉當前界面,並給F7設置 39 var dataF7 = { 40 id : response, 41 name : $.parseJSON(data.model).name 42 }; 43 dialogClose(dataF7); 44 } else { 45 // 普通保存,去除最後一個麪包屑,防止修更名字形成麪包屑重複 46 shrDataManager.pageNavigationStore.pop(); 47 _self.viewAction(response); 48 } 49 } 50 }); 51 }
套打
1. 配置視圖中的套打按鈕 templatePrint
2. 繪製套打模板 js寫入套打模板路徑 /s-HR/Cadreadministrator/CadreadministratorJob
3. 綁定查詢數據源 com.kingdee.eas.custom.cadreadministrate.app.CadreAppointmentQuery
/** * 套打模板名稱 */ getTemplateName: function() { return '/s-HR/Cadreadministrator/CadreadministratorJob'; }, /** * 套打dataProvider */ getTemplateDataProvider: function() { return 'com.kingdee.bos.webframework.component.report.CommonDataProvider'; } getTemplateQueryPK: function() { return 'com.kingdee.eas.custom.cadreadministrate.app.CadreAppointmentQuery'; }
加載css外部樣式表 並優先加載
<style href="${appPath}/custom/web/css/evalPerson/evalPerson.css"/> evalPerson.css /** 修改 #solutionPeriodname_down 下拉列表width 並提升優先級 */ #solutionPeriodname_down { width:430px !important; } !important做用是提升指定CSS樣式規則的應用優先權
數據表格分頁設置
<grid multiselect="false" rowList="[100,200]" rowNum="200" > rowList 爲每次查詢條數 rowNum 爲初始查詢條數(默認查詢50條)