•  

     

     

    平台开发手册

     

    多组织设置

    多组织概述

    多组织是指从不同业务管控纬度划分的不同的组织类型,比如采购组织、库存组织、销售组织等,不同的组织类型代表不同的统计和汇报纬度,最终形成一个矩阵式多维管控体系,简单理解可以将一个业务模块理解为一个组织类型,比如集中采购,集团层面建立一个"集采中心"组织,各分子公司下面分别建有采购部,但是所有分子公司的采购部归属于“集采中心”直接管控,如下图:

    主视图:

    image-20230308154742649

    采购组织视图:

    image-20230308154835538

     

     

    平台的组织机构搭建时,主视图通过行政纬度进行显示,但是并不是展示的所有组织都是行政组织,可以分别切换不同的业务组织纬度显示组织架构。

    数据权限划分

    数据权限的控制按照业务组织纬度管控,即平台提供按照业务组织进行数据隔离的控制,比如采购业务中的所有数据,只有采购组织中的人员才可以看到。

    1、权限分配,在操作员维护中,可以指定所属组织及部门,同时可以设置可见范围,包括:当前组织、下级组织、当前部门、下级部门,凡是具有该组织或部门权限的人,都可以看到相应组织下的业务数据。

    image-20230308160045809

     

    2、数据权限控制

    a、数据模型:原则上来讲,所有业务单据,都有一个唯一所属的业务组织,在数据模型预置默认字段时,会默认增加 组织类型字段(注意需要指定默认组织编号,同时该字段应该是只读属性),在数据模型设计窗口选择“业务权限控制”选项,如果不勾选该选项,同时指定控制方式:按部门或按组织,则不进行数据权限控制,该设置在单据点上张、下张、前张、后张切换的时候有效。

    b、数据列表:在数据列表定义中设定,需指定列表对应的组织编号字段、部门编号字段等属性

    image-20230308160711826

    c、参照管理,在参照管理中设定,需指定列表对应的组织编号字段、部门编号字段等属性

    image-20230308160826982

    d、自定义报表中使用方式

    如果自己组织sql语句来查询形成一些个性化报表,可以直接通过联查权限表的方式进行控制,权限表说明如下:

    bs_userauthm(权限主表)

    字段名字段描述说明
    cusercode用户编号实际的操作员编号
    corgtype组织类型比如采购组织编号或库存组织编号
    cauthtype控制类型dep:部门权限 org 组织权限

    bs_userauthc(权限子表)

    字段名字段描述说明
    bs_userauthc_id关联主表外键 
    corgid组织/部门ID 
    corgcode组织/部门编号 

     

    组织权限重计算

    重新计算所有人的组织权限,一般在组织机构发生调整后进行重计算

     

    Form设计

    Form窗体的数据存储位置

    form窗体中,所有数据主要存储在如下几个变量中:

    1、this.form.data:存储单据的表头、表体数据,数据列表数据

    2、this.form.remotedata: 存储Ajax类型数据集、脚本类型数据集、自定义查询数据集

    3、this.form.filterdata: 存储查询条件数据(控件属性中,选中“查询条件”项的控件数据)

    4、this.form.formpara: 存储地址参数信息、传入的窗体变量信息以及其他窗体自动生成的临时数据

    5、this.form.voucherinfo:单据的相关元数据信息

    Form全局变量容器

    全局变量适用于存储不同方法或事件中共享的数据

    使用全局变量需要注意在form数据切换的时候状态恢复,如表单前张后张切换的时候,应该将全局变量清空或者重新初始化,放置发生计算混乱。

     

    全局数据精度设定说明

    数据精度定义位置: 控制面板 -- 系统设置 -- 精度定义,精度定义中可以自定义比如数量、单价、金额等相关数字类型的数据精度。

    如何使用精度定义:

    1、数据模型定义中,有“精度类型”列,如果字段为数字类型,从该列下拉项中可以选择已经定义好的数据精度,选择后“小数位数”列会自动带出对应的精度值

    image-20240312093309732

    2、在窗体函数中,可以通过函数 this.form.getPrecision("精度符号") 获取到对应精度值,可通过 this.formatNumber(数值,精度) 实现四舍五入。

    示例

     

    注意点:

    1、精度定义保存时,系统会自动更新“数据模型”中该精度对应所有字段的“小数位数”值

    2、窗体中表头字段如果绑定的为数据模型中的数字类型字段,其精度会强制跟数据模型精度保持一致,前端设置无效

    3、表格数据源如果为数据模型或者数据列表,其数字类型的精度也会强制跟数据模型保持一致,前端修改无效

    打开新的Form弹窗

    参数说明必填默认值
    name窗体FormID
    type类型 form(form窗体)或者portal(数据中心)form
    fullscreen是否全屏false
    appwindowapp中打开新的app窗口,而不是div弹窗,子窗体通过 this.form.callParent 函数来调用父窗体方法false
    title窗体标题
    width百分比或者实际宽度(如500px)
    height实际高度,如500px
    reload是否重新加载(如果重复打开同一个窗体,只有第一次才会初始化弹窗,后续再打开默认显示上一次打开的结果,如果需要重新初始化,则需要将此参数置为truefalse
    id新窗口id,窗口唯一标识,如果id为一个已有值,则会打开之前窗口
    para传递参数,新窗体中通过 [this.form.formpara.参数名] 来访问,
    其中filter参数为系统预制参数,可以根据需要使用,起作用是在窗口加载数据时,设定表格数据源的查询条件,格式为:{表格1名称:{lock:’’,f1:’’},表格2名称:{lock:’’,f1:’’}},lock代表固定条件,f1代表列表定义中定义的查询条件编号
    filter参数应用场景:
    1、参照窗口打开前传入一段查询条件
    2、弹窗打开列表显示时,传入一段查询条件或者给查询条件初始化一个默认值。
    {}
    closed窗口关闭后事件{}
    beforeClose窗口关闭前事件{}
    src如果打开的为非Vue页面,直接传入相对或完整网址,弹窗中将以内嵌iframe形式显示页面内容  

     

    关闭的Form窗体弹窗

    参数说明必填默认值
    id窗体ID

    打开侧边滑动窗口

    参数说明必填默认值
    name窗体FormID
    type打开类型:form(form窗体)或者portal(数据中心)form
    direction打开的方向 rtl / ltr / ttb / btt
    size百分比或者实际宽度(如500)
    modal是否需要遮罩层
    reload是否重新加载(如果重复打开同一个窗体,只有第一次才会初始化弹窗,后续再打开默认显示上一次打开的结果,如果需要重新初始化,则需要将此参数置为truefalse
    showheader显示标题
    showclose显示关闭按钮{}
    autoclose点击空白处自动关闭{}
    beforeClose窗口关闭前事件{}

     

    关闭侧边栏窗口

    打开/关闭浮动显示块

    窗体中需具有显示块容器,并且显示块容器属性中 指定了“弹出方式”

    image-20240701112603828image-20240701112627303

     

    子窗体调用父窗体方法

    子窗体是指通过弹窗打开的窗体,如果子窗体需要调用父窗体函数,使用 this.form.callParent(method,params)

    注意:为了降低窗体间的耦合,建议使用此方法,这个方法在APP原生和H5中都可以使用,而不是直接使用this.form.parent.方法名 来调用

    参数说明:

    参数必填说明
    method父窗体方法名称
    params方法参数,数组或者单独一个值,详见下方说明

    params详细说明:

    1、直接写为数组,这是比较通用的做法,如果父窗体方法为多个参数,比如有两个参数:code,name ; 那么params可写为 ["001","张三"]或者 ["001",{name:"张三"}],具体数组中每一项需要用什么类型,根据父窗体方法类型来匹配

    2、如果父窗体方法只有一个参数,可以直接用一个值代替,比如父窗体需要一个字符串参数code,那么params直接写“001”也可以

    示例

     

    获取弹出/侧边栏窗体Form对象

    参数说明必填默认值
    name窗体ID

    通过myform.data来访问弹出窗口中的数据集合

    注意:本函数必须在父窗体才能够获得

    APP原生应用无效

    打开参照窗口

    APP原生无效

    formpara参数说明

    参数说明必填默认值
    bhead是否表头字段 
    reffield参照返回字段集合,如[“cdepcode”,”cdepname“”]false
    retfield回写字段集合,即表头需要参照回写的字段,如 [“depcode”,”depname”],跟reffield中的字段需要一一对应 
    filter参照前需要传入的查询条件,如 filer:{“oa_depgrid”:{lock:”and cdepcode=‘01’”,default:“”}},lock表示固定条件,参照窗口中自定义过滤时都会自动带入lock条件,default为第一次加载数据的默认条件,参照窗口中二次过滤时会失效 

    窗体参数对象FormPara

    获取当前页面地址参数集合:this.form.formpara.urlquery ,如 show?formid=123&code=001,分别通过this.form.formpara.urlquery.formid 和 this.form.formpara.urlquery.code 来获取两个参数值

    重要更新:所有地址栏参数都可以通过 this.form.formpara[参数名]来获取

    获取showDialog方式传递参数集合:参考showDialog中的formpara结构

    打开业务流程视图

    参数说明:

    参数说明允许空
    flowcode流程编号
    key单据ID是,为空时默认取当前单据的ID(当前窗体需为单据窗体有效)
    voucherno数据模型编号是,为空时默认取当前单据的数据模型变化(当前窗体需为单据窗体有效)
    formid窗体ID是,为空时默认取当前窗体的formid(当前窗体需为单据窗体有效)

    系统会按照 voucherno和formid从流程图中寻找入口节点,如果找不到入口节点会报错

     

    批量导入Excel

    APP原生无效

    参数说明

    参数说明必填默认值
    flag匹配标识,比如按照客户编号标识excel字段和单据字段的对应关系 
    vo单据类型 
    pagesize单页条数50

    导入完成后,数据自动保存至数据库

     

    表体数据导入

    APP原生无效

    导入完成后,数据自动加载到表体,单据保存后,才最终保存到数据库。

    参数说明

    参数说明必填默认值
    callback导入表体前回调方法,参数为data,格式为:{表体1别名:{字段1:值1,字段2:值2},表体2别名:{字段1:值1,字段2:值2}} 
    autocheck是否自动导入时校验,0或1 

     

    确认弹窗

    参数说明

    参数说明必填默认值
    msg提醒内容 
    yescb选择是对应的回调函数 
    nocb选择否对应的回调函数 
        

    示例

    菜单权限校验

    通过菜单编号来检查当前用户是否具有该菜单权限

    打开公式定义

    APP原生无效

    公式定义窗口包括左侧的字段列表、函数列表,中间部分的公式编写窗口以及右侧的参数列表,通过js编写计算逻辑,最终结果通过return 的形式返回计算结果

    如何后台执行公式?

    公式执行需要通过自定义构件来调用,步骤如下:

    1、新建类库项目

    2、添加dll引用

    标准版:CommonClass.dll , DataCommon.dll , Focus.log.dll , Focus.Formula.dll

    微云版:Focus.Common.dll,Focus.DBFactory.dll,Focus.Logger.dll,Focus.Formula.dll

    微云版注意事项:为保证运行时环境相关dll资源的正确使用,建议通过平台的扩展插件工程 Focus.UserPlugins进行自定义构件扩展,下载链接:

    http://jh.focusinsoft.com/Focus.UserPlugins.rar

    3、编写调用代码,如下:

    说明:

    1、公式数据源是指公式计算所使用到的数据集,比如示例代码中的 arrdata,是一个List类型的集合,FormulaData中VariableName为数据集名称(要以字母开头),Data为结果集,一般可用DataTable或Dictionary类型来传递;公式代码中通过 [数据集名称].[变量名] 就可以访问到数据集字段信息,比如DataTable实际运行是是一个Json数组,Dictionary是一个Json对象。

    2、公式参数是指执行公式时,从外部传入的参数,必须一些条件参数,参数是一个Dictionary对象,实际运行时是一个Json对象,通过 params.[变量名] 即可获取变量值

    3、公式执行中添加日志监控,参考 【插件管理-脚本日志】章节。

     

     

    服务器响应调用

    同步方式:this.doResponse(rescode,params,callback)

    异步方式:this.doResponseAsync(rescode,params)

     

    参数说明

    参数说明必填默认值
    rescode响应编号 
    params格式为{para1:value1,para2:value2},无参数则写{} 
    callback导入表体前回调方法,参数为data 
        

     

     

    刷新Grid列表

    参数说明必填默认值
    gridnamegrid名称
    start起始页号1
    bsearch是否重新查询,单据分页时,默认从服务器端获取缓存的数据,如果需要重新查询数据库,则设为1
    可选值:0、1
    0
    where本次查询条件sql
    lockwhere固定查询条件,一次传递一直生效,如 and cdepcode=‘0101’  
    cb回调函数,Grid列表数据加载完成后的回调函数

    刷新后,会自动更新关联的控件数据显示

     

    刷新Ajax类型数据集

    参数说明必填默认值
    dscode数据集编号
    para数据集参数,其格式为数据集定义中对应的ajax参数{}
    cb回调函数,参数为 data 

    刷新后,会自动更新关联的控件数据显示

     

    刷新脚本类型数据集

    参数说明必填默认值
    dscode数据集编号
    para数据集参数,其格式为数据集定义中对应的脚本函数参数{}
    cb回调函数,参数为data 
        

    刷新后,会自动更新关联的控件数据显示

    刷新自定义数据集

    参数说明必填默认值
    dscode数据集编号
    para数据集参数,其格式为数据集定义中对应的脚本函数参数{}
    cb回调函数,参数为data 
        

    刷新后,会自动更新关联的控件数据显示

    刷新主数据集

    参数说明必填默认值
    dscode数据集编号
    para数据集参数,其格式为数据集定义中对应的脚本函数参数{}
    cb回调函数,参数为data 
        

    刷新后,会自动更新关联的控件数据显示

     

    调用第三方WebAPI

    para结构

    参数名参数说明可空补充说明
    method请求方式:post/get/delete/patch 
    posttype参数提交方式:form/body 
    url请求地址 
    formdatawebapi 以提交形式传递的参数,为json对象,如:{code:"001",name:"张三"}post参数 ,对于method为delete或patch,如果提交方式为form,会转化为地址栏参数
    urlparawebapi 以url形式传递的参数,为json对象,如:{code:"a"}地址栏参数
    headerwebapi header中需要传递的参数,为json对象,如:{code:"a"}一般传递token数据

    返回值:

    1、如果正确请求,结果即为web api的返回结果

    2、如果请求发生异常,结果为json对象,格式:{bsuc:true/false,msg:"异常描述"}

    示例:

     

    通过Url发起异步Ajax请求

    参数说明必填默认值
    url请求地址 
    method请求方式 get 或 post 
    para请求参数,如{code:"001",name:"002"} 
    cb回调函数,参数为data 
    errcb请求错误回调函数 
        

    通过Url发起同步Ajax请求

    参数说明必填默认值
    url请求地址 
    method请求方式 get 或 post 
    para请求参数,如{code:"001",name:"002"} 
        

     

    获取FORM窗体表头数据

    数据结构:{字段名1:”值”,字段名2:”值”,字段名3:”值”,字段名4:”值”,字段名5:”值”}

    示例:获取表头部门编号字段(字段名:cdepcode)数据:

    获取Grid数据

    数据结构:[{字段1:值,字段2:值,字段3:值,字段4:值},{字段1:值,字段2:值,字段3:值,字段4:值},{字段1:值,字段2:值,字段3:值,字段4:值}...]

    此数据结构为一个数组

    示例:数据源001是一个数据列表,列表类型为deplist

    Grid增行

    参数说明必填默认值
    gridname表格名称
    rowcount新增行数1
    startindex插入行位置null
    cb回调函数,如function(arr){
    console.log(arr)
    }
    通过回调函数可以自定义处理新增行的默认值
    null

    增行后如果在回调函数中进行表体行赋值操作,需要设定 “sys_focusflag” 字段,1代表行数据发生变动,0代表未变动,保存时只会处理发生变动的行。如

    注:增行回调函数赋值中,如果给参照关联字段赋值,系统会自动带出其他参照相关字段,无需手动赋值。

     

    Grid删行

    参数说明必填默认值
    gridname表格名称
    arrrow行集合Null

    单据表体删行时调用此函数,如果直接将表体数组置为空,删行无效。

    Grid拷贝

    参数说明必填默认值
    gridname表格名称 
    arrrow行集合 

    1、表格上可以设置属性“允许拷贝行”来启用,启用后在增删行按钮旁边显示拷贝行按钮

    2、可以手动调用此函数拷贝行

    3、拷贝后的行自动追加到最后

    Grid选中行

    参数说明必填默认值
    gridname表格名称
    arrrow行集合Null

    Grid必须要有选择列

    示例

    Grid清除选中行

    参数说明必填默认值
    gridname表格名称

    Grid必须要有选择列

    Grid数据筛选

    参数说明必填默认值
    gridname表格名称
    callback回调函数,参数:arrNull

    示例

    Grid列筛选条件批量重置

    APP原生无效

    参数说明必填默认值
    gridname表格名称

    参照关联字段自动赋值

    参数说明必填默认值
    bhead是否表头字段 true/false
    arrfield参照关联字段集合,bhead为true有效,不填写时,系统检查所有表头/表体参照类型字段null
    gridname表格控件名称,bhead为false有效null
    arrrow表体行集合,bhead为false有效null

    注:表体增行函数 this.form.addRow的回调函数中,给参照关联字段赋值时,无需调用此函数,系统会自动带出其他参照字段。

    示例

     

    弹出移动端行显示(编辑)卡片

    参数说明必填默认值
    gridname表格名称
    row需要显示的行,如果数据集中不存在此行,会报错 

    示例

     

    获取窗体中列表查询条件数据

    数据结构:{字段名1:”值”,字段名2:”值”,字段名3:”值”,字段名4:”值”,字段名5:”值”}

    字段名系统命名规则:查询编号_数据集编号

    示例:列表deplist中,查询条件编号为f01,数据集编号为001,则字段名为f01_001

     

     

    获取父窗体

    APP原生无效

    适用于通过 this.form.showDialog 函数打开的窗口访问父窗口,如果存在多级父窗口,通过this.form.parent.parent...来访问,具体层数取决于打开窗口的个数

    说明:如果调用父窗体方法,建议使用this.form.callParent函数来解耦,尽量不要直接使用this.form.parent.方法名

    示例:获取父窗体值赋值到新窗体

     

    消息提示

    参数说明必填默认值
    message消息内容
    type提示类型,1:主要 2:成功 3:信息 4:警告 5:危险{}

    企查查接口

    参数说明必填默认值
    path企查查API地址,填写接口地址中https://openapi.qcc.com/后面部分,如 EnterpriseInfo/Verify 或者 ECIInfoVerify/GetInfo?keyword=xx公司
    keyval搜索关键字,支持企业名称、统一社会信用代码、注册号,只针对查询关键字是 searchKey 的有效,其他的请设为空{}
    cb回调函数,参数ret为查询结果  

    注意事项

    1、如果环境为微云版,需在 appsettions.json中增加如下节点信息

    2、如果为标准版,需在web.config 的appSettings节点下增加如下信息

    复杂消息提示

    弹窗显示自定义html内容

    options属性

    属性说明必填默认值
    title标题
    modal是否遮罩true
    width宽度(可为百分百)500px

    示例

     

    待办标识

    当前单据是否是待审批单据标志

     

     

    获取登录信息

    获取移动端类型

     

    Form输入验证

    重置Form输入验证

    消除验证提示信息

    修改Form输入验证

    消除验证提示信息

     

     

     

    新增单据

    此方法为异步方法,如需同步调用,请使用await

    参数说明必填默认值
    btnid执行新增按钮的ID,如果不传,则按钮状态不会发生变更
    bodyrows表体默认新增行数  

    拷贝并新增单据

    此方法为异步方法,如需同步调用,请使用await

    此方法拷贝来源单据数据(字段是否可以拷贝在数据模型定义),并自动新增并将数据带入当前单据。

    参数说明必填默认值
    keyid需要拷贝得单据id值 
    callback拷贝成功后的回调函数 

     

    保存单据

    此方法为异步方法,如果保存后做其他业务处理,代码写在回调函数当中。

    参数说明必填默认值
    cb回调函数,如 this.form.saveVoucher(function(){

    })
        

    暂存单据

    APP原生无效

    此方法为异步方法,如果暂存后做其他业务处理,代码写在回调函数当中。

    每一次暂存,系统都会按照日期记录暂存记录。

    参数说明必填默认值
    cb回调函数,如 this.form.saveTempData(function(){

    })
        

    加载暂存单据

    APP原生无效

    此方法为异步方法,如果暂存后做其他业务处理,代码写在回调函数当中。

    如果只有一条暂存记录,系统会将数据直接加载到单据。

    如果不止一条暂存记录,系统会弹出暂存记录选择窗口,手动选择载入暂存数据。

    注意:如果使用暂存数据,请注意单据相关逻辑校验时效性,最好在服务端进行逻辑校验。

    删除单据

    参数说明必填默认值
    btnid删除按钮名称, 
    cb回调函数 

    删除单据(后台)

    此函数不会触发按钮状态变更

    参数说明必填默认值
    voucherno单据类型 
    keyid单据ID  
    cb回调函数 

     

    提交单据(关联按钮状态)

    参数说明必填默认值
    iscommit是否提交,true:提交 false:取消提交true
    cb提交成功回调函数 

    提交单据(后台)

    代码中调用,不会引发按钮状态修改

    参数说明必填默认值
    iscommit是否提交,true:提交 false:取消提交true
    voucherno单据类型  
    formid单据对应的窗体ID  
    keyid单据ID  
    urgent紧急程度 0 一般 1 加急  
    cb提交成功回调函数 

    查看审批流程图

     

    清除缓存

    APP原生无效

    参数说明必填默认值
    cachetypecomponent 构件 /list 列表/refer 参照/voucher 单据 
    sourcecode构件时为空,其他分别为列表编号、参照类型、单据类型 
    cb成功回调函数  
    errcb失败回调函数  

    ####

    汉字转拼音首字母

    汉字转拼音首字母

    汉字转拼音全拼

    说明:通过此函数便于生成速记码

    通过地址传递列表查询条件值

    此功能常用于通过一个地址打开带列表显示的Form窗体,通过地址传递查询条件参数,打开的列表条件自动赋值

    如:我的待办列表地址:show?formid=b365133f-99da-4588-a48b-8f6d90ce6e67&f1_vi_bs_dsdj=报销单,其中f1_vi_bs_dsdj即为列表的查询条件编号,编号规则为:列表条件编号_列表编号,注:列表编号即为列表定义中的列表编号,也可以通过 console.log(this.form.filterdata) 来查看当前form窗体所有的查询条件编号。

    image-20210519165854872

    客户端全局存储

    所谓全局存储,就是在客户端会长期保留存储数据,即使浏览器关闭后数据也会保留

    参数说明必填默认值
    name存储键 
    value存储内容,可以为字符串或对象 

    客户端全局临时存储

    所谓临时存储,指的是只有当前浏览器窗口或标签页未关闭时才会保留数据

    参数说明必填默认值
    name存储键 
    value存储内容,可以为字符串或对象 

    设置表头字段隐藏显示

    参数说明必填默认值
    arrfield字段名数组 [“ccode”,”cname”] 
    visible是否显示 true/false 

     

    设置表体字段隐藏显示

    参数说明必填默认值
    gridname表格名称 
    arrfield字段名数组 [“ccode”,”cname”] 
    visible是否显示 true/false 

    设置表体字段只读

    参数说明必填默认值
    gridname表格名称 
    arrfield字段名数组 [“ccode”,”cname”] 
    readonly是否只读 true/false 

    设置表头字段只读

    参数说明必填默认值
    arrfield字段名数组 [“ccode”,”cname”] 
    readonly是否只读 true/false 

    ####

    计算表体列合计

    参数说明必填默认值
    gridname/array表格名称或者数组对象 
    field字段名 

    示例

    计算数组合计

    参数说明必填默认值
    arr数组,可以是值数组,如[1,2,3],也可以是对象数组,如 [{code:"001",quan:1},{code:"002",quan:20}] 
    field合计字段,如果是对象数组,通过该字段指定合计字段 

    传入一个一维数组,返回合计值,如果数组中存在空字符串或者null值,会自动按照0来处理。

    通过此函数免去了繁琐的值类型判断

    示例

     

    获取输入控件集合

    属性说明必填默认值
    name名称  
    title字段描述  
    options.breadonly是否只读 true/false  
    options.width宽度 数值或百分比  
    options.visible是否显示 true/false  
    options.labelcolor字段描述颜色,如 red,green,#cccccc等  

    获取表格控件集合

    表格属性   
    属性说明必填默认值
    name表格名称  
    cols列集合  
    size显示大小 medium / small / mini  
    height高度,如 500px  
    visible是否显示 true/false  

     

    表格列属性   
    属性说明必填默认值
    label列名  
    sortable允许排序 true/false  
    resizable允许修改列宽 true/false  
    align内容对齐方式 left/right/center  
    headeralign列标题对齐方式 left/right/center  
    visible是否显示 true/false  
    editable是否允许编辑  

    示例

    获取表单的附件信息

     

    表单赋值

    使用场景:点击树形节点查看单据信息

    批量审批

    参数说明
    arr数组,如[{cvoucherno:"单据类型",cvoucherid:"单据ID",cnodeid:"审批节点ID",cversion:"审批版本号"}]
    approvetype审批状态 0 驳回,1 同意
    approvememo审批意见
    cb回调函数

    示例:

     

    数据导出

    数据导出(自定义查询)

    params结构说明:

    参数说明必填默认值
    template模板名称(可选择按照模板导出) 
    para1自定义参数1 
    para2自定义参数2 
    ...灵活定义 

    模板使用说明

    模板文件是数据导出时,自动套用的格式文件,为标准的excel格式,模板文件编写完后放到 根目录/export_modal文件夹下

    模板写法:

    image-20231222162025619

    查询结果数据统一使用 {{table.字段名}}

    params中的参数信息可以使用 {{参数名}}

    示例

     

    刷新单据附件

    如果窗体中没有数据模型,则该函数无效。

    打印

    参数说明必填默认值
    gridname表格控件名称,单据打印时置为空 
    voucherno单据类型,列表打印时置为空 
    keys单据ID集合,逗号隔开;单据打印时有效 
    modalname模板文件名称,不填写默认打开模板选择对话框 
    bpdf是否免预览,直接显示pdf结果,必须指定 modalnamefalse

    用法说明:

    keys为选填参数,如果当前表单页面打印,不传则默认当前表单ID

    打开新的tab页

    参数说明必填默认值
    ccode菜单编号(重复编号会自动切换至已经打开窗口) 
    cname菜单名称 
    cpage菜单地址(相对或绝对地址) 
    newwin是否打开新浏览器窗口false

     

    关闭tab页

    设置按钮是否可用

    参数说明必填默认值
    arrbutton按钮名称数组 
    isdisabled是否不可用 

     

    打开窗体遮罩

    设置多页签Tabpanel组件指定页签隐藏显示

    判断是否移动端

    设置组件隐藏显示

    注意:如果调用隐藏/显示函数后,还有其他逻辑代码处理,最好写在this.$nextTick 里面,代表状态变化完成后执行逻辑,示例如下:

     

    判断是否移动端

    单据状态

    企业微信/钉钉扫码

    企业微信/钉钉定位

     

    路由跳转

    路由跳转只能用于不同form窗体之间的显示跳转,如果由form窗体跳转至其他非form页面,请用location.href来跳转。

    子路由跳转

    所谓子路由就是当前form窗体中拖入一个“路由”组件,通过子路由跳转来实现主页面部分区域的内容切换。

    短日期格式化

    格式化为 2021-02-01 格式的短日期

    长日期格式化

    格式化为 2021-02-01 12:00:30 格式的长日期

    日期自动格式化

    如果日期年度为当前年度,则省略年度显示,只显示年-月,如果带时间,则显示为 年-月 时:分

    获取日期描述

    根据日期获取日期描述,如日期为昨天,则显示昨天,最多到前天

     

     

    日期加减计算

    示例

     

    数字格式化

    将数字取小数精度并安宅哦千分位格式化

    数字四舍五入

    将数字按照精度进行四舍五入

     

    空值转化

    类似于数据库 isnull函数,如果对象为空,则返回一个默认值

    MD5数据加密

    ####

    数据加密

    采用对称算法对数据进行加密,服务端通过 Focus.Common.AESCryptoHelper.Decrypt进行解密

    数据解密

    对this.encode加密结果进行解密

    JS对象序列化

    对JS对象序列化成Json字符串

    JS对象拷贝

    对JS对象复制为另一个对象

    移动端文件打开

    1、企业微信中,会自动调用微信的文件打开功能

    2、App中,会自动选择本地的默认打开程序打开

     

    判断是否为移动端

    判断当前页面是否是在移动端打开

    获取GUID

    客户端获取一个GUID

    获取Form窗体Json配置

    根据名称获取控件对象,一般用于设定隐藏显示,可以通过隐藏父容器来达到批量隐藏的目的。

     

    查找控件

    根据名称获取控件对象,一般用于设定隐藏显示,可以通过隐藏父容器来达到批量隐藏的目的。

    查找树形控件

    根据名称获取控件对象,一般用于动态添加或删除下级节点(懒加载情况,如果非懒加载直接操作数据集即可)。

    树形控件添加下级节点

    动态添加下级节点(懒加载情况,如果非懒加载直接操作数据集即可)。

     

    参数说明 
    data节点数据,对应树型控件数据源格式,例如{code:"",name:""} 
    node上级节点对象,在节点点击事件中获取 

    示例:

    树形控件删除节点

    动态删除节点。

     

    参数说明 
    data节点数据或者节点对象都可以,在节点点击事件获取 

    示例:

     

    空值转换

    如果是空值,返回指定的内容,类似于数据库中的isnull函数。

    获取平台环境

    判断平台环境为微云版还是标准版。

     

    PDF查看

    拖入PDF查看控件,设置PDF地址(不再推荐,不兼容APP端)。

    推荐用法一:PDF查看控件 -- 查看前事件,指定pdf地址

    推荐用法二:通过this.form.showPdf(url)函数,一般通过按钮点击事件触发

     

     

    新增并复制单据

    调用构件

    示例

     

    播放视频

    窗体中需要拖放“视频播放”控件

    示例

    IFrame控件地址跳转

    窗体中需要拖放“IFrame”控件

    示例

    提别说明:某些网站不支持在iframe中打开,比如百度,会提示页面无法显示。

    实时添加日历事件

    日历控件一般是通过绑定数据源来显示日历事件,如果运行时需要手动增加自定义事件,比如通过表单录入一个事件,保存后事件直接显示到日历界面,可以使用实时添加日历事件来实现

    数据对象格式

    添加示例

     

    模板组件

    自定义组件允许使用原生的HTML语言编写界面呈现,遵循Vue编写规范,可以在数据绑定容器中或者表单中使用,从工具箱拖入“自定义模板”,设置好相应数据源和脚本即可使用

    自定义组件分为如下几部分:

    1、显示模板,即html语言,双向数据绑定请使用v-model=“字段名”进行设置,如:

    image-20220606104513506

    2、组件挂载前,HTML呈现前的数据组织和处理,数据源准备,data中的数据都可以操作

    3、组件挂载后,HTML数据呈现后,此时修改数据源,会关联界面更新,data中的数据都可以操作

    4、组件函数定义,HTML中的事件及函数集中定义,比如值变更、获得焦点事件、点击事件等

    image-20220606104604845

    5、监听函数定义,通过监听函数可以对data中的数据进行监听,数据一发生变化就会触发监听事件。

    image-20220606104920199

    效果:

    image-20220606105034104

    自定义组件中可用的属性:

    1、this.form 获取根窗体对象

    2、this.formdata 如果是在绑定容器中,为当前行数据,否则就是表单数据,通过console.log(this.formdata)看结构

    3、this.form.remotedata 脚本、ajax、自定义查询、函数数据源

    4、this.form.data 表单数据、列表数据源

    了解Element组件,登录 https://element.eleme.cn/#/zh-CN/component/installation

    如何将窗体中部分内容浮动显示

    所谓窗体中内容浮动显示是指当前窗体部分内容默认不显示,通过点击按钮侧边栏打开显示内容的方式,比如列表查询条件,默认比较占空间,可以通过浮动窗口的形式显示条件,点击查询后自动关闭浮动窗口,定义如下:

    1、拖入显示块,浮动内容放置到显示块内部,同时指定弹出方式,窗口宽度和标题等。

    image-20240702092124948

    2、指定触发的关联按钮,这样在点击按钮时,会自动打开下方内容,如果按钮点击时禁止自动打开关联浮动窗口,点击事件 return false 即可,也可以通过函数this.showPanel("显示块名称",true/false); 来代码控制。

    image-20240702092354594

    效果

    image-20240702092551622

    移动端单据/列表优化要点

    移动端优化点主要涉及到按钮显示和表格模板显示,其中按钮应该固定在页面最底部

    如下图:

    1、列表

    image-20240701150817840

    2、单据

    image-20240701151454316

    定义方法

    按钮底部显示设定

    image-20240701150433175

    将按钮组放到显示块中,同时将显示位置设置为底部停靠

     

    列表模板设定

    image-20240701150907385

    自定义模板内容,点击“示例”按钮,自动生成一个html模板,可以自行填写显示内容

    image-20240701150944262

    列表查询条件

    列表查询条件分为两部分:1、单个搜索框,2、组合查询条件,如下图,点击漏斗图标打开组合条件窗口

    image-20240701151758017

    1、添加列表组合查询条件,添加显示块容器,查询条件放到容器内

    image-20240701151954745

    2、拖入一个快速过滤组件,指定关联筛选条件容器名称(即上一步拖入的显示块名称),在条件表达式中填写 return this.bMobile(); //只有移动端才显示

    image-20240701152153109

    内部的查询按钮也设置容器关联,这样在点击查询的时候,会自动隐藏组合条件窗口

    image-20240701152511569

    点击漏斗打开的组合条件效果

    image-20240701152355223

    全局表单样式修改

    focus/go.htm文件记事本打开,修改 window.globalinfo对象,此处修改对全局有效,同时form窗体属性中也有同名的属性设定,如果在form窗体属性中单独指定了相应的值,则以form窗体设定为准

    参数说明如下

    如需自定义修改其他样式内容,通过审查元素找到样式定义,然后在 focus/css/userdef.css 文件中,添加一个同名的样式,覆盖原有的样式内容

    登录组件

    登录组件在窗体设计器中作为一个单独的控件,可以设定背景图片、登录验证方式、logo等相关参数,在登录成功后事件中实现跳转

    此功能一般结合“开发定义-门户页面设定”功能一起使用,登录成功后跳转至设定好的门户页面

    image-20240104183237260

    示例

    门户页面设定

    用来定义登录之后的导航显示框架界面

    入口:控制面板 -- 开发定义 -- 门户页面设定

    image-20240104183514861

    打开配置导航框架窗口

    image-20240104183547273

    注意点:

    1、在“首页地址”属性中,可以指定进入导航框架后自动打开的页面,填写窗体页面的相对路径或者数据中心页面的相对路径都可以

    2、在“登录路由地址”中需要维护好登录页面的相对地址,用户在点击“退出”按钮后,保证能够跳转回原来的登录地址

     

    点击预览时,此页面地址中的key值,即为登录窗口需要跳转的路由地址参数

    image-20240104183805689

     

    业务流程视图

    业务流程图可以通过流程图的形式直观展现上下游业务单据的关联情况,例如根据到货单联查对应的上游采购订单

    示例:

    image-20240430154810668

    可以通过任何一个中间单据作为入口关联出上下游业务单据信息

    定义过程

    1、新增业务视图

    “控制面板” -- ”报表及图形定义“ -- ”业务流程视图“

    image-20240430155035145

    点击流程设计,进入图形界面

    image-20240430155108344

    通过右键添加业务节点

    2、节点属性

    点击节点,弹出的属性窗口

    image-20240430155639819

    属性说明
    数据模型从数据模型列表选择对应数据模型
    单据窗体ID该数据模型对应的单据窗体ID,用作联查时自动打开的窗体
    字段集合数据模型中的字段集合,包括表中不存在于数据模型的字段,数据模型增减字段后,点击左侧刷新按钮更新字段集合
    自定义联查系统默认打开“单据窗体ID"对应的窗体,可以在自定义联查中自定义打开方式
    显示模板运行时,节点上浮动显示的数据列表的显示模板,只能使用数据模型表头字段进行组合定义,如 单据编号:{code}
    权限控制两种方式并集:1、填写菜单编号,系统按照菜单权限控制该节点数据是否允许联查明细;2、权限控制SQL,以pb_operator表的查询条件,如 copercode='admin' (只有admin才能查看)

    3、连线属性

    连线上点击右键 -- 属性设置

    image-20240430160459205

    两个节点之间连线,设定关联条件,左右两侧的数据模型所有字段都可以作为条件关联

    如果条件使用固定值,请使用单引号,如下图

    image-20240430160616378

    4、保存、测试

    点击“测试“按钮,输入参数,进行测试

    image-20240430160741697

    业务中如何使用

    定义好的流程,可以在业务单据中通过按钮快速打开业务流程视图

    函数名

    参数说明:

    参数说明允许空
    flowcode流程编号
    key单据ID是,为空时默认取当前单据的ID(当前窗体需为单据窗体有效)
    voucherno数据模型编号是,为空时默认取当前单据的数据模型变化(当前窗体需为单据窗体有效)
    formid窗体ID是,为空时默认取当前窗体的formid(当前窗体需为单据窗体有效)

    系统会按照 voucherno和formid从流程图中寻找入口节点,如果找不到入口节点会报错

    数据计算原理

    第一步:按照两个数据模型的关联条件查询数据,由于数据模型下所有的表字段都可以作为关联条件,所以系统会查询出每一个表(包括主表和子表)的数据

    第二步:数据模型下所有表数据查询完成后,遍历每一个子表,将主表中缺失ID自动根据子表进行补查填充

    第三步:如果关联条件中有主表字段等于固定值的,会最终根据主表结果集进行筛选,将不符合固定值的记录删掉,并作为前台浮动展示的单据列表

     

    倒计时组件

     

    倒计时组件需要是指根据一个指定的截止时间,自动计算并显示倒计时

    倒计时开始时,会自动从服务器获取当前时间,然后根据这个时间进行倒计时

    事件

    倒计时结束事件

    倒计时结束后自动执行该事件,参数:config 当前组件JSON数据

    方法

    启动倒计时

    电子地图组件

    电子地图使用的是高德地图,拓展开发可参考高德开发文档

    配置方法

    1、到高德开发者中心注册应用,如下图

    image-20240329184326251

    2、到go.htm中配置key和安全密钥

    image-20240329184434244

    使用方法:窗体控件列表中,拖入地图控件即可

    平台预置特性

    1、点选坐标,一般用于地图上选择一个位置

    2、地图展现数据,通过在地图上一系列图标,旁边加以简短文字说明,通过点击事件穿透至详情。

    事件

    1、标记点击事件,可进行联查打开平台窗体进行穿透查询

    2、坐标拾取事件,通过这个事件获取坐标经纬度值

    3、地图加载后事件,一般用于做自定义深入扩展,map参数为地图对象,参考高德开发文档进行深入扩展

    4、标记显示后事件,一般在此处做设置地图中心点

    方法

    1、获取地图组件对象

    2、设置中心坐标

    示例:

    1、定义一个数据集

    image-20240329185853631

    2、配置地图

    image-20240329185945500

    效果

    image-20240329190129521

     

    图片菜单组件

    图片菜单组件可以将一张图片虚拟分解成不同的区域,每个区域可以响应点击事件,比如一个功能流程图图片,图片中有一些按钮,可以将这些按钮通过坐标虚拟出进行定位并响应点击事件。

    定义步骤

    1、图片菜单定义

    控制面板 - 开发定义 - 图片菜单定义

    image-20230519172250525

    区域分解时,坐标值如何填写?

    以分解“计划安排”按钮为例

    首先用原始比例打开图片,可以直接点击表头的图片预览

    第二,用qq或者微信截图工具,从图片左上角(左上角坐标值0 0),选择到“计划分解”按钮的左上角,记录坐标值,如下图所示

    左上角坐标 :76 156

    image-20230519171324147

    右下角坐标:299 210

    image-20230519171410400

    最终坐标:76 156 299 210,将此值填写到坐标值列中即可,此种坐标格式适用于矩形形状,如果形状为圆形,则前两位代表坐标,最后一位代表半径大小,如 76 156 30 (圆心坐标 76 156,半径大小30)

    第三,填写功能名称、功能编号、形状等信息,点击事件中会获取到这些信息。

    2、图片导航控件配置

    image-20230519171915979

    “数据源编号”即为上一步定义的图片菜单定义编号,设置好长宽即可,如果长度设定,宽度按比例,则宽度可设置为auto

    事件中定义点击事件:

    image-20230519172102143

    3、预览

    image-20230519172410508

    表格组件

    自定义列

    表格自定义列支持两种模式:

    1、模板显示,模板中可以通过html形式自由组织显示内容,参数row代表当前行数据

    2、非模板显示,可以可视化添加按钮、标签、超链接等小组件。

    此处着重介绍模板显示方式

    模板写法

    模板中支持Element UI标准的html组件以及普通的html组件,模板中可以使用row参数进行动态绑定,row代表当前行数据,例如:{cinvcode:"001",cinvname:"钢材"},html使用时写法为: {{row.cinvname}}

    示例

    说明:

    模板中的可以通过this.form来使用Form窗体中的数据或方法,注意Html中不用填写this

    示例

     

    组织图组件

    概述

    组织图可以通过关系图的形式展现节点之间的关系,比如树型层级图或者平面交错的关系图,典型的应用场景是用于可视化展现组织层级结构或者公司间的股权结构,几种效果如下:

    树型

    image-20221118093033068

    关系图

    image-20221118093237939

    组件数据源

    组件数据源是带有树型层级结构的Json对象,可通过平台Json结构定义来生成数据源,组件属性中选择数据源,填写主键字段、描述字段、子项字段即可完成基本的数据源设定,其他几个选填字段可以自由填写,如果需要动态设定不同节点的颜色、长宽等信息,需要根据实际情况填写其他字段。

    示例

    数据源结构(一个投资公司对外投资的股权占比数据)

    字段填写

    属性名称填写值 
    主键inode 
    描述字段cname 
    子项字段items 
    连线描述字段crate 

    展现效果:

    image-20221118102955728

    自定义节点

    组件支持两种自定义节点方式:1、HTML方式 2、节点模板方式

    HTML方式

    HTML方式可以通过组件事件"自定义节点格式",来动态输出节点的HTML显示内容,具体显示的内容格式,事件中nodedata参数代表当前节点的数据,可以根据实际需求,输出任何自定义的HTML内容及样式

    这种方式的优点在于方便灵活,可以根据不同客户需求定义不同的节点显示样式;缺点同样明显,如果HTML中增加自定义事件,无法使用this.form来调用窗体对象。

    示例:

    image-20221118104518581

    image-20221118104525920

     

    节点模板方式

    节点模板方式是指通过Vue组件模板的方式来显示节点内容,模板中可以使用vue的标准指令以及ElementUI元素和form对象,如果模板中按钮需要触发form中的自定义方法,在Form窗体初始化事件中定义this.form.myFun = function(){...} ,模板按钮中直接通过 @click="form.myFun"即可触发事件;

    节点模板的方式功能比较全面,模板中内容的长宽受限于控件默认节点长宽设定的限制

    示例:

    image-20221118104613177

    image-20221118104657598

    函数

    动态增加节点

    在原有基础上追加显示节点

    nodedata详细说明

    nodedata是一个json结构对象而不是数组,其格式跟数据源格式保持一致,例如上面示例中,在公司A下追加显示两个节点 A1和A2,写法如下

    完整示例

    动态删除节点

    从当前节点动态删除其中一个节点

     

    文档在线编辑组件

    概述

    文档在线编辑组件允许在浏览器中打开或编辑word、excel、ppt文档,支持文档的服务器端保存,使用时将“在线文档”组件拖入到Form窗体,设置属性即可。

    文档使用的两种模式:“二进制字段”、“文件”,在属性“保存类型”中设定即可

    1、二进制字段是指文档内容最终作为一个二进制字段内容保存在单据中的表头字段,数据模型中设置表头字段类型为“二进制”即可,在“绑定字段名”属性填写二进制字段名

    image-20221113102418500

    2、文件是指,保存类型选择“文件”,“文件目录”填写相对于根目录的虚拟目录名称,如 mydoc/files ,"文件名“字段填写需要加载的实际文件,如 方案.docx,此时控件会按照路径加载文档,保存时会自动保存至该目录下。

    image-20221113102719978

    组件注册

    打开 应用程序根目录/focus/office/set.json ,分别输入ProductCaption(公司名称)和ProductKey(授权序列号)保存

    每个客户端需要安装购买后厂家给的exe安装程序。

    相关函数

    打开文档

    保存文档

    获取文档对象

    文档加载完成后事件

    文档控件初始化完成后执行的事件,如果需要通过函数打开文档,需要在此处填写代码

    事件参数:name 文档控件名称

    image-20221113105138630

    常见问题:

    1、如果控件安装后还是无法加载,需要拷贝focus/office/ npffax.dll至 C:\Windows\SysWOW64 2、如果打开文档时,在外部跳出work或者Excel,客户端解压并执行 focus/office/文档打开方式注册.zip

     

    注意事项

    1、pc端在线编辑word文档时,添加批注或者审阅状态时,如果修改人默认不是当前登录用户,需要设置一下本地office,如下:

    a) 打开word

    b)打开选项设置

    image-20230406094521764image-20230406094634211

    c) 最终效果

    image-20230406094813937

    自定义组件

    组件说明

    自定义组件允许你通过原生element(或原生html)+vue的模式来编写组件展示模板和逻辑,形成一个公用的自定义组件,以便于在Form窗体或者数据中心和数据大屏中方便的拖拽使用。

    element参考地址:https://element.eleme.cn/#/zh-CN

    自定义组件分为七大部分:

    1、组件Data:自定义组件的Data数据,所有组件内元素都可以绑定Data内变量,这是组件的数据源中心。

    1、HTML:直接编写html显示界面,可以通过element ui 或者原生html形式去编写。

    2、创建后(created): 这个时候,组件中的data、method已被初始化,属性也被绑定,但是此时还是虚拟dom,真实dom还没生成,$el 还不可用。这个时候可以调用data和method的数据及方法,created钩子函数是最早可以调用data和method的,故一般在此对数据进行初始化。

    3、Mounted( 挂载后):此时模板已经被渲染成真实DOM,用户已经可以看到渲染完成的页面,页面的数据也是通过双向绑定显示data中的数据。 这实例创建期间的最后一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了。

    4、自定义方法(Methods): 自定义组件中所有方法的定义集合,包括Html元素中事件对应的方法,都在此处进行定义。

    5、监听(Watch):监听是指对某一个变量进行自动感知,如果变量值发生变化,会立即触发监听方法,Data或者this.form.data 内的变量都可以监听。

    6、样式(css):用于定义组件的css样式集合,Html元素中可以直接通过class来使用样式。为了避免自定义样式对其他页面元素造成污染,需要给组件定义一个[组件css名称](组件右侧属性中定义),这个css名称会作用于组件顶级元素上,自定义的css样式都基于[组件css名称]去限定作用范围,如 组件css名称定义为 mycomp, 子项css定义方式如下:

    与父窗体通讯方式

    1、访问父窗体

    自定义组件通过this.form来获取父窗体对象,可以通过this.form来访问到父窗体所有的数据和方法

    2、在父窗体中访问组件

    通过 this.form.getMyComp("组件名称") 来获取组件对象,然后可以通过该对象访问组件内部的数据和方法

    3、组件内部变量formdata

    formdata是form窗体默认传递到自定义组件的一个数据集,作为系统默认的数据集对象,具体内容分为以下两种情形:

    1. 如果组件位于绑定容器内,比如 数据绑定设置为是的卡片控件内部,由于卡片是根据数据源循环输出的,卡片内部的控件数据集就变成当前循环内部当前行数据

    2. 如果组件位于非绑定容器内,则为from窗体中的data数据,等价于this.form.data

       

    OCR识别

    平台ORC识别支持薪火科技和华为两种类型的OCR发票识别

    应用程序配置点

    标准版

    web.config文件,appSettings节点下增加如下节点

    微云版

    appsettings.json, RestAPI节点下增加如下节点:

     

    OCR识别服务:

    OCR识别包括发票、卡证(银行卡、身份证、社保卡、护照、驾驶证、行驶证、户口本、名片、房产证、不动产证、营业执照、开户许可证、税务登记证、组织机构代码证、车辆合格证、车辆登记证、香港身份证、结婚证、离婚证)、普通OCR三种,其中华为OCR只支持发票识别,其他的需使用薪火OCR识别服务(https://www.xinhuokj.com/)

     

    目前只有华为的OCR识别需要单独部署OCR识别服务

    1、部署OCR识别服务,OCR识别服务为独立的.net core Web API服务,通过修改appsettings.json来设定端口号及SSL证书(可选)

    2、修改appsettings.json中的OCR配置见,设置 “AK","SK","Region"信息

    此信息在 华为管理后台-我的凭证 中可以查看

    image-20220919161320885

    2、双击Focus.OcrAPI.exe启动OCR服务

    前端配置

    Form窗体中,设置“附件”-"智能识别"属性,如下图:

    image-20220919160649327

    发票识别信息存储位置

    识别结果位于"bs_invoice"表,字段 cdata 存储识别之后的原始Json数据,可根据需要使用。

    发票识别后,按照cinvoice_haoma(发票号码)和cinvoice_daima(发票代码)两个字段检查是否有重复,如果有重复,则认为发票已经被识别过,再次识别不会被存入我的票夹。

    平台系统参数-邮箱配置说明

    普通邮箱(SMTP协议):填写 系统邮箱地址、邮箱用户名(跟系统邮箱地址相同)、邮箱密码、邮箱类型选择SMTP

    exchange邮箱:

    系统邮箱地址(实际发件箱地址)

    邮箱用户名:如果为域用户,填写 域名\邮箱账号(@符号前面部分),否则直接填写邮箱地址或者@符号前面部分

    邮箱密码、邮箱类型选择exchange

    exchange设置示例

    非域邮箱

    image-20230404151003852

    域邮箱

    image-20230404151115190

    注意:

    点击邮箱测试,系统会向系统邮箱中发送一封测试邮件,如果收取成功,则代表邮箱配置完成。

    域用户登录验证

    1、标准版,web.config 文件,appSettings 下增加 autytype和domainip两个配置节,如下;

    2、微云版,appsettings.json,增加如下配置节

     

    定时任务

    从8.7版开始,定时任务统一使用core版的 Focus.Scheduler

    配置说明

    image-20230911172530118

    Host配置点说明:

    参数名说明
    Env标准版:framework 微云版:core
    Url标准版:web服务地址,http://平台地址/smsservice/batchsend.asmx;微云版:http://平台地址
    UserCode微云版有效
    Pwd微云版有效

     

    模型计算

    模型计算主要通过定义计算模型来批量处理复杂计算,通过字段级公式定义计算逻辑,循环计算对象集合来批量计算并存储计算结果

    应用场景:

    1、薪资计算,每个人都有不同的薪资项目,不同薪资项目有不同的计算逻辑,尤其是绩效相关的薪资项目,需要从不同业务表中汇总计算绩效奖金

    2、成本计算,按照产品汇总计算每一个成本项目成本

    3、其他涉及到多类别数据汇总统计的场景

    模型四要素

    1、计算对象,通过sql语句获取需要计算的对象集合

    2、模型参数,模型计算需要用到的参数,比如 年度、月度等等,在计算模型的时候需要传入指定的参数

    3、存储表,计算结果存储的表名及相关字段,模型计算完毕后自动按照规则存储到指定的数据表

    4、计算公式,针对存储表的每一个字段,定义计算公式,通过js语言可以方便定义公式

     

    定义方式

    image-20230428143637120

    image-20230428143658159

    字段说明:

    主表

    字段说明
    查询方式sql或存储过程,针对”查询语句“字段
    数据库连接”查询语句“所用的数据库连接
    存储表名计算结果的存储表名称,必须是平台数据库的一个实表
    主键字段存储实表的主键,如果为GUID,平台会自动生成
    查询语句需要计算对象的sql查询语句,基于改查询结果进行循环计算,可用 {参数名}直接使用入口参数值
    线程分组字段基于查询结果集中的字段进行分组,执行模型计算时,系统按照分组字段建立独立的执行线程,进行并行计算
    计算前SQL模型计算前执行的SQL语句,一般用于计算前清空数据,可用 {参数名}直接使用入口参数值
    计算后SQL计算完成后执行的SQL语句,一般用作计算完毕的后处理,可用 {参数名}直接使用入口参数值
      

    明细信息子表

    字段说明
    计算顺序号字段计算的先后顺序
    字段名表头”存储表名“中的字段名
    字段描述字段说明
    计算公式该字段值的计算公式定义,详见公式说明

    入口参数子表

    字段说明
    顺序号参数的顺序编号
    入口参数名称实际的参数名,如depcode、invcode
    入口参数说明参数说明

     

    公式说明

    image-20230428144702067

    公式分为三部分:

    1、字段及函数,字段是指公式中可使用的字段,具体是指存储表中的字段;函数主要包括平台函数和其他函数,平台函数是在平台中定义的函数(C#语言定义),其他函数都属于通用的JS函数

    2、公式编写窗口,在此处编写计算逻辑,语法为标准js,可以在js中直接调用C#定义的平台函数

    3、全局参数,模型定义中的入口参数

    代码编写说明:

    1、系统默认提供的参数,主要有三个:item 、rowdata、params、log

    item:当前循环的计算对象,即”查询语句“对应查询结果中的一行,根据截图中的SQL为示例

    rowdata:当前计算结果的存放对象,即”存储表“对应的当前行,因为字段有计算顺序,因此后面计算的字段公式中可以通过rowdata获取到前面计算的结果

    params:获取参数值

    2、平台函数,函数是在报表模块-自定义函数中进行定义,平台函数全部为C#定义的函数,使用方法:

    除了自定义函数外,还可以在js中执行sql查询语句,返回结果为格式为数组的字符串,需要通过JSON.parse转为对象

    3、params :获取模型参数

    4、log:日志记录组件,用于调试问题,日志文件存储在logfile 文件夹下

    如何强制开启日志

    浏览器打开如下地址:

    1、微云版: http://平台地址/plat/pluginlog

    2、标准版:http://平台地址/sysplat/dataget/data.ashx?type=pluginlog

    模型计算调用

    1、前端调用

    2、后台调用

    添加Focus.Formula.dll

    测试模式:系统只执行函数计算,结果不实际保存到数据表,有异常会提示,可用于检查有无公式错误

    调试模式:系统记录详细的日志,日志文件位于 logfile \ *_debug.log

    指定附件存储位置

    只有微云版才可以指定附件存储位置,可以指定应用服务器任意一个文件夹作为附件存储文件夹

    appsettings.json文件,配置FilePath节,如下图

    image-20240821153358873

    单据附件归档

    归档设置

    老版单据:单据格式 - 修改定义,选择归档时机和归档路径

    新版单据:在数据模型同名的老版单据格式 - 修改定义,选择归档时机和归档路径

    归档路径支持固定路径和动态路径两种方式(需提前在系统参数中设置好“文档中心路径”)

    固定路径:路径名字为静态,如 /项目管理/预算编制

    动态路径:根据单据表头字段值动态组成路径,如 /项目管理/{cperiod} ,其中 cperiod为表头字段名,根据实际字段值形成实际路径。

    自定义消息推送

    自定义消息推送是指将自定义消息推送至微信、钉钉、app或者语音电话等不同移动端,消息类型分为文本消息和通知消息两种,通知消息带链接。

    设置步骤:

    1、向bs_wxmessage表预置数据,表结构说明:

    字段名字段说明备注
    copercode人员编号必填
    ctitle消息标题(微信/钉钉/app起作用)必填
    cmsg消息内容(200字以内)必填
    ctype消息类型(text/img可选)必填 text:文本消息; img:通知消息,可带链接
    curl链接url地址必填 ctype填写img时有效
    ddate插入日期必填
    bvoice是否电话语音消息必填 1或0
    cappid应用ID非必填,企业微信/钉钉应用ID,如果填写,消息会推送到对应应用里面,为空时默认推送到审批应用中
    bsend是否已发送留空 系统自动回写
    cerror微信/钉钉发送错误日志留空
    capplogApp消息发送结果日志留空
    bdisplay是否已展示留空 系统自动回写
    cvoiceid电话语音消息ID留空 系统自动回写,可根据此字段查询bs_voicesend(语音消息表(接听结果表)
    cvoicelog电话语音发送结果日志留空 系统自动回写

    2、调用推送服务,推送消息

    标准版推送地址:http://平台地址/smsservice/batchsend.asmx,方法名:BatchSendWxMessage

    微云版推送地址:http://平台地址/focusapi/BatchSendWxMsg

    可将服务配置到定时任务,实现消息定时自动发送。

    电话语音通知

    电话语音是指通过拨打电话的形式对提醒或者预警消息进行推送,系统自动记录发送日志和接听状态。

    bs_wxmessage中配置的bvoice为1的消息,都会以电话语音的形式推送

    配置点

    标准版:web.config中增加配置节,如下:

    微云版:appsettings.json中RestAPI节点下增加配置节如下:

    webAPI调用

    标准版:

    http://平台地址/smsservice/batchsend.asmx,方法名:SendVoice

    此请求为Web服务

    微云版:

    推送地址:http://平台地址/focusapi/Voice通过Post方式,参数分别为:mobile 【手机号】 content【通知内容】

    此api需要鉴权,鉴权方式参考平台对外接口说明

    日志

    语音消息发送日志在表 bs_voicesend

    桌面应用程序

    电子秤/地磅通讯

    1、设置串口参数

    image-20240816171520940

    2、定义窗体事件

    窗体事件 - 串口消息事件,通过data参数传入读数

    image-20240816171623236

     

    自定义类库扩展

    类库扩展是指对桌面应用程序进行功能扩展,从而增强本地交互能力,扩展的类库可以在网页中进行调用并获取到返回值

    三步走:

    1、自定义类工程

    自定义一个类库,如FocusPortal.UserPlugin,定义一个类,格式如下:

    编译后得到FocusPortal.UserPlugin.dll 文件,上传到桌面应用程序根目录

    2、配置文件

    桌面应用程序根目录下找到 plugin.json 文件,记事本打开,配置自定义类

     

    3、网页调用

    脚本写法

     

     

    高拍仪上传附件

    本功能必须基于桌面应用程序实现。

    高拍仪上传附件时,不能使用单据本身的附件上传按钮,需要自定义个新的按钮,在按钮事件中调用高拍仪接口。

    按钮点击打开拍照窗口:

    微信服务号集成

    集成参数设定

    服务号后台域名设定:

    1、JS接口安全域名设定

    image-20240126114303772

    2、网页帐号中的 [网页授权获取用户基本信息] 设定

    image-20240126114310245

    3、平台系统参数中配置“微信服务号”相关参数

    菜单挂接:

    常规菜单地址后面增加fw=1参数,如:

    http://bpm.sdfocus.com.cn/demo/focus/go.htm#/show?formid=d6025b28-5714-4743-84db-32d422b19886&fw=1

    打开连接时,平台会自动检查pb_operator表中copenid是否存在,如果为空,则会自动跳转到登录窗口,登录完成后,copenid字段会自动跟用户编号绑定,下次打开时即可免登录打开功能。

     

    要点说明:

    微信服务号中挂接的单据如果希望能够获取到登录信息,需要将对应的Form窗体设为“登录验证”

    设为登录验证的单据在服务号中打开时,会自动进行登录校验,如果未发现登录信息,会自动跳转到微信端的登录窗口,输入用户名和密码之后,完成登录的绑定,下次再打开单据时,会自动完成登录。

    如果希望能够跳转到自定义的页面(比如自定义的用户注册界面)而不是平台自带的微信登录窗口,可以在窗体的“登录失败”事件中获取到事件中的"openid"参数,然后携带该参数跳转到自定义页面,最终此openid能够写入到 pb_operator表 copenid字段后,也相当于完成了用户的绑定,下次再打开该单据系统会自动完成登录。

    微信服务号消息

    服务号消息应该使用模板消息来发送,否则会有推送数量限制,模板消息参考 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html#类目模板消息

    1、微信中申请模板消息模板ID

    2、微信中配置模板显示格式

    3、在平台 bs_wxsrvmessage 表中插入需要发送的消息

    字段名描述说明
    id唯一主键自定义生成
    cpercode接收人员编号人员表中copenid有对应值才可以,服务号中打开平台功能时会自动获取到
    ctemplateid申请的模板ID 
    cdata模板消息数据对应微信json数据的data部分,如下图image-20240126113255053
    curl消息对应url链接可为空,赋值后点击消息可打开链接页面
    ddate消息生成日期系统只发送距离现在时间不超过1小时的消息
    bsend是否已发送发送后平台会自动更新为1,插入消息时无需给此字段赋值
    cret发送返回值发送后平台自动更新,发送结果返回值

    4、调用平台的批量发送微信消息接口(BatchSendWxMessage)就可以完成推送

    构件方式推送服务号消息

    新建一个构件,引用wxinterface.dll程序集,发送代码如下

    SendTemplateMsg(cmd,usercode,strid,data,url) 参数说明:

    usercode:接收人编号(人员表中copenid有对应值才可以)

    Strid:模板编号

    url:消息链接地址

    Data:模板参数,如下部分

    image-20240126114122876

    微信/钉钉组织机构及人员相关API

    钉钉待办

    从8.8版本开始,待办事项在钉钉上会自动推送到钉钉待办中,配置点如下:

    1、通讯录权限

    image-20240711162545311

    2、待办应用权限

    5f65d91d11a6726a4d56757050a0ab7!](D:/wxfiles/WeChat%20Files/lw_lhs/FileStorage/Temp/5f65d91d11a6726a4d56757050a0ab7.jpg)

    3、用户表PB_Operator中 cddcode必须要填写钉钉通讯录中的用户编号

    钉钉端待办效果

     

    获取部门列表

    根据父级部门ID获取子级部门列表

    更新部门信息

    部门数据结构参考

    钉钉:https://open.dingtalk.com/document/orgapp/update-a-department-v2

    微信:https://developer.work.weixin.qq.com/document/path/90206

    删除部门

    获取部门人员列表

    获取人员详细信息

    更新人员信息

    人员数据接口参考

    钉钉:https://open.dingtalk.com/document/orgapp/user-information-creation

    微信:https://developer.work.weixin.qq.com/document/path/90195

    删除人员

     

     

    Form特性示例

    表格分页

    表格控件数据源可以为列表、ajax、script、自定义查询 几种

    如果表格控件数据源为列表,表格的分页会自动完成,只需设置下分页大小和分页方式即可

    如果数据源为非列表,分页方式定义如下:

    1、数据源返回结果中必须要有 focus_totalcount列,代表总记录数

    2、实现表格控件的"分页点击事件",事件中会传入新的页号参数pageno,通过这个参数,手动刷新对应的数据源

    示例:

    定义一个自定义查询数据源,sql中加上了分页条件,同时有一个 focus_totalcount(此处为了方便演示,固定为2000)

    image-20231011172203306

    编写分页事件

     

    容器数据绑定

    容器数据绑定是指做外层容器绑定数据源,根据数据源的记录数重复输出容器内容并进行容器内的数据绑定

    应用场景一般为动态重复输出复杂格式的内容,或者表体通过容器数据绑定来实现卡片式录入而不是表格式录入。

    支持数据绑定的容器

    只有”卡片“控件支持数据源绑定,将”数据绑定“属性开启,并选择对应的数据源,如下图

    image-20220910111849602

     

    卡片内部控件数据绑定

    卡片内部可以拖入其他控件如布局控件、文本框、图片、多选组、日期文本框等等,容器内部的控件绑定数据源方式为:在”绑定字段名“属性中,手动输入卡片容器数据源中的字段名

    image-20220910111920041

     

    容器内控件值变更事件

    容器内部控件的值变更事件统一在”卡片“控件的”值变更事件“中处理

    image-20220910111952330

     

    事件中如何获取当前行数据

    统一通过 this.currentitem 来获取当前行数据或者给字段赋值

    image-20220910112008299

    展现效果

    image-20220910112026366

    App更新策略

    如果想让app自动更新

    需要如下步骤

    1、将最新的app安装包命名为 app.apk,并上传至平台如下目录:

    微云版 : wwwroot根目录下

    标准版:程序文件夹根目录下

    2、更新bs_appver表为最新的版本号

    注:app版本号在 “我的”-“版本信息”中

    标准版使用iis作为服务,有时会有不支持apk扩展名文件下载的情况,请在iis 的 MIME类型中,添加类型支持,如下图

    image-20231228101207603

    APP相关API

    企业微信待办应用接收消息API配置

    配置位置:

    image-20231225174438641

    image-20231225174511222

    URL地址:

    1、标准版:http://平台地址/wx/corp.aspx

    2、微云版:http://平台地址/wx/CorpAuth

    Token:

    自定义或随机获取,需同步修改平台系统参数对应的Token

    EncodingAESKey

    随机获取并填写至平台系统参数EncodingAESKey下

     

    微信或钉钉挂接菜单导航

    为了统一微信、钉钉、App三端的入口页面风格,微信和钉钉菜单导航统一使用新版地址,如下:

    导航地址写法:

    1、http://平台根地址/focus/go.htm#/app 显示所有菜单编号以m_menu开头的菜单项

    2、http://平台根地址/focus/go.htm#/app?mcode=001显示菜单编号以001开头的菜单项

    如果挂接钉钉菜单,注意地址参数应该有agentid

    image-20220910112043046

     

     

    App扫码

    App上打开扫码,此函数是打开的手机摄像头进行扫码。

    扫码结果处理,Form窗体的 "form属性 - 事件 - App消息事件" 中填写扫码逻辑

     

    PDA扫码广播配置

    打开PDA页面,在桌面应用中打开扫描工具,在扫描工具中的应用配置中招待开发者项按钮点击后输入默认密码:888888后,可查看到具体的广播名称及键值。具体操作如下:

    1、在桌面应用中找到扫描工具。

    img

    2、进入扫描工具后点击应用设置后,在应用设置页面点击开发者项。

    img

    3、点击开发者项,输入默认密码888888后进入页面开发者项页面,可查看广播名称及键值名称。

    img

    4、点击app登录页面中系统设定。

    img

    5、在此页面将PDA中的广播名称配置到对应的广播信息中,保存即可。

    img

    PDA扫码事件定义

    App上打开扫码,此函数是响应PDA专用扫码头扫码。

    凡是支持广播的PDA或者RFID扫码都可以支持,推荐配置 6G+64G

    第一步:配置广播动作和广播标签,在 "App登陆界面-系统设定" 中配置

    第二部:定义消息处理函数,在 "form属性 - 事件 - App消息事件" 中编写业务逻辑

    App拨打电话

     

    App获取设备信息

     

    识别结果处理,参照App消息事件章节

    蓝牙小票打印机打印

    只针对特定型号:

    品牌:汉印

    型号:HM-Z3

    官网:http://cn.hprt.com

    打印指令参考:https://www.docin.com/p-2160105026.html

     

    需开启手机蓝牙(个别机型需同时开启定位服务)

    第一次打印时,系统会弹出打印设置对话框,如下图

    image-20220910112102663

     

    需要先点击“搜索打印机”,搜索成功后,点击“打印测试”,成功打印后返回即可。

    App定位

     

    address(res.address)地址数据结构:

    参数说明
    country国家
    province省份名称
    city城市名称
    district区(县)名称
    street街道信息
    streetNum获取街道门牌号信息
    poiNamePOI信息
    postalCode邮政编码
    cityCode城市代码

    识别结果处理,参照App消息事件章节

     

    App地图上选择位置

    选择结果处理,参照App消息事件章节

    关闭当前APP窗口

    添加手机联系人

    下载并打开文档

    App消息事件

    扫码或者获取位置后,需要进行相应的回调,从而获取函数执行结果,APP中的API是在App底座执行,执行完成后会以消息的形式发送到页面的窗体中的“App消息事件”当中去,在App事件中进行统一的消息处理。

    微云版消息事件定义位置:

    image-20220910112629699

    老版单据消息事件定义位置:

    单据格式加载后写如下代码:

    点击扫码按钮扫码回调示例

     

    发送事件消息:

    平台单据为标准的H5页面,H5页面跟App通讯通过消息事件的方式进行,比如 H5页面发起一个消息调用,APP执行完成之后通过回调函数通知H5页面。

     

    消息发起函数:

    注意:如果消息动作的API中需要使用变量,需要定义 data 消息参数,然后API中通过 data.参数名 获取值。

    示例:

     

     

    Form窗体用法:

    按钮点击打开扫码事件:

    Form窗体app消息事件

    老版单据用法

    按钮点击打开扫码事件:

    单据格式加载后事件

    #####

    数据展示

     

    组件内部对象

    一个组件为一组控件集合单元,为了便于复用,可以将常用的显示组合定义成一个组件,这样在定义dashboard页面的时候,可以直接建预定义的组件拖拽至页面当中使用。组件内部对象指的是组件内部不同控件之间进行联动的时候使用的对象,在关联刷新数据时,需要使用组件内部对象进行操作。

     

    刷新自定义组件

    在综合数据展现窗体中,刷新窗体中的自定义组件

    参数说明必填默认值
    partname组件名称 
    params组件参数,针对组件数据源,1、如果数据源为数据列表,则参数为查询编号 2、如果数据源为自定义查询,参数为sql语句中的{参数名},如 select coperame from pb_operator where copercode=‘{opercode}’,则opercode为查询参数 3、如果为Ajax请求或者自定义函数,则参数为数据源中定义的参数名。  
        

    大屏数据

    嵌套绑定

    嵌套绑定是指根据一个主数据源,通过预定义的显示模板系统自动循环输出相同格式的内容块,如下图:

    image-20220321152708707

    定义方式:

    1、拖入一个“卡片”控件作为模板容器,在卡片控件上选择需要绑定的数据源

    2、将相应的数据控件拖入卡片容器内部,将“使用父容器数据源”属性设为true,然后填写相应的绑定字段

    卡片控件设置如下图:

    image-20220321153113259

    模板内容

    image-20220321153200857

    模板内控件事件中获取当前行数据的方法:

    地图

    控件Json结构

    示例数据源:

    配置项

    配置项说明 
    默认显示地区名称地图打开时默认展示的地区,一般为中国或者各省、直辖市名称或者地级市县名称 
    子地名字段数据源中对应显示子地名的字段名,一般为默认地区所属的地市或县名称 
    值字段子地名对应的数值字段名 
    默认图层颜色无数据的地区图层显示颜色 
    边线颜色图层边线颜色 
    显示虚拟化视图地图左下角显示最大值到最小值颜色变化趋势的图 
    最大值数值最大值 
    最小值数值最小值 

    事件

    clickevent :地图点击事件

    参数名说明
    para当前元素数据,para.name:当前点击地名,点击事件中通过 this.config.areaname=“山东”来修改当前默认显示地图
      
      

     

    控件

    宫格导航

    控件Json结构

    示例数据源:

    配置项

    配置项说明 
    字体大小每个元素下面显示文本的字体,为数字类型 
    元素占用栅格数每个元素占用几个栅格,横向一共24栅格,如果设置为6,则一行最多显示4个元素 
    元素宽度每个元素的宽度,数字类型 
    元素高度每个元素的高度,数字类型 
    数据源数据源格式必须为数组,如:[{icon:'icon iconfont jhui-RectangleCopy16',label:'测试1',color:'green'},{icon:'icon iconfont jhui-RectangleCopy16',label:'测试2',color:'blue'}] 
    显示文本字段名文本显示部分需要绑定的字段名,如 label 
    显示图标字段名对应的字体图标字段名,如 icon 
    显示颜色字段名每个元素的背景色字段,如 color 

    事件

    clickevent :元素点击事件

    参数名说明
    data当前元素数据,通过 data.属性名 或者 data[属性名] 来获取属性值
      
      

    卡片菜单

    卡片菜单一般用于显示模块内部的功能导航或者一些业务上的局部导航,也可以用作列表数据显示

    卡片菜单可以放在带数据源的卡片控件中循环输出,也可以作为普通控件独立使用

    1、作为普通控件独立使用

    选择数据源 》填写标题字段、值字段 》 定义点击事件 》完成

    效果:6e866eafa399d8031ad883dafa3eb62

    2、使用卡片数据源

    卡片菜单控件在带数据源卡片控件内部,根据当前行数据动态显示不同数据

    勾选开启菜单卡片的”容器绑定“属性 》选择数据源 》填写内容标题字段、值字段、卡片标题字段 》 定义点击事件 》完成

    image-20230526171943415

    思路:卡片菜单数据源仍然使用一个总的数据源,在”行过滤事件“中根据卡片控件当前行数据在卡片菜单数据源中进行过滤,并返回过滤之后的结果数组,如下图:

    image-20230526172420659

    image-20230526172546761

    运行结果:

    image-20230526172741038

    自定义构件中使用日志

    说明:

    core版需要引用 Focus.Common.dll 、log4net.dll程序集

    framework版需要引用Focus.Log.dll、log4net.dll程序集

    微云版注意事项:为保证运行时环境相关dll资源的正确使用,建议通过平台的扩展插件工程 Focus.UserPlugins进行自定义构件扩展,下载链接:

    http://jh.focusinsoft.com/Focus.UserPlugins.rar

    即时通讯

    简介:平台即时通讯为web端的通讯工具,简称“聚微讯”,可通过点击右上角通讯图标直接打开,界面风格类似微信界面,可点对点进行消息通讯。

    部署方式

    独立的部署方式,服务器必须安装.net core3.1以上,将chat程序文件拷贝到服务器,点击Focus.Soket.exe打开服务窗口即可,在appsettings.json中配置数据库连接以及启动端口号,如果多个服务运行在同一个服务器,应该将Redis配置节下面的InstanceName修改成不一样的,防止缓存信息共用。

    平台中引入即时通讯的方式

    在平台“系统参数”设置中,填写即时通讯服务地址即“Soket地址”字段,比如“http://bpm.sdfocus.com.cn:8001/

    消息隔离区域

    消息隔离区域是指平台为了能够处理不同场景的即时通讯需求,比如SRM中的即时通讯、平台用户自身的即时通讯、售后管理中的即时通讯等,每一个模块可能都有独立的用户体系,不同模块之间即时通讯都是独立的,因此加入了消息隔离区域的概念,不同的隔离区域编号对应各自一套用户体系,相互之间互不影响。

    隔离区域通过后台表控制,表名:bs_imuser

    表结构

    字段名描述
    id主键字段
    cregion区域编号
    cusercode用户编号
    cusername用户名称
    cdefine1自定义项1
    cdefine2自定义项2
    cdefine3自定义项3
    cdefine4自定义项4
    cdefine5自定义项5
    cdefine6自定义项6
    cdefine7自定义项7
    cdefine8自定义项8
    clockfilter通讯录条件

     

    上图为隔离区域为001下面所有的用户

    clockfilter用法:上图所示,001用户能够看到cdefine1为0的所有用户,除001之外的用户只能看到001用户,也就是说他们只能跟自己能看到的用户进行聊天,从而控制了不同人员之间的聊天权限。

    打开即时通讯窗口

    即时通讯窗口也就是一个url地址,地址中需要标识隔离区域编号和当前用户

    地址格式:

    http(s)://消息服务地址/chat/go.htm#/chat?info=参数

    info参数格式:[区域编号,当前用户编号] ,即用逗号隔开的两个值合成的字符串,然后进行encode编码

    示例:

     

    API消息发送

    平台支持通过调用web API的形式进行消息发送,具体可以登录消息服务地址

    http(s)://消息服务地址/swagger/index.html

    例如:http://bpm.sdfocus.com.cn:8001/swagger/index.html

    API地址:http(s)://消息服务地址/chat/send

    消息参数:

    参数名:message

    参数值:{region: "system",From: "admin",FromName: "超级管理员",FileName: "",FileSize: "",To: "demo3",message: "你好",id: "123123",type: "text"}

    参数名参数说明其他说明
    region隔离区域编号 
    From发送者编号 
    FromName发送者名称 
    FileName文件名称 
    FileSize文件大小 
    To接收者编号 
    message消息内容 
    id消息ID最好使用GUID
    type消息类型text / image /file 三种

     

    插件管理

    插件是指在平台标准功能中可以插入式调用的自定义功能逻辑,构件属于插件的一部分,插件功能包括:ERP(u8、金蝶云星空、U9)接口封装、web服务调用、web API调用、自定义程序集调用、存储过程调用七大部分。

    插件管理包括插件数据集定义、插件定义和单据插件配置三大部分。

    插件的目的就是为了打通平台对其他系统的调用接口。

    插件数据集定义

    插件数据集是指插件中所使用的数据来源定义,可理解为查询一个带有主从关系或者单主表的数据,在执行插件前,系统会先进行数据集的获取,插件中可以根据数据集自定义组织参数信息。

    入口: 控制面板 -- 开发定义 -- 插件数据集定义

    1、添加数据源,在左上角点击“添加数据源”按钮,填写数据源编号、名称信息

    2、添加数据集,点击右上角“添加数据集”按钮,弹窗中输入数据集定义,一个数据源中只允许有一个“数据主表”,并且只能有一个主键字段,支持“SQL语句”和“存储过程”两种查询方式,根据自己的实际情况,分别组织主表数据查询和其他子表的数据查询

     

    插件定义

    入口:控制面板 -- 开发定义 -- 插件定义

    类型说明:

    1、金蝶云星空

    账套ID、授权用户、授权应用ID、应用秘钥、服务URL地址为必填项,均为云星空提供的接口参数,FormID为对应接口单据标志,从官方API文档获得,动作包括增删改、提交、审核等等,代表需要执行的操作。

    表体“参数信息”中,配置需要用到参数,如单据保存方法

    上面代码中,client.Save(formId,jsonData) 为保存函数,第一个formId表头已经配置过,那么参数信息中,只需要配置一个参数就可以了,参数编号及名称自定义填写就可以,勾选“取值逻辑”,然后点击“逻辑设定”按钮,打开脚本编写窗口(标准js语法),组织jsonData参数,最终返回json结果,示例:

    2、Web服务

    填写 Web服务地址,如 http://***/websrv.asmx?wsdl ,填写Web服务中的方法名

    “参数信息”中,组织Web服务方法所需要的参数,如果方法需要2个参数,则需要添加两行,参数的顺序要跟方法中的参数顺序一致,参数名自定义即可。

    3、Web API

    填写Web API的Url地址,请求方式可选择 GET或POST

    “参数信息”中组织请求参数,有几个参数填写几行,其中参数名要跟web api的参数名保持一致。

    4、程序集

    建立c#类库项目,按照要求添加dll引用,按照“类型”提示信息,实现相应的接口,编译后拷贝到 根目录/bin(标准版)或者根目录下面(微云版)

    如果选择的类型是“其他”,需实现Iplugin接口,接口定义如下

    其中args参数为数组,“参数信息”中定义的所有参数都会传到args参数中,提供程序中调用访问。

    5、U8

    首先在 控制面板 -- 集成定义 -- 单据标准接口/凭证标准接口 中配置U8接口,然后在此处“U8 EAI”编号出填写上接口编号就可以。

    6、U9

    待完善

    7、存储过程

    填写“存储过程名称”,类型中,如果是单据标准存储过程接口部分,选择对应的接口类型即可,如果选择“其他”,则“参数信息”中定义的参数,都会作为存储过程参数传入到自定义存储过程中。

    关键点说明

    1、执行前存储过程

    此存储过程会在插件正式执行前执行,存储过程参数: @code varchar(20)【接口编号】,@keyid varchar(60) 【数据源主键ID】

    必须返回包括bignore字段的单行数据集,1表示继续插件执行,0表示跳过执行,一般用于避免一个接口被重复执行

    2、执行后存储过程

    此存储过程在插件执行完毕后执行,存储过程参数: @code varchar(20)【接口编号】,@keyid varchar(60) 【数据源主键ID】, @retkey varchar(200) 【接口返回值关键信息】接口调用成功后才会执行,并且在一个独立数据库事务中运行

    一般在此处记录插件执行日志,因为在一个独立事务中,所以不会跟随回滚,比如调用接口生成一个单据后,将生成的单据ID记录到一个中间表,后续如果发生重复调用,在执行前存储过程判断跳过即可。

    3、执行后逻辑

    纯js的逻辑判断,比如调用金蝶云星空单据保存接口,接口返回值是一个json对象,如下:

    image-20230816144047737

    执行后逻辑应该如下编写:

    说明:执行后逻辑如需调试,须通过日志的形式进行查看,日志查看请参考下面的”脚本日志“章节。

    4、插件测试

    点击测试按钮,在“数据集主键值”中输入需要查询的数据集查询主键值,系统会显示执行日志,如下图

    image-20230816151025289

    单据插件配置

    单据插件配置是将定义好的插件,在对应的单据标准接口上进行挂接,一个接口可以挂接多个插件,按照配置的顺序号执行对应的插件,插件执行如果有异常,则会回滚当前接口的事务,需注意的是,由于插件是调用的外部系统,如果连续调用多个插件,前面有执行成功的,是不会自动回滚的。需结合日志记录来在插件中判断是否需要执行插件。

    如果执行的是标准接口插件,比如实现了一个保存后构件或者保存后存储过程,配置到了插件当中,那么插件的“类型”要跟此处的“动作”保持一致,这样的话标准的构件参数或者存储过程参数才会对应传到自定义构件和存储过程里面,否则只会使用插件中的“参数信息”中的参数。

    逻辑设定脚本使用说明

    逻辑设定中,使用的都是标准的js脚本,在脚本中允许访问数据集,数据集作为一个或多个参数可以在脚本中直接使用,参数名即为数据集编号,如插件对应的数据源中有一主一从两个数据集,编号分别为 sobillm 和 sobillc,如下图:

    image-20230816152659843

    那么可以通过 “主数据集编号.字段名” 可以访问数据集字段值;通过 ”子数据集编号.length“可以访问子数据集行数,示例:

    脚本日志

    脚本日志用于查看或者跟踪自定义js脚本,包括 插件定义 中的参数信息中写的逻辑定义以及执行后逻辑

    插件定义中点击“开始测试”时,详细脚本执行会记录在 平台根目录/logfile文件夹下最新的debug.log文件中,如下图所示

    image-20230816162811215

    js代码中如需记录日志,用法如下

    示例

    日志

    image-20230816163732675

    如何强制开启日志

    浏览器打开如下地址:

    1、微云版: http://平台地址/plat/pluginlog

    2、标准版:http://平台地址/sysplat/dataget/data.ashx?type=pluginlog

    插件调用方式

    提供了2中方式的插件调用:

    1、跟随单据的标准接口调用,如单据的保存前、保存后、提交前、节点审批等标准事件中。

    2、独立调用,通过url地址进行调用,此种方式适合在前端做一些数据的接口查询

    标准版:http://平台地址/sysplat/dataget/data.ashx?type=plugin&code=插件编号&key=数据集主键值&test=0,test代表是否测试状态,取值1/0

    标准版:http://平台地址/plat/plugin?code=插件编号&key=数据集主键值&test=0,test代表是否测试状态,取值1/0

     

    自定义登录验证

    标准版:

    添加CommonClass.dll引用

    1、创建类库项目,实现ILogin接口

    2、编译的MyLogin.dll 拷贝至平台bin目录

    3、修改web.config

     

    微云版

    添加Focus.Common.dll引用

    1、创建类库项目,实现ILogin接口

    2、编译的MyWebAPI.dll 拷贝至平台bin目录

    3、修改appsettings.json

     

     

    如何注入自定义服务(微云版)

    第一步定义服务接口,如下:

    第二步实现服务接口,如下:

    第三步配置依赖文件

    详见“如何自定义扩展WebAPI”章节中的“其他注意点”

    第四步拷贝dll文件至平台根目录

    第五步配置appsettings.json文件,如下图:

    第六步启动平台web服务

     

    自定义web请求扩展

    自定义web请求是指基于平台本身已经提供的标准请求之外,新增个性化的其他自定义web请求,扩展方式如下:

    1、标准版(Framework) ,参考 ”如何自定义Web请求“ 章节。

    2、微云版(core),参考 ”如何自定义扩展WebAPI“ 章节。

    如何自定义Web请求(标准版)

    本功能适用于聚恒中台标准版

    1、新建一个自定义类,并继承类FocusBaseRequest ( 位于CommonClass.dll ),重写 DoRequest方法

    2、编译类库,生成dll,如 MyWebRequest.dll

    3、拷贝dll至平台bin目录下

    4、配置请求路径

    打开表bs_customrequest,新增一个请求路径,如下

    id(主键)ckeyrequest(请求关键字)cassembly(程序集名称)cclassname(类全名)bsystem(系统预置)
    1myorderMyWebRequestMyWebRequest.OrderReq0

    5、web请求方式

    url地址:http(s)://平台地址/sysplat/dataget/data.ashx?type=myorder&optype=getorderdata

    说明:

    a) 通过type=myorder来匹配 bs_customrequest中定义的请求关键字,如果符合会实例化MyWebRequest.OrderReq类

    b)通过optype=getorderdata 来作为DoRequest方法中的请求标识,不同的请求标识进入不同的处理逻辑,最终返回处理结果

     

    如何自定义扩展WebAPI(微云版)

    本功能适用于聚恒中台微云版

    第一步 新建.net core3.1 版本类库项目(如MyAPI)

    1、添加Microsoft.AspNetCore.Authentication.JwtBearer.dll,Focus.DBFactory.dll,Focus.Common.dll ,Focus.Logger.dll,Focus.Cache.dll 引用(位于平台根目录)

    2、为了能够使用Web特性,在工程配置文件中修改配置,如下:

    a、 修改为

    b、修改项目输出类型为类库

    第二步 新建一个类文件

    1、继承类

    类名以Controller结尾,如 homeController

    如果不需要鉴权,则继承Microsoft.AspNetCore.Mvc.Controller 类

    如果需要鉴权,则集成 Focus.Common.FocusWebAPIController类

     

     

    说明:如果需要鉴权,则在客户端需要先获取token,然后请求webapi时,在header中携带token

    获取token方法:

    URL:http://IP地址:端口号/token/get?username=用户名&password=md5加密后的密码

    例如:http://localhost:8877/token/get?username=admin&password=d9f6e636e369552839e7bb8057aeb8da

    返回值:{"token":"F9JetsbLCNnfqNAFgvVpQO7o1YWtSJ6dRCOyW7Z7mnONjjj///+gLw4sKExL77v8LPNqd1+T/gkbZiwe2vueHcMnfBM7eg0s9RRHzEdo/laPukCelBd1dBQ4NWZdBpiZvDkEOzP9WtpuqLy0644YMwvuwMfM6Wxi1Tw4zAOPPmN1pslWIsPJKA3yRITfBcsyWeSW2Y+grCcA52eH4kQ07z6nVT0ShDFLJ2Ca/JmOO0saPevzDyp8GBlHeDSWw462B4bHpAbHSLGG7+iHbiDhxDGIesRFLfAbHDHplS56wuWzTx2mdrP5l6yI5aJ/j4RECwqxAVJVj8gQl6h+o/YCG72NoqRa5uxQdEDg/vOk3bFHp2rjH06KkDFgsd6oahp69YCxUTpyM1VzcjgiWGZ38GeM+0W/2r4A8rUMhuDNas6fy7J1rvp2851PvpQZNJruQ4B0ZiPpPy9QvIVr/vzUZUM/GSdBwOPxDIy5cgD6ualfaR5zTfuey/2H30U3GKNzA78f9wYPHWWH0YmwvGrEVDIsx66rOEcHwJVNp4XNX512XJRoGsH5OFoTMSYbhWHMOKCizbk192u87/j2yZeKZf+bBom4YRcXXZgSICWy51Ycm1OsjfdOXPojDa0zGQACIHc1bWaqA1aqM35I5SW9tZz8x8QCFWybfFT7vLEkRGRPXMEOFq+JSWtQDC9pUWJGdNhM9g/pvPjQegNScJfy7Lb1a7cuYxS+eSMijfi+1VvU+5BV+Agvmki3yN6imtUd7vx9qKgbRwP/eMsYmukDC2AncyExwEGEL5nKhANumWN1Zt2rCox+eo7+72/6kZZI6KQIIGsf/GUadiTAqr1FfcMrUp0kDC2KwPpCaRcpr/H69lm6lUAsNM+2AmvFKUB3SxG4+n6R/5jg6u/ZDs4gLSYnzMQKuUBhE/B7Rrsmq8PR5T6PHXF6MjsmLH0Z7odfJC/zlBF7Rm4x2EHAv7jRvgcNhEkK8wNxzkeIdE36TENmceNQxWIuNz+TE5VrfGpwysA7GgLHrSzhxSRICEFk7TulcS1QL+lrEdr2q8m/F0fPskYGUgL/O2Yfslx2g2+oro7L9FTSCr/lmBNnpJ9LoSyt7PTyKzfYiznztstwILCI1hpC1HbcOEJGP9CtnFZvVhNJ9ua5FRl0XxojVXEYqe9s87WebaaVGgs7kdUXlad/xkdyqBq4iaBzIYd463yafnkKQxfrTO6+duyrecgSg0NXzSyfRL/vfZgEiThW5tY=","errorCode":"","msg":""}

     

    2、配置依赖注入项

    在类的入口方法中配置,如果不需要处理数据库,可以删掉入口函数

    4、编写自定义API方法

    方法最好使用示例中的异步方法。

    可以通过 http://ip:端口/MyTest/test地址进行测试

    如果在平台内部脚本访问,通过this.getRemotData 函数,比如

    如果需要获取当前登录信息,通过如下代码:

     

     

    第三步 编译完成,生成类库dll

    第四步 拷贝生成的MyAPI.dll文件至平台根目录下

    第五步 配置文件

    打开平台根目录 appsettings.json,在“UserAPI”配置节中填写dll文件名称,多个用逗号隔开

    第六步 启动平台服务

    双击FocusApp.exe启动服务

     

    单点登录

    先进行登录验证,验证通过后跳转至相应的地址

    登陆验证

    返回值:

    地址跳转

    示例:

    注意事项:

    单点登录密码一般最好单独设置,在“用户管理“界面的”单点登录密码“字段;通过单点登录函数和token获取时,都支持使用单点登录密码。

    平台对外接口(FrameWork版)

    单据提交

    地址:http://平台地址/sysplat/dataget/data.ashx?type=srv_flowcommit&vo=ws_bil&key=646b9cb2-e71c-49fb-97ae-1cca6ccf2ce7&comtype=1&formid=&usercode=admin&userpwd=d9f6e636e369552839e7bb8057aeb8da

    参数说明:

    参数名参数说明其他说明
    type固定值:srv_flowcommit 
    vo单据类型 
    key单据ID 
    comtype1:提交 0:取消提交 
    formid如果是新版单据ID,为空则为老版单据 
    usercode用户编号 
    userpwd审批人登录密码(对应pb_operator的cjwtpwd字段值 

    返回值

    单据审批

    地址:http://平台地址/sysplat/dataget/data.ashx?type=srv_flownodevery&usercode=demo&userpwd=123&version=version&nodeid=nodeid&memo=memo

    参数说明:

    参数名参数说明其他说明
    type固定值:srv_flownodevery 
    usercode审批人编号 
    userpwd审批人登录密码(对应pb_operator的cjwtpwd字段值 
    version审批实例版本号 
    nodeid审批节点id (对应bs_flowdetail的cnodeid) 
    memo审批意见 

    返回值

     

    平台对外接口(core版)

    平台对外接口提供第三方调用,以WebAPI的方式提供,包括单据保存接口、单据删除接口、获取单据数据接口、提交审批流接口,

    接口在线接口文档

    http://平台地址/apidoc,可在在线文档中进行接口测试,注意点:必须先登录平台才可以测试

    调用接口的步骤分为两步:

    1、根据用户名和密码获取token

    2、携带token 发起调用请求

     

    获取token

    请求地址:http://平台地址/token/get?username=admin&password=123

    参数说明

    参数名说明是否为空
    username用户名
    password密码,md5加密后的原始密码或者jwt密码(pb_operator中的coperpwd或cjwtpwd)

    返回值格式

    特殊说明:如果是在平台内部通过脚本调用,则不需要获取token这一步骤。

    PostMan示例

    image-20230907091615193

     

    调用接口

    单据提交接口

    请求地址:http://平台地址/api/open/commit

    请求方式:post

    提交方式:

    form参数

    参数名参数值
    voucherno单据类型编号
    keyid单据ID
    formid单据对应的窗体ID
    flowcode审批流编号,一般同voucherno

    示例:

    设置token

    image-20230907091822100

    配置form参数

    image-20230907092142438

    单据审批接口

    请求地址:http://平台地址/api/open/approve

    请求方式:post

    form参数

    参数名参数值
    voucherno单据类型编号
    keyid单据ID
    formid单据对应的窗体ID
    nodeid审批节点ID
    memo审批意见
    ispass审批状态(1-通过 0-驳回)

    示例:

    PostMan示例:

    设置token

    image-20230907091822100

    配置form参数

    image-20230907091936069

    单据数据查询接口

    请求地址:http://平台地址/api/open/get

    请求方式:get

    参数说明

    参数名说明是否为空
    voucherno单据类型
    keyid单据ID

    示例:

    http://localhost:51249/api/open/get?voucherno=pu_bill&keyid=18abc39e-dc30-4233-800c-a646ab3c0eab

    image-20220910112729460

    返回值:

     

    单据保存接口

    请求地址:http://平台地址/api/open/save

    token传值方式:参考单据数据查询接口

    请求方式:post

    参数说明

    参数名说明是否为空
    data单据数据

    data数据格式:

    示例:

     

    单据删除接口

    请求地址:http://平台地址/api/open/delete

    token传值方式:参考单据数据查询接口

    请求方式:post

    参数说明

    参数名说明是否为空
    data单据数据

    data数据格式:

    示例

    数据集成管理平台

    数据集成管理平台支持基于不同异构数据源的数据抽取、转换、清洗、汇总、排序,经过一系列的数据处理,将最终数据输出到数据仓库或者excel文件,或者形成一个Json结果集来提供前端使用。

    数据集成管理平台分为ETL任务流程设计和任务编排设计两部分。ETL任务流程设计允许你通过可视化流程处理节点来进行数据的抽取转换定义及输入输出定义;任务编排设计允许你以每个ETL任务为节点,可视化进行任务的执行流程定义。

    部署方式

    数据集成管理服务以微服务的形式存在,可以配置与微云版或者标准版平台进行关联。

    微服务名称:Focus.DataCore

    appsettings.json配置

    1、配置端口号,如 6001

    2、配置应用服务信息 HostUrl和HostType

    参数说明示例
    HostType应用服务类型framework(标准版)、core(微云版)
    HostUrl平台应用服务地址http://localhost/plat 或者 http://localhost:8877

    image-20230711092910735

    双击Focus.DataCore.exe 启动服务

    image-20230711092457818

     

    Web应用服务配置

    1、微云版:修改appsettings.json文件,在RestAPI下添加配置节

    image-20230711093153114

    2、标准版:打开web.config,在appSettings下添加配置节

    image-20230711093448970

     

    ETL任务调用方式

    1、标准版

    地址:http://平台地址/sysplat/dataget/data.ashx?type=datacoretask_run&taskcode=ETL任务编号

    2、微云版

    地址:http://平台地址/plat/DataCoreTask_Run?taskcode=ETL任务编号

    流程编排调用方式

    1、标准版

    地址:http://平台地址/sysplat/dataget/data.ashx?type=datacoreflow_run&flowcode=流程编排编号

    2、微云版

    地址:http://平台地址/plat/datacoreflow_run?flowcode=流程编排编号

    Excel文件输入输出说明

    ETL流程中,Excel/csv输入和Excel/csv输出节点中,文件统一通过应用服务进行存取

    1、Excel/CSV输入,在 bs_excelfile表中插入新增的Excel文件信息,包括文件名及保存路径,bread字段默认为0,cextend字段填写 excel和csv二选一, cclass为自定义值,可以再输入节点中按照“分类编号”或者“文件名”来获取指定文件

    image-20230711104604770

    2、Excel/CS输出,数据集成微服务在计算流程后,如果有excel输出节点,系统会将文件自动上传到应用程序目录:位于 根目录/wwwroot/datacorefiles文件夹(微云版),根目录/datacorefiles文件夹(标准版),同时会在表bs_excelout中生成文件信息,如下图

    image-20230711105140101

    bs_excelout字段说明(Excel/CSV输出表)

    字段说明 
    cfilename原始文件名 
    cfilename1文件夹中的文件名 
    ddate生成日期 
    cprocodeETL流程编号 
    cversionETL流程计算实例ID,对应bs_datatask实例计算表 

    bs_datatask字段说明(ETL计算实例表)

    字段说明 
    cprocodeETL流程编号 
    cversionETL流程计算实例ID 
    dbegin计算开始时间 
    dend计算完成时间 
    cexception计算错误信息 
    bsuc计算成功标志 

     

    WebAPI接口平台

    webapi接口平台提供外部系统的api接口调用,接口为标准的restful接口,将数据资产通过接口的形式对外提供服务。

    Web API接口平台通过独立的web应用程序对外提供服务,不依赖于FocussApp应用服务。

    接口定义两步走

    1、定义接口端点和用户,端点是一种分组的概念,比如为不同的系统调用指定不同的端点,端点下面建立用户信息并设定用户密码

    2、定义接口,接口分为三大类:(a) 平台模型级(包括数据模型和数据列表)、(b) 数据库操作级(增删改查)、(c)构件级(自定义webapi构件)

    授权用户管理

    1、添加端点

    端点即用户分组,方便用户的管理,比如分别为HR系统和CRM系统建立两个端点,两个系统的接口用户分别建在对应端点下面

    image-20221207113300151

    密钥为自定义的一个字符串,建议具备一定的复杂度

    2、添加用户

    选择一个端点,新加用户,用户必须从平台的操作员中选择,密码单独指定,API用户的密码与平台操作员登录密码各自独立,用户编号共享。

    image-20221207113559186

    API接口管理

    api接口管理用户自定义不同类型的web api接口,可以灵活的进行停用启用以及设定权限验证

    接口新增

    接口分为:单据查询、单据保存、单据删除、数据列表、自定义查询、数据更新、数据删除、自定义构件、树形结构几种

    image-20221207114003506

    接口定义时,系统会自动生成调用示例代码和返回值格式,如上图。

    接口类型说明关键填写项请求方式权限验证
    单据查询平台单据对外查询接口数据模型、路由可选可选
    单据保存平台单据对外保存接口数据模型、路由post验证
    单据删除平台单据对外删除接口数据模型、路由post验证
    数据列表平台列表对外查询接口数据列表、路由可选可选
    自定义查询通过sql语句提供对外查询接口路由、SQL语句、请求参数可选可选
    数据更新通过update语句提供更新数据服务路由、SQL语句、请求参数可选验证
    数据删除通过delete语句提供更新数据服务路由、SQL语句、请求参数可选验证
    树型结构通过sql语句返回一个树形结构的json路由、SQL语句、请求参数可选可选
    自定义构件通过C#编写webapi控制器,对外提供服务路由可选可选

    具体每种接口需要组织什么格式的参数,请参考自动生成的请求示例代码。

    相关日志表

    1、bs_openapilog 记录每个接口的调用信息,包括日期、调用人、接口ID等

    2、bs_openapilog1记录异常接口调用或者请求处理超长的接口调用信息,ctype :error(错误) overtime(超长响应)

    Web API服务部署

    webapi作为独立的微服务应用,可以单独部署到独立的服务器,也可以部署为集群应用,部署方式如下:

    架构示意图

    image-20221207131851300

    从上图可以看出,标蓝色的即为需要部署的服务

    网关服务:总服务端口,通过网关服务统一对外提供授权服务和api服务

    授权服务:根据定义的授权用户信息请求授权服务进行权限的验证和授权信息的获取

    api服务:web api应用服务,自定义的所有的webapi统一通过这个服务进行处理

    配置服务:用于记录全局的配置信息,比如数据库连接信息、缓存配置信息、端口号配置信息等,授权服务和api服务在启动时,自动从配置服务上获取相应的配置信息,从而避免了为每一个微服务单独进行信息的配置(appsettings.json配置信息)

    1、部署配置服务(Focus.ConfCenterAPI)

    打开appsettings.json文件,分别配置授权中心地址和数据库连接信息,如下图

    image-20221207132745855

    配置中心地址是共享给webapi服务使用,web api在处理请求时,会自动根据这个地址请求授权服务进行权限验证

    数据库连接信息是给所有服务使用,授权服务和webapi服务都会根据配置信息连接相应的数据库

    启动参数是给配置服务自己使用,指定配置服务的端口号

    配置完成后,双击Focus.ConfCenterAPI.exe启动配置服务,本示例指定端口号:8001,如下图

    image-20221207133222408

     

    2、授权中心服务(Fous.IDServer)

    打开appsettings.json,配置启动参数和配置中心地址,如下图

    image-20221207133455943

    配置中心地址即为第一步打开的配置中心服务地址 http://localhost:8001/,如下图

    双击Fous.IDServer.exe启动授权中心服务,此示例中端口号为7001

    image-20221207134923895

    3、Web API服务(Focus.OpenAPI)

    打开appsettings.json,配置启动参数和配置中心地址,如下图

    image-20221207135322865

    从配置服务中读取 DbOption和IdServer(授权服务地址)两个配置节

    双击Focus.OpenAPI.exe启动服务,本示例 webapi应用服务的端口号设定为8877

    image-20221207140242422

    4、网关服务(Focus.GateWay)

    以上3个步骤分别配置好了配置服务、授权服务、webapi服务,由于每个服务都有一个独立的ip地址和端口号,如果直接暴露给外部进行调用,存在比较大的安全隐患,同时多个地址和端口在开发调用时,也会比较混乱,网关服务则是把不同的内部请求地址变为对外统一的请求地址和端口,通过不同的路由来区分服务即可。

    打开OcelotConfig.json文件配置路由信息

    image-20221207144220252

    配置启动端口信息,打开appsettings.json

    image-20221207144311041

    双击 Focus.GateWay.exe 启动网关服务,如下图

    image-20221207144359409

    完成最终部署

    请求授权示例

    通过网关路由配置,我们可以得知,通过http://localhost:9001/auth/.... 这个路由,就会请求端口号为7001的授权服务,授权请求方式如下

    image-20221207145049745

    通过http://localhost:9001/focusapi/.... 这个路由,就会请求端口号为8877的web api服务,如下示例

    webapi定义:

    image-20221207162403455

    PostMan请求:

    image-20221207162602666

     

    image-20221207162638802

    如何配置启动参数

     

    启动端口设置

    修改 appsettings.json 文件,如下图

    image-20220910112744567

    IsHttps:是否启用SSL证书,必填

    CertName:证书名称(证书文件必须放在程序根目录,IsHttps为true必填)

    CertPwd:证书密码(IsHttps为true必填)

    ServerIP:应用IP地址,填写*代表任意IP

    ServerPort:端口号,必填

     

    启动命令

    两种方式启动:

    1、双击FocusApp.exe

    2、通过命令行 dotnet FocusApp.dll

    系统日志

    日志文件默认存放在根目录 logfile文件夹下,按照日期存储。

    系统日志分为四部分:普通信息日志、警告信息日志、错误信息日志、调试信息日志

    1、普通日志 *_info.log:

    微云版(core):appsettings中设置节点AppInfo-ActionLog 为true

    标准版(framework):增加配置节

    系统记录每次请求的概要信息以及耗时

    2、警告日志 *_warn.log:系统中警告信息集中存储位置,一般记录处理时长超过3秒的请求信息。

    3、错误日志 *_err.log:系统所有异常信息的存储位置

    4、调试日志 *_debug.log:

    微云版(core):appsettings中设置节点AppInfo-Debug为true

    标准版(framework):增加配置节

    一般在调试系统时启用,调试完毕后要及时关闭,系统记录每次请求的参数信息以及请求的返回结果。

    其他说明

    如果有存在超过3秒的长时请求,系统会在控制台实时显示预警,同时会记录警告日志。

    审批流程日志

    审批中执行构件或者存储过程的日志记录,日志文件位置

    微云版:logflow文件夹下

    标准版:focuslogs文件夹下,web.config 把flowlog设置为1

    微信/钉钉接口调用日志

    微信或钉钉在后台调用接口的日志记录,通过日志可以判断接口配置问题,日志文件位置

    微云版:通过 httpp://IP地址/plat/wxlog 打开日志记录,日志文件位于 logfile文件夹下

    标准版:web.config中,设置msglog项为1,日志文件位于 根目录\msglog_wx.txt 及 msglog.txt

    App消息推送日志

    平台App推送消息日志记录,通过日志可以判断接口配置问题,日志文件位置

    微云版:logfile文件夹下,文件名 日期_info.log,需在appsettings.json文件将 AppInfo-AppmsgLog 配置为true

    标准版:web.config中,设置msglog项为1,日志文件位于 根目录\focuslogs\msgpush日期.txt

     

     

    开启SQL跟踪

    只对.net core版有效

    url地址:

    type为1时为开启跟踪,为0关闭跟踪

    为防止开启后忘记关闭,导致性能下降,系统开启跟踪十分钟后会自动关闭,需要手动再次开启

    sql跟踪结果路径:[平台程序根目录/sqllogfile] 文件夹