nc生成临时凭证配置

news2024/12/30 2:21:46

nc生成临时凭证配置

要实现的功能:

  • 审批时生成临时凭证
  • 弃审时删除临时凭证
  1. 前台配置
    在这里插入图片描述
    在这里插入图片描述
  2. 后台配置
  • BillReflectorServiceImpl.java
package nc.pubimpl.jych.qtsq.voucher;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import nc.impl.pubapp.pattern.data.bill.BillQuery;
import nc.impl.pubapp.pattern.data.bill.tool.BillConcurrentTool;
import nc.pubitf.fip.external.IBillReflectorService;
import nc.vo.fip.external.FipExtendAggVO;
import nc.vo.fip.service.FipRelationInfoVO;
import nc.vo.jych.qthtfksqd.AggQthtfksqdVO;
import nc.vo.pub.BusinessException;
import nc.vo.pubapp.pattern.log.TimeLog;

public class BillReflectorServiceImpl implements IBillReflectorService{

	@Override
	public Collection<FipExtendAggVO> queryBillByRelations(
			Collection<FipRelationInfoVO> collection) throws BusinessException {
		// TODO 自动生成的方法存根
		Map<String, FipRelationInfoVO> mapInfo = this.getMapRelationInfo(collection);
		String[] hids =
				mapInfo.keySet().toArray(new String[mapInfo.keySet().size()]);

		BillQuery<AggQthtfksqdVO> query =
				new BillQuery<AggQthtfksqdVO>(AggQthtfksqdVO.class);
		AggQthtfksqdVO[] bills = query.query(hids);
		// 加锁
		BillConcurrentTool tool = new BillConcurrentTool();
		TimeLog.logStart();
		tool.lockBill(bills);
		TimeLog.info("锁定表头、表体主健"); /*-=notranslate=-*/

		Collection<FipExtendAggVO> fipAggVO = this.createFipMsgVO(bills);
		return fipAggVO;
	}


	private Collection<FipExtendAggVO> createFipMsgVO(AggQthtfksqdVO[] vos) {
		Collection<FipExtendAggVO> msgvolist = new ArrayList<FipExtendAggVO>();
		for (AggQthtfksqdVO vo : vos) {
			// SaleInvoiceBVO[] items = vo.getChildrenVO();
			FipExtendAggVO msgvo = new FipExtendAggVO();
			// String cbillbid = items[0].getCsaleinvoicebid();
			msgvo.setBillVO(vo);
			msgvo.setRelationID(vo.getPrimaryKey());
			// FipRelationInfoVO infovo = mapInfo.get(cbillbid);
			// msgvo.setMessageinfo(infovo);
			msgvolist.add(msgvo);
		}
		return msgvolist;
	}

	private Map<String, FipRelationInfoVO> getMapRelationInfo(
			Collection<FipRelationInfoVO> relationvos) {
		Map<String, FipRelationInfoVO> map =
				new HashMap<String, FipRelationInfoVO>();
		for (FipRelationInfoVO vo : relationvos) {
			String id = vo.getRelationID();
			map.put(id, vo);
		}
		return map;
	}
}
  • 执行一条sql插入脚本
insert into fip_billregister (BILLDRAWCLASS, BILLREFLECTCLASS, BILLSUMCLASS, CLASS_ENTITY_ID, CTRLORGFINDCLASS, DEFDOC1, DEFDOC2, DEFDOC3, DEFQUERYCLASS, DESBILLSERVCLASS, DESBILLSUMCLASS, DESCTRLRULECLASS, DESSUMRULECLASS, DESSUMRULEENTITY, DESSUMRULEREF, DISPLAYCLASS, DR, DRAWQUERYCLASS, EDITCLASS, LINKQUERYCLASS, MODULECODE, ORG_CTRL_ENTITY1, ORG_CTRL_ENTITY2, ORG_ENTITY_ID, PK_BILLREGISTER, PK_BILLTYPE, PK_GROUP, PK_ORG, TS)
values (null, 'nc.pubimpl.zyzj.loanytlx.voucher.BillReflectorServiceImpl', null, '~', null, '990d709e-deeb-4e73-b526-ee0d173c7870', null, null, null, null, null, null, null, null, null, null, 0, null, null, null, 'zyzj', '~', '~', '~', '0000Z80000000zyzj003', 'H104', '~', '~', '2020-04-21 16:05:53');
--------------------------------------------------------------------------------------------------------------------------------
其中:
'nc.pubimpl.zyzj.loanytlx.voucher.BillReflectorServiceImpl'为新建的一个类
'990d709e-deeb-4e73-b526-ee0d173c7870'为该单据在md_class表中的id字段的值(md_class为该单据元数据的实体表)
'zyzj'为该单据的模块名
'0000Z80000000zyzj003'自行命名,不重复即可
'H104'为该单据的单据类型
  • GenQthtsqRule.java
