1.无法创建流程在新建版本,原因是在workshop中的workflow中有版本的冲突,把冲突重命名的2个xml(bglc/definebglc)文件删掉即可。在itsm_bp_deffile改状态删除流程版本,删不掉可能是与itsm_bp_instance中的冲突。
2.webroot下的runtime_space和tomcat下项目中的runtime_space不同步,参看服务台eclipse中tomcat的配置.bmp
3.新建表单元素的name必须和代码model中的字段名一样。
4.表单元素form-tbar中,关于保存提交的手写代码可以增加提交、保存等基本按钮的选择条件。
5.在表单选择人物列表时候,要对该角色进行筛选的话,需要在迁移表单,手动编辑添加查询条件。例如roleid:
items : [{
xtype : "cabgrid",
roleId : "2c9a7d9f31d0b0620131d1842e4f002a",
6.myeclipse中,在表单设计器改动表单之后,tomcat中fvsd_runtimespace和系统中workshop底下的是一致的,而svn,down下的webroot中的fvsd_runtimespace没有变还和以前的是一致的,每回改动表单需切记将已改动表单替换掉webroot下fvsd_runtimespace种的jsp文件。
7.服务台portal中待办事宜里面的文字要改动,例如把“事故”改为事件,需要AgencyTask.js(这是待办事宜js),找到事件search.category.incident,此字段在ApplicationResources_zh_CN.properties中,其对应的是unicode码,jdk中bin下有native2ascii.exe此工具提供汉字向unicode码的转换。
汉字转unicode是很方便的,而unicode转汉字的话,在cmd(切换到d:txt所在磁盘中 )中“native2ascii -reverse u.txt u_h.txt” (u.txt里是要转的unicode码,u_nv.txt是转成本地之后的汉字)
8.关于值班,值班模块,主框架页面是由shiftpanel.js写的,显示视图也是js组成的,例如月视图:Monthview.js。实现类ScheduleUtilAction.java,在流程处理中加判断条件是在IdentityHelper.java中加的。
9.处理页面中某元素的只读属性,下拉框的triggerAction : 'query'
10.流程表单中每一项的select属性也可触发事件,不必全部都写入到change中,例如事件中业务等级根据类别的不同自定义选择,只需在业务等级的select中加入相应代码,例如:
var yewuID = Ext.getCmp('${uuid}ext-gen4726').getValue();
Ext.Ajax.request({
url : 'admin/bpCategoryForEdit.html?bpCategoryId='+yewuID+'',
params :{id:yewuID},
success: function (response)
{
var yewuArray = Ext.util.JSON.decode(response.responseText);
if(yewuArray.root[0].description == '一级'){
Ext.getCmp('${uuid}ext-gen5458').setValue({id:'8a8a18e31dd19885011dd1c0bada1101',text:'一级'});
}else if(yewuArray.root[0].description == '二级'){
Ext.getCmp('${uuid}ext-gen5458').setValue({id:'8a8a18d1201d77f301201d8c6c090004',text:'二级'});
}else if(yewuArray.root[0].description == '三级'){
Ext.getCmp('${uuid}ext-gen5458').setValue({id:'8a8a18d1201d77f301201d8ca5610005',text:'三级'});
}else if(yewuArray.root[0].description == '四级'){
Ext.getCmp('${uuid}ext-gen5458').setValue({id:'8a8a18d1201d77f301201d8d3def0006',text:'四级'});
}
},
failure: function ( result, request)
{
Ext.MessageBox.alert('访问失败', response.responseText);
}
});
11.改动动作注意要把动作的源码文件.class 考到tomcat下,其目录是WebRoot\WEB-INF\classes\com\dhcc\itsm\form\runtime\actions
12.配置管理中help文本字体js,为help-lang_zh_cn.js
13.表单管理中类别只允许选择叶子节点,不允许选择枝干节点,此属性是selectnodemodel,其leaf代表叶子节点。
14.新建表单时默认值的添加,在新建表单的pageonload中,高级模式里添加以下代码setvalue。(迁移页面也是是一样的,下拉框id/name例如关闭代码itsm_bp_closecode)
Ext.getCmp('${uuid}ext-gen4726').setValue({id:'2c9a7dab31d56c060131d5e018de0049',name:'台式机(办公)'});
Ext.getCmp('${uuid}ext-gen5458').setValue({id:'8a8a18d1201d77f301201d8d3def0006',name:'四级'});
Ext.getCmp('${uuid}ext-gen8801').setValue({id:'8a8a18d1201d77f301201d8a5b2c0002',name:'影响科室'});
Ext.getCmp('${uuid}ext-gen11552').setValue({value:'297edff833494961013357aa049b0015',text:'公共用户'});
Ext.getCmp('${uuid}ext-gen19576').setValue({value:'297edff833494961013357aa049b0015',text:'公共用户'});
下拉框是id/name,选人是value/text.
15.表单中元素的属性,displayfield是显示给前台页面的信息;valuefield是提交给后台的数据;hiddenname是此元素的实际name。
16.表单中元素的store属性,可以自定义为自动加载类型的调用已经写好的方法体,自定义中skmdb/knowledgeList.html就是方法的标识,以下是在表单页面中加一个combo的组件让其显示知识库的标题,并且在选定标题之后,让其知识的内容自动显示在“描述”组件中。
var knowledge = Ext.getCmp('${uuid}ext-gen5024').getRawValue();
var knowledgeID = Ext.getCmp('${uuid}ext-gen5024').getValue();
Ext.getCmp('${uuid}ext-gen5024').setValue(knowledge);
Ext.Ajax.request({
url: 'skmdb/knowledgeEdit.html?knowledgeID='+knowledgeID,
params: {
id: knowledgeID
},
success: function(response) {
var knowledgeArray = Ext.util.JSON.decode(response.responseText);
if (knowledgeArray.root[0].title == knowledge) {
Ext.getCmp('${uuid}ext-gen2340').setValue(knowledgeArray.root[0].content);
}
},
failure: function(result, request) {
Ext.MessageBox.alert('访问失败', response.responseText);
}
});
17.表单自动弹出下一页面,关闭当前页面等等动作,都在flow.js中定义。
18.定义spring时,property中的name指的是bean中类里头的变量名,property中的ref指的是变量所在的类名称(标识)。
19.流程“提交”的时候,除新建外,必须要提交的参数是
_flowTrAction incident_AssignToFirstLine
actionCode incident_AssignToFirstLine
然后是迁移页面所带的其他参数,比如说分派二线的人员信息,和要填的备注信息comment,这些字段会存储在itsm_bp_oplog表中。
20.自己写动作,需要掌握,第一,bean中的property,name是类中的变量名,此变量需要set方法,例如private GenericManager<SlaUrgent, String> urgentManager;以泛型表示。
第二,List<SlaUrgent> slaUrgentList = this.urgentManager.findByProperty("symbol", bpCategory.getDescription());这是根据对象的属性调出对象的方法,此处SlaUrgent是以数组形势存储的,slaUrgentList.get(0)才是SlaUrgent的对象本身。得到他才可以得到此对象的其他属性,例如他的code属性。
第三,全局变量和局部变量是有区别的,全局变量在方法中调用需要this.而局部变量就直接在方法体中定义就行了,例如SlaUrgent slaUrgent = null;
第四,List<SlaUrgent> slaUrgentList = this.urgentManager.find("from SlaUrgent where process.id = ? and symbol = ? ", this.bpCategory.getProcess().getId(),this.bpCategory.getDescription());此方法是find方法,可以起到多条件选择的效果。
21.报表
第一,在report/scripts/pages/amchartData/Rpt_Gam_IncidentWeek/下产生数据文件,在\report\scripts\pages\amchartSettings下设定读取数据文件的路径说明文件,这些文件从原文件夹中copy。
第二,新建报表,需要创建report类,util类,action类,report.js,applicationContext-report.xml,struts-report.xml,report.property文件,其中一个流程只有一个工具类util类,是公用的。
第三,报表util类是具体的工具类,所有方法都在其中描述。
22.把url编码转为汉字的方法leavingTransitonName = new String(getRequest().getParameter("leavingTransitonName").getBytes("ISO-8859-1"),"utf-8");
23.从svn导入项目到本地,从myeclipse加载本地项目的步骤:
a.新建项目,url不用默认路径,使用新导出路径。
b.修改基本的配置信息。
c.这样会把原来的web.xml替换掉需要重新替换掉。
d。myeclipse中去掉项目校验:在myeclipse/validation中的两项勾上。
e。选择jdk的版本,在Java compilor中 JDK compliance选择等级为6.0.
f。选择编码为utf-8.
24.svn本地文件夹,替换svn的内外网地址是“relocate选项”,myeclipse换取内外网地址的方法是“disconnect”。
25.报表图标新的版本页面无法设置,只能在数据库里改动,itsm_report表。
26.服务器新建工单影响程度、业务等级空指针。(workshop底下的keyvalue文件夹没有被引用到tomcat中)
27.寻找js的方法体,全局搜索js的方法体,new 后边的一般都为方法体的全名。(js加载不出图,报错会提示到哪一行,在firebug中可以看到,提示的方法就在方法体中new后头。)
28.对待工作一定要投入,只有投入才能找到原因,没有找到原因是解决不了任何问题的。
29.动态报表时间获取上经常获取不到最后一天,原因就是在时间循环的时候,每次加一天,到最后startdate和enddate相等了,循环不再继续了,例如
补全数据之后level1Map=============={2012-03-15=0.0, 2012-03-16=0.0, 2012-03-17=0.0, 2012-03-18=0.0, 2012-03-19=0.0, 2012-03-20=0.0, 2012-03-21=0.0, 2012-03-22=1.0, 总计=1.0}
补全数据之后level2Map=============={2012-03-15=0.0, 2012-03-16=0.0, 2012-03-17=0.0, 2012-03-18=0.0, 2012-03-19=0.0, 2012-03-20=0.0, 2012-03-21=0.0, 总计=0.0}
补全数据之后level3Map=============={2012-03-15=0.0, 2012-03-16=0.0, 2012-03-17=0.0, 2012-03-18=0.0, 2012-03-19=0.0, 2012-03-20=0.0, 2012-03-21=0.0, 总计=0.0}
补全数据之后level4Map=============={2012-03-15=0.0, 2012-03-16=0.0, 2012-03-17=0.0, 2012-03-18=0.0, 2012-03-19=0.0, 2012-03-20=0.0, 2012-03-21=0.0, 总计=0.0}
,level2Map到了21号,21变成22的时候就和enddate相等,就不在补充数据了。
30.myeclipse,sysout+alt+/不管用,调preference--general--key,把其中的word completion快捷键alt+/ 删除掉,把Content Assist的快捷键由ctrl+space改成alt+/ 。
31.已知接口,寻找实现此接口的方法类,点住接口名按ctrl+t。
32.流程存表model又两部分组成,一部分是incident,change等model组成,所存储的表一个是,itsm_bp_incident和itsm_bp_instance.
33.报表的导出。导出必须和前台保持一致,既必须和前台生成的xml文件保持一致。不然会报无报表数据的错误。导出所用到的xml文件都在amchartSettings文件夹中,在产生的data文件里,如果列数不正确也会导致导出的不成功,通常报的错误是 The number of column keys does not match the number of columns in the data array.
34.配环境变量的时候,java路径的bin还有java路径中jre\bin都需要配一下。
35.项目在eclipse中的配置,一定要配置default output folder,把路径设置为项目中的gam/WebRoot/WEB-INF/classes(WebRoot/WEB-INF/classes),这个在新建项目中可以配置,建完项目后也可以修改,发布的文件夹名字eclipse中是WebContent,要在建项目的时候把它改为WebRoot。
36.在筛选框中+筛选条件,例如流程中的影响人,就修改影响人控件中的searchcondition,在“影响配置”此类控件中需要知道前台的js和调用的后台java类,例如事件流程中的ciaction,前台的ImpactCiGrid.js,
在ciAction中添加String manageIp = getRequest().getParameter("manageIp");其中getParameter("manageIp")是在前台js中:
this.search_field_store.loadData([ //[$lang('component.numCode'),'code'],
[$lang('component.name'),'name'],
//[$lang('component.assetNumber'),'assetNumber'],
[$lang('component.serial'),'sn'],
[$lang('component.category'),'categoryName'],
[$lang('component.state'),'statusName'],
['资产编号','assetNumber'],
['IP地址','manageIp'],
[$lang('component.place'),'positionName']]);
定义的,而前台要捕获的数据来源于js中的:
this.store = new Ext.data.Store({
proxy: new Ext.data.HttpProxy(
{url:'cmdb/ciListForWin.html'}
),需要自己加{name: 'manageIp', mapping: 'manageIp',convert:function(v){if(v)return v.ip;else return '';}},
还需要在显示区域加上刚在js中定义的值,
this.cm = new Ext.grid.ColumnModel([
new Ext.grid.RowNumberer(),
this.sm,
// {header: 'id', hidden:true, dataIndex: 'id'},
// {header: $lang('component.numCode'), sortable: true, dataIndex: 'code',hidden: true},
{header: $lang('component.serial'), hidden:true, dataIndex: 'sn'},
{header: $lang('component.name'), sortable: true, dataIndex: 'name'},
{header: $lang('component.category'), sortable: true, dataIndex: 'category'},
{header: $lang('component.state'), sortable: true, dataIndex: 'status'},
{header: '资产编号', sortable: true, dataIndex: 'assetNumber'},
{header: 'IP地址', sortable: true, dataIndex: 'manageIp'},
{header: $lang('component.place'), sortable: true, dataIndex: 'place'}
]);
最后在搜索区域加上自己的搜索条件:
this.search_field_store.loadData([ //[$lang('component.numCode'),'code'],
[$lang('component.name'),'name'],
//[$lang('component.assetNumber'),'assetNumber'],
[$lang('component.serial'),'sn'],
[$lang('component.category'),'categoryName'],
[$lang('component.state'),'statusName'],
['资产编号','assetNumber'],
['IP地址','manageIp'],
[$lang('component.place'),'positionName']]);
额外提示:在开头的定义文件中或许需要定义:
initComponent : function(){
if (this.tbarFlag)
this.tbar = this.buildToolBar();
var ciStore = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({
url:this.storeUrl
}),
reader : new Ext.data.JsonReader({
root: "root",
successProperty :'success',
fields : [
{name: 'id', mapping: 'id',type:'string'},
{name: 'code', mapping: 'code',type:'string'},
{name: 'name', mapping: 'name',type:'string'},
{name: 'category', mapping: 'categoryName',type:'string'},
{name: 'status', mapping: 'statusName',type:'string'},
{name: 'place', mapping: 'positionName',type:'string'},
{name: 'assetNumber', mapping: 'assetNumber',type:'string'},
{name: 'manageIp', mapping: 'manageIp',type:'string'},
{name: 'categoryId', mapping: 'categoryId',type:'string'}
]
})
});
37.自动加载pageonload的写法:ajax调用后台接口:
var incidentID = Ext.getCmp('${uuid}flowBPIId').getValue(); //获取当前工单号,${uuid}flowBPIId在表单中是hidden的,
Ext.Ajax.request({
url: 'run/requestData.html?actionCode=incident_loadIncidentForReadonly&id='+incidentID,
params: {
id: incidentID
},
success: function(response) {
var incidentArray = Ext.util.JSON.decode(response.responseText);
Ext.getCmp('${uuid}comment').setValue(incidentArray.resultList[0].summary);
Ext.getCmp('${uuid}ext-gen13211').setValue(incidentArray.resultList[0].description);
},
failure: function(result, request) {
Ext.MessageBox.alert('访问失败', response.responseText);
}
});
38.报表查看不出图,大部分为js没加载出来,看js删减东西的时候有没有漏掉或者多余","。
39.流程activeTab是默认的tab中模块的第几个,第一栏是0,第二栏是1,依次类推。
40.服务台点击事件进入的页面中,主页显示的js是worktable_cfg.js详细信息中的类别、摘要、创建人、处理人的table是在此js中添加的,name和columns需要自己添加,此name读取的是配置文件ProcessHqlFields.properties,添加删除栏目都在此两个文件中改动。
41.tomcat在eclipse中的必要设置-Xms256m -Xmx512m -XX:MaxPermSize=128m。
42.表单上的更多按钮是在toolsmenu.js中。
43.增加工单提醒功能main.js,processNotice.java,PDAnoticeAction,msg.gif,main.jsp,showmessagewin.js,
44.下拉搜索树:添加 webroot/ext/extension/ComboTree.js在xml文件中增加<script type="js"><![CDATA[ext/extension/ComboTree.js]]></script>,改动前台jsp为 xtype : "combotreex",displayField : "text",前台也要把引用的js加上。
45.事件列表倒序显示,在BusinessProcessInstanceAction.java类中,getProcessInstanceList()方法里,hql.insert(hql.indexOf("where")+5,conSb.toString());后+上
if(hql.indexOf("order by")<0){hql.append(" order by ").append(newAlian).append(".").append("updatedOn desc");}
46.事件单新添加元素大致步骤,数据库新加字段,model新加字段(注意表的名称,和变量的类型、名称),动作修改(注意类似添加),表单修改。动作修改后(不是添加或删除动作),只需替换服务器上java,和xml文件,就可以了。
47.事件流程中上边工具栏中的新增、模版新增、删除选中项、更多存在于BpViewPanel.js中。xaction属性是代表的权限代码。
48.事件流程中表单引用的js中,console是输出语句,调试用的,可以注释掉。
49.事件流程到处工单,在\WebRoot\upload\printTemplates下,incident.pdf 可以通过Adobe Acrobat X Pro更改,更改的过程中所有字段要重新添加后编辑。
50.事件单导出:模板制作过程:
1、使用word画表单
2、使用Acrobat将word转成PDF
3、删除PDF中的输入域,重新添加(必须要删除重新进行添加)
4、编辑PDF表单,添加ognl表达式
51.动态报表制作过程,同服务性周期报表,动态报表有js文件和action的类,调用的html方法在initComponent方法中。
52.流程中tbar上选择创建变更、创建问题的请求都在processMenu.js中。
53.影响人,选择人员,选择一线二线的js在ActorsCombo.js中。
54.事件首页右侧报表区域(报表显示区)的js在BpIncidentReportPanel.js中,查询的类是ServiceValueReportAction.java,方法是getMyProcessed()和getMyProcessedPercentage()。
55.修改表单动作的时候,原表单的对象加载不出来,不报错,firebug提示对象的json显示不正确,应该把动作中的对象重新select为string类型的数据。
56.导出报表的事件显示不正确,js文件中会定义隐藏表单,此隐藏表单中有初始时间和结束时间的id定义,在表单查询的时候(tbar上的放大镜),要把表单中的时间重新设置一下Ext.get('startDatesdEmployeeGeneralStatisticsReport').dom.value = startvalue;
57.事件提交前的判断,如果有两个判断条件。既有两个if的时候,ext会识别不了,需要写到一个“查询条件” (例如同时判断类别和部门是不是为空)里面。
58.值班所有表:ITSM_CHANGE_SHIFT 换班请求、ITSM_PERIOD 班次、ITSM_SCHEDULE 值班任务、ITSM_WORK_LOG 值班日志。
59.新建表单的时间组件自动生成当前时间的方法: 在value中设置其为:${curdate}。
60.流程中设置节点处理人的方法有好几种,
1.除了pool actors 设置固定角色处理节点,
2.还可以在节点前的提交动作提交actors的参数值,设置下一结点的处理人,(这种方法中,下一结点的处理人中的角色可以是handler bean ,不能是pool actors ),
3.还有一种方法是设置变量的方法, 在节点处选择处理人为变量类型(上面的选择还是 handler bean),这个变量的书写方式就是表单页面中的字段名,例如plancreator,变量的设置方式必须是在提交动作中设置variables,把variable 的值设置成map对象,map也是在该动作中加的,加的是运行一段代码:Map map = new HashMap();map.put("plancreator", "id:"+(String)dataProcessEngine.getParameter("plancreator"));dataProcessEngine.addRuntimeObject("plancreatorMap", map);其中plancreatorMap是此map的名字,定义变量的时候,变量的值就选择是它。这样流程走到下一结点的时候就可以调用这个变量来选择处理人了。
61.流程中节点名称的设置,节点名称、任务名称、事件名称、行为名称要保持一致。
62.把数据库查询出的数字对象转换成数字:int top = Integer.parseInt(String.valueOf(employeecount.get(0)));
63.报表区域时间转换,默认时间从最后的0点0分变成最后日期的23:59:59:
dates[0] = DateUtil.convertStringToDate(DateUtil.DATE_TIME_PATTREN_CN, startDate+" 00:00:00");
dates[1] = DateUtil.convertStringToDate(DateUtil.DATE_TIME_PATTREN_CN, endDate+" 23:59:59");
dates[0]、dates[1]都是DATE类型属性。
例如:
private Date[] getDateFromParameter() {
String startDate = this.getRequest().getParameter("startDate");
String endDate = this.getRequest().getParameter("endDate");
Date dates[] = new Date[2];
if (startDate == null || endDate == null) {
Calendar c = Calendar.getInstance();
Date endTime_ = new Date();
c.setTime(endTime_);
c.add(Calendar.DATE, -7);
Date startTime_ = c.getTime();// 得到date類型后的startTime_,
String startnull = DateUtil.getDate(startTime_);
try {
dates[0] = DateUtil.convertStringToDate(
DateUtil.DATE_TIME_PATTREN_CN, startnull + " 00:00:00");// 转换string类型的startnull为date
} catch (ParseException e) {
e.printStackTrace();
}
dates[1] = endTime_;
} else {
try {
dates[0] = DateUtil.convertStringToDate(
DateUtil.DATE_TIME_PATTREN_CN, startDate + " 00:00:00");
dates[1] = DateUtil.convertStringToDate(
DateUtil.DATE_TIME_PATTREN_CN, endDate + " 23:59:59");
} catch (ParseException e) {
e.printStackTrace();
}
}
return dates;
}
64.查询某字段所在表的sql语句是:select TABLE_NAME from COLUMNS where COLUMN_NAME = ‘字段名’;
65.取消消息删除的选中状态:
a.首先需要找到这个组件所在的js,(例如:消息删除的“删除选中项”的js:NoticeViewPanel.js)
b.找到js中组件所在的位置,(例如消息删除中的:text: $lang('admin.notice.NoticeViewPanel.tbar.delete'), xaction: 'notice_deleteAll', iconCls: 'delete-selected-icon', handler: function(){//'删除选中项'。。。。。)
c.更改组件,添加// 自定义扩展:将Grid表头中的全选复选框取消复选 add by zhaokang 2012-07-05,在组建中调用新建方法: grid.unSelectAll();
66.事件首页高级查询:页面上定义的text的name有createdendTime但是在BusinessProcessInstanceAction.java中的listByHql()方法中并没有定义从页面上获取的createdendTime参数,再次方法中+入createdendTime参数,其中<='2012-07-4' 是不包括2012年7月4号的,如果时间刚刚好是2012年07月04号0点0分的话,应该包括,开始时间>='2012-07-03'是>=2012年0703号的0点0分。
67.处理页面的"更多"在加载页面的手写代码中加入。
68.报表添加top选择数的思路:
1.改动java方法中显示参数的获取方式:String topStr = this.getRequest().getParameter("top");
int topNum = 5;
try {
topNum = Integer.parseInt(topStr);
} catch (Exception e) {
topNum = 5;
};
2.改动js,定义数量参数并在tbar中添加按钮:
this.TimeComparedByCategoryFiled = new Ext.form.NumberField( {
anchor : '98%',
fieldLabel : 'TOP',
value : 5
});
"TOP:",this.TimeComparedByCategoryFiled,
3.改动js中查询按钮所传入的参数:
var topNum = this.TimeComparedByCategoryFiled.getValue();
参数中添加: top : topNum
69.修改报表的思路:1.js中对报表图形进行展示2.action中对报表进行数据查询方法:(服务性周期报表除外)。
70.流程增加修改已关闭工单内容的功能。
基本思路:在显示前端弹出表单窗口,窗口点击按钮可以触发动作,此动作将表单内的元素作为参数修改对象incident的内容。
1.按钮模拟:由于原表单(Bpviewpanel.js)tbar中含有“删除选中项”功能,仿照此元素,复制,修改其原带的方法deleteChecked : function()
2.方法写入:自定义方法editCloseBpis.html,在struts-workflow.xml中增加此方法,新建此方法所用class:bpiForeditAction,在bpiForeditAction中用到了incidentManager,需要重新注入。(一般xx对象的编辑方法体都为xxmanager)
方法中从前台获取以选中的工单id 作为参数bpIds得到工单incident对象,方法用的是Incident bpi = incidentManager.get(bpIds);
3.前端获取参数:以模拟的按钮“修改工单”所出发的方法handler : this.editCloseBpi中筛选过滤条件,然后触发事件,弹出一个新的ext窗口:
Ext.ux.ScriptLoader("bp/scripts/BpCloseEdit.js"); 弹出新的js窗口 相当于java中的import
var bpCloseEdit = new BpCloseEdit({bpIds: bpIds}); 初始化此新的js 相当于java中的new
4.新js的定义:模拟的是个性设置-->修改个人信息所弹出的窗口userwin.js
复制新的js:BpCloseEdit.js
1.js中包括两大部分:BpCloseEdit = function(conf) {}和Ext.extend(BpCloseEdit, Ext.Window, {})
2.其中BpCloseEdit = function(conf) {}包含定义此js的方法BpCloseEdit.superclass.constructor.call(this, {})和新的窗口var jiejuexinxi = new Ext.form.FieldSet({})和新的表单this.bpiForm = new Ext.form.FormPanel({})和增加新的按钮:this.add(this.bpiForm);this.addButton({text: '确定',handler : this.saveUser,scope: this});this.addButton({text: '取消',handler : this.close,scope: this});this.show();this.loadData();
5.以后要弹出js界面,在界面修改已生成的对象都可以利用此方法。
71.对弹出的用户信息进行部门的筛选,思路是在调用此html的时候加上计算机部门的参数:"url":"admin/users!listForWin.html?department=2c9a7d9f31d59f8f0131d5ac3feb0007"
72.门户系统menhu,source中添加的有menhu/src,menhu/conf。
73.如何去掉licence,在StartupListener.java、BaseAction.java、LoginAction.class中去掉licence的验证。
74.-Xms1024M -Xmx1024M -XX:MaxPermSize=512m
2.webroot下的runtime_space和tomcat下项目中的runtime_space不同步,参看服务台eclipse中tomcat的配置.bmp
3.新建表单元素的name必须和代码model中的字段名一样。
4.表单元素form-tbar中,关于保存提交的手写代码可以增加提交、保存等基本按钮的选择条件。
5.在表单选择人物列表时候,要对该角色进行筛选的话,需要在迁移表单,手动编辑添加查询条件。例如roleid:
items : [{
xtype : "cabgrid",
roleId : "2c9a7d9f31d0b0620131d1842e4f002a",
6.myeclipse中,在表单设计器改动表单之后,tomcat中fvsd_runtimespace和系统中workshop底下的是一致的,而svn,down下的webroot中的fvsd_runtimespace没有变还和以前的是一致的,每回改动表单需切记将已改动表单替换掉webroot下fvsd_runtimespace种的jsp文件。
7.服务台portal中待办事宜里面的文字要改动,例如把“事故”改为事件,需要AgencyTask.js(这是待办事宜js),找到事件search.category.incident,此字段在ApplicationResources_zh_CN.properties中,其对应的是unicode码,jdk中bin下有native2ascii.exe此工具提供汉字向unicode码的转换。
汉字转unicode是很方便的,而unicode转汉字的话,在cmd(切换到d:txt所在磁盘中 )中“native2ascii -reverse u.txt u_h.txt” (u.txt里是要转的unicode码,u_nv.txt是转成本地之后的汉字)
8.关于值班,值班模块,主框架页面是由shiftpanel.js写的,显示视图也是js组成的,例如月视图:Monthview.js。实现类ScheduleUtilAction.java,在流程处理中加判断条件是在IdentityHelper.java中加的。
9.处理页面中某元素的只读属性,下拉框的triggerAction : 'query'
10.流程表单中每一项的select属性也可触发事件,不必全部都写入到change中,例如事件中业务等级根据类别的不同自定义选择,只需在业务等级的select中加入相应代码,例如:
var yewuID = Ext.getCmp('${uuid}ext-gen4726').getValue();
Ext.Ajax.request({
url : 'admin/bpCategoryForEdit.html?bpCategoryId='+yewuID+'',
params :{id:yewuID},
success: function (response)
{
var yewuArray = Ext.util.JSON.decode(response.responseText);
if(yewuArray.root[0].description == '一级'){
Ext.getCmp('${uuid}ext-gen5458').setValue({id:'8a8a18e31dd19885011dd1c0bada1101',text:'一级'});
}else if(yewuArray.root[0].description == '二级'){
Ext.getCmp('${uuid}ext-gen5458').setValue({id:'8a8a18d1201d77f301201d8c6c090004',text:'二级'});
}else if(yewuArray.root[0].description == '三级'){
Ext.getCmp('${uuid}ext-gen5458').setValue({id:'8a8a18d1201d77f301201d8ca5610005',text:'三级'});
}else if(yewuArray.root[0].description == '四级'){
Ext.getCmp('${uuid}ext-gen5458').setValue({id:'8a8a18d1201d77f301201d8d3def0006',text:'四级'});
}
},
failure: function ( result, request)
{
Ext.MessageBox.alert('访问失败', response.responseText);
}
});
11.改动动作注意要把动作的源码文件.class 考到tomcat下,其目录是WebRoot\WEB-INF\classes\com\dhcc\itsm\form\runtime\actions
12.配置管理中help文本字体js,为help-lang_zh_cn.js
13.表单管理中类别只允许选择叶子节点,不允许选择枝干节点,此属性是selectnodemodel,其leaf代表叶子节点。
14.新建表单时默认值的添加,在新建表单的pageonload中,高级模式里添加以下代码setvalue。(迁移页面也是是一样的,下拉框id/name例如关闭代码itsm_bp_closecode)
Ext.getCmp('${uuid}ext-gen4726').setValue({id:'2c9a7dab31d56c060131d5e018de0049',name:'台式机(办公)'});
Ext.getCmp('${uuid}ext-gen5458').setValue({id:'8a8a18d1201d77f301201d8d3def0006',name:'四级'});
Ext.getCmp('${uuid}ext-gen8801').setValue({id:'8a8a18d1201d77f301201d8a5b2c0002',name:'影响科室'});
Ext.getCmp('${uuid}ext-gen11552').setValue({value:'297edff833494961013357aa049b0015',text:'公共用户'});
Ext.getCmp('${uuid}ext-gen19576').setValue({value:'297edff833494961013357aa049b0015',text:'公共用户'});
下拉框是id/name,选人是value/text.
15.表单中元素的属性,displayfield是显示给前台页面的信息;valuefield是提交给后台的数据;hiddenname是此元素的实际name。
16.表单中元素的store属性,可以自定义为自动加载类型的调用已经写好的方法体,自定义中skmdb/knowledgeList.html就是方法的标识,以下是在表单页面中加一个combo的组件让其显示知识库的标题,并且在选定标题之后,让其知识的内容自动显示在“描述”组件中。
var knowledge = Ext.getCmp('${uuid}ext-gen5024').getRawValue();
var knowledgeID = Ext.getCmp('${uuid}ext-gen5024').getValue();
Ext.getCmp('${uuid}ext-gen5024').setValue(knowledge);
Ext.Ajax.request({
url: 'skmdb/knowledgeEdit.html?knowledgeID='+knowledgeID,
params: {
id: knowledgeID
},
success: function(response) {
var knowledgeArray = Ext.util.JSON.decode(response.responseText);
if (knowledgeArray.root[0].title == knowledge) {
Ext.getCmp('${uuid}ext-gen2340').setValue(knowledgeArray.root[0].content);
}
},
failure: function(result, request) {
Ext.MessageBox.alert('访问失败', response.responseText);
}
});
17.表单自动弹出下一页面,关闭当前页面等等动作,都在flow.js中定义。
18.定义spring时,property中的name指的是bean中类里头的变量名,property中的ref指的是变量所在的类名称(标识)。
19.流程“提交”的时候,除新建外,必须要提交的参数是
_flowTrAction incident_AssignToFirstLine
actionCode incident_AssignToFirstLine
然后是迁移页面所带的其他参数,比如说分派二线的人员信息,和要填的备注信息comment,这些字段会存储在itsm_bp_oplog表中。
20.自己写动作,需要掌握,第一,bean中的property,name是类中的变量名,此变量需要set方法,例如private GenericManager<SlaUrgent, String> urgentManager;以泛型表示。
第二,List<SlaUrgent> slaUrgentList = this.urgentManager.findByProperty("symbol", bpCategory.getDescription());这是根据对象的属性调出对象的方法,此处SlaUrgent是以数组形势存储的,slaUrgentList.get(0)才是SlaUrgent的对象本身。得到他才可以得到此对象的其他属性,例如他的code属性。
第三,全局变量和局部变量是有区别的,全局变量在方法中调用需要this.而局部变量就直接在方法体中定义就行了,例如SlaUrgent slaUrgent = null;
第四,List<SlaUrgent> slaUrgentList = this.urgentManager.find("from SlaUrgent where process.id = ? and symbol = ? ", this.bpCategory.getProcess().getId(),this.bpCategory.getDescription());此方法是find方法,可以起到多条件选择的效果。
21.报表
第一,在report/scripts/pages/amchartData/Rpt_Gam_IncidentWeek/下产生数据文件,在\report\scripts\pages\amchartSettings下设定读取数据文件的路径说明文件,这些文件从原文件夹中copy。
第二,新建报表,需要创建report类,util类,action类,report.js,applicationContext-report.xml,struts-report.xml,report.property文件,其中一个流程只有一个工具类util类,是公用的。
第三,报表util类是具体的工具类,所有方法都在其中描述。
22.把url编码转为汉字的方法leavingTransitonName = new String(getRequest().getParameter("leavingTransitonName").getBytes("ISO-8859-1"),"utf-8");
23.从svn导入项目到本地,从myeclipse加载本地项目的步骤:
a.新建项目,url不用默认路径,使用新导出路径。
b.修改基本的配置信息。
c.这样会把原来的web.xml替换掉需要重新替换掉。
d。myeclipse中去掉项目校验:在myeclipse/validation中的两项勾上。
e。选择jdk的版本,在Java compilor中 JDK compliance选择等级为6.0.
f。选择编码为utf-8.
24.svn本地文件夹,替换svn的内外网地址是“relocate选项”,myeclipse换取内外网地址的方法是“disconnect”。
25.报表图标新的版本页面无法设置,只能在数据库里改动,itsm_report表。
26.服务器新建工单影响程度、业务等级空指针。(workshop底下的keyvalue文件夹没有被引用到tomcat中)
27.寻找js的方法体,全局搜索js的方法体,new 后边的一般都为方法体的全名。(js加载不出图,报错会提示到哪一行,在firebug中可以看到,提示的方法就在方法体中new后头。)
28.对待工作一定要投入,只有投入才能找到原因,没有找到原因是解决不了任何问题的。
29.动态报表时间获取上经常获取不到最后一天,原因就是在时间循环的时候,每次加一天,到最后startdate和enddate相等了,循环不再继续了,例如
补全数据之后level1Map=============={2012-03-15=0.0, 2012-03-16=0.0, 2012-03-17=0.0, 2012-03-18=0.0, 2012-03-19=0.0, 2012-03-20=0.0, 2012-03-21=0.0, 2012-03-22=1.0, 总计=1.0}
补全数据之后level2Map=============={2012-03-15=0.0, 2012-03-16=0.0, 2012-03-17=0.0, 2012-03-18=0.0, 2012-03-19=0.0, 2012-03-20=0.0, 2012-03-21=0.0, 总计=0.0}
补全数据之后level3Map=============={2012-03-15=0.0, 2012-03-16=0.0, 2012-03-17=0.0, 2012-03-18=0.0, 2012-03-19=0.0, 2012-03-20=0.0, 2012-03-21=0.0, 总计=0.0}
补全数据之后level4Map=============={2012-03-15=0.0, 2012-03-16=0.0, 2012-03-17=0.0, 2012-03-18=0.0, 2012-03-19=0.0, 2012-03-20=0.0, 2012-03-21=0.0, 总计=0.0}
,level2Map到了21号,21变成22的时候就和enddate相等,就不在补充数据了。
30.myeclipse,sysout+alt+/不管用,调preference--general--key,把其中的word completion快捷键alt+/ 删除掉,把Content Assist的快捷键由ctrl+space改成alt+/ 。
31.已知接口,寻找实现此接口的方法类,点住接口名按ctrl+t。
32.流程存表model又两部分组成,一部分是incident,change等model组成,所存储的表一个是,itsm_bp_incident和itsm_bp_instance.
33.报表的导出。导出必须和前台保持一致,既必须和前台生成的xml文件保持一致。不然会报无报表数据的错误。导出所用到的xml文件都在amchartSettings文件夹中,在产生的data文件里,如果列数不正确也会导致导出的不成功,通常报的错误是 The number of column keys does not match the number of columns in the data array.
34.配环境变量的时候,java路径的bin还有java路径中jre\bin都需要配一下。
35.项目在eclipse中的配置,一定要配置default output folder,把路径设置为项目中的gam/WebRoot/WEB-INF/classes(WebRoot/WEB-INF/classes),这个在新建项目中可以配置,建完项目后也可以修改,发布的文件夹名字eclipse中是WebContent,要在建项目的时候把它改为WebRoot。
36.在筛选框中+筛选条件,例如流程中的影响人,就修改影响人控件中的searchcondition,在“影响配置”此类控件中需要知道前台的js和调用的后台java类,例如事件流程中的ciaction,前台的ImpactCiGrid.js,
在ciAction中添加String manageIp = getRequest().getParameter("manageIp");其中getParameter("manageIp")是在前台js中:
this.search_field_store.loadData([ //[$lang('component.numCode'),'code'],
[$lang('component.name'),'name'],
//[$lang('component.assetNumber'),'assetNumber'],
[$lang('component.serial'),'sn'],
[$lang('component.category'),'categoryName'],
[$lang('component.state'),'statusName'],
['资产编号','assetNumber'],
['IP地址','manageIp'],
[$lang('component.place'),'positionName']]);
定义的,而前台要捕获的数据来源于js中的:
this.store = new Ext.data.Store({
proxy: new Ext.data.HttpProxy(
{url:'cmdb/ciListForWin.html'}
),需要自己加{name: 'manageIp', mapping: 'manageIp',convert:function(v){if(v)return v.ip;else return '';}},
还需要在显示区域加上刚在js中定义的值,
this.cm = new Ext.grid.ColumnModel([
new Ext.grid.RowNumberer(),
this.sm,
// {header: 'id', hidden:true, dataIndex: 'id'},
// {header: $lang('component.numCode'), sortable: true, dataIndex: 'code',hidden: true},
{header: $lang('component.serial'), hidden:true, dataIndex: 'sn'},
{header: $lang('component.name'), sortable: true, dataIndex: 'name'},
{header: $lang('component.category'), sortable: true, dataIndex: 'category'},
{header: $lang('component.state'), sortable: true, dataIndex: 'status'},
{header: '资产编号', sortable: true, dataIndex: 'assetNumber'},
{header: 'IP地址', sortable: true, dataIndex: 'manageIp'},
{header: $lang('component.place'), sortable: true, dataIndex: 'place'}
]);
最后在搜索区域加上自己的搜索条件:
this.search_field_store.loadData([ //[$lang('component.numCode'),'code'],
[$lang('component.name'),'name'],
//[$lang('component.assetNumber'),'assetNumber'],
[$lang('component.serial'),'sn'],
[$lang('component.category'),'categoryName'],
[$lang('component.state'),'statusName'],
['资产编号','assetNumber'],
['IP地址','manageIp'],
[$lang('component.place'),'positionName']]);
额外提示:在开头的定义文件中或许需要定义:
initComponent : function(){
if (this.tbarFlag)
this.tbar = this.buildToolBar();
var ciStore = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({
url:this.storeUrl
}),
reader : new Ext.data.JsonReader({
root: "root",
successProperty :'success',
fields : [
{name: 'id', mapping: 'id',type:'string'},
{name: 'code', mapping: 'code',type:'string'},
{name: 'name', mapping: 'name',type:'string'},
{name: 'category', mapping: 'categoryName',type:'string'},
{name: 'status', mapping: 'statusName',type:'string'},
{name: 'place', mapping: 'positionName',type:'string'},
{name: 'assetNumber', mapping: 'assetNumber',type:'string'},
{name: 'manageIp', mapping: 'manageIp',type:'string'},
{name: 'categoryId', mapping: 'categoryId',type:'string'}
]
})
});
37.自动加载pageonload的写法:ajax调用后台接口:
var incidentID = Ext.getCmp('${uuid}flowBPIId').getValue(); //获取当前工单号,${uuid}flowBPIId在表单中是hidden的,
Ext.Ajax.request({
url: 'run/requestData.html?actionCode=incident_loadIncidentForReadonly&id='+incidentID,
params: {
id: incidentID
},
success: function(response) {
var incidentArray = Ext.util.JSON.decode(response.responseText);
Ext.getCmp('${uuid}comment').setValue(incidentArray.resultList[0].summary);
Ext.getCmp('${uuid}ext-gen13211').setValue(incidentArray.resultList[0].description);
},
failure: function(result, request) {
Ext.MessageBox.alert('访问失败', response.responseText);
}
});
38.报表查看不出图,大部分为js没加载出来,看js删减东西的时候有没有漏掉或者多余","。
39.流程activeTab是默认的tab中模块的第几个,第一栏是0,第二栏是1,依次类推。
40.服务台点击事件进入的页面中,主页显示的js是worktable_cfg.js详细信息中的类别、摘要、创建人、处理人的table是在此js中添加的,name和columns需要自己添加,此name读取的是配置文件ProcessHqlFields.properties,添加删除栏目都在此两个文件中改动。
41.tomcat在eclipse中的必要设置-Xms256m -Xmx512m -XX:MaxPermSize=128m。
42.表单上的更多按钮是在toolsmenu.js中。
43.增加工单提醒功能main.js,processNotice.java,PDAnoticeAction,msg.gif,main.jsp,showmessagewin.js,
44.下拉搜索树:添加 webroot/ext/extension/ComboTree.js在xml文件中增加<script type="js"><![CDATA[ext/extension/ComboTree.js]]></script>,改动前台jsp为 xtype : "combotreex",displayField : "text",前台也要把引用的js加上。
45.事件列表倒序显示,在BusinessProcessInstanceAction.java类中,getProcessInstanceList()方法里,hql.insert(hql.indexOf("where")+5,conSb.toString());后+上
if(hql.indexOf("order by")<0){hql.append(" order by ").append(newAlian).append(".").append("updatedOn desc");}
46.事件单新添加元素大致步骤,数据库新加字段,model新加字段(注意表的名称,和变量的类型、名称),动作修改(注意类似添加),表单修改。动作修改后(不是添加或删除动作),只需替换服务器上java,和xml文件,就可以了。
47.事件流程中上边工具栏中的新增、模版新增、删除选中项、更多存在于BpViewPanel.js中。xaction属性是代表的权限代码。
48.事件流程中表单引用的js中,console是输出语句,调试用的,可以注释掉。
49.事件流程到处工单,在\WebRoot\upload\printTemplates下,incident.pdf 可以通过Adobe Acrobat X Pro更改,更改的过程中所有字段要重新添加后编辑。
50.事件单导出:模板制作过程:
1、使用word画表单
2、使用Acrobat将word转成PDF
3、删除PDF中的输入域,重新添加(必须要删除重新进行添加)
4、编辑PDF表单,添加ognl表达式
51.动态报表制作过程,同服务性周期报表,动态报表有js文件和action的类,调用的html方法在initComponent方法中。
52.流程中tbar上选择创建变更、创建问题的请求都在processMenu.js中。
53.影响人,选择人员,选择一线二线的js在ActorsCombo.js中。
54.事件首页右侧报表区域(报表显示区)的js在BpIncidentReportPanel.js中,查询的类是ServiceValueReportAction.java,方法是getMyProcessed()和getMyProcessedPercentage()。
55.修改表单动作的时候,原表单的对象加载不出来,不报错,firebug提示对象的json显示不正确,应该把动作中的对象重新select为string类型的数据。
56.导出报表的事件显示不正确,js文件中会定义隐藏表单,此隐藏表单中有初始时间和结束时间的id定义,在表单查询的时候(tbar上的放大镜),要把表单中的时间重新设置一下Ext.get('startDatesdEmployeeGeneralStatisticsReport').dom.value = startvalue;
57.事件提交前的判断,如果有两个判断条件。既有两个if的时候,ext会识别不了,需要写到一个“查询条件” (例如同时判断类别和部门是不是为空)里面。
58.值班所有表:ITSM_CHANGE_SHIFT 换班请求、ITSM_PERIOD 班次、ITSM_SCHEDULE 值班任务、ITSM_WORK_LOG 值班日志。
59.新建表单的时间组件自动生成当前时间的方法: 在value中设置其为:${curdate}。
60.流程中设置节点处理人的方法有好几种,
1.除了pool actors 设置固定角色处理节点,
2.还可以在节点前的提交动作提交actors的参数值,设置下一结点的处理人,(这种方法中,下一结点的处理人中的角色可以是handler bean ,不能是pool actors ),
3.还有一种方法是设置变量的方法, 在节点处选择处理人为变量类型(上面的选择还是 handler bean),这个变量的书写方式就是表单页面中的字段名,例如plancreator,变量的设置方式必须是在提交动作中设置variables,把variable 的值设置成map对象,map也是在该动作中加的,加的是运行一段代码:Map map = new HashMap();map.put("plancreator", "id:"+(String)dataProcessEngine.getParameter("plancreator"));dataProcessEngine.addRuntimeObject("plancreatorMap", map);其中plancreatorMap是此map的名字,定义变量的时候,变量的值就选择是它。这样流程走到下一结点的时候就可以调用这个变量来选择处理人了。
61.流程中节点名称的设置,节点名称、任务名称、事件名称、行为名称要保持一致。
62.把数据库查询出的数字对象转换成数字:int top = Integer.parseInt(String.valueOf(employeecount.get(0)));
63.报表区域时间转换,默认时间从最后的0点0分变成最后日期的23:59:59:
dates[0] = DateUtil.convertStringToDate(DateUtil.DATE_TIME_PATTREN_CN, startDate+" 00:00:00");
dates[1] = DateUtil.convertStringToDate(DateUtil.DATE_TIME_PATTREN_CN, endDate+" 23:59:59");
dates[0]、dates[1]都是DATE类型属性。
例如:
private Date[] getDateFromParameter() {
String startDate = this.getRequest().getParameter("startDate");
String endDate = this.getRequest().getParameter("endDate");
Date dates[] = new Date[2];
if (startDate == null || endDate == null) {
Calendar c = Calendar.getInstance();
Date endTime_ = new Date();
c.setTime(endTime_);
c.add(Calendar.DATE, -7);
Date startTime_ = c.getTime();// 得到date類型后的startTime_,
String startnull = DateUtil.getDate(startTime_);
try {
dates[0] = DateUtil.convertStringToDate(
DateUtil.DATE_TIME_PATTREN_CN, startnull + " 00:00:00");// 转换string类型的startnull为date
} catch (ParseException e) {
e.printStackTrace();
}
dates[1] = endTime_;
} else {
try {
dates[0] = DateUtil.convertStringToDate(
DateUtil.DATE_TIME_PATTREN_CN, startDate + " 00:00:00");
dates[1] = DateUtil.convertStringToDate(
DateUtil.DATE_TIME_PATTREN_CN, endDate + " 23:59:59");
} catch (ParseException e) {
e.printStackTrace();
}
}
return dates;
}
64.查询某字段所在表的sql语句是:select TABLE_NAME from COLUMNS where COLUMN_NAME = ‘字段名’;
65.取消消息删除的选中状态:
a.首先需要找到这个组件所在的js,(例如:消息删除的“删除选中项”的js:NoticeViewPanel.js)
b.找到js中组件所在的位置,(例如消息删除中的:text: $lang('admin.notice.NoticeViewPanel.tbar.delete'), xaction: 'notice_deleteAll', iconCls: 'delete-selected-icon', handler: function(){//'删除选中项'。。。。。)
c.更改组件,添加// 自定义扩展:将Grid表头中的全选复选框取消复选 add by zhaokang 2012-07-05,在组建中调用新建方法: grid.unSelectAll();
66.事件首页高级查询:页面上定义的text的name有createdendTime但是在BusinessProcessInstanceAction.java中的listByHql()方法中并没有定义从页面上获取的createdendTime参数,再次方法中+入createdendTime参数,其中<='2012-07-4' 是不包括2012年7月4号的,如果时间刚刚好是2012年07月04号0点0分的话,应该包括,开始时间>='2012-07-03'是>=2012年0703号的0点0分。
67.处理页面的"更多"在加载页面的手写代码中加入。
68.报表添加top选择数的思路:
1.改动java方法中显示参数的获取方式:String topStr = this.getRequest().getParameter("top");
int topNum = 5;
try {
topNum = Integer.parseInt(topStr);
} catch (Exception e) {
topNum = 5;
};
2.改动js,定义数量参数并在tbar中添加按钮:
this.TimeComparedByCategoryFiled = new Ext.form.NumberField( {
anchor : '98%',
fieldLabel : 'TOP',
value : 5
});
"TOP:",this.TimeComparedByCategoryFiled,
3.改动js中查询按钮所传入的参数:
var topNum = this.TimeComparedByCategoryFiled.getValue();
参数中添加: top : topNum
69.修改报表的思路:1.js中对报表图形进行展示2.action中对报表进行数据查询方法:(服务性周期报表除外)。
70.流程增加修改已关闭工单内容的功能。
基本思路:在显示前端弹出表单窗口,窗口点击按钮可以触发动作,此动作将表单内的元素作为参数修改对象incident的内容。
1.按钮模拟:由于原表单(Bpviewpanel.js)tbar中含有“删除选中项”功能,仿照此元素,复制,修改其原带的方法deleteChecked : function()
2.方法写入:自定义方法editCloseBpis.html,在struts-workflow.xml中增加此方法,新建此方法所用class:bpiForeditAction,在bpiForeditAction中用到了incidentManager,需要重新注入。(一般xx对象的编辑方法体都为xxmanager)
方法中从前台获取以选中的工单id 作为参数bpIds得到工单incident对象,方法用的是Incident bpi = incidentManager.get(bpIds);
3.前端获取参数:以模拟的按钮“修改工单”所出发的方法handler : this.editCloseBpi中筛选过滤条件,然后触发事件,弹出一个新的ext窗口:
Ext.ux.ScriptLoader("bp/scripts/BpCloseEdit.js"); 弹出新的js窗口 相当于java中的import
var bpCloseEdit = new BpCloseEdit({bpIds: bpIds}); 初始化此新的js 相当于java中的new
4.新js的定义:模拟的是个性设置-->修改个人信息所弹出的窗口userwin.js
复制新的js:BpCloseEdit.js
1.js中包括两大部分:BpCloseEdit = function(conf) {}和Ext.extend(BpCloseEdit, Ext.Window, {})
2.其中BpCloseEdit = function(conf) {}包含定义此js的方法BpCloseEdit.superclass.constructor.call(this, {})和新的窗口var jiejuexinxi = new Ext.form.FieldSet({})和新的表单this.bpiForm = new Ext.form.FormPanel({})和增加新的按钮:this.add(this.bpiForm);this.addButton({text: '确定',handler : this.saveUser,scope: this});this.addButton({text: '取消',handler : this.close,scope: this});this.show();this.loadData();
5.以后要弹出js界面,在界面修改已生成的对象都可以利用此方法。
71.对弹出的用户信息进行部门的筛选,思路是在调用此html的时候加上计算机部门的参数:"url":"admin/users!listForWin.html?department=2c9a7d9f31d59f8f0131d5ac3feb0007"
72.门户系统menhu,source中添加的有menhu/src,menhu/conf。
73.如何去掉licence,在StartupListener.java、BaseAction.java、LoginAction.class中去掉licence的验证。
74.-Xms1024M -Xmx1024M -XX:MaxPermSize=512m