Browse Source

add:物联网卡管理、回款管理

zoie 15 hours ago
parent
commit
02b01a4547

+ 4 - 1
conf/app.conf

@@ -32,7 +32,7 @@ Redis_address = "36.137.156.216:6379"
 Redis_password = ""
 Redis_dbNum = "2"
 
-FilterExcludeURL =
+FilterExcludeURL = "/Percentage/SyncVerify"
 FilterOnlyLoginCheckURL =
 
 # 消息通知前端页面跳转url
@@ -62,3 +62,6 @@ sqlloglevel = 4
 slow_threshold = 200
 # 每个文件保存的最大行数
 maxlines = 10000
+
+ColdVerify_OpenApi_Host = "http://coldverifytest.coldbaozhida.com:9999/apiserver"
+# ColdVerify_OpenApi_Host = "https://coldverify-s.coldbaozhida.com/apiserver"

+ 2 - 0
conf/config.go

@@ -47,3 +47,5 @@ var MyPercentageUrl, _ = beego.AppConfig.String("MyPercentageUrl")
 var ContractReviewAuditUrl, _ = beego.AppConfig.String("ContractReviewAuditUrl")
 
 var FinanceUuid, _ = beego.AppConfig.String("FinanceUuid")
+
+var ColdVerify_OpenApi_Host, _ = beego.AppConfig.String("ColdVerify_OpenApi_Host")

+ 0 - 13
controllers/Basic.go

@@ -5,7 +5,6 @@ import (
 	"ERP_storage/conf"
 	"ERP_storage/models/Account"
 	"ERP_storage/models/Basic"
-	"ERP_storage/models/Percentage"
 	"ERP_storage/models/Stock"
 	"fmt"
 	"github.com/beego/beego/v2/adapter/orm"
@@ -563,18 +562,6 @@ func (c *BasicController) VerifyItem_Edit() {
 		return
 	}
 
-	cnt, err := Percentage.Get_Percentage_Count_ByVerifyItemId(VerifyItem_r.Id)
-	if VerifyItem_r2.Id != VerifyItem_r.Id && VerifyItem_r2.Id > 0 {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询提成项目统计失败"}
-		c.ServeJSON()
-		return
-	}
-	if VerifyItem_r.T_price != float32(T_price) && cnt > 0 {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "有未处理的提成项目,无法修改"}
-		c.ServeJSON()
-		return
-	}
-
 	if len(T_name) > 0 {
 		VerifyItem_r.T_name = T_name
 	}

+ 21 - 7
controllers/IOTNetworkCard.go

@@ -43,6 +43,8 @@ func (c *IOTNetworkCardController) IOTNetworkCard_List() {
 	T_name := c.GetString("T_name")
 	T_state, _ := c.GetInt("T_state")
 
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
 	IOTNetworkCardDao := IOTNetworkCard.NewIOTNetworkCard(orm.NewOrm())
 	R_List, R_cnt := IOTNetworkCardDao.Read_IOTNetworkCard_List(T_name, T_state, page, page_z)
 
@@ -81,6 +83,7 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Add() {
 	T_expire := c.GetString("T_expire")
 	T_iccid := c.GetString("T_iccid")
 	T_MSISDN := c.GetString("T_MSISDN")
+	T_remark := c.GetString("T_remark")
 	T_State, _ := c.GetInt("T_State")
 
 	var_ := IOTNetworkCard.IOTNetworkCard{
@@ -91,6 +94,7 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Add() {
 		T_iccid:     T_iccid,
 		T_MSISDN:    T_MSISDN,
 		T_State:     T_State,
+		T_remark:    T_remark,
 	}
 	// 添加入库记录
 	var record []IOTNetworkCard.IOTNetworkCardRecord
@@ -141,6 +145,7 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Edit() {
 	T_out_project := c.GetString("T_out_project") // 出库项目
 	T_receive := c.GetString("T_receive")         // 领用人
 	T_State, _ := c.GetInt("T_State")             // 状态
+	T_remark := c.GetString("T_remark")           // 状态
 
 	IOTNetworkCard_r, err := IOTNetworkCard.Read_IOTNetworkCard_ById(T_id)
 	if err != nil {
@@ -175,6 +180,9 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Edit() {
 	if len(T_receive) > 0 {
 		IOTNetworkCard_r.T_receive = T_receive
 	}
+	if len(T_remark) > 0 {
+		IOTNetworkCard_r.T_remark = T_remark
+	}
 	if T_State > 0 && T_State != IOTNetworkCard_r.T_State {
 		IOTNetworkCard_r.T_State = T_State
 
@@ -186,9 +194,10 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Edit() {
 			return
 		}
 		record = append(record, IOTNetworkCard.IOTNetworkCardRecord{
-			T_data:   time.Now().Format("2006-01-02"),
-			T_State:  T_State,
-			T_remark: T_out_project,
+			T_data:        time.Now().Format("2006-01-02"),
+			T_State:       T_State,
+			T_out_project: T_out_project,
+			T_remark:      T_remark,
 		})
 		recordB, _ := json.Marshal(&record)
 		IOTNetworkCard_r.T_record = string(recordB)
@@ -198,7 +207,7 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Edit() {
 	o := orm.NewOrm()
 	IOTNetworkCardDao := IOTNetworkCard.NewIOTNetworkCard(o)
 	if err = IOTNetworkCardDao.Update_IOTNetworkCard(IOTNetworkCard_r,
-		"T_in_date", "T_meal_type", "T_meal", "T_expire", "T_iccid", "T_MSISDN", "T_out_date", "T_out_project", "T_receive", "T_State", "T_record"); err != nil {
+		"T_in_date", "T_meal_type", "T_meal", "T_expire", "T_iccid", "T_MSISDN", "T_out_date", "T_out_project", "T_receive", "T_State", "T_record", "T_remark"); err != nil {
 		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
 		c.ServeJSON()
 		return
@@ -282,6 +291,11 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Import() {
 					c.ServeJSON()
 					return
 				}
+				T_MSISDN := row[5]
+				_, errGet := IOTNetworkCard.Read_IOTNetworkCard_ByT_MSISDN(T_MSISDN)
+				if errGet != nil && errGet.Error() == orm.ErrNoRows.Error() {
+					continue
+				}
 				var_ := IOTNetworkCard.IOTNetworkCard{
 					T_in_date:   t.Format("2006-01-02"),
 					T_meal_type: row[1],
@@ -310,9 +324,9 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Import() {
 					var_.T_out_date = outT.Format("2006-01-02")
 					var_.T_out_project = row[7]
 					record = append(record, IOTNetworkCard.IOTNetworkCardRecord{
-						T_data:   time.Now().Format("2006-01-02"),
-						T_State:  IOTNetworkCard.IOTNetworkCardOut,
-						T_remark: row[7],
+						T_data:        time.Now().Format("2006-01-02"),
+						T_State:       IOTNetworkCard.IOTNetworkCardOut,
+						T_out_project: row[7],
 					})
 				}
 

+ 923 - 154
controllers/Percentage.go

@@ -1,19 +1,28 @@
 package controllers
 
 import (
+	"ERP_storage/Nats"
 	"ERP_storage/Nats/NatsServer"
 	"ERP_storage/conf"
+	"ERP_storage/logs"
 	"ERP_storage/models/Account"
 	"ERP_storage/models/Basic"
 	"ERP_storage/models/Contract"
 	"ERP_storage/models/Percentage"
-	"ERP_storage/models/Stock"
+	"encoding/json"
 	"fmt"
 	"github.com/beego/beego/v2/adapter/orm"
 	beego "github.com/beego/beego/v2/server/web"
+	"github.com/go-resty/resty/v2"
+	"github.com/robfig/cron/v3"
+	"github.com/xuri/excelize/v2"
+	natslibs "gogs.baozhida.cn/zoie/ERP_libs/Nats"
 	userlibs "gogs.baozhida.cn/zoie/ERP_libs/User"
 	"gogs.baozhida.cn/zoie/ERP_libs/lib"
 	"math"
+	"os"
+	"strings"
+	"time"
 )
 
 type PercentageController struct {
@@ -22,7 +31,9 @@ type PercentageController struct {
 }
 
 func (c *PercentageController) Prepare() {
-	c.User = *Account.User_r
+	if Account.User_r != nil {
+		c.User = *Account.User_r
+	}
 }
 
 // 财务管理列表
@@ -42,14 +53,22 @@ func (c *PercentageController) Percentage_List() {
 	T_name := c.GetString("T_name")
 	T_uuid := c.GetString("T_uuid")
 	T_state, _ := c.GetInt("T_state")
+	T_type, _ := c.GetInt("T_type")
+	T_start_date := c.GetString("T_start_date") // 开始时间
+	T_end_date := c.GetString("T_end_date")     // 结束时间
+
+	var T_company_list []string
+	if len(T_name) > 0 {
+		T_company_list = Percentage.Read_VerifyCompany_T_uuid_ListByT_name(T_name)
+	}
 
 	userList, _ := NatsServer.Read_User_List_All()
 	Account.Read_User_All_Map(userList)
-	Contract.Read_Contract_All_Map()
-	Contract.Read_VerifyContract_All_Map()
+	Percentage.Read_VerifyCompany_All_Map()
 
 	PercentageDao := Percentage.NewPercentage(orm.NewOrm())
-	R_List, R_cnt := PercentageDao.Read_Percentage_List(T_name, T_uuid, T_state, page, page_z)
+	R_List, R_cnt := PercentageDao.Read_Percentage_List(T_name, T_uuid, T_start_date, T_end_date,
+		T_company_list, T_state, T_type, page, page_z)
 
 	var r_jsons lib.R_JSONS
 	r_jsons.Num = R_cnt
@@ -77,14 +96,19 @@ func (c *PercentageController) Percentage_User_List() {
 	// 查询
 	T_name := c.GetString("T_name")
 	T_state, _ := c.GetInt("T_state")
+	T_start_date := c.GetString("T_start_date") // 开始时间
+	T_end_date := c.GetString("T_end_date")     // 结束时间
+	var T_company_list []string
+	if len(T_name) > 0 {
+		T_company_list = Percentage.Read_VerifyCompany_T_uuid_ListByT_name(T_name)
+	}
 
 	userList, _ := NatsServer.Read_User_List_All()
 	Account.Read_User_All_Map(userList)
-	Contract.Read_Contract_All_Map()
 	Contract.Read_VerifyContract_All_Map()
 
 	PercentageDao := Percentage.NewPercentage(orm.NewOrm())
-	R_List, R_cnt := PercentageDao.Read_Percentage_User_List(c.User.T_uuid, T_name, T_state, page, page_z)
+	R_List, R_cnt := PercentageDao.Read_Percentage_User_List(c.User.T_uuid, T_name, T_start_date, T_end_date, T_company_list, T_state, page, page_z)
 
 	var r_jsons lib.R_JSONS
 	r_jsons.Num = R_cnt
@@ -97,113 +121,546 @@ func (c *PercentageController) Percentage_User_List() {
 	return
 }
 
-func (c *PercentageController) Percentage_Get() {
+func (c *PercentageController) Percentage_Export() {
 
 	// 查询
-	T_id, _ := c.GetInt("T_id")
-	o := orm.NewOrm()
-	PercentageDao := Percentage.NewPercentage(o)
-	ContractDao := Contract.NewContract(o)
-	DeviceDao := Stock.NewDevice(o)
-	contractProductDao := Contract.NewContractProduct(o)
-	percentage, err := PercentageDao.Read_Percentage_ById(T_id)
-	if err != nil {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
+	T_name := c.GetString("T_name")
+	T_uuid := c.GetString("T_uuid")
+	T_start_date := c.GetString("T_start_date") // 开始时间
+	T_end_date := c.GetString("T_end_date")     // 结束时间
+	T_state, _ := c.GetInt("T_state")
+	T_type, _ := c.GetInt("T_type") // 提成类型
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
+	Percentage.Read_VerifyCompany_All_Map()
+	Basic.Read_VerifyItem_All_Map()
+	PercentageDao := Percentage.NewPercentage(orm.NewOrm())
+	percentageList, _ := PercentageDao.Read_Percentage_List_For_Excel(T_name, T_uuid, T_start_date, T_end_date, []string{}, T_state, T_type)
+	dataInterval := fmt.Sprintf("%s - %s", T_start_date, T_end_date)
+	if dataInterval == " - " {
+		dataInterval = ""
+	}
+	f := excelize.NewFile() // 设置单元格的值
+	Style1, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 20, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
+		})
+
+	Style2, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
+			Border: []excelize.Border{
+				{Type: "left", Color: "000000", Style: 1},
+				{Type: "top", Color: "000000", Style: 1},
+				{Type: "bottom", Color: "000000", Style: 1},
+				{Type: "right", Color: "000000", Style: 1},
+			},
+		})
+	f.MergeCell("Sheet1", "A1", "AC1")
+	f.SetRowStyle("Sheet1", 1, 1, Style1)
+	f.SetRowHeight("Sheet1", 1, 50)
+	f.SetCellValue("Sheet1", "A1", fmt.Sprintf("%s提成统计表", dataInterval))
+
+	//Style3, _ := f.NewStyle(
+	//	&excelize.Style{
+	//		Font:      &excelize.Font{Bold: true, Size: 10, Family: "宋体"},
+	//		Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
+	//		Border: []excelize.Border{
+	//			{Type: "left", Color: "000000", Style: 1},
+	//			{Type: "top", Color: "000000", Style: 1},
+	//			{Type: "bottom", Color: "000000", Style: 1},
+	//			{Type: "right", Color: "000000", Style: 1},
+	//		},
+	//	})
+
+	f.SetCellStyle("Sheet1", "A2", "G4", Style2)
+	f.SetRowHeight("Sheet1", 2, 20)
+	f.SetRowHeight("Sheet1", 4, 20)
+
+	// 这里设置表头
+	f.MergeCell("Sheet1", "A2", "A4")
+	f.MergeCell("Sheet1", "B2", "B4")
+	f.MergeCell("Sheet1", "C2", "C4")
+	f.MergeCell("Sheet1", "D2", "D4")
+	f.MergeCell("Sheet1", "E2", "E4")
+	f.MergeCell("Sheet1", "F2", "F4")
+	f.MergeCell("Sheet1", "G2", "G4")
+
+	f.SetCellValue("Sheet1", "A2", "序号")
+	f.SetCellValue("Sheet1", "B2", "公司名称")
+	f.SetCellValue("Sheet1", "C2", "验证类型")
+	f.SetCellValue("Sheet1", "D2", "项目名称")
+	f.SetCellValue("Sheet1", "E2", "项目负责人")
+	f.SetCellValue("Sheet1", "F2", "统计日期")
+	f.SetCellValue("Sheet1", "G2", "提成类型")
+
+	f.MergeCell("Sheet1", "H2", "S2")
+	f.SetCellValue("Sheet1", "H2", "验证实施")
+
+	f.MergeCell("Sheet1", "T2", "AC2")
+	f.SetCellValue("Sheet1", "T2", "报告编写")
+
+	verifyItemList, _ := Basic.Read_VerifyItem_List(0, "", 0, 9999)
+	for _, item := range verifyItemList {
+		f.SetCellValue("Sheet1", fmt.Sprintf("%s3", item.T_cell), item.T_name)
+		f.SetCellValue("Sheet1", fmt.Sprintf("%s4", item.T_cell), item.T_price)
+	}
+
+	f.MergeCell("Sheet1", "S3", "S4")
+	f.SetCellValue("Sheet1", "S3", "合计")
+
+	f.MergeCell("Sheet1", "AC3", "AC4")
+	f.SetCellValue("Sheet1", "AC3", "合计")
+	// 设置列宽
+	f.SetColWidth("Sheet1", "A", "A", 5)
+	f.SetColWidth("Sheet1", "B", "G", 16)
+	f.SetColWidth("Sheet1", "E", "G", 10)
+	f.SetColWidth("Sheet1", "H", "AC", 10)
+
+	// 冻结1-3行
+	f.SetPanes("Sheet1", &excelize.Panes{
+		Freeze:      true,
+		Split:       false,
+		XSplit:      2,
+		YSplit:      4,
+		TopLeftCell: "A1",
+		ActivePane:  "topRight",
+	})
+
+	// 过滤器
+	f.AutoFilter("Sheet1", "A4:G4", nil)
+
+	// 循环写入数据
+	line := 5
+	for i, percentage := range percentageList {
+
+		f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
+		f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), percentage.T_verifyCompany.T_name)
+
+		f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), percentage.T_device_type+percentage.T_verify_type)
+		f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), percentage.T_task_name)
+		f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), percentage.T_uuid_name)
+		f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), percentage.T_reporting_pass_time[:10])
+
+		verifyItem := Basic.Read_VerifyItem_Get(percentage.T_verify_item)
+		f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", verifyItem.T_cell, line), verifyItem.T_price)
+		var verifyType string
+		if percentage.T_type == Percentage.SchemeType {
+			verifyType = "验证实施"
+			f.SetCellValue("Sheet1", fmt.Sprintf("S%d", line), verifyItem.T_price)
+
+		} else if percentage.T_type == Percentage.ReportingType {
+			verifyType = "报告编写"
+			f.SetCellValue("Sheet1", fmt.Sprintf("AC%d", line), verifyItem.T_price)
+
+		}
+		f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), verifyType)
+		line++
+	}
+	// 函数统计
+	//f.SetCellFormula("Sheet1", fmt.Sprintf("S%d", line), fmt.Sprintf("SUM(S5:S%d)", line-1))
+	//f.SetCellFormula("Sheet1", fmt.Sprintf("AC%d", line), fmt.Sprintf("SUM(AC5:AC%d)", line-1))
+
+	Style4, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Size: 11, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
+			Border: []excelize.Border{
+				{Type: "left", Color: "000000", Style: 1},
+				{Type: "top", Color: "000000", Style: 1},
+				{Type: "bottom", Color: "000000", Style: 1},
+				{Type: "right", Color: "000000", Style: 1},
+			},
+		})
+
+	// 黄色填充
+	StyleYellowFill, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
+			Border: []excelize.Border{
+				{Type: "left", Color: "000000", Style: 1},
+				{Type: "top", Color: "000000", Style: 1},
+				{Type: "bottom", Color: "000000", Style: 1},
+				{Type: "right", Color: "000000", Style: 1},
+			},
+			Fill: excelize.Fill{Type: "pattern", Color: []string{"#FFFF00"}, Pattern: 1},
+		})
+	// 黄色填充
+	StyleYellowFill1, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 10, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
+			Border: []excelize.Border{
+				{Type: "left", Color: "000000", Style: 1},
+				{Type: "top", Color: "000000", Style: 1},
+				{Type: "bottom", Color: "000000", Style: 1},
+				{Type: "right", Color: "000000", Style: 1},
+			},
+			Fill: excelize.Fill{Type: "pattern", Color: []string{"#FFFF00"}, Pattern: 1},
+		})
+	// 绿色填充
+	StyleGreenFill, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
+			Border: []excelize.Border{
+				{Type: "left", Color: "000000", Style: 1},
+				{Type: "top", Color: "000000", Style: 1},
+				{Type: "bottom", Color: "000000", Style: 1},
+				{Type: "right", Color: "000000", Style: 1},
+			},
+			Fill: excelize.Fill{Type: "pattern", Color: []string{"#92D050"}, Pattern: 1},
+		})
+	StyleGreenFill1, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 10, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
+			Border: []excelize.Border{
+				{Type: "left", Color: "000000", Style: 1},
+				{Type: "top", Color: "000000", Style: 1},
+				{Type: "bottom", Color: "000000", Style: 1},
+				{Type: "right", Color: "000000", Style: 1},
+			},
+			Fill: excelize.Fill{Type: "pattern", Color: []string{"#92D050"}, Pattern: 1},
+		})
+
+	f.SetCellStyle("Sheet1", "A5", fmt.Sprintf("AC%d", line-1), Style4)
+
+	f.SetCellStyle("Sheet1", "H2", "S4", StyleYellowFill)
+	f.SetCellStyle("Sheet1", "S5", fmt.Sprintf("S%d", line-1), StyleYellowFill1)
+	f.SetCellStyle("Sheet1", "T2", "AC4", StyleGreenFill)
+	f.SetCellStyle("Sheet1", "AC5", fmt.Sprintf("AC%d", line-1), StyleGreenFill1)
+	filename := fmt.Sprintf("%s提成统计表(%s)", dataInterval, lib.GetRandstring(6, "0123456789", 0))
+	// 保存文件
+	if err := f.SaveAs("ofile/" + filename + ".xlsx"); err != nil {
+		fmt.Println(err)
+	}
+
+	// 上传 OSS
+	nats := natslibs.NewNats(Nats.Nats, conf.NatsSubj_Prefix)
+	url, is := nats.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+filename+".xlsx", "ofile/"+filename+".xlsx")
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
 		c.ServeJSON()
 		return
 	}
