Forráskód Böngészése

add:添加电子签名

zoie 1 hónapja
szülő
commit
e013763e82

+ 61 - 7
controllers/Task.go

@@ -15,13 +15,6 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
-	beego "github.com/beego/beego/v2/server/web"
-	"github.com/google/uuid"
-	"github.com/xuri/excelize/v2"
-	"gonum.org/v1/plot"
-	"gonum.org/v1/plot/plotter"
-	"gonum.org/v1/plot/vg"
-	"gonum.org/v1/plot/vg/draw"
 	"image/color"
 	"math"
 	"os"
@@ -29,6 +22,14 @@ import (
 	"strings"
 	"sync"
 	"time"
+
+	beego "github.com/beego/beego/v2/server/web"
+	"github.com/google/uuid"
+	"github.com/xuri/excelize/v2"
+	"gonum.org/v1/plot"
+	"gonum.org/v1/plot/plotter"
+	"gonum.org/v1/plot/vg"
+	"gonum.org/v1/plot/vg/draw"
 )
 
 type TaskController struct {
@@ -1496,6 +1497,59 @@ func (c *TaskController) Up() {
 	return
 }
 
+// 保存电子签名pdf
+func (c *TaskController) SaveElectronicSignaturePDF() {
+	// 验证登录 User_is, User_r
+	User_r, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !User_is {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
+		c.ServeJSON()
+		return
+	}
+
+	T_pdf1 := c.GetString("T_pdf1") // 方案
+	T_pdf2 := c.GetString("T_pdf2") // 证书
+
+	T_task_id := c.GetString("T_task_id")
+	r, is := Task.Read_Task(T_task_id)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id 错误!"}
+		c.ServeJSON()
+		return
+	}
+
+	// .......
+	clos := make([]string, 0)
+	// 验证报告内容T_pdf1,上传后将 当前任务 验证方案 标志 为 5 (0未完成 1已完成(客户通过) 2已退回(客户) 3已通过(报告负责人) 4已退回(报告负责人) 5已提交)
+	// 上传后设置方案结束时间,计算所需时间和超时时间
+	if len(T_pdf1) > 0 {
+		r.T_pdf1_elec_signature = T_pdf1
+		clos = append(clos, "T_pdf1")
+		go GetWatermarkPdf(r, T_pdf1, false, "T_pdf1")
+	}
+
+	// 验证报告内容T_pdf2 ,上传后将 当前任务 报告编写 标志 为 1
+	// 上传后设置报告结束时间,计算所需时间和超时时间
+	if len(T_pdf2) > 0 {
+		r.T_pdf1_elec_signature = T_pdf2
+		clos = append(clos, "T_pdf2")
+		go GetWatermarkPdf(r, T_pdf2, false, "T_pdf2")
+
+	}
+
+	if !Task.Update_Task(r, clos...) {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
+		c.ServeJSON()
+		return
+	}
+	// 添加任务操作日志
+	Task.Add_TaskLogs_T(User_r.T_uuid, T_task_id, "任务管理", "保存电子签名方案/报告", r)
+	System.Add_UserLogs_T(User_r.T_uuid, "任务管理", "保存电子签名方案/报告", r)
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+
 // 修改验证方案状态
 func (c *TaskController) UpSchemeState() {
 	Admin_r, Admin_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))

+ 30 - 9
controllers/User.go

@@ -315,12 +315,13 @@ func (c *UserController) Signature_List() {
 	}
 
 	T_name := c.GetString("T_name")
+	T_type, _ := c.GetInt("T_type")
 
 	var cnt int64
 	var distributorMap map[string]string
 	//distributorList := Distributor.Read_Distributor_List_ALL("")
 	//distributorMap := Distributor.DistributorListToMap(distributorList)
-	List, cnt := Account.Read_UserSignature_List(user_r.T_uuid, T_name, page, page_z, distributorMap)
+	List, cnt := Account.Read_UserSignature_List(user_r.T_uuid, T_name, T_type, page, page_z, distributorMap)
 	page_size := math.Ceil(float64(cnt) / float64(page_z))
 	r_jsons.List = List
 	r_jsons.Page = page
