diff --git a/doc/image/allZ.png b/doc/image/allZ.png
new file mode 100644
index 0000000..1fd7aea
Binary files /dev/null and b/doc/image/allZ.png differ
diff --git a/doc/image/leftZ.png b/doc/image/leftZ.png
new file mode 100644
index 0000000..93a4e2a
Binary files /dev/null and b/doc/image/leftZ.png differ
diff --git a/doc/image/pay.png b/doc/image/pay.png
new file mode 100644
index 0000000..4fb2d1f
Binary files /dev/null and b/doc/image/pay.png differ
diff --git a/doc/image/rightZ.png b/doc/image/rightZ.png
new file mode 100644
index 0000000..53b2396
Binary files /dev/null and b/doc/image/rightZ.png differ
diff --git a/doc/report.ftl b/doc/report.ftl
new file mode 100644
index 0000000..ca4aa36
--- /dev/null
+++ b/doc/report.ftl
@@ -0,0 +1,226 @@
+
+
+
+ Report
+
+
+
+
+
+
+
+ 合同编号:PS-
+ ${contract.contractCode}
+ 客户编号:
+ ${contract.customId}
+
+
+
+
+
+ <#--
-->
+
+ ${company.companyName}
+
+ 服务合同
+
本合同由缔约双方在自愿、平等、公平及诚实信用原则的基础上,本着共赢互利原则,根据《中华人民共和国民法典》等
+
相关法律、法规的规定,双方签订以下服务合同以资信守,本服务合同后附的《服务通用条款》为本服务单的有效组成部分
+
(以下合称为“本协议”),对双方均具有约束力。
+
+
+
+
+
+ 服务类别
+ |
+
+ 具体内容
+ |
+
+ <#list business as item>
+
+
+ ${item.businessType}
+ |
+
+
+ <#list item.detailBos as detail>
+ ${detail.businessProjectLabel}——${detail.amount}
+ #list>
+ |
+
+ #list>
+
+
+ 付款账号
+ |
+
+
+
+ 公司名称:${company.companyName}
+ 账号:${company.companyAccountBank}
+ 开户行:${company.companyAccountBankAdress}
+
+
+
+
+ |
+
+
+
+
+
+ 合同金额:共计¥
+ ${contract.contractAmount}
+ 元(大写金额:
+
+ 元整),垫付项目中涉及银行开户、刻章等,实际价格以第三方机构及政府规定为准。除此之外,甲方无需向乙方支付其他任何费用。
+ |
+
+
+
+ 付款方式
+ |
+
+
+ ${contract.payModeDesc}
+ |
+
+
+
+ 合同备注
+ |
+
+
+
+ <#if text2?? && text2 != "">
+ ${contract.signDesc}
+ <#else>
+ 无
+ #if>
+
+ |
+
+
+
+
+
+
+
一、服务期限
+
本合同中的服务周期为 至 。
+
本合同中的企业托管服务,在合同到期前 30 天,乙方有义务告知甲方。如果双方在合同期满前 30 天内未提出终止或变更要
+
求,未办理交接手续,本合同将自行延期一年。如为其他业务,则与双方约定时间为准。
+
+
二、甲方权利与义务
+
(一)甲方须按本合同约定,按时足额支付服务费用,否则乙方有权拒绝提供服务;
+
(二)甲方应无保留地向乙方陈述与代理事务有关的真实情况,提供的资料必须真实合法,且法定代表人、监事、股东等信息
+
的提交须经过其本人同意,否则因此导致的所有风险与责任均由甲方自行承担;
+
+
三、乙方权利和义务
+
(一)乙方在收到甲方支付的款项后,立即启动本合同约定的服务;
+
(二)乙方按照甲方提供的真实有效的企业信息,为甲方办理企业的委托服务;
+
(三)乙方应及时将服务办理完毕后形成的相关资料交予甲方;
+
(四)除为履行本合同所需外,未经甲方事先同意,乙方不得擅自向第三方泄露甲方的商业信息及其他资料。
+
(五)甲方若有违法违规经营情形,或甲方示意乙方提供不当的服务以及其他不符合法律、行政法规的要求,乙方有权拒
+
绝;若 甲方坚持其不当要求,乙方有权单方解除本合同,本合同自乙方向甲方发出通知之日起终止,由此造成的相关责任由甲方
+
自行承担。
+
(六)如甲方不按乙方要求完整、及时地准备和提供相应的资料,导致乙方受托事项办理的延误或未完成,由此所发生的一切
+
后果完全由甲方承担,乙方不承担任何责任。
+
+
四、违约责任
+
(一)甲乙双方任何一方无正当理由提前终止本合同的,应按照本合同服务总金额的 20%向守约方支付违约金,乙方扣除违约
+
金后退还剩余服务期费用;如乙方为甲方注册成立公司后,甲方无正当理由提前解除或终止合同的,乙方不予退还本合同的服务费
+
用。
+
(二)若甲方拖欠乙方服务费,以应付而未付的金额为基础,按每天万分之五的日利率计收每日逾期利息。若甲方逾期支付达
+
1个月,视为甲方主动终止本合同,乙方有权终止提供服务,由此产生的经济、法律及其他责任由甲方自行承担,在甲方未按照本合
+
同约定支付服务费和其他费用的情况下,乙方有权将甲方资料予 以留置,在甲方所欠费用结清后,乙方归还甲方相关资料。
+
(三)任何一方违反本合同部分条款约定的,不影响其余条款的效力和继续履行。对违约情形,守约方有权要求违约方予以更
+
正,若违约方拒绝纠正的,守约方有权单方解除本合同并要求违约方承担违约赔偿责任
+
(四)由于乙方过错给甲方造成损失的,乙方应承担赔偿责任,但赔偿责任以该合作周期内所收取的该项服务的服务费用为赔
+
偿上限。
+
+
五、不可抗力
+
不可抗力是指法律规章或政策变化、社会异常事件(如罢工、骚乱、盗窃、抢劫以及其它不能预见的客观情况)、自然灾害
+
(如台风、洪水、冰雹、地震、海啸、火灾、旱灾、大雪、山崩)等对其发生和后果不能防止或避免的事件。
+
发生不可抗力事件时,双方应互相协商,寻求公平合理的解决争议途经,并尽一切努力减轻不可抗力造成的不良后果。在不可
+
抗力造成本合同无法履行的情况下,双方互不承担责任,且甲方和乙方均有权选择终止本合同,乙方已收款项在扣除已经完成的服务
+
费用和已经产生的成本后进行返还。
+
+
六、通知与送达
+
甲方确保其通信地址、联系人、联系电话的准确性及有效性,因乙方经努力而无法与甲方取得联系而引起的一切后果,由甲方承担;
+
(一)如果是专人送交,则在对方签收视为已送达。
+
(二)如用快递、传真发送,则在收到传输确认书的当天被视为送到,如果传输当天不是工作日,或传输时工作日已结束营
+
业,则在下一个工作日被视作已送达日。
+
(三)以电子邮件、微信等工具发出的,则为发送人的邮件系统确认电子邮件发送至收件人的邮件接收系统后的当天为送达
+
日。
+
(四)各方均应积极履行通知义务,且确保送达地址的有效及准确,任何一方不得以拒绝签收、无人签收、变更地址未收到等
+
理由否定送达效力。
+
(五)乙方工商注册环节的企业营业执照、印章等物品的快递费用由乙方承担,注册企业之后所产生的快递(到付)费用由甲
+
方自行承担。
+
+
七、合同份数及法律效力
+
本合同一式贰份,甲方持壹份,乙方持壹份,每份合同具有相同的法律效力。本合同自双方签署后生效。
+
+
八、其他
+
(一)乙方出于宣传目的而采取发放宣传册、广告、网页推广、销售人员宣讲等方式展现的内容不具有合同效力,双方权利义
+
务内容以本合同为准。
+
(二)乙方工作人员无权向甲方作出超出本合同内容的承诺以及代表乙方以个人形式签署任何文件,双方均应以加盖印章的文
+
件作为双方权利义务约定的唯一形式。
+
(三)本合同内容若需做出任何修改补充,甲、乙双方共同协商,可形成补充协议,补充协议与本合同冲突的,以补充协议为准。
+
(四)因本合同发生争议,双方协商解决;如果协商不成,甲、乙双方一致同意提交仲裁委员会按照其仲裁规则进行裁决,其
+
裁决是终局性的,对双方具有约束力。因争议解决产生的案件受理费、律师费、保全费、公证费、鉴定费等由败诉方承担。
+
(五)本合同传真及扫描件与合同原件具有同等法律效力。
+
+
甲方名称(签章): ${customer.customName}
+
甲方联系人: ${customer.customName}
+
联系方式: ${customer.customMobile}
+
签约日期: ${contract.applyDate?string('yyyy年MM月dd日')}
+ <#-- 年
+ 月
+ 日-->
+
+
+
+
乙方名称(签章): ${customer.customName}
+
乙方联系人: ${customer.customName}
+
联系方式: ${customer.customName}
+
签约日期: ${contract.applyDate?string('yyyy年MM月dd日')}
+ <#-- 年
+ 月
+ 日-->
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pusong-admin/src/main/resources/application.yml b/pusong-admin/src/main/resources/application.yml
index 2beabba..01c484e 100644
--- a/pusong-admin/src/main/resources/application.yml
+++ b/pusong-admin/src/main/resources/application.yml
@@ -45,8 +45,8 @@ server:
logging:
level:
org.dromara: @logging.level@
- org.springframework: warn
- org.mybatis.spring.mapper: error
+ org.springframework: info
+ org.mybatis.spring.mapper: debug
config: classpath:logback-plus.xml
# 用户配置
diff --git a/pusong-common/pusong-common-doc/pom.xml b/pusong-common/pusong-common-doc/pom.xml
index f0f3b75..d200232 100644
--- a/pusong-common/pusong-common-doc/pom.xml
+++ b/pusong-common/pusong-common-doc/pom.xml
@@ -36,6 +36,27 @@
jackson-module-kotlin
+
+
+ org.springframework.boot
+ spring-boot-starter-freemarker
+
+
+ com.itextpdf
+ itextpdf
+ 5.5.13
+
+
+ com.itextpdf.tool
+ xmlworker
+ 5.5.13
+
+
+ com.itextpdf
+ itext-asian
+ 5.2.0
+
+
diff --git a/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/CustomXMLWorkerFontProvider.java b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/CustomXMLWorkerFontProvider.java
new file mode 100644
index 0000000..4fa507c
--- /dev/null
+++ b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/CustomXMLWorkerFontProvider.java
@@ -0,0 +1,34 @@
+package com.pusong.common.doc.util;
+
+import com.itextpdf.text.BaseColor;
+import com.itextpdf.text.Font;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.tool.xml.XMLWorkerFontProvider;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 解决XMLWorkerHelper中文不显示。
+ * 使用iTextAsian.jar中自带的中文字体
+ *
+ */
+@Slf4j
+public class CustomXMLWorkerFontProvider extends XMLWorkerFontProvider {
+
+ @Override
+ public Font getFont(final String fontName, final String encoding, final boolean embedded, final float size, final int style,
+ final BaseColor color) {
+ BaseFont bf = null;
+ try {
+// bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
+ bf =BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
+
+ Font font = new Font(bf, size, style, color);
+ font.setColor(color);
+ // log.info("PDF文档字体初始化完成!");
+ return font;
+ } catch (Exception e) {
+ log.error("exception:", e);
+ }
+ return null;
+ }
+}
diff --git a/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PDFBuilder.java b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PDFBuilder.java
new file mode 100644
index 0000000..8fddb45
--- /dev/null
+++ b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PDFBuilder.java
@@ -0,0 +1,220 @@
+package com.pusong.common.doc.util;
+
+
+import java.io.IOException;
+
+import com.itextpdf.text.Document;
+import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.Element;
+import com.itextpdf.text.Font;
+import com.itextpdf.text.Image;
+import com.itextpdf.text.PageSize;
+import com.itextpdf.text.Phrase;
+import com.itextpdf.text.Rectangle;
+import com.itextpdf.text.pdf.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * 设置页面附加属性
+ *
+ */
+public class PDFBuilder extends PdfPageEventHelper {
+
+ private static final Logger log = LoggerFactory.getLogger(PDFBuilder.class);
+ /**
+ * 页眉
+ */
+ public String header = "";
+
+ /**
+ * 文档字体大小,页脚页眉最好和文本大小一致
+ */
+ public int presentFontSize = 10;
+
+ /**
+ * 文档页面大小,最好前面传入,否则默认为A4纸张
+ */
+ public Rectangle pageSize = PageSize.A4;
+
+ // 模板
+ public PdfTemplate total;
+
+ // 基础字体对象
+ public BaseFont bf = null;
+
+ // 利用基础字体生成的字体对象,一般用于生成中文文字
+ public Font fontDetail = null;
+
+ /**
+ *
+ * Creates a new instance of PdfReportM1HeaderFooter 无参构造方法.
+ *
+ */
+ public PDFBuilder() {
+
+ }
+
+ /**
+ *
+ * Creates a new instance of PdfReportM1HeaderFooter 构造方法.
+ *
+ * @param yeMei
+ * 页眉字符串
+ * @param presentFontSize
+ * 数据体字体大小
+ * @param pageSize
+ * 页面文档大小,A4,A5,A6横转翻转等Rectangle对象
+ */
+ public PDFBuilder(String yeMei, int presentFontSize, Rectangle pageSize) {
+ this.header = yeMei;
+ this.presentFontSize = presentFontSize;
+ this.pageSize = pageSize;
+ }
+
+ public void setHeader(String header) {
+ this.header = header;
+ }
+
+ public void setPresentFontSize(int presentFontSize) {
+ this.presentFontSize = presentFontSize;
+ }
+
+ /**
+ *
+ * TODO 文档打开时创建模板
+ *
+ * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter,
+ * com.itextpdf.text.Document)
+ */
+ /* public void onOpenDocument(PdfWriter writer, Document document) {
+ total = writer.getDirectContent().createTemplate(50, 50);// 共 页 的矩形的长宽高
+ }*/
+
+ /**
+ *
+ * TODO 关闭每页的时候,写入页眉,写入'第几页共'这几个字。
+ *
+ * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter,
+ * com.itextpdf.text.Document)
+ */
+ public void onEndPage(PdfWriter writer, Document document) {
+// this.addPage(writer, document);
+ this.addWatermark(writer);
+ }
+
+ //加分页
+ public void addPage(PdfWriter writer, Document document){
+ try {
+ if (bf == null) {
+ bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
+ }
+ if (fontDetail == null) {
+ fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
+ }
+ } catch (DocumentException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ // 1.写入页眉
+ ColumnText.showTextAligned(writer.getDirectContent(),
+ Element.ALIGN_LEFT, new Phrase(header, fontDetail),
+ document.right()/2, document.top() - 17, 0);
+
+
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < 210; i++) {
+ sb.append("\u00a0");
+ }
+
+ ColumnText.showTextAligned(writer.getDirectContent(),
+ Element.ALIGN_LEFT, new Phrase(sb.toString(), fontDetail),
+ document.left(-1), document.top() -50, 0);
+
+// // 2.写入前半部分的 第 X页/共
+// int pageS = writer.getPageNumber();
+// String foot1 = "第 " + pageS + " 页 /共";
+// Phrase footer = new Phrase(foot1, fontDetail);
+//
+// // 3.计算前半部分的foot1的长度,后面好定位最后一部分的'Y页'这俩字的x轴坐标,字体长度也要计算进去 = len
+// float len = bf.getWidthPoint(foot1, presentFontSize);
+//
+// // 4.拿到当前的PdfContentByte
+// PdfContentByte cb = writer.getDirectContent();
+//
+// // 5.写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F
+// // 再给偏移20F适合人类视觉感受,否则肉眼看上去就太偏左了
+// // ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了;注意Y轴是从下往上累加的,最上方的Top值是大于Bottom好几百开外的。
+// ColumnText
+// .showTextAligned(
+// cb,
+// Element.ALIGN_CENTER,
+// footer,
+// (document.rightMargin() + document.right()
+// + document.leftMargin() - document.left() - len) / 2.0F + 20F,
+// document.bottom() - 20, 0);
+//
+// // 6.写入页脚2的模板(就是页脚的Y页这俩字)添加到文档中,计算模板的和Y轴,X=(右边界-左边界 - 前半部分的len值)/2.0F +
+// // len , y 轴和之前的保持一致,底边界-20
+// cb.addTemplate(total, (document.rightMargin() + document.right()
+// + document.leftMargin() - document.left()) / 2.0F + 20F,
+// document.bottom() - 20); // 调节模版显示的位置
+
+ }
+
+ public static void main(String[] args) {
+ System.out.println(System.getProperty("user.dir"));
+ }
+ //加水印
+ public void addWatermark(PdfWriter writer){
+ String psth;
+ if(writer.getPageNumber() == 1){
+ psth = System.getProperty("user.dir")+"\\doc\\image\\leftZ.png";
+ }else if (writer.getPageNumber() == 2){
+ psth = System.getProperty("user.dir")+"\\doc\\image\\rightZ.png";
+ }else{
+ return;
+ }
+ // 水印图片
+ Image image;
+ try {
+ image = Image.getInstance(psth);
+ image.scaleAbsolute(75,150);
+ PdfContentByte content = writer.getDirectContentUnder();
+ content.beginText();
+ image.setAbsolutePosition(450+75,400);
+ content.addImage(image);
+// // 开始写入水印
+// for(int k=0;k<5;k++){
+// for (int j = 0; j <4; j++) {
+// image.setAbsolutePosition(150*j,170*k);
+// content.addImage(image);
+// }
+// }
+ content.endText();
+ } catch (IOException | DocumentException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ *
+ * TODO 关闭文档时,替换模板,完成整个页眉页脚组件
+ *
+ * @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(com.itextpdf.text.pdf.PdfWriter,
+ * com.itextpdf.text.Document)
+ */
+ /* public void onCloseDocument(PdfWriter writer, Document document) {
+ // 7.最后一步了,就是关闭文档的时候,将模板替换成实际的 Y 值,至此,page x of y 制作完毕,完美兼容各种文档size。
+ total.beginText();
+ total.setFontAndSize(bf, presentFontSize);// 生成的模版的字体、颜色
+ String foot2 = " " + (writer.getPageNumber()-1) + " 页";
+ total.showText(foot2);// 模版显示的内容
+ total.endText();
+ total.closePath();
+ }*/
+}
diff --git a/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PdfGenerator.java b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PdfGenerator.java
new file mode 100644
index 0000000..3841633
--- /dev/null
+++ b/pusong-common/pusong-common-doc/src/main/java/com/pusong/common/doc/util/PdfGenerator.java
@@ -0,0 +1,99 @@
+package com.pusong.common.doc.util;
+
+import com.itextpdf.text.Document;
+import com.itextpdf.text.pdf.PdfWriter;
+import com.itextpdf.tool.xml.XMLWorkerHelper;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class PdfGenerator {
+
+ private static final Logger log = LoggerFactory.getLogger(PdfGenerator.class);
+
+ public static void main(String[] args) throws Exception {
+
+
+ // 创建数据模型
+ Map data = new HashMap<>();
+ data.put("text1", "天津浦颂企业管理咨询有限公司");
+ data.put("text2", "");
+ data.put("total", 1000);
+ List