目 录
1. 引言... 4
1.1 项目名称... 4
2. 二次开发... 5
2.1 单据开发... 5
2.1.1 流程说明... 5
2.1.2 参照管理... 6
2.1.3 数据模型... 8
2.1.4 单据格式... 16
2.1.5 数据列表... 31
2.1.6 API函数... 36
2.1.7 常用组合... 40
2.1.8 如何配置数据权限... 41
2.1.9 如何定义按钮权限... 43
2.1.10 如何定义信息门户... 44
2.1.11 如何挂接企业号应用菜单... 48
1. 引言
1.1 平台名称
聚焦云平台
2. 二次开发
2.1 单据开发
单据开发流程图:
2.1.1 流程说明
单据的开发从数据模型开始,通过数据模型生成对应的单据格式,然后通过单据格式的调整及业务逻辑规则的添加完成单据设计之后,通过菜单管理将单据挂接到对应菜单,最终通过菜单权限分配展现给相应的使用人员。
下面逐一对每个环境进行说明。
2.1.2 参照管理
进入方式:
2.1.2.1 定义说明
参照是制单时的帮助选择部件,档案类字段,在单据录入时文本框右侧会显示一个搜索按钮,点击之后会显示出一个选择界面,双击某一行会自动返回选择的结果,如下图
2.1.2.2 定义方式
打开参照管理界面,点击新增按钮,新建一个参照,如下图:
输入说明:
1、 参照类型:唯一区分不同参照的关键字段,不允许有重复,一般的命名方式为:英文缩写+refer,如 deprefer(部门参照)
2、 参照名称:描述当前参照的中文名称描述
3、 查询视图:当前参照的数据来源,视图即为数据库中的“视图”,此处即可以填写表名也可以填写视图名称。
4、 过滤条件:填写方式为 and 条件,选择性填写可以不填,如果填写之后,再打开参照窗口时,都会根据此处的过滤条件限定能够显示的内容。
5、 允许多选:标识在参照窗口中可以选择多条还是只能选一条。
6、 排序字段:参照数据列表的显示顺序,填写方式为:cdepcode desc (按部门编号倒叙)
7、 显示分类:如果选择显示分类,则会在参照窗口左侧显示出类别信息,方便快速查找
8、 分类视图:左侧分类的数据来源,可以填写数据库视图名称或者表名称
9、 树节点编号字段:分类视图中能够体现出级次关系的字段,级次关系示例:一级:01,二级:0101
10、 树节点名称字段:分类视图中显示名称的字段。
11、 关联字段:跟右侧参照数据视图相关联的字段,在点击某一个树形节点的时候会自动根据该字段关联查询显示出右侧的参照数据,如果关联字段不填写,则会按照“树节点编号字段”进行关联检索。
12、 关联单据类型:如果该参照是通过数据模型自动生成的,会自动带入。
参照新增完成之后,在左侧列表中找到新建的参照类型,双击之后在右侧列表中新增参照中的显示字段,如下图
右侧列表中的字段名必须存在于参照定义的数据源中,其他相关信息补充填写即可。
2.1.2.3 注意点
每一个参照显示的字段中,必须有一个主键字段,通过该字段可以唯一关联到参照档案中的一条记录,比如部门档案,包括部门编号和部门名称两个字段,部门编号为该档案的主键,那么该字段在参照管理中定义成一个显示字段,方便在后面的数据模型中关联选择。
2.1.3 数据模型
进入方式:
2.1.3.1 定义说明
数据模型描述了一个单据的所有的字段信息,包括:字段名、字段描述、字段类型、是否为空、是否主键等信息,数据模型是一个单据的基础,数据模型后台会生成对应数据库中的实表以及数据库视图,同时也会生成单据格式。
单据上的字段大体可分为2类:
1:单据自身必须要存储的字段,此类字段在单据保存时,会保存到数据库实表中。
2:通过关联字段关联出来的其他表中的字段,此类字段在单据保存时,只会讲关联字段(外键)保存到单据表中,关联显示的字段不需要存储,会自动根据关联关系自动带出。
2.1.3.2 定义方式
点击“新增模型”按钮,打开如下窗口:
模型编号:唯一标识每一个数据模型的编号,命名方式一般为:模块名称缩写_单据缩写,如so_bill(销售订单,so为销售模块标识,bill为订单的标识)
模型名称:数据模型的中文描述。
数据模型保存之后,在左侧列表中找到刚刚添加的数据模型,双击选择,然后在右侧列表中维护模型字段:
点击“预设字段”按钮,系统会自动添加业务单据所需的字段,如下图
关于预设字段的说明:
ccode:单据编号,如果有自动编号的需求,则该字段必须保留
ctypecode:单据类型,管理单据的编号规则,如果有自动编号需求,该字段也要保留
ccommit:提交人、dcommit:提交日期、cversion:审批版本,此三个字段为审批流相关字段,如果单据需要支持审批流,则此三个字段必须保留。
cvery:审核人,dverydate:审核日期,如果单据支持审核、弃审操作,则此三个字段必须保留。
ccorpcode:公司编号、cmaker:制单人、ddate:单据日期,cposcode:职位编号,这几个字段有选择保留,一般的业务单据都应该保留。
预设字段设置完成之后,继续维护单据上其他的业务字段,通过点击“增行”按钮,添加字段定义。
由于客户应该从客户档案中选择,通过客户编号关联,客户名称根据客户编号从客户档案中自动带出,所以客户编号应该设置成参照类型。
客户编号字段类型选择为“参照”之后,会自动弹出参照关联窗口,如上图,左侧为参照管理中定义的所有的参照类型,双击一行之后,会在中间列表中现实中参照显示的字段,最右侧为单据中的字段,选择一个参照字段,再选中需要带入到单据上的字段,点击”>”就可以完成设定。
通过上图的设定,参照窗口中的客户编号和客户名称会自动带入到单据上的客户编号和客户名称字段上,如下图:
需要注意的是
1、 不同的参照字段要分别进行关联设定,比如单据上既有客户参照又有部门参照,那么需要在部门编号和客户编号字段上分辨设定关联关系。
2、 红框中单独标识出的“关联字段”标识通过单据上的哪个字段跟参照来源的哪个字段关联,一个参照设定中,只能有一个字段是关联字段,如上图:客户编号为关联字段,客户名称为自动带出项。
3、 参照类型:即为参照管理中的参照类型。
4、 参照标识:用以标识一组参照字段的标识,相同参照标识的字段肯定有一个是关联字段,其他都为自动带出字段。
如果需要添加表体字段,则需要将“是否表头”改为否,如下图:
添加的每一个字段都需要设定好相应的字段类型及字段的长度、小数位数等信息,所有字段添加完成之后,接着维护“表名”列,首先在表头的一个字段上输入主表名称,如so_billm,在表体的一个字段上输入子表名称,如so_billc
一个字段输入表名之后,系统根据字段的设定规则,会自动填写其他字段的表名,如上图。
需要注意的是:客户名称为参照带入字段,但是为非关联自动,系统在自动填写表名时,会自动留空,留空的表名,后台的单据表中不会存储该字段的值,只会通过跟客户表进行关联显示。
以上字段全部定义完成之后,点击“保存”按钮,完成单据格式的最终保存。
同步数据结构
同步的时候后台都做了些什么?
1、 生成数据库实表:so_billm和so_billc
主表的主键为:id,子表跟主表关联的外键为:子表名_id
2、 生成主表视图和子表视图,视图中会分别根据参照定义的关联关系生成关联查询语句。
vi_so_billm:主表视图
vi_so_billc:子表视图
vi_so_billmlist:主表和子表关联之后的整个视图
3、 生成单据格式
点击单据格式,就可以进入对应生成的格式定义中,格式定义详见“单据格式”说明章节。
2.1.3.3 字段说明
是否表头:主表选是,从表选否
表名:对应数据库实表的表名,数据模型会根据定义的表名自动创建数据库表
字段名:数据库表中的字段名称,同一个数据模型的字段名不允许有重复
描述:字段的中文说明
分组描述:子表字段有效,分组描述为复合表头的上层名称。
Tab标签:Tab页签显示的名称,表头可以支持多Tab页,相同名称的字段显示在一个Tab页中,每一个表体有且只能有一个Tab页。
Tab顺序号,如果单据支持多表体,通过此字段来标识表体的显示顺序。
字段类型:字段的类型
小数位数:如果数字型字段,则在此处维护小数位数。
枚举值:如果字段是枚举型,则在这里维护枚举显示内容,格式为:{code:’1’,name:’是’},{code:’0’,name:’否’},表示显示是否两个枚举值。
默认值:单据录入时的默认值,支持系统级变量的默认,详见默认值的下拉列表。
主键:针对主表字段有效,可以设定多个字段为主键,单据保存时会进行重复性检查。
是否锁定:表示该字段在录入时是否是只读状态,一般参照时关联带入的字段为锁定字段,该字段只会在第一次同步数据结构的时候会关联更新单据格式,后续不起作用。
允许为空:是否可以留空,该字段只会在第一次同步数据结构的时候会关联更新单据格式,后续不起作用
2.1.4 单据格式
进入方式:
两种进入选择:
方式一 通过数据模型进入
方式二 通过单据格式进入
2.1.4.1 定义说明
单据格式包括两大类:业务单据格式、OA单据格式
业务单据格式:适合于定义业务管理类的单据,比如ERP相关的单据,侧重于业务管理概念,其布局模式为满屏布局。如下图:
OA单据格式:类似于纸质的手工单据,布局格式比较灵活,侧重于OA系统的单据概念,其布局模式为自上而下的流布局,如果高度超出浏览器显示高度,会产生纵向滚动条。如下图:
二者的功能性方面是一致的。
2.1.4.2 业务单据格式布局特点
单据格式来源于数据模型,数据模型创建完成之后,点击“同步数据结构”之后,然后点击“单据格式”,就会打开单据格式定义窗口:
业务单据格式默认为三列布局,即表头每行显示三个字段。字段的顺序通过鼠标的拖拽可以实现。
如果要修改成四列布局,则需要点击“修改定义”按钮,打开的窗口中修改下即可,如下图:
下面内容还是以三列布局为例
如何使一行显示2个字段,比如单据编号和客户编号显示在一行,客户名称显示在第二行?
鼠标点击“客户编号”文本框,然后在右侧字段属性中,将列宽度改为2即可,如下图:
如何调整表体列宽及列显示顺序和是否显示?
1、 列宽调整,鼠标在列边线直接拖拽即可。
2、 调整列顺序,鼠标点击一列,然后拖拽即可。
3、 设置列是否显示,如下图:
单据格式调整完之后,点击“格式保存”按钮,即完成格式的保存操作。
2.1.4.3 OA单据格式布局特点
OA单据格式整个页面为12等分,也就是说一行最多能放12个字段,通过修改字段的列跨度来达到修改每行显示字段个数的目的:
比如我们将每个字段的列跨度设置为3,则一行显示4个字段。
如何让一个字段独占两行?
修改字段的行跨度属性,比如单据编号行跨度改为2,效果如下:
这样通过行跨度和列跨度的组合,可以变化出多种格式的单据。
什么是标签?
标签是OA单据格式特有的一个元素,其作用类似于一个Label控件,用以进行一些说明性的内容显示,新增标签方式如下:
保存之后,标签就会显示在单据格式中,如下图:
标签同样是通过行列跨度的设定来跟文本框组合显示,如下图:
说明:
OA单据格式一般遵循从左到右,自上而下一次进行布局调整的规则。这样能够快速定制出符合预期的单据格式。
2.1.4.4 单据格式通用设定
2.1.4.4.1 单据按钮
1、单据格式生成之后,平台会自动生成默认的一系列按钮,按需删除掉用不到的按钮,如下图:
2、新增自定义按钮
点击“新增”之后,打开如下窗口:
输入按钮ID及按钮名称之后,完成自定义按钮的新增。
4、 按钮的事件在哪里添加?
点击“事件”按钮,打开事件编写窗口
如果系统预置好的按钮,在事件窗口中会有预定好的事件代码,如上图。
通过按钮可以执行几乎任何想要做的操作,比如获取单据的字段值,更新单据字段值、打开其他功能窗口、执行后台数据库命令、设置单据字段的隐藏显示等等。
详见API函数说明。
2.1.4.4.2 引用字段
所谓的引用字段,只有表头字段支持引用字段。
字段设置为引用字段之后,字段文本框的Label标签会变成一个超链接,点击Label标签,可以进行单据的联查等相关功能,如下图:
鼠标点击“客户编号”标签,会打开代码编写窗口:
事件代码参考“API说明”
2.1.4.4.3 单据事件
单据支持的事件如下图所示:
事件说明:
1、 离开焦点时
作用域:表头表体所有的字段值变更,都会统一进入到此事件中
写法:if(sendor.name == “小写字段名”){处理逻辑…}
2、 单元格点击事件
作用域:表体的单元格点击时触发
使用场景:点击表体一行,表头显示当前行存货对应的现存量
写法:通过表体取值,表头赋值的API函数就可以完成。
3、 增行前
作用域:表体“增行”按钮点击时触发
使用场景:某些情况下,不允许手工新增行时用到。
写法:if(条件成立){addRow();}
4、 删行前
作用域:表体“删行”按钮点击时触发
使用场景:某些情况下,不允许手工新删行时用到。
写法:if(条件成立){delRow();}
5、 参照前
作用域:参照窗口打开前触发
使用场景:根据不同的人员,显示不同的参照内容,比如不同业务员看到不同的客户信息,这样的话需要在参照前增加限定条件。
写法:
//如果参照标识是ylbatch
if(sendor.refflag == "ylbatch"){
//预定义参照窗口查询条件
filter.where = " and 参照数据源字段名='参数值'";
}
“参照标识”:即数据模型中的参照标识。
6、 参照后
作用域:参照窗口关闭后触发
使用场景:表头客户参照后,表体自动该出该客户的上次订货信息。
写法:
//存货参照后,根据换算率计算件数为例
if(sendor.refflag == "invrefer"){
if(currecord.get("iinvrate") != "" &&currecord.get("iquantity")!= "")
currecord.set("iweight",currecord.get("iinvrate")*currecord.get("iquantity"));
}
}
7、 审批前
作用域:支持审批流的单据,在每个节点人员点击“审批通过”按钮之前触发
使用场景:审批前必须补录单据的相关信息,如果录入不完整,则不允许点审批按钮。
写法:if(条件不通过){return false;}
8、 单据格式加载后
作用域:单据显示格式加载成功后触发,只会在单据第一次打开时触发。
使用场景:单据打开后自动执行“新增”动作。
9、 单据数据加载后
作用域:每次加载单据数据后触发,比如点击上张、下张、首张、末张按钮或者联查单据数据显示后。
10、 单据公共函数
所谓公共函数,指的是在这里面可以定义一个函数,其他的事件里面可以直接调用。
11、 按钮状态机
作用域:当点击一个按钮时,其他按钮的关联状态控制
使用场景:如果新增一个自定义按钮,需要在点击“新增”按钮后,置为可用
写法:
//如果“取消提交”按钮点击时,将“编辑”按钮置为可用
if(sendor.id == "bt_uncommit"){
if(bt.id == "bt_edit"){
bt.setDisabled(false);
}
}
2.1.4.4.4 外接构件支持
所谓的构件,指的是单据在服务器端进行关键点处理时,公开的支持加入自定义逻辑处理的接口,构件通过C#代码进行编写,构件中跟接口所处的事件共享同一个事物。
支持构件的接口位置包括如下几种:
单据保存前、保存后、(审核、弃审、删除)按钮点击前、点击后、节点审批后、提交审批前、审批通过
定义步骤:
1、 新建一个.net类库
2、 添加平台dll引用
3、 新建一个cs文件
4、 实现接口BSFrameSolution.Common.IVoucherApprovalPassed
5、 实现业务逻辑
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AoyaInterface
{
public class test:BSFrameSolution.Common.IVoucherApprovalPassed
{
/// <summary>
///
/// </summary>
/// <param name="voucherno">单据类型</param>
/// <param name="voucherid">单据ID</param>
/// <param name="flowversion">审批版本</param>
/// <param name="strstate">状态:通过、驳回</param>
public void VoucherApprovalPassed(string voucherno, string voucherid, string flowversion, string strstate)
{
//初始化数据库组件
Seejee.DataCommon.DACommand cmd = new Seejee.DataCommon.DACommand();
cmd.CommandText = "Sq语句";
cmd.ExeNonQuery();//执行语句
//如果阻止审批继续进行,则通过如下方式抛出异常,前台会提示出来。
throw new Exception("异常信息描述");
}
}
}
6、 接口注册
打开“构件注册”功能。
构件注册窗口:
“类名”:需要填写自定义类的全名: 命名空间.类名
“程序集名称”:编译生成的dll程序集名称。
7、 发布构件
将编译好的dll构件拷贝到 平台根目录/bin 文件夹下面,至此全部完成。
8、 效果
接口代码:
这几种构件分别对应有对应的存储过程定义支持,比如如果只是在构件中进行数据库层面的数据处理,那么可以直接挂接一个存储过程而不用定义一个构件,存储过程的挂接如下图:
2.2 数据列表
什么是数据列表?
数据列表就是通过普通二维表行列的形式展现数据库数据的方式。
2.2.1.1 进入方式
2.2.1.2 定义方式
录入项说明:
列表编号:唯一区分不同数据列表的标识符,一般命名方式为:模块名_业务名_list
列表名称:列表中文说明
单页条数:每一页显示的记录数
允许选择:是否运行在列表最左侧列出现复选框
隐藏查看按钮:是否隐藏列表最左侧的按钮列。
查询视图:列表的数据源,此处可填写数据库一个自定义的视图名称
查询存储过程:列表的数据源,可以通过一个存储作为一个数据源
排序字段:sql语句的排序部分(只针对视图数据源有效),写法: 字段1 asc,字段2 desc
默认查询条件:列表第一次打开时会自动加载默认查询条件。
固定查询条件:列表每次查询都会加载该条件,多用于权限的控制。
列表保存后,左侧列表中找到对应的列表双击,在右侧添加列表显示字段,如下图
右侧列表中每一行的“字段名”应该填写数据源中存在的字段。
列表查询条件定义
在右侧列表中点击“过滤设置”页签,打开条件定义界面,如下图
录入项说明:
查询编号:唯一标识每个查询条件的编号,命名方式为:f01 f02 f03 ….
字段名:选择查询结果中的列
字段类型:文本、数字、日期、枚举、参照
比较方式:下拉选择
数字格式:下拉选择
顺序号:标识查询条件的显示先后顺序。
参照标识:如果查询条件的类型为“参照”,则需要在参照标识中进行参照对象的选择。
说明:如果列表数据源为存储过程,则“字段名”处应填写存储过程的参数名(不带@号)
右键菜单定义:
如下图,为右键菜单效果
通过右键菜单,可以关联打开其他相应的动作。
定义方式:
按钮ID:按钮唯一标识,命名方式:bt_按钮缩写
按钮名称:按钮中文描述
序号:标识按钮先后顺序。
按钮事件添加:
事件写法:
if(sendor.id=="按钮ID"){
逻辑处理…
}
2.2.1.3 列表事件
1、双击行事件:
作用域:鼠标双击行的时候触发
使用场景:通过列表联查单据,双击行时,打开单据窗口
代码:
record 为当前行数据对象,record.get(“小写字段名”) 或获取值,record.set(“小写字段名”,“值”) 为给某个字段赋值。
2、列绑定事件
作用域:当每个单元格显示数据的时候触发
使用场景:当某个单元格的值在不同的区间显示不同的背景色
参数说明:value(单元格值),cell(当前单元格,通过对单元格值的判断,返回不同的带css格式的字符串或者给cell.css赋值来达到修改单元格样式的目的),record: 当前行记录[record.get("字段名")],field:当前列名
代码:
if(value==0){
//修改单元格颜色[如果当前单元格值>100,则显示红色]
//if(value*1>100){ cell.style='margin: 0px; padding: 0px; background-color: red;';}
//修改单元格样式
//cell.css="自定义样式";
//返回格式化内容
//return "<span style='color:#FFF;font-weight:bold;'>value</span>";
}
2.3 API函数
2.3.1.1 获取表头数据getHeadRecord(单据类)
var rdm = getHeadRecord();
rdm.get(“小写字段名”) :获取表头字段
2.3.1.2 表头赋值 setHeadValue(单据类)
var rdm = getHeadRecord();
rdm.set(“小写字段名”,”值”); 给某一个字段赋值
setHeadValue(rdm);将数据绑定回表头
2.3.1.3 获取表体数据(单据类)
currecord:表体当前选中行数据对象
currecord.get(“小写字段名”); 获取某列值
2.3.1.4 表体当前行赋值(单据类)
currecord.set(“小写字段名”,”值”);
2.3.1.5 获取表体行数并循环表体(单据类)
var icount = bodys0.getCount();
for(var i=0;i<icount;i++){
var rd = bodys0.getAt(i);//获取第i行数据对象
var strcode = rd.get(“小写字段名”);获取某个字段值
rd.set(“小写字段名”,”值”);给第i行字段赋值
}
bodys0表示第1个表体数据集
bodys1表示第2个表体数据集
2.3.1.6 获取单据ID(单据类)
var strid = voucher.keyid
2.3.1.7 获取单据状态(单据类)
//browse:浏览状态;add:新增状态;edit:修改状态
voucher.vostate
2.3.1.8 锁定整个表头
setHeadFieldDisabled(true)
2.3.1.9 设置表头字段只读
setHeadReadOnly(["小写字段名1","小写字段名2"],true/false)
2.3.1.10 设置表体字段只读
setBodyReadOnly(["小写字段名1","小写字段名2"],true/false)
2.3.1.11 获取登录信息
loginInfo.loginMonth;//登陆月份
loginInfo.loginCode;//登陆用户编号
loginInfo.loginName;//登陆用户姓名
loginInfo.CorpCode;//登陆用户公司编号
loginInfo.CorpName;//登陆用户公司名称
loginInfo.DepCode;//登陆用户部门编号
loginInfo.DepName;//登陆用户部门名称
loginInfo.loginDate;//登陆日期
loginInfo.PosCode;//职位编号
loginInfo.PosName;//职位名称
2.3.1.12 在门户中打开功能
addTab("地址","标题","功能编号","参数")
“参数”写法:参数名1=值&参数名2=值…
2.3.1.13 打开内置弹出窗口
openUserWindow({title:'标题',url:'页面地址',width:宽度,height:高度});
2.3.1.14 设置表头字段隐藏/显示(单据类)
setHeadVisible(["小写字段1","小写字段2"],true/false)
2.3.1.15 设置表体字段隐藏/显示(单据类)
setColumnVisible(表体序号,["小写字段1","小写字段2"],true/false)
2.3.1.16 获取大写金额
upDigit(数字);
2.3.1.17 获取页面地址参数
getQueryString("参数名称");
2.3.1.18 表体增行(单据类)
addRow();
2.3.1.19 表体删行(单据类)
delRow();
2.3.1.20 获取格式化日期
getDate("日期"); 输出结果:2016/10/06
2.3.1.21 从后台获取查询结果
getDataBySql("字段1,字段2,字段3"," select 字段1,字段2,字段3 from 表 where 条件 ",function(rds){
for(var i=0;i<rds.length;i++){
var 字段1值= rds[i].get("字段1");
var 字段2值= rds[i].get("字段2");
var 字段3值= rds[i].get("字段3");
}
})
2.3.1.22 执行sql语句
runSql("sql语句",function(result){
if(result==""){
alert("执行成功!");
}else{
alert(result);
}
})
2.3.1.23 获取日期+天数之后的日期
//基于一个日期,计算n天之后的日期
addDay("日期(格式:年/月/日)",天数);
2.3.1.24 获取日期+月数之后的日期
//基于一个日期,计算n个月之后的日期
addMonth("日期(格式:年/月/日)",月数);
2.3.1.25 获取两个日期之间的间隔天数
//获取两个日期的间隔天数
dateDiff("起始日期(格式:年/月/日)","截止日期(格式:年/月/日)");
2.3.1.26 获取两个日期之间的间隔月数和天数
//返回值格式:[totalMonth, idays]
getDiffMonthDay("起始日期(格式:年/月/日)","截止日期(格式:年/月/日)");
2.3.1.27 获取地理位置(移动端)
getLocation(function(latitude,longitude,speed,accuracy,addr){})
2.3.1.28 通过前台调用后台类方法
reflect('程序集名称','类全名','方法名','参数(多个参数逗号分开)',function(result){})
2.3.1.29 设置列表查询条件
addListLockFilter ("查询条件")
一般用于联查某个列表时使用,如在客户列表中联查该客户的订单列表,双击某一个客户打开订单列表时,需要只显示该客户的订单
示例:
openUserWindow({title:’客户订单',url:'VoucherList.aspx?listcode=ts_prodinlist&'+ addListLockFilter ("and ccuscode=’0101’")
,width:800,height:600});
2.3.1.30 扫描二维码(移动端)
getScan(function(result){})
2.3.2 常用组合
2.3.2.1 单据参照
场景:表头某个字段输入之后,自动将相关数据带入到表体
getDataBySql("字段1,字段2,字段3"," select 字段1,字段2,字段3 from 表 where "+条件,function(rd){ //先根据表头录入的值从后台查询到结果集
bodys0.removeAll(true);//清除第一个表体的所有行
var arr = new Array();
for(var i=0;i<rd.length;i++){
var currd = voucher.newRow(0);//新增一行,0代表第一个表体
//如果必录项都赋值了,则flag置为1,否则置为2
currd.set("flag","1");
currd.set("cinvcode",rd[i].get("字段1"));
arr[i]=currd;//当前行赋值
}
bodys0.add(arr);//将行添加到表体数据集中
refreshBody();//刷新表体
}
2.3.2.2 字段值变更验证(单据类)
以表体为例,当前行输入单价,计算金额
if(sendor.name == "iprice" ){ //如果价格字段发生变化
if(currecord.get("iquantity") != null && currecord.get("iprice ") != null){//判断空值
//金额赋值
currecord.set("imoney", currecord.get("iprice ") *currecord.get("iquantity "));
}
}
2.3.3 如何配置数据权限
数据权限配置包括如下两步:
1、 权限设置
2、 权限分配
步骤一:在参照管理中,选择一个需要控制权限的档案,如部门档案
步骤二,点击“权限控制”,打开权限控制窗口
权限控制方式分为:按人员和按用户组,如果选择按人员,则在后面的权限分配时,需要选择具体的人赋权限,反之,按照用户组赋权限。
“单据类型”为参照,单据类型为定义的单据、列表、参照 对应的类型编号,选入则会控制,否则不进行权限控制。
“字段名”为跟业务表中对应参照档案表的外键字段。
以上设置完成之后,保存即可。
如何分配权限
2.4 如何定义按钮权限
按钮权限指的是业务单据上每一个按钮指定有权限的人可用。
如果当前登录人无按钮权限,则打开单据时,此按钮为不可用状态。
2.4.1.1 定义需要控制权限的按钮:
如下图:先选择一个单据,点击“确定”之后,刷新出该单据所有的按钮,然后选择哪个按钮需要控制权限,选择完之后,点击“保存”即完成按钮的定义。
2.4.1.2 如何给人员分配按钮权限?
功能权限分配完成之后,支持全部工作完成,操作员进入对应的单据之后,无权限的按钮就会始终灰色显示。
2.5 如何定义信息门户
什么是信息门户
信息门户是指综合展示多种指标的页面,包括图表+列表的综合展示
示例
通过上面查询条件,点击确定按钮,统一刷新面板中所有指标。
应用场景:围绕客户或者供应商等某个实体的360度综合展示,比如选择一个客户,下面通过多种指标展示该客户的相关情况。
定义过程:
1、 条件定义
在表bs_filter中定义条件
本示例增加了一个编号为c1的查询条件。
2、 图表定义规则
图表定义遵循常规的定义方式,需要注意的地方在定义图表的查询语句,如下:
select 字段 from 表名 where 字段名='@查询编号@' group by copercode
3、 列表定义规则
门户页面中,列表的接入也是通过列表定义来定义出列表的格式,步骤如下;
1、 定义列表 在列表定义中进行定义。
2、 定义标签 将定义的列表关联到标签,如下图
3、 将列表标签布局到页面当中
说明:
如何让列表支持信息门户页面的查询参数?
只需要在列表定义中修改下默认查询条件即可,如下图:
4、 将定义好的图形和列表标签部署到一个页面上,就可以实现综合查询了。
知识点:
如果联查打开信息门户,并传入查询条件,可以在地址栏写上条件,格式如下:
MsgCenter/MsgDisplay.aspx?type=页面编号&查询编号=值
示例:
http://localhost/his/MsgCenter/MsgDisplay.aspx?type=03&s001=2015-07-22001
打开界面如下:
2.6 如何挂接企业号应用菜单
首先进入企业号菜单定义,选择一个应用,单击进入后,显示菜单定义界面。
2.6.1.1 如何设置菜单?
2.6.1.1.1 单击菜单挂接:
格式:https://open.weixin.qq.com/connect/oauth2/authorize?appid=CorpID&redirect_uri=跳转地址&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
跳转地址原始值:
单据:http://域名/wx/transfer.aspx?type=vo&vo=单据类型ID
列表:http://域名/wx/transfer.aspx?type=list&vo=单据类型ID&listcode=列表类型ID
2.6.1.1.2 通过encodeURIComponent() 函数对原始地址进行加密得到类似如下结果
http%3A%2F%2Fjnmdzz.com%2Fcorp%2Fwx%2Ftransfer.aspx%3Ftype%3Dvo%26vo%3Dnx_xsgl
将加密后的地址串接到微信菜单格式里面去
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx86351669365da179&redirect_uri=http%3A%2F%2Fjnmdzz.com%2Fcorp%2Fwx%2Ftransfer.aspx%3Ftype%3Dvo%26vo%3Dnx_xsgl&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
将菜单地址定义到企业号菜单里面去
2.7 调用web服务生成平台单据
外部系统如果需要生成平台中的相应单据,则可以调用web服务直接生成,通过web服务的方式支持保存动作时挂接的构件调用以及存储过程调用。
2.7.1.1 Web服务引用地址
步骤:
1、 在.net项目中添加服务引用,如下图
2.7.1.2 用法说明及示例
2.7.1.3 本服务中有2个方法,分别是CommitVoucher和SaveVoucher
1)SaveVoucher:单据保存,参数 string cvoucherno,DataTable dthead,DataTable[] arrBody
cvoucherno:单据类型
dthead:表头数据集
arrBody:表体数据集数组(多表体)
示例:
//saop:用户验证信息,用户名和密码对应平台的用户和密码
DtsSrv.MySoapHeader soap = new DtsSrv.MySoapHeader();
soap.UserName = "admin";
soap.PassWord = "123";
//实例化web服务代理类dts
DtsSrv.DTSSoapClient dts = new DtsSrv.DTSSoapClient();
cmd.CommandText = "select * from lj_somain where 1=2 ";
DataTable dtm = cmd.ReturnDataSet().Tables[0];
//dtm 为获取到平台单据表头的数据结构
dtm.TableName = "lj_somain";
//TableName必须赋值,其值就是表头的表名
cmd.CommandText = "select * from ljO_SODetails where 1=2";
DataTable dtc = cmd.ReturnDataSet().Tables[0];
//dtc为获取到平台单据表体的数据结构,
dtc.TableName = "ljO_SODetails";
//TableName必须赋值,其值就是表体的表名
DataRow mrow = dtm.NewRow();//表头增加一行
mrow[“字段名”] = "值";
…
mrow["ctypecode"] = "00126";//单据类型编号必须赋值(数据模型里面的编号),否则单据编号无法形成
dtm.Rows.Add(mrow);
//表体增行赋值
foreach (DataRow row in ufdtc.Rows) {
DataRow brow = dtc.NewRow();
for (int i = 0; i < ufdtc.Columns.Count; i++)
{
string strcolname = ufdtc.Columns[i].ColumnName;
brow[strcolname] = ufdtc.Rows[0][strcolname];
}
ufdtc.Rows.Add(brow);
}
//最后调用saveVoucher方法,生成单据,注意第一个参数必须是上面定义的soap
DtsSrv.Result ret = dts.SaveVoucher(soap,"lj_sobill", dtm, new DataTable[] { dtc });
Ret的返回值有三个:ret.ID(生成的单据ID)和ret.Msg(出错信息)、ret.Success(true/false 是否成功)
2)CommitVoucher:提交单据,参数 keyed:单据ID,voucherno:单据类型
示例
//saop:用户验证信息,用户名和密码对应平台的用户和密码
DtsSrv.MySoapHeader soap = new DtsSrv.MySoapHeader();
soap.UserName = "admin";
soap.PassWord = "123";
//实例化web服务代理类dts
DtsSrv.DTSSoapClient dts = new DtsSrv.DTSSoapClient();
DtsSrv.Result ret = dts.CommitVoucher(soap,”53cc26a5-5f03-4fa0-a5d8-b0f19a166f1b”, "lj_sobill");
注意,这里面的提交人即为soap中的UserName
Ret的返回值有三个:ret.ID(生成的单据ID)和ret.Msg(出错信息)、ret.Success(true/false 是否成功)