package nc.bs.jych.qthtfksqd.ace.bp.rule;

import nc.bs.framework.common.NCLocator;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.pubitf.fip.service.IFipMessageService;
import nc.vo.fip.service.FipMessageVO;
import nc.vo.fip.service.FipRelationInfoVO;
import nc.vo.jych.qthtfksqd.AggQthtfksqdVO;
import nc.vo.jych.qthtfksqd.QthtfksqdVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFDate;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.AppContext;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.wgbfb.tool.NullValueUtils;
/**
 * @author hanh
 */
public class GenQthtsqRule implements IRule<AggQthtfksqdVO>{
	@Override
	public void process(AggQthtfksqdVO[] aggvos) {
		// TODO 自动生成的方法存根
		for (int i = 0; i < aggvos.length; i++) {
			execute(aggvos[i]);
		}
	}

	private void execute(AggQthtfksqdVO aggvo) {
		if(aggvo.getParentVO().getBillstatus() != 1){
			return;
		}
		QthtfksqdVO headvo = null;
		// 传会计平台
		try {
			headvo = aggvo.getParentVO();
			//核定金额
			UFDouble nmny = headvo.getHdje();
			
			UFDate date = AppContext.getInstance().getBusiDate();
			FipRelationInfoVO infovo = new FipRelationInfoVO();
			// 组装VO
			infovo.setPk_group(headvo.getPk_group());// 集团
			infovo.setPk_org(headvo.getPk_org());// 组织
			infovo.setPk_system("H9");// 系统类型
			infovo.setPk_billtype("QTSQ");// 单据类型或者交易类型
			infovo.setRelationID(headvo.getPrimaryKey());// 关联号-主键
			infovo.setPk_operator(headvo.getCreator());// 制单人
			infovo.setBusidate(date);// 业务日期
			infovo.setDefdoc1(null);// 自定义关联档案1
			infovo.setDefdoc2(null);// 自定义关联档案2
			infovo.setDefdoc3(null);// 自定义关联档案3
			infovo.setFreedef1(headvo.getVbillno());// 单据号
			infovo.setFreedef2(headvo.getZy());// 说明、摘要
			infovo.setFreedef3(NullValueUtils.getNullStringValue(nmny));// 金额
			infovo.setFreedef4(null);// 自定义项4
			infovo.setFreedef5(null);// 自定义项5
			
			// 消息VO
			FipMessageVO msgvo = new FipMessageVO();
			msgvo.setMessagetype(0);// 0是增加,1是删除
			msgvo.setBillVO(aggvo);
			msgvo.setMessageinfo(infovo);
			getService().sendMessage(msgvo);
		} catch (BusinessException e) {
			
			ExceptionUtils.wrappBusinessException("单据"+headvo.getVbillno()+"审核生成凭证出现异常:"+e.getMessage());
		}
	}

	
	private IFipMessageService service;
	private IFipMessageService getService(){
		if(service == null){
			service = NCLocator.getInstance().lookup(
					IFipMessageService.class);
		}
		return service;
	}
}
  • DeleteQthtsqRule.java
package nc.bs.jych.qthtfksqd.ace.bp.rule;

import nc.bs.framework.common.NCLocator;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.pubitf.fip.service.IFipMessageService;
import nc.vo.fip.service.FipMessageVO;
import nc.vo.fip.service.FipRelationInfoVO;
import nc.vo.jych.qthtfksqd.AggQthtfksqdVO;
import nc.vo.jych.qthtfksqd.QthtfksqdVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.AppContext;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.wgbfb.tool.NullValueUtils;
/**
 * @author hanh
 */
public class DeleteQthtsqRule implements IRule<AggQthtfksqdVO>{

	@Override
	public void process(AggQthtfksqdVO[] aggvos) {
		// TODO 自动生成的方法存根
		for (int i = 0; i < aggvos.length; i++) {
			execute(aggvos[i]);
		}
	}