-	contract, err := ContractDao.Read_Contract_ByT_number(percentage.T_number)
+	//删除目录
+	err := os.Remove("ofile/" + filename + ".xlsx")
 	if err != nil {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "合同不存在!"}
-		c.ServeJSON()
-		return
+		logs.Error(lib.FuncName(), err)
 	}
-	productList := contractProductDao.Read_ContractProduct_List(contract.T_number)
 
-	var pList []Contract.ContractProduct_R
-	for _, v := range productList {
-		p := Contract.ContractProductToContractProduct_R(v)
-		p.T_device_list, _ = DeviceDao.Read_DeviceSn_List(contract.T_number, v.T_product_id, "", "")
-		pList = append(pList, p)
-	}
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
+	c.ServeJSON()
+	return
+}
+func (c *PercentageController) Percentage_User_Export() {
 
+	// 查询
+	T_name := c.GetString("T_name")             // 关键字
+	T_start_date := c.GetString("T_start_date") // 开始时间
+	T_end_date := c.GetString("T_end_date")     // 结束时间
+	T_state, _ := c.GetInt("T_state")
+	T_type, _ := c.GetInt("T_type") // 提成类型
 	userList, _ := NatsServer.Read_User_List_All()
 	Account.Read_User_All_Map(userList)
-	Contract.Read_VerifyContract_All_Map()
+	Percentage.Read_VerifyCompany_All_Map()
 	Basic.Read_VerifyItem_All_Map()
+	PercentageDao := Percentage.NewPercentage(orm.NewOrm())
+	percentageList, _ := PercentageDao.Read_Percentage_List_For_Excel(T_name, c.User.T_uuid, T_start_date, T_end_date, []string{}, T_state, T_type)
+	dataInterval := fmt.Sprintf("%s - %s", T_start_date, T_end_date)
+	if dataInterval == " - " {
+		dataInterval = ""
+	}
+	f := excelize.NewFile() // 设置单元格的值
+	Style1, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 20, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
+		})
+
+	Style2, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
+			Border: []excelize.Border{
+				{Type: "left", Color: "000000", Style: 1},
+				{Type: "top", Color: "000000", Style: 1},
+				{Type: "bottom", Color: "000000", Style: 1},
+				{Type: "right", Color: "000000", Style: 1},
+			},
+		})
+	f.MergeCell("Sheet1", "A1", "AC1")
+	f.SetRowStyle("Sheet1", 1, 1, Style1)
+	f.SetRowHeight("Sheet1", 1, 50)
+	f.SetCellValue("Sheet1", "A1", fmt.Sprintf("%s提成统计表", dataInterval))
+
+	//Style3, _ := f.NewStyle(
+	//	&excelize.Style{
+	//		Font:      &excelize.Font{Bold: true, Size: 10, Family: "宋体"},
+	//		Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
+	//		Border: []excelize.Border{
+	//			{Type: "left", Color: "000000", Style: 1},
+	//			{Type: "top", Color: "000000", Style: 1},
+	//			{Type: "bottom", Color: "000000", Style: 1},
+	//			{Type: "right", Color: "000000", Style: 1},
+	//		},
+	//	})
+
+	f.SetCellStyle("Sheet1", "A2", "G4", Style2)
+	f.SetRowHeight("Sheet1", 2, 20)
+	f.SetRowHeight("Sheet1", 4, 20)
+
+	// 这里设置表头
+	f.MergeCell("Sheet1", "A2", "A4")
+	f.MergeCell("Sheet1", "B2", "B4")
+	f.MergeCell("Sheet1", "C2", "C4")
+	f.MergeCell("Sheet1", "D2", "D4")
+	f.MergeCell("Sheet1", "E2", "E4")
+	f.MergeCell("Sheet1", "F2", "F4")
+	f.MergeCell("Sheet1", "G2", "G4")
+
+	f.SetCellValue("Sheet1", "A2", "序号")
+	f.SetCellValue("Sheet1", "B2", "公司名称")
+	f.SetCellValue("Sheet1", "C2", "验证类型")
+	f.SetCellValue("Sheet1", "D2", "项目名称")
+	f.SetCellValue("Sheet1", "E2", "项目负责人")
+	f.SetCellValue("Sheet1", "F2", "统计日期")
+	f.SetCellValue("Sheet1", "G2", "提成类型")
+
+	f.MergeCell("Sheet1", "H2", "S2")
+	f.SetCellValue("Sheet1", "H2", "验证实施")
+
+	f.MergeCell("Sheet1", "T2", "AC2")
+	f.SetCellValue("Sheet1", "T2", "报告编写")
+
+	verifyItemList, _ := Basic.Read_VerifyItem_List(0, "", 0, 9999)
+	for _, item := range verifyItemList {
+		f.SetCellValue("Sheet1", fmt.Sprintf("%s3", item.T_cell), item.T_name)
+		f.SetCellValue("Sheet1", fmt.Sprintf("%s4", item.T_cell), item.T_price)
+	}
+
+	f.MergeCell("Sheet1", "S3", "S4")
+	f.SetCellValue("Sheet1", "S3", "合计")
+
+	f.MergeCell("Sheet1", "AC3", "AC4")
+	f.SetCellValue("Sheet1", "AC3", "合计")
+	// 设置列宽
+	f.SetColWidth("Sheet1", "A", "A", 5)
+	f.SetColWidth("Sheet1", "B", "G", 16)
+	f.SetColWidth("Sheet1", "E", "G", 10)
+	f.SetColWidth("Sheet1", "H", "AC", 10)
+
+	// 冻结1-3行
+	f.SetPanes("Sheet1", &excelize.Panes{
+		Freeze:      true,
+		Split:       false,
+		XSplit:      2,
+		YSplit:      4,
+		TopLeftCell: "A1",
+		ActivePane:  "topRight",
+	})
+
+	// 过滤器
+	f.AutoFilter("Sheet1", "A4:G4", nil)
+
+	// 循环写入数据
+	line := 5
+	for i, percentage := range percentageList {
+
+		f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), i+1)
+		f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), percentage.T_verifyCompany.T_name)
+
+		f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), percentage.T_device_type+percentage.T_verify_type)
+		f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), percentage.T_task_name)
+		f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), percentage.T_uuid_name)
+		f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), percentage.T_reporting_pass_time[:10])
+
+		verifyItem := Basic.Read_VerifyItem_Get(percentage.T_verify_item)
+		f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", verifyItem.T_cell, line), verifyItem.T_price)
+		var verifyType string
+		if percentage.T_type == Percentage.SchemeType {
+			verifyType = "验证实施"
+			f.SetCellValue("Sheet1", fmt.Sprintf("S%d", line), verifyItem.T_price)
+
+		} else if percentage.T_type == Percentage.ReportingType {
+			verifyType = "报告编写"
+			f.SetCellValue("Sheet1", fmt.Sprintf("AC%d", line), verifyItem.T_price)
+
+		}
+		f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), verifyType)
+		line++
+	}
+	// 函数统计
+	//f.SetCellFormula("Sheet1", fmt.Sprintf("S%d", line), fmt.Sprintf("SUM(S5:S%d)", line-1))
+	//f.SetCellFormula("Sheet1", fmt.Sprintf("AC%d", line), fmt.Sprintf("SUM(AC5:AC%d)", line-1))
+
+	Style4, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Size: 11, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
+			Border: []excelize.Border{
+				{Type: "left", Color: "000000", Style: 1},
+				{Type: "top", Color: "000000", Style: 1},
+				{Type: "bottom", Color: "000000", Style: 1},
+				{Type: "right", Color: "000000", Style: 1},
+			},
+		})
+
+	// 黄色填充
+	StyleYellowFill, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
+			Border: []excelize.Border{
+				{Type: "left", Color: "000000", Style: 1},
+				{Type: "top", Color: "000000", Style: 1},
+				{Type: "bottom", Color: "000000", Style: 1},
+				{Type: "right", Color: "000000", Style: 1},
+			},
+			Fill: excelize.Fill{Type: "pattern", Color: []string{"#FFFF00"}, Pattern: 1},
+		})
+	// 黄色填充
+	StyleYellowFill1, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 10, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
+			Border: []excelize.Border{
+				{Type: "left", Color: "000000", Style: 1},
+				{Type: "top", Color: "000000", Style: 1},
+				{Type: "bottom", Color: "000000", Style: 1},
+				{Type: "right", Color: "000000", Style: 1},
+			},
+			Fill: excelize.Fill{Type: "pattern", Color: []string{"#FFFF00"}, Pattern: 1},
+		})
+	// 绿色填充
+	StyleGreenFill, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
+			Border: []excelize.Border{
+				{Type: "left", Color: "000000", Style: 1},
+				{Type: "top", Color: "000000", Style: 1},
+				{Type: "bottom", Color: "000000", Style: 1},
+				{Type: "right", Color: "000000", Style: 1},
+			},
+			Fill: excelize.Fill{Type: "pattern", Color: []string{"#92D050"}, Pattern: 1},
+		})
+	StyleGreenFill1, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 10, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
+			Border: []excelize.Border{
+				{Type: "left", Color: "000000", Style: 1},
+				{Type: "top", Color: "000000", Style: 1},
+				{Type: "bottom", Color: "000000", Style: 1},
+				{Type: "right", Color: "000000", Style: 1},
+			},
+			Fill: excelize.Fill{Type: "pattern", Color: []string{"#92D050"}, Pattern: 1},
+		})
+
+	f.SetCellStyle("Sheet1", "A5", fmt.Sprintf("AC%d", line-1), Style4)
+
+	f.SetCellStyle("Sheet1", "H2", "S4", StyleYellowFill)
+	f.SetCellStyle("Sheet1", "S5", fmt.Sprintf("S%d", line-1), StyleYellowFill1)
+	f.SetCellStyle("Sheet1", "T2", "AC4", StyleGreenFill)
+	f.SetCellStyle("Sheet1", "AC5", fmt.Sprintf("AC%d", line-1), StyleGreenFill1)
+	filename := fmt.Sprintf("%s提成统计表(%s)", dataInterval, lib.GetRandstring(6, "0123456789", 0))
+	// 保存文件
+	if err := f.SaveAs("ofile/" + filename + ".xlsx"); err != nil {
+		fmt.Println(err)
+	}
+
+	// 上传 OSS
+	nats := natslibs.NewNats(Nats.Nats, conf.NatsSubj_Prefix)
+	url, is := nats.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+filename+".xlsx", "ofile/"+filename+".xlsx")
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
+		c.ServeJSON()
+		return
+	}
+	//删除目录
+	err := os.Remove("ofile/" + filename + ".xlsx")
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
 