@@ -345,13 +346,15 @@ func (c *UserController) Signature_Add() {
 
 	T_name := c.GetString("T_name")
 	T_signature := c.GetString("T_signature")
+	T_type, _ := c.GetInt("T_type")
+	var is_seal bool
+	if T_type == 2 {
+		is_seal = true
+	}
 
-	var_ := Account.UserSignature{
-		T_name:           T_name,
-		T_signature:      T_signature,
-		T_State:          1,
-		T_uuid:           user_r.T_uuid,           // 用户uuid
-		T_Distributor_id: user_r.T_Distributor_id, // 经销商id
+	signature_pdf, err := lib.ProcessImage(T_signature, is_seal)
+	if err != nil {
+		signature_pdf = T_signature
 	}
 
 	if _, is := Account.Read_UserSignatureByT_name(user_r.T_uuid, T_name); is {
@@ -360,6 +363,14 @@ func (c *UserController) Signature_Add() {
 		return
 	}
 
+	var_ := Account.UserSignature{
+		T_name:           T_name,
+		T_signature:      signature_pdf,
+		T_State:          1,
+		T_uuid:           user_r.T_uuid,
+		T_Distributor_id: user_r.T_Distributor_id,
+		T_type:           T_type,
+	}
 	Id, is := Account.Add_UserSignature(var_)
 	if !is {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
@@ -386,6 +397,16 @@ func (c *UserController) Signature_Up() {
 	Id, _ := c.GetInt("Id")
 	T_name := c.GetString("T_name")
 	T_signature := c.GetString("T_signature")
+	T_type, _ := c.GetInt("T_type")
+	var is_seal bool
+	if T_type == 2 {
+		is_seal = true
+	}
+
+	signature_pdf, err := lib.ProcessImage(T_signature, is_seal)
+	if err != nil {
+		signature_pdf = T_signature
+	}
 
 	r, is := Account.Read_UserSignature_ById(Id)
 	if !is {
@@ -406,8 +427,8 @@ func (c *UserController) Signature_Up() {
 	if len(T_name) > 0 {
 		r.T_name = T_name
 	}
-	if len(T_signature) > 0 {
-		r.T_signature = T_signature
+	if len(signature_pdf) > 0 {
+		r.T_signature = signature_pdf
 	}
 
 	// .......

+ 125 - 1
controllers/VerifyTemplate.go

@@ -12,11 +12,14 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
-	beego "github.com/beego/beego/v2/server/web"
 	"math"
+	"os"
 	"strconv"
 	"strings"
 	"time"
+
+	beego "github.com/beego/beego/v2/server/web"
+	"github.com/xuri/excelize/v2"
 )
 
 type VerifyTemplateController struct {
@@ -1404,3 +1407,124 @@ func CopyMapData(copy_task, paste_task Task.Task, T_source int) (ids []int64, er
 	}
 	return nil, err
 }
+
+// 导出所有模板的标签名称 - 每个模板一个Sheet
+func (c *VerifyTemplateController) Export_Labels() {
+	// 验证登录
+	_, User_is := Account.Verification_Admin(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !User_is {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "请重新登录!"}
+		c.ServeJSON()
+		return
+	}
+
+	// 读取所有模板分类
+	classList := VerifyTemplate.Read_VerifyTemplateClass_List()
+
+	// 收集所有模板
+	type tpl struct {
+		Id        string
+		Name      string
+		ClassName string
+	}
+	var tplList []tpl
+	var collectTpl func(list []VerifyTemplate.VerifyTemplateClass)
+	collectTpl = func(list []VerifyTemplate.VerifyTemplateClass) {
+		for _, cls := range list {
+			// 当前分类下的模板
+			vlist, _ := VerifyTemplate.Read_VerifyTemplate_List(cls.Id, "", 0, 9999)
+			for _, v := range vlist {
+				tplList = append(tplList, tpl{Id: v.T_VerifyTemplate_id, Name: v.T_name, ClassName: cls.T_name})
+			}
+			// 递归子分类
+			if len(cls.Children) > 0 {
+				collectTpl(cls.Children)
+			}
+		}
+	}
+	collectTpl(classList)
+
+	// 创建excel
+	f := excelize.NewFile()
+	sheetName := "Sheet1"
+	idx, _ := f.GetSheetIndex(sheetName)
+
+	f.SetActiveSheet(idx)
+
+	// 表头
+	f.SetCellValue(sheetName, "A1", "分类名称")
+	f.SetCellValue(sheetName, "B1", "模版名称")
+	f.SetCellValue(sheetName, "C1", "标签名称")
+
+	// 设置列宽
+	f.SetColWidth(sheetName, "A", "A", 30)
+	f.SetColWidth(sheetName, "B", "B", 40)
+	f.SetColWidth(sheetName, "C", "C", 40)
+
+	line := 1
+
+	// 写入模板与对应标签
+	for _, t := range tplList {
+		mapList, _ := VerifyTemplate.Read_VerifyTemplateMap_List(t.Id, 0, 0)
+		if len(mapList) == 0 {
+			line++
+			row := line
+			f.SetCellValue(sheetName, fmt.Sprintf("A%d", row), t.ClassName)
+			f.SetCellValue(sheetName, fmt.Sprintf("B%d", row), t.Name)
+			continue
+		}
+
+		startRow := line + 1
+		for idxLabel, m := range mapList {
+			line++
+			row := line
+			if idxLabel == 0 {
+				f.SetCellValue(sheetName, fmt.Sprintf("A%d", row), t.ClassName)
+				f.SetCellValue(sheetName, fmt.Sprintf("B%d", row), t.Name)
+			}
+			f.SetCellValue(sheetName, fmt.Sprintf("C%d", row), m.T_name)
+		}
+		if len(mapList) > 1 {
+			f.MergeCell(sheetName, fmt.Sprintf("A%d", startRow), fmt.Sprintf("A%d", line))
+			f.MergeCell(sheetName, fmt.Sprintf("B%d", startRow), fmt.Sprintf("B%d", line))
+		}
+	}
+
+	// 设置居中样式
+	styleCenter, styleErr := f.NewStyle(&excelize.Style{
+		Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
+	})
+	if styleErr != nil {
+		logs.Error("NewStyle Err:", styleErr)
+	} else {
+		f.SetCellStyle(sheetName, "A1", fmt.Sprintf("C%d", line), styleCenter)
+	}
+
+	// 生成文件
+	lib.Create_Dir("./ofile")
+	timeStr := time.Now().Format("20060102150405")
+	filePath := "ofile/" + timeStr + ".xlsx"
+	if err := f.SaveAs(filePath); err != nil {
+		logs.Error(lib.FuncName(), err)
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "文件保存失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	// 上传到七牛
+	if !lib.Pload_qiniu(filePath, filePath) {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "oss!"}
+		c.ServeJSON()
+		return
+	}
+
+	// 删除本地文件
+	err := os.Remove(filePath)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: "https://bzdcoldverifyoss.baozhida.cn/" + filePath}
+	c.ServeJSON()
+	return
+}

+ 61 - 3
lib/lib.go

@@ -4,9 +4,6 @@ import (
 	"ColdVerify_server/conf"
 	"encoding/json"
 	"fmt"
-	"github.com/beego/beego/v2/core/logs"
-	"github.com/nats-io/nats.go"
-	"github.com/signintech/gopdf"
 	"io"
 	"math/rand"
 	"net/http"
@@ -17,6 +14,10 @@ import (
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/beego/beego/v2/core/logs"
+	"github.com/nats-io/nats.go"
+	"github.com/signintech/gopdf"
 )
 
 var Nats *nats.Conn
@@ -556,3 +557,60 @@ func GetSignaturePdf(pdfURL string) (string, error) {
 	}
 	return result.SignaturePdfURL, nil
 }
+
+// ProcessImage 处理图片,传入图片链接和是否加盖印章,返回处理后的图片链接
+func ProcessImage(imageURL string, isSeal bool) (string, error) {
+	url := conf.PdfProcessingHost + "/process_image"
+	method := "POST"
+
+	// 构建请求体
+	requestBody := struct {
+		ImageURL string `json:"image_url"`
+		IsSeal   bool   `json:"is_seal"`
+	}{
+		ImageURL: imageURL,
+		IsSeal:   isSeal,
+	}
+
+	jsonData, err := json.Marshal(requestBody)
+	if err != nil {
+		return "", fmt.Errorf("构建请求参数失败: %v", err)
+	}
+
+	payload := strings.NewReader(string(jsonData))
+
+	client := &http.Client{}
+	req, err := http.NewRequest(method, url, payload)
+	if err != nil {
+		return "", fmt.Errorf("创建请求失败: %v", err)
+	}
+	req.Header.Add("Content-Type", "application/json")
+
+	res, err := client.Do(req)
+	if err != nil {
+		return "", fmt.Errorf("请求失败: %v", err)
+	}
+	defer res.Body.Close()
+
+	body, err := io.ReadAll(res.Body)
+	if err != nil {
+		return "", fmt.Errorf("读取响应失败: %v", err)
+	}
+
+	// 解析JSON响应
+	var result struct {
+		Success  bool   `json:"success"`
+		Message  string `json:"message"`
+		ImageURL string `json:"image_url"`
+	}
+
+	if err = json.Unmarshal(body, &result); err != nil {
+		return "", fmt.Errorf("解析响应失败: %v", err)
+	}
+
+	if !result.Success {
+		return "", fmt.Errorf("图片处理失败: %s", result.Message)
+	}
+
+	return result.ImageURL, nil
+}

+ 10 - 3
models/Account/UserSignature.go

@@ -3,11 +3,12 @@ package Account
 import (
 	"ColdVerify_server/lib"
 	"ColdVerify_server/logs"
+	"log"
+	"time"
+
 	"github.com/beego/beego/v2/adapter/orm"
 	orm2 "github.com/beego/beego/v2/client/orm"
 	_ "github.com/go-sql-driver/mysql"
-	"log"
-	"time"
 )
 
 type UserSignature struct {
@@ -15,6 +16,7 @@ type UserSignature struct {
 	T_Distributor_id string    `orm:"size(256);null"`                                        // 分销商id
 	T_uuid           string    `orm:"size(256);null"`                                        // 公司uuid
 	T_name           string    `orm:"size(256);null"`                                        // 姓名
+	T_type           int       `orm:"size(256);default(1)"`                                  // 1-签名 2-公章
 	T_signature      string    `orm:"size(256);null"`                                        // 签名
 	T_State          int       `orm:"size(200);default(1)"`                                  // 0删除  1正常
 	CreateTime       time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now 每次 model 保存时都会对时间自动更新
@@ -27,6 +29,7 @@ type UserSignature_R struct {
 	T_uuid             string
 	T_name             string
 	T_signature        string
+	T_type             int
 }
 
 func (t *UserSignature) TableName() string {
@@ -51,6 +54,7 @@ func UserSignatureToUserSignature_R(T UserSignature, distributorMap map[string]s
 	T_r.T_Distributor_name = T_Distributor_name
 	T_r.T_name = T.T_name
 	T_r.T_signature = T.T_signature
+	T_r.T_type = T.T_type
 
 	return T_r
 }
@@ -117,7 +121,7 @@ func Update_UserSignature(m UserSignature, cols ...string) bool {
 }
 
 // 获取列表
-func Read_UserSignature_List(T_uuid string, T_name string, page int, page_z int, distributorMap map[string]string) ([]UserSignature_R, int64) {
+func Read_UserSignature_List(T_uuid string, T_name string, T_type, page int, page_z int, distributorMap map[string]string) ([]UserSignature_R, int64) {
 	o := orm.NewOrm()
 
 	// 也可以直接使用 Model 结构体作为表名
@@ -131,6 +135,9 @@ func Read_UserSignature_List(T_uuid string, T_name string, page int, page_z int,
 	}
 	cond := orm.NewCondition()
 	cond1 := cond.And("T_State", 1).And("T_uuid", T_uuid).AndCond(cond.Or("T_name__icontains", T_name))
+	if T_type > 0 {
+		cond1 = cond1.And("T_type", T_type)
+	}
 	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
 	cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
 

+ 68 - 28
models/Task/Task.go

@@ -197,20 +197,22 @@ type Task struct {
 	T_BindDeviceDataStartTime   string `orm:"size(256);null"` // 绑定设备数据开始时间
 	T_BindDeviceDataEndTime     string `orm:"size(256);null"` // 绑定设备数据结束时间
 
-	T_doc1           string `orm:"type(text);null"` // 封面
-	T_pdf1           string `orm:"type(text);null"` // 验证方案
-	T_pdf1_watermark string `orm:"type(text);null"` // 验证方案 带水印
-	T_pdf1_signature string `orm:"type(text);null"` // 验证方案 带公章
-	T_doc2           string `orm:"type(text);null"` // 报告
-	T_pdf2           string `orm:"type(text);null"` // 验证报告
-	T_pdf2_watermark string `orm:"type(text);null"` // 验证报告 带水印
-	T_pdf2_signature string `orm:"type(text);null"` // 验证报告 带公章
-	T_doc3           string `orm:"type(text);null"` // 证书
-	T_pdf3           string `orm:"type(text);null"` // 证书
-	T_pdf4           string `orm:"type(text);null"` // 验证标识
-	T_pdf5           string `orm:"type(text);null"` // 检测报告
-	T_pdf5_watermark string `orm:"type(text);null"` // 检测报告 带水印
-	T_pdf6           string `orm:"type(text);null"` // 原始记录
+	T_doc1                string `orm:"type(text);null"` // 封面
+	T_pdf1                string `orm:"type(text);null"` // 验证方案
+	T_pdf1_watermark      string `orm:"type(text);null"` // 验证方案 带水印
+	T_pdf1_signature      string `orm:"type(text);null"` // 验证方案 带公章
+	T_pdf1_elec_signature string `orm:"type(text);null"` // 验证方案 带电子签名及公章
+	T_doc2                string `orm:"type(text);null"` // 报告
+	T_pdf2                string `orm:"type(text);null"` // 验证报告
+	T_pdf2_watermark      string `orm:"type(text);null"` // 验证报告 带水印
+	T_pdf2_signature      string `orm:"type(text);null"` // 验证报告 带公章
+	T_pdf2_elec_signature string `orm:"type(text);null"` // 验证报告 带电子签名及公章
+	T_doc3                string `orm:"type(text);null"` // 证书
+	T_pdf3                string `orm:"type(text);null"` // 证书
+	T_pdf4                string `orm:"type(text);null"` // 验证标识
+	T_pdf5                string `orm:"type(text);null"` // 检测报告
+	T_pdf5_watermark      string `orm:"type(text);null"` // 检测报告 带水印
+	T_pdf6                string `orm:"type(text);null"` // 原始记录
 
 	T_Show  int `orm:"size(2);default(1)"`   // 0 隐藏   1 公开
 	T_Visit int `orm:"size(200);default(0)"` // 浏览量
@@ -339,8 +341,10 @@ type Task_ struct {
 	T_BindDeviceDataTime         [2]string // 绑定设备数据开始-结束时间
 	T_doc1                       string    // 封面
 	T_pdf1                       string    // 验证方案
+	T_pdf1_signature             string    // 验证方案 带公章
 	T_doc2                       string    // 报告
 	T_pdf2                       string    // 报告
+	T_pdf2_signature             string    // 报告 带公章
 	T_doc3                       string    // 证书
 	T_pdf3                       string    // 证书
 	T_pdf4                       string    // 验证标识
@@ -513,6 +517,35 @@ func init() {
 
 // -------------------------------------------------------------
 
+// selectPdf 根据条件选择PDF文件
+// 返回选中的PDF和signature PDF
+func selectPdf(watermark, original, signature, elecSignature string, isReturnedMoney bool, hasInfoCollection bool) (selectedPdf, selectedSignature string) {
+	// 默认使用watermark版本
+	selectedPdf = watermark
+
+	// 如果满足以下任一条件,使用原始版本:退款状态、无InfoCollection、watermark为空
+	if isReturnedMoney || !hasInfoCollection || len(watermark) == 0 {
+		selectedPdf = original
+
+		// 如果是退款状态,优先选择签名版本(电子签名优先于普通签名)
+		if isReturnedMoney {
+			if len(elecSignature) > 0 {
+				selectedPdf = elecSignature
+			} else if len(signature) > 0 {
+				selectedPdf = signature
+			}
+		}
+	}
+
+	// 设置signature,如果为空则使用原始版本
+	selectedSignature = signature
+	if len(selectedSignature) == 0 {
+		selectedSignature = original
+	}
+
+	return selectedPdf, selectedSignature
+}
+
 func TaskToTask_(T Task, userMap, adminMap map[string]string) (T_ Task_) {
 	T_.Id = T.Id
 	T_.T_Distributor_id = T.T_Distributor_id
@@ -559,20 +592,27 @@ func TaskToTask_(T Task, userMap, adminMap map[string]string) (T_ Task_) {
 	T_.T_doc2 = T.T_doc2
 	T_.T_doc3 = T.T_doc3
 
-	T_.T_pdf1 = T.T_pdf1_watermark
-	if T_.InfoCollection.T_status == InfoCollection.InfoCollectionStatusReturnedMoney || len(T.T_InfoCollection_id) == 0 || len(T.T_pdf1_watermark) == 0 {
-		T_.T_pdf1 = T.T_pdf1
-		if len(T.T_pdf1_signature) > 0 {
-			T_.T_pdf1 = T.T_pdf1_signature
-		}
-	}
-	T_.T_pdf2 = T.T_pdf2_watermark
-	if T_.InfoCollection.T_status == InfoCollection.InfoCollectionStatusReturnedMoney || len(T.T_InfoCollection_id) == 0 || len(T.T_pdf2_watermark) == 0 {
-		T_.T_pdf2 = T.T_pdf2
-		if len(T.T_pdf1_signature) > 0 {
-			T_.T_pdf2 = T.T_pdf2_signature
-		}
-	}
+	// 处理PDF1和PDF2的选择逻辑
+	isReturnedMoney := T_.InfoCollection.T_status == InfoCollection.InfoCollectionStatusReturnedMoney
+	hasInfoCollection := len(T.T_InfoCollection_id) > 0
+
+	T_.T_pdf1, T_.T_pdf1_signature = selectPdf(
+		T.T_pdf1_watermark,
+		T.T_pdf1,
+		T.T_pdf1_signature,
+		T.T_pdf1_elec_signature,
+		isReturnedMoney,
+		hasInfoCollection,
+	)
+
+	T_.T_pdf2, T_.T_pdf2_signature = selectPdf(
+		T.T_pdf2_watermark,
+		T.T_pdf2,
+		T.T_pdf2_signature,
+		T.T_pdf2_elec_signature,
+		isReturnedMoney,
+		hasInfoCollection,
+	)
 	T_.T_pdf3 = T.T_pdf3
 	T_.T_pdf4 = T.T_pdf4
 	T_.T_pdf5 = T.T_pdf5_watermark

+ 25 - 24
routers/Task.go

@@ -9,30 +9,31 @@ func init() {
 
 	beego.Router("/UpFileToken", &controllers.UpFileController{}, "*:ConfigUpFileToken") // 上传文件
 
-	beego.Router("/Task/List", &controllers.TaskController{}, "*:List")                                     // 任务列表
-	beego.Router("/Task/Get", &controllers.TaskController{}, "*:Get")                                       // 获取任务
-	beego.Router("/Task/Add", &controllers.TaskController{}, "*:Add")                                       // 添加任务
-	beego.Router("/Task/Up", &controllers.TaskController{}, "*:Up")                                         // 编辑任务
-	beego.Router("/Task/Del", &controllers.TaskController{}, "*:Del")                                       // 删除任务
-	beego.Router("/Task/Copy", &controllers.TaskController{}, "*:Copy")                                     // 复制任务
-	beego.Router("/Task/UpCollectionState", &controllers.TaskController{}, "*:UpCollectionState")           // 修改任务状态
-	beego.Router("/Task/UpDeliveryState", &controllers.TaskController{}, "*:UpDeliveryState")               // 修改交付审核状态
-	beego.Router("/Task/UpExaminingReportState", &controllers.TaskController{}, "*:UpExaminingReportState") // 修改交付审核状态
-	beego.Router("/Task/UpOriginalRecordState", &controllers.TaskController{}, "*:UpOriginalRecordState")   // 修改交付审核状态
-	beego.Router("/Task/AddData_Tool", &controllers.TaskController{}, "*:AddData_Tool")                     // 1.0 添加任务数据
-	beego.Router("/Task/ReceiptInfoCollection", &controllers.TaskController{}, "*:ReceiptInfoCollection")   // 接收信息采集
-	beego.Router("/Task/SyncInfoCollection", &controllers.TaskController{}, "*:SyncInfoCollection")         // 同步信息采集
-	beego.Router("/Task/UpSchemeState", &controllers.TaskController{}, "*:UpSchemeState")                   // 修改验证方案状态
-	beego.Router("/Task/EnterArea", &controllers.TaskController{}, "*:EnterArea")                           // 进场
-	beego.Router("/Task/StartVerify", &controllers.TaskController{}, "*:StartVerify")                       // 开始验证-实施开始时间
-	beego.Router("/Task/UpReportingState", &controllers.TaskController{}, "*:UpReportingState")             // 修改验证报告状态
-	beego.Router("/Task/AuditRecordList", &controllers.TaskController{}, "*:AuditRecordList")               // 审核记录
-	beego.Router("/Task/GetTaskUserList", &controllers.TaskController{}, "*:GetTaskUserList")               // 获取任务负责人列表
-	beego.Router("/Task/Stat", &controllers.TaskController{}, "*:Stat")                                     // 报告统计
-	beego.Router("/Task/Stat_Excel", &controllers.TaskController{}, "*:Stat_Excel")                         // 报告统计-excel
-	beego.Router("/Task/StatisticalRanking", &controllers.TaskController{}, "*:StatisticalRanking")         // 报告统计-excel
-	beego.Router("/Task/GenT_report_number", &controllers.TaskController{}, "*:GenT_report_number")         // 生成报告编号
-	beego.Router("/Task/SyncPDFWatermark", &controllers.TaskController{}, "*:SyncPDFWatermark")             // 生成报告编号
+	beego.Router("/Task/List", &controllers.TaskController{}, "*:List")                                             // 任务列表
+	beego.Router("/Task/Get", &controllers.TaskController{}, "*:Get")                                               // 获取任务
+	beego.Router("/Task/Add", &controllers.TaskController{}, "*:Add")                                               // 添加任务
+	beego.Router("/Task/Up", &controllers.TaskController{}, "*:Up")                                                 // 编辑任务
+	beego.Router("/Task/Del", &controllers.TaskController{}, "*:Del")                                               // 删除任务
+	beego.Router("/Task/Copy", &controllers.TaskController{}, "*:Copy")                                             // 复制任务
+	beego.Router("/Task/UpCollectionState", &controllers.TaskController{}, "*:UpCollectionState")                   // 修改任务状态
+	beego.Router("/Task/UpDeliveryState", &controllers.TaskController{}, "*:UpDeliveryState")                       // 修改交付审核状态
+	beego.Router("/Task/UpExaminingReportState", &controllers.TaskController{}, "*:UpExaminingReportState")         // 修改交付审核状态
+	beego.Router("/Task/UpOriginalRecordState", &controllers.TaskController{}, "*:UpOriginalRecordState")           // 修改交付审核状态
+	beego.Router("/Task/AddData_Tool", &controllers.TaskController{}, "*:AddData_Tool")                             // 1.0 添加任务数据
+	beego.Router("/Task/ReceiptInfoCollection", &controllers.TaskController{}, "*:ReceiptInfoCollection")           // 接收信息采集
+	beego.Router("/Task/SyncInfoCollection", &controllers.TaskController{}, "*:SyncInfoCollection")                 // 同步信息采集
+	beego.Router("/Task/UpSchemeState", &controllers.TaskController{}, "*:UpSchemeState")                           // 修改验证方案状态
+	beego.Router("/Task/EnterArea", &controllers.TaskController{}, "*:EnterArea")                                   // 进场
+	beego.Router("/Task/StartVerify", &controllers.TaskController{}, "*:StartVerify")                               // 开始验证-实施开始时间
+	beego.Router("/Task/UpReportingState", &controllers.TaskController{}, "*:UpReportingState")                     // 修改验证报告状态
+	beego.Router("/Task/AuditRecordList", &controllers.TaskController{}, "*:AuditRecordList")                       // 审核记录
+	beego.Router("/Task/GetTaskUserList", &controllers.TaskController{}, "*:GetTaskUserList")                       // 获取任务负责人列表
+	beego.Router("/Task/Stat", &controllers.TaskController{}, "*:Stat")                                             // 报告统计
+	beego.Router("/Task/Stat_Excel", &controllers.TaskController{}, "*:Stat_Excel")                                 // 报告统计-excel
+	beego.Router("/Task/StatisticalRanking", &controllers.TaskController{}, "*:StatisticalRanking")                 // 报告统计-excel
+	beego.Router("/Task/GenT_report_number", &controllers.TaskController{}, "*:GenT_report_number")                 // 生成报告编号
+	beego.Router("/Task/SyncPDFWatermark", &controllers.TaskController{}, "*:SyncPDFWatermark")                     // 生成报告编号
+	beego.Router("/Task/SaveElectronicSignaturePDF", &controllers.TaskController{}, "*:SaveElectronicSignaturePDF") // 生成报告编号
 
 	// 日志
 	beego.Router("/TaskLogs/List", &controllers.TaskController{}, "*:Logs_List")

+ 6 - 4
routers/VerifyTemplate.go

@@ -2,6 +2,7 @@ package routers
 
 import (
 	"ColdVerify_server/controllers"
+
 	beego "github.com/beego/beego/v2/server/web"
 )
 
@@ -28,10 +29,11 @@ func init() {
 	beego.Router("/VerifyTemplate/Get", &controllers.VerifyTemplateController{}, "*:Get")   // 模版修改
 	beego.Router("/VerifyTemplate/Copy", &controllers.VerifyTemplateController{}, "*:Copy") // 模版复制
 
-	beego.Router("/VerifyTemplate/Map_List", &controllers.VerifyTemplateController{}, "*:Map_List") // 标签列表
-	beego.Router("/VerifyTemplate/Map_Add", &controllers.VerifyTemplateController{}, "*:Map_Add")   // 标签添加
-	beego.Router("/VerifyTemplate/Map_Up", &controllers.VerifyTemplateController{}, "*:Map_Up")     // 标签修改
-	beego.Router("/VerifyTemplate/Map_Del", &controllers.VerifyTemplateController{}, "*:Map_Del")   // 标签删除
+	beego.Router("/VerifyTemplate/Map_List", &controllers.VerifyTemplateController{}, "*:Map_List")           // 标签列表
+	beego.Router("/VerifyTemplate/Map_Add", &controllers.VerifyTemplateController{}, "*:Map_Add")             // 标签添加
+	beego.Router("/VerifyTemplate/Map_Up", &controllers.VerifyTemplateController{}, "*:Map_Up")               // 标签修改
+	beego.Router("/VerifyTemplate/Map_Del", &controllers.VerifyTemplateController{}, "*:Map_Del")             // 标签删除
+	beego.Router("/VerifyTemplate/Export_Labels", &controllers.VerifyTemplateController{}, "*:Export_Labels") // 导出标签名称
 
 	beego.Router("/VerifyTemplateMapData/List", &controllers.VerifyTemplateController{}, "*:Map_Data_List")                           // 标签数据列表
 	beego.Router("/VerifyTemplateMapData/Pu", &controllers.VerifyTemplateController{}, "*:Map_Data_Pu")                               // 添加标签数据