You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

564 lines
18 KiB
Go

5 months ago
package main
import (
"flag"
5 months ago
"fmt"
5 months ago
"github.com/gin-gonic/gin"
5 months ago
"github.com/jung-kurt/gofpdf"
5 months ago
"insure/global"
"insure/initialize"
5 months ago
"insure/router"
5 months ago
"strconv"
5 months ago
)
func main() {
initial()
//testVerify()
//runServer()
5 months ago
//gen3()
runServerInWindows()
5 months ago
}
func initial() {
var configFilePath string
5 months ago
flag.StringVar(&configFilePath, "config", "./conf/config.yaml", "配置文件")
5 months ago
flag.Parse()
global.Config = initialize.InitConfig(configFilePath)
global.DB = initialize.InitDB(global.Config)
global.Redis = initialize.InitRedis(global.Config)
}
/*func runServer() {
r := gin.Default()
s := &http.Server{
Addr: ":8080",
Handler: r,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
5 months ago
router.Initial(r)
5 months ago
err := endless.ListenAndServe(":"+global.Config.Server.Port, s.Handler)
if err != nil {
panic(err)
}
}*/
func runServerInWindows() {
r := gin.Default()
5 months ago
router.Initial(r)
5 months ago
r.Run(":" + global.Config.Server.Port)
5 months ago
}
5 months ago
func gen() {
pdf := gofpdf.New("P", "mm", "A4", "") // 210mm x 297mm
pdf.AddPage()
for fontSize := 4; fontSize < 40; fontSize += 10 {
pdf.SetFont("Arial", "S", float64(fontSize))
pdf.SetXY(0, float64(fontSize))
pdf.Cell(40, 10, "Hello World")
}
err := pdf.OutputFileAndClose("./test.pdf")
if err != nil {
fmt.Println(err)
}
}
func strDelimit(str string, sepstr string, sepcount int) string {
pos := len(str) - sepcount
for pos > 0 {
str = str[:pos] + sepstr + str[pos:]
pos = pos - sepcount
}
return str
}
func gen1() {
pdf := gofpdf.New("P", "mm", "A4", "")
type countryType struct {
nameStr, capitalStr, areaStr, popStr string
}
countryList := make([]countryType, 0, 8)
header := []string{"Country", "Capital", "Area (sq km)", "Pop. (thousands)"}
for i := 0; i < 8; i++ {
countryList = append(countryList, countryType{
nameStr: "name" + strconv.Itoa(i),
capitalStr: "capital" + strconv.Itoa(i),
areaStr: "area" + strconv.Itoa(i),
popStr: "pop" + strconv.Itoa(i),
})
}
// Simple table
basicTable := func() {
left := (210.0 - 4*40) / 2
pdf.SetX(left)
for _, str := range header {
pdf.CellFormat(40, 7, str, "1", 0, "", false, 0, "")
}
pdf.Ln(-1)
for _, c := range countryList {
pdf.SetX(left)
pdf.CellFormat(40, 6, c.nameStr, "1", 0, "", false, 0, "")
pdf.CellFormat(40, 6, c.capitalStr, "1", 0, "", false, 0, "")
pdf.CellFormat(40, 6, c.areaStr, "1", 0, "", false, 0, "")
pdf.CellFormat(40, 6, c.popStr, "1", 0, "", false, 0, "")
pdf.Ln(-1)
}
}
// Better table
improvedTable := func() {
// Column widths
w := []float64{40.0, 35.0, 40.0, 45.0}
wSum := 0.0
for _, v := range w {
wSum += v
}
left := (210 - wSum) / 2
// Header
pdf.SetX(left)
for j, str := range header {
pdf.CellFormat(w[j], 7, str, "1", 0, "C", false, 0, "")
}
pdf.Ln(-1)
// Data
for _, c := range countryList {
pdf.SetX(left)
pdf.CellFormat(w[0], 6, c.nameStr, "LR", 0, "", false, 0, "")
pdf.CellFormat(w[1], 6, c.capitalStr, "LR", 0, "", false, 0, "")
pdf.CellFormat(w[2], 6, strDelimit(c.areaStr, ",", 3),
"LR", 0, "R", false, 0, "")
pdf.CellFormat(w[3], 6, strDelimit(c.popStr, ",", 3),
"LR", 0, "R", false, 0, "")
pdf.Ln(-1)
}
pdf.SetX(left)
pdf.CellFormat(wSum, 0, "", "T", 0, "", false, 0, "")
}
// Colored table
fancyTable := func() {
// Colors, line width and bold font
pdf.SetFillColor(255, 0, 0)
pdf.SetTextColor(255, 255, 255)
pdf.SetDrawColor(128, 0, 0)
pdf.SetLineWidth(.3)
pdf.SetFont("", "B", 0)
// Header
w := []float64{40, 35, 40, 45}
wSum := 0.0
for _, v := range w {
wSum += v
}
left := (210 - wSum) / 2
pdf.SetX(left)
for j, str := range header {
pdf.CellFormat(w[j], 7, str, "1", 0, "C", true, 0, "")
}
pdf.Ln(-1)
// Color and font restoration
pdf.SetFillColor(224, 235, 255)
pdf.SetTextColor(0, 0, 0)
pdf.SetFont("", "", 0)
// Data
fill := false
for _, c := range countryList {
pdf.SetX(left)
pdf.CellFormat(w[0], 6, c.nameStr, "LR", 0, "", fill, 0, "")
pdf.CellFormat(w[1], 6, c.capitalStr, "LR", 0, "", fill, 0, "")
pdf.CellFormat(w[2], 6, strDelimit(c.areaStr, ",", 3),
"LR", 0, "R", fill, 0, "")
pdf.CellFormat(w[3], 6, strDelimit(c.popStr, ",", 3),
"LR", 0, "R", fill, 0, "")
pdf.Ln(-1)
fill = !fill
}
pdf.SetX(left)
pdf.CellFormat(wSum, 0, "", "T", 0, "", false, 0, "")
}
pdf.AddPage()
5 months ago
pdf.AddUTF8Font("SIMFANG", "", "./SIMFANG.TTF")
pdf.SetFont("SIMFANG", "", float64(12))
5 months ago
pdf.SetXY(0, float64(40))
5 months ago
imgFileStr := "./static/assets/img/zking_logo.png"
infoPtr := pdf.RegisterImage(imgFileStr, "")
imgWd, imgHt := infoPtr.Extent()
pdf.Image(imgFileStr, 0, 0, imgWd, imgHt, false, "", 0, "")
pdf.Cell(40, 10, `注意:请认准阅读所附条款,尤其是黑体部分内容`)
pdf.Ln(-1)
pdf.SetFontSize(20)
pdf.Cell(40, 10, "投标保证保险投保单")
pdf.Ln(-1)
pdf.SetFontSize(10)
pdf.Cell(40, 10, "在您填写本投保单前,请仔细阅读《紫金财产保险股份有限公司投标保证保险条款》 ,特别注意条款中有")
pdf.Ln(5)
pdf.Cell(40, 10, "关保险责任、 免除保险人责任和投保人、被保险人义务的规定, 同时听取本公司就条款所做的说明,")
pdf.Ln(5)
pdf.Cell(40, 10, "并可就 其中内容要求本公司做出解释。在您已充分理解保险条款后,请您如实填写本投保单并签章确认。")
pdf.Ln(5)
pdf.CellFormat(30, 30, "投保人(投标人)", "1", 0, "", false, 0, "")
pdf.CellFormat(40, 6, "法人名称/自然人姓名", "1", 0, "", false, 0, "")
pdf.CellFormat(60, 6, "", "1", 0, "", false, 0, "")
pdf.Ln(-1)
pdf.SetX(40)
pdf.CellFormat(40, 6, "证件类型", "1", 0, "", false, 0, "")
pdf.CellFormat(40, 6, "", "1", 0, "", false, 0, "")
pdf.CellFormat(40, 6, "证件号码", "1", 0, "", false, 0, "")
//pdf.MultiCell(40, 6, "证件号码", "1", "", false)
pdf.CellFormat(40, 6, "", "1", 0, "", false, 0, "")
pdf.Ln(-1)
pdf.SetX(40)
pdf.CellFormat(40, 18, "法人性质", "1", 0, "", false, 0, "")
//pdf.MultiCell(40, 6, "□国有 ☑集体 □民营 □私营 □外资 □合资 □其他", "1", "", false)
pdf.CellFormat(40, 18, "□国有 ☑集体 □民营 □私营 □外资 □合资 □其他", "1", 0, "", false, 0, "")
pdf.CellFormat(40, 18, "法人资质", "1", 0, "", false, 0, "")
pdf.CellFormat(40, 18, "□特级 ☑一级 □二级 □三级", "1", 0, "", false, 0, "")
//pdf.MultiCell(40, 6, "□特级 ☑一级 □二级 □三级", "1", "", false)
pdf.Ln(5)
pdf.Ellipse(30, 15, 20, 10, 0, "D")
pdf.Ln(10)
5 months ago
pdf.SetFont("Arial", "", 14)
basicTable()
pdf.AddPage()
improvedTable()
pdf.AddPage()
fancyTable()
err := pdf.OutputFileAndClose("./test2.pdf")
if err != nil {
fmt.Println(err)
}
}
5 months ago
func gen2() {
const (
thin = 0.2
thick = 3.0
)
pdf := gofpdf.New("", "", "", "")
pdf.SetFont("Helvetica", "", 12)
pdf.SetFillColor(200, 200, 220)
pdf.AddPage()
y := 15.0
pdf.Text(10, y, "Circles")
pdf.SetFillColor(200, 200, 220)
pdf.SetLineWidth(thin)
pdf.Circle(20, y+15, 10, "D")
pdf.Circle(45, y+15, 10, "F")
pdf.Circle(70, y+15, 10, "FD")
pdf.SetLineWidth(thick)
pdf.Circle(95, y+15, 10, "FD")
pdf.SetLineWidth(thin)
y += 40.0
pdf.Text(10, y, "Ellipses")
pdf.SetFillColor(220, 200, 200)
pdf.Ellipse(30, y+15, 20, 10, 0, "D")
pdf.Ellipse(75, y+15, 20, 10, 0, "F")
pdf.Ellipse(120, y+15, 20, 10, 0, "FD")
pdf.SetLineWidth(thick)
pdf.Ellipse(165, y+15, 20, 10, 0, "FD")
pdf.SetLineWidth(thin)
y += 40.0
pdf.Text(10, y, "Curves (quadratic)")
pdf.SetFillColor(220, 220, 200)
pdf.Curve(10, y+30, 15, y-20, 40, y+30, "D")
pdf.Curve(45, y+30, 50, y-20, 75, y+30, "F")
pdf.Curve(80, y+30, 85, y-20, 110, y+30, "FD")
pdf.SetLineWidth(thick)
pdf.Curve(115, y+30, 120, y-20, 145, y+30, "FD")
pdf.SetLineCapStyle("round")
pdf.Curve(150, y+30, 155, y-20, 180, y+30, "FD")
pdf.SetLineWidth(thin)
pdf.SetLineCapStyle("butt")
y += 40.0
pdf.Text(10, y, "Curves (cubic)")
pdf.SetFillColor(220, 200, 220)
pdf.CurveBezierCubic(10, y+30, 15, y-20, 10, y+30, 40, y+30, "D")
pdf.CurveBezierCubic(45, y+30, 50, y-20, 45, y+30, 75, y+30, "F")
pdf.CurveBezierCubic(80, y+30, 85, y-20, 80, y+30, 110, y+30, "FD")
pdf.SetLineWidth(thick)
pdf.CurveBezierCubic(115, y+30, 120, y-20, 115, y+30, 145, y+30, "FD")
pdf.SetLineCapStyle("round")
pdf.CurveBezierCubic(150, y+30, 155, y-20, 150, y+30, 180, y+30, "FD")
pdf.SetLineWidth(thin)
pdf.SetLineCapStyle("butt")
y += 40.0
pdf.Text(10, y, "Arcs")
pdf.SetFillColor(200, 220, 220)
pdf.SetLineWidth(thick)
pdf.Arc(45, y+35, 20, 10, 0, 0, 180, "FD")
pdf.SetLineWidth(thin)
pdf.Arc(45, y+35, 25, 15, 0, 90, 270, "D")
pdf.SetLineWidth(thick)
pdf.Arc(45, y+35, 30, 20, 0, 0, 360, "D")
pdf.SetLineCapStyle("round")
pdf.Arc(135, y+35, 20, 10, 135, 0, 180, "FD")
pdf.SetLineWidth(thin)
pdf.Arc(135, y+35, 25, 15, 135, 90, 270, "D")
pdf.SetLineWidth(thick)
pdf.Arc(135, y+35, 30, 20, 135, 0, 360, "D")
pdf.SetLineWidth(thin)
pdf.SetLineCapStyle("butt")
x1 := 10.0
y1 := 10.0
w1 := 5.0
h1 := 5.0
// 绘制复选框
pdf.Rect(x1, y1, w1, h1, "D") // 边框
pdf.Rect(x1+1, y+1, w1-2, h1-2, "DF")
err := pdf.OutputFileAndClose("./test3.pdf")
if err != nil {
fmt.Println(err)
}
}
type pdfTable struct {
pdf *gofpdf.Fpdf
columnYList []float64
style string // 风格 F仅填充 D仅边框 或者DF两个都要
alignStr string // 对其方式 LCR为水平的左、中、右TMBA为垂直的上、中、下、基准线
fontH float64 // 字体高度
cells []pdfCell //
x float64
y float64
}
type point struct {
x float64
y float64
}
type pdfCell struct {
w float64 // 宽度
h float64 // 行高
txtStr string // 文本
lines int // 判断文本会占几行
x float64
y float64
}
func (s *pdfTable) addRows(style string, alignStr string, cells ...pdfCell) {
s.style = style
s.alignStr = alignStr
_, s.fontH = s.pdf.GetFontSize()
// 记录需要的最高行高
x, y := s.pdf.GetXY() // 获取当前位置
s.x = x
s.y = y
x = s.x
y = s.y
for column, cell := range cells {
y = s.columnYList[column]
lines := s.pdf.SplitText(cell.txtStr, cell.w)
//h := float64(len(lines)) * cell.h
cell.lines = len(lines)
fmt.Println(x, y, len(lines), lines)
cell.x = x
cell.y = y
x = x + cell.w
y = y + cell.h
s.columnYList[column] = y
s.cells = append(s.cells, cell)
}
s.write()
}
func (s *pdfTable) write() {
// 手动记录并移动坐标
for _, c := range s.cells {
usedH := float64(c.lines) * s.fontH
margin := (c.h - usedH) / 2.0
s.pdf.Rect(c.x, c.y, c.w, c.h, s.style)
s.pdf.SetXY(c.x, c.y+margin) // 保持单元格内的文字有边距
s.pdf.MultiCell(c.w, s.fontH, c.txtStr, "", s.alignStr, false)
}
// 重置变量
s.cells = nil
}
func gen3() {
pdf := gofpdf.New("P", "mm", "A4", "")
pdf.AddPage()
pdf.AddUTF8Font("SIMFANG", "", "./SIMFANG.TTF")
pdf.SetFont("SIMFANG", "", float64(10))
myPdf := pdfTable{pdf: pdf}
myPdf.columnYList = make([]float64, 5)
width, _ := pdf.GetPageSize() // 页面宽度
left, _, right, _ := pdf.GetMargins() // 左右边距
usable := width - left - right // 可用的页面宽度
_, h := pdf.GetFontSize() // 字体高度
tableH := h + 2 // 行高 多出2mm的边距
tableWidth := usable / 5 // 每个单元个的宽度
pdf.SetFillColor(233, 233, 233)
// 表头
myPdf.addRows("", "CM", []pdfCell{
{w: 20, h: 7 * tableH, txtStr: "投保人(投标人)"},
{w: 50, h: tableH, txtStr: "法人名称/自然人姓名"},
{w: 3 * tableWidth, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "CM", []pdfCell{
{w: 20, h: 0, txtStr: ""},
{w: 50, h: tableH, txtStr: "证件类型"},
{w: tableWidth, h: tableH, txtStr: ""},
{w: tableWidth, h: tableH, txtStr: "证件号码"},
{w: tableWidth, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "LM", []pdfCell{
{w: 20, h: 0, txtStr: ""},
{w: 50, h: 3 * tableH, txtStr: "法人性质"},
{w: tableWidth, h: 3 * tableH, txtStr: "□国有 ☑集体 □民营 □私营 □外资 □合资 □其他"},
{w: tableWidth, h: 3 * tableH, txtStr: "法人资质"},
{w: tableWidth, h: 3 * tableH, txtStr: "□特级 ☑一级 □二级 □三级"},
}...)
myPdf.addRows("", "CM", []pdfCell{
{w: 20, h: 0, txtStr: ""},
{w: 50, h: tableH, txtStr: "联系人"},
{w: tableWidth, h: tableH, txtStr: ""},
{w: tableWidth, h: tableH, txtStr: "联系电话"},
{w: tableWidth, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "CM", []pdfCell{
{w: 20, h: 0, txtStr: ""},
{w: 50, h: tableH, txtStr: "地址"},
{w: 3 * tableWidth, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "CM", []pdfCell{
{w: 20, h: 5 * tableH, txtStr: "被保险人(招标人)"},
{w: 50, h: tableH, txtStr: "法人名称/自然人姓名"},
{w: 3 * tableWidth, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "CM", []pdfCell{
{w: 20, h: 0, txtStr: ""},
{w: 50, h: tableH, txtStr: "证件类型"},
{w: tableWidth, h: tableH, txtStr: ""},
{w: tableWidth, h: tableH, txtStr: "证件号码"},
{w: tableWidth, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "CM", []pdfCell{
{w: 20, h: 0, txtStr: ""},
{w: 50, h: tableH, txtStr: "招标文件编号"},
{w: 3 * tableWidth, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "CM", []pdfCell{
{w: 20, h: 0, txtStr: ""},
{w: 50, h: tableH, txtStr: "联系人"},
{w: tableWidth, h: tableH, txtStr: ""},
{w: tableWidth, h: tableH, txtStr: "联系电话"},
{w: tableWidth, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "CM", []pdfCell{
{w: 20, h: 0, txtStr: ""},
{w: 50, h: tableH, txtStr: "地址"},
{w: 3 * tableWidth, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "CM", []pdfCell{
{w: 20, h: 3 * tableH, txtStr: "投标项目"},
{w: 50, h: tableH, txtStr: "项目名称"},
{w: tableWidth, h: tableH, txtStr: ""},
{w: tableWidth, h: tableH, txtStr: "立项文件号"},
{w: tableWidth, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "CM", []pdfCell{
{w: 20, h: 0, txtStr: ""},
{w: 50, h: tableH, txtStr: "项目性质"},
{w: 3 * tableWidth, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "LM", []pdfCell{
{w: 20, h: 0, txtStr: ""},
{w: 50, h: tableH, txtStr: "项目预计金额"},
{w: 3 * tableWidth, h: tableH, txtStr: "(人民币)大写: 小写:"},
{w: 0, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "LM", []pdfCell{
{w: 70, h: tableH, txtStr: "保险金额"},
{w: 0, h: tableH, txtStr: ""},
{w: 3 * tableWidth, h: tableH, txtStr: "(人民币)大写: 小写:"},
{w: 0, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "LM", []pdfCell{
{w: 70, h: tableH, txtStr: "保险费"},
{w: 0, h: tableH, txtStr: ""},
{w: 3 * tableWidth, h: tableH, txtStr: "(人民币)大写: 小写:"},
{w: 0, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "LM", []pdfCell{
{w: 70, h: tableH, txtStr: "绝对免赔额/免赔率"},
{w: 0, h: tableH, txtStr: ""},
{w: 3 * tableWidth, h: tableH, txtStr: " /"},
{w: 0, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "LM", []pdfCell{
{w: 70, h: 16 * tableH, txtStr: "特别约定"},
{w: 0, h: 16 * tableH, txtStr: ""},
{w: 3 * tableWidth, h: 16 * tableH, txtStr: "1、本保单为见索即付保单本保单发生保险事故由保险人先行赔付后享有对 投保人的代位求偿权。2、本保单项下本保险在投标有效期到期后28日(含)内或被保 险人延长投标有效期后到期日后28日(含)内保持有效,延长投标有效期无需通知本保险 人,但任何索赔要求应在投标有效期内送达我方。保险失效后由平台将本保单交投标人 退回我司注销。3、兹承诺在收到被保险人书面通知说明下列中的任何一条时保 证在10日内无条件给付给被保险人金额为不超过保险金额的款项。1)投保人在投标有效 期内撤销或修改其投标文件的2)投保人在中标后,非因不可抗力原因放弃中标、无正 当理由不与招标人订立合同、在签订合同时向招标人提出附加条件、或者不按招标文件 要求提交履约担保金的3)投标人的投标文件存在《福建省住房和城乡建设厅关于施工 招标项目电子投标文件置同认定与处理的指导意见》 (闽建筑[2018]29号)规定的雷同情 形之一4)投标人中标后因违法行为导致中标被依法确认无效的5) 法律、法规规定 的其他没收投标保险金情形。4、我单位在收到招标人索赔申请后10日内无条件给予先 行支付预赔款,赔付流程将根据我单位向宁德市公共资源交易中心提供的《金融机构理 赔流程标准》执行。本保险项下所有权利和义务均受中华人民共和国法律管辖和制约。 查验保函网址:http://www.zking.com/dzbdxzcx.jhtml\n尊敬的客户您可以通过电话95312、公司柜面或登陆公司网站\nwww.zking.com查询您的保单信息、状态以及理赔情况。如您对查询结果有异议 请及时致电本公司。\n无其他特别约定"},
{w: 0, h: 16 * tableH, txtStr: ""},
{w: 0, h: 16 * tableH, txtStr: ""},
}...)
myPdf.addRows("", "LM", []pdfCell{
{w: 70, h: tableH, txtStr: "保险合同争议解决方式"},
{w: 0, h: tableH, txtStr: ""},
{w: 3 * tableWidth, h: tableH, txtStr: "诉讼"},
{w: 0, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
}...)
myPdf.addRows("", "LM", []pdfCell{
{w: 70, h: tableH, txtStr: "司法管辖"},
{w: 0, h: tableH, txtStr: ""},
{w: 3 * tableWidth, h: tableH, txtStr: "中华人民共和国管辖(港澳台除外)"},
{w: 0, h: tableH, txtStr: ""},
{w: 0, h: tableH, txtStr: ""},
}...)
err := pdf.OutputFileAndClose("./test4.pdf")
if err != nil {
fmt.Println(err)
}
}