	private void execute(AggQthtfksqdVO aggvo) {
		
		QthtfksqdVO headvo = null;
		// 传会计平台
		try {
			headvo = aggvo.getParentVO();
			//核定金额
			UFDouble nmny = headvo.getHdje();
			FipRelationInfoVO infovo = new FipRelationInfoVO();
			// 组装VO
			infovo.setPk_group(headvo.getPk_group());// 集团
			infovo.setPk_org(headvo.getPk_org());// 组织
			infovo.setPk_system("H9");// 系统类型
			infovo.setPk_billtype("QTSQ");// 单据类型或者交易类型
			infovo.setRelationID(headvo.getPrimaryKey());// 关联号-主键
			infovo.setPk_operator(headvo.getCreator());// 制单人
			infovo.setBusidate(AppContext.getInstance().getBusiDate());// 业务日期
			infovo.setDefdoc1(null);// 自定义关联档案1
			infovo.setDefdoc2(null);// 自定义关联档案2
			infovo.setDefdoc3(null);// 自定义关联档案3
			infovo.setFreedef1(headvo.getVbillno());// 单据号
			infovo.setFreedef2(null);// 说明、摘要
			infovo.setFreedef3(NullValueUtils.getNullStringValue(nmny));// 核定金额
			infovo.setFreedef4(null);// 自定义项4
			infovo.setFreedef5(null);// 自定义项5
			
			// 消息VO
			FipMessageVO msgvo = new FipMessageVO();
			msgvo.setMessagetype(1);// 0是增加,1是删除
			msgvo.setBillVO(aggvo);
			msgvo.setMessageinfo(infovo);
			getService().sendMessage(msgvo);
		} catch (BusinessException e) {
			
			ExceptionUtils.wrappBusinessException("单据"+headvo.getVbillno()+"弃审删除凭证出现异常:"+e.getMessage());
		}
	}

	
	private IFipMessageService service;
	private IFipMessageService getService(){
		if(service == null){
			service = NCLocator.getInstance().lookup(
					IFipMessageService.class);
		}
		return service;
	}
}

  • 往审批规则和弃审规则里面引入这两个类
  1. 前台配置
    在这里插入图片描述
    转换模板找实施配置
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1664678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3专栏项目 -- 三、使用vue-router 和 vuex(下)

一、添加columnDetail 页面 首页有专栏列表&#xff08;ColumnList组件&#xff09;&#xff0c;专栏列表中有很多专栏&#xff0c;然后点击某个专栏就进入专栏详情页&#xff08;ColumnDetail组件&#xff09;&#xff0c;专栏详情页中有很多文章&#xff0c;点击某个文章就进…

【案例分享】校园服务小程序开发经验和主要功能,引领校园生活新方式

随着移动互联网的普及&#xff0c;学生们对于校园生活的需求也在不断增长。校园圈子、校园跑腿、校园外卖、校园服务等小程序等应用应运而生&#xff0c;为学生们提供了更加便捷、高效的生活方式。那么&#xff0c;如何开发一款能够满足学生需求的校园服务小程序呢&#xff1f;…

VTK官方示例

VTK官方示例 -vtk字體 #!/usr/bin/env python# noinspection PyUnresolvedReferences import vtkmodules.vtkInteractionStyle # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingFreeType # noinspection PyUnresolvedReferences import vtkmodules.vtk…

创新指南 |风险管理:企业如何应对颠覆性创新带来的挑战

在当今充满变数的商业时代&#xff0c;颠覆性创新是企业突破传统、引领市场的关键。然而&#xff0c;真正的创新之旅并不平坦&#xff0c;充满了挑战和不确定性。文章将快速引导读者了解颠覆性创新的定义、挑战、以及如何通过设计思维、市场洞察、利益相关者沟通和文化变革等关…

专业数字音频编码器 JR-AE401

简介 JR-AE401专业模拟&数字音频编码器采用最为先进的MPEG4 AAC音频压缩算法&#xff0c;在低网络带宽的严酷条件下也具备优异的音频还原性。支持多种音频编码标准&#xff0c;例如AAC-LC,AAC-HE,AAC-HEv2等。 为适应各种复杂的网络音频应用环境JR-AE401提供了丰富的流媒…

数据结构十三:八大排序算法

排序算法&#xff08;sorting algorithm&#xff09;是用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用&#xff0c;因为有序数据通常能够被更高效地查找、分析和处理。排序算法中的数据类型可以是整数、浮点数、字符或字符串等。排序的判断规则可根据需求设定&am…

串口属性中的BM延时计时器问题

如果使用程序修改则需要修改注册表对应位置如下 第一个示例&#xff08;217&#xff09; 第二个示例&#xff08;219&#xff09; 需要注意的事情是修改前必须点查看串口名称&#xff08;例如上图是com5&#xff09; 程序修改&#xff1a; 有没有办法以编程方式更改USB <…

算法设计与分析 例题解答 解空间与搜索

1.请画出用回溯法解n3的0-1背包问题的解空间树和当三个物品的重量为{20, 15, 10}&#xff0c;价值为{20, 30, 25}&#xff0c;背包容量为25时搜索空间树。 答&#xff1a; 解空间树&#xff1a; 搜索空间树&#xff1a; 2. 考虑用分支限界解0-1背包问题 给定n种物品和一背包…

