NCC轻量化开发数据结构总结

NCC轻量化开发数据结构总结


1、树形结构Tree

目录/下一章

  • 有些单据结构可能需要用到树形展示,后端往前端传数据的时候就需要将数据封装成树形的结构
  • 每一个VO都需要通过继承nccloud.web.uapbd.commons.tree.TreeWapper这个类,可实现给前台返回树形结构的数据
  • 一般需要重写getId、getCode、getName、getPid、getInnercode和getData
    • getId:主键值
    • getCode:显示编码
    • getName:显示名称
    • getPid:上级主键,没有的话一般设置成一个固定值,方便前台渲染
    • getInnercode:内码,有些树是通过内码渲染的
    • getData:这个方法返回一个Map,可以根据需要自定义字段和值
  • 最后使用的时候就可以先调用有参的构造方法将VO传递进去,然后通过类中的getTree()方法将VO数据组装成树
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

返回json示例

{
    "data":[
        {
            "iconBox":{"editIcon":true,"delIcon":true,"addIcon":true},
            "key":"1001ZZ1000000000OL1C",
            "title":"Demo1",
            "refname":"Demo1",
            "refpk":"1001ZZ1000000000OL1C",
            "id":"1001ZZ1000000000OL1C",
            "name":"Demo1",
            "pid":"ROOT",
            "innercode":"EVEI",
            "code":"Demo1",
            "nodeData":{
                "name":"Demo1",
                "innercode":"EVEI",
                "ts":"2020-10-25 13:15:49"
            },
            "children":[]
        }
    ],
    "success":true
}

2、表单结构Form

目录/上一章/下一章

  • 表单结构一般出现在表头,如果是单表的话前端表单保存的时候传递过来的数据就是表单的结构,前端列表页面跳卡片的时候需要给前端返回的也是表单结构

2.1 前端Form转VO

  • 通过FormOperator类中的toVO(IRequest request)方法将请求转化成VO
    在这里插入图片描述
  • 因为Form是一个表单,只能传递一个VO数据,不能传递数组
请求json示例
{
    "model":{
        "areaType":"form",
        "rows":[
            {
                "values":{
                    "modifiedtime":{
                        "display":null,
                        "value":null
                    },
                    "modifier":{
                        "display":"游军文",
                        "value":"1001ZZ1000000000OPNV"
                    }
                },
                "status":"1"
            }
        ]
    },
    "pageid":"10140AC_schemeeditor"
}

* 注:前端传过来的数据中有个status字段,这个对应VOStatus类中的状态,代表数据是新增、修改、删除还是原封不动,如果是调用的toVO方法转的VO,可以通过VO的getStatus()方法获取到

2.2 后端VO转Form

  • 通过FormOperator类中的toForm(Object vo)方法将请求转化成VO
    在这里插入图片描述
    * 注:这里后端VO转Form的过程中会涉及到翻译的问题,需要在应用注册的模板设置里面将表单关联的VO类的全类名加上,不然toForm的过程会空指针。
    在这里插入图片描述
  • 后端返回给前端的数据一般包含display和value,前者一般是参照类型的字段才会有的,用于前台显示,后者用于存储真实数据。貌似还有一个精度字段,暂时没有碰到过这类数据。
返回json示例
{
    "data": {
        "pageid": "182001016A_card",
        "card_head": {
            "rows": [
                {
                    "status": "0",
                    "isOptimized": false,
                    "values": {
                        "pk_group": {
                            "value": "0001A110000000000D5U"
                        },
                        "hasten_bef_day": {},
                        "enablestate": {
                            "display": "已启用",
                            "value": "2"
                        }
                    }
                }
            ],
            "areacode": "card_head"
        }
    },
    "success": true
}

3、表格结构Grid

目录/上一章/下一章

  • 表格结构和表单结构差不多,多出现于列表态或者卡片态的表体

3.1 前端Grid转VO

  • 与表单类似,通过GridOperator类的toVOs(IRequest request)方法将表单数据转化成VO的数组。和表单不同的是,这里必须用VO数组来接收,不然会报错
    在这里插入图片描述
