最新泛微OA ecology 二次开发实例 开发完整说明资料

合集下载

泛微OA-ecology-二次开发实例-开发完整说明学习资料

泛微OA-ecology-二次开发实例-开发完整说明学习资料

泛微OA-ecology-二次开发实例-开发完整说明学习资料二次开发培训文档一、ECOLOGY系统框架结构1、主要的程序结构EcologyClassbean 存放编译后的CLASS文件js 系统中使用的JA V ASCRIPT和VBSCRIPT脚本Css 系统中JSP页面使用的样式ImagesImages_faceImages_frame 系统中使用的图片的存放目录CrmWorkflow 该功能分文件夹存放每个功能的文件WEB-INFProp 系统配置文件存放Service 系统的接口配置文件的存放二、说明一个JSP页面,一个JA V A程序的基本组成,如何阅读JSP页面1、一个jsp页面通常需要包含什么内容2、如何阅读一个JSP页面由于ECOLOGY系统支持多语言,因此在JSP页面上一般不出现中文,全部使用标签的形式来显示中文:比如:在IE上显示“姓名”那么在JSP页面中将通过<%=SystemEnv.getHtmlLabelName(413,user.getLanguage() )%>这样的形式来表示,其中的数字413就是表示姓名,同时可以通过“select labelname from htmllabelinfo where indexid=413 and languageid=7”来获取到“姓名”这个显示名称,其中languageid=7表示中文显示名称,languageid=8表示英文显示名称.delete from HtmlLabelIndex where id=81249delete from HtmlLabelInfo where indexid=81249INSERT INTO HtmlLabelIndex values(81249,'选择范围')INSERT INTO HtmlLabelInfo VALUES(81249,'选择范围',7)INSERT INTO HtmlLabelInfo VALUES(81249,'Range of choice',8)INSERT INTO HtmlLabelInfo VALUES(81249,'選擇範圍',9)3、JA V A程序的基本组成在ECOLOGY中开发JA V A程序建议继承weaver.general. BaseBean,在BaseBean 中主要封装了两个方法:写日志文件,获取配置文件中的参数值。

泛微表单建模二次开发案例

泛微表单建模二次开发案例