-	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Percentage.PercentageToPercentage_Detail(percentage, contract, pList)}
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
 	c.ServeJSON()
 	return
 }
 
-func (c *PercentageController) Percentage_Add() {
-
-	T_number := c.GetString("T_number")
-	T_uuid := c.GetString("T_uuid")
-	T_money, _ := c.GetFloat("T_money") // 总价
-	T_type, _ := c.GetInt("T_type")     // 类型
-	T_item := c.GetString("T_item")
+func (c *PercentageController) Percentage_Get() {
 
-	if len(T_item) == 0 {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "提成明细不能为空"}
+	// 查询
+	T_id, _ := c.GetInt("T_id")
+	o := orm.NewOrm()
+	PercentageDao := Percentage.NewPercentage(o)
+	percentage, err := PercentageDao.Read_Percentage_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
 		c.ServeJSON()
 		return
 	}
+	Percentage.Read_VerifyCompany_All_Map()
 
-	var_ := Percentage.Percentage{
-		T_number: T_number,
-		T_uuid:   T_uuid,
-		T_money:  float32(T_money),
-		T_type:   T_type, //类型 1-验证实施 2-报告编写
-		T_State:  6,      // 6-未提交审核
-		T_submit: c.User.T_uuid,
-		T_item:   T_item,
-	}
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Percentage.PercentageToPercentage_Detail(percentage)}
+	c.ServeJSON()
+	return
+}
 
-	o := orm.NewOrm()
-	ContractDao := Contract.NewContract(o)
-	_, err := ContractDao.Read_Contract_ByT_number(T_number)
-	if err != nil {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "合同不存在!"}
+func (c *PercentageController) Percentage_Add() {
+
+	T_device_type := c.GetString("T_device_type")   // 提成类型
+	T_verify_type := c.GetString("T_verify_type")   // 验证类型
+	T_company_uuid := c.GetString("T_company_uuid") // 公司id
+	T_type, _ := c.GetInt("T_type")                 // 类型 1-验证实施 2-报告编写
+
+	company, is := Percentage.Read_VerifyCompany(T_company_uuid)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询公司信息失败!"}
 		c.ServeJSON()
 		return
 	}
-	Basic.Read_VerifyItem_All_Map()
 
-	o.Begin()
-	PercentageDao := Percentage.NewPercentage(o)
-
-	var T_type_str string
-	if T_type == 1 {
-		T_type_str = "验证实施"
+	var verifyItemMap map[string]Basic.VerifyItem
+	verifyItemSchemeMap, verifyItemReportingMap := GetVerifyItemMap()
+	if T_type == Percentage.SchemeType {
+		verifyItemMap = verifyItemSchemeMap
 	}
-	if T_type == 2 {
-		T_type_str = "报告编写"
+	if T_type == Percentage.ReportingType {
+		verifyItemMap = verifyItemReportingMap
 	}
-	_, err = PercentageDao.Read_Percentage_ByT_number_T_type(T_number, T_type)
-	if err == nil {
-		o.Rollback()
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("该合同已提交过%s提成申请", T_type_str)}
-		c.ServeJSON()
-		return
+
+	var_ := Percentage.Percentage{
+		T_Distributor_id: company.T_Distributor_id,
+		T_device_type:    T_device_type,
+		T_verify_type:    T_verify_type,
+		T_uuid:           c.User.T_uuid,
+		T_company_uuid:   T_company_uuid,
+		T_money:          verifyItemMap[T_device_type].T_price,
+		T_type:           T_type, //类型 1-验证实施 2-报告编写
+		T_State:          6,      // 6-未提交审核
+		T_verify_item:    verifyItemMap[T_device_type].Id,
 	}
-	var_.T_item_price = Percentage.Generate_VerifyItem_Price(var_.T_item)
-	var_.T_item = "|" + var_.T_item
 
-	_, err = PercentageDao.Add_Percentage(var_)
+	o := orm.NewOrm()
+
+	PercentageDao := Percentage.NewPercentage(o)
+
+	id, err := PercentageDao.Add_Percentage(var_)
 	if err != nil {
-		o.Rollback()
 		c.Data["json"] = lib.JSONS{Code: 203, Msg: "添加失败"}
 		c.ServeJSON()
 		return
 	}
 
-	o.Commit()
-
 	NatsServer.AddUserLogs(c.User.T_uuid, "提成", "添加", var_)
 
-	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_number}
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: id}
 	c.ServeJSON()
 	return
 }