请求json示例
{
    "pageid":"182001052A_card",
    "model":{
        "areaType":"table",
        "rows":[
            {
                "status":"0",
                "isOptimized":false,
                "values":{
                    "swbit":{
                        "value":"3"
                    },
                    "pk_balancecond":{
                        "value":"1001ZE10000000003HSK"
                    },
                    "status":{
                        "value":"0"
                    },
                    "ts":{
                        "value":"2020-10-25 00:49:18"
                    }
                },
                "rowid":"770400.babb32a8b54ab01",
                "filter":false
            },
            {
                "status":"2",
                "values":{
                    "modifiedtime":{
                        "scale":null,
                        "display":"",
                        "value":""
                    },
                    "opr":{
                        "scale":null,
                        "display":""
                    },
                    "numberindex":{
                        "value":"6"
                    }
                }
            }
        ]
    }
}

* 注:status字段的值就是前面说到的状态,代表这条数据是保存的、删除的还是其他状态的,具体可以参考VOStatus类

3.2 后端VO转Grid

  • 一般列表查询的时候用的多,将需要返回的VO数组通过GridOperator类的toGrid(Object[] vos)方法转换
  • 同样的,转换过程中会进行翻译,与Form表单不同的是,GridOperator类的构造需要页面编码,同时,转成Grid的时候,需要指定具体的区域编码(如果模板上只有一个表格区域,则会默认取这个表格区域,这个时候就可以不指定区域编码)。
    在这里插入图片描述
返回json示例
{
    "data":{
        "pageid":"182001016A_list",
        "list":{
            "rows":[
                {
                    "status":"0",
                    "isOptimized":false,
                    "values":{
                        "pk_group":{
                            "display":"用友集团",
                            "value":"0001A110000000000D5U"
                        },
                        "hasten_bef_day":{
                        },
                        "enablestate":{
                            "value":"2"
                        }
                    }
                },
                {
                    "status":"0",
                    "isOptimized":false,
                    "values":{
                        "pk_group":{
                            "display":"用友集团",
                            "value":"0001A110000000000D5U"
                        },
                        "hasten_bef_day":{
                        },
                        "enablestate":{
                            "value":"2"
                        }
                    }
                }
            ],
            "allpks":[
                "1001ZE10000000014OMZ",
                "1001ZE10000000015Y1A"
            ],
            "areacode":"list"
        }
    },
    "success":true
}

* 注:这里出现了allpks,这个是给卡片页的单据翻页组件用的,还可以传递分页的信息,由于我这里数据量不大,所以没有写分页功能

3.2.1 分页处理方法
  • toGrid方法返回的是Grid数据,可以调用Grid方法中的GetModel,得到GridModel对象,然后给GridModel对象设置分页信息,最后返回Grid对象即可
    在这里插入图片描述

4、参照结构Ref

目录/上一章/下一章

  • 参照的话和重量端差不多,平台提供的参照有三种。分别是树形参照(继承nccloud.web.refer.DefaultTreeRefAction类)、表型参照(继承nccloud.web.refer.DefaultGridRefAction类)、树表型参照(这个是两次请求)。
  • 编写参照类的话可以参考NCC技术文档,这里总结一下我开发参照的一些理解和遇到的一些问题。

4.1 参照开发

4.1.1 参照开发大致流程
  • 先根据参照的类型,继承对应的类,编写相应的参照,注册好鉴权等xml后由前端开发人员编写js代码,前端人员封装好后会给一个url。
  • 我们要做的就是将这个url注册到数据库表bd_refinfo对应参照的refpath字段中
  • 然后在元数据的参照页签上面加上刚刚注册的参照即可
参照代码示例

在这里插入图片描述

4.1.2 我理解的轻量端参照
  • 模板中配置好某个字段的参照类型。
  • 当点击参照的时候,根据模板中配置好的参照类型去数据库表bd_refinfo中获取配置好的refpath字段值。
  • 然后根据这个字段值去获取js代码,js代码中会调用后端写好的参照类,从而获取参照信息。
  • 如果字段不是通过模板配置出来的字段需要参照的话,也可以通过直接调用refpath字段的url来获取参照信息。
