1、后端代码
介绍
参照类型不同继承不同Action
树型参照:DefaultTreeRefAction
表型参照:DefaultGridRefAction
树表参照:DefaultTreeRefAction,DefaultGridRefAction。(两次请求,一次请求走树形参照action,一次请求走表形参照action。)
代码示例:
表型参照:
注:我这里sql是作为表使用,所以使用了括号进行拼接
package nccloud.grid.ct.contructionpermit;
import nccloud.framework.web.processor.refgrid.RefQueryInfo;
import nccloud.framework.web.ui.meta.RefMeta;
import nccloud.web.refer.DefaultGridRefAction;
public class ContructionpermitXsHthTreeGrid extends DefaultGridRefAction{
public ContructionpermitXsHthTreeGrid() {
// TODO Auto-generated constructor stub
super();
}
@Override
public RefMeta getRefMeta(RefQueryInfo arg0) {
// TODO Auto-generated method stub
RefMeta refmeta = new RefMeta();
//参照
refmeta.setCodeField("code");//编码
refmeta.setNameField("name");//名称
refmeta.setPkField("id");//主键
refmeta.setTableName(getExtableSql());//表名
//查询的额外字段
//合同号,合同名称,行号,物料编码,物料名称
refmeta.setExtraFields(new String[] {"code","name","crowno","wlcode","wlname"});
//参照是否需要多语
refmeta.setMutilLangNameRef(false);
return refmeta;
}
private String getExtableSql() {
StringBuffer query = new StringBuffer();
query.append("( ");
query.append("select b.pk_ct_sale_b id,a.vbillcode code,a.ctname name,b.crowno,c.code wlcode,c.name wlname \n");
query.append("from ct_sale_b b \n");
query.append("inner join ct_sale a on b.pk_ct_sale = a.pk_ct_sale \n");
query.append("left join bd_material c on c.pk_material = b.pk_material \n");
query.append("where b.dr = 0 and a.dr = 0 and c.dr = 0");
query.append(" )");
return query.toString();
}
}
树形参照:
package nccloud.grid.ct.contructionpermit;
import java.util.Objects;
import nccloud.framework.web.container.SessionContext;
import nccloud.framework.web.processor.refgrid.RefQueryInfo;
import nccloud.framework.web.ui.meta.RefMeta;
import nccloud.framework.web.ui.meta.TreeRefMeta;
import nccloud.web.refer.DefaultTreeRefAction;
public class ProjectdeptTreeRefGrid extends DefaultTreeRefAction{
@Override
public TreeRefMeta getRefMeta(RefQueryInfo arg0) {
//获取组织
String pk_org = arg0.getQueryCondition().get("pk_org");
TreeRefMeta meta = new TreeRefMeta();
//参照
meta.setCodeField("code");//编码
meta.setNameField("name");//名称
meta.setPkField("id");//主键
meta.setPidField("pk_fatherorg");//父节点主键
meta.setTableName(getExtableSql(pk_org));//表名
//查询的额外字段
//部门编码,部门名称,所属组织
meta.setExtraFields(new String[] {"code","name","expid"});
//参照是否需要多语
meta.setMutilLangNameRef(false);
return meta;
}
private String getExtableSql(String pk_org) {
//获取集团pk
String pk_group = SessionContext.getInstance().getClientInfo().getPk_group();//前端
StringBuffer query = new StringBuffer();
query.append("( ");
query.append("SELECT case when dept.pk_fatherorg = '~' or dept.pk_fatherorg is null then dept.pk_dept \n");
query.append("else v.pk_vid end pk_fatherorg, \n");
query.append("dept.code, dept.name, dept.pk_vid id, dept.pk_org expid \n");
query.append("FROM org_dept_v dept \n");
query.append("LEFT JOIN ( \n");
query.append(" SELECT pk_vid,pk_dept dept FROM org_dept_v \n");
query.append(" WHERE pk_group = '"+pk_group+"' \n");
if(!Objects.equals(pk_group, pk_org) && pk_org != null) {
query.append(" and pk_org = '"+pk_org+"' \n");
}
query.append(" AND enablestate = 2 \n");
query.append(" ) v ON v.dept = dept.pk_fatherorg \n");
query.append("WHERE dept.pk_group = '"+pk_group+"' \n");
query.append("AND dept.vstartdate = NVL ( \n");
query.append(" (SELECT max (a.vstartdate) vstartdate \n");
query.append(" FROM org_dept_v a \n");
query.append(" WHERE vstartdate <= TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD') || ' 23:59:59' \n");
query.append(" AND a.pk_dept = dept.pk_dept ), \n");
query.append(" (SELECT min (a.vstartdate) vstartdate \n");
query.append(" FROM org_dept_v a \n");
query.append(" WHERE vstartdate > TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD') || ' 23:59:59' \n");
query.append(" AND a.pk_dept = dept.pk_dept ) ) \n");
query.append("AND dept.enablestate = 2 ");
if(!Objects.equals(pk_group, pk_org) && pk_org != null) {
query.append(" and dept.pk_org = '"+pk_org+"' \n");
}
query.append(" )");
return query.toString();
}
@Override
public String getOrderSql(RefQueryInfo refQueryInfo, RefMeta refMeta) {
// TODO Auto-generated method stub
return " order by code ";
}
}
鉴权文件
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<actions>
<action>
<name>ct.contructionpermit.ContructionpermitXsHthTreeGrid</name>
<lable>项目合同号参照</lable>
<clazz>nccloud.grid.ct.contructionpermit.ContructionpermitXsHthTreeGrid</clazz>
</action>
<action>
<name>ct.contructionpermit.ProjectdeptTreeRefGrid</name>
<lable>项目参与部门</lable>
<clazz>nccloud.grid.ct.contructionpermit.ProjectdeptTreeRefGrid</clazz>
</action>
</actions>
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<authorizes>
<authorize>
<appcode>*</appcode>
<actions>
<action>ct.contructionpermit.ContructionpermitXsHthTreeGrid</action>
</actions>
<actions>
<action>ct.contructionpermit.ProjectdeptTreeRefGrid</action>
</actions>
</authorize>
</authorizes>
2、前端代码
文件名必须是index.js
refType: 'grid',//参照类型 grid/tree/gridtree
refName: '销售合同号',//参照名称的多语码
refcode: 'nccloud.grid.ct.contructionpermit.ContructionpermitXsHthTreeGrid',//后端绝对路径
placeholder: '销售合同号',//默认提示多语码
queryGridUrl: '/nccloud/ct/contructionpermit/ContructionpermitXsHthTreeGrid.do',//接口
isMultiSelectedEnabled: true,//是否多选 默认false单选
showHistory: false//鼠标聚焦显示历史数据 默认true显示
表型参照:
import { high } from 'nc-lightapp-front';
const { Refer } = high
export default function (props = {}) {
var conf = {
refType: 'grid',
refName: '销售合同号',
refcode: 'nccloud.grid.ct.contructionpermit.ContructionpermitXsHthTreeGrid',
placeholder: '销售合同号',
queryGridUrl: '/nccloud/ct/contructionpermit/ContructionpermitXsHthTreeGrid.do',
isMultiSelectedEnabled: true,
columnConfig: [
{
code: ["code","name","crowno","wlcode","wlname"],
name: ["合同号","合同名","行号","物料编码","物料名称"]
}
]
}
return <Refer {...Object.assign(conf,props)}/>
}
树形参照:
import { high } from 'nc-lightapp-front';
const { Refer } = high
export default function (props = {}) {
var conf = {
refType: 'tree',
refName: '项目参与部门',
refcode: 'nccloud.grid.ct.contructionpermit.ProjectdeptTreeRefGrid',
placeholder: '项目参与部门',
queryTreeUrl: '/nccloud/ct/contructionpermit/ProjectdeptTreeRefGrid.do',
isMultiSelectedEnabled: true,
columnConfig: [
{
code: ["code","name","expid"],
name: ["编码","名称","组织"]
}
]
}
return <Refer {...Object.assign(conf,props)}/>
}
3、数据库脚本
CODE:参照编码。不可重复
METADATANAMESPACE:模块名。
METADATATYPENAME:元数据实体名
PK_REFINFO:主键,不可重复。
REFCLASS:后端类全路径。
REFPATH:前端参照路径(不带 .js)
REFTYPE:参照类型。(1:表型参照)
RESID:多语id。(可设为空)
RESIDPATH:多语路径。(可设为空)
TS:时间戳。
INSERT INTO bd_refinfo(code, dr, isTreelazyLoad, isneedpara, isspecialref, layer, metadatanamespace, metadatatypename, mobilerefpath, modulename, name, para1, para2, para3, pk_country, pk_industry, pk_refinfo, refclass, refpath, refsystem, reftype, reserv1, reserv2, reserv3, resid, residpath, ts, wherepart, workflowConditionUseUnitOrg) VALUES ('xshth', 0, 'Y', null, null, null, 'ct', null, null, 'ct', '销售合同号', null, null, null, null, null, '0001Z01000000001BVAA', 'nccloud.grid.ct.contructionpermit.ContructionpermitXsHthTreeGrid', 'ct/reportapproval/contructionpermit/refer/index', null, 1, null, null, null, '~', '~', '2022-02-19 13:11:28', null, null);
4、参照过滤
例如:只能查看当前组织下的数据,需要获取当前组织的pk_org主键
新增时,需要过滤,找到对应卡片态源码里面的afterEvent方法
在里面看情况添加(我是原有的编辑后里面成功回写的setDeptPsnRefCond方法里面加的条件)
在setDeptPsnRefCond方法里面添加我的代码,我参照使用的是自定义项5,当前台触发def5就将pk_org传递到后端action里面
后端代码获取pk_org,作为参数拼接到sql里面,完整代码在上面
5、效果图
表型多选参照:
树形多选参照:
注:多选参照,后台保存会自动用“,”拼接
保存成功后,前端多选显示的问题,需要手动将节点的列表查询,卡片查询的actin进行修改
前端显示取的值是在display,需要手动改代码
常见问题:
开发环境显示正常,出补丁测试环境不显示
1、注意模板,配置
2、检查前端编译后的文件是否是index.js,默认编译是hash码,要在同级配置config.js关掉hash,再出补丁上测试