@@ -211,7 +668,6 @@ func (c *PercentageController) Percentage_Add() {
 func (c *PercentageController) Percentage_Approval() {
 
 	T_id, _ := c.GetInt("T_id")
-	T_item := c.GetString("T_item")
 	T_state, _ := c.GetInt("T_state")
 	T_approval_money, _ := c.GetFloat("T_approval_money")
 	T_approval_opinion := c.GetString("T_approval_opinion")
@@ -247,12 +703,8 @@ func (c *PercentageController) Percentage_Approval() {
 	if T_state == 2 || T_state == 3 {
 		percentage.T_State = T_state
 	}
-	if len(T_item) > 0 {
-		percentage.T_item = T_item
-		percentage.T_item_price = Percentage.Generate_VerifyItem_Price(percentage.T_item)
-	}
 
-	err = PercentageDao.Update_Percentage(percentage, "T_State", "T_approval_opinion", "T_approval_money", "T_item", "T_item_price")
+	err = PercentageDao.Update_Percentage(percentage, "T_State", "T_approval_opinion", "T_approval_money")
 	if err != nil {
 		o.Rollback()
 		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
@@ -260,10 +712,10 @@ func (c *PercentageController) Percentage_Approval() {
 		return
 	}
 	if T_state == Percentage.AuditPass {
-		NatsServer.AddNews(percentage.T_uuid, fmt.Sprintf("【提成申请】您提交的提成申请(%s)审核已通过", percentage.T_number), conf.MyPercentageUrl)
+		NatsServer.AddNews(percentage.T_uuid, fmt.Sprintf("【提成申请】您提交的提成申请(%s)审核已通过", percentage.T_task_id), conf.MyPercentageUrl)
 	}
 	if T_state == Percentage.AuditUnPass {
-		NatsServer.AddNews(percentage.T_uuid, fmt.Sprintf("【提成申请】您提交的提成申请(%s)审核未通过", percentage.T_number), conf.MyPercentageUrl)
+		NatsServer.AddNews(percentage.T_uuid, fmt.Sprintf("【提成申请】您提交的提成申请(%s)审核未通过", percentage.T_task_id), conf.MyPercentageUrl)
 	}
 	NatsServer.AddUserLogs(c.User.T_uuid, "提成", "审核", percentage)
 
@@ -274,36 +726,29 @@ func (c *PercentageController) Percentage_Approval() {
 
 func (c *PercentageController) Percentage_Edit() {
 	T_id, _ := c.GetInt("T_id")
-	T_number := c.GetString("T_number")
-	T_uuid := c.GetString("T_uuid")
-	T_money, _ := c.GetFloat("T_money") // 总价
-	T_type, _ := c.GetInt("T_type")     // 优惠价
-	T_item := c.GetString("T_item")
-
-	if len(T_item) == 0 {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "提成明细不能为空"}
+	T_device_type := c.GetString("T_device_type")   // 提成类型
+	T_verify_type := c.GetString("T_verify_type")   // 验证类型
+	T_company_uuid := c.GetString("T_company_uuid") // 公司id
+	T_type, _ := c.GetInt("T_type")                 // 类型 1-验证实施 2-报告编写
+
+	company, is := Percentage.Read_VerifyCompany(T_company_uuid)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询公司信息失败!"}
 		c.ServeJSON()
 		return
 	}
 
-	var T_type_str string
-	if T_type == 1 {
-		T_type_str = "验证实施"
+	var verifyItemMap map[string]Basic.VerifyItem
+	verifyItemSchemeMap, verifyItemReportingMap := GetVerifyItemMap()
+	if T_type == Percentage.SchemeType {
+		verifyItemMap = verifyItemSchemeMap
 	}
-	if T_type == 2 {
-		T_type_str = "报告编写"
+	if T_type == Percentage.ReportingType {
+		verifyItemMap = verifyItemReportingMap
 	}
 
 	o := orm.NewOrm()
-	ContractDao := Contract.NewContract(o)
-	_, err := ContractDao.Read_Contract_ByT_number(T_number)
-	if err != nil {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "合同不存在!"}
-		c.ServeJSON()
-		return
-	}
 	PercentageDao := Percentage.NewPercentage(o)
-
 	percentage, err := PercentageDao.Read_Percentage_ById(T_id)
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
@@ -311,18 +756,6 @@ func (c *PercentageController) Percentage_Edit() {
 		return
 	}
 
-	percentage1, err := PercentageDao.Read_Percentage_ByT_number_T_type(T_number, T_type)
-	if err != nil && err.Error() != orm.ErrNoRows.Error() {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
-		c.ServeJSON()
-		return
-	}
-	if percentage1.Id > 0 && percentage1.Id != percentage.Id {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("该合同已提交过%s提成申请", T_type_str)}
-		c.ServeJSON()
-		return
-	}
-
 	// 1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款 6-未提交审核 合同状态为未通过,修改之后将状态更改为待审核
 	if percentage.T_State == Percentage.AuditPass || percentage.T_State == Percentage.RemitPart || percentage.T_State == Percentage.RemitAll {
 		c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("状态为%s,禁止修改!", Percentage.Read_Audit_Get(percentage.T_State))}
@@ -330,24 +763,25 @@ func (c *PercentageController) Percentage_Edit() {
 		return
 	}
 
-	if len(T_number) > 0 {
-		percentage.T_number = T_number
+	if len(T_company_uuid) > 0 {
+		percentage.T_company_uuid = T_company_uuid
+		percentage.T_Distributor_id = company.T_Distributor_id
 	}
-	if len(T_uuid) > 0 {
-		percentage.T_uuid = T_uuid
+	if len(T_device_type) > 0 {
+		percentage.T_device_type = T_device_type
 	}
-	if T_money > 0 {
-		percentage.T_money = float32(T_money)
+	if len(T_verify_type) > 0 {
+		percentage.T_verify_type = T_verify_type
 	}
+
 	if T_type > 0 {
 		percentage.T_type = T_type
 	}
-	if len(T_item) > 0 {
-		percentage.T_item = "|" + T_item
-		percentage.T_item_price = Percentage.Generate_VerifyItem_Price(T_item)
-	}
 
-	err = PercentageDao.Update_Percentage(percentage, "T_number", "T_uuid", "T_money", "T_type", "T_item", "T_item_price")
+	percentage.T_money = verifyItemMap[percentage.T_device_type].T_price
+	percentage.T_verify_item = verifyItemMap[percentage.T_device_type].Id
+
+	err = PercentageDao.Update_Percentage(percentage, "T_company_uuid", "T_Distributor_id", "T_device_type", "T_verify_type", "T_type", "T_money", "T_verify_item")
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
 		c.ServeJSON()
@@ -424,7 +858,7 @@ func (c *PercentageController) Percentage_Admin_Del() {
 // 打款
 func (c *PercentageController) Percentage_Remit() {
 	T_id, _ := c.GetInt("T_id")
-	T_remit := c.GetString("T_remit")
+	//T_remit := c.GetString("T_remit")
 
 	o := orm.NewOrm()
 	PercentageDao := Percentage.NewPercentage(o)
@@ -437,44 +871,45 @@ func (c *PercentageController) Percentage_Remit() {
 		return
 	}
 
-	// 1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款  合同状态为未通过,修改之后将状态更改为待审核
+	// 1-待审核 2-审核通过 3-审核不通过  5-已打款  合同状态为未通过,修改之后将状态更改为待审核
 	if percentage.T_State == 1 || percentage.T_State == 3 {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "当前状态不可添加打款信息!"}
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "当前状态不可提交打款!"}
 		c.ServeJSON()
 		return
 	}
 
-	if len(T_remit) == 0 {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "打款明细不能为空"}
-		c.ServeJSON()
-		return
-	}
+	//if len(T_remit) == 0 {
+	//	c.Data["json"] = lib.JSONS{Code: 202, Msg: "打款明细不能为空"}
+	//	c.ServeJSON()
+	//	return
+	//}
+
+	//if len(T_remit) > 0 {
+	//	percentage.T_remit = T_remit
+	//}
+	//_, money := Percentage.PercentageToPercentageRemit_R(T_remit)
+	//// 部分打款
+	//if percentage.T_approval_money > money && money > 0 {
+	//	percentage.T_State = 4
+	//}
+	//// 全部打款
+	//if percentage.T_approval_money == money && money > 0 {
+	//	percentage.T_State = 5
+	//}
+	percentage.T_State = 5
 
-	if len(T_remit) > 0 {
-		percentage.T_remit = T_remit
-	}
-	_, money := Percentage.PercentageToPercentageRemit_R(T_remit)
-	// 部分打款
-	if percentage.T_approval_money > money && money > 0 {
-		percentage.T_State = 4
-	}
-	// 全部打款
-	if percentage.T_approval_money == money && money > 0 {
-		percentage.T_State = 5
-	}
-
-	err = PercentageDao.Update_Percentage(percentage, "T_remit", "T_State")
+	err = PercentageDao.Update_Percentage(percentage, "T_State")
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
 		c.ServeJSON()
 		return
 	}
 
-	if percentage.T_State == 4 {
-		NatsServer.AddNews(percentage.T_uuid, fmt.Sprintf("【提成申请】您提交的提成申请(%s)已部分打款", percentage.T_number), conf.MyPercentageUrl)
-	}
+	//if percentage.T_State == 4 {
+	//	NatsServer.AddNews(percentage.T_uuid, fmt.Sprintf("【提成申请】您提交的提成申请(%s)已部分打款", percentage.T_task_id), conf.MyPercentageUrl)
+	//}
 	if percentage.T_State == 5 {
-		NatsServer.AddNews(percentage.T_uuid, fmt.Sprintf("【提成申请】您提交的提成申请(%s)已全部打款", percentage.T_number), conf.MyPercentageUrl)
+		NatsServer.AddNews(percentage.T_uuid, fmt.Sprintf("【提成申请】您提交的提成申请(%s)已打款", percentage.T_task_id), conf.MyPercentageUrl)
 	}
 
 	NatsServer.AddUserLogs(c.User.T_uuid, "提成", "修改", percentage)
@@ -585,10 +1020,344 @@ func (c *PercentageController) Percentage_Submit_Audit() {
 		c.ServeJSON()
 		return
 	}
-	NatsServer.AddNews(conf.FinanceUuid, fmt.Sprintf("【提成申请】您有一条提成申请(%s)待审核", percentage.T_number), conf.PercentageApprovalUrl)
+	NatsServer.AddNews(conf.FinanceUuid, fmt.Sprintf("【提成申请】您有一条提成申请(%s)待审核", percentage.T_task_id), conf.PercentageApprovalUrl)
 	NatsServer.AddUserLogs(c.User.T_uuid, "提成", "审核", percentage)
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_id}
 	c.ServeJSON()
 	return
 }
+func (c *PercentageController) Percentage_SyncVerify() {
+
+	SyncVerifyPercentage(false)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+
+func Cron_Percentage() {
+
+	//创建一个定时任务对象
+	c := cron.New(cron.WithSeconds())
+	//给对象增加定时任务
+	//c.AddFunc("0 */1 * * * ?", Cron_SyncColdVerifyCompany)
+	c.AddFunc("@daily", Cron_SyncColdVerifyCompany)
+	//c.AddFunc("0 */1 * * * ?", Cron_SyncVerifyPercentage)
+	c.AddFunc("@daily", Cron_SyncVerifyPercentage)
+
+	//启动定时任务
+	c.Start()
+	defer c.Stop()
+
+	//查询语句,阻塞,让main函数不退出,保持程序运行
+	select {}
+
+}
+
+func Cron_SyncColdVerifyCompany() {
+	url := "/openapi/company/list"
+	signature, timestamp := lib.GenColdVerifySignature()
+	client := resty.New()
+	resp, err := client.R().SetFormData(map[string]string{
+		"CreateDate":      "",
+		"X-API-KEY":       lib.ColdVerify_OpenApi_Key,
+		"X-API-SIGNATURE": signature,
+		"X-API-TIMESTAMP": timestamp,
+	}).Post(conf.ColdVerify_OpenApi_Host + url)
+
+	if err != nil {
+		logs.Error("请求冷链验证公司列表接口失败!")
+		return
+	}
+	type R_JSONS struct {
+		//必须的大写开头
+		Data []Percentage.VerifyCompany
+		Code int64
+		Msg  string
+	}
+	var res R_JSONS
+	if err = json.Unmarshal(resp.Body(), &res); err != nil {
+		logs.Error("请求冷链验证公司列表接口失败!")
+		return
+	}
+
+	for _, company := range res.Data {
+		c, is := Percentage.Read_VerifyCompany(company.T_uuid)
+		if is {
+			if c.T_name != company.T_name || c.T_Distributor_name != company.T_Distributor_name {
+				c.T_name = company.T_name
+				c.T_Distributor_name = company.T_Distributor_name
+				Percentage.Update_VerifyCompany(c, "T_name", "T_Distributor_name")
+			}
+		} else {
+			Percentage.Add_VerifyCompany(company)
+		}
+
+	}
+
+}
+
+// 读取冷链验证任务,同步到提成
+// 定时统计前一天审核通过的任务
+func Cron_SyncVerifyPercentage() {
+	SyncVerifyPercentage(true)
+}
+
+func SyncVerifyPercentage(isCron bool) {
+	url := "/openapi/task/list"
+	signature, timestamp := lib.GenColdVerifySignature()
+	client := resty.New()
+	var createDate string
+	if isCron {
+		createDate = time.Now().Add(-time.Hour * 24).Format("2006-01-02")
+	}
+	client.SetTimeout(30 * time.Second)
+	client.SetRetryCount(3).SetRetryWaitTime(1 * time.Second)
+	resp, err := client.R().SetFormData(map[string]string{
+		"CreateDate":      createDate,
+		"X-API-KEY":       lib.ColdVerify_OpenApi_Key,
+		"X-API-SIGNATURE": signature,
+		"X-API-TIMESTAMP": timestamp,
+	}).Post(conf.ColdVerify_OpenApi_Host + url)
+
+	if err != nil {
+		logs.Error("请求冷链验证任务列表接口失败!")
+		return
+	}
+	type R_JSONS struct {
+		//必须的大写开头
+		Data []Percentage.VerifyTask
+		Code int64
+		Msg  string
+	}
+	var res R_JSONS
+	if err = json.Unmarshal(resp.Body(), &res); err != nil {
+		logs.Error("请求冷链验证任务列表接口失败!")
+		return
+	}
+
+	verifyItemSchemeMap, verifyItemReportingMap := GetVerifyItemMap()
+	coldVerifyUUIDMap := GetColdVerifyUUIDMap()
+
+	PercentageDao := Percentage.NewPercentage(orm.NewOrm())
+	for _, task := range res.Data {
+		// 自动同步报告提成
+		_, err = PercentageDao.Read_Percentage_ByT_T_task_id_T_type(task.T_task_id, Percentage.ReportingType)
+		if err != nil && err.Error() == orm.ErrNoRows.Error() {
+			verifyItem := GetPercentageMoney(task.T_device_type, task.T_verify_type, verifyItemReportingMap)
+			// 添加报告提成
+			percentage := Percentage.Percentage{
+				T_Distributor_id:      task.T_Distributor_id,
+				T_task_id:             task.T_task_id,
+				T_task_int_id:         task.Id,
+				T_device_type:         task.T_device_type,
+				T_verify_type:         task.T_verify_type,
+				T_company_uuid:        task.T_uuid,
+				T_task_name:           task.T_name,
+				T_uuid:                coldVerifyUUIDMap[task.T_reporting],
+				T_money:               verifyItem.T_price,
+				T_type:                Percentage.ReportingType,
+				T_State:               1,
+				T_verify_item:         verifyItem.Id,
+				T_reporting_pass_time: task.T_reporting_pass_time,
+			}
+			_, err = PercentageDao.Add_Percentage(percentage)
+		}
+
+		// 由经销商id的任务 只有报告,不需要同步实施提成
+		if len(task.T_Distributor_id) > 0 {
+			continue
+		}
+
+		// 自动同步实施提成
+		_, err = PercentageDao.Read_Percentage_ByT_T_task_id_T_type(task.T_task_id, Percentage.SchemeType)
+		if err != nil && err.Error() == orm.ErrNoRows.Error() {
+			verifyItem := GetPercentageMoney(task.T_device_type, task.T_verify_type, verifyItemSchemeMap)
+			// 添加报告提成
+			percentage := Percentage.Percentage{
+				T_Distributor_id:      task.T_Distributor_id,
+				T_task_id:             task.T_task_id,
+				T_task_int_id:         task.Id,
+				T_device_type:         task.T_device_type,
+				T_verify_type:         task.T_verify_type,
+				T_company_uuid:        task.T_uuid,
+				T_task_name:           task.T_name,
+				T_uuid:                coldVerifyUUIDMap[task.T_scheme],
+				T_money:               verifyItem.T_price,
+				T_type:                Percentage.SchemeType,
+				T_State:               1,
+				T_verify_item:         verifyItem.Id,
+				T_reporting_pass_time: task.T_reporting_pass_time,
+			}
+			_, err = PercentageDao.Add_Percentage(percentage)
+		}
+	}
+}
+
+func GetVerifyItemMap() (map[string]Basic.VerifyItem, map[string]Basic.VerifyItem) {
+	verifyItemList, _ := Basic.Read_VerifyItem_List(0, "", 0, 999)
+	var verifyItemSchemeMap = make(map[string]Basic.VerifyItem)    // 实施
+	var verifyItemReportingMap = make(map[string]Basic.VerifyItem) // 实施
+	for _, item := range verifyItemList {
+		if item.T_type == Percentage.SchemeType {
+			verifyItemSchemeMap[item.T_name] = item
+		}
+		if item.T_type == Percentage.ReportingType {
+			verifyItemReportingMap[item.T_name] = item
+		}
+	}
+	return verifyItemSchemeMap, verifyItemReportingMap
+}
+
+func GetColdVerifyUUIDMap() (uuidMap map[string]string) {
+	uuidMap = make(map[string]string)
+	userList, _ := NatsServer.Read_User_List_All()
+	for _, user := range userList {
+		uuidMap[user.T_verify_cold_uuid] = user.T_uuid
+	}
+	return uuidMap
+}
+
+// 获取实施提成金额
+func GetPercentageMoney(T_device_type, T_verify_type string, verifyItemMap map[string]Basic.VerifyItem) (money Basic.VerifyItem) {
+	if strings.Contains(T_device_type, "箱") {
+		return verifyItemMap["保温箱"]
+	}
+	if strings.Contains(T_device_type, "车") {
+		if strings.Contains(T_verify_type, "空载") {
+			return verifyItemMap["冷藏车(空载)"]
+		} else {
+			return verifyItemMap["冷藏车(满载)"]
+		}
+	}
+	if strings.Contains(T_device_type, "柜") {
+		if strings.Contains(T_verify_type, "空载") {
+			return verifyItemMap["冷库(空载)"]
+		} else {
+			return verifyItemMap["冷库(满载)"]
+		}
+	}
+	if strings.Contains(T_device_type, "库") {
+		if strings.Contains(T_verify_type, "空载") {
+			return verifyItemMap["冷库(空载)"]
+		} else {
+			return verifyItemMap["冷库(满载)"]
+		}
+	}
+	if strings.Contains(T_device_type, "系统验证") {
+		return verifyItemMap["系统验证"]
+	}
+	if strings.Contains(T_device_type, "位置") {
+		return verifyItemMap["位置"]
+	}
+	return Basic.VerifyItem{}
+}
+
+func (c *PercentageController) VerifyCompany_List() {
+
+	// 分页参数 初始化
+	page, _ := c.GetInt("page")
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+
+	// 查询
+	T_name := c.GetString("T_name")
+	T_state, _ := c.GetInt("T_state")
+
+	R_List, R_cnt := Percentage.Read_VerifyCompany_List(T_name, T_state, page, page_z)
+
+	var r_jsons lib.R_JSONS
+	r_jsons.Num = R_cnt
+	r_jsons.Data = R_List
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(R_cnt) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+func (c *PercentageController) VerifyCompany_Add() {
+
+	T_name := c.GetString("T_name")
+	T_State, _ := c.GetInt("T_State") // 总价
+
+	var_ := Percentage.VerifyCompany{
+		T_name:  T_name,
+		T_State: T_State,
+	}
+
+	if _, is := Percentage.Read_VerifyCompanyByT_name(T_name); is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "公司名称重复!"}
+		c.ServeJSON()
+		return
+	}
+
+	Id, is := Percentage.Add_VerifyCompany(var_)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "验证公司", "添加", var_)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Id}
+	c.ServeJSON()
+	return
+}
+func (c *PercentageController) VerifyCompany_Edit() {
+
+	T_uuid := c.GetString("T_uuid")
+	T_State, _ := c.GetInt("T_State") // 总价
+
+	company, is := Percentage.Read_VerifyCompany(T_uuid)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询验证公司失败"}
+		c.ServeJSON()
+		return
+	}
+	if T_State > 0 {
+		company.T_State = T_State
+		if !Percentage.Update_VerifyCompany(company, "T_State") {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改验证公司失败"}
+			c.ServeJSON()
+			return
+		}
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "验证公司", "修改", company)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: company.T_uuid}
+	c.ServeJSON()
+	return
+}
+func (c *PercentageController) VerifyCompany_Del() {
+
+	T_uuid := c.GetString("T_uuid")
+
+	company, is := Percentage.Read_VerifyCompany(T_uuid)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询验证公司失败"}
+		c.ServeJSON()
+		return
+	}
+
+	if !Percentage.Delete_VerifyCompany(company) {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除验证公司失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "验证公司", "删除", company.T_uuid)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: company.T_uuid}
+	c.ServeJSON()
+	return
+}