4.1.3 开发过程遇到的问题
  • 在取参照的过程中需要拼接whereSql,有时候需要拼接in语句,比如组织的参照需要获取登录有权限的组织主键,然后拼到in语句中,但是in语句里面内容不能超过1000条。这个时候第一时间想到的是创建临时表。但是,参照类是在nccloud\client组件里面的,这里和nc端不是通过你一个事务,所以临时表是不管用的。
    • 解决方案;平台的RefQueryInfo类中有一个filterPks变量,将所有pk值传到这个字段里面即可,在执行参照的SQL时,平台会在nc端创建临时表处理。
    refQueryInfo.setFilterPks(orgpks);
    
  • 查询的时候,如果需要创建临时表,得启用事务,得在相应查询接口的upm文件里面加上这个,此接口才允许创建临时表,不然临时表里面会没数据
    在这里插入图片描述
  • 参照除了标准的重写的那些方法,还可以重写下面两个方法
    在这里插入图片描述
    • 上图是父类方法中构造参照结果的方法,红框中的两个方法含义如下:

      processRefPks():这个是处理查询出来的pk,平台默认没有做处理,如果实际开发过程中有需要处理查询出来的pk的,可以重写该方法
      processRefRows():这个是处理查询结果,平台默认是在这个方法里面做了翻译处理,如果要重写记得用super调用,或者直接将平台代码拷贝过来在里面添加东西,实际开发可能需要加根节点,或者需要对额外的字段做翻译,则需要重写该方法做处理

    • 如果重写以上方法还不能解决问题的话,可以直接重写上图的 processData() 方法。不过要注意的是,参照返回的结果格式是有规范的,如果格式不正确,前端还需另做处理,浪费开发时间。后端返回数据一定要是 nccloud.framework.web.processor.refgrid.RefQueryResult 类的对象。
请求json示例(树形+列表形)
{
	"busiParamJson":"{\"pid\":\"\",\"pageInfo\":{\"pageSize\":50,\"pageIndex\":-1},\"keyword\":\"\",\"queryCondition\":{\"pk_org\":\"0001Z41000000000L7ZM\"}}",
	"sysParamJson":{
		"busiaction":"我的单据-合并请求",
		"appcode":"182001016A",
		"tabid":"",
		"ts":1603776535585,
		"from":"",
		"pagecs":1604653003616
	}
}
返回json示例(树形)
{
    "data": {
        "rows": [
            {
                "isleaf": true,
                "pid": "1001ZE10000000000KU4",
                "refname": "1",
                "refpk": "1001ZE10000000006H1P",
                "values": {
                    "pk_tasksort": {
                        "value": "1001ZE10000000006H1P"
                    },
                    "pk_parent": {
                        "value": "1001ZE10000000000KU4"
                    },
                    "name": {
                        "value": "1"
                    }
                }
            },
            {
                "isleaf": false,
                "refname": "111",
                "refpk": "1001ZE10000000000KU4",
                "values": {
                    "pk_tasksort": {
                        "value": "1001ZE10000000000KU4"
                    },
                    "pk_parent": {},
                    "name": {
                        "value": "111"
                    }
                }
            }
        ]
    },
    "success": true
}
返回json示例(列表形)
{
    "data": {
        "page": {
            "pageIndex": "-1",
            "pageSize": "50",
            "total": "0",
            "totalPage": "0"
        },
        "rows": [
            {
                "refcode": "344",
                "refname": "本级及上级",
                "refpk": "1001ZE100000000069GV",
                "values": {
                    "pk_keygroup": {
                        "display": "单位,会计月",
                        "value": "00000000000000000011"
                    },
                    "code": {
                        "value": "344"
                    },
                    "name": {
                        "value": "本级及上级"
                    }
                }
            },
            {
                "refcode": "502",
                "refname": "502",
                "refpk": "1001ZE100000000069HW",
                "values": {
                    "pk_keygroup": {
                        "display": "单位,会计月",
                        "value": "00000000000000000011"
                    },
                    "code": {
                        "value": "502"
                    },
                    "name": {
                        "value": "502"
                    }
                }
            }
        ]
    },
    "success": true
}

