函的特点

函是一种平行文,不能用于上下级机关,常用于不相隶属机关之间商洽工作、询问和答复问题、请求批准和答复审批事项。函可用于不相隶属机关相互商洽工作、询问和答复问题;向有关主管部门请求批准事项;向上级机关询问具体事项;上级机关答复下级机关的询问或请求批准事项;上级机关催办下级机关有关事宜;上级机关对某件原发文件做较小的补充或更正。

函对发文机关的资格要求很宽松,高层机关、基层单位、党政机关、社会团体、企事业单位均可发函,内容和格式也比较灵活。函的内容必须单一,一份函只能写一件事项,强调实用。函具有平等性和沟通性、灵活性和广泛性、单一性和实用性等特征。从函所起的作用,可划分为告知函、商洽函、询问函、答复函和请批函5种。按发文目的不同,函可以分为发函和复函2种。发函即主动提出公事事项所发出的函。复函是被动的,用于答复商洽、询问的问题或批准有关单位的请求事项。

函的格式比较独特,但总体来说,函的主体格式由标题、主送机关、正文、发文机关署名、成文日期等要素组成。

 显示效果

示例代码所生成的OFD文件:下载

 示例代码

package test.create.c12;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.bouncycastle.asn1.ASN1BitString;
import org.bouncycastle.asn1.DERBitString;

import iofd.layout.signature.SignatureRequest;
import iofd.official.OfficialDocument;
import iofd.official.gbt9704.bean.SealInfo;
import iofd.official.gbt9704.contants.OfficialDocumentType;
import iofd.pki.core.asn1.SM2Signature;
import iofd.pki.core.sm2.Sm2Signer;
import iofd.signature.OfdSignatureHelper;
import iofd.signature.OfdSignatureHelper.DigestInfo;
import iofd.signature.asn1.seal.SeSeal;
import test.create.TestDocUtil;
import test.create.c11.C1101SealHelloWorld;

/**
 * 公文:函
 * */
public class C1214Han {

	public static void main(String[] args) throws Throwable {
		C1214Han o = new C1214Han();
		o.done();
	}

	private void done() throws Throwable {
		String clzName = this.getClass().getSimpleName();
		System.out.println(clzName + " begin");
		
		OfficialDocument official = new OfficialDocument(OfficialDocumentType.HAN);
		
		official.setIssuerAgency("测试符食品药品监督管理局");
		official.setIssueNum("×××〔××××〕×号");
		
		official.setTitles("关于违法提供食品经营场所的告知函");
		
		List mainSend = new ArrayList<>();
		mainSend.add("测试测试大学");
		official.setMainSend(mainSend);
		
		official.addContent("经过我局执法人员调查核实,位于广州市测试符五山路483号某大学三角市的西园食堂快餐部等22家单位(见附件)存在未取得食品经营许可从事食品经营活动,违反了《中华人民共和国食品安全法》第三十五条第一款的规定,国家对食品生产经营实行许可制度。我局拟依法对其无证照经营食品的违法行为作出行政处罚。");
		official.addContent("现已查实,上述无证照经营企业场所为贵单位所属物业。依照《中华人民共和国食品安全法》第一百二十二条第二款的规定,明知从事前款规定的违法行为,仍为其提供生产经营场所或者其他条件的,由县级以上人民政府食品药品监督管理部门责令停止违法行为,没收违法所得,并处五万元以上十万元以下罚款;使消费者的合法权益受到损害的,应当与食品、食品添加剂生产经营者承担连带责任。");
		official.addContent("请贵单位按照《中华人民共和国食品安全法》的有关规定,自本告知函送达之日起20个工作日内,立即采取有效措施终止上述违法行为,以消除食品安全隐患。若贵单位在规定的时限内未终止违法行为,我局将依照《中华人民共和国食品安全法》第一百二十二条第二款之规定做出行政处罚。");
		official.addContent("专此函达。");
	
		List sealList = new ArrayList<>();
		SealInfo info = new SealInfo();
		info.setName("测试符食品药品监督管理局");
		info.setDate("2016年05月31日");
		info.setSeal(C1101SealHelloWorld.SEAL1);
		sealList.add(info);
		official.setSeals(sealList);
		
		List ccSends = new ArrayList<>();
		ccSends.add("××××××");
		ccSends.add("××××××");
		ccSends.add("×××××××××××××");
		ccSends.add("××××××");
		ccSends.add("××××××");
		official.setCcSends(ccSends);
		
		String digestFileName = TestDocUtil.getOfdFilePath(this.getClass(), "_digest",  false);
		String finalFileName = TestDocUtil.getOfdFilePath(this.getClass(), false);
		official.save(finalFileName);
		
		List signReqList = official.getSignatureRequestList();
		for(int i = 0; signReqList != null && i < signReqList.size(); i++) {
			File ofdFile = new File(finalFileName);
			File digestFile = new File(digestFileName);
			File finalFile = new File(finalFileName);
			SignatureRequest req = signReqList.get(i);
			SeSeal seSeal = req.getSeal();
			OfdSignatureHelper helper = OfdSignatureHelper.newInstance();
			DigestInfo digestInfo = helper.createSm3Digest(ofdFile, digestFile, C1101SealHelloWorld.pubKey, seSeal, req.getBoundary(), req.getClip(), req.getPageRef());
			byte[] digest = digestInfo.getDigest();
			
			/*
			 * 注意:这部分应该使用可靠的签名设备
			 * */
			Sm2Signer signer = new Sm2Signer();
			SM2Signature sign = signer.signWithHash(C1101SealHelloWorld.priKey, digest);
			
			byte[] signature = sign.getEncoded();
			int signVersion = 1;
			ASN1BitString dataHash = new DERBitString(digest);
			ASN1BitString timeInfo = null;//时间戳
			helper.createSm2Signature(digestInfo.getSignatureRoot(), signature, seSeal, C1101SealHelloWorld.pubKey, 
					C1101SealHelloWorld.cert, signVersion, dataHash, timeInfo, digestFile, finalFile);
		}
		
		System.out.println(clzName + " end");
		
	}

}