+ 1 - 0
controllers/RepairWorkOrder.go

@@ -0,0 +1 @@
+package controllers

+ 20 - 9
controllers/Stock.go

@@ -70,6 +70,7 @@ func (c *StockController) Device_Check() {
 
 	T_sn := c.GetString("T_sn")
 	T_type, _ := c.GetInt("T_type") //1-出库 2-入库
+	T_product_id, _ := c.GetInt("T_product_id")
 
 	DeviceDao := Stock.NewDevice(orm.NewOrm())
 	device, err := DeviceDao.Read_Device_ByT_sn(T_sn)
@@ -105,6 +106,11 @@ func (c *StockController) Device_Check() {
 			c.ServeJSON()
 			return
 		}
+		if device.T_product_id != T_product_id {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "入库产品与出库产品不一致,请检查!"}
+			c.ServeJSON()
+			return
+		}
 	}
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
@@ -415,13 +421,14 @@ func (c *StockController) StockIn_List() {
 	T_depot_id, _ := c.GetInt("T_depot_id")
 	T_start_date := c.GetString("T_start_date")
 	T_end_date := c.GetString("T_end_date")
+	T_name := c.GetString("T_name")
 
 	userList, _ := NatsServer.Read_User_List_All()
 	Account.Read_User_All_Map(userList)
 	Basic.Read_Depot_All_Map()
 
 	StockInDao := Stock.NewStockIn(orm.NewOrm())
-	R_List, R_cnt := StockInDao.Read_StockIn_List(T_depot_id, T_start_date, T_end_date, page, page_z)
+	R_List, R_cnt := StockInDao.Read_StockIn_List(T_name, T_depot_id, T_start_date, T_end_date, page, page_z)
 
 	var r_jsons lib.R_JSONS
 	r_jsons.Num = R_cnt
@@ -1628,10 +1635,11 @@ func (c *StockController) StockIn_Excel_Batch() {
 
 			// 空一行
 			row += 1
-			f.MergeCell("Sheet1", fmt.Sprintf("A%d", row), fmt.Sprintf("F%d", row))
-			f.SetRowStyle("Sheet1", row, row, Style1)
-			f.SetCellValue("Sheet1", fmt.Sprintf("A%d", row), "")
-
+			//f.MergeCell("Sheet1", fmt.Sprintf("A%d", row), fmt.Sprintf("F%d", row))
+			//f.SetRowStyle("Sheet1", row, row, Style1)
+			//f.SetCellValue("Sheet1", fmt.Sprintf("A%d", row), "")
+			// 插入下一页分页符
+			f.InsertPageBreak("Sheet1", fmt.Sprintf("A%d", row))
 		}
 	}
 
@@ -1676,13 +1684,14 @@ func (c *StockController) StockOut_List() {
 	T_contract_number := c.GetString("T_contract_number")
 	T_start_date := c.GetString("T_start_date")
 	T_end_date := c.GetString("T_end_date")
+	T_name := c.GetString("T_name")
 
 	userList, _ := NatsServer.Read_User_List_All()
 	Account.Read_User_All_Map(userList)
 	Basic.Read_Depot_All_Map()
 
 	StockOutDao := Stock.NewStockOut(orm.NewOrm())
-	R_List, R_cnt := StockOutDao.Read_StockOut_List(T_depot_id, T_contract_number, T_start_date, T_end_date, page, page_z)
+	R_List, R_cnt := StockOutDao.Read_StockOut_List(T_name, T_depot_id, T_contract_number, T_start_date, T_end_date, page, page_z)
 
 	var r_jsons lib.R_JSONS
 	r_jsons.Num = R_cnt
@@ -2964,10 +2973,12 @@ func (c *StockController) StockOut_Excel_Batch() {
 
 			// 空一行
 			row += 1
-			f.MergeCell("Sheet1", fmt.Sprintf("A%d", row), fmt.Sprintf("F%d", row))
-			f.SetRowStyle("Sheet1", row, row, Style1)
-			f.SetCellValue("Sheet1", fmt.Sprintf("A%d", row), "")
+			//f.MergeCell("Sheet1", fmt.Sprintf("A%d", row), fmt.Sprintf("F%d", row))
+			//f.SetRowStyle("Sheet1", row, row, Style1)
+			//f.SetCellValue("Sheet1", fmt.Sprintf("A%d", row), "")
 
+			// 插入下一页分页符
+			f.InsertPageBreak("Sheet1", fmt.Sprintf("A%d", row))
 		}
 	}
 

+ 8 - 6
go.mod

@@ -6,13 +6,15 @@ require (
 	github.com/astaxie/beego v1.12.3
 	github.com/beego/beego/v2 v2.0.7
 	github.com/bytedance/go-tagexpr/v2 v2.9.11
+	github.com/go-resty/resty/v2 v2.16.5
 	github.com/go-sql-driver/mysql v1.7.0
 	github.com/nats-io/nats.go v1.23.0
 	github.com/robfig/cron/v3 v3.0.1
+	github.com/satori/go.uuid v1.2.0
 	github.com/smartystreets/goconvey v1.8.1
 	github.com/vmihailenco/msgpack/v5 v5.3.5
 	github.com/xuri/excelize/v2 v2.9.0
-	gogs.baozhida.cn/zoie/ERP_libs v0.0.0-20241029034120-31ca607abb2e
+	gogs.baozhida.cn/zoie/ERP_libs v0.0.0-20250421082929-038047d473e1
 	gorm.io/driver/mysql v1.5.7
 	gorm.io/gorm v1.25.11
 )