4.2 SqlBuilder

  • SqlBuilder需要实现nccloud.framework.web.processor.IRefSqlBuilder接口,可重写里面的getExtraSql方法来拼接额外的SQL,跟参照开发类似。
  • SqlBuilder里面的SQL是附加的SQL,一般在已有参照不满足实际的情况下使用。
  • 加了这个就不需要往数据库里面注册,直接在请求的时候加上一个条件:
"TreeRefActionExt":"树形SqlBuilder全类名";
"GridRefActionExt":"列表SqlBuilder全类名";
  • 平台有一个默认的SqlBuilder,叫nccloud.web.refer.sqlbuilder.DefaultRefSqlBuilder,里面做了管控模式、过滤停用数据和数据权限的SQL拼接
    • 其中管控模式需要在参照的构造方法中设置元数据的id,不然不会拼接管控模式的SQL
    setMdClassId(String strMdClassId);
    
    • 过滤停启用同理,需要设置是否过滤停启用,不过使用这个得注意,得检查参照查询的表里面有没有“enablestate”字段,没有就设置为空或者不加下面代码即可,不然会报错
    setShowDisabledData(Boolean blAddEnableStateWherePart);
    
SqlBuilder代码示例

在这里插入图片描述

请求json示例
{
	"busiParamJson":"{\"pid\":\"\",\"pageInfo\":{\"pageSize\":50,\"pageIndex\":-1},\"keyword\":\"\",\"queryCondition\":{\"pk_org\":\"0001Z41000000000L7ZM\", \"GridRefActionExt\":\"nccloud.web.ufoe.pub.refcondition.ReportManaStruSqlBuilder\"}}",
	"sysParamJson":{
		"busiaction":"我的单据-合并请求",
		"appcode":"182001016A",
		"tabid":"",
		"ts":1603776535585,
		"from":"",
		"pagecs":1604653003616
	}
}

5、高级查询Action

目录/上一章/下一章

  • 高级查询传入的参数格式是固定的,可直接用nccloud.dto.baseapp.querytree.dataformat.QueryTreeFormatVO去接收

请求json示例

{
	"busiParamJson":"{\"pageCode\": \"182001016A_list\",\"querycondition\": {\"logic\": \"and\",\"conditions\": []},\"userdefObj\": {\"pk_org\": \"GLOBLE00000000000000\",\"pk_busiprop\": \"0001Z0100000000005CQ\",\"showDisable\": true},\"oid\": \"1001ZE1000000001HEUI\",\"querytype\": \"tree\"}",
	"sysParamJson":{
		"busiaction":"我的单据-合并请求",
		"appcode":"182001016A",
		"tabid":"",
		"ts":1603776535585,
		"from":"",
		"pagecs":1604908834284
	}
}
  • 如果继承了nccloud.web.action.NCCAction方法,可直接重写getParaClass(),将返回值类型改成QueryTreeFormatVO类型,这样,在接收的时候就可以直接将para强转为QueryTreeFormatVO类型

代码示例

在这里插入图片描述
注:不属于高级查询中的条件的额外条件,与前端开发人员商量好后放在userdefObj里面即可

  • 高级查询一般返回列表数据,返回格式请参考后端VO转Grid

如何将QueryTreeFormatVO转化为查询的whereSql?

代码示例

在这里插入图片描述

  • 先通过nccloud.framework.web.querytemplet.QueryUtil4NCC工具类将QueryTreeFormatVO转化成查询方案IQueryScheme
  • 然后通过IQueryScheme的getWhereSQLOnly()方法去获取whereSql

6、主子表结构BillCard/ExtBillCard

目录/上一章/下一章

  • 主子表结构分为一主一子(BillCard)和一主多子(ExtBillCard),是标准单据比较常用的一种结构,实际上就是“Form + Grid”的结构,一主一子也可以用ExBillCard来做转化(不推荐)。这里只拿ExtBillCard来举例,BillCard的用法是一样的

6.1 前端BillCard/ExBillCard转AggVO

  • 与表单和表格类似,通过BillCardOperator/ExtBillCardOperator类的toBill(IRequest request)方法将主子表数据转化成AggVO。
    在这里插入图片描述
