1.客户端快捷键
搜bb(币别)—>Ctrl+shift+q 打开后门(可以写SQL语句)
查看异常信息 Ctrl+E
管理员客户端修改菜单 Ctrl+Shift+Alt+k
2.发布:
金蝶BOS业务建模工具 发布–》Java项目刷新–》金蝶BOS设计开发工具 发布
金蝶BOS业务建模工具
发布模块(把模块部署到服务器里)
金蝶BOS设计开发工具
发布代码(可以理解为编译代码吧)
3.事件里怎么调用方法?
先引过一个工厂类.getRemoteInstance()[客户端]; //如:ICSSMaterialConstrast instance=CSSMaterialConstrastFactory.getRemoteInstance();
然后用instance GET出你在APP端写的方法(提前刷新、发布)
4.EditUI.UI 是 新增时出现的窗体(有 界面配置 等等工具栏)
里面可以有 表头、分录、按钮等…
5.ListUI.UI 是 显示已录入的数据(有 高级统计 等等工具栏)
6.添加按钮:
app.ConstrastBean.java –> 自己在这里写业务逻辑代码
@Override _syndata (){} //重写有下划线的方法
client.ConstrastEditUI.java –> 新建的 客户端代码可以在这里写,比如计算用户输入的金额啊,验证用户的输入内容
client.ConstrastListUI.java –> 客户端代码可以在这里写,比如写用户选了几行哪些行啊
.entety 带锤子图标的文件是实体类
禁用增删改按钮
this.btnAddNew.setEnabled(false);
this.btnRemove.setEnabled(false);
this.btnEdit.setEnabled(false);
7.操作数据库
DbUtil在服务端用操作EAS—》com.kingdee.bos.ctrl.extcommon.server.DbUtil——/com.kingdee.eas.util.app.DbUtil
BaseDao在服务端用操作CSS—》com.kingdee.eas.yfscmdevelop.util.db.BaseDao
ctx 在服务端用
/*dialect*/ 方言
MsgBox.showConfirm2("同步失败,详情见日志!"); //这是操作客户端的弹窗
NEWBOSID('aaaaaaa'); //创建FID
BOSUuid enpk = BOSUuid.create("4488014C"); //创建FID
关联ID
MaterialInfo materialInfo = new MaterialInfo(); //创建对象
materialInfo.setId(BOSUuid.read(rowFid.getString("FID"))); //创建ID
// 刷新客户端列表界面
actionRefresh_actionPerformed(null);
8.用对象操作数据库
检测某值在表中是否存在
ICSSDepartConstrast instance= CSSDepartConstrastFactory.getLocalInstance(ctx);
if(instance.exists("where <属性名称>='"+<value>+"'")){
String ex="CSS分店/部门编码已经存在,不能重复!";
throw new TaskExternalException(ex);
}
9.刷新
//LISTUI 序时簿列表界面刷新
actionRefresh_actionPerformed(null);
//EDITUI 编辑界面刷新
this.setDataObject(getValue(new ObjectUuidPK(editData.getId())));
this.setOprtState(OprtState.VIEW);
this.loadFields();
更改了entity或者UI等界面内容,想看到效果,则要发布(元数据、业务单元) 刷新(Java代码,看是否偶报错) 重启客户端 后有效
10.打包所需文件
deployed_metas和classes这两个目录里需要打包的项目
在hn_scgl_matas/entity_pkmapping.properties里面加完整模块
11.BOS启动EAS配置runtime:F:\ctf\workspace\Project_cft_hn\runtime\apusic\config
12.新增单据时自动填写默认数据:在***EditUI.java 下重写父类方法【createNewData()】分录在 createNewDetailData()
protected com.kingdee.bos.dao.IObjectValue createNewData() {
//获取info对象
com.kingdee.eas.projectbudget.basedata.ProjectGInfo objectValue = new com.kingdee.eas.projectbudget.basedata.ProjectGInfo();
//设置创建人
objectValue.setCreator((com.kingdee.eas.base.permission.UserInfo)
(com.kingdee.eas.common.client.SysContext.getSysContext().getCurrentUser()));
Date date = new Date();
SimpleDateFormat simp = new SimpleDateFormat("yyyyMMddHHmmss");
String str = simp.format(date);
//设置编码
objectValue.setNumber(str);
//返回info对象
return objectValue;
}
写insert语句时,加一下(对大量插入数据时才加) insert /+append/ into test select * from t1 nologging 写insert语句时,加一下 /+append/ 和 nologging
当前模式:
//EASList界面设置打开的Edit界面模式
@Override
protected String getEditUIModal() {
// TODO Auto-generated method stub
return UIFactoryName.MODEL;
}
导入:
public void actionImportData_actionPerformed(ActionEvent e) throws Exception
{
String solutionName="RCSRefLocationImport"; //导入模块编码
String alias="RCS位置对照表导入"; //导入模块名称
DataImportUtil.dataImport(this, solutionName, alias); //导入工具方法
super.actionImportData_actionPerformed(e);
}
禁止更改基础资料字段值:
@Override
public void onLoad() throws Exception {
super.onLoad();
txtNumber.setEditable(false);
txtName.setEditable(false);
}
单据编码、FNUMBER生成
/**
* 单据编号
* @param stockinfo
* @param stockid
* @return 编号
* @throws BOSException
* @throws EASBizException
*/
private static String generateBillNumber(IObjectValue stockinfo, BOSUuid stockid) throws BOSException, EASBizException
{
ICodingRuleManager iCodingRuleManager =CodingRuleManagerFactory.getRemoteInstance();
String number=iCodingRuleManager.getNumber(stockinfo,stockid.toString());
return number;
}
oracle繁体转简体函数: HN_TRANS_CHINESE
//IObjectValue 值对象传递中间件,比如我从客户端的A对象要传到服务端,就先将A对象转为IObjectValue,在服务端可以讲IObjectValue强转为A对象
protected IObjectPK _save(Context ctx, IObjectValue model) {
A对象 AInfo = (A对象)model;
}
添加默认行值
@Override
public void onShow() throws Exception {
// TODO Auto-generated method stub
super.onShow();
IRow row;
ICell cell;
for (int i = 0; i < 6; i++) {
// 添加空表体行
row = kdtEntrys.addRow(i);
for (int j = 0; j < 3; j++) {
// 获取表头行的单元,并设置单元的值
cell = row.getCell(j);
cell.setValue("body " + i + " " + j);
}
}
}
经典代码
@Override
protected void _syndata(Context ctx, String[] expenseTypeID) throws BOSException {
//first get interface
ICSSExpenseTypeConstrast si = CSSExpenseTypeConstrastFactory.getLocalInstance(ctx); //工厂类里
CSSExpenseTypeConstrastCollection c = si.getCSSExpenseTypeConstrastCollection();
if(null == c||c.isEmpty()){ //判断是否选中行
return; //没选中的话就不执行一下代码
}
CSSExpenseTypeConstrastInfo csse = null;
for(int i=0;i<c.size();i++){
csse=c.get(i);
System.out.println(c.get(i));
System.out.println(csse.getCssUsed().getName());
}
//逻辑
//expenseTypeID[0]
int i = expenseTypeID.length;
for(String strId: expenseTypeID){
System.out.println(strId+i);
}
System.out.println(8888);
super._syndata(ctx, expenseTypeID);
}
过滤器:
if(getDataString(hsData,”FEasMaterialNum_number”).trim()!=”“){
String fNumber = getDataString(hsData,”FEasMaterialNum_number”).trim();
EntityViewInfo evi = new EntityViewInfo(); //创建实体视图
FilterInfo f = new FilterInfo();//创建过滤对象 //发单费用
FilterItemInfo filter1 = new FilterItemInfo(“Number”, fNumber, CompareType.EQUALS);//创建第一个过滤条件,第一个参数:所查询的实体的属性,第二个参数:属性的目标值,第三个参数:比较符
f.getFilterItems().add(filter1);//将过滤条件添加到过滤对象中
evi.setFilter(f);//设置实体视图的过滤器
MaterialCollection supplierCollection=MaterialFactory.getLocalInstance(ctx).getMaterialCollection(evi);
if(supplierCollection.size()!=0){
MaterialInfo materialInfo= new MaterialInfo();
materialInfo=supplierCollection.get(0);
coreBaseInfo.setEasMaterialNum(materialInfo);
}else throw new TaskExternalException("EAS物料_编码不存在");
设置当前用户与日期
ObjectSetInform.setCreateInform(ctx, materialGroupInfo);
/**是否弹出查询**/
@Override
protected boolean initDefaultFilter() {
return true;
}
//获取序时簿选中行id
int[] rows = KDTableUtil.getSelectedRows(tblMain);
String id=tblMain.getRow(rows[i]).getCell("id").getValue().toString();
//通过行id获取info对象
SCPurRequestInfo purRequestInfo = purRequest.getSCPurRequestInfo(new ObjectUuidPK(id));
//设置单据分录标题 **EditUI.java
@Override
public void onShow() throws Exception {
super.onShow();
this.kdtEntrys_detailPanel.setTitle("分录1标题");
this.kdtDEntrys_detailPanel.setTitle("分录2标题");
}
5:如何给F7控件设置过滤条件
当需要对F7控件所打个视图中的内容进行过滤时,可对F7控件设置过滤条件,使用方法如下:
EntityViewInfo evi = new EntityViewInfo(); //创建实体视图
FilterInfo f = new FilterInfo();//创建过滤对象
FilterItemInfo filter1 = new FilterItemInfo("number", "SHFL001", CompareType.GREATER);//创建第一个过滤条件,第一个参数:所查询的实体的属性,第二个参数:属性的目标值,第三个参数:比较符
FilterItemInfo filter2= new FilterItemInfo("age", "20", CompareType.GREATER);//创建第二个过滤条件
f.getFilterItems().add(filter1);//将过滤条件添加到过滤对象中
f.getFilterItems().add(filter2);
f.setMaskString("#0 or #1");//设置两个过滤条件之间的关系
evi.setFilter(f);//设置实体视图的过滤器
f7.setEntityViewInfo(evi);//将实体视图绑定到F7控件
f7.getQueryAgent().resetRuntimeEntityView();
控制单据增删改
this.btnAddNew.setVisible(false);
this.btnRemove.setVisible(false);
this.btnEdit.setVisible(false);
this.btnCopyTo.setVisible(false);
this.menuItemAddNew.setVisible(false);
this.menuEdit.setVisible(false);
this.btnAddNew.setEnabled(false);
this.btnRemove.setEnabled(false);
this.btnEdit.setEnabled(false);
this.btnCopyTo.setEnabled(false);
this.menuItemAddNew.setEnabled(false);
this.menuEdit.setEnabled(false);
//F7必填设置
this.F7LabsInfo.setRequired(true);
–上查下查关系 关联关系
INSERT INTO T_BOT_Relation(FID, FSRCENTITYID, FDESTENTITYID, FSRCOBJECTID, FDESTOBJECTID, FDATE, FOPERATORID, FISEFFECTED, FBOTMAPPINGID, FTYPE)
VALUES(NEWBOSID('59302EC6'), '044EE73C', '783061E3', ID1, purID, sysdate, v_UserID, 1, null, 0);
--【FTYPE=0:上查;FTYPE=1:下查】
//ListUI界面增加合计行 统计行
1.在.query里面设置两个扩展属性
是否统计字段:true
统计字段按主键进行统计:设置为主键字段名,比如(id,entrys.id),
如果不设置的话,统计的时候会按分录行统计,对非分录行统计出来的结果会不正确。
2.在ListUI.java中重写isFootVisible方法,将返回值设置为true。
@Override protectedbooleanisFootVisible() {
return true;
}
//EditUI分录增加合计行
重写EditUI的setTableToSumField方法即可。
@Override
protected void setTableToSumField() {
super.setTableToSumField();
setTableToSumField(kdtEntrys, new String[] {"amount", "paymentAmount"});
}
//其中kdtEntrys—table名称 (通常为kdtEntrys)
//new String[] {}统计的字段名
//*_dataChanged(DataChangeEvent e)
说明:单据上某一字段的值改变时,触发此方法
//sql查询分析器:获取表名、获取表所有列、执行sql、根据bostype获取表名
com.kingdee.eas.fm.common.app.FMIsqlFacade
//根据id获取bostype
BOSObjectType bosType = BOSUuid.read(sourceId).getType();
//用户(com.kingdee.eas.base.permission.User)与员工_个人信息(com.kingdee.eas.basedata.person.Person)
关联关系:com.kingdee.eas.base.permission.app.R_User_Person
User.person = Person.id
在脚本中执行SQL语句
java.lang.StringBuffer sql = java.lang.new StringBuffer();
//将 SQL 语句保存到 sql 对象中
java.sql.Connection con =
com.kingdee.bos.framework.ejb.EJBFactory.getConnection(__bosContext);
java.sql.Statement batchStatement = con.createStatement();
batchStatement.execute(sql.toString());
com.kingdee.util.db.SQLUtils.cleanup(batchStatement, con);
com.kingdee.util.db.SQLUtils.cleanup(con);
//隐藏EditUI分录上面板上的 添加行 插入行 删除行 的按钮(禁用则使用
setEnabled)
this.kdtPaymentInfoEntry_detailPanel.getAddNewLineButton().setVisible(false);
this.kdtPaymentInfoEntry_detailPanel.getInsertLineButton().setVisible(false);
this.kdtPaymentInfoEntry_detailPanel.getRemoveLinesButton().setVisible(false);
//table空白行也保存
kdtEntrys.getRow(i).setChange(true);
//如果要新增请按照如上内容格式在本地增加测试通过后,由权限模块负责人员添加到权限模块
注:如果不能生效,删除如下数据:
delete * from T_PM_SpecialDataPermEntry
delete * from T_PM_SpecialDataPerm
//调用list序时簿前的过滤query
@Override
protected void beforeExcutQuery(EntityViewInfo ev) {
FilterInfo filterInfo = new FilterInfo();
UserInfo userInfo = SysContext.getSysContext().getCurrentUserInfo();
filterInfo.getFilterItems().add(
new FilterItemInfo("creator.id", userInfo.getId(), CompareType.EQUALS));
filterInfo.setMaskString("#0");
ev.setFilter(filterInfo);
super.beforeExcutQuery(ev);
}
//用户过滤界面基类
com.kingdee.eas.framework.report.client.CommRptBaseConditionUI
//用户过滤界面+自定义
com.kingdee.eas.scm.common.client.SCMBillFilterUI
//报表界面基类
com.kingdee.eas.framework.report.client.CommRptBaseUI
报表:
两个UI(ListUI、QueryUI)、一个功能facade
QueryUI:继承com.kingdee.eas.framework.report.client.CommRptBaseConditionUI
ListUI: 继承com.kingdee.eas.framework.report.client.CommRptBaseUI
Facade: 继承com.kingdee.eas.framework.report.app.CommRptBase
QueryUI.Java:
//在构造函数里初始化控件值
@Override
public RptParams getCustomCondition() {
获取前端面板的限制条件(用户所选),然后用RptParams储存并返回,供facade调用
RptParams params = new RptParams();
params.setObject("asstActNumber", F7LabsInfo.getText());
params.setObject("asstActName", kDDatePicker1.getText());
params.setObject("pdnOutMonth", kDBizComboBox1.getSelectedItem());
return params;
}
@Override
public void setCustomCondition(RptParams arg0) {
// 保存历史方案
kDDatePicker1.setValue(arg0.getObject("asstActName"));
}
ListUI.Java:
//初始化(构造方法)
//展示数据
public ProjectBalanceRptUI() throws Exception
{
super();
final int pageSize = 1000;
kDTable1.checkParsed();
kDTable1.getDataRequestManager().setDataRequestMode(1);
enableExportExcel(kDTable1);
kDTable1.getDataRequestManager().setDataRequestMode(KDTDataRequestManager.VIRTUAL_MODE_PAGE);
kDTable1.getDataRequestManager().setPageRowCount(pageSize);
//kDTable1.setRowCount(500);
kDTable1.getDataRequestManager().addDataRequestListener(new KDTDataRequestListener()
{
public void tableDataRequest(KDTDataRequestEvent e)
{
// 获取请求的起始行、起始列、结束行、结束列信息
int firstRow = e.getFirstRow();
int lastRow = e.getLastRow();
int firstCol = e.getFirstCol();
int lastCol = e.getLastCol();
int colCount = lastCol - firstCol + 1;
params.setInt("pageSize", pageSize);
params.setInt("startIndex", firstRow);
try {
RptParams rpt = getRemoteInstance().query(params); // 调用远程接口,查询数据
RptRowSet rs = (RptRowSet) rpt.getObject("arapData"); // 数据集
doAfterQuery(rs);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
);
}
protected void doAfterQuery(RptRowSet rs) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
while (rs.next()) {
IRow addRow = kDTable1.addRow();
addRow.getCell(0).setValue(rs.getString("FID"));
addRow.getCell(1).setValue(rs.getString("FNUMBER"));
addRow.getCell(2).setValue(rs.getString("FBIZDATE"));
}
}
//绑定QueryUI
@Override
protected CommRptBaseConditionUI getQueryDialogUserPanel() throws Exception {
return new ProjectBalanceWhereUI();
}
//绑定Facade
@Override
protected ICommRptBase getRemoteInstance() throws BOSException {
return ProjectBalanceFacadeFactory.getRemoteInstance();
}
@Override
protected void query() {
kDTable1.checkParsed();
kDTable1.removeRows();
}
Facade:
@Override
protected RptParams _query(Context ctx, RptParams params) throws BOSException, EASBizException {
//获取前端的限制条件,用于SQL where
String asstActNumber = params.getObject("asstActNumber").toString();
String pdnOutMonth = params.getObject("pdnOutMonth").toString();
String sql = "SELECT * FROM T_PRO_ProjectDetail";
RptRowSet rptRowSet = executeQuery(sql, null, ctx);
RptParams rpt = new RptParams();
rpt.setObject("arapData", rptRowSet);
return rpt;
}
getQueryDialogUserPanel
//位运算//
乘以2运算 n << 1
除以2运算//负奇数的运算不可用 n >> 1
乘以2的m次方//计算n*(2^m) n << m
除以2的m次方//计算n/(2^m) n >> m
判断一个数的奇偶性 (n & 1) == 1
求两个整数的平均值 (x + y) >> 1
计算n+1 -~n
计算n-1 ~-n
取相反数 ~n + 1
交换两个值(异或)
int i = 50;
int o = 90;
i = i ^ o;
o = i ^ o;//i ^ o ^ o = i ^ 0
i = i ^ o;
System.out.println(i);//90
//cmd.exe 文件执行不了,提示无合适的权限
找到文件 C:\Windows\System32\cmd.exe
找到属性-安全-编辑权限:添加用户:Everyone
再勾选所有权限
//分录表格数据项增加值改变事件
1、声明值改变监听事件
@Override
public void onLoad() throws Exception {
super.onLoad();
// 分录表格增加值修改监听事件
kdtEntrys.addKDTEditListener(
new KDTEditAdapter() {
public void editStopped(KDTEditEvent e) {
try {
kdtEntrys_Changed(e.getRowIndex(), e.getColIndex());
} catch (Exception exc) {
handUIException(exc);
}
}
}
);
}
2、实现值改变事件
public void kdtEntrys_Changed(int rowIndex, int colIndex) throws Exception {
if (“kssj”.equalsIgnoreCase(kdtEntrys.getColumn(colIndex).getKey())) {
MsgBox.showInfo(com.kingdee.bos.ui.face.UIRuleUtil.getString(kdtEntrys.getCell(rowIndex, “kssj”).getValue()));
}
if (“sl”.equalsIgnoreCase(kdtEntrys.getColumn(colIndex).getKey())) {
kdtEntrys.getCell(rowIndex, “hj”).setValue(com.kingdee.bos.ui.face.UIRuleUtil.getBigDecimal(com.kingdee.bos.ui.face.UIRuleUtil.getBigDecimalValue(kdtEntrys.getCell(rowIndex, “sl”).getValue()) * com.kingdee.bos.ui.face.UIRuleUtil.getBigDecimalValue(kdtEntrys.getCell(rowIndex, “dj”).getValue())));
}
if ("dj".equalsIgnoreCase(kdtEntrys.getColumn(colIndex).getKey()))
{
kdtEntrys.getCell(rowIndex, "hj").setValue(com.kingdee.bos.ui.face.UIRuleUtil.getBigDecimal(com.kingdee.bos.ui.face.UIRuleUtil.getBigDecimalValue(kdtEntrys.getCell(rowIndex, "sl").getValue()) * com.kingdee.bos.ui.face.UIRuleUtil.getBigDecimalValue(kdtEntrys.getCell(rowIndex, "dj").getValue())));
}
}
//分录列值改变事件
@Override
public void kdtEntrys_Changed(int rowIndex, int colIndex){
if ("coll_1".equalsIgnoreCase(kdtEntrys.getColumn(colIndex).getKey())) {
}
}
public void actionEdit_actionPerformed(ActionEvent e) throws Exception
{
int[] rows = KDTableUtil.getSelectedRows(tblMain);
int len = rows.length;
if (len == 0) {
MsgBox.showInfo("未选中记录!");
return;
}
IRow row = tblMain.getRow(rows[0]);
String id=row.getCell("id").getValue().toString();
PurchoseRequsetBillInfo purchoseRequsetBillInfo=PurchoseRequsetBillFactory.getRemoteInstance().getPurchoseRequsetBillInfo(new ObjectUuidPK(id));
if (purchoseRequsetBillInfo.getBillBaseStatus() != null && purchoseRequsetBillInfo.getBillBaseStatus().equals(BillBaseStatusEnum.AUDITED))
{
MsgBox.showInfo("已审核的单据不允许修改!");
return;
}
if (purchoseRequsetBillInfo.getDataSource() != null && purchoseRequsetBillInfo.getDataSource().equals(com.kingdee.eas.sckf.fhp.base.DataSourceEnum.SYSTEMSYNC))
{
MsgBox.showInfo("同步生成的单据不允许修改!");
return;
}
if (BillApplyFactory.getRemoteInstance().checkBizObjInWfProcess(id))
{
MsgBox.showWarning("单据进行工作流,不允许操作!");
return;
}
super.actionEdit_actionPerformed(e);
}
@Override
protected CommonQueryDialog initCommonQueryDialog() {
CommonQueryDialog dialog = super.initCommonQueryDialog();
dialog.addUserPanel(getBillFilterUI());
dialog.setWidth(500);
dialog.setHeight(450);
dialog.setTitle("自定义查询");
// dialog.addUserPanel(this.getTitlePanel());
dialog.setShowFilter(true);
dialog.setShowSorter(true);
return dialog;
//return super.initCommonQueryDialog();
}
//WSGLWebServiceFacadeSrvProxyProxy deleteVoucher(pro.getCompany(), period, voucherNumber, fexp)
//删除凭证的方法
//生成凭证接口、方法
//生成凭证
IGLWebServiceFacade iGLW = GLWebServiceFacadeFactory.getLocalInstance(ctx);
String[] str2 = iGLW.importVoucherOfReturnID((WSVoucherCollection)getBeanConvertor().toObjectCollection(MetaDataHelper.getEntityMetaData("com.kingdee.eas.fi.gl.app.WSVoucher"), vouchers), 1, 0, 0);
//凭证返回结果:
成功:[0000||记||2017||12||成功保存||记-0010||AcB7mA9DRLisgQmpPwX0ZSZS4B4=]
失败:[1002||null||0||0||凭证TZ20171220204230凭证分录1没有找到科目:6666]
//日期转换格式
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.UK);
Date beginDate = sdf.parse(beg.toString());
Date endDate = sdf.parse(end.toString());
long day=(endDate.getTime() - beginDate.getTime()) / (24*60*60*1000);
int dayNum = Integer.parseInt(Long.toString(day));
//不建议使用函数/方法
/* @deprecated /
String id = “IssAAAAEgGf67oE6”; //ID
IObjectPK pk = new ObjectStringPK(id); //主键
//通过主键获取对象
DemoInfo demo = DemoFactory.getRemoteInstance().getDemoInfo(pk);
//ID、UUID、PK之间转换
BOSUuid uuid = demo.getId(); //UUID
pk = new ObjectUuidPK(uuid); //主键
uuid = BOSUuid.read(id); //UUID
demo.setId(BOSUuid.create(demo.getBOSType())); //设置新UUID
//客户端获取登录人信息
UserInfo userInfo = SysContext.getSysContext().getCurrentUserInfo();
//服务端获取去登录人信息
ContextUtil.getCurrentUserInfo(ctx).getPerson()
//获取分录某字列的合计数:
com.kingdee.bos.ui.face.UIRuleUtil.sum(kdtEntrys,”subtotal_sum”)
//生成凭证返回值:
成功:[0000||记||2018||1||成功保存||记-0004||nF8mNESjR4ea+6C95eZjyyZS4B4=]