1、需求:要求在手機端頁面新增一個參照:
怎麼在手機頁面新增一個參照節點?第一步:咱們確定要明白手機端這個頁面是怎麼展示的?
其實手機端展示的原理很簡單,手機端是經過加載在portal界面配置好的手機模板,咱們知道,
portal能夠配置手機、pc、pad三種終端的界面,這裏咱們須要配置在手機端的模板,具體看圖:
瀏覽器輸入127.0.0.1/portal輸入管理員帳號便可進入管理員界面,
選擇系統管理->表單配置
選擇main
而後就會跳轉到"個性化設置",
裏面的說明看清楚。
下面看「增長項」,若是不用這個,請跳過
手動編寫一個惟一的"編號"與"名稱"便可。這裏只作一個內容展示功能,並無實際的操做。
這裏咱們重點了解一下「編輯‘
點擊」編輯「就會跳轉到這個界面
咱們注意到左邊就是咱們的數據集,什麼是數據集,(⊙﹏⊙)b這點基礎應該有吧?咱們點擊那個」+「便可展示咱們數據集中的屬性
這裏由於咱們是新增一個顯示在手機端的參照,因此涉及到數據的操做,咱們確定要選擇一個能夠關聯數據庫的字段,這時候預留自
定義屬性就起到做用了,由於」vdef1~n「當初設計元數據的時候就是爲了未來作功能拓展,這裏派上用場了,
友情提示:將左邊的屬性移動到右邊時,要關注這個字段是否是已經被使用,由於不能排除這個應用已經作了別的拓展,對吧?
另外,勾上」是否可見「,讓它顯示在模板。
我這裏選擇vdef11,由於前面的被其餘使用了,而後選擇這個節點,調整屬性
由於這裏是參照,咱們必定要選擇到參照,另外引用的參照,就是以前咱們在UAP-Studio中模式化生成的參照。
關於怎麼模式化生成參照,我這裏只作簡單的說明,具體請參考相關文檔,
1.模式化生成參照,關注有沒有生成」xxxModel與xxxControlor「這兩個類,
2.查詢數據庫,關注參照有沒有新增到數據庫select * from bd_refinfo order by ts desc;
3.具體的邏輯請在
xxxControlor中完成,我這裏只作了一個簡單的查詢,你們能夠參考其餘參照的
xxxControlor類怎麼寫的。
package nc.ref.cacoverplan.control;import java.util.HashMap;import java.util.List;import java.util.Map;import nc.uap.lfw.core.data.Dataset;import nc.uap.lfw.core.data.PaginationInfo;import nc.uap.lfw.core.event.DataLoadEvent;import nc.uap.lfw.core.refnode.IRefNode;import nc.uap.lfw.core.serializer.impl.List2DatasetSerializer;import uap.lfw.ref.ctrl.LfwSqlGridReferenceController;import uap.lfw.ref.sqlvo.ILfwRefSqlVO;import uap.lfw.ref.sqlvo.LfwReferenceSqlVO;import uap.lfw.ref.util.LfwReferenceUtil;public class CacoverplanCAGridRefController extends LfwSqlGridReferenceController { private String getMultilangTextSql(String fieldCodeInRef, String fieldCodeWithTable) { StringBuilder sb = new StringBuilder(); sb.append(fieldCodeWithTable).append(' ').append(fieldCodeInRef); for (int i = 2; i < 7; i++) { sb.append(',').append(fieldCodeWithTable).append(i).append(' ').append(fieldCodeInRef).append(i); } return sb.toString(); } @Override public ILfwRefSqlVO getGridSqlVO() { LfwReferenceSqlVO sqlvo = new LfwReferenceSqlVO(); StringBuilder selSql = new StringBuilder(); selSql.append("select a.pk_group,a.pk_org,a.pk_org_v,a.pk_dept,a.pk_plan,a.pk_salesman, "); selSql.append(getMultilangTextSql("pk_account_vname", "b.vname")).append(','); selSql.append(" a.vmemo from cuma_fugaiplan a "); selSql.append("inner join cuma_account b on a.customer=b.pk_account ");// String sql = "select b.vname,a.vmemo from cuma_fugaiplan a inner join cuma_account b on a.customer=b.pk_account"; //虛擬表(能夠是單個數據庫表,也能夠是多個表聯合查詢的虛擬表) sqlvo.setTableName("(" + selSql + ") cuma_fugaiplan"); //真實數據庫表(虛擬表中包含的全部表的集合) sqlvo.setRealTableNames("cuma_fugaiplan"); //設置虛擬表排序字段 sqlvo.setOrderByPart(""); return sqlvo; } @Override public void onDataLoad(DataLoadEvent e) { Dataset ds = (Dataset) e.getSource(); ILfwRefSqlVO vo = getMainRefSqlVO(); if (vo == null) { return; } Map values = new HashMap(2); values.put("KEY_LOCATE_WP", new Object[] { getFilterValue() }); Map sqlMap = vo.getSql(ds.getFieldSet().getFields(), values, null); String sql = (String) sqlMap.get("KEY_SQL"); String countSql = (String) sqlMap.get("KEY_COUNT_SQL"); List params = (List) sqlMap.get("KEY_SQL_PARAM_VALUES"); sql=sql.replaceAll("realfinishtime", "dplanfinishtime"); countSql=countSql.replaceAll("realfinishtime", "dplanfinishtime"); PaginationInfo pInfo = ds.getCurrentRowSet().getPaginationInfo(); IRefNode refNode = LfwReferenceUtil.getRefNodeFromParentWindow(null); List vec = getRefResult(refNode, vo, sql, countSql, params, pInfo); //ds.getFieldSet().addField(new field); new List2DatasetSerializer().serialize(ds.getCurrentKey(), pInfo, vec, ds); }}
好了,咱們的初期設置工做已經作好了,基本上能夠在手機上顯示那個參照了,若是沒有成功,只能說你不夠細心了
下面是具體代碼的調整,這個根據具體的業務,能夠作一個參考。
移動CRM客戶端全部關於前端頁面交互都會走這個類,咱們先找到這個類」
MobileAdapterServiceImpl
「
怎麼找到這個類,試試Ctrl+shift+T,很方便的一個快捷鍵。
相信聰明的你早就找到了,咱們關注
getReferToSrvMap
()
這個方法。
private Map<String, String> getReferToSrvMap() { Map<String, String> referToMap = new HashMap<String, String>(); referToMap.put(MobileConsts.REFER_TO_ACCOUNT, MobileConsts.ACCOUNT_QRY_SERVICE); referToMap.put(MobileConsts.REFER_TO_LEAD, MobileConsts.LEAD_QRY_SERVICE); referToMap.put(MobileConsts.REFER_TO_BO, MobileConsts.BO_QRY_SERVICE); referToMap.put(MobileConsts.REFER_TO_CONTACT, MobileConsts.CONTACT_QRY_SERVICE); referToMap.put(MobileConsts.REFER_TO_INVENTORY, MobileConsts.INVENTORY_QRY_SERVICE); referToMap.put(MobileConsts.REFER_TO_INVENTORY_WEB, MobileConsts.INVENTORY_QRY_SERVICE); referToMap.put(MobileConsts.REFER_TO_INVENTORYCLASS, MobileConsts.INVENTORYCLASS_QRY_SERVICE); referToMap.put(MobileConsts.REFER_TO_ACTIVITY, MobileConsts.ACTIVITY_QRY_SERVICE); referToMap.put(MobileConsts.REFER_TO_COVERPLAN, MobileConsts.ACCOUNT_COVERPLAN_SERVICE); return referToMap; }
referToMap
.put(MobileConsts.REFER_TO_COVERPLAN, MobileConsts.ACCOUNT_COVERPLAN_SERVICE);
這個是我本身手動加的,
目的就是把本身的服務給註冊到這個類中,咱們看下
MobileConsts
.
REFER_TO_COVERPLAN
指定的
MobileConsts
.
ACCOUNT_COVERPLAN_SERVICE
咱們跟進去看下是什麼。
/** * 移動覆蓋計劃查詢服務 */ public static final String ACCOUNT_COVERPLAN_SERVICE = "nc.pubitf.ca.cuma.account.ma.IMACoverPlanService";
咱們看到它實際上就是一個服務類的接口,它會根據這個接口找到相應的實現類。
寫完這個以後,咱們下一個關注即是
public List<Map> getReferValues(String groupId, String userId, String orgId, String referto, String condition, String startline, String count, String ispaging)
getReferValues這個方法顧名思義它是獲得參照的值的,因此咱們要在本身的服務中複寫這個方法,寫上本身的業務,儘可能不要使用這個通用的方法。
package nc.impl.ca.cuma.account.ma;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import nc.bs.ca.capub.mobile.common.MobileCommon;import nc.bs.ca.capub.mobile.common.MobileConsts;import nc.bs.ca.capub.mobile.data.handler.MobileReferListHandler;import nc.bs.ca.capub.mobile.service.MobilePubService;import nc.bs.ca.capub.mobile.template.MobileTemplateManager;import nc.bs.ca.capub.service.NCLocatorFactory;import nc.bs.ca.capub.util.ArrayUtils;import nc.bs.ca.capub.util.CommonUtils;import nc.bs.ca.capub.util.QuerySchemeUtils;import nc.bs.ca.capub.util.QueryUtils;import nc.bs.ca.capub.vo.CrmLoginContext;import nc.bs.ca.capub.vo.CrmQueryCondVO;import nc.bs.framework.common.NCLocator;import nc.itf.ca.capub.commonfunc.activity.IActivityService;import nc.itf.ca.cuma.account.IAccountService;import nc.itf.ca.cuma.account.account.coverplan.ICoverplanService;import nc.pubitf.ca.cuma.account.ma.IMACoverPlanService;import nc.uap.cpb.org.vos.CpUserVO;import nc.uap.ctrl.tpl.qry.FromWhereSQLImpl;import nc.uap.ctrl.tpl.qry.base.QuerySchemeVO;import nc.uap.lfw.core.data.PaginationInfo;import nc.uap.lfw.core.exception.LfwBusinessException;import nc.vo.ca.capub.commonfunc.activity.ActivityVO;import nc.vo.ca.cuma.account.AccountVO;import nc.vo.cuma.fugaiplan.FugaiPlanVO;import nc.vo.org.DeptVO;import nc.vo.pub.SuperVO;import nc.vo.pub.VOStatus;import nc.vo.pub.lang.UFDate;import nc.vo.pub.lang.UFDateTime;import org.apache.commons.lang.StringUtils;import uap.lfw.imp.query.base.QuerySchemeUtil;public class MACoverPlanServiceImpl extends MobilePubService implements IMACoverPlanService { private ICoverplanService service; private ICoverplanService getService() { if (null == this.service) { this.service = NCLocatorFactory.getInstance().getCANCLocator() .lookup(ICoverplanService.class); } return this.service; } @Override public List<Map> getReferValues(String groupId, String userId, String pk_org, String referTo, String condition, String startline, String count, String ispaging) { CrmLoginContext crmLoginContext = new CrmLoginContext(); crmLoginContext.setPk_group(groupId); crmLoginContext.setNodeCode(MobileConsts.FUN_CODE_COVERPLAN); crmLoginContext.setPk_org(pk_org); crmLoginContext.setPk_user(userId); IMACoverPlanService service = NCLocatorFactory.getInstance().getCANCLocator().lookup(IMACoverPlanService.class); int pageSize = 0; if (!StringUtils.isEmpty(startline)) { pageSize = Integer.valueOf(count); } PaginationInfo pinfo = new PaginationInfo(); pinfo.setPageSize(pageSize); SuperVO[] vos = null; if (StringUtils.isEmpty(startline)) { pinfo.setPageIndex(0); } else { pinfo.setPageIndex(Integer.valueOf(startline) / pageSize); } CrmQueryCondVO crmQueryCondVO = new CrmQueryCondVO(); String sql = ""; if (StringUtils.isNotEmpty(condition)) { sql = ActivityVO.VNAME + " like '%" + condition + "%'"; } crmQueryCondVO.setWherePart(sql); crmQueryCondVO.setCrmScope(true); crmQueryCondVO.setOrderPart(this.getOrderByPart()); //crmQueryCondVO.setExtSql(AccountVO.ENABLESTATE + "=" + EnableStateEnum.ENABLESTATE_ENABLE); try { //vos = service.queryVOs(crmLoginContext, new ActivityVO(), pinfo, crmQueryCondVO); vos = this.getService().queryVOs(pinfo, new FugaiPlanVO(),sql, this.getOrderByPart()); } catch (LfwBusinessException e) { return MobileCommon.exceptionReturn(e, e.getMessage()); } List<Map> funInfo = new ArrayList<Map>(); Map funMap = new HashMap(); funInfo.add(funMap); funMap.put(MobileConsts.ORGID, pk_org); funMap.put(MobileConsts.BNSTYPE, ""); funMap.put(MobileConsts.WINID, "coverplan_listwin"); funMap.put(MobileConsts.FUNCODE, MobileConsts.FUN_CODE_COVERPLAN); List<Map<String, Object>> template = null; try { template = MobileTemplateManager.getTemplate(groupId, userId, "", "", "", funInfo); } catch (Exception e) { return MobileCommon.exceptionReturn(e, e.getMessage()); } MobileReferListHandler mobileReferListHandler = new MobileReferListHandler(template, vos, "", FugaiPlanVO.VMEMO); try { return mobileReferListHandler.handle(); } catch (Exception e) { return MobileCommon.exceptionReturn(e, e.getMessage()); } } //省略了其餘業務代碼}
咱們在這個方法裏寫上本身的邏輯,其餘代碼能夠不用怎麼改,大概根據別人寫好的,改下就好,可是這個考驗你的遷移能力,可能會遇到各類錯,慢慢調,這裏提醒一下關注
vos
=
this
.
getService
().
queryVOs
(
pinfo
,
new
FugaiPlanVO
(),
sql
,
this
.
getOrderByPart
());
。由於這個方法是獲得你的相應的VO,爲何要獲得VO,由於這個VO封裝了頁面所須要的參數與值,這至關因而一種協議,一種約定。它要什麼,你就必須給什麼。
這個
MobileReferListHandler mobileReferListHandler = new MobileReferListHandler(template, vos,
"", FugaiPlanVO.VMEMO);
最好也關注一下,至於它是幹嗎的,本身能夠跟進去看,我這裏不作解釋,大概就是找到模板,填充數據。
還有一些業務的改動,它顯示這個參照的時候,若是我但願用戶選擇完畢後,作一個數據的回顯,那麼咱們須要關注這個類
ActivityObjectViewData
private List<Map> getHeadData(List<Map> headTplList) throws Exception { List<Map> headList = new ArrayList<Map>(); Map headMap = new HashMap(); headList.add(headMap); Map tabContentMap = new HashMap(); headMap.put(TABCONTENT, tabContentMap); List<Map> groupList = new ArrayList<Map>(); tabContentMap.put(GROUP, groupList); Map groupMap = new HashMap(); groupList.add(groupMap); groupMap.put(TABCODE, ""); groupMap.put(TABNAME, ""); groupMap.put("relatedlist", ((Map) ((List) this.template.get(0).get(MobileConsts.HEAD_TEMPLATE_KEY)).get(0)).get("relatedlist")); Map billItemDataMap = new HashMap(); groupMap.put(TABCONTENT, billItemDataMap); List<Map> dataList = new ArrayList<Map>(); billItemDataMap.put(BILLITEM_DATA, dataList); for (Map attrMap : headTplList) { String type = attrMap.get("type").toString(); String value = null; if (StringUtils.isNotEmpty(type)) { if (MobileConsts.REFERTYPE.equalsIgnoreCase(type) || MobileConsts.ADDRESS.equalsIgnoreCase(type)) { try { if ("referobj_name".equals(attrMap.get(MobileConsts.KEY).toString())) { value = this.getRealValue("referobj_name", parentVO); } else { value = MobileReferUtil.getReferItemValue(parentVO, attrMap, type, attrMap.get(MobileConsts.KEY).toString()); } } catch (Exception e) { LfwLogger.error(e.getMessage()); } } //日期類型去掉時分秒 else if (MobileConsts.DATE.equalsIgnoreCase(type) && null != attrMap.get(MobileConsts.KEY)) { if (parentVO.getAttributeValue(attrMap.get(MobileConsts.KEY).toString()) != null) value = parentVO.getAttributeValue(attrMap.get(MobileConsts.KEY).toString()).toString() .split(" ")[0]; } else if (MobileConsts.COMBO.equalsIgnoreCase(type) && null != attrMap.get(MobileConsts.KEY)) { List<Map> enumList = (List<Map>) attrMap.get("enumlist"); if (enumList == null || enumList.size() == 0) { value = this.getRealValue(attrMap.get(MobileConsts.KEY).toString(), parentVO); } else { String key = ""; if (parentVO.getAttributeValue(attrMap.get(MobileConsts.KEY).toString()) != null) { key = parentVO.getAttributeValue(attrMap.get(MobileConsts.KEY).toString()).toString(); } if (StringUtils.isEmpty(key)) { value = ""; } else { for (Map map : enumList) { if (map.get("realval").equals(key)) { value = map.get("diplayval").toString(); } } } }// if (value == null) {// value = "";// } }else if (MobileConsts.MONEY.equalsIgnoreCase(type) && null != attrMap.get(MobileConsts.KEY)) { value = ActivityUtils.getOrgCurrtypeSign((ActivityVO) parentVO) + parentVO.getAttributeValue((String)attrMap.get(MobileConsts.KEY)); }else { String attrId = attrMap.get(MobileConsts.KEY).toString(); if("action_name".equals(attrId)) value = getShowValue4ItemMap("action", parentVO); else if("refstage_name".equals(attrId)) value = getShowValue4ItemMap("refstage", parentVO); else if("vdef11".equals(attrId)){// ICrmQueryOpt service = NCLocatorFactory.getInstance().getCANCLocator()// .lookup(ICrmQueryOpt.class);// // SuperVO fgvo = (SuperVO) service.queryVOs("select vmemo from fugaiplan where pk_plan= '"+value+"' ");// if (fgvo != null) { //TODO 顯示覆蓋計劃的內容// value = (String) fgvo.getAttributeValue("vmemo");// } value = MobileCommon.getString(parentVO.getAttributeValue(attrId)); BaseDAO baseDAO=new BaseDAO(); List<Map> list=(List<Map>) baseDAO.executeQuery("select vmemo from cuma_fugaiplan where pk_plan= '"+value+"' ", new MapListProcessor()); Map map=list.get(0); value = (String) map.get("vmemo"); } else value = MobileCommon.getString(parentVO.getAttributeValue(attrId)); } } attrMap.put(MobileConsts.DIGEST, "N"); attrMap.put(MobileConsts.VALUE, value); attrMap.put(MobileConsts.PARAMLIST, getParamList(attrMap.get(MobileConsts.KEY).toString(), parentVO)); dataList.add(attrMap); } addAttachment(dataList); return headList; }
這個方法就是塞數據的類了,咱們注意到我寫的那部分
else if("vdef11".equals(attrId)){ value = MobileCommon.getString(parentVO.getAttributeValue(attrId)); BaseDAO baseDAO=new BaseDAO(); List<Map> list=(List<Map>) baseDAO.executeQuery("select vmemo from cuma_fugaiplan where pk_plan= '"+value+"' ", new MapListProcessor()); Map map=list.get(0); value = (String) map.get("vmemo"); }
這裏利用BaseDAO查詢數據庫,回顯數據
這裏,
手機端參照寫法大概就寫完了,你們有須要的時候能夠實踐一下,可能一次不會成功,堅持就是勝利哦,加油!
最後說一句,分享代碼,讓生活更美好!