请求json示例
{
    "pageid":"10611004_card",
    "head":{
        "card_head":{
            "areaType":"form",
            "rows":[
                {
                    "values":{
                        "pk_unitsetting":{
                            "value":"1001Z01000000004ISDJ"
                        },
                        "pk_group":{
                            "display":"集成测试集团",
                            "value":"0001A510000000002W69"
                        },
                        "pk_org":{
                            "display":"北京分公司",
                            "value":"0001A510000000003VJ9"
                        }
                    },
                    "status":"1"
                }
            ],
            "areacode":"card_head"
        }
    },
    "bodys":{
        "unitBill":{
            "areaType":"table",
            "rows":[
                {
                    "status":"0",
                    "isOptimized":false,
                    "values":{
                        "pk_unitsetting_bill":{
                            "value":"1001Z01000000004ISDO"
                        },
                        "pk_tradetype":{
                            "disabled":false
                        },
                        "pk_objectregister":{
                            "display":"付款结算单",
                            "value":"0000Z3ERM000000000F5"
                        },
                        "pk_printtemplate":{
                            "display":"NCC付款结算卡片",
                            "value":"1001Z610000000007592",
                            "disabled":false
                        }
                    },
                    "rowid":"892110.062b882126ab7637",
                    "disabled":false
                }
            ],
            "areacode":"unitBill"
        },
        "unitAcc":{
            "areaType":"table",
            "rows":[
                {
                    "status":"0",
                    "isOptimized":false,
                    "values":{
                        "pk_objectregister":{
                            "display":"现金日记账",
                            "value":"0000Z0TM000000000005"
                        },
                        "archive_account":{
                            "value":"1001Z01000000004ISDJ"
                        },
                        "moduleid":{
                            "display":"现金管理",
                            "value":"3607"
                        }
                    },
                    "rowid":"892040.03a143989008a0444",
                    "disabled":false
                }
            ],
            "areacode":"unitAcc"
        }
    },
    "templetid":"1001Z01000000002SGJS"
}
  • head包裹的就是表头的数据,是Form结构,bodys包裹的是多个表体的数据,是Grid数组结构(如果是BillCard,则是body包裹的Grid结构)

6.2 后端AggVO转BillCard/ExtBillCard

  • 一般列表查询的时候用的多,将需要返回的AggVO数组通过BillCardOperator/ExtBillCardOperator类的toCard(Object vo)方法转换
    在这里插入图片描述
返回json示例
{
    "data":[
        {
            "pageid":"10611004_card",
            "templetid":"1001Z01000000002SGJS",
            "head":{
                "card_head":{
                    "rows":[
                        {
                            "status":"0",
                            "isOptimized":false,
                            "values":{
                                "pk_group":{
                                    "display":"集成测试集团",
                                    "value":"0001A510000000002W69"
                                },
                                "pk_org":{
                                    "display":"北京分公司",
                                    "value":"0001A510000000003VJ9"
                                }
                            }
                        }
                    ],
                    "areacode":"card_head"
                }
            },
            "bodys":{
                "unitAcc":{
                    "rows":[
                        {
                            "status":"0",
                            "isOptimized":false,
                            "values":{
                                "pk_objectregister":{
                                    "display":"现金日记账",
                                    "value":"0000Z0TM000000000005"
                                },
                                "moduleid":{
                                    "display":"现金管理",
                                    "value":"3607"
                                }
                            }
                        }
                    ],
                    "areacode":"unitAcc"
                },
                "unitBill":{
                    "rows":[
                        {
                            "status":"0",
                            "isOptimized":false,
                            "values":{
                                "pk_objectregister":{
                                    "display":"付款结算单",
                                    "value":"0000Z3ERM000000000F5"
                                },
                                "archive_bill":{
                                    "value":"1001Z01000000004ISDJ"
                                },
                                "moduleid":{
                                    "display":"现金管理",
                                    "value":"3607"
                                }
                            }
                        }
                    ],
                    "areacode":"unitBill"
                }
            }
        }
    ],
    "success":true
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: NCC2005单据开发是指基于NCC2005平台进行单据开发的一项工作。NCC2005是一款集成化的企业管理软件平台,具有灵活、稳定、功能强大的特点,广泛应用于各个行业的企业中。 单据开发是在NCC2005平台上根据企业的具体需求进行的开发工作。通过单据开发,企业可以根据自身的业务流程和需求,定制各种类型的单据,如采购单、销售单、库存单等,以满足企业的管理和运营需求。 在NCC2005平台上进行单据开发,需要具备一定的编程和开发技能。通过使用平台提供的开发工具和接口,可以对单据的表单和逻辑进行定制和开发。可以根据需求进行字段的添加和修改,设置校验规则和逻辑判断,实现自定义的业务流程。 NCC2005单据开发的好处是可以高度定制化,能够满足企业特定的业务需求。通过开发自定义单据,企业可以更好地管理和控制各个环节的业务流程,提高工作效率和管理水平。同时,单据开发也为企业提供了更多的数据分析和报表功能,帮助企业进行数据挖掘和决策支持。 总而言之,NCC2005单据开发是一项根据企业需求进行的定制化开发工作,可以帮助企业实现更高效的管理和运营,提升企业竞争力和市场影响力。 ### 回答2: NCC2005是一款用于开发单据的工具软件,其主要功能是帮助用户快速、高效地设计和生成各类单据。该软件具备强大的功能和灵活的操作,可以满足用户对单据开发的各种需求。 首先,NCC2005具有简单易用的界面,用户可以通过直观的操作完成单据的设计和设置。软件提供了丰富的设计模板和样式,用户可以根据自己的需求选择合适的模板,并对其进行自定义编辑。在设计单据的过程中,用户可以轻松添加各种必要的字段、标签和控件,以及设置数据的格式和验证规则。 其次,NCC2005支持多种数据源的连接和集成。用户可以通过软件与数据库、表格、文本文件等不同类型的数据源进行连接,并将数据源中的数据应用到单据中。这样一来,用户就能够实现数据的实时更新和动态展示,提高了单据的可靠性和准确性。 此外,NCC2005还具备强大的打印和导出功能。用户可以通过软件将设计好的单据直接打印出来,从而方便地应用于实际工作中。同时,软件还支持将单据导出为多种格式的文件,如PDF、Excel等,方便用户在不同的场景下使用和共享。 总的来说,NCC2005是一款功能强大、操作简便的单据开发工具软件。它能够帮助用户快速、高效地设计和生成各类单据,并支持多种数据源的连接和集成。无论是个人用户还是企业用户,都可以通过使用NCC2005来简化、优化单据开发的工作流程,提升工作效率和质量。 ### 回答3: NCC2005 单据开发是指在 NCC2005 平台上进行单据设计和开发的过程。NCC2005 是一款领先的企业管理软件平台,它提供了强大的功能和灵活的扩展性,可以满足企业在不同领域中的单据管理需求。 在进行 NCC2005 单据开发时,首先需要根据实际业务需求进行单据设计。单据设计包括确定单据类型、字段定义、单据流程、验证规则等内容。通过清晰的单据设计,可以确保单据与业务流程相匹配,并且能够准确获取所需的信息。 接下来是进行单据开发NCC2005 单据开发采用的是面向对象的开发模式,开发人员可以利用 NCC2005 平台提供的开发工具和API,按照单据设计进行相关代码的编写和调试。可以根据实际需要添加业务逻辑,实现数据的计算、验证和处理等功能。 除了基本的单据设计和开发NCC2005 还提供了许多扩展功能,可以根据具体需求进行定制开发。例如,可以进行界面定制来满足用户的审美需求,也可以进行报表定制以满足用户对数据分析和报表展示的需求。 NCC2005 单据开发的好处在于它能够提高工作效率和准确性。通过合理的单据设计和开发,可以简化企业的业务流程,并优化数据的管理和处理过程。此外,NCC2005 还支持多语言、多币种等功能,可以满足不同国家和地区的业务需求。 总之,NCC2005 单据开发是一项重要的工作,它能够帮助企业实现单据管理的自动化和规范化,提高工作效率和准确性,从而更好地支持企业的业务发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值