个人总结No.1
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
发表评论
文章已被作者锁定,不允许评论。
相关推荐
使用P操作和V操作确保不超过最大就餐人数,且门每次只能有三个人通过。具体程序实现略。 以上知识点总结涵盖了操作系统中涉及的各种重要概念和技术细节,有助于深入理解操作系统的工作原理和设计思想。
在“宅男周刊”系列应用中,每个APK文件代表一个版本,数字编号(如NO.1到NO.9)通常表示发布顺序或更新版本。随着新内容的发布,开发者会推出新的APK,用户需要安装新的版本以获取最新内容。这种版本控制机制有助于...
【CSA C22.2 No. 250.0-21标准详解】 CSA C22.2 No. 250.0-21是加拿大国家标准,专注于照明设备(Luminaires)的安全规定。这个标准由加拿大标准协会(现名为“CSA Group”)通过一个由标准理事会加拿大批准的共识...
根据题目信息,我们可以总结并详细解释以下几个IT领域的关键知识点: ### 国家顶级域名与商业域名 1. **国家顶级域名**:这类域名通常用来标识一个国家或地区,例如题目中的选项提到了不同国家的顶级域名。具体来...
“NO.44Km”和“NO.42.88Km”可能指的是具体的工程项目长度或是里程数。这些信息表明文档的主人可能参与过相关的工程项目管理或者施工设计。 同时,文档中提到了一些软件和工具的名称,比如“AutoCAD”,它是一款...
总结来说,draw.io是一款功能强大、易于使用的免费开源绘图工具,是Visio的理想替代品。无论是在Windows环境下通过本地应用,还是在网页端进行在线编辑,都能为用户提供高效、灵活的绘图体验。对于那些追求成本效益...
1. "As an old saying goes,..." - 引用谚语或名言来引入观点,增加说服力。例如,"As an old saying goes, 'Actions speak louder than words.'" 2. "Be nothing but..." - 表达绝对性,如:"This argument is ...
- 询问个人喜好:"What do you like doing?"(你喜欢做什么?)以及回答"I like swimming, reading and listening to music."(我喜欢游泳、阅读和听音乐。) - 表达相同爱好:"I like reading too."(我也喜欢...
1. **公司文化**:高路动画公司推崇"No Manager, No Sex, No Star, No Age, Delete All"的企业文化,这强调的是平等、开放和尊重个人差异的工作氛围,为年轻人提供了展示自我和追求梦想的舞台。 2. **实习体验**:...
【最新高考英语重点短语总结】对于备考高考的英语学习者来说,掌握这些高频短语至关重要。以下是一些关键短语及其用法的详细解释: 1. `ought to`: 表示应该或应当做什么,相当于should,常用于给出建议或表示义务...
在这一年里,作者被赋予了更大的责任,参与了XX上海大众no.1涂装技能大赛,并在领导的指导下,对自己的工作有了更深入的理解,同时也意识到自身的不足。作者表达了对公司和同事的感激之情,并承诺在新的一年里会更好...
标题“个人总结 - m25p80.c debug on Micron spi nor_flash.pdf”揭示文档内容涉及个人对名为m25p80.c的代码文件进行调试的经验总结,该文件是针对基于Micron品牌MT25Q系列的SPI NOR Flash芯片(具体型号为MT25Q128 ...
”和“No, I didn't.”,学习了如何用一般过去时来谈论过去的习惯。 ### 总结 文件“香港朗文a总结uu.pdf”主要涵盖了英语基础语法和日常交流中常用到的词汇和句型。从现在进行时、一般现在时到一般过去时,从基本...
这篇文档是针对七年级下册英语复习的重点知识总结,涵盖了多个语法点和词汇。以下是其中的关键知识点详解: 1. **帮助某人**:有两种表达方式,`help sb. with sth` 和 `help sb. (to) do sth`。例如,`Can you ...
以下是我个人关于在Linux上搭建FTP服务器的一些总结: 1. **选择FTP服务器软件** 在Linux中,常用的FTP服务器软件有vsftpd、ProFTPD和PureFTPd。本篇主要介绍vsftpd,因为它简单易用且安全性能较高。 2. **安装...
)这里的achieve指的就是实现个人的目标。 achieve作为及物动词时,它的宾语通常是可以“取得”或“实现”的对象,如成功、胜利、名誉、地位等。例如:"She achieved no success."(她没有获得成功。)这里的...
**UN Regulation No. 155**,即联合国第155号条例,是一项国际性的法规,主要针对的是汽车及其相关设备的安全性,尤其是车辆的网络安全方面。该法规规定了如何通过联合国统一技术文件来规定可移动的轮式车辆、设备和...
1. **存储过程调用**:在SQL中,存储过程`p`被定义为接收一个输入参数`IN nol INT`和一个输出参数`OUT pname VARCHAR(10)`。调用存储过程时,输入参数应传递实际值,输出参数应传递变量。选项A正确,因为它传递了一...
根据给定文件的信息,我们可以总结出一系列与计算机二级等级考试相关的知识点,具体涵盖Word操作、计算机系统基础知识、Visual FoxPro(VFP)、面向对象编程基础、Java编程等几个方面。 ### Word操作 1. **文件...