每个初创企业创始人都应了解的搜索引擎优化基础知识

会话式AI引擎&#xff1a;如何革新您的业务通讯&#xff1f; 对于已经身兼数职的初创企业创始人来说&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;似乎是一项艰巨的任务。然而&#xff0c;在数字时代&#xff0c;它是推动流量、建立品牌知名度和实现长期成功不可或缺的…

2024年电工杯数学建模B题思路 中国电机工程学会杯建模思路分析

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

ASP.NET WebApi 如何使用 OAuth2.0 认证

前言 OAuth 2.0 是一种开放标准的授权框架&#xff0c;用于授权第三方应用程序访问受保护资源的流程。 OAuth 2.0 认证是指在这个框架下进行的身份验证和授权过程。 在 OAuth 2.0 认证中&#xff0c;涉及以下主要参与方&#xff1a; 资源所有者&#xff08;Resource Owner&…

Agisoft Metashape Pro for Mac/win:开启三维建模新视界

在当今数字化的时代&#xff0c;三维建模技术正发挥着越来越重要的作用。而 Agisoft Metashape Pro for Mac/win 无疑是该领域的一颗璀璨明星。 这款强大的三维建模软件为专业人士和爱好者提供了无与伦比的工具和功能。无论你是从事建筑设计、考古研究、影视特效制作还是地理信…

【nodejs 命令行交互神器 - inquirer.js】

需求 大家在开发时&#xff0c;有时需要从命令行读取用户的输入&#xff0c;或者让用户选择。在nodejs中&#xff0c;这个怎么实现? 原生实现 ❌ process.stdin.setEncoding(utf8);process.stdin.on(readable, () > {let chunk;// 使用循环确保我们读取所有的可用输入wh…

导电材料——分类、性能与性质

本篇为西安交通大学本科课程《电气材料基础》的笔记。 导电材料指的是能在电场下传导电流的材料。导体价电子所在能带为半满带&#xff0c;且相邻能级间隔小&#xff0c;外电场下电子很容易从低能级跃迁到高能级上&#xff0c;大量的电子很容易获得能量进行共有化运动&#xf…

winhex工具,将文件转换为16进制数据放入代码。

今天介绍winhex工具&#xff0c;可以将任何内容读取读取为16进制数据。下面看下效果。 下载链接&#xff1a; WinHex: Hex Editor & Disk Editor, Computer Forensics & Data Recovery Software 一、WinHex打开文件 我们要打开的文件&#xff1a; 打开后&#xff1a; 我…

QueryPerformanceCounter实现高精度uS(微妙)延时

参考连接 C# 利用Kernel32的QueryPerformanceCounter封装的 高精度定时器Timer_kernel32.dll queryperformancecounter-CSDN博客https://blog.csdn.net/wuyuander/article/details/111831973 特此记录 anlog 2024年5月11日

ubuntu系统在有无NVIDIA驱动下查看显卡型号

在ubuntu系统下&#xff0c;分别在有nvidia显卡驱动和无nvidia显卡驱动时&#xff0c;查看nvidia显卡型号。 1、有nvidia显卡驱动时的查看方式 nvidia-smi -L会显示如下信息&#xff1a; GPU 0: NVIDIA GEForce GTX 1660 SUPER (UUID: GPU-*****)2、无nvidia显卡驱动时的查看…

凸优化理论学习一|最优化及凸集的基本概念

文章目录 一、优化问题&#xff08;一&#xff09;数学优化&#xff08;二&#xff09;凸优化 二、凸集&#xff08;一&#xff09;一些标准凸集&#xff08;二&#xff09;保留凸性的运算&#xff08;三&#xff09;正常锥和广义不等式&#xff08;四&#xff09;分离和支撑超…

TriDet: Temporal Action Detection with Relative Boundary Modeling

标题&#xff1a;TriDet&#xff1a;采用相对边界建模的时间动作检测 原文链接&#xff1a;TriDet: Temporal Action Detection With Relative Boundary Modeling (thecvf.com)https://openaccess.thecvf.com/content/CVPR2023/papers/Shi_TriDet_Temporal_Action_Detection_W…

SpringBoot @DS注解 和 DynamicDataSource自定义实现多数据源的2种实现方式

前言 在实际的项目中&#xff0c;我们经常会遇到需要操作多个数据源的情况&#xff0c;SpringBoot为我们提供了多种实现多数据源的方式。本文将介绍两种常见的方式&#xff1a;使用DS注解实现多数据源的切换以及使用DynamicDataSource自定义实现多数据源的切换。 我们将分别介…