1.根据建模数据定时创建流程每个月初触发客户回访记录流程package weaver.formmode.apps;import java.util.ArrayList;import java.util.List;import weaver.conn.RecordSet;import weaver.file.Prop;import weaver.general.BaseBean;import weaver.general.Util;import weaver.hrm.resource.ResourceComInfo;import weaver.interfaces.schedule.BaseCronJob;import weaver.soa.workflow.request.MainTableInfo;import weaver.soa.workflow.request.Property;import weaver.soa.workflow.request.RequestInfo;import weaver.soa.workflow.request.RequestService;import com.weaver.formmodel.util.DateHelper;/*** 每个月初定时创建客户回访信息* @author mc*/public class CreateWorkflowJob extends BaseCronJob {private BaseBean beseBean = new BaseBean();public void execute() {//chuaString workflowid = Prop.getPropValue("kh", "workflowid");// 流程创建人String createor = Prop.getPropValue("kh", "createid");RecordSet rs = new RecordSet();rs.executeQuery("select * from uf_khinfo ");while(rs.next()){String gsmc = Util.null2String(rs.getString("gsmc"));String khmc = Util.null2String(rs.getString("khmc"));String khjl = Util.null2String(rs.getString("khjl"));ResourceComInfo rci = null;try {rci = new ResourceComInfo();} catch (Exception e1) {e1.printStackTrace();}String khmcName = rci.getLastname(khmc);String topTitle = gsmc+"-"+khmcName+"("+ DateHelper.getCurrentMonth() +")"; // 创建流程RequestService requestService = new RequestService();RequestInfo requestInfo = new RequestInfo();requestInfo.setWorkflowid(workflowid);//流程类型idrequestInfo.setCreatorid(createor);//创建人requestInfo.setDescription(topTitle);//设置流程标题requestInfo.setRequestlevel("0");//0 正常,1重要,2紧急requestInfo.setIsNextFlow("1");//流转到下一节点0:不自动流程其它:自动流程MainTableInfo mainTableInfo = new MainTableInfo();List<Property> fields = new ArrayList<Property>();Property field = null;/*** 主表* 格式:* {* rwmc: '任务名称-001',* rwfzr: '杨文元',* ksrq: '2019-08-08',* }*/field = new Property();field.setName("khjl");field.setValue(khjl);fields.add(field);field = new Property();field.setName("khmc");field.setValue(gsmc);fields.add(field);field = new Property();field.setName("khjl");field.setValue(khjl);fields.add(field);field = new Property();field.setName("fzr");field.setValue(khmc);fields.add(field);Property[] fieldarray = (Property[]) fields.toArray(new Property[fields.size()]); mainTableInfo.setProperty(fieldarray);requestInfo.setMainTableInfo(mainTableInfo);int newrequestid = 0;try {newrequestid = Util.getIntValue(requestService.createRequest(requestInfo));} catch (Exception e) {e.printStackTrace();}beseBean.writeLog("创建成功的流程requestid:"+newrequestid);}}}配置文件2.建模中代码创建附件/*** 从网络上抓取文件存入系统中* @param modeid* @param userid* @param fileurl* @param filename* @return*/public int buildFile(int modeid,int userid,String fileurl,String filename) {RecordSet rs = new RecordSet();OutputStream os = null;ZipOutputStream filezipOut = null;InputStream source = null;int retDocid = 0;boolean needzip = false;try {SystemComInfo syscominfo = new SystemComInfo();String createdir = FileUpload.getCreateDir(syscominfo.getFilesystem());if( (syscominfo.getNeedzip()).equals("1") ) needzip = true ;FileManage.createDir(createdir) ;DefaultFileRenamePolicy defpolicy = new DefaultFileRenamePolicy() ;String refilename = weaver.general.Util.getRandom();String filepath = createdir+refilename;if(needzip) filepath+=".zip";java.io.File outfile = new java.io.File(filepath);outfile = defpolicy.rename(outfile);String iszip = "1" ;if(needzip){filezipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(outfile)));filezipOut.setMethod(ZipOutputStream.DEFLATED); //设置压缩方法filezipOut.putNextEntry(new ZipEntry(refilename)) ;//正文只能是WORD文档os = filezipOut ;}else{os = new BufferedOutputStream(new FileOutputStream(outfile)) ;iszip = "0";}//通过HTTP方式获取文件URL url = new URL(fileurl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();BufferedInputStream input = new BufferedInputStream(conn.getInputStream());long filesize = 0;byte[] buffer = new byte[1024];int count = 0;while ((count = input.read(buffer)) > 0) {os.write(buffer, 0, count);filesize++;}os.flush();if(os!=null) os.close();if(filezipOut!=null) filezipOut.close();if(input!=null) input.close();//以下将文件放至IMAGEFILE表中int imageid = 0;String imagefileused = "1"String isencrypt = "1" ;String originalfilename = filename;//原始文件名String contenttype = "HTTP";char separator = Util.getSeparator() ;imageid=imageFileIdUpdate.getImageFileNewId();String para = ""+imageid + separator + originalfilename + separator+ contenttype + separator + imagefileused + separator + filepath + separator+ iszip + separator + isencrypt + separator + filesize ;rs.executeProc("ImageFile_Insert",para);//文件FILEID处理DocManagerNoRequest docManagerNoRequest = new DocManagerNoRequest();int maincategory = Util.getIntValue((String)staticobj.getObject("DocChangeSetting.maincategory"), 0);int subcategory = Util.getIntValue((String)staticobj.getObject("DocChangeSetting.subcategory"), 0);int seccategory = Util.getIntValue((String)staticobj.getObject("DocChangeSetting.seccategory"), 0);if(modeid > 0){rs.executeSql("select * from modeinfo where id="+modeid);if(rs.next()){maincategory = Util.getIntValue(rs.getString("maincategory"),0);subcategory = Util.getIntValue(rs.getString("subcategory"),0);seccategory = Util.getIntValue(rs.getString("seccategory"),0);}}//填补文档信息String extname = "";//扩展名String imageFileName = Util.null2String(filename);int tempPos = stIndexOf(".");if (tempPos != -1) {extname = imageFileName.substring(tempPos + 1);}Map dataMap=new HashMap();String docsubject="";if(tempPos==-1) docsubject = originalfilename;else docsubject = originalfilename.substring(0, tempPos);dataMap.put("docsubject",docsubject);dataMap.put("doccreaterid",""+userid);dataMap.put("docCreaterType","1");dataMap.put("maincategory",""+maincategory);dataMap.put("subcategory",""+subcategory);dataMap.put("seccategory",""+seccategory);dataMap.put("fileids",""+imageid);docManagerNoRequest.UploadDocNoRequest(dataMap);retDocid = docManagerNoRequest.getId();//文档IDrs.executeSql("update docdetail setownerid="+userid+",doccreatedate='"+getCurrentDate()+"',doccreatetime='"+getCurrentTime()+"' where id="+retDocid);rs.executeSql("update docdetail set docPublishType='2' where id ="+retDocid);//处理文档共享rs.executeSql("INSERT INTOShareinnerdoc(sourceid,type,content,seclevel,sharelevel,srcfrom,opuser,sharesource)values('"+docManagerNoRequest.getId()+"','1','"+userid+"','10','3','80','"+userid+"','0')");}catch(Exception e) {writeLog(e);} finally {try {if (os != null) os.close();if(filezipOut!=null) filezipOut.close();}catch(Exception e) {writeLog(e);}return retDocid;}}3.甘特图插件<%@page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@include file="./init_wev8.jsp"%><!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"><title>甘特图</title><link rel="stylesheet"type="text/css"href="./core/jquery-ui.css"/><link rel="stylesheet"type="text/css"href="./reset.css"/><link rel="stylesheet"type="text/css"href="./core/jquery-gantt.css"/><script language="javascript"src="/js/datetime_wev8.js"></script><script language="javascript"src="/js/JSDateTime/WdatePicker_wev8.js"></script><script language="javascript"src="/js/ecology8/selectbox/js/jquery.selectbox-0.2_wev8.js"></script> <style type="text/css">body {font-family: tahoma, verdana, helvetica;font-size: 0.8em;padding: 10px;width: 90%;height: 95%;}</style></head><body><div style="padding-bottom:5px;width:400px;">开始日期:<input name="start"id="start"value=""type="hidden"class="wuiDate"_callback="calldate"/>&nbsp;&nbsp;结束日期:<input name="end"id="end"value=""type="hidden"class="wuiDate" _callback="calldate"/>&nbsp;&nbsp;<input type="button"class="middle e8_btn_top_first"onclick="query()"value="查询"/> </div><div id="ganttChart"></div><br/><br/><div id="eventMessage"></div><script type="text/javascript"src="./core/jquery-1.4.2.js"></script><script type="text/javascript"src="./core/date.js"></script><script type="text/javascript"src="./core/jquery-ui.js"></script><script type="text/javascript"src="./core/jquery-gantt.js"charset="utf-8"></script><script type="text/javascript"src="./data.js"></script><script type="text/javascript">$(function () {//发送ajax 请求数据$.ajax({url:"/formmode/apps/gantt/data.jsp",data:{action:"init"},dataType:"json",success:function(result){for(var i=0;i<result.length ;i++){// 将日期格式转换为毫秒的形式:如“yyyy-MM-dd --> 1221456783545var s = result[i].series[1].start.split("-");var s1 = result[i].series[1].end.split("-")var start = new Date(s[0],s[1]-1,s[2]);var end = new Date(s1[0],s1[1]-1,s1[2]);result[i].series[1].start = start;result[i].series[1].end = end;}//console.log(result[0].series[1].start.getDate());if(result.length>0){init(result);}}})});function init(ganttData){$("#ganttChart").ganttView({data: ganttData,slideWidth: $(document).width()-400,//右边面板大小behavior: {draggable:false,//禁止拖动// 点击进度条触发事件onClick: function (data) {var msg = "You clicked on an event: { start: " +data.start.toString("M/d/yyyy") + ", end: " + data.end.toString("M/d/yyyy") + " }";$("#eventMessage").text(msg);window.open("/formmode/view/AddFormMode.jsp?modeId=11&formId=-30&type=0&billid="+data.i d);},onResize: function (data) {var msg = "You resized an event: { start: " +data.start.toString("M/d/yyyy") + ", end: " + data.end.toString("M/d/yyyy") + " }";$("#eventMessage").text(msg);},onDrag: function (data) {var msg = "You dragged an event: { start: " +data.start.toString("M/d/yyyy") + ", end: " + data.end.toString("M/d/yyyy") + " }";$("#eventMessage").text(msg);}}});}function query(){//获取到开始日期和结束日期var start = jQuery("#start").val();var end = jQuery("#end").val();if(start=='' && end=='') return;$.ajax({url:"/formmode/apps/gantt/data.jsp",data:{action:"query",start:start,end:end},dataType:"json",success:function(result){jQuery("#ganttChart").empty();for(var i=0;i<result.length ;i++){var s = result[i].series[1].start.split("-");var s1 = result[i].series[1].end.split("-")var start = new Date(s[0],s[1]-1,s[2]);var end = new Date(s1[0],s1[1]-1,s1[2]);result[i].series[1].start = start;result[i].series[1].end = end;}if(result.length>0){init(result);}}})}function calldate(){ }function stringToDate(dateStr,separator){if(!separator){separator="-";}var dateArr = dateStr.split(separator);var year = parseInt(dateArr[0]);var month;//处理月份为04这样的情况if(dateArr[1].indexOf("0") == 0){month = parseInt(dateArr[1].substring(1));}else{month = parseInt(dateArr[1]);}var day = parseInt(dateArr[2]);var date = new Date(year,month -1,day);return date;}</script></body></html>4.组织架构图插件<html><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"> <title>组织结构图</title><link rel="stylesheet"href="css/bootstrap.min.css"/><link rel="stylesheet"href="css/jquery.jOrgChart.css"/><link rel="stylesheet"href="css/custom.css"/><link href="css/prettify.css"type="text/css"rel="stylesheet"/><script type="text/javascript"src="prettify.js"></script><script type="text/javascript"src="/formmode/apps/orgchart/css/jquery.min.js"></script> <script type="text/javascript"src="/formmode/apps/orgchart/css/jquery-ui.min.js"></script> <script src="jquery.jOrgChart.js"></script><style>a {text-decoration: none;color: #fff;font-size: 12px;}a:hover {color: red;text-decoration: none;}.jOrgChart.node {width: 120px;height: 50px;line-height: 50px;border-radius: 4px;margin: 0 8px;cursor: pointer;}</style></head><body onload="prettyPrint();"><div id='jOrgChart'style="width: 1900px;height:1000px;overflow-x: auto;margin:0 auto"></div> <script type='text/javascript'>$(function(){//数据返回$.ajax({url: "./data.jsp",//url: "test.json",type: 'GET',dataType: 'JSON',data: {action: 'org_select'},success: function(result){var showlist = $("<ul id='org' style='display:none'></ul>");showall(result.data, showlist);$("#jOrgChart").append(showlist);$("#org").jOrgChart( {chartElement : '#jOrgChart',//指定在某个dom生成jorgchartdragAndDrop : false //设置是否可拖动});}});});function showall(menu_list, parent) {$.each(menu_list, function(index, val) {if(val.childrens.length > 0){var li = $("<li></li>");li.append("<a href='javascript:void(0)'onclick=getOrgId("+val.id+");>"++"</a>").append("<ul></ul>").appendTo(parent);//递归显示showall(val.childrens, $(li).children().eq(1));}else{$("<li></li>").append("<a href='javascript:void(0)'onclick=getOrgId("+val.id+");>"++"</a>").appendTo(parent);}});}</script></body></html>。

泛微二次开发所需要的知识

泛微二次开发所需要的知识

泛微二次开发所需要的知识
泛微二次开发是指在泛微OA系统中进行二次开发,以满足个性化的业务需求和提升工作效率。

在进行泛微二次开发之前,需要掌握以下知识:
步骤一:了解泛微OA系统
作为一个泛微二次开发者,首先需要了解泛微OA系统的概念、功能以及基本架构。

只有深入了解泛微OA系统才能对二次开发对接点有更清晰的认识,从而更好地完成二次开发任务。

步骤二:掌握JAVA编程
泛微OA系统的二次开发使用的是JAVA编程语言,所以二次开发者需要掌握JAVA编程。

特别是在泛微OA系统中,JAVA编程的应用非常广泛,包含了工作流引擎、表单控件、数据集成等方面。

只有掌握了JAVA编程知识,才能更好地进行泛微OA系统的二次开发。

步骤三:熟悉Web开发
泛微OA系统作为一款B/S架构的软件,二次开发涉及到了Web 开发知识,包括HTML、CSS、JavaScript等方面。

因此,二次开发者需要熟悉Web开发知识,才能更好地进行泛微OA系统的二次开发。

步骤四:掌握数据库知识
泛微OA系统中的业务数据存储在数据库中,因此,二次开发者需要具备数据库相关的知识,包括SQL语句、数据表设计等。

只有掌握了数据库知识,才能更好地实现系统的数据存储和管理。

步骤五:了解相关API
泛微OA系统提供了丰富的API,包含了表单API、流程API、组织人员API等方面。

二次开发者需要了解相关API,从而能够更快地实现对系统的定制化开发,满足不同用户的需求。

总之,泛微二次开发要求开发者具备一定的技术功底和相关知识背景。

需要花费时间进行学习和探索,才能在泛微OA系统中运用这些知识,做出更加优秀的产品。

泛微OAecology二次开发实例开发完整说明书

泛微OAecology二次开发实例开发完整说明书

二次开发培训文档一、ECOLOGY系统框架结构1、主要的程序结构EcologyClassbean 存放编译后的CLASS文件js 系统中使用的JAVASCRIPT和VBSCRIPT脚本Css 系统中JSP页面使用的样式ImagesImages_faceImages_frame 系统中使用的图片的存放目录CrmWorkflow 该功能分文件夹存放每个功能的文件WEB-INFProp 系统配置文件存放Service 系统的接口配置文件的存放二、说明一个JSP页面,一个JAVA程序的基本组成,如何阅读JSP页面1、一个jsp页面通常需要包含什么内容2、如何阅读一个JSP页面由于ECOLOGY系统支持多语言,因此在JSP页面上一般不出现中文,全部使用标签的形式来显示中文:比如:在IE上显示“姓名”那么在JSP页面中将通过<%=SystemEnv.getHtmlLabelName(413,user.getLanguage())%>这样的形式来表示,其中的数字413就是表示姓名,同时可以通过“select labelname fromhtmllabelinfo where indexid=413 and languageid=7”来获取到“姓名”这个显示名称,其中languageid=7表示中文显示名称,languageid=8表示英文显示名称.delete from HtmlLabelIndex where id=81249delete from HtmlLabelInfo where indexid=81249INSERT INTO HtmlLabelIndex values(81249,'选择范围')INSERT INTO HtmlLabelInfo VALUES(81249,'选择范围',7)INSERT INTO HtmlLabelInfo VALUES(81249,'Range of choice',8)INSERT INTO HtmlLabelInfo VALUES(81249,'選擇範圍',9)3、JAVA程序的基本组成在ECOLOGY中开发JAVA程序建议继承weaver.general. BaseBean,在BaseBean中主要封装了两个方法:写日志文件,获取配置文件中的参数值。

泛微表单建模二次开发案例

泛微表单建模二次开发案例

1.根据建模数据定时创建流程每个月初触发客户回访记录流程package weaver.formmode.apps;import java.util.ArrayList;import java.util.List;import weaver.conn.RecordSet;import weaver.file.Prop;import weaver.general.BaseBean;import weaver.general.Util;import weaver.hrm.resource.ResourceComInfo;import weaver.interfaces.schedule.BaseCronJob;import weaver.soa.workflow.request.MainTableInfo;import weaver.soa.workflow.request.Property;import weaver.soa.workflow.request.RequestInfo;import weaver.soa.workflow.request.RequestService;import com.weaver.formmodel.util.DateHelper;/*** 每个月初定时创建客户回访信息* @author mc*/public class CreateWorkflowJob extends BaseCronJob {private BaseBean beseBean = new BaseBean();public void execute() {//chuaString workflowid = Prop.getPropValue("kh", "workflowid");// 流程创建人String createor = Prop.getPropValue("kh", "createid");RecordSet rs = new RecordSet();rs.executeQuery("select * from uf_khinfo ");while(rs.next()){String gsmc = Util.null2String(rs.getString("gsmc"));String khmc = Util.null2String(rs.getString("khmc"));String khjl = Util.null2String(rs.getString("khjl"));ResourceComInfo rci = null;try {rci = new ResourceComInfo();} catch (Exception e1) {e1.printStackTrace();}String khmcName = rci.getLastname(khmc);String topTitle = gsmc+"-"+khmcName+"("+ DateHelper.getCurrentMonth() +")"; // 创建流程RequestService requestService = new RequestService();RequestInfo requestInfo = new RequestInfo();requestInfo.setWorkflowid(workflowid);//流程类型idrequestInfo.setCreatorid(createor);//创建人requestInfo.setDescription(topTitle);//设置流程标题requestInfo.setRequestlevel("0");//0 正常,1重要,2紧急requestInfo.setIsNextFlow("1");//流转到下一节点0:不自动流程其它:自动流程MainTableInfo mainTableInfo = new MainTableInfo();List<Property> fields = new ArrayList<Property>();Property field = null;/*** 主表* 格式:* {* rwmc: '任务名称-001',* rwfzr: '杨文元',* ksrq: '2019-08-08',* }*/field = new Property();field.setName("khjl");field.setValue(khjl);fields.add(field);field = new Property();field.setName("khmc");field.setValue(gsmc);fields.add(field);field = new Property();field.setName("khjl");field.setValue(khjl);fields.add(field);field = new Property();field.setName("fzr");field.setValue(khmc);fields.add(field);Property[] fieldarray = (Property[]) fields.toArray(new Property[fields.size()]); mainTableInfo.setProperty(fieldarray);requestInfo.setMainTableInfo(mainTableInfo);int newrequestid = 0;try {newrequestid = Util.getIntValue(requestService.createRequest(requestInfo));} catch (Exception e) {e.printStackTrace();}beseBean.writeLog("创建成功的流程requestid:"+newrequestid);}}}配置文件2.建模中代码创建附件/*** 从网络上抓取文件存入系统中* @param modeid* @param userid* @param fileurl* @param filename* @return*/public int buildFile(int modeid,int userid,String fileurl,String filename) {RecordSet rs = new RecordSet();OutputStream os = null;ZipOutputStream filezipOut = null;InputStream source = null;int retDocid = 0;boolean needzip = false;try {SystemComInfo syscominfo = new SystemComInfo();String createdir = FileUpload.getCreateDir(syscominfo.getFilesystem());if( (syscominfo.getNeedzip()).equals("1") ) needzip = true ;FileManage.createDir(createdir) ;DefaultFileRenamePolicy defpolicy = new DefaultFileRenamePolicy() ;String refilename = weaver.general.Util.getRandom();String filepath = createdir+refilename;if(needzip) filepath+=".zip";java.io.File outfile = new java.io.File(filepath);outfile = defpolicy.rename(outfile);String iszip = "1" ;if(needzip){filezipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(outfile)));filezipOut.setMethod(ZipOutputStream.DEFLATED); //设置压缩方法filezipOut.putNextEntry(new ZipEntry(refilename)) ;//正文只能是WORD文档os = filezipOut ;}else{os = new BufferedOutputStream(new FileOutputStream(outfile)) ;iszip = "0";}//通过HTTP方式获取文件URL url = new URL(fileurl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();BufferedInputStream input = new BufferedInputStream(conn.getInputStream());long filesize = 0;byte[] buffer = new byte[1024];int count = 0;while ((count = input.read(buffer)) > 0) {os.write(buffer, 0, count);filesize++;}os.flush();if(os!=null) os.close();if(filezipOut!=null) filezipOut.close();if(input!=null) input.close();//以下将文件放至IMAGEFILE表中int imageid = 0;String imagefileused = "1"String isencrypt = "1" ;String originalfilename = filename;//原始文件名String contenttype = "HTTP";char separator = Util.getSeparator() ;imageid=imageFileIdUpdate.getImageFileNewId();String para = ""+imageid + separator + originalfilename + separator+ contenttype + separator + imagefileused + separator + filepath + separator+ iszip + separator + isencrypt + separator + filesize ;rs.executeProc("ImageFile_Insert",para);//文件FILEID处理DocManagerNoRequest docManagerNoRequest = new DocManagerNoRequest();int maincategory = Util.getIntValue((String)staticobj.getObject("DocChangeSetting.maincategory"), 0);int subcategory = Util.getIntValue((String)staticobj.getObject("DocChangeSetting.subcategory"), 0);int seccategory = Util.getIntValue((String)staticobj.getObject("DocChangeSetting.seccategory"), 0);if(modeid > 0){rs.executeSql("select * from modeinfo where id="+modeid);if(rs.next()){maincategory = Util.getIntValue(rs.getString("maincategory"),0);subcategory = Util.getIntValue(rs.getString("subcategory"),0);seccategory = Util.getIntValue(rs.getString("seccategory"),0);}}//填补文档信息String extname = "";//扩展名String imageFileName = Util.null2String(filename);int tempPos = stIndexOf(".");if (tempPos != -1) {extname = imageFileName.substring(tempPos + 1);}Map dataMap=new HashMap();String docsubject="";if(tempPos==-1) docsubject = originalfilename;else docsubject = originalfilename.substring(0, tempPos);dataMap.put("docsubject",docsubject);dataMap.put("doccreaterid",""+userid);dataMap.put("docCreaterType","1");dataMap.put("maincategory",""+maincategory);dataMap.put("subcategory",""+subcategory);dataMap.put("seccategory",""+seccategory);dataMap.put("fileids",""+imageid);docManagerNoRequest.UploadDocNoRequest(dataMap);retDocid = docManagerNoRequest.getId();//文档IDrs.executeSql("update docdetail setownerid="+userid+",doccreatedate='"+getCurrentDate()+"',doccreatetime='"+getCurrentTime()+"' where id="+retDocid);rs.executeSql("update docdetail set docPublishType='2' where id ="+retDocid);//处理文档共享rs.executeSql("INSERT INTOShareinnerdoc(sourceid,type,content,seclevel,sharelevel,srcfrom,opuser,sharesource)values('"+docManagerNoRequest.getId()+"','1','"+userid+"','10','3','80','"+userid+"','0')");}catch(Exception e) {writeLog(e);} finally {try {if (os != null) os.close();if(filezipOut!=null) filezipOut.close();}catch(Exception e) {writeLog(e);}return retDocid;}}3.甘特图插件<%@page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@include file="./init_wev8.jsp"%><!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"><title>甘特图</title><link rel="stylesheet"type="text/css"href="./core/jquery-ui.css"/><link rel="stylesheet"type="text/css"href="./reset.css"/><link rel="stylesheet"type="text/css"href="./core/jquery-gantt.css"/><script language="javascript"src="/js/datetime_wev8.js"></script><script language="javascript"src="/js/JSDateTime/WdatePicker_wev8.js"></script><script language="javascript"src="/js/ecology8/selectbox/js/jquery.selectbox-0.2_wev8.js"></script> <style type="text/css">body {font-family: tahoma, verdana, helvetica;font-size: 0.8em;padding: 10px;width: 90%;height: 95%;}</style></head><body><div style="padding-bottom:5px;width:400px;">开始日期:<input name="start"id="start"value=""type="hidden"class="wuiDate"_callback="calldate"/>&nbsp;&nbsp;结束日期:<input name="end"id="end"value=""type="hidden"class="wuiDate" _callback="calldate"/>&nbsp;&nbsp;<input type="button"class="middle e8_btn_top_first"onclick="query()"value="查询"/> </div><div id="ganttChart"></div><br/><br/><div id="eventMessage"></div><script type="text/javascript"src="./core/jquery-1.4.2.js"></script><script type="text/javascript"src="./core/date.js"></script><script type="text/javascript"src="./core/jquery-ui.js"></script><script type="text/javascript"src="./core/jquery-gantt.js"charset="utf-8"></script><script type="text/javascript"src="./data.js"></script><script type="text/javascript">$(function () {//发送ajax 请求数据$.ajax({url:"/formmode/apps/gantt/data.jsp",data:{action:"init"},dataType:"json",success:function(result){for(var i=0;i<result.length ;i++){// 将日期格式转换为毫秒的形式:如“yyyy-MM-dd --> 1221456783545var s = result[i].series[1].start.split("-");var s1 = result[i].series[1].end.split("-")var start = new Date(s[0],s[1]-1,s[2]);var end = new Date(s1[0],s1[1]-1,s1[2]);result[i].series[1].start = start;result[i].series[1].end = end;}//console.log(result[0].series[1].start.getDate());if(result.length>0){init(result);}}})});function init(ganttData){$("#ganttChart").ganttView({data: ganttData,slideWidth: $(document).width()-400,//右边面板大小behavior: {draggable:false,//禁止拖动// 点击进度条触发事件onClick: function (data) {var msg = "You clicked on an event: { start: " +data.start.toString("M/d/yyyy") + ", end: " + data.end.toString("M/d/yyyy") + " }";$("#eventMessage").text(msg);window.open("/formmode/view/AddFormMode.jsp?modeId=11&formId=-30&type=0&billid="+data.i d);},onResize: function (data) {var msg = "You resized an event: { start: " +data.start.toString("M/d/yyyy") + ", end: " + data.end.toString("M/d/yyyy") + " }";$("#eventMessage").text(msg);},onDrag: function (data) {var msg = "You dragged an event: { start: " +data.start.toString("M/d/yyyy") + ", end: " + data.end.toString("M/d/yyyy") + " }";$("#eventMessage").text(msg);}}});}function query(){//获取到开始日期和结束日期var start = jQuery("#start").val();var end = jQuery("#end").val();if(start=='' && end=='') return;$.ajax({url:"/formmode/apps/gantt/data.jsp",data:{action:"query",start:start,end:end},dataType:"json",success:function(result){jQuery("#ganttChart").empty();for(var i=0;i<result.length ;i++){var s = result[i].series[1].start.split("-");var s1 = result[i].series[1].end.split("-")var start = new Date(s[0],s[1]-1,s[2]);var end = new Date(s1[0],s1[1]-1,s1[2]);result[i].series[1].start = start;result[i].series[1].end = end;}if(result.length>0){init(result);}}})}function calldate(){ }function stringToDate(dateStr,separator){if(!separator){separator="-";}var dateArr = dateStr.split(separator);var year = parseInt(dateArr[0]);var month;//处理月份为04这样的情况if(dateArr[1].indexOf("0") == 0){month = parseInt(dateArr[1].substring(1));}else{month = parseInt(dateArr[1]);}var day = parseInt(dateArr[2]);var date = new Date(year,month -1,day);return date;}</script></body></html>4.组织架构图插件<html><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"> <title>组织结构图</title><link rel="stylesheet"href="css/bootstrap.min.css"/><link rel="stylesheet"href="css/jquery.jOrgChart.css"/><link rel="stylesheet"href="css/custom.css"/><link href="css/prettify.css"type="text/css"rel="stylesheet"/><script type="text/javascript"src="prettify.js"></script><script type="text/javascript"src="/formmode/apps/orgchart/css/jquery.min.js"></script> <script type="text/javascript"src="/formmode/apps/orgchart/css/jquery-ui.min.js"></script> <script src="jquery.jOrgChart.js"></script><style>a {text-decoration: none;color: #fff;font-size: 12px;}a:hover {color: red;text-decoration: none;}.jOrgChart.node {width: 120px;height: 50px;line-height: 50px;border-radius: 4px;margin: 0 8px;cursor: pointer;}</style></head><body onload="prettyPrint();"><div id='jOrgChart'style="width: 1900px;height:1000px;overflow-x: auto;margin:0 auto"></div> <script type='text/javascript'>$(function(){//数据返回$.ajax({url: "./data.jsp",//url: "test.json",type: 'GET',dataType: 'JSON',data: {action: 'org_select'},success: function(result){var showlist = $("<ul id='org' style='display:none'></ul>");showall(result.data, showlist);$("#jOrgChart").append(showlist);$("#org").jOrgChart( {chartElement : '#jOrgChart',//指定在某个dom生成jorgchartdragAndDrop : false //设置是否可拖动});}});});function showall(menu_list, parent) {$.each(menu_list, function(index, val) {if(val.childrens.length > 0){var li = $("<li></li>");li.append("<a href='javascript:void(0)'onclick=getOrgId("+val.id+");>"++"</a>").append("<ul></ul>").appendTo(parent);//递归显示showall(val.childrens, $(li).children().eq(1));}else{$("<li></li>").append("<a href='javascript:void(0)'onclick=getOrgId("+val.id+");>"++"</a>").appendTo(parent);}});}</script></body></html>。

泛微协同商务系统 Ecology 系统底层包开发指南

泛微协同商务系统 Ecology 系统底层包开发指南

底层包开发指南目录1. 引言 (2)1.1概述 (2)1.2定义 ..................................... 错误!未定义书签。

2.底层包应用及范例 (2)2.1最基本的继承类 (2)2.2怎样记录日志 (3)2.3怎样获取属性文件的值 (9)2.4怎样获取系统的运行目录 (12)2.5怎样访问和运行数据库脚本 (13)2.6如何上传一个文件 (23)2.7如何访问已经上传的文件 (31)2.8如何使用缓存提高系统效率 (32)2.9其它底层类基本方法 (61)1.引言1.1概述本文档为泛微协同商务系统(Ecology)程序员开发指导文档,讲述了开发底层工具包的应用,常用功能的开发。

2.底层包应用及范例本章对ecology系统的底层工具包进行讲解,开发人员可以从这里学到怎样利用底层的工具包进行开发2.1最基本的继承类系统中每一个java bean 都需要继承 weaver.general.BaseBean 类。

这个类实现了记录日志和获取属性文件值的方法。

继承这两个类的其它类可直接应用这些方法来记录日志,获取属性文件某一个属性的值。

方法的实现见后面的例子。

继承的例子如下:java bean 的继承public class ResourceComInfo extends BaseBean {public void doSomething() { //某一个方法方法的处理………writeLog(s) ; // 写日志}}2.2怎样记录日志继承了weaver.general.BaseBean ,可以直接使用 writeLog方法记录日志信息。

注意这里是使用,而不是调用,因为这个方法是这两个被继承类中的方法。

注意writeLog 方法的使用:/*** 将某个对象写入Log文件* @param obj 被写入的对象*/public void writeLog(Object obj)我们看到,可以被记入日志的是任意一个java对象。

泛微OA-ecology-二次开发实例-开发完整说明.doc

泛微OA-ecology-二次开发实例-开发完整说明.doc

二次开发培训文档一、ECOLOGY系统框架结构1、主要的程序结构EcologyClassbean 存放编译后的CLASS文件js 系统中使用的JA V ASCRIPT和VBSCRIPT脚本Css 系统中JSP页面使用的样式ImagesImages_faceImages_frame 系统中使用的图片的存放目录CrmWorkflow 该功能分文件夹存放每个功能的文件WEB-INFProp 系统配置文件存放Service 系统的接口配置文件的存放二、说明一个JSP页面,一个JA V A程序的基本组成,如何阅读JSP页面1、一个jsp页面通常需要包含什么内容2、如何阅读一个JSP页面由于ECOLOGY系统支持多语言,因此在JSP页面上一般不出现中文,全部使用标签的形式来显示中文:比如:在IE上显示“姓名”那么在JSP页面中将通过<%=SystemEnv.getHtmlLabelName(413,user.getLanguage())%>这样的形式来表示,其中的数字413就是表示姓名,同时可以通过“select labelname from htmllabelinfo where indexid=413 and languageid=7”来获取到“姓名”这个显示名称,其中languageid=7表示中文显示名称,languageid=8表示英文显示名称.delete from HtmlLabelIndex where id=81249delete from HtmlLabelInfo where indexid=81249INSERT INTO HtmlLabelIndex values(81249,'选择范围')INSERT INTO HtmlLabelInfo VALUES(81249,'选择范围',7)INSERT INTO HtmlLabelInfo VALUES(81249,'Range of choice',8)INSERT INTO HtmlLabelInfo VALUES(81249,'選擇範圍',9)3、JA V A程序的基本组成在ECOLOGY中开发JA V A程序建议继承weaver.general. BaseBean,在BaseBean 中主要封装了两个方法:写日志文件,获取配置文件中的参数值。

泛微 ecology 二次开发培训文档

泛微 ecology  二次开发培训文档

二次开发培训文档一、ECOLOGY系统框架结构1、主要的程序结构EcologyClassbean 存放编译后的CLASS文件js 系统中使用的JA V ASCRIPT和VBSCRIPT脚本Css 系统中JSP页面使用的样式ImagesImages_faceImages_frame 系统中使用的图片的存放目录Crm..Workflow 该功能分文件夹存放每个功能的文件WEB-INFProp 系统配置文件存放Service 系统的接口配置文件的存放二、说明一个JSP页面,一个JA V A程序的基本组成,如何阅读JSP页面1、一个jsp页面通常需要包含什么内容2、如何阅读一个系统已有JSP页面由于ECOLOGY系统支持多语言,因此在JSP页面上一般不出现中文,全部使用标签的形式来显示中文:比如:在IE上显示“姓名”那么在JSP页面中将通过<%=SystemEnv.getHtmlLabelName(413,user.getLanguage())%>这样的形式来表示,其中的数字413就是表示姓名,同时可以通过“select labelname from htmllabelinfo where indexid=413 and languageid=7”来获取到“姓名”这个显示名称,其中languageid=7表示中文显示名称,languageid=8表示英文显示名称,languageid=9表示繁体显示名称.3、JA V A程序的基本组成在ECOLOGY中开发JA V A程序建议继承weaver.general. BaseBean,在BaseBean 中主要封装了两个方法:写日志文件,获取配置文件中的参数值。

写日志的方法:writeLog(Object obj) 日志会输出到weaver/ecology/log/ecology 中获取配置文件数据:getPropValue(String fname , String key)比如获取weaver.properties中的DriverClasses的值,代码如下:getPropValue(“weaver”,” DriverClasses”)三、如何添加多语言版本的标签四、页面权限控制的说明这一部分将讲解怎样在页面中引用权限,怎么样新增一个权限,如何在新开发的模块上引入权限控制,1、引用系统中的权限首先从系统的权限设置中找到需要引用的权限名称,如下图找到“表单维护”这个权限,其ID为591,然后通过“select rightdetail from systemrightdetailwhere rightid=591”得到其rightdetail=“FormManage:All”,那么在JSP页面中通过如下语句,就可以使得有“表单维护”这个权限的用户可以查看该页面2、如何新增新的权限如何在新建的功能模块上添加新的权限(JSP页面添加权限控制)第一步:通过类似的sql先添加一个需要的权限在数据库中执行完上面的sql后,在系统权限管理中就可以看到添加的该权限了!注意:以上SQL语句中的id请用负数或者统一使用1000000以上的值(这样可以避免和我们升级可能给出的权限重复),并保证不重复,同时保证SystemRightDetail的字段rightdetail也不能重复,上面插入SystemRightDetail表数据的sql,其中42717目前没有实际意义,但也请不要重复,可以使用一个非常大的数据,比如500000。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二次开发培训文档一、ECOLOGY系统框架结构1、主要的程序结构EcologyClassbean 存放编译后的CLASS文件js 系统中使用的JA V ASCRIPT和VBSCRIPT脚本Css 系统中JSP页面使用的样式ImagesImages_faceImages_frame 系统中使用的图片的存放目录CrmWorkflow 该功能分文件夹存放每个功能的文件WEB-INFProp 系统配置文件存放Service 系统的接口配置文件的存放二、说明一个JSP页面,一个JA V A程序的基本组成,如何阅读JSP页面1、一个jsp页面通常需要包含什么内容2、如何阅读一个JSP页面由于ECOLOGY系统支持多语言,因此在JSP页面上一般不出现中文,全部使用标签的形式来显示中文:比如:在IE上显示“姓名”那么在JSP页面中将通过<%=SystemEnv.getHtmlLabelName(413,user.getLanguage())%>这样的形式来表示,其中的数字413就是表示姓名,同时可以通过“select labelname from htmllabelinfo where indexid=413 and languageid=7”来获取到“姓名”这个显示名称,其中languageid=7表示中文显示名称,languageid=8表示英文显示名称.delete from HtmlLabelIndex where id=81249delete from HtmlLabelInfo where indexid=81249INSERT INTO HtmlLabelIndex values(81249,'选择范围')INSERT INTO HtmlLabelInfo VALUES(81249,'选择范围',7)INSERT INTO HtmlLabelInfo VALUES(81249,'Range of choice',8)INSERT INTO HtmlLabelInfo VALUES(81249,'選擇範圍',9)3、JA V A程序的基本组成在ECOLOGY中开发JA V A程序建议继承weaver.general. BaseBean,在BaseBean 中主要封装了两个方法:写日志文件,获取配置文件中的参数值。

public String getPropValue(String fname , String key)public void writeLog(Object obj)三、页面权限控制的说明,怎样在页面中引用权限,怎么样新增一个权限,如何在新开发的模块上引入权限控制在这一部分将描述:新增的页面如何保持和ECOLOGY的风格保持一致;新增的页面上引用ECOLOGY中的权限;新增的页面上引用新的ECOLOGY中还没有的权限;1、可以根据<泛微协同商务系统(Ecology)_JSP式样编写指南>保证新开发的页面在风格上和原有系统保持一致泛微协同商务系统(Ecology)_JSP式样编写2、引用系统中的权限首先从系统的权限设置中找到需要引用的权限名称,如下如找到“地址类型维护”这个权限,其ID为41,然后通过“select rightdetailfrom systemrightdetail where rightid=41”得到其rightdetail=“AddAddressType:Add”,那么在JSP页面中通过如下语句,就可以使得只有的“地址类型维护”这个权限用的用户可以查看该页面<% if(!HrmUserVarify.checkUserRight("AddAddressType:Add ", user) ) {response.sendRedirect("/notice/noright.jsp");return;}%>3、新增新的权限控制新功能的查看新增功能模块添加权限控制.d o c四、系统的人员组织结构的介绍1、主要数据结构HrmResource(人员基本信息表).doc HrmSubCompany(分部信息表).docHrmDepartment(部门信息表).doc2、如何从缓存中获取人员信息(对三个缓存的简单介绍)五、对流程,文档数据的存放说明(主数据,明细数据,一般信息等在数据库中如何存放,主要为了考虑报表的问题)1、文档的主要数据结构文档信息的主要存储表DOCDETAIL:文档信息存储表,主要存放文档的基本信息DOCDETAILCONTENT: 文档内容存放表(如果是ORACLE数据库,如果文档的类型是HTML文档,那么文档内容存放在该表中,SQLSERVER数据库不用该表)DOCIMAGEFILE:文档,附件关联表,此表记录文档和附件(WORD,EXCEL格式文档在数据库中按照附件格式存放)的关系(即一个文档关联了几个附件)IMAGEFILE:附件路径存放表,此表记录了文档的附件(或者WORD,EXCE)存放在文件服务器上的位置DOCSHARE:文档共享表SHARINNERDOC:文档共享明细表,此表存放了该表具体共享给那些用户了DocDetail.doc ImageFile.doc DocImageFile.doc shareinnerdoc.docDocShare.doc2、流程的主要数据结构这里主要介绍流程的数据存放结构及如果通过流程类型获取到流程的字段信息,流程的载体分为表单和单据两类,表单和单据的区别在于:所有使用表单的流程数据存放在同一个表中,而单据每个单据对应着一张独立的数据表1、表单一、对于表单而言流程的数据信息存放在三个数据表中Workflow_requestbase:该表存放了流程的基本信息:标题,创建人,创建时间,流程类型等等Workflow_form:该表存储了流程的具体信息通过REQUESTID字段和Workflow_requestbase表关联Workflow_formdetail:该表存放了流程的明细信息,同样通过REQUESTID 字段和Workflow_requestbase表关联二、通过流程的类型如何获取该流程使用了Workflow_form和Workflow_formdetail表中哪些字段在Workflow_form和Workflow_formdetail表中存放了大量字段,所有使用表单的流程的字段都在这两个表中,如何获取每个流程使用了那些字段呢?A、找到流程的类型ID,假定为wfidB、找到流程用了哪个表单select formid from workflow_base whereid=wfid and isbill=’0’C、获得该表单用到了哪些主字段:select(select fieldlable from workflow_fieldlable where workflow_fieldlable.fieldid=workflow_formfield.fieldid and langurageid=7andworkflow_fieldlable.formid=workflow_formfield.formid)as name,(select fieldname from workflow_formdictwhere id=fieldid)from workflow_formfield whereformid=上面获取的FORMID and (isdetail is null orisdetail=’’)哪些明细字段:select(select fieldname fromworkflow_formdictdetail where id=fieldid)fromworkflow_formfield where formid=上面获取的FORMID andisdetail=’1’2、单据对于表单而言流程的数据信息存放在三个数据表中Workflow_requestbase:该表存放了流程的基本信息:标题,创建人,创建时间,流程类型等等Workflow_form:该表只存放Workflow_requestbase和单据表之间的关系信息各单据主表:该表存储了流程的具体信息通过REQUESTID字段和Workflow_requestbase表关联,如何获取该表呢:A、找到流程的类型ID,假定为wfidB、找到流程用了哪个单据select formid form workflow_basewhere id=wfid and isbill=’1’C、通过单据ID可以获取到该单据使用的字段Select * from workflow_billfield where billid= formidD、通过单据ID找到其用了那个表存储流程主信息,那个表存储流程明细信息select tablename from workflow_bill where id= formidselect tablename from workflow_billdetailtablewhere id= formid各单据主明细表:该表存放了流程的明细信息,同样通过REQUESTID字段和Workflow_requestbase表关联3、流程的其他信息表结构流程处理人情况表Workflow_currentoperator:此表存储了流程当前未操作者,已操作者等信息workflow_requestlog 流程处理意见表:此表存储了流程处理人处理过的审批意见workflow_requestbase.doc workflow_bill.doc workflow_base.doc workflow_currentoperator.docworkflow_requestLog.doc六、系统已经有可开发的接口的培训1、短信接口可以通过该接口实现其他短信网关或者硬件短信设备进行在OA中发送短信的操作通用短信接口实现方式及使用说明.docsms.xml smsZ中间表.xml2、单点登录接口ECOLOGY提供了通过用户映射和模拟其他系统登录窗体的方式实现多系统之间的单点登录接口Ecology系统接口指南---单点登录篇.doc3、流程节点前后附加操作action接口Ecology系统接口指南--节点附加操作.doc4、自定义浏览按钮Ecology系统接口指南--自定义浏览框.docbrowser.xml datasource.xml5、流程webservice接口new_工作流WebService接口.doc6、7、人力资源webservices接口人力资源WebService接口使用说明.doc8、 文档webservice 接口e-cology文档WebService接口使用说明.七、Html 模式的流程应用HTML模板的应用.doc八、几个常用的底层类的说明最基本的底层类,数据库操作类,上传下载文件,如何构建缓存,基本的工具类Ecology系统底层包开发指南.doc。

相关文档
最新文档