yonbip-code-gen-mcp
Version:
YonBIP高级版代码生成MCP
373 lines (275 loc) • 8.72 kB
Markdown
# 打印开发步骤
打印后端开发
打印前端开发
打印模板配置
打印脚本抽取
# 打印后端
## 1 打印Action 类
继承 AbstractPrintAction
重写 getPrintServiceModule() - (返回模块名)
重写 getPrintServiceName() - (返回后端处理类全路径)
```
import nccloud.web.platform.print.AbstractPrintAction;
/**
* 打印action demo代码
*/
1 usage
public class PrintDemoAction extends AbstractPrintAction {
public String getPrintServiceModule() {
String module = "此处是你的模块编码";
return module;
}
public String getPrintServiceName() {
//打印后端类全路径 比如:
return "nc.impl.fbm.cztest.cztestmaster.AggDemoPrintServiceImpl";
}
}
```
## 2 打印后端处理
继承 AbstractPrintService
```
import nc.ui.pub.print.IDataSource;
import nccloud.pubitf.platform.print.AbstractPrintService;
import nccloud.pubitf.platform.print.IPrintInfo;
import nccloud.pubitf.platform.print.vo.PrintInfo;
/**
* 打印服务demo
*/
public class AggDemoPrintServiceImpl extends AbstractPrintService {
public IDataSource[] getDataSources(IPrintInfo info) {
//打印参数
PrintInfo printinfo = (PrintInfo) info;
//打印单据的id
String[] ids = printinfo.getIds();
//构建数据源
AggDemoPrintDataSource ds = new AggDemoPrintDataSource(ids);
//返回数据源
return new IDataSource[] { ds };
}
}
```
## 3 打印数据源
实现 IMetaDataDataSource,getMDObjects() 返回查询出来的数据 VO
```
import nc.bs.framework.common.NCLocator;
import nc.md.model.MetaDataException;
import nc.md.persist.framework.IMDPersistenceQueryService;
import nc.ui.pub.print.IMetaDataDataSource;
import nccloud.framework.core.exception.ExceptionUtils;
/**
* 打印数据源
*/
public class AggDemoPrintDataSource implements IMetaDataDataSource {
private static final long serialVersionUID = 1L;
private String[] oids;
public AggDemoPrintDataSource(String[] oids) {
this.oids = oids;
}
public Object[] getMDObjects() {
IMDPersistenceQueryService bs = NCLocator.getInstance().lookup(IMDPersistenceQueryService.class);
//替换为单据的vo
AggDemoVO[] aggvos = new AggDemoVO[] {};
try {
aggvos = (AggDemoVO[]) bs.queryBillOfVOByPKs(AggDemoVO.class, this.oids, false).toArray(new AggDemoVO[0]);
} catch (MetaDataException e) {
ExceptionUtils.wrapException(e);
}
return aggvos;
}
public String[] getItemValuesByExpress(String itemExpress) {
// TODO Auto-generated method stub
return null;
}
public boolean isNumber(String itemExpress) {
// TODO Auto-generated method stub
return false;
}
public String[] getDependentItemExpressByExpress(String itemExpress) {
// TODO Auto-generated method stub
return null;
}
public String[] getAllDataItemExpress() {
// TODO Auto-generated method stub
return null;
}
public String[] getAllDataItemNames() {
// TODO Auto-generated method stub
return null;
}
public String getModuleName() {
// TODO Auto-generated method stub
return null;
}
}
```
## 4 配置打印动作映射文件
鉴权文件一般存放路径为:
client/yyconfig/modules/模块编码/组件编码/实体编码/config/action/实体编码_action.xml
```xml
<?xml version="1.0" encoding="UTF-8"?>
<actions>
<action>
<!-- 比如nresa.treegrid.SaveTreegridMasterVOAction -->
<name>模块编码.组件编码.action类名</name>
<label>打印</label>
<clazz>PrintDemoAction的全路径</clazz>
</action>
<action>
<!-- 其他 action 配置 -->
</action>
</actions>
```
## 5 配置打印鉴权文件
需要授权的应用编码,写在appcode中, *表示所有节点都有权限
鉴权文件一般存放路径为:
client/yyconfig/modules/模块编码/组件编码/实体编码/config/authorize/实体编码_authorize.xml
```xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<authorizes>
<authorize>
<appcode>*</appcode>
<actions>
<!-- 比如nresa.treegrid.SaveTreegridMasterVOAction -->
<action>模块编码.组件编码.action类名</action>
</actions>
</authorize>
</authorizes>
```
# 打印前端
```js
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import {createPage, high, print, output} from 'nc-lightapp-front';
const {PrintOutput} = high;
import ExcelOutput from 'uap/common/components/ExcelOutput'; // 导出组件
const URLS = {
printUrl: '/nccloud/demoModule/demo/PrintDemoAction.do', //打印 请求路径
};
class ApplicationPage extends Component {
constructor(props) {
super(props);
this.state = this.createState();
}
/**
* 创建state
*/
createState = () => {
let state = {
print:{
ref:'printOutput',
url:URLS.printUrl,
data:{
funcode: '此处输入你的应用编码', //appcode
oids: [], //数据的pks
nodekey: undefined, //默认输出模板的key
outputType: undefined //如果是输出的话需要设为output,不是输出就置空
}
}
}
return state; //返回state解构
}
/**
* 功能介绍 : 打印 流程组装
*
* 在打印按钮点击处调用该方法,里面的参数需要具体根据你的界面来获取需要传递数据
*/
onPrint = () => {
//设置打印默认模板
this.state.print.data.nodekey = '打印模板的key'
//需要打印的pks
this.state.print.data.oids = '需要打印的pks';
//输出类型,打印的输出类型为空
this.state.print.data.outputType = 'print'
//更新state
this.setState(this.state,() => {
//调用平台的打印api
print('pdf', URLS.printUrl, this.state.print.data);
})
}
/**
* 功能介绍 : 输出 流程组装
*
* 在输出按钮点击处调用该方法,里面的参数需要具体根据你的界面来获取需要传递数据
*/
onOutput = () => {
//构建选中的数据
let { pks } = this.getCheckedDatas();
//打印数据模板key
this.state.print.data.nodekey = '打印模板的'
//需要输出的pks
this.state.print.data.oids = '需要打印的pks';
//输出类型
this.state.print.data.outputType = 'output'
//更新state
this.setState(this.state,() => {
//打开输出弹窗
output({url : this.state.print.url,data : this.state.print.data});
})
}
/**
* 渲染
*/
render() {
const renderPrintOutput = () => {
//参数解构
let { print } = this.state;
return (
<PrintOutput {...print}/>
);
}
return <div>
{renderPrintOutput() /** 渲染打印输出*/}
</div>
}
}
```
# 打印模板配置
## 1 模板配置
位置: 动态建模平台 -> 开发配置 -> 模板管理 -> 输出模板初始化
进行模板创建
## 2 分配打印模板
位置: 动态建模平台 -> 开发配置 -> 模板管理 -> 默认输出模板设置
处进行模板分配
# 打印脚本抽取
需要抽取的表:
打印模板: pub_print_template
默认模板: pub_systemplate_base
item.xml配置文件示例
```xml
<?xml version="1.0" encoding="UTF-8"?>
<items>
<item>
<itemKey>pub_print_template</itemKey>
<itemName>打印模板</itemName>
<itemRule>pub_print_template</itemRule>
<sysField></sysField>
<corpField></corpField>
<grpField></grpField>
<fixedWhere>
dr=0 and appcode in ('你的应用编码')
</fixedWhere>
</item>
<item>
<itemKey>pub_systemplate_base</itemKey>
<itemName>默认模板(打印模板输出)</itemName>
<itemRule>pub_systemplate_base</itemRule>
<sysField></sysField>
<corpField></corpField>
<grpField></grpField>
<fixedWhere>
dr=0 and appcode = '你的应用编码' and tempstyle = 3
</fixedWhere>
</item>
</items>
```