@@ -55,11 +57,11 @@ require (
 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
 	github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d // indirect
 	github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect
-	golang.org/x/crypto v0.28.0 // indirect
-	golang.org/x/net v0.30.0 // indirect
-	golang.org/x/sync v0.8.0 // indirect
-	golang.org/x/sys v0.26.0 // indirect
-	golang.org/x/text v0.19.0 // indirect
+	golang.org/x/crypto v0.31.0 // indirect
+	golang.org/x/net v0.33.0 // indirect
+	golang.org/x/sync v0.10.0 // indirect
+	golang.org/x/sys v0.28.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
 	google.golang.org/protobuf v1.34.2 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect

+ 17 - 13
go.sum

@@ -105,6 +105,8 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+
 github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
 github.com/go-playground/validator/v10 v10.8.0/go.mod h1:9JhgTzTaE31GZDpH/HSvHiRJrJ3iKAgqqH0Bl/Ocjdk=
 github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
+github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM=
+github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
 github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
@@ -298,6 +300,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
 github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
 github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
 github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=
 github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
@@ -351,8 +355,8 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-gogs.baozhida.cn/zoie/ERP_libs v0.0.0-20241029034120-31ca607abb2e h1:sUbmO6gD9GcYjW1abZ2Brfw5xay2a3R6KlSVy7+QE4I=
-gogs.baozhida.cn/zoie/ERP_libs v0.0.0-20241029034120-31ca607abb2e/go.mod h1:wS/rgL1FkdfMsCwKpwG04dZtG4SOFcBADi4lxHN7UeM=
+gogs.baozhida.cn/zoie/ERP_libs v0.0.0-20250421082929-038047d473e1 h1:Tc4YfrvTkAXhHK2JyTn4kbmyHUH+evXF7M7FYEjZXno=
+gogs.baozhida.cn/zoie/ERP_libs v0.0.0-20250421082929-038047d473e1/go.mod h1:wS/rgL1FkdfMsCwKpwG04dZtG4SOFcBADi4lxHN7UeM=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -362,8 +366,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
-golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -428,8 +432,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
-golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -446,8 +450,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
-golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -491,8 +495,8 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -502,12 +506,12 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
-golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=

+ 2 - 0
main.go

@@ -9,6 +9,7 @@ import (
 	_ "ERP_storage/models/Account"
 	"ERP_storage/models/Basic"
 	_ "ERP_storage/models/Contract"
+	_ "ERP_storage/models/Percentage"
 	_ "ERP_storage/models/Property"
 	_ "ERP_storage/models/Stock"
 	_ "ERP_storage/models/validationtool"
@@ -76,6 +77,7 @@ func main() {
 	//go controllers.Cron_Device_Add()      // 重写设备表 只执行一次
 	go controllers.CheckPowerUniformity() // 检查角色是否与用户系统一致,不存在则添加
 	//go controllers.Cron_StockMonth_Add()  // 统计库存明细,测试使用
+	go controllers.Cron_Percentage() // 同步冷链验证公司,每日执行一次
 	beego.Run()
 
 }

+ 3 - 1
models/Basic/VerifyItem.go

@@ -2,11 +2,11 @@ package Basic
 
 import (
 	"ERP_storage/logs"
-	"gogs.baozhida.cn/zoie/ERP_libs/lib"
 	_ "github.com/astaxie/beego/cache/redis"
 	"github.com/beego/beego/v2/adapter/orm"
 	orm2 "github.com/beego/beego/v2/client/orm"
 	_ "github.com/go-sql-driver/mysql"
+	"gogs.baozhida.cn/zoie/ERP_libs/lib"
 	"sync"
 )
 
@@ -17,6 +17,8 @@ type VerifyItem struct {
 	T_type  int     `orm:"size(2);default(1)"`     // 类型 1-验证实施 2-报告编写
 	T_price float32 `orm:"digits(12);decimals(2)"` // 单价
 	T_State int     `orm:"size(2);default(1)"`     // 0 删除(伪删除)   1 正常
+	T_cell  string  `orm:"size(256);null"`         // 导出表格所在列
+
 }
 
 func (t *VerifyItem) TableName() string {

+ 28 - 17
models/IOTNetworkCard/IOTNetworkCard.go

@@ -1,6 +1,7 @@
 package IOTNetworkCard
 
 import (
+	"ERP_storage/models/Account"
 	"encoding/json"
 	orm2 "github.com/beego/beego/v2/client/orm"
 	"gogs.baozhida.cn/zoie/ERP_libs/lib"
@@ -43,20 +44,22 @@ type IOTNetworkCard struct {
 	T_meal        string    `orm:"size(256);null"`                                        // 套餐类型
 	T_expire      string    `orm:"size(256);null"`                                        // 到期&欠费
 	T_iccid       string    `orm:"size(256);null"`                                        // 串码
-	T_MSISDN      string    `orm:"size(256);null"`                                        // MSISDN
+	T_MSISDN      string    `orm:"size(256);null;column(t_msisdn);"`                      // MSISDN
 	T_out_project string    `orm:"size(256);null"`                                        // 出库项目
 	T_record      string    `orm:"type(text);null"`                                       // 出入库记录
+	T_remark      string    `orm:"type(text);null"`                                       // 备注
 	T_receive     string    `orm:"size(256);null"`                                        // 领取人
-	T_State       int       `orm:"size(2);default(1)"`                                    // 0 删除(伪删除)  1-新卡入库 2-退还入库 3-已出库 4-损坏退还 5-待注销 6-已注销
+	T_State       int       `orm:"size(2);default(1);column(t_state);"`                   // 0 删除(伪删除)  1-新卡入库 2-退还入库 3-已出库 4-损坏退还 5-待注销 6-已注销
 	CreateTime    time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
 	UpdateTime    time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
 }
 
 type IOTNetworkCardRecord struct {
-	T_data       string //日期
-	T_State      int
-	T_State_name string
-	T_remark     string
+	T_data        string //日期
+	T_State       int
+	T_State_name  string
+	T_out_project string
+	T_remark      string
 }
 
 func (t *IOTNetworkCard) TableName() string {
@@ -77,17 +80,21 @@ func init() {
 }
 
 type IOTNetworkCard_R struct {
-	Id            int
-	T_in_date     string                 // 入库日期
-	T_out_date    string                 // 出库日期
-	T_meal_type   string                 // 套餐类型
-	T_expire      string                 // 到期&欠费
-	T_iccid       string                 // 串码
-	T_MSISDN      string                 // MSISDN
-	T_out_project string                 // 出库项目
-	T_record      []IOTNetworkCardRecord // 出入库记录
-	T_State       int
-	T_State_name  string
+	Id             int
+	T_in_date      string                 // 入库日期
+	T_out_date     string                 // 出库日期
+	T_meal_type    string                 // 套餐类型
+	T_meal         string                 // 套餐
+	T_expire       string                 // 到期&欠费
+	T_iccid        string                 // 串码
+	T_MSISDN       string                 // MSISDN
+	T_out_project  string                 // 出库项目
+	T_record       []IOTNetworkCardRecord // 出入库记录
+	T_State        int
+	T_State_name   string
+	T_receive      string
+	T_receive_name string
+	T_remark       string
 }
 
 func IOTNetworkCardToIOTNetworkCard_R(t IOTNetworkCard) (r IOTNetworkCard_R) {
@@ -95,6 +102,7 @@ func IOTNetworkCardToIOTNetworkCard_R(t IOTNetworkCard) (r IOTNetworkCard_R) {
 	r.T_in_date = t.T_in_date
 	r.T_out_date = t.T_out_date
 	r.T_meal_type = t.T_meal_type
+	r.T_meal = t.T_meal
 	r.T_expire = t.T_expire
 	r.T_iccid = t.T_iccid
 	r.T_MSISDN = t.T_MSISDN
@@ -112,6 +120,9 @@ func IOTNetworkCardToIOTNetworkCard_R(t IOTNetworkCard) (r IOTNetworkCard_R) {
 	r.T_record = list
 	r.T_State = t.T_State
 	r.T_State_name = IOTNetworkCardStateMap[t.T_State]
+	r.T_receive = t.T_receive
+	r.T_remark = t.T_remark
+	r.T_receive_name = Account.Read_User_T_name_Get(t.T_receive)
 	return r
 }
 

+ 173 - 99
models/Percentage/Percentage.go

@@ -4,7 +4,6 @@ import (
 	"ERP_storage/logs"
 	"ERP_storage/models/Account"
 	"ERP_storage/models/Basic"
-	"ERP_storage/models/Contract"
 	"encoding/json"
 	"fmt"
 	orm2 "github.com/beego/beego/v2/client/orm"
@@ -37,6 +36,8 @@ var (
 		RemitAll:    "全部打款",
 		NotSubmit:   "未提交审核",
 	}
+	SchemeType    = 1
+	ReportingType = 2
 )
 
 func Read_Audit_Get(Id int) string {
@@ -50,18 +51,23 @@ func Read_Audit_Get(Id int) string {
 
 // 提成
 type Percentage struct {
-	Id                 int     `orm:"column(ID);size(11);auto;pk"`
-	T_number           string  `orm:"size(256);null"`         // 合同编号
-	T_uuid             string  `orm:"size(256);null"`         // 提成人员uuid
-	T_money            float32 `orm:"digits(12);decimals(2)"` // 提成金额
-	T_type             int     `orm:"size(2);default(1)"`     // 类型 1-验证实施 2-报告编写
-	T_State            int     `orm:"size(2);default(1)"`     // 0 删除(伪删除)  1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款 6-未提交审核 审核状态
-	T_submit           string  `orm:"size(256);null"`         // 提成提交人员
-	T_remit            string  `orm:"type(text);null"`        // 打款信息 打款时间,打款金额|打款时间,打款金额|
-	T_item             string  `orm:"type(text);null"`        // 提成明细 验证项目id,数量|验证项目id,数量|
-	T_item_price       string  `orm:"type(text);null"`        // 提成明细 {验证项目id:金额,验证项目id:金额,验证项目id:金额}
-	T_approval_money   float32 `orm:"digits(12);decimals(2)"` // 审批金额
-	T_approval_opinion string  `orm:"type(text);null"`        // 审批意见
+	Id                    int     `orm:"column(ID);size(11);auto;pk"`
+	T_Distributor_id      string  `orm:"size(256);column(t_distributor_id);null"` // 分销商id
+	T_task_id             string  `orm:"size(256);null"`                          // 任务id
+	T_task_name           string  `orm:"size(256);null"`                          // 任务名称
+	T_task_int_id         int     `orm:"size(256);null"`                          // 任务id
+	T_device_type         string  `orm:"size(256);null"`                          // 设备类型
+	T_verify_type         string  `orm:"size(256);null"`                          // 验证类型
+	T_company_uuid        string  `orm:"size(256);null"`                          // 提成公司uuid
+	T_uuid                string  `orm:"size(256);null"`                          // 提成人员uuid
+	T_money               float32 `orm:"digits(12);decimals(2)"`                  // 提成金额
+	T_type                int     `orm:"size(2);default(1)"`                      // 类型 1-验证实施 2-报告编写
+	T_State               int     `orm:"size(2);column(t_state);default(1)"`      // 0 删除(伪删除)  1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款 6-未提交审核 审核状态
+	T_verify_item         int     `orm:"size(2);default(1)"`                      // 提成项目id
+	T_reporting_pass_time string  `orm:"size(256);null"`                          // 验证报告负责人通过时间
+	T_remit               string  `orm:"type(text);null"`                         // 打款信息 打款时间,打款金额|打款时间,打款金额|
+	T_approval_money      float32 `orm:"digits(12);decimals(2)"`                  // 审批金额
+	T_approval_opinion    string  `orm:"type(text);null"`                         // 审批意见
 
 	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
 	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
@@ -85,42 +91,51 @@ func init() {
 }
 
 type Percentage_R struct {
-	Id               int
-	T_number         string  // 合同编号
-	T_customer       string  // 客户名称
-	T_contract_money float32 // 合同金额
-	T_approval_money float32 // 合同金额
-	T_discount       float32 // 合同优惠价
+	Id int
+
+	T_Distributor_id      string
+	T_task_id             string
+	T_device_type         string
+	T_verify_type         string
+	T_company_uuid        string
+	T_task_name           string
+	T_reporting_pass_time string
+
 	T_uuid           string  // 提成人员uuid
+	T_uuid_name      string  // 提成人员uuid
+	T_money          float32 // 提成金额
+	T_type           int     // 类型 1-验证实施 2-报告编写
+	T_approval_money float32 // 审批金额
+	T_send_money     float32 // 提成已打款金额
+	T_State          int     // 0 删除(伪删除)  1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款 6-未提交审核 审核状态
+	T_verify_item    int
+	T_verifyCompany  VerifyCompany_R // 验证公司信息
 
-	T_uuid_name        string  // 提成人员uuid
-	T_money            float32 // 提成金额
-	T_recoveries_money float32 // 审批金额
-	T_send_money       float32 // 提成已打款金额
-	T_type             int     // 类型 1-验证实施 2-报告编写
-	T_State            int     // 0 删除(伪删除)  1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款 6-未提交审核 审核状态
 }
 
 type Percentage_Detail struct {
-	Id               int
-	T_number         string                       // 合同编号
-	T_customer       string                       // 客户名称
-	T_contract_money float32                      // 合同金额
-	T_discount       float32                      // 合同优惠价
-	T_Product        []Contract.ContractProduct_R // 合同产品信息
-	T_uuid           string                       // 提成人员uuid
-
-	T_uuid_name string // 提成人员uuid
-
+	Id int
+
+	T_Distributor_id      string
+	T_task_id             string
+	T_device_type         string
+	T_verify_type         string
+	T_company_uuid        string
+	T_task_name           string
+	T_reporting_pass_time string
+
+	T_uuid             string              // 提成人员uuid
+	T_uuid_name        string              // 提成人员uuid
 	T_money            float32             // 提成金额
-	T_recoveries_money float32             // 审批金额
 	T_approval_money   float32             // 审批金额
 	T_approval_opinion string              // 审批意见
 	T_State            int                 // 0 删除(伪删除)  1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款 6-未提交审核 审核状态
 	T_type             int                 // 类型 1-验证实施 2-报告编写
 	T_remit            []PercentageRemit_R // 提成打款明细 打款时间,打款金额|打款时间,打款金额|
 	T_send_money       float32             // 提成已打款金额
-	T_item             []PercentageItem_R  // 提成明细 验证项目id,数量|验证项目id,数量|
+	T_verify_item      int
+
+	T_verifyCompany VerifyCompany_R // 验证公司信息
 }
 
 // 提成打款明细
@@ -137,6 +152,30 @@ type PercentageItem_R struct {
 	T_price float32 //  金额
 }
 
+type VerifyTask struct {
+	Id                int    `orm:"column(ID);size(11);auto;pk"`
+	T_Distributor_id  string `orm:"size(256);null"`     // 分销商id
+	T_task_id         string `orm:"size(256);null"`     // 任务ID
+	T_uuid            string `orm:"size(256);null"`     // 用户 UUID
+	T_name            string `orm:"size(256);null"`     // 标题
+	T_scheme          string `orm:"size(256);null"`     // 实施方案 负责人UUID
+	T_collection      string `orm:"size(256);null"`     // 数据采集 负责人UUID
+	T_reporting       string `orm:"size(256);null"`     // 报告编写 负责人UUID
+	T_delivery        string `orm:"size(256);null"`     // 交付审核 负责人UUID
+	T_scheme_state    int    `orm:"size(2);default(0)"` // 实施方案 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
+	T_reporting_state int    `orm:"size(2);default(0)"` // 报告编写 状态 0 未完成 1 已完成(客户通过) 2已退回(客户) 3已通过(负责人) 4已退回(负责人) 5已提交
+
+	T_State int `orm:"size(2);default(1)"` // 0 删除   1 正常
+
+	T_device_type string `orm:"size(256);null"` // 设备类型
+	T_verify_type string `orm:"size(256);null"` // 验证类型
+
+	T_reporting_pass_time string `orm:"size(256);null"` // 验证报告负责人通过时间
+
+	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
+	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
+}
+
 func PercentageToPercentageRemit_R(T_detail string) (r []PercentageRemit_R, money float32) {
 
 	if len(T_detail) == 0 {
@@ -156,48 +195,21 @@ func PercentageToPercentageRemit_R(T_detail string) (r []PercentageRemit_R, mone
 	}
 	return r, money
 }
-func PercentageToPercentageItem_R(T_item string, priceMap map[int]float32, T_State int) (r []PercentageItem_R) {
-
-	if len(T_item) == 0 {
-		return
-	}
-	detailList := strings.Split(strings.Trim(T_item, "|"), "|")
-	for _, detail := range detailList {
-		T_id := lib.To_int(strings.Split(detail, ",")[0])
-		T_num := lib.To_int(strings.Split(detail, ",")[1])
-		verifyItem := Basic.Read_VerifyItem_Get(T_id)
-		// 1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款 6-未提交审核 审核状态
-		var price float32
-		if T_State == 6 {
-			price = verifyItem.T_price
-		} else {
-			price, _ = priceMap[T_id]
-		}
-		r = append(r, PercentageItem_R{
-			T_id:    T_id,
-			T_num:   T_num,
-			T_price: price,
-			T_name:  verifyItem.T_name,
-		})
-
-	}
-	return r
-}
 
 func PercentageToPercentage_R(t Percentage) (r Percentage_R) {
 	r.Id = t.Id
-	r.T_number = t.T_number
-	contract := Contract.Read_Contract_Get(t.T_number)
-	//1-销售合同 2-验证合同
-	if contract.T_type == 1 {
-		r.T_customer = contract.T_customer
-	}
-	if contract.T_type == 2 {
-		r.T_customer = Contract.Read_VerifyContract_Get(contract.T_customer_id)
+	r.T_Distributor_id = t.T_Distributor_id
+	r.T_task_id = t.T_task_id
+	r.T_task_name = t.T_task_name
+	r.T_device_type = t.T_device_type
+	r.T_verify_type = t.T_verify_type
+	r.T_company_uuid = t.T_company_uuid
+	if len(t.T_reporting_pass_time) > 0 {
+		r.T_reporting_pass_time = t.T_reporting_pass_time[:10]
 	}
-	r.T_contract_money = contract.T_money
-	r.T_discount = contract.T_discount
-	r.T_recoveries_money = contract.T_recoveries_money
+
+	r.T_verify_item = t.T_verify_item
+	r.T_verifyCompany = Read_VerifyCompany_Get(t.T_company_uuid)
 
 	r.T_uuid = t.T_uuid
 	r.T_uuid_name = Account.Read_User_T_name_Get(t.T_uuid)
@@ -209,20 +221,19 @@ func PercentageToPercentage_R(t Percentage) (r Percentage_R) {
 	return r
 }
 
-func PercentageToPercentage_Detail(t Percentage, contract Contract.Contract, productList []Contract.ContractProduct_R) (r Percentage_Detail) {
+func PercentageToPercentage_Detail(t Percentage) (r Percentage_Detail) {
 	r.Id = t.Id
-	r.T_number = t.T_number
-	if contract.T_type == 1 {
-		r.T_customer = contract.T_customer
-	}
-	if contract.T_type == 2 {
-		r.T_customer = Contract.Read_VerifyContract_Get(contract.T_customer_id)
-	}
-	r.T_contract_money = contract.T_money
-	r.T_discount = contract.T_discount
-	r.T_recoveries_money = contract.T_recoveries_money
-
-	r.T_Product = productList
+	r.T_Distributor_id = t.T_Distributor_id
+	r.T_task_id = t.T_task_id
+	r.T_task_name = t.T_task_name
+	r.T_device_type = t.T_device_type
+	r.T_verify_type = t.T_verify_type
+	r.T_company_uuid = t.T_company_uuid
+	if len(t.T_reporting_pass_time) > 0 {
+		r.T_reporting_pass_time = t.T_reporting_pass_time[:10]
+	}
+	r.T_verify_item = t.T_verify_item
+	r.T_verifyCompany = Read_VerifyCompany_Get(t.T_company_uuid)
 
 	r.T_uuid = t.T_uuid
 	r.T_uuid_name = Account.Read_User_T_name_Get(t.T_uuid)
@@ -232,8 +243,6 @@ func PercentageToPercentage_Detail(t Percentage, contract Contract.Contract, pro
 	r.T_remit, r.T_send_money = PercentageToPercentageRemit_R(t.T_remit)
 	r.T_type = t.T_type
 	r.T_State = t.T_State
-	price := Get_VerifyItem_Price(t.T_item_price)
-	r.T_item = PercentageToPercentageItem_R(t.T_item, price, t.T_State)
 
 	return r
 }
@@ -248,10 +257,10 @@ func (dao *PercentageDaoImpl) Add_Percentage(r Percentage) (id int64, err error)
 }
 
 // 获取 ById
-func (dao *PercentageDaoImpl) Read_Percentage_ByT_number_T_type(T_number string, T_type int) (r Percentage, err error) {
+func (dao *PercentageDaoImpl) Read_Percentage_ByT_T_task_id_T_type(T_task_id string, T_type int) (r Percentage, err error) {
 	qs := dao.orm.QueryTable(new(Percentage))
 
-	err = qs.Filter("T_number", T_number).Filter("T_type", T_type).Filter("T_State__gt", 0).One(&r)
+	err = qs.Filter("T_task_id", T_task_id).Filter("T_type", T_type).Filter("T_State__gt", 0).One(&r)
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
 	}
@@ -288,7 +297,7 @@ func (dao *PercentageDaoImpl) Delete_Percentage(v Percentage) error {
 }
 
 // 获取列表
-func (dao *PercentageDaoImpl) Read_Percentage_List(T_name, T_uuid string, T_state, page, page_z int) (r_ []Percentage_R, cnt int64) {
+func (dao *PercentageDaoImpl) Read_Percentage_List(T_name, T_uuid, T_start_date, T_end_date string, T_company_list []string, T_state, T_type, page, page_z int) (r_ []Percentage_R, cnt int64) {
 	// 也可以直接使用 Model 结构体作为表名
 	qs := dao.orm.QueryTable(new(Percentage))
 	var offset int64
@@ -308,15 +317,74 @@ func (dao *PercentageDaoImpl) Read_Percentage_List(T_name, T_uuid string, T_stat
 	}
 
 	if len(T_name) > 0 {
-		cond1 = cond1.And("T_number__icontains", T_name)
+		cond1 = cond1.AndCond(cond1.Or("T_task_id__icontains", T_name).Or("T_company_uuid__in", T_company_list))
+	}
+	if len(T_uuid) > 0 {
+		cond1 = cond1.And("T_uuid", T_uuid)
+	}
+	if T_type > 0 {
+		cond1 = cond1.And("T_type", T_type)
+	}
+	if len(T_start_date) > 0 {
+		cond1 = cond1.And("T_reporting_pass_time__gte", T_start_date+" 00:00:00")
+	}
+
+	if len(T_start_date) > 0 {
+		cond1 = cond1.And("T_reporting_pass_time__lte", T_end_date+" 23:59:59")
+	}
+	// 查询
+	var r []Percentage
+	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("T_State", "-T_task_int_id").All(&r)
+
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	for _, v := range r {
+		r_ = append(r_, PercentageToPercentage_R(v))
+	}
+
+	return r_, cnt
+}
+func (dao *PercentageDaoImpl) Read_Percentage_List_For_Excel(T_name, T_uuid, T_start_date, T_end_date string, T_company_list []string, T_state, T_type int) (r_ []Percentage_R, cnt int64) {
+	// 也可以直接使用 Model 结构体作为表名
+	qs := dao.orm.QueryTable(new(Percentage))
+
+	// 过滤
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_State__gt", 0)
+	if T_state > 0 {
+		cond1 = cond1.And("T_State", T_state)
+	} else {
+		cond1 = cond1.AndNot("T_State", 6)
+	}
+
+	if len(T_name) > 0 {
+		cond1 = cond1.AndCond(cond1.Or("T_task_id__icontains", T_name).Or("T_company_uuid__in", T_company_list))
 	}
 	if len(T_uuid) > 0 {
 		cond1 = cond1.And("T_uuid", T_uuid)
 	}
+	if T_type > 0 {
+		cond1 = cond1.And("T_type", T_type)
+	}
+	if len(T_start_date) > 0 {
+		cond1 = cond1.And("T_reporting_pass_time__gte", T_start_date+" 00:00:00")
+	}
 
+	if len(T_end_date) > 0 {
+		cond1 = cond1.And("T_reporting_pass_time__lte", T_end_date+" 23:59:59")
+	}
 	// 查询
 	var r []Percentage
-	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("T_State").All(&r)
+	_, err := qs.SetCond((*orm2.Condition)(cond1)).OrderBy("T_company_uuid", "T_task_int_id").All(&r)
 
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
@@ -335,7 +403,7 @@ func (dao *PercentageDaoImpl) Read_Percentage_List(T_name, T_uuid string, T_stat
 
 	return r_, cnt
 }
-func (dao *PercentageDaoImpl) Read_Percentage_User_List(T_uuid, T_name string, T_state, page, page_z int) (r_ []Percentage_R, cnt int64) {
+func (dao *PercentageDaoImpl) Read_Percentage_User_List(T_uuid, T_name, T_start_date, T_end_date string, T_company_list []string, T_state, page, page_z int) (r_ []Percentage_R, cnt int64) {
 	// 也可以直接使用 Model 结构体作为表名
 	qs := dao.orm.QueryTable(new(Percentage))
 	var offset int64
@@ -353,15 +421,21 @@ func (dao *PercentageDaoImpl) Read_Percentage_User_List(T_uuid, T_name string, T
 	}
 
 	if len(T_name) > 0 {
-		cond1 = cond1.And("T_number__icontains", T_name)
+		cond1 = cond1.AndCond(cond1.Or("T_task_id__icontains", T_name).Or("T_company_uuid__in", T_company_list))
 	}
 	if len(T_uuid) > 0 {
-		cond1 = cond1.AndCond(cond.Or("T_uuid", T_uuid).Or("T_submit", T_uuid))
+		cond1 = cond1.And("T_uuid", T_uuid)
+	}
+	if len(T_start_date) > 0 {
+		cond1 = cond1.And("T_reporting_pass_time__gte", T_start_date+" 00:00:00")
 	}
 
+	if len(T_end_date) > 0 {
+		cond1 = cond1.And("T_reporting_pass_time__lte", T_end_date+" 23:59:59")
+	}
 	// 查询
 	var r []Percentage
-	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
+	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_task_int_id").All(&r)
 
 	if err != nil {
 		logs.Error(lib.FuncName(), err)

+ 203 - 0
models/Percentage/verifyCompany.go

@@ -0,0 +1,203 @@
+package Percentage
+
+import (
+	"ERP_storage/logs"
+	"github.com/beego/beego/v2/adapter/orm"
+	orm2 "github.com/beego/beego/v2/client/orm"
+	_ "github.com/go-sql-driver/mysql"
+	uuid "github.com/satori/go.uuid"
+	"gogs.baozhida.cn/zoie/ERP_libs/lib"
+	"log"
+	"sync"
+	"time"
+)
+
+var VerifyCompanyMap *sync.Map // 泛型
+
+type VerifyCompany struct {
+	Id                 int       `orm:"column(ID);size(11);auto;pk"`
+	T_Distributor_id   string    `orm:"size(256);null"`                                        // 分销商id
+	T_Distributor_name string    `orm:"size(256);null"`                                        // 分销商id
+	T_uuid             string    `orm:"size(256);null"`                                        //
+	T_name             string    `orm:"size(256);null"`                                        // 某某公司名称 T_Show     int       `orm:"size(200);default(1)"`                                  // 0隐藏  1公开
+	T_State            int       `orm:"size(200);column(t_state);default(1)"`                  // 0删除  1未回款 2已回款
+	CreateTime         time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now 每次 model 保存时都会对时间自动更新
+	UpdateTime         time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now_add 第一次保存时才设置时间
+}
+type VerifyCompany_R struct {
+	T_uuid             string
+	T_name             string
+	T_Distributor_id   string
+	T_Distributor_name string
+	T_State            int
+}
+
+func (t *VerifyCompany) TableName() string {
+	return "verify_company" // 数据库名称   // ************** 替换 FormulaList **************
+}
+
+func init() {
+	//注册模型
+	orm.RegisterModel(new(VerifyCompany))
+	VerifyCompanyMap = new(sync.Map)
+
+}
+
+func Read_VerifyCompany_All_Map() {
+	var list []VerifyCompany
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(VerifyCompany))
+	_, err := qs.Filter("T_State__gt", 0).All(&list)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	for _, v := range list {
+		VerifyCompanyMap.Store(v.T_uuid, VerifyCompanyToVerifyCompany_R(v))
+	}
+}
+func Read_VerifyCompany_Get(T_uuid string) VerifyCompany_R {
+	v, ok := VerifyCompanyMap.Load(T_uuid)
+	if ok {
+		return v.(VerifyCompany_R)
+	} else {
+		return VerifyCompany_R{}
+	}
+}
+
+// -------------------------------------------------------------
+func VerifyCompanyToVerifyCompany_R(T VerifyCompany) (T_r VerifyCompany_R) {
+	T_r.T_uuid = T.T_uuid
+	T_r.T_Distributor_id = T.T_Distributor_id
+	T_r.T_Distributor_name = T.T_Distributor_name
+	T_r.T_name = T.T_name
+	T_r.T_State = T.T_State
+	return T_r
+}
+
+// 获取 By
+func Read_VerifyCompany(T_uuid string) (r VerifyCompany, is bool) {
+
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(VerifyCompany))
+	err := qs.Filter("T_uuid", T_uuid).Filter("T_State__gt", 0).One(&r)
+	if err != nil {
+		return r, false
+	}
+
+	return r, true
+}
+
+// 添加
+func Add_VerifyCompany(r VerifyCompany) (id int64, is bool) {
+	o := orm.NewOrm()
+	// 生成编号
+	rand_x := 0
+	if len(r.T_uuid) == 0 {
+		for true {
+			r.T_uuid = uuid.NewV4().String()
+			err := o.Read(&r, "T_uuid") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
+			if err != nil {
+				break
+			}
+			rand_x += 1
+		}
+	}
+
+	id, err := o.Insert(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return 0, false
+	}
+
+	return id, true
+}
+
+// 删除
+func Delete_VerifyCompany(v VerifyCompany) bool {
+	o := orm.NewOrm()
+	v.T_State = 0
+	if num, err := o.Update(&v, "T_State"); err == nil {
+		log.Println("Number of records updated in database:", num)
+	} else {
+		return false
+	}
+
+	return true
+}
+
+// 修改
+func Update_VerifyCompany(m VerifyCompany, cols ...string) bool {
+	o := orm.NewOrm()
+	if num, err := o.Update(&m, cols...); err == nil {
+		log.Println("Number of records updated in database:", num)
+
+		return true
+	}
+	return false
+}
+
+// 获取列表
+func Read_VerifyCompany_List(T_name string, T_State int, page int, page_z int) ([]VerifyCompany_R, int64) {
+	o := orm.NewOrm()
+
+	// 也可以直接使用 Model 结构体作为表名
+	var r []VerifyCompany
+	qs := o.QueryTable(new(VerifyCompany))
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_State__gt", 0).AndCond(cond.Or("T_name__icontains", T_name))
+
+	if T_State > 0 {
+		cond1 = cond.And("T_State", T_State)
+	}
+	if len(T_name) > 0 {
+		cond1 = cond1.AndCond(cond.Or("T_name__icontains", T_name).Or("T_Distributor_name__icontains", T_name))
+	}
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
+	cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()
+
+	// 转换
+	var VerifyCompany_r []VerifyCompany_R
+	for _, v := range r {
+		VerifyCompany_r = append(VerifyCompany_r, VerifyCompanyToVerifyCompany_R(v))
+	}
+
+	return VerifyCompany_r, cnt
+}
+
+func Read_VerifyCompany_T_uuid_ListByT_name(T_name string) (list []string) {
+	o := orm.NewOrm()
+
+	// 也可以直接使用 Model 结构体作为表名
+	var r []VerifyCompany
+	qs := o.QueryTable(new(VerifyCompany))
+
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_State__gt", 0).AndCond(cond.Or("T_name__icontains", T_name))
+	qs.SetCond((*orm2.Condition)(cond1)).All(&r)
+
+	// 转换
+	for _, v := range r {
+		list = append(list, v.T_uuid)
+	}
+
+	return list
+}
+
+// 获取 By T_name
+func Read_VerifyCompanyByT_name(T_name string) (r VerifyCompany, is bool) {
+
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(VerifyCompany))
+	err := qs.Filter("T_name", T_name).Filter("T_State__gt", 0).One(&r)
+	if err != nil {
+		return r, false
+	}
+
+	return r, true
+}

+ 25 - 0
models/RepairWorkOrder/RepairWorkOrder.go

@@ -0,0 +1,25 @@
+package RepairWorkOrder
+
+type RepairWorkOrder struct {
+	Id               int    `orm:"column(ID);size(11);auto;pk"`
+	T_order_date     string `orm:"size(20);null"`      // 下单日期
+	T_repai_date     string `orm:"size(20);null"`      // 维修日期
+	T_finish_date    string `orm:"size(20);null"`      // 完结日期
+	T_state          int    `orm:"size(2);default(1)"` // 1已派发 2维修中 3已完结
+	T_product        string `orm:"size(256);null"`     // 产品名称
+	T_model          string `orm:"size(256);null"`     // 产品型号
+	T_repair_num     int    `orm:"size(256);null"`     // 维修数量
+	T_source         string `orm:"size(256);null"`     // 设备来源
+	T_repair_reason  string `orm:"size(256);null"`     // 维修原因
+	T_picture        string `orm:"size(256);null"`     // 图片
+	T_receive        string `orm:"size(256);null"`     // 接收人
+	T_delivery       string `orm:"size(256);null"`     // 交付人
+	T_return         string `orm:"size(256);null"`     // 归还人
+	T_return_product string `orm:"size(256);null"`     // 归还产品名称
+	T_return_model   string `orm:"size(256);null"`     // 归还产品名称
+	T_return_num     int    `orm:"size(256);null"`     // 返回数量
+	T_staging_num    int    `orm:"size(256);null"`     // 暂存数量
+	T_scrap_num      int    `orm:"size(256);null"`     // 报废数量
+	T_remark         string `orm:"size(256);null"`     // 备注
+	T_sn             string `orm:"type(text);null"`    // sn
+}

+ 1 - 1
models/Stock/Stock.go

@@ -134,7 +134,7 @@ func (dao *StockDaoImpl) AddOrUpdate_Stock(T_depot_id, T_product_id, T_product_c
 		stock.T_total -= T_num
 		stock.T_reality -= T_num
 	}
-	if stock.T_total < 0 {
+	if stock.T_reality < 0 {
 		err = errors.New(fmt.Sprintf("%s%s库存不足", T_product_name, T_product_model))
 		logs.Error(lib.FuncName(), err.Error())
 		return

+ 5 - 2
models/Stock/StockIn.go

@@ -4,8 +4,8 @@ import (
 	"ERP_storage/models/Account"
 	"ERP_storage/models/Basic"
 	"fmt"
-	"gogs.baozhida.cn/zoie/ERP_libs/lib"
 	orm2 "github.com/beego/beego/v2/client/orm"
+	"gogs.baozhida.cn/zoie/ERP_libs/lib"
 	"strconv"
 	"time"
 
@@ -138,7 +138,7 @@ func (dao *StockInDaoImpl) Delete_StockIn(m StockIn) error {
 }
 
 // 获取列表
-func (dao *StockInDaoImpl) Read_StockIn_List(T_depot_id int, T_start_date, T_end_date string, page, page_z int) (r_ []StockIn_R, cnt int64) {
+func (dao *StockInDaoImpl) Read_StockIn_List(T_name string, T_depot_id int, T_start_date, T_end_date string, page, page_z int) (r_ []StockIn_R, cnt int64) {
 	qs := dao.orm.QueryTable(new(StockIn))
 	var offset int64
 	if page <= 1 {
@@ -154,6 +154,9 @@ func (dao *StockInDaoImpl) Read_StockIn_List(T_depot_id int, T_start_date, T_end
 		cond = cond.And("T_depot_id", T_depot_id)
 	}
 
+	if len(T_name) > 0 {
+		cond = cond.And("T_number__icontains", T_name)
+	}
 	if len(T_start_date) > 0 {
 		cond = cond.And("T_date__gte", T_start_date)
 	}

+ 5 - 2
models/Stock/StockOut.go

@@ -4,8 +4,8 @@ import (
 	"ERP_storage/models/Account"
 	"ERP_storage/models/Basic"
 	"fmt"
-	"gogs.baozhida.cn/zoie/ERP_libs/lib"
 	orm2 "github.com/beego/beego/v2/client/orm"
+	"gogs.baozhida.cn/zoie/ERP_libs/lib"
 	"strconv"
 	"strings"
 	"time"
@@ -170,7 +170,7 @@ func (dao *StockOutDaoImpl) Delete_StockOut(m StockOut) error {
 }
 
 // 获取列表
-func (dao *StockOutDaoImpl) Read_StockOut_List(T_depot_id int, T_contract_number, T_start_date, T_end_date string, page, page_z int) (r_ []StockOut_R, cnt int64) {
+func (dao *StockOutDaoImpl) Read_StockOut_List(T_name string, T_depot_id int, T_contract_number, T_start_date, T_end_date string, page, page_z int) (r_ []StockOut_R, cnt int64) {
 	qs := dao.orm.QueryTable(new(StockOut))
 	var offset int64
 	if page <= 1 {
@@ -185,6 +185,9 @@ func (dao *StockOutDaoImpl) Read_StockOut_List(T_depot_id int, T_contract_number
 	if T_depot_id > 0 {
 		cond = cond.And("T_depot_id", T_depot_id)
 	}
+	if len(T_name) > 0 {
+		cond = cond.And("T_number__icontains", T_name)
+	}
 	if len(T_contract_number) > 0 {
 		cond = cond.And("T_contract_number", T_contract_number)
 	}

+ 4 - 0
models/init.go

@@ -3,6 +3,8 @@ package models
 import (
 	db "ERP_storage/initialize"
 	"ERP_storage/models/ContractReview"
+	"ERP_storage/models/IOTNetworkCard"
+	"ERP_storage/models/Percentage"
 	"ERP_storage/models/validationtool"
 	_ "github.com/go-sql-driver/mysql"
 	"log"
@@ -22,6 +24,8 @@ func AutoMigrateDB() {
 			&ContractReview.ContractReviewServiceItem{},
 			&validationtool.ValidationTool{},
 			&validationtool.ValidationToolClass{},
+			&IOTNetworkCard.IOTNetworkCard{},
+			&Percentage.Percentage{},
 		)
 	if err != nil {
 		log.Fatalf("migrate db fail: %v", err)

+ 11 - 1
routers/Percentage.go

@@ -19,6 +19,16 @@ func init() {
 		beego.NSRouter("/Remit", &controllers.PercentageController{}, "*:Percentage_Remit"),               // 打款明细
 		beego.NSRouter("/User/List", &controllers.PercentageController{}, "*:User_List"),                  // 提成管理-员工搜索
 		beego.NSRouter("/Submit_Audit", &controllers.PercentageController{}, "*:Percentage_Submit_Audit"), // 提交审核
+		beego.NSRouter("/Export", &controllers.PercentageController{}, "*:Percentage_Export"),             // 导出提成统计表
+		beego.NSRouter("/User_Export", &controllers.PercentageController{}, "*:Percentage_User_Export"),   // 导出提成统计表
+		beego.NSRouter("/SyncVerify", &controllers.PercentageController{}, "*:Percentage_SyncVerify"),     // 导出提成统计表
 	)
-	beego.AddNamespace(percentage)
+
+	verifyCompany := beego.NewNamespace("/VerifyCompany",
+		beego.NSRouter("/List", &controllers.PercentageController{}, "*:VerifyCompany_List"), // 验证公司列表
+		beego.NSRouter("/Add", &controllers.PercentageController{}, "*:VerifyCompany_Add"),   // 修改验证公司
+		beego.NSRouter("/Edit", &controllers.PercentageController{}, "*:VerifyCompany_Edit"), // 修改验证公司
+		beego.NSRouter("/Del", &controllers.PercentageController{}, "*:VerifyCompany_Del"),   // 修改验证公司
+	)
+	beego.AddNamespace(percentage, verifyCompany)
 }

BIN
利达尔物联网卡统计模版.xlsx