Commit 708c3cbc by 郭旭

修改后端教案

parent dc4358a4
## 后端项目开发文档
# 后端项目开发文档
## 后端项目开发文档
# 后端项目开发文档
### 模型转换代码结构介绍(gjjs-business)
## 模型转换代码结构介绍(gjjs-business)
***视频说明***
http://114.115.138.98:9497/gjjs-book/assets/videos/rear-end-file.mp4
......@@ -11,7 +11,7 @@ com.brilliance.mda包下
com.ceb.gjjs.mda包下
![](../assets/images/hdmljg1.png)
### 配置文件说明
## 配置文件说明
| codeTable | 码表,select中的可选项 |
|------------------|-----------------------------|
......@@ -23,9 +23,10 @@ com.ceb.gjjs.mda包下
| template | 用户面函中相关PDF生成的模板 |
| application.yml | 应用程序配置信息 |
### Spring/Mybatis运行时开发介绍
## Spring/Mybatis运行时开发介绍
### SpringMVC简介
#### SpringMVC简介
SpringMVC就是一个Spring内置的MVC框架。
MVC框架,它解决WEB开发中常见的问题(参数接收、文件上传、表单验证、国际化等等),而且使用简单,与Spring无缝集成。支持 RESTful风格的URL请求。
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分
......@@ -36,11 +37,11 @@ V:View,视图层,指工程中的html或jsp等页面,作用是与用户
C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器
```
#### mybatis简介
### mybatis简介
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射,MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型为数据库中的记录。
#### 项目相关依赖
### 项目相关依赖
在gjjs-business模块下的pom.xml文件中引入相关依赖
......@@ -50,9 +51,685 @@ MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过
![dependencyManagement](../assets/images/dependencyManagement.png)
### 模型转换开发步骤
#### 1.使用BD工具生成后端代码
## 常用接口
### 1、IBaseObject说明
| 函数 | 描述 |
| --------------------------- | :---------------------------------- |
| getName() | 获取name |
| getParent() | 获取父类 |
| getPath() | 获取path |
| clear() | 清空 |
| notifyDefault() | 判断set时是否执行相应的Defalut Rule |
| notifyDefault(String field) | 判断set时是否执行相应的Defalut Rule |
---
### 2、IContext说明
系统上下文
| 函数 | 描述 |
| ---------------------------------------------------------- | ------------------------------------------------------------ |
| getTransName() | 获取当前系统交易名 |
| getFieldErrors() | 获取错误信息 |
| getErrorNo() | 获取错误码 |
| setFieldError(...) | 设置错误信息 |
| setMessage(...) | 设置错误信息 |
| getRoot() | 获取当前交易模型 |
| checkAll(IModule module) | 检查模型所有字段是否符合要求 |
| postRule(...) | 执行指定路径的Rule/Default/Check方法 |
| postInit() | 执行初始化 |
| postCheck() | 执行指定路径的Check方法 |
| setParams(Map<String, Object> params) | 接受前端的自定义参数 |
| getRetMap() | 获取map |
| getDaoSession() | 获取daoSession |
| restoreData(String key) | 获取params中指定数据 |
| storeData(String key,Object data) | 往params添加数据 |
| deleteData(String key) | 删除params中指定数据 |
| storeCacheData(String key, Object data) | 往cachedMap中添加数据 |
| deleteCacheData(String key) | 删除cachedMap中指定数据 |
| clearCacheData() | 清空cachedMap |
| restoreCacheData(String key) | 获取cachedMap中指定数据 |
| getErrorCode() | 获取错误码 |
| setErrorCode(...) | 设置错误码 |
| setErrorMessage(...) | 设置错误内容 |
| getErrorMessage() | 过去错误信息 |
| getLocker() | 获取锁对象 |
| getLocale() | 获取环境信息:("zh", "CN") |
| getEmitter() | 获取发射器 |
| setVo(Object vo) | 设置Vo |
| setAttribute(IModule parent,String prop,String ATTR,T val) | 往attrMaps中添加数据 |
| getAttribute(IModule parent,String prop,String ATTR) | 获取attrMaps中指定数据 |
| mallocPrintBuffer() | 先判断printBuffer是否为空,如为空往printBuffer栈添加进一个新的PrintSegment并返回,如果不为空,则返回printBuffer栈顶元素 |
| releasePrintBuffer() | 获取并删除printBuffer栈顶元素信息 |
| getCurPrintBuffer() | null |
| getCurPrintSegment() | 返回printBuffer栈顶元素 |
| pushEventPath(String path) | rulePathStack入栈 |
| getEventPath() | 返回rulePathStack栈顶元素 |
| popEventPath() | 返回并删除popEventPath栈顶元素 |
| setError(...) | 设置错误信息 |
| reraise() | 有错误内容待处理 |
| setConcurrentCallStack | 记录当前执行过程的父模型路径 |
| getConcurrentCallStack | 过去当前执行过程的父模型路径 |
| absGet(...) | 获取Root中的指定模型 |
### 3、IDaoSession说明
IDaoSession定义了数据库操作相关接口,实现的抽象类是AbstractDaoSession,完全实现是AbstractDaoSession的子类MyBatisDaoSession,MyBatisDaoSession基于Spring SqlSessionTemplate实现
接口方法说明:
| 函数 | 描述 |
| ------------------------------------------------------------ | ---------------------------------------- |
| void dbBegin() | 开启事务 |
| void dbCommit() | 提交事务 |
| void dbRollback() | 运行异常,手动回滚 |
| ~~void putDao(Class<?> key, Object dao)~~ | 已废弃 |
| int dbCounter(String seqname) | 生成流水号 |
| int dbInsert(IModule modull) | 插入module数据 |
| int dbUpdate(IModule module,Object v1,String whereCol1) | 更新module一个字段到数据库 |
| int dbUpdate(IModule module,Object v1,String whereCol1,Object v2,String whereCol2) | 更新module两个个字段到数据库 |
| int dbDelete(IModule module) | 删除一张数据库表记录 |
| int dbDelete(IModule module, Object val, String col) | 按语句删除module对应表的对象 |
| int dbDelete(IModule module, Object val, String col,Object val2,String col2) | 按语句删除module中对应表的对个对象 |
| int dbDelete(IModule module, Argument<? extends Object>... args); | 按条件删除数据库的多个表记录 |
| <T extends IModule> T dbRead(T module, Object... args) | 将一条符合条件的记录读取到module内 |
| <T extends IModule> T dbReadByArguments(T module, Argument<? extends Object>... args) | 通过参数将符合条件的记录读取到module内 |
| IModule> T dbReadHold(T module, Object... args) | 保持读取 |
| IModule> int dbReadSet(ModuleList<T> list, Object... args) | 将符合条件的所有记录都读取到list内 |
| IModule> int dbReadSetByArguments(IModuleList<T> list, Argument<? extends Object>... args) | 通过参数将符合条件的所有记录读取到list中 |
| void dbExecuteSQL(IStream stm) | 执行SQL语句 |
| void dbExecuteSQL(IStream sql, IStream retstream) | 执行SQL语句 |
| void dbExecuteSQL(String sql,Object... params) | 执行SQL语句 |
| void dbFetch(IModule module) | 获取模型 |
| void dbFetchStream(IStream args) | 获取流 |
| void dbFetchFields(Object... args) | 获取模型的字段 |
| void dbFetchFields(Argument<? extends Object>... arguments) | 通过参数获取模型的字段 |
| void dbCloseCursor() | 关闭结果集 |
| String dbSqlDate(Date endDat) | 查询数据库日期 |
### 4、IDatafield说明
IDatafield是一个泛型的接口,它继承了接口IBaseObject,并由DatafieldImpl类实现该接口中的方法。该接口的作用是面向IModule的数据控制管理。
| 函数 | 描述 |
| ------------------------------------ | ---------------- |
| T getValue() | 获取当前对象的值 |
| void setValue(T value); | 设置当前对象的值 |
| Class<T> getDataType() | 获取数据类型 |
| void setAttribute(Object k,Object v) | 设置属性 |
| Object getAttribute(Object k) | 获取属性 |
### 5、IDataGrid说明
IDataGrid是一个数据处理的接口,主要是对list和IStream的一些操作的封装,主要实现类是DataGrid
接口方法说明:
| 函数 | 描述 |
| --------------------------------------------------- | ---------------------------- |
| String getLine(int idx) | 获取指定下标list值 |
| String deleteLine(int idx) | 删除指定下标list值 |
| void sortLines() | list排序 |
| int countLines() | 统计list长度 |
| int searchLine(String line) | 根据字符串搜索list |
| void setRows(List<String> list) | 清空当前list,赋值为参数list |
| List<String> getRows() | 获取list |
| void insertLine(int idx,String line) | 在list指定下标插入元素 |
| void setLine(int idx,String line) | 修改指定下标元素 |
| void clearLines() | 清空list |
| void addLine(String line) | 追加元素 |
| void saveLines(File file) | 把list持久化到文件 |
| void loadLines(File file) | 从文件读取list |
| boolean isLinesChanged() | list是否发生过变化 |
| void setAttributeStream(String attr,IStream stream) | 往map里添加stream |
| IStream getAttributeStream(String attr) | 从map里获得stream |
| Map<String,IStream> getAttrsMap() | 获取整个map |
### 6、IDisplay说明
快照保存接口,保存的东西,可以使文件路径/或者是文件保存key。具体实现由实施情况决定。可以使保存至**关系型数据库**或保存至**NOSQL数据库**或保存至**文件存储器**
| 函数 | 描述 |
| ------------------------------------------------------ | ------------ |
| boolean saveDisplay(String filePathOrKey, String data) | 保存快照数据 |
| String readDisplay(String filePathOrKey) | 读取快照数据 |
---
### 7、ILocker说明
| 函数 | 描述 |
| ----------------------------------------------- | ---------------------------- |
| boolean lock(Serializable key) | 竞争对象的锁 |
| boolean lock(Serializable key, int expireflg) | 竞争对象的锁,给与指定标志 |
| boolean lock(Serializable key, long timeout) | 竞争对象的锁,并给与超时时间 |
| LockInfo lock(String userName,Serializable key) | 获取用户指定锁的信息 |
| boolean unlock(Serializable key) | 释放锁 |
### 8、ILoginContext说明
用于管理用户登录行为的接口
| 函数 | 描述 |
| ----------------------------------- | --------------------- |
| Object login(String id, String pwd) | 用户登录 |
| Object auth(String token) | 根据token获取用户信息 |
| Object logout(String token) | 登出token对应的用户 |
### 9、IModuleList说明
​ IModuleList接口主要是针对当前列表的记录进行操作,在该接口中定义了一些常用的对记录操作的函数方法。
| 函数 | 描述 |
| -------------------------------------------- | --------------------------------------- |
| int getFullDbSize() | 获取数据库中总数据量 |
| int fullSize() | 获取当前列表中存储的全部记录数 |
| Class<T> getDataClass() | 获取数据类型 |
| void removeAll() | 移除当前列表的所有记录 |
| void addElement(T em) | 将参数字段添加到父模块中 |
| void addElement(int index,T em) | 将参数字段添加到父模块的第index-1的位置 |
| boolean executeInit() | 执行列表下每个模块的init初始化操作 |
| boolean executeInit(int idx) | 执行列表中指定位置模块的init初始化操作 |
| void executeDefault(String... paths) | 执行列表下每个模块的对应的默认操作 |
| void executeDefault(int idx,String... paths) | 执行列表中指定模块的对应的默认操作 |
### 10、IModule说明
​ 每一个IModule接口的实现类就是一个模块。同时在IModule接口中定义了一些常用的与模型相关的函数方法。
| 函数 | 描述 |
| -------------------------------------- | ------------------------------------ |
| boolean isEntity() | 判断模块是否为实体 |
| String getSerialNum() | 获取模型的serialNum |
| void assignSerialNum() | 生成模型的serialNum |
| void copyValue(IModule src) | 将参数模块数据赋值到当前模块中 |
| void copyValues(IModule src) | 将参数模块及其子模块赋值到当前模块中 |
| String getFieldPath(String fieldName) | 获取字段的路径 |
| Collection<IDatafield> getDatafields() | 获取模块中的字段 |
| List<IModule> getModules() | 获取模型下的子模块 |
| String getTableName() | 获取模块的表名 |
### 11、IRuleEmitter说明
​ IRuleEmitter接口主要解决在交易运行时面对不同情境所触发的不同的规则,即处理方案。
| 函数 | 描述 |
| ------------------------------------------------ | ---------------------------------- |
| boolean executeInit() | 执行初始化 |
| boolean executeInit(int order) | 执行指定顺序的初始化操作 |
| boolean executeRule(String target) | 根据传入参数执行规则操作 |
| boolean executeCheck(String target) | 根据传入参数执行检查操作 |
| boolean executeRule(String target,int order) | 根据传入参数执行指定顺序的规则操作 |
| boolean executeCheck(String target,int order) | 根据传入参数执行指定顺序的检查操作 |
| boolean executeDefault(String target) | 根据传入参数执行默认操作 |
| boolean executeDefault(String target, int order) | 根据传入参数执行指定顺序的默认操作 |
| boolean executeDefaultAfterInit() | 在init执行之后执行的default操作 |
| Class<?> relatedTransaction() | 返回一个具体交易的字节码文件 |
| String getRealPath(String path) | 获取传入参数对应的真实路径 |
### 12、IStream说明
| 函数 | 描述 |
| ----------------------------- | ------------ |
| getInputStream() | 获取输入流 |
| getOutputStream() | 获取输出流 |
| close() | 关闭流操作 |
| setType(String type) | 设置类型 |
| getType() | 获取类型 |
| setName(String name) | 设置名称 |
| getName() | 获取名称 |
| setValue(String value) | 设置值 |
| getValue() | 获取值 |
| isKeepsort() | 判断是否排序 |
| setKeepsort(boolean keepsort) | 设置keepsort |
## 平台函数
### 1、MdaUtils里重点函数说明
| 函数 | 描述 |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| synchronized void close() | 数据清除 |
| synchronized Properties getProperties(String name) | 按命名获取对应属性列表 |
| String getPropertyValue(String fileName, String key) | 按命名获取对应属性列表中键值对应的属性 |
| void setPropertyValue(String fileName, String key, String value) | 根据命名和键值设置属性值 |
| File mkdirs(String fileName) | 按文件名创建文件 |
| boolean fileCopy(String sourceFileName, String targetFileName) | 将文件名为sourceFileName文件复制到文件文件名为targetFileName文件 |
| boolean fileDelete(String fileName) | 根据文件名删除对应文件 |
| boolean fileMove(String sourcefileNameOrPath, String targetFileOrPathName) | 将sourcefileNameOrPath路径下的文件移到targetFileOrPathName路径下 |
| boolean fileMkdirs(String filePath) | 创建由此路径名命名的目录 |
| String fileName(String fileName) | 获取fileName最后一个分割符后的文件名 |
| String fileBaseName(String fileName) | 获取文件不含扩展的基本名 |
| String fileExtension(String fileName) | 获取文件扩展名 |
| boolean fileExists(String fileName) | 判断文件是否存在 |
| long fileSize(String fileName) | 文件大小 |
| Date fileDate(String fileName) | 文件最后修改日期 |
| String fileMD5Value(String fileName) | 获取文件十六进制的MD5哈希计算的值 |
| void fileArchive(String zipFileName, String[] fileNames, String baseDirectoryName) | 将保存在指定目录下的指定文件压缩至zipFileName压缩包里 |
| void fileArchive(IStream zipStream, String[] fileNames, String baseDirectoryName) | 将保存在指定目录下的指定文件压缩至zipStream的输出流里 |
| boolean fileExtract(String zipFileName, String entryName, String outputFileName) | 从 zipFileName路径下的压缩包提取指定文件 |
| boolean fileExtract(IStream zipStream, String entryName, IStream outputStream) | 从 zipSream里提取指定文件 |
| void copy(InputStream is, OutputStream os) | 将输入流is复制到输出流os上 |
| void copy(Reader reader, OutputStream os, Charset charset) | 将字符输入流复制到指定编码格式输出流 |
| void closeQuietly(Closeable closeable) | 关闭 |
| String decode(byte[] data, DecodeType type) | 根据指定的解码类型对数据进行相应加密 |
| String toString(Object object) | 转换成字符串 |
| int parseInt(Object value) | 将value的值转化十进制的整数 |
| BigDecimal parseDecimal(Object value) | 将value的值转化为BigDecimal类型 |
| Boolean parseBoolean(Object value, Boolean defaultValue) | 将value的值转化为Boolean 类型 |
| Date parseDate(String val) | 将value的值转化为Date 类型 |
| Date parseDate(Object value, String pattern) | 将value的值转化为指定格式的Date 类型 |
| String getI18nStr(String name, String key) | /+name+/+key+/ |
| void sleep(long millis) | 休眠 millis毫秒 |
| int diff(Date date1, Date date2) | 返回两个日期相差的天数 |
| Date add(Date date, int days) | 计算给定日期增加days天数后的日期 |
| Date add(Date date, int type, int value) | 计算给定日期增加days个type类型后的日期 |
| Date today() | 返回当前时间 |
| Date today(TimeZone timeZone) | 返回当前时间 |
| String format(Date dattim, String dateFormat, String lang, String timezone) | 将日期按照dateFormat格式转化为字符串 |
| String format(Date dattim, String dateFormat, String lang) | 将日期按照dateFormat格式转化为字符串 |
| String format(Object object, String pattern) | 将对象按照pattern格式转化为字符串 |
| boolean isEmpty(Object object) | 判断对象是否为空 |
| boolean exists(Object object, String methodName, Object... args) | 指定对象的方法名的方法是否存在 |
| boolean exists(Object object, String methodName, Class[] classes, Object[] args) | 指定对象的方法名的方法是否存在 |
| Object invoke(Object object, String methodName, Object... args) | 根据条件和方法名调用指定对象的方法 |
| Object invoke(Object object, String methodName, Class[] classes, Object[] args) | 根据条件和方法名调用指定对象的方法 |
| Object getProperty(Object object, String propertyName) | 根据指定对象和属性名获取属性 |
| void setProperty(Object object, String propertyName, Object value) | 根据指定对象和属性名设置属性值 |
| String catPath(String path, String subPath) | 根据path和subpath获取绝对路径 |
| List<String> listFiles(String path, String[] extensions) | 根据文件路径获取对应文件下指定扩展名文件的绝对路径 |
| List<String> listDirectories(String path) | 根据路径获取目录文件中的所有文件的绝对路径 |
| boolean clear(Object object) | 清空对象 |
| Date sqlDate(Date date) | 使用给定的date设置此日历的时间 |
| Date sqlDate(Date date, OpType type) | "按类型返回此日历的时间戳或返回一个Date对象并将其初始化为为“纪元”的标准基准时间。 |
| List<String> loadLines(String fileName, String encoding) | 将文件以指定编码按行读取到列表里 |
| void saveLines(List<String> lines, String lineEnding, String fileName, String encoding) | 将lines按行写到到指定fileName的文件,以系统默认分隔符分割,文件按encoding编码 |
| void saveContent(String content, String fileName, String encoding) | 将content写入 fileName,文件按 encoding编码 |
| void resetQuietly(IStream s) | 将输入流读取位置重置回标志位 |
| Workbook getWorkbook(IStream s) | 获取工作簿 |
| String[] loadExcelSheetNames(IStream s) | 获取所有工作簿名称 |
| int loadExcel(List<String[]> list, IStream s, int sheetIndex, int rowOffset, int rowMax, int columnOffset, int columnCount) | 加载Excel |
| String getCellValue(Cell cell, CellType type) | 根据类型获取单元格值 |
| int unloadExcel(Object value, Row row, int cellNum) | 根据value类型确定Excel指定行的单元格数据类型并把对应的值赋给单元格。 |
| void unloadExcel(List list, Sheet sheet) | 将list中的数据加载到Excel表中 |
| void unloadExcel(List[] lists, String[] sheetNames, IStream s, boolean flag) | 根据表名创建工作表并将list数据加载到表里 |
| void unloadExcel(List list, IStream s, boolean flag) | 创建工作表并将list数据加载到表里 |
| synchronized void createMutex(String name, int size) | 创建互斥锁 |
| void releaseMutex(String name) | 释放互斥锁 |
| void acquireMutex(String name) | 获取互斥锁 |
| void forceDelete(File path) | 根据文件路径强制删除 |
| int getFormatLength(String format, int length) | 获取format格式化后的长度 |
| String combineStyle(String oldStyle, String style) | 合并样式 |
| StringBuffer combineStyle(StringBuffer oldStyle, String style) | 合并样式 |
| String getWebType(IStream stream) | 获取IStream类型 |
| String getWebFileName(String browserType, IStream stream) | 获取网页文件名 |
| boolean equals(String value1, String value2) | 判断value1和value2的值是否想等 |
| void exitRule() | 空方法 |
| List<CodetableItem> getCodetable(String codeName) | 空方法 |
| String encryptPassword(String srcPassword) | 加密srcPassword |
| void saveData(IModule module, IStream os) | 将模板module的所有数据写入到流os中 |
| <T extends IModule> void saveData(IModuleList<T> list , IStream os) | 保存IModuleList的所有数据到流os中 |
| String getCodetableLabelOfTd(String codetable, String key,String language) | 按键值获取指定Td代码表标签 |
| String getCodeTableKeyOfTd(String txt, String codetable, String language) | 按标签获取指定Td代码表键值 |
| void setTblText(String key, String table, String language, String value) | 根据table和language在码表文件中插入键值 |
| IStream getTblKeyList(String codetable, String language) | 按codetable和language获取指定编码表所有标签和值的流 |
| List<CodetableItem> getCodeTable(String codeName,String lang) | 根据codeName和lang获取指定编码表 |
| String getPath(IBaseObject baseObject) | 获取baseObject路径 |
| void loadData(IModule module, IStream stream) | 将数据流中数据加载到模块中 |
| String toJson(Object dataMap) | 将对象转换成JSON格式 |
| <T> T fromJson(String json,Class<T> clazz) | 将json格式数据转换成类 |
| String covCnAmt(BigDecimal amt) | 将BigDecimal数据格式转换成中文数字符号表示 |
| String covEnAmt(BigDecimal amt) | 将BigDecimal格式数据转换为英文数字符号表示 |
| String convertdhundred(String s) | 将String格式的前3个数据转换为英文数字符号表示 |
| String toString(int str, int len) | 在str的末尾中添加len个长度的0最后以新的String表达 |
| String toString(double str, int len) | 将str取整后在其后面添加len个长度的0最后以新的String表达 |
| String toString(BigDecimal str, int len) | 将str取整后在其后面添加len个长度的0最后以新的String表达 |
| String lpad(String str,int len,char c) | 在str前面添加字符c直到整个字符数组长度为len最后以新的String表达 |
| String rpad(String str,int len,char c) | 在str的末尾中添加len个长度的字符c最后以新的String表达 |
| int streamCount(IStream stream) | 返回IStream中行数和 |
| int streamSearch(IStream stream,String line) | 查找IStream中line最先出现的位置 |
| int streamSearch(IStream objStream, String vtag, int start, int end) | 查找IStream中指定行范围vtag最先出现的位置 |
| int streamSearch(IStream objStream, String vtag, int start) | 查找IStream中指定开始位置到结束vtag最先出现的位置 |
| void streamSetLine(IStream stream,int idx,String line) | line替换objStream中的第idx行的内容 |
| String streamGetLine(IStream stream, int idx) | 获取objStream中第idx行位置的内容 |
| void streamSet(IStream src,IStream dist) | dist中的数据覆盖src原有的数据 |
| void streamSet(IStream src,String str) | 将str中以换行符或换行符和回车符为结尾分割的字符串按行添加在sec末尾 |
| void streamSet(IStream src,String str,int len) | str替换src中的第len行的内容 |
| void streamSet(IStream src,String str,double len) | str替换取整后的在src中第len行的内容 |
| void streamInsert(IStream stream,int idx,String line) | 在objStream中的第idx行插入line |
| void streamInsert(IStream stream,int idx,IStream lines) | 将line中的数据依次按行取出并在stream中从第idx行开始在idx依次递减一行的位置插入 |
| void streamDelete(IStream stream,int idx) | 删除stream中第idx行的数据 |
| void streamSort(IStream stream) | 将stream中列表数据按升序排序 |
| void streamSort(IStream stream,boolean keepsort) | 将stream中列表数据按升序排序 |
| void streamSave(IStream stream, String fileName) | 将流保存到文件文件名 |
| void streamLoad(IStream stream, String fileName) | 加载文件fileName的内容到流stream中 |
| void streamClear(IStream stream) | 通过删除所有行来清除流stream的内容。 |
| void getAttributeStream(IStream out,IStream stream,String attr) | 根据attr将stream流中的属性列表的值覆盖到out流中 |
| void setAttributeStream(IStream out,String attr,IStream dist) | 将流out的attr的属性流设置为dist |
| void setAttributeStream(IStream out,AttrGetter attr,IStream dist) | 将流out的attr的属性流设置为dist |
| int getSelectedLine(IStream stm) | 返回表示流的树视图中当前选定行的索引 |
| int getSelectedRow(ModuleList<? extends IModule> list) | 空方法 |
| String fileCreate(String filename) | 创建一个新的空文件,该文件具有唯一的名称和0字节的大小,并返回该文件的名称。 |
| String fileCreate(String filename,String val) | 创建一个新的空文件,该文件具有唯一的名称和0字节的大小,并返回该文件的名称。 |
| String convertPrefix(String name) | 获取name的前缀 |
| void setAttribute(IDatafield field,String ATTR,Object val) | 根据ATTR和field将context的attrmap设置为val |
| int getAttribute(IDatafield field,String ATTR) | 根据field和ATTR获取context的attrmap对应的属性值 |
| int getAttribute(IModule parent,String prop,String ATTR) | 根据模块parent、prop与ATTR获取将context的attrmap对应的属性值 |
| String getAttributeText(IDatafield field,String ATTR) | 根据field和ATTR获取context的attrmap对应的属性值 |
| String getAttributeText(IModule parent,String prop,String ATTR) | 根据模块parent和prop与ATTR获取context的attrmap对应的属性值 |
| <T> T getAttributeValue(IModule parent,String prop,String ATTR) | 根据模块parent和prop与ATTR获取context的attrmap对应的属性值 |
| void setAttribute(IModule parent,String prop,String ATTR,Object val) | 根据模块parent和prop与ATTR把context的attrmap对应的属性值设置为val的值 |
| void setAttributeText(IModule parent,String prop,String ATTR,Object val) | 根据模块parent和prop与ATTR把context的attrmap对应的属性值设置为val的值 |
| void setAttributeText(Date date,String prop,String ATTR) | 根据date和prop把context的attrmap的属性值设置为ATTR |
| Void setValues(IModule parent,String prop,IStream values) | 根据模块parent和prop把context的attrmap对应的属性值设置为values的值 |
| void setValues(IModule parent,String prop,String values) | 根据模块parent和prop把context的attrmap对应的属性值设置为values的值 |
| void setValues(IDatafield datafield,IStream values) | 根据模块datafield把context的attrmap对应的属性值设置为values的值 |
| void setValues(IDatafield datafield,String values) | 根据模块datafield把context的attrmap对应的属性值设置为values的值 |
| IStream getValues(IModule parent,String prop) | 根据模块datafield和prop从context的attrmap获取对应的属性值 |
| IStream getValues(IDatafield datafield) | 根据模块datafield从context的attrmap获取对应的属性值 |
| void setModified(IDatafield field) | 设置field的修改位(用于判断是否主动修改) |
| void setModified(IModule parent,String prop) | 设置IModule的prop修改位(用于判断是否主动修改) |
| void resetModified(IModule module) | 重置模块parent的修改标志。清除模块中包含的所有数据字段的修改标志,并递归地清除所有子模块中的修改标志。 |
| void resetModified(IDatafield field) | 重置数据字段field的修改标志。 |
| void resetModified(IModule parent,String prop) | 重置模块的prop的修改标志。 |
| boolean isModified(IModule parent,String prop) | 判断模块是否被修改 |
| void resetEnabled(IDatafield field) | 重置数据字段field的启用的标志 |
| void resetEnabled(IModule parent, String prop) | 重置关于模块parent的属性prop的启用标志 |
| void setEnabled(IDatafield field) | 设置数据字段field的启用标志 |
| void setEnabled(IModule parent, String prop) | 设置关于模块parent的属性prop的启用标志 |
| boolean isEnabled(IDatafield field) | 判断field是否被启用 |
| boolean isEnabled(IModule parent,String prop) | 判断关于模块parent的属性prop是否被启用 |
| void resetVisible(IModule parent, String prop) | 重置关于IModule 的属性prop可视化的标志 |
| void resetVisible(IModuleList parent, String prop) | 重置关于IModuleList 的属性prop可视化的标志 |
| void setVisible(IPanel panel) | 设置IPanel 的可视化的标志 |
| void setVisible(IModule parent, String prop) | 设置IModule 的属性prop可视化的标志 |
| void setVisible(IModuleList parent, String prop) | 设置IModuleList 的属性prop可视化的标志 |
| <T> void setVisible(IDatafield<T> value) | 设置数据字段value的可视化标志 |
| boolean isVisible(IModule parent,String prop) | 判断关于模块parent的属性prop是否可视化 |
| void printTemp(Object... args) | 将对象写入输出流 |
| void printTempUsing(Object... args) | 将对象用模板格式化写入输出流 |
| void mallocPrintBuffer() | 输出缓冲 |
| void printUsingArea(String area) | 修改输出流写入标志 |
| String releasePrintBuffer() | 释放输出缓冲并并返回字符串格式的缓冲值 |
| int promptYesNo(String message) | 根据message提示yes或者no (默认返回1 yes) |
| int promptYesNo(String s, String rtnTxt) | 根据message提示yes或者no (默认返回1 yes) |
| void setCodeValues(String key, IStream stream) | 空方法 |
| void setCodeValues(IDatafield<Object> datafield, IStream stream) | 为datafield指定的字段设置代码值为stream |
| Date dateTimeMake(Date inidatfro, int i,String timezone) | 空方法 |
| Date dateTimeMake(Date inidatfro, int i) | 返回inidatfro |
| void saveData(IModule module, IStream stream,String section,String prefix) | 空方法 |
| void saveData(IBaseObject moduleOrList, IStream stream,String section) | 将moduleOrList的所有数据保存在流stream中,可选参数为moduleOrList的名称。 |
| void loadData(IModule module, IStream stream, String section) | 根据section从流stream中把数据读取到模块module中 |
| String module2Data(IBaseObject moduleOrList) | 将moduleOrList的所有数据写为字符串 |
| Object data2Module(Class clazz,String dataString) | 将dataString转换为对象 |
| String streamGetAdditional(IStream stm,String s1,String s2) | 根据指定条件获取IStream 的值 |
| void streamSetAdditional(IStream stm, String insert, String insPos, String txt) | 空方法 |
| boolean streamPrint(IStream logstr) | 默认为true |
| void setLine(String block,int idx,String text) | 空方法 |
| String getLine(IStream stream, int idx) | 获取stream中第idx行的文本内容 |
| String getLine(IStream stream, double idx) | 获取stream中idx取整后的对应行的文本内容 |
| String getLine(String block, int line) | 获取block中以换行符或者回车符为结尾来分割的字符块中第line个字符块。 |
| String getLine(String block, double line) | 获取block中以换行符或者回车符为结尾来分割的字符块中第line个字符块。 |
| int compareTo(Object o1,Object o2) | 比较o1与o2的大小 |
| String getI18NString(String moduleName,String key) | 根据moduleName和设置的文本环境获取资源包,并通过key开获取包中对应的字符串 |
| String getI18NString(IModule m,String key) | 根据模块m和key调用getI18NString(String moduleName,String key)获取资源包中与key值对应的字符串 |
| String Signature(String s, int i) | 空方法 |
| <T> T cast(Class<T> clazz ,Object value) | 判断clazz和value是否为空并设置错误码值,最终返回value值 |
| String generateSerialNum() | 获取随机UUID |
### 2、MdaUtilsEx类型函数
| 函数 | 描述 |
| :----------------------------------------------------------- | ------------------------------------------------------------ |
| BigDecimal abs(BigDecimal decimal) | 获取一个BigDecimal类型参数的绝对值 |
| double abs(double number) | 获取一个Double类型参数的绝对值 |
| int abs(int number) | 获取一个Int类型参数的绝对值 |
| BigDecimal addBig(Object m, Object n) | 将两个BigDecimal类型参数做加法运算 |
| void beginarea(int a, int b) | 空方法 |
| void beginarea(int a, int b, int c, int d) | 空方法 |
| void beginheader(String tdPageFirst) | 空方法 |
| String blockFill(String res) | 未实现 |
| String blockFill(String res, IModule iModule) | 未实现 |
| void cacheClear() | 清除缓存中的所有数据 |
| void cacheDelete(Object obj, String... keys) | 根据传入参数删除缓存中对应的数据 |
| Object cacheRead(Object outobj, Object... keys) | 根据参数从缓存中获取相应的数据 |
| boolean cacheWrite(Object obj, Object... keys) | 根据参数向缓存中写入数据 |
| int callInterfaceStream(String name, String interfaceVar, IStream stream, Argument<String> rtnTextBox) | 调用 Sysmod#callinterface |
| boolean canLoad(String str) | 空方法 |
| int ceil(BigDecimal d) | 向上取整得到一个int类型值 |
| double ceil(double d) | 向上取整得到一个Double类型值 |
| int ceil(int d) | 向上取整得到一个int类型值 |
| Boolean chechIsNumber(Object o) | 判断传入参数是否为数字类型对象,若是则返回true |
| Boolean checkIsBig(Object o) | 判断传入参数是否为BigDecimal类型 |
| boolean checkStatement(IModule _this,String rule) | 对参数模型中声明定义的Rule进行检查 |
| void clearPostQueue() | 清除Post队列中的数据 |
| boolean collectArguments(IModule _this, Method m, String[] arr, List<Object> argsList) | 获取模型中的参数 |
| String combineKey(Object obj, Object... keys) | 将obj的类型信息和keys组合在一起 |
| String convertBlock(String argBlock, int i) | 根据参数i的值,对argBlock中的值进行对应的替换操作 |
| String convertBlock(String block, int convtype, int lines, int linelength) | 空方法 |
| void convertSwift(IStream input, IStream output, Integer start, Doublelength) | 将input内容转化为swift输出流 |
| convertSwift(IStream input, IStream output, Integer start, Integer length) | 将input内容转化为swift输出流 |
| void copyValues(Object dest, Object src) | src拷贝到dest |
| Date dateAddW(Date date, int i, String lang) | 返回一个由date + i个工作日产生的日期 |
| Date dateSub(Date date, int i) | 返回一个由date - i个工作日所产生的日期与历元之间的毫秒值 |
| Date dateTimeAdd(Date sysmod, int i, int tim) | 返回sysmod + tim所对应日历天数后产生的日期时间 |
| long dateTimeDiff(Date begin, Date end) | 返回两个参数之间相差毫秒值的绝对值 |
| Date dateTimeGetDate(Date sysmod) | 返回参数日期与当前日期之间相隔的天数 |
| double dateTimeGetTime(Date date, int i, String attr) | 时间换算成天数 |
| void dateTimeSetTime(Date dattim, double i, String tdContextTZSYSTEM) | 将传入的时间参数date的时间部分设置为tdContextTZSYSTEM中的时间 |
| int dayOfWeek(Date datint) | 根据传入参数得到该日期对应所在周的哪一天 |
| String dcsw(int amt, String dt, String cr) | 空方法 |
| void ddeSend(String trigger, String ddeTopic, IStream argStr) | 空方法 |
| void ddeSetTopic(String str) | 空方法 |
| IStream ddeSTREAM() | 返回一个系统流 |
| boolean ddeTestTopic(String trigger, String sysmod) | 空方法 |
| BigDecimal divBig(Object m, Object n) | 计算m除以n |
| void dllCallByName(String libnam, String tdbase64decode) | 空方法 |
| void dllClose(String file) | 空方法 |
| void dllClose(String libnam, int i) | 空方法 |
| int dllGetLong(int i) | 空方法 |
| String dllGetText(int i) | 空方法 |
| void dllInitCall() | 空方法 |
| void dllOpen(String libnam, int i) | 空方法 |
| void dllPushLong(int txtlen) | 空方法 |
| void dllPushLongPtr(String s, long bufsize) | 空方法 |
| void dllPushText(String fullfilename) | 空方法 |
| void dllPushTextPtr(String fullfilename) | 空方法 |
| void dllPushTextPtr(String s, long bufsize) | 空方法 |
| void endarea() | 空方法 |
| void endheader() | 空方法 |
| void executePostQueue() | 执行post队列 |
| void exitSession() | 空方法 |
| String expandEnv(String str) | 展开并返回环境变量字符串,即用环境变量定义时的值来替换字符串中对该环境变量的引用 |
| Date fileDate(String frmFile) | 返回参数文件frmFile的修改日期 |
| Date fileDateTime(String frmFile) | 返回上次修改至今的时间间隔 |
| Date fileDateTime(String frmFile) | 返回参数文件frmFile的修改时间戳 |
| double fileTime(String str) | 根据传入参数str分别获取时、分、秒所对应的值,利用所得值做时+分/100+秒/10000的运算,并将结果返回 |
| Method findCasecadeMethod(IModule root, IModule _this, Argument outModule, String methodName, String[] args) | 在root下所有的IModule查找方法methodName,将找到的IModule放入outModule,返回找到的方法 |
| Object findFieldValueInStream(String fieldName,IStream stm, String section) | 从流中查找字段值 |
| Method findMethod(IModule _this, Class clazz, String methodName, String args[]) | 在clazz中的查找名字为methodName的方法 |
| List<String> findStreamSectionValue(IStream stream,String section) | 返回流中查找与section相等的下一行组成的集合 |
| int floor(Object d) | 返回一个不超过参数d的最大整数 |
| String fmtAmount(BigDecimal fmtamt, String cur) | 根据货币代码cur将fmtamt转为对应格式的字符串 |
| String fmtAmount(Double fmtamt, String cur) | 根据货币代码cur将fmtamt转为对应格式的字符串 |
| String fmtAmount(Double fmtamt, String cur, String LANG) | 根据货币代码cur和语言标识符LANG将fmtamt转为对应格式的字符串 |
| String fmtAmount(BigDecimal fmtamt, String cur, String LANG) | 根据货币代码cur和语言标识符LANG将fmtamt转为对应格式的字符串 |
| String fmtAmount(Integer fmtamt, String cur, String LANG) | 根据货币代码cur和语言标识符LANG将fmtamt转为对应格式的字符串 |
| String fmtDateLong(Date date) | 将参数日期date转为BASIC_ISO_DATE格式的日期 |
| String fmtDateLong(Date today, String language) | 将参数日期date转为参数language对应格式的日期 |
| String fmtDateShort(Date date) | 按照默认时区对参数日期date进行格式化转换 |
| String fmtDateShort(Date date, String fmt) | 按照默认时区对参数日期date进行格式化转换 |
| String formatText(String format, Object... args) | 对format内容进行格式化替换 |
| String getAbsPath(String path) | 获取绝对路径 |
| String getAttributeText(IDatafield argFld, String tdAttrCodeValues) | 获取字段属性状态的值 |
| String getAttributeText(String rattyp, String tdAttrCodeValues) | 获取字段属性状态的值 |
| String getAttributeText(IStream iStream, String tdAttrCodeValues) | 获取字段属性状态的值 |
| String getCodeTableKeyOfTd(String txt, String table, String language) | 读table_language配置文件,根据key 查询出对应的key |
| String getCodetableLabelOfTd(String key, String table, String language) | 读table_language配置文件,根据key 查询出对应的Label |
| String getCodeValueText(String type1, String type2) | 获取码表值的文本内容 |
| String getContent(IModule _this, String target) | 将IModule和target组合形成路径获取对应的字段值 |
| String getContent(String target) | 获取参数字段的内容 |
| Date getContentDate(IModule _this, String target) | 将IModule和target组合形成路径获取对应的日期 |
| Date getContentDate(String target) | 获取参数日期字段的内容 |
| Date getContentDateTime(IModule _this, String target) | 将IModule和target组合形成路径获取对应的日期 |
| Date getContentDateTime(String field) | 获取名称为field的日期字段的内容 |
| <T> IDatafield<T> getContentField(IModule parent, String target) | 通过parent和target拼凑路径,获取字段 |
| IDatafield<T> getContentField(String target) | 通过路径获取字段 |
| BigDecimal getContentNumeric(IModule _this, String target) | 通过parent和target拼凑路径,获取BigDecimal |
| BigDecimal getContentNumeric(String target) | 通过路径获取BigDecimal |
| void getContentStream(IDatafield datafield, String fieldname) | 将参数fieldname的内容赋给参数datafield |
| void getContentStream(IStream stream, String fieldname) | 将参数fieldname的内容赋给参数stream |
| String getContext(String key) | 通过参数key的值获取上下文信息 |
| void getContextStream(IStream stm, String str) | 用错误信息填充stm |
| void getDataInfoCompare(IModule mod, IStream data, String section, IStream addfldnam, IStream dif) | 将mod模块及其子模块所含属性与sections属性流中所含属性进行比较,并根据比较情况将不同属性添加至不同的集合中进行处理 |
| int getDay(Date date) | 获取data在当地时间中对应月份的哪一天 |
| void getDEDGRP(IModule module, String b2binr) | null |
| String getDescription(IDatafield d) | 获取字段d的描述信息 |
| String getDescription(IPanel p) | 获取面板p的描述信息 |
| String getDescription(IPanel errPan, int i) | 返回数据字段p面板的描述文本 |
| void getDirStream(IStream dirstream, String path, String filemask, int filetype) | 填充流dirstream所包含的所有文件,或着目录列表 path匹配的文件。在检索目录列表之前清除dirstream |
| int getEventType() | 返回触发规则执行的操作类型 |
| <T> IDatafield<T> getField(String target) | 泛型方法,用于获取参数target字段 |
| <T extends IModule> int getGridRow(ModuleList<T> setfel, int i) | 返回模块列表setfel中索引i的所在行 |
| String getIniBlock(String iniName, String block, String key) | 检索iniName文件中block部分的所有条目(必须指定文件扩展名),并将其以文本块的形式返回,每行一个条目。key是节中所有条目的基名称。条目名称以节中条目的行号作为后缀,匹配值添加到块中。 |
| int getIniInt(String iniName, String block, String key) | 从配置文件中获取数值 |
| IStream getIniSection(String iniName, String s1) | 获取一个包含配置文件中输入键列表的块。 |
| String getIniStr(String iniName, String block, String key) | 从配置文件中获取文本 |
| String getLang() | 获取配置环境中的语言类型 |
| int getMonth(Date date) | 获取参数date在本地日期中对应的月份 |
| IPanel getPanel(String str) | 获取一个面板 |
| String getPanelInfo(IPanel pan, String attr) | 返回有关pan面板的信息 |
| String getPostableMethod(IModule module, String s) | 获取已发布可调用的方法 |
| void getProperty(String tdUnit, String tdUnitmm) | 获取属性 |
| void getptxinr(String role, String ptyInr, String ptaInr) | 执行Platfrom中的getptxinr方法 |
| String getTableName(Object bo) | 获取表名 |
| IStream getTblKeyList(String table, String language) | 获取一个由table和language指定的代码表中所有键组成的列表 |
| String getText(String format, Object... args) | 从消息系统中检索消息 |
| Date getTomorrowOrYesterday(Date date, int i) | 获取在date日期基础上加i天后所得的日期距离历元的毫秒值 |
| void getUser(String uid, Argument... args) | 检索用户的登录信息 |
| String getValues(IDatafield iDatafield) | 获取参数字段iDatafield的内容 |
| IStream getValues(String s2) | 获取参数s2在上下文中的值 |
| int getYear(Date date) | 获取参数date在本地日期中对应的年份 |
| int gridCount(IModuleList<?> list) | 获取模块列表list中的模块数 |
| <T extends IModule> void gridDeleteRow(IModuleList<T> list, int i) | 该方法是一个泛型方法,用于从模块列表list中删除由i指定的模块,如果i超出有效范围,则设置错误码。 |
| <T extends IModule> void gridDeleteRow(IModuleList<T> list, int i, int diff) | 删除list中指定i行的模块,如果i超出有效范围,则设置错误码。从i行开始删除最多指定的diff数量的模块实例 |
| <T extends IModule> void gridInsertRow(IModuleList<T> list, int i) | 创建一个新的模块实例并将其插入到模块列表list中索引为i的位置 |
| <T extends IModule> void gridInsertRow(IModuleList<T> list, int i, int count) | 创建count个模块实例并将其插入到模块列表list中,从索引为i的位置开始插入 |
| <T extends IModule> void gridSort(ModuleList<T> list, String col) | "根据col的值对模块列表列表中的列按照名称以升序或降序进行排序,ASCENDING表示升序、 |
| <T extends IModule> void gridSort(ModuleList<T> list, String col, String order) | 对list进行排序 |
| void hideBitmap(String reports) | 隐藏位图框架对象 |
| boolean intConvertBoolean(int number) | 将int类型的值转为boolean值 |
| void invokeExpress(IModule _this, String rule, double delay) | 执行模型指定路径的方法,如果delay小于0,则立即执行。而如果delay不小于0,则会进入队列。 |
| void invokeExpressMethod(IModule _this, Object target, Method method, String[] args) | 反射执行表达式中的方法 |
| Boolean isHoliday(Date date, String lang) | 判断是否为假期 |
| boolean isReturnCall() | false |
| Boolean isWeekend(Date date, String lang) | 判断是否为周末 |
| String leftTrim(String str) | 遍历传入的参数字符串,若字符串中有空格,则截取从str[0]到空格所在位置的字符组成一个新的字符串并返回 |
| int len(String str) | 以字节为单位计算传入参数str的长度 |
| void lnkReturnToFirst() | 执行Platform中的lnkReturnToFirst方法 |
| String loadContent(String str, IStream stm) | 从stm流中读取str的值并将其作为文本返回 |
| String loadContent(String str, IStream stm, String s2) | 从stm流中读取str的值并将其作为文本返回,s2指定加载值的流 |
| <T extends IModule> void loadContentStream(IStream stm) | 将最近一次调用LoadContent得到的结果赋值给流变量stm |
| void loadTextStream(IStream stm, IPanel panel, int i) | 从stm流中读取信息并通过指定格式i显示在panel上 |
| void logText(String filename, String text) | 将text的内容添加到filename文件中 |
| String macGen(IStream str, int i) | 计算并返回str的校验和 |
| String macGen(String text, int startval) | 计算并返回text的校验和,startval是一个数字初始值 |
| String mid(String str, int p) | 在Str字符串中从索引值为p的位置开始截取一个子串并返回 |
| String mid(String str, int p, int l) | 在Str字符串中从索引值为p的位置开始,截取一个长度为L的子串并返回 |
| BigDecimal mulBig(Object m, Object n) | 对传入参数m、n做乘法运算 |
| void pause(BigDecimal code) | 类似于Thread.sleep() |
| void popupFrame(IPanel panel) | 弹出窗口 |
| void popupTitledFrame(Object o, String title) | 弹出窗口 |
| int pos(String str, String sub) | 返回子串sub在字符串str中的起始位置 |
| void postDefaultRule(IModule module, String field) | 执行默认的规则 |
| void postDefaultRule(IModule module,String field,boolean isModuleListItem) | 执行默认的规则 |
| void postDefaultRule(Ditopn ditopn, String s) | null |
| void postDelete(String queLin) | null |
| boolean printText(IPanel rawpanel, boolean b, int cpycnt, String prt) | 打印rawpanel面板包含的文本 |
| String promptStream(IStream stream, String caption, String values) | 在模态窗口中显示stream信息并等待输入 |
| void recalc(String flt, String selusg, String selusr, String selusgset) | 空实现 |
| void redisplay(String msg) | 空实现 |
| BigDecimal round(BigDecimal num, int n) | 将num进行四舍五入,保留n位有效数字并返回 |
| void saveDisplayToStream(IStream stream) | 将快照信息保存到stream流中 |
| void saveText(IPanel panel, String fileName, int i) | 空实现 |
| void saveTextStream(IStream stream, IPanel panel, int i) | 空实现 |
| int searchBlock(IStream s1, String s2) | 返回s1流中与s2匹配的行的索引 |
| void setActivePanel(IPanel panel, boolean b) | 空实现 |
| void setContent(IDatafield datafield, String path, IStream stm, String section) | 将stm流中path的值赋给字段datafield |
| void setContent(IStream stm1, String path, IStream stm2) | 将stm1流的值赋给stm2流中path属性流 |
| void setContentDate(String target, Date value) | 将参数value的值赋给参数字段target |
| void setContentDateTime(String fieldname, Date datetime) | 将参数datetime的值赋给参数fieldname |
| <T> void setContentNumeric(String target, T val) | 将参数val的值赋给参数target |
| void setContentStream(String fieldname, IStream stream) | 将参数stream的值赋给参数fieldname |
| void setContentText(String target, String value) | 将参数value的值赋给参数target |
| void setContext(String key, Object... obj) | 通过参数设置上下文信息 |
| void setDescription(String target, String s) | 空实现 |
| void setFieldValue(IDatafield field, String value) | 将参数value的值赋给参数field |
| <T> void setFieldValue(IModule parent, String fieldTarget, T value) | 通过参数parent和fieldTarget获取目标字段,并将参数value的值赋给目标字段 |
| void setFieldValue(IStream stream, String str) | 去除Str字符串中的换行符得到一个新的字符串,并将新字符串赋值给stream流的行 |
| <T> void setFocusField(IDatafield<T> field) | 空实现 |
| void setHint(Object... objects) | 空实现 |
| void setIcon(String icoName) | 空实现 |
| void setIniBlock(String iniName, String s2, String s3, String block | 用参数block的内容替代iniName文件中参数s2部分的值 |
| void setIniInt(String iniName, String block, String key, int value) | 将参数value当做block部分的配置记录key写进配置文件iniName |
| void setIniStr(String iniName, String block, String key, String value) | 将参数value当做block部分的配置记录key写进配置文件iniName |
| void setLang(String lang, IPanel... panel) | 设置环境中的语言种类 |
| void setLine(String block, int i, String s2) | 将block部分的索引为i的行的内容设置为s2所包含的内容 |
| void setPanelOption(IPanel panel, String option, String val) | 根据val的值设定panel面板运行时的选项 |
| void setProperty(String tdUnit, String tdUnitmm) | 设置执行文档规则期间使用的的属性 |
| void setSelectedLine(IStream stm, int i) | 在表示stm流的树状图中,将参数i对应的行设为当前选定行 |
| <T extends IModule> void setSelectedRow(ModuleList<T> list, int i) | 将模块列表中的当前选定行更改为参数i所对应的行 |
| void setStyleNum(int i, String act) | 空实现 |
| void setTblText(String key, String table, String language, String value) | 修改key对应的内容或者在码表中插入一条新的记录 |
| void setTDStyle() | 空实现 |
| void setTitle(String str) | 空实现 |
| void setUser(String uid, Argument... args) | 空实现 |
| int sgn(Object n) | 将传入参数与BigDecimal类型常量ZERO比较,根据比较结果返回-1、0、1分别表示小于、等于、大于 |
| void shellExec(String file) | 前台方法空实现 |
| void showAboutPicture(String s) | 前台方法空实现 |
| void showBitmap(String rep_de, int i) | 前台方法空实现 |
| void showDisplay(IStream image) | 前台方法空实现 |
| void showHelpText(String getFocusFieldPos, String hlp) | 前台方法空实现 |
| void showNotifyMessage(double num, String s) | 前台方法空实现 |
| String signature(String s, int i) | 待实现方法 |
| void sockCall(int fd, IStream inStream, IStream outStream) | 前台方法空实现 |
| void sockClose(int fd) | 前台方法空实现 |
| int sockOpen(String socketseve, String socketport) | |
| String[] splitArgumentsString(String argsString) | 以‘,'为分隔符将参数字符串argsString拆分,并将拆分得到的子串存储在String类型的数组作为返回值返回 |
| void startVideo() | 前台方法空实现 |
| void status(String format, Object... obj) | 在应用程序状态栏显示参数format的内容 |
| void stopVideo() | 前台方法空实现 |
| boolean streamPrint(IStream logstr) | 打印logstr流中的文本内容 |
| List<String> streamStrSplit(String str) | 以换行符为分隔符拆分传入的参数字符串str,将拆分所得子串存入列表并返回 |
| BigDecimal subBig(Object m, Object n) | 用传入参数m 减 参数n并返回计算结果 |
| void sysDumpInfo(String formatText) | 系统转存信息 |
| IStream sysStream() | 从环境中获取系统流 |
| String tdVCSReadName(String dokudisp, String s) | 获取在当前环境下,文件s在dokuisp分区中的完整路径 |
| double time() | |
| double time(int i) | 根据公式小时+分钟/100+秒/10000+毫秒/10000000做运算并以十进制返回当前用户时区的当前时间 |
| Date toDay() | 返回在当前时区中今天的日期 |
| int toInt(BigDecimal numberic) | 将传入参数的类型转为int类型 |
| LocalDate toLocalDate(Date date) | 返回参数date在当前时区中对应的瞬时时间 |
| String toLower(String text) | 将参数text中的字符全部转为小写并返回转换后得到的字符串 |
| String toUpper(String text) | 将参数text中的字符全部转为大写并返回转换后得到的字符串 |
| String trim(Object obj) | 返回参数obj去除尾随和前导空格后得到的字符串 |
| String trimEnd(String str, String endStr) | 从str字符串中截取一个子串,从索引为0的位置开始到endStr最后一次在str中出现的索引位置-1 |
| StringBuilder vertical(int mm, String s, String str) | 前台方法空实现 |
| void winExec(String dest) | 前台方法空实现 |
| void winExec(String dest, boolean bool) | 前台方法空实现 |
| Object wrapperValue(IModule _this, String val, Class basicClass) | 对传入参数进行包装 |
| void XMLParseSAX(IModule module, IStream argxmlset) | 解析XML文件 |
## 模型转换开发步骤
### 1.使用BD工具生成后端代码
打开bd工具勾选需要转换的交易后,点击Compile & Deploy编译。
......@@ -68,7 +745,7 @@ MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过
![vo2](../assets/images/vo2.png)
#### 2.将生成的前端代码复制到vue-gjjs项目中
### 2.将生成的前端代码复制到vue-gjjs项目中
gjjs-bdproject/build/VueSpring/front/frontProject/views/Business目录下交易名的文件夹
......@@ -92,7 +769,7 @@ gjjs-bdproject/build/VueSpring/front/frontProject/model目录下交易名的文
**注意:**后续前端页面开发工作参照前端开发文档资料。
#### 3.修改菜单配置文件
### 3.修改菜单配置文件
修改gjjs-common/workroot/INI目录下后缀为.dof的配置文件
......@@ -106,7 +783,7 @@ gjjs-bdproject/build/VueSpring/front/frontProject/model目录下交易名的文
![image-20230223160907200](../assets/images/image-20230223160907200.png)
#### 4.进入交易页面
### 4.进入交易页面
运行Bt2poinnewApplication启动后端
......
## 后端项目整体介绍
# 后端项目整体介绍
## 后端项目整体介绍
# 后端项目整体介绍
#### 项目结构介绍
## 项目结构介绍
gjjs-business模块文件结构
![backenddev1](../assets/images/backenddev1.png)
#### 项目流程介绍
## 项目流程介绍
##### 1.请求流程
### 1.请求流程
![image-20210918165941920](../assets/images/gjjs-common2.png)
......@@ -17,7 +17,7 @@ gjjs-business模块文件结构
##### 2.Service与Rule如何调用
### 2.Service与Rule如何调用
1)AbstractRouteService是service层最上层抽象类,对一些基本公共方法(init、executeRule、executeDefault等,这些方法基本每个交易都会去调用)做了实现,保证执行流程的统一,通过getEmitter这个抽象方法来实现多态(子类通过实现这个方法来处理不同业务逻辑,不用去关心具体的执行流程)
......@@ -31,7 +31,7 @@ gjjs-business模块文件结构
![](../assets/images/hdservicerule1.png)
##### 3.Emitter的方法分类
### 3.Emitter的方法分类
RuleEmitter大概有4类方法,分别是
......@@ -43,9 +43,9 @@ executeDefault (default rule)
executeCheck (参数、数据校验类rule)
##### 4.消息体格式说明
### 4.消息体格式说明
###### 请求消息体
#### 请求消息体
请求消息体是一个json格式数据,数据格式形如
![](../assets/images/qqxxt2.png)
......@@ -63,7 +63,7 @@ executeCheck (参数、数据校验类rule)
![请求实体类](../assets/images/请求实体类.png)
###### 响应消息体
#### 响应消息体
响应消息体是一个json格式数据
结果成功响应数据格式形如
......@@ -101,7 +101,7 @@ executeCheck (参数、数据校验类rule)
##### 5.VO的规范
### 5.VO的规范
VO类是前后端数据请求和响应的实体类,VO有一个共同父类VO(BaseVO),字段说明如下:
......@@ -110,9 +110,9 @@ VO类是前后端数据请求和响应的实体类,VO有一个共同父类VO
VO按照交易进行划分,一个交易对应一个VO(比如信用证开证交易对应VO是DitopnVO),VO类使用了lombok插件,不需要set get方法,字段用RelPath注解区分是请求字段还是响应字段(默认没有注解,代表dir属性值是DirType.BOTH,及请求和响应都需要该字段;如果只是请求字段,dir属性值是DirType.IN;如果是相应字段,dir属性值是DirType.OUT),如图:
![](../assets/images/vogf1.png)
##### 6.前后台事件关联方式
### 6.前后台事件关联方式
###### 调用普通Module下事件
#### 调用普通Module下事件
例如:
......@@ -128,7 +128,7 @@ if (rtnmsg.respCode == SUCCESS) {
(2) 同样的,账务面板中的”细节”按钮,对应(Module)setmod中的det事件。使用··``` await this.executeRule(“setmod.det”)```方式调用。
###### 调用ModuleList选中行事件
#### 调用ModuleList选中行事件
例如:账务 Own Commission/Charges 列表,对应模型setmod/setfeg/setfel(ModuleList)。每行数据对应ModuleList中的一个setfel实例。
......@@ -151,7 +151,7 @@ if (rtnmsg.respCode == SUCCESS) {
}
```
###### 事件在普通模型下,但实际处理ModuleList选中行
#### 事件在普通模型下,但实际处理ModuleList选中行
例如:保证金模块中的保证金列表。对应数据模型为:(ModuleList)liaall/liaccv/liaccvg ;但删除操作按钮的对应事件是在(Module)liaall/liaccv模型下的del
......@@ -173,7 +173,107 @@ if (rtnmsg.respCode == SUCCESS) {
}
```
###### 事件在普通模型下,但实际处理IStream选中行
#### 事件在普通模型下,但实际处理IStream选中行
此种情况参考"ModuleList选中行"的处理,只需把selDst的值指向IStream即可。
## 运行机制介绍
### 1、缓存
​ MdaContext作为交易的上下文,在交易初始化时生成,在页面中一个交易的初始化后,后面的请求操作都应使用该MdaContext,故而将MdaContext在生成时放入缓存中,key是UUID生成的随机字符串串pageId。在后续的进入交易时,会先根据pageId取出context,并将context放入ThreadLocal,供后续的方法使用;若取出的context为空,则为执行init初始化交易,生成context并放入ThreadLocal。
### 2、Context
​ MdaContext实现IContext接口,每个交易都有一个MdaContext,在页面初始化时,会执行init操作,生成一个MdaContext,该context存有交易的根模块、交易名、配置信息、快照、错误信息等,通过ThreadLocal来传递。
### 3、sysStream
​ SysStream是一个StreamImpl实例,StreamImpl实现了IStream接口,IStream接口主要是控制字节数组的输入流和输出流。sysStream存放的交易中涉及到的各个模块。
### 4、init
#### (1)初始化规则
​ 在系统尝试执行可选全局过程`EnterTransaction`之后和执行可选全局过程`InitTransaction`之前,在事务启动时执行此类规则。
事务中所有模块实例的 INIT 规则都是递归执行的。每个模块首先执行所有相关模块的 INIT 规则(只有当底层模块中的所有 INIT 都被调用时才会执行),然后是它自己的。因此,事务的 INIT 规则在相关模块的所有其他 INIT 规则之后执行。
#### (2)事务启动期间规则的执行顺序
1.如果存在,则调用全局过程“SUB EnterTransaction”。
2.执行事务中所有模块实例的 INIT 规则。
3.如果已定义,则调用全局过程“SUB InitTransaction”
4.执行事务中所有对象的 DEFAULT 规则。
即:EnterTransaction -> Module Inits -> InitTransaction -> Defaults
### 5、executeCheck
#### (1)检查规则
​ executeCheck用于验证字段字和内容的一致性。可以为(列表的)字段或模块定义检查规则。
#### (2)触发时机
​ 1.当使用键盘按下"Enter"或者失去焦点时
​ 2.当为(列表)模块或字段调用 CheckAll 函数时
#### (3)其他规则
​ 一般情况下,检查规则不能修改任何字段的值。
### 6、executeRule
#### (1)触发时机
​ 前端事件执行executeRule时触发,需要至少提供一个路径,后端根据此路径执行相应的rule后返回。若存在多个路径,则顺序执行
#### (2)执行顺序
​ EVENT --> DEFAULT(s) --> CHECK(s)。当存在多个路径时,每个路径都属于独立的模块,只有一个路径的所有EVENT、DEFAULT、CHECK执行完成后下一路径才会顺序被执行。
### 7、executeDefault
#### (1)默认规则
​ 所有Default规则在事务开始时执行3遍(作为事务启动序列的最后一步)。此外,只要前端任意字段的值发生改变,就会执行默认规则
### 8、set方法触发defaultRule机制
​ 执行任意字段的set方法时,若传过来的新值与旧值不同,则在部分情况下需要执行对该字段进行了引用的所有default规则。
​ 1.该机制是否触发由DCR开关控制,详情请见`DCR说明`
​ 2.字段被引用的default规则由`resources/defaultRule`中定义的码表获取
### 9、队列执行
#### invokeExpress产生的队列
##### (1)产生
​ 由invokeExpress方法产生。当invokeExpress方法被调用且delay参数值不小于0时,该方法中需要被执行的rule会被加入到"tdContextPOSTQUEUE"队列中。
##### (2)执行清空
​ 1.Init过程产生的队列,会在初始化结束前作为最后一个步骤被执行,且执行完成后清空
​ 2.Vo给模型赋值产生的队列,在赋值完成后被立即执行,且执行完成后清空
​ 3.执行Rule产生的队列,会在执行Rule过程结束前作为最后一个步骤被执行(若存在多个Rule,则在每个Rule的最后均会执行),且执行完成后清空
#### set方法触发的DefaultRule队列
##### (1)产生
​ 详情请看`set方法触发defaultRule机制`,该机制产生的方法不会被立即执行
##### (2)执行
​ 1.请求为executeCheck,则作为每个executeCheck方法的最后一个步骤被执行
​ 2.请求为executeDefault,则作为每个executeDefault方法的最后一个步骤被执行
​ 3.请求为executeRule,则作为每个executeRule方法中invokeExpress产生的队列被执行前的前一个步骤执行
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment