1.客户端快捷键
搜bb(币别)—>Ctrl+shift+q 打开后门(可以写SQL语句)
查看异常信息 Ctrl+E
管理员客户端修改菜单 Ctrl+Shift+Alt+k
2.发布:
金蝶BOS业务建模工具 发布–》Java项目刷新–》金蝶BOS设计开发工具 发布
金蝶BOS业务建模工具 发布模块(把模块部署到服务器里) 金蝶BOS设计开发工具 发布代码(可以理解为编译代码吧)1234
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("同步失败,详情见日志!"); //这是操作客户端的弹窗12
NEWBOSID('aaaaaaa'); //创建FID BOSUuid enpk = BOSUuid.create("4488014C"); //创建FID 关联ID1234
MaterialInfo materialInfo = new MaterialInfo(); //创建对象 materialInfo.setId(BOSUuid.read(rowFid.getString("FID"))); //创建ID12
// 刷新客户端列表界面 actionRefresh_actionPerformed(null);12
8.用对象操作数据库
检测某值在表中是否存在
ICSSDepartConstrast instance= CSSDepartConstrastFactory.getLocalInstance(ctx); if(instance.exists("where <属性名称>='"+<value>+"'")){ String ex="CSS分店/部门编码已经存在,不能重复!"; throw new TaskExternalException(ex); }12345
9.刷新
//LISTUI 序时簿列表界面刷新 actionRefresh_actionPerformed(null); //EDITUI 编辑界面刷新 this.setDataObject(getValue(new ObjectUuidPK(editData.getId()))); this.setOprtState(OprtState.VIEW); this.loadFields(); 更改了entity或者UI等界面内容,想看到效果,则要发布(元数据、业务单元) 刷新(Java代码,看是否偶报错) 重启客户端 后有效123456789
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; }12345678910111213141516
写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; }12345
导入:
public void actionImportData_actionPerformed(ActionEvent e) throws Exception { String solutionName="RCSRefLocationImport"; //导入模块编码 String alias="RCS位置对照表导入"; //导入模块名称 DataImportUtil.dataImport(this, solutionName, alias); //导入工具方法 super.actionImportData_actionPerformed(e); }1234567
禁止更改基础资料字段值:
@Override public void onLoad() throws Exception { super.onLoad(); txtNumber.setEditable(false); txtName.setEditable(false); }123456
单据编码、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; }1234567891011121314
oracle繁体转简体函数: HN_TRANS_CHINESE
//IObjectValue 值对象传递中间件,比如我从客户端的A对象要传到服务端,就先将A对象转为IObjectValue,在服务端可以讲IObjectValue强转为A对象
protected IObjectPK _save(Context ctx, IObjectValue model) { A对象 AInfo = (A对象)model; }123
添加默认行值
@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); } } }1234567891011121314151617181920
经典代码
@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); }1234567891011121314151617181920212223
过滤器:
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物料_编码不存在");123456
设置当前用户与日期
ObjectSetInform.setCreateInform(ctx, materialGroupInfo); /**是否弹出查询**/ @Override protected boolean initDefaultFilter() { return true; }1234567
//获取序时簿选中行id
int[] rows = KDTableUtil.getSelectedRows(tblMain); String id=tblMain.getRow(rows[i]).getCell("id").getValue().toString();12
//通过行id获取info对象
SCPurRequestInfo purRequestInfo = purRequest.getSCPurRequestInfo(new ObjectUuidPK(id));1
//设置单据分录标题 **EditUI.java
@Override public void onShow() throws Exception { super.onShow(); this.kdtEntrys_detailPanel.setTitle("分录1标题"); this.kdtDEntrys_detailPanel.setTitle("分录2标题"); }123456
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();12345678910
控制单据增删改
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);123456789101112131415
//F7必填设置
this.F7LabsInfo.setRequired(true);1
–上查下查关系 关联关系
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:下查】123
//ListUI界面增加合计行 统计行
1.在.query里面设置两个扩展属性
是否统计字段:true
统计字段按主键进行统计:设置为主键字段名,比如(id,entrys.id),
如果不设置的话,统计的时候会按分录行统计,对非分录行统计出来的结果会不正确。
2.在ListUI.java中重写isFootVisible方法,将返回值设置为true。 @Override protectedbooleanisFootVisible() { return true; } 12345
//EditUI分录增加合计行
重写EditUI的setTableToSumField方法即可。
@Override protected void setTableToSumField() { super.setTableToSumField(); setTableToSumField(kdtEntrys, new String[] {"amount", "paymentAmount"}); } //其中kdtEntrys—table名称 (通常为kdtEntrys) //new String[] {}统计的字段名 1234567
//*_dataChanged(DataChangeEvent e)
说明:单据上某一字段的值改变时,触发此方法
//sql查询分析器:获取表名、获取表所有列、执行sql、根据bostype获取表名
com.kingdee.eas.fm.common.app.FMIsqlFacade
//根据id获取bostype
BOSObjectType bosType = BOSUuid.read(sourceId).getType();1
//用户(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);123456
//隐藏EditUI分录上面板上的 添加行 插入行 删除行 的按钮(禁用则使用
setEnabled) this.kdtPaymentInfoEntry_detailPanel.getAddNewLineButton().setVisible(false); this.kdtPaymentInfoEntry_detailPanel.getInsertLineButton().setVisible(false); this.kdtPaymentInfoEntry_detailPanel.getRemoveLinesButton().setVisible(false);1234
//table空白行也保存
kdtEntrys.getRow(i).setChange(true);1
//如果要新增请按照如上内容格式在本地增加测试通过后,由权限模块负责人员添加到权限模块
注:如果不能生效,删除如下数据:
delete * from T_PM_SpecialDataPermEntry delete * from T_PM_SpecialDataPerm12
//调用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); }12345678910
//用户过滤界面基类
com.kingdee.eas.framework.report.client.CommRptBaseConditionUI1
//用户过滤界面+自定义
com.kingdee.eas.scm.common.client.SCMBillFilterUI1
//报表界面基类
com.kingdee.eas.framework.report.client.CommRptBaseUI1
报表:
两个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")); }123456789101112131415
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(); }1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
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; } getQueryDialogUserPanel123456789101112131415
//位运算//
乘以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);//901
//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); } } } ); }1234567891011121314151617
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()))); } }12345
//分录列值改变事件
@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(); }123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
//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);12
//凭证返回结果:
成功:[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));12345
//不建议使用函数/方法
/* @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=]