Quellcode durchsuchen

add:维修工单

zoie vor 2 Monaten
Ursprung
Commit
e52a9b899b

+ 0 - 1
conf/app.conf

@@ -64,4 +64,3 @@ slow_threshold = 200
 maxlines = 10000
 
 ColdVerify_OpenApi_Host = "http://coldverifytest.coldbaozhida.com:9999/apiserver"
-# ColdVerify_OpenApi_Host = "https://coldverify-s.coldbaozhida.com/apiserver"

+ 1 - 10
conf/app_prod.conf

@@ -18,16 +18,6 @@ MysqlServer_Password = "cHFeFmxFhZJdijDn"
 MysqlServer_MaxIdleConnections = 100
 MysqlServer_MaxOpenConnections = 200
 
-# NatsSubj_Prefix = ""
-
-
-# Mysql 线上
-# MysqlServer_UrlPort = "127.0.0.1:3316"
-# MysqlServer_Database = "erp_storage"
-# MysqlServer_Username = "erp_storage"
-# MysqlServer_Password = "cHFeFmxFhZJdijDn"
-# MysqlServer_MaxIdleConnections = 100
-# MysqlServer_MaxOpenConnections = 200
 
 # Mysql Mqtt
 MysqlMqtt_UrlPort = "127.0.0.1:40306"
@@ -72,3 +62,4 @@ sqlloglevel = 4
 slow_threshold = 200
 # 每个文件保存的最大行数
 maxlines = 10000
+ColdVerify_OpenApi_Host = "https://coldverify-s.coldbaozhida.com/apiserver"

+ 66 - 0
conf/app_test.conf

@@ -0,0 +1,66 @@
+appname = ERP_storage
+HTTPPort = 6703
+runmode = dev
+Graceful = true
+EnableDocs = true
+copyrequestbody = true
+
+Sys_Name = "ERP_STORAGE"
+# Nats
+NatsServer_Url = "127.0.0.1:4223"
+NatsSubj_Prefix = "Test_"
+
+# Mysql 线上
+MysqlServer_UrlPort = "36.137.156.216:3306"
+MysqlServer_Database = "erp_storage_test"
+MysqlServer_Username = "erp_storage_test"
+MysqlServer_Password = "cHFeFmxFhZJdijDn"
+MysqlServer_MaxIdleConnections = 100
+MysqlServer_MaxOpenConnections = 200
+
+
+# Mysql Mqtt
+MysqlMqtt_UrlPort = "203.34.49.130:3306"
+MysqlMqtt_Database = "mqtt"
+MysqlMqtt_Username = "root"
+MysqlMqtt_Password = "yjwyEckZS7rE5H"
+MysqlMqtt_MaxIdleConnections = 100
+MysqlMqtt_MaxOpenConnections = 200
+
+# Redis
+Redis_address = "36.137.156.216:6379"
+Redis_password = ""
+Redis_dbNum = "2"
+
+FilterExcludeURL = "/Percentage/SyncVerify"
+FilterOnlyLoginCheckURL =
+
+# 消息通知前端页面跳转url
+ContractApprovalUrl = "/contract"
+VerifyContractUrl = "/contract"
+PercentageApprovalUrl = "/percentage"
+ContractReviewAuditUrl = "/contractReviewList"
+# 财务uuid
+FinanceUuid = "NeGSMvREXA8xDZWo6q1YjLHTm0dJg7zc"
+
+# 静态资源
+Qiniu_AccessKey = -8ezB_d-8-eUFTMvhOGbGzgeQRPeKQnaQ3DBcUxo
+Qiniu_SecretKey = KFhkYxTAJ2ZPN3ZS3euTsfWk8-C92rKgkhAMkDRN
+Qiniu_BUCKET = baozhida-erp
+Qiniu_Url = https://erposs.baozhida.cn/
+
+# 日志配置
+# 0-控制台输出 1-文件输出 2-文件和控制台输出
+adapter_type = 0
+# 文件最多保存多少天
+maxdays = 7
+# 日志级别 (0-紧急 1-报警 2-严重错误 3-错误 4-警告 5-注意 6-信息 7-调试)
+level = 7
+# SQL日志级别 (1-静音 2-错误 3-警告 4-信息). 注意: sql日志只在level大于等于5级别才会输出。
+sqlloglevel = 4
+# 慢SQL阈值(毫秒)。慢SQL会在sqlloglevel大于等于3时输出。
+slow_threshold = 200
+# 每个文件保存的最大行数
+maxlines = 10000
+
+ColdVerify_OpenApi_Host = "http://coldverifytest.coldbaozhida.com:9999/apiserver"

+ 2 - 2
controllers/Basic.go

@@ -172,8 +172,8 @@ func (c *BasicController) ProductClass_List() {
 
 	// 查询
 	T_name := c.GetString("T_name")
-
-	R_List, R_cnt := Basic.Read_ProductClass_List(T_name, page, page_z)
+	T_Verify, _ := c.GetInt("T_Verify")
+	R_List, R_cnt := Basic.Read_ProductClass_List(T_name, T_Verify, page, page_z)
 
 	var r_jsons lib.R_JSONS
 	r_jsons.Num = R_cnt

+ 195 - 3
controllers/Contract.go

@@ -1,6 +1,7 @@
 package controllers
 
 import (
+	"ERP_storage/Nats"
 	"ERP_storage/Nats/NatsServer"
 	"ERP_storage/conf"
 	"ERP_storage/logs"
@@ -9,12 +10,15 @@ import (
 	"ERP_storage/models/Contract"
 	"ERP_storage/models/Stock"
 	"fmt"
-	userlibs "gogs.baozhida.cn/zoie/ERP_libs/User"
-	"gogs.baozhida.cn/zoie/ERP_libs/lib"
 	"github.com/beego/beego/v2/adapter/orm"
 	beego "github.com/beego/beego/v2/server/web"
 	"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"
 	"strconv"
 	"strings"
 	"time"
@@ -1117,14 +1121,19 @@ func (c *ContractController) Contract_List_RecoveriesMoney() {
 
 	// 查询
 	T_name := c.GetString("T_name")
+	T_start_date := c.GetString("T_start_date")             // 回款开始日期
+	T_end_date := c.GetString("T_end_date")                 // 回款结束日期
 	T_recoveries_state, _ := c.GetInt("T_recoveries_state") // 回款状态 1 未回款 2 部分回款 3 全部回款
 	T_invoice_state, _ := c.GetInt("T_invoice_state")       // 开票状态 1 未开票 2 部分开票 3 全部开票
+	T_percentage_state, _ := c.GetInt("T_percentage_state") // 提成状态 1-未打款 2-已打款
+	T_mine, _ := c.GetInt("T_mine")                         // 我的 用于合同提成显示
 
 	userList, _ := NatsServer.Read_User_List_All()
 	Account.Read_User_All_Map(userList)
+	Contract.Read_VerifyContract_All_Map()
 
 	ContractDao := Contract.NewContract(orm.NewOrm())
-	R_List, R_cnt := ContractDao.Read_Contract_List_For_RecoveriesAndInvoice(T_name, T_recoveries_state, T_invoice_state, page, page_z)
+	R_List, R_cnt := ContractDao.Read_Contract_List_For_RecoveriesAndInvoice(c.User.T_uuid, T_mine, T_name, T_start_date, T_end_date, T_recoveries_state, T_invoice_state, T_percentage_state, page, page_z)
 
 	var r_jsons lib.R_JSONS
 	r_jsons.Num = R_cnt
@@ -1136,6 +1145,135 @@ func (c *ContractController) Contract_List_RecoveriesMoney() {
 	c.ServeJSON()
 	return
 }
+
+// 导出合同回款明细列表
+func (c *ContractController) Contract_List_RecoveriesMoney_Export() {
+
+	// 查询
+	T_name := c.GetString("T_name")
+	T_start_date := c.GetString("T_start_date")             // 回款开始日期
+	T_end_date := c.GetString("T_end_date")                 // 回款结束日期
+	T_recoveries_state, _ := c.GetInt("T_recoveries_state") // 回款状态 1 未回款 2 部分回款 3 全部回款
+	T_invoice_state, _ := c.GetInt("T_invoice_state")       // 开票状态 1 未开票 2 部分开票 3 全部开票
+	T_percentage_state, _ := c.GetInt("T_percentage_state") // 提成状态 1-未打款 2-已打款
+	T_mine, _ := c.GetInt("T_mine")                         // 我的 用于合同提成显示
+
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
+	Contract.Read_VerifyContract_All_Map()
+
+	ContractDao := Contract.NewContract(orm.NewOrm())
+	R_List, _ := ContractDao.Read_Contract_List_For_RecoveriesAndInvoice(c.User.T_uuid, T_mine, T_name, T_start_date, T_end_date, T_recoveries_state, T_invoice_state, T_percentage_state, 0, 9999)
+	title := "销售提成明细表"
+	if T_mine == 1 {
+		title = fmt.Sprintf("%s-销售提成明细表", c.User.T_name)
+	}
+	filename := fmt.Sprintf("%s(%s)", title, lib.GetRandstring(6, "0123456789", 0))
+
+	f := excelize.NewFile() // 设置单元格的值
+	Style1, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 12, Family: "宋体"},
+			Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
+		})
+	Style2, _ := f.NewStyle(
+		&excelize.Style{
+			Font:      &excelize.Font{Bold: true, Size: 11, 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},
+			},
+		})
+
+	Style3, _ := 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},
+			},
+		})
+
+	f.MergeCell("Sheet1", "A1", "J1")
+	f.SetRowStyle("Sheet1", 1, 1, Style1)
+
+	f.SetCellValue("Sheet1", "A1", title)
+	f.SetRowHeight("Sheet1", 1, 30)
+	// 这里设置表头
+	f.SetCellStyle("Sheet1", "A2", "J2", Style2)
+	f.SetRowHeight("Sheet1", 2, 20)
+
+	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.SetCellValue("Sheet1", "H2", "销售提成5%")
+	f.SetCellValue("Sheet1", "I2", "提成金额")
+	f.SetCellValue("Sheet1", "J2", "提成状态")
+
+	// 设置列宽
+	f.SetColWidth("Sheet1", "A", "A", 25)
+	f.SetColWidth("Sheet1", "B", "I", 15)
+
+	line := 2
+
+	for _, contract := range R_List {
+		line += 1
+		f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), line-2)
+		f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), contract.T_customer)
+		f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), contract.T_number)
+		f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), contract.T_date)
+		f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), contract.T_discount)
+		f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), contract.T_recoveries_money)
+		f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), fmt.Sprintf("%.02f%%", contract.T_recoveries_money/contract.T_discount*100))
+		T_type_str := "验证合同"
+		if contract.T_type == 1 {
+			T_type_str = "销售合同"
+		}
+		f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), T_type_str)
+		f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), fmt.Sprintf("%.02f", contract.T_discount*0.05))
+		f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), fmt.Sprintf("%.02f", contract.T_discount*0.05))
+		T_percentage_str := "未打款"
+		if contract.T_percentage_state == 2 {
+			T_percentage_str = "已打款"
+		}
+		f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), T_percentage_str)
+
+	}
+	f.SetCellStyle("Sheet1", "A3", fmt.Sprintf("J%d", line), Style3)
+
+	// 保存文件
+	if err := f.SaveAs("ofile/" + filename + ".xlsx"); err != nil {
+		fmt.Println(err)
+	}
+	var url string
+	//// 上传 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: url}
+	c.ServeJSON()
+	return
+}
 func (c *ContractController) Contract_Stat() {
 
 	T_type, _ := c.GetInt("T_type")
@@ -1247,3 +1385,57 @@ func UpdateVerifyContract_RecoveriesInvoice_Money() {
 		ContractDao.Update_Contract(R, "T_recoveries_money", "T_invoice_money")
 	}
 }
+
+// 修改回款时间
+func UpdateVerifyContract_RecoveriesInvoice_Time() {
+	ContractDao := Contract.NewContract(orm.NewOrm())
+
+	R_List, _ := ContractDao.Read_VerifyContract_List("", "", 0, 9999)
+
+	for _, verify := range R_List {
+		R := Contract.Contract{Id: verify.Id}
+
+		if verify.T_discount == verify.T_recoveries_money {
+			recoveriesList, _ := Contract.ContractToContractFinance_R(verify.T_recoveries)
+			if len(recoveriesList) > 0 {
+				R.T_recoveries_time = recoveriesList[len(recoveriesList)-1].T_date
+				ContractDao.Update_Contract(R, "T_recoveries_time")
+			}
+		}
+
+	}
+}
+
+// 合同提成打款
+func (c *ContractController) Contract_Percentage_Remit() {
+	T_number := c.GetString("T_number")
+
+	o := orm.NewOrm()
+	ContractDao := Contract.NewContract(o)
+
+	contract, err := ContractDao.Read_Contract_ByT_number(T_number)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_number Err!"}
+		c.ServeJSON()
+		return
+	}
+	if contract.T_recoveries_money != contract.T_discount {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "合同未回款,不可打款!"}
+		c.ServeJSON()
+		return
+	}
+	contract.T_percentage_state = 2 // 已打款
+
+	err = ContractDao.Update_Contract(contract, "T_percentage_state")
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "验证合同", "打款", contract)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: contract.Id}
+	c.ServeJSON()
+	return
+}

+ 38 - 16
controllers/IOTNetworkCard.go

@@ -41,12 +41,13 @@ func (c *IOTNetworkCardController) IOTNetworkCard_List() {
 
 	// 查询
 	T_name := c.GetString("T_name")
+	T_company_name := c.GetString("T_company_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)
+	R_List, R_cnt := IOTNetworkCardDao.Read_IOTNetworkCard_List(T_name, T_company_name, T_state, page, page_z)
 
 	var r_jsons lib.R_JSONS
 	r_jsons.Num = R_cnt
@@ -255,7 +256,6 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Del() {
 // 导入
 func (c *IOTNetworkCardController) IOTNetworkCard_Import() {
 	// 获取上传的文件
-	IOTNetworkCardDao := IOTNetworkCard.NewIOTNetworkCard(orm.NewOrm())
 	f, _, err := c.GetFile("file")
 	if err != nil {
 		c.Data["json"] = lib.JSONS{Code: 1201, Msg: "读取文件失败!", Data: nil}
@@ -278,6 +278,7 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Import() {
 			return
 		}
 	}()
+	var IOTNetworkCardList []IOTNetworkCard.IOTNetworkCard
 	sheetMap := reader.GetSheetMap()
 	for _, sheetName := range sheetMap {
 		//读取工作表中的数据
@@ -300,10 +301,10 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Import() {
 					return
 				}
 				T_MSISDN := row[6]
-				_, errGet := IOTNetworkCard.Read_IOTNetworkCard_ByT_MSISDN(T_MSISDN)
-				if errGet != nil && errGet.Error() != orm.ErrNoRows.Error() {
-					continue
-				}
+				//_, 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_company_name: row[0],
@@ -311,7 +312,7 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Import() {
 					T_meal:         row[3],
 					T_expire:       row[4],
 					T_iccid:        row[5],
-					T_MSISDN:       row[6],
+					T_MSISDN:       T_MSISDN,
 					T_State:        IOTNetworkCard.IOTNetworkCardNewCardIn,
 				}
 				// 添加入库记录
@@ -321,16 +322,17 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Import() {
 					T_State: IOTNetworkCard.IOTNetworkCardNewCardIn,
 				})
 
-				if len(row) >= 8 {
-					// 解析时间
+				if len(row) >= 8 && len(row[7]) > 0 {
+					var outTime string
 					outT, errOutT := time.Parse("01-02-06", row[7])
 					if errOutT != nil {
 						c.Data["json"] = lib.JSONS{Code: 203, Msg: "解析出库时间失败"}
 						c.ServeJSON()
 						return
 					}
+					outTime = outT.Format("2006-01-02")
 					var_.T_State = IOTNetworkCard.IOTNetworkCardOut
-					var_.T_out_date = outT.Format("2006-01-02")
+					var_.T_out_date = outTime
 					var_.T_out_project = row[8]
 					record = append(record, IOTNetworkCard.IOTNetworkCardRecord{
 						T_data:        time.Now().Format("2006-01-02"),
@@ -341,16 +343,36 @@ func (c *IOTNetworkCardController) IOTNetworkCard_Import() {
 
 				recordB, _ := json.Marshal(&record)
 				var_.T_record = string(recordB)
+				IOTNetworkCardList = append(IOTNetworkCardList, var_)
 
-				_, err = IOTNetworkCardDao.Add_IOTNetworkCard(var_)
-				if err != nil {
-					c.Data["json"] = lib.JSONS{Code: 203, Msg: "添加失败"}
-					c.ServeJSON()
-					return
-				}
 			}
 		}
 	}
+	o := orm.NewOrm()
+	o.Begin()
+	IOTNetworkCardDao := IOTNetworkCard.NewIOTNetworkCard(o)
+
+	// 定义批次大小
+	batchSize := 1000
+	total := len(IOTNetworkCardList)
+	for i := 0; i < total; i += batchSize {
+		end := i + batchSize
+		if end > total {
+			end = total
+		}
+		batch := IOTNetworkCardList[i:end]
+
+		// 执行数据库批量插入
+		if _, err := IOTNetworkCardDao.Add_IOTNetworkCardMulti(batch); err != nil {
+			o.Rollback()
+			c.Data["json"] = lib.JSONS{Code: 203, Msg: "导入失败"}
+			c.ServeJSON()
+			return // 中断处理流程
+		}
+	}
+	o.Commit()
+	// 去重 保留最小值
+	IOTNetworkCardDao.DeleteDeduplicate()
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "成功!", Data: nil}
 	c.ServeJSON()

+ 159 - 138
controllers/Percentage.go

@@ -57,18 +57,13 @@ func (c *PercentageController) Percentage_List() {
 	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)
 	Percentage.Read_VerifyCompany_All_Map()
 
 	PercentageDao := Percentage.NewPercentage(orm.NewOrm())
-	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)
+	R_List, R_cnt := PercentageDao.Read_Percentage_List_SQL(T_name, T_uuid, T_start_date, T_end_date,
+		false, T_state, T_type, page, page_z)
 
 	var r_jsons lib.R_JSONS
 	r_jsons.Num = R_cnt
@@ -98,17 +93,13 @@ func (c *PercentageController) Percentage_User_List() {
 	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_VerifyContract_All_Map()
+	Percentage.Read_VerifyCompany_All_Map()
 
 	PercentageDao := Percentage.NewPercentage(orm.NewOrm())
-	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)
+	R_List, R_cnt := PercentageDao.Read_Percentage_User_List_SQL(c.User.T_uuid, T_name, T_start_date, T_end_date, false, T_state, page, page_z)
 
 	var r_jsons lib.R_JSONS
 	r_jsons.Num = R_cnt
@@ -135,7 +126,7 @@ func (c *PercentageController) Percentage_Export() {
 	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)
+	percentageList, _ := PercentageDao.Read_Percentage_List_SQL(T_name, T_uuid, T_start_date, T_end_date, true, T_state, T_type, 0, 9999)
 	dataInterval := fmt.Sprintf("%s - %s", T_start_date, T_end_date)
 	if dataInterval == " - " {
 		dataInterval = ""
@@ -158,25 +149,17 @@ func (c *PercentageController) Percentage_Export() {
 				{Type: "right", Color: "000000", Style: 1},
 			},
 		})
-	f.MergeCell("Sheet1", "A1", "AC1")
+	var schemeStartCell = "H"
+	var schemeEndCell = "U"
+	var reportingStartCell = "V"
+	var reportingEndCell = "AE"
+	f.MergeCell("Sheet1", "A1", reportingEndCell+"1")
 	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", 2, 30)
 	f.SetRowHeight("Sheet1", 4, 20)
 
 	// 这里设置表头
@@ -190,41 +173,46 @@ func (c *PercentageController) Percentage_Export() {
 
 	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", "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", schemeStartCell+"2", schemeEndCell+"2")
+	f.SetCellValue("Sheet1", schemeStartCell+"2", "验证实施")
 
-	f.MergeCell("Sheet1", "T2", "AC2")
-	f.SetCellValue("Sheet1", "T2", "报告编写")
+	f.MergeCell("Sheet1", reportingStartCell+"2", reportingEndCell+"2")
+	f.SetCellValue("Sheet1", reportingStartCell+"2", "报告编写")
 
 	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)
+		if 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", schemeEndCell+"3", schemeEndCell+"4")
+	f.SetCellValue("Sheet1", schemeEndCell+"3", "合计")
 
-	f.MergeCell("Sheet1", "AC3", "AC4")
-	f.SetCellValue("Sheet1", "AC3", "合计")
+	f.MergeCell("Sheet1", reportingEndCell+"3", reportingEndCell+"4")
+	f.SetCellValue("Sheet1", reportingEndCell+"3", "合计")
 	// 设置列宽
 	f.SetColWidth("Sheet1", "A", "A", 5)
-	f.SetColWidth("Sheet1", "B", "G", 16)
-	f.SetColWidth("Sheet1", "E", "G", 10)
-	f.SetColWidth("Sheet1", "H", "AC", 10)
+	f.SetColWidth("Sheet1", "B", "B", 25)
+	f.SetColWidth("Sheet1", "C", "C", 16)
+	f.SetColWidth("Sheet1", "D", "E", 10)
+	f.SetColWidth("Sheet1", "F", "F", 16)
+	f.SetColWidth("Sheet1", "G", "G", 10)
+	f.SetColWidth("Sheet1", schemeStartCell, reportingEndCell, 10)
 
 	// 冻结1-3行
 	f.SetPanes("Sheet1", &excelize.Panes{
 		Freeze:      true,
 		Split:       false,
-		XSplit:      2,
-		YSplit:      4,
+		XSplit:      4, // 列
+		YSplit:      4, // 行
 		TopLeftCell: "A1",
 		ActivePane:  "topRight",
 	})
@@ -239,29 +227,31 @@ func (c *PercentageController) Percentage_Export() {
 		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])
-
+		f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), percentage.T_task_name)
+		f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), percentage.T_uuid_name)
+		if len(percentage.T_reporting_pass_time) > 0 {
+			f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), percentage.T_reporting_pass_time[:10])
+		}
+		deviceType := fmt.Sprintf("%s-%s", percentage.T_device_type, percentage.T_verify_type)
+		if percentage.T_device_type == "位置" {
+			deviceType = fmt.Sprintf("%s-%s(%d)", percentage.T_device_type, percentage.T_verify_type, percentage.T_device_quantity)
+		}
+		f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), deviceType)
 		verifyItem := Basic.Read_VerifyItem_Get(percentage.T_verify_item)
-		f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", verifyItem.T_cell, line), verifyItem.T_price)
+		f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", verifyItem.T_cell, line), percentage.T_money)
 		var verifyType string
 		if percentage.T_type == Percentage.SchemeType {
 			verifyType = "验证实施"
-			f.SetCellValue("Sheet1", fmt.Sprintf("S%d", line), verifyItem.T_price)
+			f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", schemeEndCell, line), percentage.T_money)
 
 		} else if percentage.T_type == Percentage.ReportingType {
 			verifyType = "报告编写"
-			f.SetCellValue("Sheet1", fmt.Sprintf("AC%d", line), verifyItem.T_price)
+			f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", reportingEndCell, line), percentage.T_money)
 
 		}
 		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{
@@ -327,12 +317,12 @@ func (c *PercentageController) Percentage_Export() {
 			Fill: excelize.Fill{Type: "pattern", Color: []string{"#92D050"}, Pattern: 1},
 		})
 
-	f.SetCellStyle("Sheet1", "A5", fmt.Sprintf("AC%d", line-1), Style4)
+	f.SetCellStyle("Sheet1", "A5", fmt.Sprintf("%s%d", reportingEndCell, 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)
+	f.SetCellStyle("Sheet1", schemeStartCell+"2", schemeEndCell+"4", StyleYellowFill)
+	f.SetCellStyle("Sheet1", schemeEndCell+"5", fmt.Sprintf("%s%d", schemeEndCell, line-1), StyleYellowFill1)
+	f.SetCellStyle("Sheet1", reportingStartCell+"2", reportingEndCell+"4", StyleGreenFill)
+	f.SetCellStyle("Sheet1", reportingEndCell+"5", fmt.Sprintf("%s%d", reportingEndCell, line-1), StyleGreenFill1)
 	filename := fmt.Sprintf("%s提成统计表(%s)", dataInterval, lib.GetRandstring(6, "0123456789", 0))
 	// 保存文件
 	if err := f.SaveAs("ofile/" + filename + ".xlsx"); err != nil {
@@ -364,13 +354,13 @@ func (c *PercentageController) Percentage_User_Export() {
 	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, c.User.T_uuid, T_start_date, T_end_date, []string{}, T_state, T_type)
+	percentageList, _ := PercentageDao.Read_Percentage_User_List_SQL(c.User.T_uuid, T_name, T_start_date, T_end_date, true, T_state, 0, 9999)
+
 	dataInterval := fmt.Sprintf("%s - %s", T_start_date, T_end_date)
 	if dataInterval == " - " {
 		dataInterval = ""
@@ -393,25 +383,18 @@ func (c *PercentageController) Percentage_User_Export() {
 				{Type: "right", Color: "000000", Style: 1},
 			},
 		})
-	f.MergeCell("Sheet1", "A1", "AC1")
+
+	var schemeStartCell = "H"
+	var schemeEndCell = "U"
+	var reportingStartCell = "V"
+	var reportingEndCell = "AE"
+	f.MergeCell("Sheet1", "A1", reportingEndCell+"1")
 	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.SetCellValue("Sheet1", "A1", fmt.Sprintf("^%s%s提成统计表", c.User.T_name, dataInterval))
 
 	f.SetCellStyle("Sheet1", "A2", "G4", Style2)
-	f.SetRowHeight("Sheet1", 2, 20)
+	f.SetRowHeight("Sheet1", 2, 30)
 	f.SetRowHeight("Sheet1", 4, 20)
 
 	// 这里设置表头
@@ -425,41 +408,47 @@ func (c *PercentageController) Percentage_User_Export() {
 
 	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", "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", schemeStartCell+"2", schemeEndCell+"2")
+	f.SetCellValue("Sheet1", schemeStartCell+"2", "验证实施")
 
-	f.MergeCell("Sheet1", "T2", "AC2")
-	f.SetCellValue("Sheet1", "T2", "报告编写")
+	f.MergeCell("Sheet1", reportingStartCell+"2", reportingEndCell+"2")
+	f.SetCellValue("Sheet1", reportingStartCell+"2", "报告编写")
 
 	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)
+		if 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", schemeEndCell+"3", schemeEndCell+"4")
+	f.SetCellValue("Sheet1", schemeEndCell+"3", "合计")
+
+	f.MergeCell("Sheet1", reportingEndCell+"3", reportingEndCell+"4")
+	f.SetCellValue("Sheet1", reportingEndCell+"3", "合计")
 
-	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)
+	f.SetColWidth("Sheet1", "B", "B", 25)
+	f.SetColWidth("Sheet1", "C", "C", 16)
+	f.SetColWidth("Sheet1", "D", "E", 10)
+	f.SetColWidth("Sheet1", "F", "F", 16)
+	f.SetColWidth("Sheet1", "G", "G", 10)
+	f.SetColWidth("Sheet1", schemeStartCell, reportingEndCell, 10)
 
 	// 冻结1-3行
 	f.SetPanes("Sheet1", &excelize.Panes{
 		Freeze:      true,
 		Split:       false,
-		XSplit:      2,
-		YSplit:      4,
+		XSplit:      4, // 列
+		YSplit:      4, // 行
 		TopLeftCell: "A1",
 		ActivePane:  "topRight",
 	})
@@ -474,29 +463,31 @@ func (c *PercentageController) Percentage_User_Export() {
 		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])
-
+		f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), percentage.T_task_name)
+		f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), percentage.T_uuid_name)
+		if len(percentage.T_reporting_pass_time) > 0 {
+			f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), percentage.T_reporting_pass_time[:10])
+		}
+		deviceType := fmt.Sprintf("%s-%s", percentage.T_device_type, percentage.T_verify_type)
+		if percentage.T_device_type == "位置" {
+			deviceType = fmt.Sprintf("%s-%s(%d)", percentage.T_device_type, percentage.T_verify_type, percentage.T_device_quantity)
+		}
+		f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), deviceType)
 		verifyItem := Basic.Read_VerifyItem_Get(percentage.T_verify_item)
-		f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", verifyItem.T_cell, line), verifyItem.T_price)
+		f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", verifyItem.T_cell, line), percentage.T_money)
 		var verifyType string
 		if percentage.T_type == Percentage.SchemeType {
 			verifyType = "验证实施"
-			f.SetCellValue("Sheet1", fmt.Sprintf("S%d", line), verifyItem.T_price)
+			f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", schemeEndCell, 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("%s%d", reportingEndCell, line), percentage.T_money)
 
 		}
 		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{
@@ -562,13 +553,13 @@ func (c *PercentageController) Percentage_User_Export() {
 			Fill: excelize.Fill{Type: "pattern", Color: []string{"#92D050"}, Pattern: 1},
 		})
 
-	f.SetCellStyle("Sheet1", "A5", fmt.Sprintf("AC%d", line-1), Style4)
+	f.SetCellStyle("Sheet1", "A5", fmt.Sprintf("%s%d", reportingEndCell, 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))
+	f.SetCellStyle("Sheet1", schemeStartCell+"2", schemeEndCell+"4", StyleYellowFill)
+	f.SetCellStyle("Sheet1", schemeEndCell+"5", fmt.Sprintf("%s%d", schemeEndCell, line-1), StyleYellowFill1)
+	f.SetCellStyle("Sheet1", reportingStartCell+"2", reportingEndCell+"4", StyleGreenFill)
+	f.SetCellStyle("Sheet1", reportingEndCell+"5", fmt.Sprintf("%s%d", reportingEndCell, line-1), StyleGreenFill1)
+	filename := fmt.Sprintf("%s%s提成统计表(%s)", c.User.T_name, dataInterval, lib.GetRandstring(6, "0123456789", 0))
 	// 保存文件
 	if err := f.SaveAs("ofile/" + filename + ".xlsx"); err != nil {
 		fmt.Println(err)
@@ -618,6 +609,7 @@ func (c *PercentageController) Percentage_Add() {
 	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-报告编写
+	T_money, _ := c.GetFloat("T_money")             // 金额
 
 	company, is := Percentage.Read_VerifyCompany(T_company_uuid)
 	if !is {
@@ -641,7 +633,7 @@ func (c *PercentageController) Percentage_Add() {
 		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_money:          float32(T_money),
 		T_type:           T_type, //类型 1-验证实施 2-报告编写
 		T_State:          6,      // 6-未提交审核
 		T_verify_item:    verifyItemMap[T_device_type].Id,
@@ -729,6 +721,7 @@ func (c *PercentageController) Percentage_Edit() {
 	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_money, _ := c.GetFloat("T_money")             // 金额
 	T_type, _ := c.GetInt("T_type")                 // 类型 1-验证实施 2-报告编写
 
 	company, is := Percentage.Read_VerifyCompany(T_company_uuid)
@@ -777,8 +770,11 @@ func (c *PercentageController) Percentage_Edit() {
 	if T_type > 0 {
 		percentage.T_type = T_type
 	}
+	if T_money > 0 {
+		percentage.T_money = float32(T_money)
+	}
 
-	percentage.T_money = verifyItemMap[percentage.T_device_type].T_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")
@@ -1128,7 +1124,7 @@ func SyncVerifyPercentage(isCron bool) {
 		// 自动同步报告提成
 		_, 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)
+			verifyItem := GetPercentageMoney(Percentage.DeviceTypeMap[task.T_device_type], task.T_verify_type, verifyItemReportingMap)
 			// 添加报告提成
 			percentage := Percentage.Percentage{
 				T_Distributor_id:      task.T_Distributor_id,
@@ -1136,6 +1132,7 @@ func SyncVerifyPercentage(isCron bool) {
 				T_task_int_id:         task.Id,
 				T_device_type:         Percentage.DeviceTypeMap[task.T_device_type],
 				T_verify_type:         task.T_verify_type,
+				T_device_quantity:     task.T_device_quantity,
 				T_company_uuid:        task.T_uuid,
 				T_task_name:           task.T_name,
 				T_uuid:                coldVerifyUUIDMap[task.T_reporting],
@@ -1145,6 +1142,9 @@ func SyncVerifyPercentage(isCron bool) {
 				T_verify_item:         verifyItem.Id,
 				T_reporting_pass_time: task.T_reporting_pass_time,
 			}
+			if task.T_device_type == "WZ" {
+				percentage.T_money = verifyItem.T_price * float32(task.T_device_quantity)
+			}
 			_, err = PercentageDao.Add_Percentage(percentage)
 		}
 
@@ -1156,23 +1156,28 @@ func SyncVerifyPercentage(isCron bool) {
 		// 自动同步实施提成
 		_, 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)
+			T_device_type := Percentage.DeviceTypeMap[task.T_device_type]
+			verifyItem := GetPercentageMoney(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:         Percentage.DeviceTypeMap[task.T_device_type],
+				T_device_type:         T_device_type,
 				T_verify_type:         task.T_verify_type,
+				T_device_quantity:     task.T_device_quantity,
 				T_company_uuid:        task.T_uuid,
 				T_task_name:           task.T_name,
-				T_uuid:                coldVerifyUUIDMap[task.T_scheme],
+				T_uuid:                coldVerifyUUIDMap[task.T_delivery],
 				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,
 			}
+			if task.T_device_type == "WZ" {
+				percentage.T_money = verifyItem.T_price * float32(task.T_device_quantity)
+			}
 			_, err = PercentageDao.Add_Percentage(percentage)
 		}
 	}
@@ -1205,35 +1210,44 @@ func GetColdVerifyUUIDMap() (uuidMap map[string]string) {
 // 获取实施提成金额
 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["保温箱"]
+		return verifyItemMap["箱"]
 	}
 	if strings.Contains(T_device_type, "车") {
 		if strings.Contains(T_verify_type, "空载") {
-			return verifyItemMap["冷藏车(空载)"]
+			return verifyItemMap["车(空载)"]
 		} else {
-			return verifyItemMap["冷藏车(满载)"]
+			return verifyItemMap["车(满载)"]
 		}
 	}
 	if strings.Contains(T_device_type, "柜") {
 		if strings.Contains(T_verify_type, "空载") {
-			return verifyItemMap["库(空载)"]
+			return verifyItemMap["库(空载)"]
 		} else {
-			return verifyItemMap["库(满载)"]
+			return verifyItemMap["库(满载)"]
 		}
 	}
 	if strings.Contains(T_device_type, "库") {
 		if strings.Contains(T_verify_type, "空载") {
-			return verifyItemMap["库(空载)"]
+			return verifyItemMap["库(空载)"]
 		} else {
-			return verifyItemMap["库(满载)"]
+			return verifyItemMap["库(满载)"]
 		}
 	}
-	if strings.Contains(T_device_type, "系统验证") {
-		return verifyItemMap["系统验证"]
+	if strings.Contains(T_device_type, "系统") {
+		return verifyItemMap["系统"]
 	}
 	if strings.Contains(T_device_type, "位置") {
 		return verifyItemMap["位置"]
 	}
+	if strings.Contains(T_device_type, "巡检") {
+		return verifyItemMap["巡检"]
+	}
+	if strings.Contains(T_device_type, "培训") {
+		return verifyItemMap["培训"]
+	}
+	if strings.Contains(T_device_type, "其他") {
+		return verifyItemMap["其他"]
+	}
 	return Basic.VerifyItem{}
 }
 
@@ -1269,11 +1283,13 @@ func (c *PercentageController) VerifyCompany_List() {
 func (c *PercentageController) VerifyCompany_Add() {
 
 	T_name := c.GetString("T_name")
-	T_State, _ := c.GetInt("T_State") // 总价
+	T_recoveries_time := c.GetString("T_recoveries_time") // 回款时间
+	T_State, _ := c.GetInt("T_State")                     // 总价
 
 	var_ := Percentage.VerifyCompany{
-		T_name:  T_name,
-		T_State: T_State,
+		T_name:            T_name,
+		T_State:           T_State,
+		T_recoveries_time: T_recoveries_time,
 	}
 
 	if _, is := Percentage.Read_VerifyCompanyByT_name(T_name); is {
@@ -1298,7 +1314,8 @@ func (c *PercentageController) VerifyCompany_Add() {
 func (c *PercentageController) VerifyCompany_Edit() {
 
 	T_uuid := c.GetString("T_uuid")
-	T_State, _ := c.GetInt("T_State") // 总价
+	T_State, _ := c.GetInt("T_State")                     // 总价
+	T_recoveries_time := c.GetString("T_recoveries_time") // 回款时间
 
 	company, is := Percentage.Read_VerifyCompany(T_uuid)
 	if !is {
@@ -1308,11 +1325,15 @@ func (c *PercentageController) VerifyCompany_Edit() {
 	}
 	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
-		}
+	}
+	if len(T_recoveries_time) > 0 {
+		company.T_recoveries_time = T_recoveries_time
+	}
+
+	if !Percentage.Update_VerifyCompany(company, "T_State", "T_recoveries_time") {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改验证公司失败"}
+		c.ServeJSON()
+		return
 	}
 
 	NatsServer.AddUserLogs(c.User.T_uuid, "验证公司", "修改", company)

+ 420 - 0
controllers/RepairWorkOrder.go

@@ -1 +1,421 @@
 package controllers
+
+import (
+	"ERP_storage/Nats/NatsServer"
+	"ERP_storage/conf"
+	"ERP_storage/models/Account"
+	"ERP_storage/models/RepairWorkOrder"
+	beego "github.com/beego/beego/v2/server/web"
+	userlibs "gogs.baozhida.cn/zoie/ERP_libs/User"
+	"gogs.baozhida.cn/zoie/ERP_libs/lib"
+	"math"
+	"strconv"
+	"time"
+)
+
+type RepairWorkOrderController struct {
+	beego.Controller
+	User userlibs.User
+}
+
+func (c *RepairWorkOrderController) Prepare() {
+	c.User = *Account.User_r
+}
+
+func (c *RepairWorkOrderController) RepairWorkOrder_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 := RepairWorkOrder.Read_RepairWorkOrder_List(T_state, T_name, 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 *RepairWorkOrderController) RepairWorkOrder_User_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 := RepairWorkOrder.Read_RepairWorkOrder_user_List(c.User.T_uuid, T_state, T_name, 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 *RepairWorkOrderController) RepairWorkOrder_Add() {
+
+	T_product := c.GetString("T_product")
+	T_repair_num, _ := c.GetInt("T_repair_num")
+	T_model := c.GetString("T_model")
+	T_source := c.GetString("T_source")               // 设备来源
+	T_repair_reason := c.GetString("T_repair_reason") // 维修原因
+	T_receive := c.GetString("T_receive")             //接收人
+	T_picture := c.GetString("T_picture")             //图片
+
+	var_ := RepairWorkOrder.RepairWorkOrder{
+		T_delivery:      c.User.T_uuid,
+		T_product:       T_product,
+		T_repair_num:    T_repair_num,
+		T_model:         T_model,
+		T_source:        T_source,
+		T_repair_reason: T_repair_reason,
+		T_receive:       T_receive,
+		T_picture:       T_picture,
+		T_state:         1,
+		T_order_date:    time.Now().Format("2006-01-02 15:04:05"),
+	}
+
+	Id, err := RepairWorkOrder.Add_RepairWorkOrder(var_)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, 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 *RepairWorkOrderController) RepairWorkOrder_Edit() {
+	T_id, _ := c.GetInt("T_id")
+	T_product := c.GetString("T_product")
+	T_repair_num, _ := c.GetInt("T_repair_num")
+	T_model := c.GetString("T_model")
+	T_source := c.GetString("T_source")               // 设备来源
+	T_repair_reason := c.GetString("T_repair_reason") // 维修原因
+	T_receive := c.GetString("T_receive")             //接收人
+	T_picture := c.GetString("T_picture")
+	T_return_product := c.GetString("T_return_product")
+	T_return_model := c.GetString("T_return_model")
+	T_return_num, _ := c.GetInt("T_return_num")
+	T_staging_num, _ := c.GetInt("T_staging_num")
+	T_scrap_num, _ := c.GetInt("T_scrap_num")
+	T_malfunction_reason := c.GetString("T_malfunction_reason")
+	T_remark := c.GetString("T_remark")
+	T_sn := c.GetString("T_sn")
+	T_state, _ := c.GetInt("T_state")
+
+	RepairWorkOrder_r, err := RepairWorkOrder.Read_RepairWorkOrder_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+	var cols []string
+	if T_state > 0 {
+		RepairWorkOrder_r.T_state = T_state
+		cols = append(cols, "T_state")
+	}
+	if len(T_product) > 0 {
+		RepairWorkOrder_r.T_product = T_product
+		cols = append(cols, "T_product")
+	}
+	if T_repair_num > 0 {
+		RepairWorkOrder_r.T_repair_num = T_repair_num
+		cols = append(cols, "T_repair_num")
+	}
+	if len(T_model) > 0 {
+		RepairWorkOrder_r.T_model = T_model
+		cols = append(cols, "T_model")
+	}
+	if len(T_source) > 0 {
+		RepairWorkOrder_r.T_source = T_source
+		cols = append(cols, "T_source")
+	}
+	if len(T_repair_reason) > 0 {
+		RepairWorkOrder_r.T_repair_reason = T_repair_reason
+		cols = append(cols, "T_repair_reason")
+	}
+	if len(T_receive) > 0 {
+		RepairWorkOrder_r.T_receive = T_receive
+		cols = append(cols, "T_receive")
+	}
+	if len(T_picture) > 0 {
+		RepairWorkOrder_r.T_picture = T_picture
+		cols = append(cols, "T_picture")
+	}
+	if len(T_return_product) > 0 {
+		RepairWorkOrder_r.T_return_product = T_return_product
+		cols = append(cols, "T_return_product")
+	}
+	if len(T_return_model) > 0 {
+		RepairWorkOrder_r.T_return_model = T_return_model
+		cols = append(cols, "T_return_model")
+	}
+	if T_return_num > 0 {
+		RepairWorkOrder_r.T_return_num = T_return_num
+		cols = append(cols, "T_return_num")
+	}
+	if T_staging_num > 0 {
+		RepairWorkOrder_r.T_staging_num = T_staging_num
+		cols = append(cols, "T_staging_num")
+	}
+	if T_scrap_num > 0 {
+		RepairWorkOrder_r.T_scrap_num = T_scrap_num
+		cols = append(cols, "T_scrap_num")
+	}
+	if len(T_malfunction_reason) > 0 {
+		RepairWorkOrder_r.T_malfunction_reason = T_malfunction_reason
+		cols = append(cols, "T_malfunction_reason")
+	}
+	if len(T_remark) > 0 {
+		RepairWorkOrder_r.T_remark = T_remark
+		cols = append(cols, "T_remark")
+	}
+	if len(T_sn) > 0 {
+		RepairWorkOrder_r.T_sn = T_sn
+		cols = append(cols, "T_sn")
+	}
+
+	if err = RepairWorkOrder.Update_RepairWorkOrder(RepairWorkOrder_r, cols...); err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "维修工单", "修改", RepairWorkOrder_r)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+func (c *RepairWorkOrderController) RepairWorkOrder_Del() {
+
+	T_id, _ := c.GetInt("T_id")
+	RepairWorkOrder_r, err := RepairWorkOrder.Read_RepairWorkOrder_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if err = RepairWorkOrder.Delete_RepairWorkOrder(RepairWorkOrder_r); err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "维修工单", "删除", strconv.Itoa(T_id))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+
+// 归还
+func (c *RepairWorkOrderController) RepairWorkOrder_Return() {
+	T_id, _ := c.GetInt("T_id")
+	T_return_product := c.GetString("T_return_product")
+	T_return_model := c.GetString("T_return_model")
+	T_return_num, _ := c.GetInt("T_return_num")
+	T_staging_num, _ := c.GetInt("T_staging_num")
+	T_scrap_num, _ := c.GetInt("T_scrap_num")
+	T_malfunction_reason := c.GetString("T_malfunction_reason")
+	T_remark := c.GetString("T_remark")
+	T_sn := c.GetString("T_sn")
+
+	RepairWorkOrder_r, err := RepairWorkOrder.Read_RepairWorkOrder_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+	var cols []string
+
+	RepairWorkOrder_r.T_state = RepairWorkOrder.RepairWorkOrderReturn
+	cols = append(cols, "T_state")
+	RepairWorkOrder_r.T_return = c.User.T_uuid
+	cols = append(cols, "T_return")
+	RepairWorkOrder_r.T_return_date = time.Now().Format("2006-01-02 15:04:05")
+
+	if len(T_return_product) > 0 {
+		RepairWorkOrder_r.T_return_product = T_return_product
+		cols = append(cols, "T_return_product")
+	}
+	if len(T_return_model) > 0 {
+		RepairWorkOrder_r.T_return_model = T_return_model
+		cols = append(cols, "T_return_model")
+	}
+	if T_return_num > 0 {
+		RepairWorkOrder_r.T_return_num = T_return_num
+		cols = append(cols, "T_return_num")
+	}
+	if T_staging_num > 0 {
+		RepairWorkOrder_r.T_staging_num = T_staging_num
+		cols = append(cols, "T_staging_num")
+	}
+	if T_scrap_num > 0 {
+		RepairWorkOrder_r.T_scrap_num = T_scrap_num
+		cols = append(cols, "T_scrap_num")
+	}
+	if len(T_malfunction_reason) > 0 {
+		RepairWorkOrder_r.T_malfunction_reason = T_malfunction_reason
+		cols = append(cols, "T_malfunction_reason")
+	}
+	if len(T_remark) > 0 {
+		RepairWorkOrder_r.T_remark = T_remark
+		cols = append(cols, "T_remark")
+	}
+	if len(T_sn) > 0 {
+		RepairWorkOrder_r.T_sn = T_sn
+		cols = append(cols, "T_sn")
+	}
+
+	if err = RepairWorkOrder.Update_RepairWorkOrder(RepairWorkOrder_r, cols...); err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "维修工单", "修改", RepairWorkOrder_r)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+
+// 转派
+func (c *RepairWorkOrderController) RepairWorkOrder_Redeploy() {
+	T_id, _ := c.GetInt("T_id")
+	T_receive := c.GetString("T_receive")
+
+	RepairWorkOrder_r, err := RepairWorkOrder.Read_RepairWorkOrder_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+	var cols []string
+
+	if RepairWorkOrder_r.T_state != RepairWorkOrder.RepairWorkOrderOrder && RepairWorkOrder_r.T_state != RepairWorkOrder.RepairWorkOrderRepair {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "该状态不可转派!"}
+		c.ServeJSON()
+		return
+	}
+
+	if len(T_receive) > 0 {
+		RepairWorkOrder_r.T_receive = T_receive
+		cols = append(cols, "T_receive")
+	}
+
+	if err = RepairWorkOrder.Update_RepairWorkOrder(RepairWorkOrder_r, cols...); err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "维修工单", "转派", RepairWorkOrder_r)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+
+// 开始维修
+func (c *RepairWorkOrderController) RepairWorkOrder_Start_Repair() {
+	T_id, _ := c.GetInt("T_id")
+
+	RepairWorkOrder_r, err := RepairWorkOrder.Read_RepairWorkOrder_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if RepairWorkOrder_r.T_state != 1 && RepairWorkOrder_r.T_state != 2 {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "该状态不可开始维修!"}
+		c.ServeJSON()
+		return
+	}
+	RepairWorkOrder_r.T_repair_date = time.Now().Format("2006-01-02 15:04:05")
+	RepairWorkOrder_r.T_state = RepairWorkOrder.RepairWorkOrderRepair
+
+	if err = RepairWorkOrder.Update_RepairWorkOrder(RepairWorkOrder_r, "T_repair_date", "T_state"); err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "维修工单", "修改", RepairWorkOrder_r)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+func (c *RepairWorkOrderController) RepairWorkOrder_Finish() {
+	T_id, _ := c.GetInt("T_id")
+
+	RepairWorkOrder_r, err := RepairWorkOrder.Read_RepairWorkOrder_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+	if RepairWorkOrder_r.T_state == RepairWorkOrder.RepairWorkOrderFinish {
+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+		c.ServeJSON()
+		return
+	}
+
+	if RepairWorkOrder_r.T_state != RepairWorkOrder.RepairWorkOrderOrder &&
+		RepairWorkOrder_r.T_state != RepairWorkOrder.RepairWorkOrderRepair {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "该状态不可提交完结!"}
+		c.ServeJSON()
+		return
+	}
+	RepairWorkOrder_r.T_finish_date = time.Now().Format("2006-01-02 15:04:05")
+	RepairWorkOrder_r.T_state = RepairWorkOrder.RepairWorkOrderFinish
+
+	if err = RepairWorkOrder.Update_RepairWorkOrder(RepairWorkOrder_r, "T_finish_date", "T_state"); err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "维修工单", "修改", RepairWorkOrder_r)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}

+ 1 - 1
controllers/Stock.go

@@ -245,7 +245,7 @@ func (c *StockController) Stock_Detail_Excel() {
 		class, _ := Basic.Read_ProductClass_ById(product.T_class)
 		class_List = append(class_List, Basic.ProductClassToProductClass_R(class))
 	} else {
-		class_List, _ = Basic.Read_ProductClass_List("", 0, 9999)
+		class_List, _ = Basic.Read_ProductClass_List("", 0, 0, 9999)
 	}
 	f := excelize.NewFile() // 设置单元格的值
 	Style1, _ := f.NewStyle(

+ 194 - 0
controllers/Validation.go

@@ -226,6 +226,140 @@ func (c *ValidationController) UpdateValidationTool() {
 	return
 }
 
+// 报废
+func (c *ValidationController) ScrapValidationTool() {
+	var lendValidationList []validationtool.LendValidationTool
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &lendValidationList)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 1201, Msg: "json 序列化失败!", Data: nil}
+		c.ServeJSON()
+		return
+	}
+	vali := validationtool.NewValidationTool(orm.NewOrm())
+	o := orm.NewOrm()
+	o.Begin()
+	for _, tool := range lendValidationList {
+		if len(tool.T_sn) <= 0 {
+			c.Data["json"] = lib.JSONS{Code: 1201, Msg: "T_sn不能为空!", Data: nil}
+			c.ServeJSON()
+			return
+		}
+		_, errs := vali.ReadValidationBytSn(tool.T_sn)
+		if errs != nil {
+			o.Rollback()
+			if errs.Error() == orm.ErrNoRows.Error() {
+				c.Data["json"] = lib.JSONS{Code: 1201, Msg: fmt.Sprintf("当前sn:%v 未入库", tool.T_sn), Data: nil}
+				c.ServeJSON()
+				return
+			} else {
+				c.Data["json"] = lib.JSONS{Code: 1201, Msg: fmt.Sprintf("查询sn:%v 失败", tool.T_sn), Data: nil}
+				c.ServeJSON()
+				return
+			}
+		}
+		//修改设备状态
+		con := make(map[string]string)
+		if len(tool.T_remark) != 0 {
+			con["t_remark"] = tool.T_remark
+		}
+		if len(tool.Validationnumber) != 0 {
+			con["validationnumber"] = tool.Validationnumber
+		}
+		con["t_state"] = "4"
+		if len(tool.LendUser) != 0 {
+			con["lend_user"] = tool.LendUser
+		}
+		if len(tool.T_project) != 0 {
+			con["t_project"] = tool.T_project
+		}
+		con["update_time"] = time.Now().Format("2006-01-02 15:04:05")
+		err = vali.UpdateValidationTool(tool.T_sn, con)
+		if err != nil {
+			o.Rollback()
+			c.Data["json"] = lib.JSONS{Code: 1201, Msg: "修改失败!", Data: nil}
+			c.ServeJSON()
+			return
+		}
+	}
+	err = o.Commit() // 提交事务
+	if err != nil {
+		o.Rollback() // 回滚事务
+		c.Data["json"] = lib.JSONS{Code: 1201, Msg: "提交事务失败!", Data: nil}
+		c.ServeJSON()
+		return
+	}
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "提交成功!", Data: nil}
+	c.ServeJSON()
+	return
+}
+
+// 维修
+func (c *ValidationController) RepairValidationTool() {
+	var lendValidationList []validationtool.LendValidationTool
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &lendValidationList)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 1201, Msg: "json 序列化失败!", Data: nil}
+		c.ServeJSON()
+		return
+	}
+	vali := validationtool.NewValidationTool(orm.NewOrm())
+	o := orm.NewOrm()
+	o.Begin()
+	for _, tool := range lendValidationList {
+		if len(tool.T_sn) <= 0 {
+			c.Data["json"] = lib.JSONS{Code: 1201, Msg: "T_sn不能为空!", Data: nil}
+			c.ServeJSON()
+			return
+		}
+		_, errs := vali.ReadValidationBytSn(tool.T_sn)
+		if errs != nil {
+			o.Rollback()
+			if errs.Error() == orm.ErrNoRows.Error() {
+				c.Data["json"] = lib.JSONS{Code: 1201, Msg: fmt.Sprintf("当前sn:%v 未入库", tool.T_sn), Data: nil}
+				c.ServeJSON()
+				return
+			} else {
+				c.Data["json"] = lib.JSONS{Code: 1201, Msg: fmt.Sprintf("查询sn:%v 失败", tool.T_sn), Data: nil}
+				c.ServeJSON()
+				return
+			}
+		}
+		//修改设备状态
+		con := make(map[string]string)
+		if len(tool.T_remark) != 0 {
+			con["t_remark"] = tool.T_remark
+		}
+		if len(tool.Validationnumber) != 0 {
+			con["validationnumber"] = tool.Validationnumber
+		}
+		con["t_state"] = "3"
+		if len(tool.LendUser) != 0 {
+			con["lend_user"] = tool.LendUser
+		}
+		if len(tool.T_project) != 0 {
+			con["t_project"] = tool.T_project
+		}
+		con["update_time"] = time.Now().Format("2006-01-02 15:04:05")
+		err = vali.UpdateValidationTool(tool.T_sn, con)
+		if err != nil {
+			o.Rollback()
+			c.Data["json"] = lib.JSONS{Code: 1201, Msg: "修改失败!", Data: nil}
+			c.ServeJSON()
+			return
+		}
+	}
+	err = o.Commit() // 提交事务
+	if err != nil {
+		o.Rollback() // 回滚事务
+		c.Data["json"] = lib.JSONS{Code: 1201, Msg: "提交事务失败!", Data: nil}
+		c.ServeJSON()
+		return
+	}
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "提交成功!", Data: nil}
+	c.ServeJSON()
+	return
+}
+
 // GetValidationToolBySn 根据sn获取设备信息
 func (c *ValidationController) GetValidationToolBySn() {
 	sn := c.GetString("sn")
@@ -279,6 +413,11 @@ func (c *ValidationController) UpdateValidationToolBySn() {
 	con["update_time"] = time.Now().Format("2006-01-02 15:04:05")
 	vali := validationtool.NewValidationTool(orm.NewOrm())
 	r, err := vali.ReadValidationById(Id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 1201, Msg: "当前设备不存在!", Data: nil}
+		c.ServeJSON()
+		return
+	}
 	if !strings.EqualFold(r.T_sn, sn) {
 		con["t_sn"] = sn
 		user := Stock.Read_MqttUser(sn)
@@ -458,3 +597,58 @@ func (c *ValidationController) Read_ValidationClass_List() {
 	c.ServeJSON()
 	return
 }
+
+// 统计验证工具
+func (c *ValidationController) Validation_stat() {
+	// 分页参数 初始化
+	page, _ := c.GetInt("page")
+	if page < 1 {
+		page = 1
+	}
+	page_z, _ := c.GetInt("page_z")
+	if page_z < 1 {
+		page_z = conf.Page_size
+	}
+	LendUser := c.GetString("LendUser")
+	T_project := c.GetString("T_project")
+	vali := validationtool.NewValidationTool(orm.NewOrm())
+	R_List, R_cnt := vali.Validation_stat(LendUser, T_project, page, page_z)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: lib.R_JSONS{Data: R_List, Num: R_cnt}}
+	c.ServeJSON()
+	return
+}
+
+func (c *ValidationController) User_List() {
+	var r_jsons lib.R_JSONS
+	// 分页参数 初始化
+	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")
+
+	vali := validationtool.NewValidationTool(orm.NewOrm())
+
+	R_List, R_cnt := vali.Read_lend_user_List(T_name, page, page_z)
+
+	for i := 0; i < len(R_List); i++ {
+		if R_List[i].LendUser == "" {
+			R_List[i].LendUser = "未出库"
+		}
+	}
+
+	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
+}

+ 1 - 1
go.mod

@@ -1,6 +1,6 @@
 module ERP_storage
 
-go 1.19
+go 1.22
 
 require (
 	github.com/astaxie/beego v1.12.3

+ 7 - 0
go.sum

@@ -81,6 +81,7 @@ github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt
 github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
 github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
 github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw=
+github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -157,6 +158,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
+github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@@ -211,6 +213,7 @@ github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDu
 github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ=
+github.com/lib/pq v1.10.5/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
 github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
@@ -233,6 +236,7 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW
 github.com/nats-io/jwt/v2 v2.3.0 h1:z2mA1a7tIf5ShggOFlR1oBPgd6hGqcDYsISxZByUzdI=
 github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k=
 github.com/nats-io/nats-server/v2 v2.9.14 h1:n2GscWVgXpA14vQSRP/MM1SGi4wyazR9l19/gWxqgXQ=
+github.com/nats-io/nats-server/v2 v2.9.14/go.mod h1:40ZwFm4npKdFBhOdY7rkh3YyI1oI91FzLvlYyB7HfzM=
 github.com/nats-io/nats.go v1.23.0 h1:lR28r7IX44WjYgdiKz9GmUeW0uh/m33uD3yEjLZ2cOE=
 github.com/nats-io/nats.go v1.23.0/go.mod h1:ki/Scsa23edbh8IRZbCuNXR9TDcbvfaSijKtaqQgw+Q=
 github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8=
@@ -330,6 +334,7 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
@@ -381,6 +386,7 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ=
+golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -512,6 +518,7 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 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/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 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=

+ 1 - 0
main.go

@@ -11,6 +11,7 @@ import (
 	_ "ERP_storage/models/Contract"
 	_ "ERP_storage/models/Percentage"
 	_ "ERP_storage/models/Property"
+	_ "ERP_storage/models/RepairWorkOrder"
 	_ "ERP_storage/models/Stock"
 	_ "ERP_storage/models/validationtool"
 	_ "ERP_storage/routers"

+ 8 - 3
models/Basic/ProductClass.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"
 	"time"
 )
@@ -92,7 +92,7 @@ func Delete_ProductClass(v ProductClass) error {
 }
 
 // 获取列表
-func Read_ProductClass_List(T_name string, page, page_z int) (r_ []ProductClass_R, cnt int64) {
+func Read_ProductClass_List(T_name string, T_Verify, page, page_z int) (r_ []ProductClass_R, cnt int64) {
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 	qs := o.QueryTable(new(ProductClass))
@@ -105,7 +105,12 @@ func Read_ProductClass_List(T_name string, page, page_z int) (r_ []ProductClass_
 
 	// 过滤
 	cond := orm.NewCondition()
-	cond = cond.And("T_State", 1).And("Id__gt", 0)
+	cond = cond.And("T_State", 1)
+	if T_Verify == 1 {
+		cond = cond.And("Id__lte", 0)
+	} else {
+		cond = cond.And("Id__gt", 0)
+	}
 
 	if len(T_name) > 0 {
 		cond = cond.And("T_name__icontains", T_name)

+ 77 - 27
models/Contract/Contract.go

@@ -4,8 +4,8 @@ import (
 	"ERP_storage/logs"
 	"ERP_storage/models/Account"
 	"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"
 	"sync"
@@ -18,20 +18,22 @@ import (
 
 // 合同
 type Contract struct {
-	Id                 int     `orm:"column(ID);size(11);auto;pk"`
-	T_number           string  `orm:"size(256);null"`         // 合同编号
-	T_customer         string  `orm:"size(256);null"`         // 客户名称
-	T_customer_id      string  `orm:"size(256);null"`         // 客户id
-	T_money            float32 `orm:"digits(12);decimals(2)"` // 合同金额
-	T_discount         float32 `orm:"digits(12);decimals(2)"` // 合同优惠价
-	T_project          string  `orm:"size(256);null"`         // 项目
-	T_type             int     `orm:"size(2);default(1)"`     // 合同类型 1-销售合同 2-验证合同
-	T_date             string  `orm:"size(256);null"`         // 签订时间
-	T_out              int     `orm:"size(2);default(1)"`     // 出库状态  1-未出库 2-部分出库 3-已出库
-	T_State            int     `orm:"size(2);default(1)"`     // 0 删除(伪删除)  1-已通过 2-未通过 3-待审核 审核状态
-	T_pdf              string  `orm:"size(256);null"`         // 附件
-	T_remark           string  `orm:"type(text);null"`        // 备注
-	T_recoveries       string  `orm:"type(text);null"`        // 回款信息 回款时间,回款金额|回款时间,回款金额|
+	Id                int     `orm:"column(ID);size(11);auto;pk"`
+	T_number          string  `orm:"size(256);null"`         // 合同编号
+	T_customer        string  `orm:"size(256);null"`         // 客户名称
+	T_customer_id     string  `orm:"size(256);null"`         // 客户id
+	T_money           float32 `orm:"digits(12);decimals(2)"` // 合同金额
+	T_discount        float32 `orm:"digits(12);decimals(2)"` // 合同优惠价
+	T_project         string  `orm:"size(256);null"`         // 项目
+	T_type            int     `orm:"size(2);default(1)"`     // 合同类型 1-销售合同 2-验证合同
+	T_date            string  `orm:"size(256);null"`         // 签订时间
+	T_out             int     `orm:"size(2);default(1)"`     // 出库状态  1-未出库 2-部分出库 3-已出库
+	T_State           int     `orm:"size(2);default(1)"`     // 0 删除(伪删除)  1-已通过 2-未通过 3-待审核 审核状态
+	T_pdf             string  `orm:"size(256);null"`         // 附件
+	T_remark          string  `orm:"type(text);null"`        // 备注
+	T_recoveries      string  `orm:"type(text);null"`        // 回款信息 回款时间,回款金额|回款时间,回款金额|
+	T_recoveries_time string  `orm:"type(200);null"`         // 回款时间 全部回款
+
 	T_recoveries_money float32 `orm:"digits(12);decimals(2)"` // 回款总金额
 	T_invoice          string  `orm:"type(text);null"`        // 开票信息 开票时间,开票金额|开票时间,开票金额|
 	T_invoice_money    float32 `orm:"digits(12);decimals(2)"` // 开票总金额
@@ -41,6 +43,8 @@ type Contract struct {
 	T_submit   string `orm:"size(256);null"` // 合同提交人员
 	T_approver string `orm:"size(256);null"` // 审批人
 
+	T_percentage_state int `orm:"size(2);default(1)"` // 提成状态 1-未打款 2-已打款
+
 	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 保存时都会对时间自动更新
 }
@@ -81,7 +85,11 @@ type Contract_R struct {
 	T_pdf              string  // 附件
 	T_State            int     // 1-已通过 2-未通过 3-待审核 审核状态
 	T_recoveries_money float32 // 回款总金额
+	T_recoveries_time  string  // 回款时间
 	T_invoice_money    float32 // 开票总金额
+	T_recoveries_state string  // 回款状态
+	T_invoice_state    string  // 开票状态
+	T_percentage_state int     // 提成状态 1-未打款 2-已打款
 
 }
 
@@ -116,16 +124,17 @@ type ContractFinance_R struct {
 }
 
 type Contract_Verify struct {
-	Id             int
-	T_number       string
-	T_money        float32 // 合同金额
-	T_discount     float32 // 合同优惠价
-	T_date         string  // 签订时间
-	T_start_date   string  // 起始时间
-	T_end_date     string  // 终止时间
-	T_verify_state int     // 1-未签约 2-已作废 3-已签约 4-即将到期
-	T_recoveries   string  // 回款信息
-	T_invoice      string  // 开票信息
+	Id                 int
+	T_number           string
+	T_money            float32 // 合同金额
+	T_discount         float32 // 合同优惠价
+	T_date             string  // 签订时间
+	T_start_date       string  // 起始时间
+	T_end_date         string  // 终止时间
+	T_verify_state     int     // 1-未签约 2-已作废 3-已签约 4-即将到期
+	T_recoveries       string  // 回款信息
+	T_recoveries_money float32 // 回款总金额
+	T_invoice          string  // 开票信息
 }
 type ContractMoney_Stat struct {
 	T_date             int
@@ -164,6 +173,9 @@ func ContractToContract_R(t Contract) (r Contract_R) {
 	r.Id = t.Id
 	r.T_number = t.T_number
 	r.T_customer = t.T_customer
+	if len(t.T_customer_id) > 0 {
+		r.T_customer = Read_VerifyContract_Get(t.T_customer_id)
+	}
 	r.T_money = t.T_money
 	r.T_discount = t.T_discount
 	r.T_type = t.T_type
@@ -175,7 +187,23 @@ func ContractToContract_R(t Contract) (r Contract_R) {
 	r.T_approver = t.T_approver
 	r.T_approver_name = Account.Read_User_T_name_Get(t.T_approver)
 	r.T_recoveries_money = t.T_recoveries_money
+	r.T_recoveries_time = t.T_recoveries_time
+	r.T_percentage_state = t.T_percentage_state
 	r.T_invoice_money = t.T_invoice_money
+	r.T_recoveries_state = "部分回款"
+	if t.T_recoveries_money == 0 {
+		r.T_recoveries_state = "未回款"
+	}
+	if t.T_recoveries_money == t.T_discount {
+		r.T_recoveries_state = "全部回款"
+	}
+	r.T_invoice_state = "部分开票"
+	if t.T_invoice_money == 0 {
+		r.T_invoice_state = "未开票"
+	}
+	if t.T_invoice_money == t.T_discount {
+		r.T_invoice_state = "全部开票"
+	}
 	return r
 }
 
@@ -246,6 +274,7 @@ func ContractToContract_Verify(t Contract) (r Contract_Verify) {
 
 	r.T_verify_state = state
 	r.T_recoveries = t.T_recoveries
+	r.T_recoveries_money = t.T_recoveries_money
 	r.T_invoice = t.T_invoice
 
 	return r
@@ -401,7 +430,7 @@ func (dao *ContractDaoImpl) Read_VerifyContract_List(T_name, T_customer_id strin
 	return r_, cnt
 }
 
-func (dao *ContractDaoImpl) Read_Contract_List_For_RecoveriesAndInvoice(T_name string, T_recoveries_state, T_invoice_state, page, page_z int) (r_ []Contract_R, cnt int64) {
+func (dao *ContractDaoImpl) Read_Contract_List_For_RecoveriesAndInvoice(T_uuid string, T_mine int, T_name, T_start_date, T_end_date string, T_recoveries_state, T_invoice_state, T_percentage_state, page, page_z int) (r_ []Contract_R, cnt int64) {
 	// 也可以直接使用 Model 结构体作为表名
 	qs := dao.orm.QueryTable(new(Contract))
 	var offset int64
@@ -414,11 +443,25 @@ func (dao *ContractDaoImpl) Read_Contract_List_For_RecoveriesAndInvoice(T_name s
 	// 过滤
 	cond := orm2.NewCondition()
 	cond = cond.And("T_State", 1)
+	if T_mine == 1 {
+		cond = cond.And("T_submit", T_uuid)
+	}
 	// 回款状态 1 未回款 2 部分回款 3 全部回款
 	// 开票状态 1 未开票 2 部分开票 3 全部开票
 	if len(T_name) > 0 {
 		cond = cond.AndCond(cond.Or("T_number__icontains", T_name).Or("T_customer__icontains", T_name))
 	}
+	if len(T_start_date) > 0 {
+		cond = cond.And("T_recoveries_time__gte", T_start_date)
+	}
+	if len(T_end_date) > 0 {
+		cond = cond.And("T_recoveries_time__lte", T_end_date)
+	}
+
+	if T_percentage_state > 0 {
+		cond = cond.And("T_percentage_state", T_percentage_state)
+
+	}
 	qs = qs.SetCond(cond)
 
 	if T_recoveries_state == 1 {
@@ -440,10 +483,17 @@ func (dao *ContractDaoImpl) Read_Contract_List_For_RecoveriesAndInvoice(T_name s
 	if T_invoice_state == 3 {
 		qs = qs.FilterRaw("t_invoice_money", " = t_discount")
 	}
+
 	cond = qs.GetCond()
 	// 查询
 	var r []Contract
-	_, err := qs.Limit(page_z, offset).SetCond(cond).OrderBy("-Id").All(&r)
+	var err error
+	if page_z == 9999 {
+		_, err = qs.SetCond(cond).OrderBy("-Id").All(&r)
+	} else {
+		_, err = qs.Limit(page_z, offset).SetCond(cond).OrderBy("-Id").All(&r)
+
+	}
 
 	if err != nil {
 		logs.Error(lib.FuncName(), err)

+ 41 - 3
models/IOTNetworkCard/IOTNetworkCard.go

@@ -138,6 +138,42 @@ func (dao *IOTNetworkCardDaoImpl) Add_IOTNetworkCard(r IOTNetworkCard) (id int64
 	return id, err
 }
 
+// 添加
+func (dao *IOTNetworkCardDaoImpl) Add_IOTNetworkCardMulti(r []IOTNetworkCard) (id int64, err error) {
+	id, err = dao.orm.InsertMulti(len(r), &r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return id, err
+}
+
+// 删除的重复数据
+func (dao *IOTNetworkCardDaoImpl) DeleteDeduplicate() (int64, error) {
+	tb_name := "iot_network_card"
+	var cnt int64
+	// 创建临时表
+	sqlCreate := "CREATE TABLE `iot_network_card_tmp_table` AS (SELECT MIN(`ID`) AS `min_id` FROM " + tb_name + " GROUP BY `t_msisdn`);"
+	_, err := dao.orm.Raw(sqlCreate).Exec()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return cnt, err
+	}
+	sqlDelete := "DELETE FROM " + tb_name + "  WHERE `ID` NOT IN (SELECT `min_id` FROM `iot_network_card_tmp_table`);"
+	res, err := dao.orm.Raw(sqlDelete).Exec()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return cnt, err
+	}
+	cnt, _ = res.RowsAffected()
+	sqlDrop := "DROP TABLE `iot_network_card_tmp_table`;"
+	_, err = dao.orm.Raw(sqlDrop).Exec()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return cnt, err
+	}
+	return cnt, nil
+}
+
 // 获取 ById
 func Read_IOTNetworkCard_ByT_MSISDN(T_MSISDN string) (r IOTNetworkCard, err error) {
 	o := orm.NewOrm()
@@ -181,7 +217,7 @@ func (dao *IOTNetworkCardDaoImpl) Delete_IOTNetworkCard(v IOTNetworkCard) error
 }
 
 // 获取列表
-func (dao *IOTNetworkCardDaoImpl) Read_IOTNetworkCard_List(T_name string, T_state, page, page_z int) (r_ []IOTNetworkCard_R, cnt int64) {
+func (dao *IOTNetworkCardDaoImpl) Read_IOTNetworkCard_List(T_name, T_company_name string, T_state, page, page_z int) (r_ []IOTNetworkCard_R, cnt int64) {
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
 	qs := o.QueryTable(new(IOTNetworkCard))
@@ -198,9 +234,11 @@ func (dao *IOTNetworkCardDaoImpl) Read_IOTNetworkCard_List(T_name string, T_stat
 	if T_state > 0 {
 		cond1 = cond1.And("T_State", T_state)
 	}
-
+	if len(T_company_name) > 0 {
+		cond1 = cond1.And("T_company_name__icontains", T_company_name)
+	}
 	if len(T_name) > 0 {
-		cond1 = cond1.AndCond(cond.Or("T_iccid__icontains", T_name).Or("T_MSISDN__icontains", T_name).Or("T_company_name__icontains", T_name))
+		cond1 = cond1.AndCond(cond.Or("T_iccid__icontains", T_name).Or("T_MSISDN__icontains", T_name).Or("T_out_project__icontains", T_name))
 	}
 
 	// 查询

+ 102 - 116
models/Percentage/Percentage.go

@@ -3,11 +3,10 @@ package Percentage
 import (
 	"ERP_storage/logs"
 	"ERP_storage/models/Account"
-	"ERP_storage/models/Basic"
-	"encoding/json"
 	"fmt"
 	orm2 "github.com/beego/beego/v2/client/orm"
 	"gogs.baozhida.cn/zoie/ERP_libs/lib"
+	"strconv"
 	"strings"
 	"time"
 
@@ -37,20 +36,15 @@ var (
 		NotSubmit:   "未提交审核",
 	}
 	DeviceTypeMap = map[string]string{
-		"BWX":   "保温箱",
-		"LDX":   "冷冻箱",
-		"LCG":   "冷藏柜",
-		"LDG":   "冷冻柜",
-		"YLG":   "阴凉柜",
-		"LDC":   "冷藏车",
-		"LK":    "冷库",
-		"BG":    "冰柜",
-		"DWBWX": "低温保存箱",
-		"XT":    "系统验证",
-		"WZ":    "位置",
-		"XJ":    "巡检",
-		"PX":    "培训",
-		"QT":    "其他",
+		"X":  "箱",
+		"G":  "柜",
+		"C":  "车",
+		"K":  "库",
+		"XT": "系统",
+		"WZ": "位置",
+		"PX": "培训",
+		"XJ": "巡检",
+		"QT": "其他",
 	}
 	SchemeType    = 1
 	ReportingType = 2
@@ -67,13 +61,14 @@ func Read_Audit_Get(Id int) string {
 
 // 提成
 type Percentage struct {
-	Id                    int     `orm:"column(ID);size(11);auto;pk"`
+	Id                    int     `orm:"column(ID);size(11);column(id);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_device_quantity     int     `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)"`                  // 提成金额
@@ -113,6 +108,7 @@ type Percentage_R struct {
 	T_task_id             string
 	T_device_type         string
 	T_verify_type         string
+	T_device_quantity     int
 	T_company_uuid        string
 	T_task_name           string
 	T_reporting_pass_time string
@@ -180,14 +176,15 @@ type VerifyTask struct {
 	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_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_verify_type         string `orm:"size(256);null"` // 验证类型
 	T_reporting_pass_time string `orm:"size(256);null"` // 验证报告负责人通过时间
 
+	T_device_quantity int `orm:"size(2);default(0)"` // 终端数量
+
 	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 保存时都会对时间自动更新
 }
@@ -219,6 +216,7 @@ func PercentageToPercentage_R(t Percentage) (r Percentage_R) {
 	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_device_quantity = t.T_device_quantity
 	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]
@@ -369,112 +367,145 @@ func (dao *PercentageDaoImpl) Read_Percentage_List(T_name, T_uuid, T_start_date,
 
 	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) {
+func (dao *PercentageDaoImpl) Read_Percentage_List_SQL(T_name, T_uuid, T_start_date, T_end_date string, T_export bool, T_state, T_type, page, page_z int) (r_ []Percentage_R, cnt int64) {
 	// 也可以直接使用 Model 结构体作为表名
-	qs := dao.orm.QueryTable(new(Percentage))
+	var offset int
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = (page - 1) * page_z
+	}
 
-	// 过滤
-	cond := orm.NewCondition()
-	cond1 := cond.And("T_State__gt", 0)
+	var maps_z []orm2.ParamsList
+	var r []Percentage
+	sqlWhere := " WHERE p.t_state > 0"
 	if T_state > 0 {
-		cond1 = cond1.And("T_State", T_state)
+		sqlWhere += " AND p.t_state = " + strconv.Itoa(T_state)
 	} else {
-		cond1 = cond1.AndNot("T_State", 6)
+		sqlWhere += " AND p.t_state != " + strconv.Itoa(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)
+		sqlWhere += " AND (p.t_task_id like \"%" + T_name + "%\" or vc.T_name like \"%" + T_name + "%\")"
 	}
 	if T_type > 0 {
-		cond1 = cond1.And("T_type", T_type)
+		sqlWhere += " AND p.t_type != " + strconv.Itoa(T_type)
+
+	}
+	if len(T_uuid) > 0 {
+		sqlWhere += " AND p.t_uuid = \"" + T_uuid + "\""
 	}
 	if len(T_start_date) > 0 {
-		cond1 = cond1.And("T_reporting_pass_time__gte", T_start_date+" 00:00:00")
+		sqlWhere += " AND vc.t_recoveries_time >= \"" + T_start_date + "\""
 	}
-
 	if len(T_end_date) > 0 {
-		cond1 = cond1.And("T_reporting_pass_time__lte", T_end_date+" 23:59:59")
+		sqlWhere += " AND vc.t_recoveries_time <= \"" + T_end_date + "\""
 	}
-	// 查询
-	var r []Percentage
-	_, err := qs.SetCond((*orm2.Condition)(cond1)).OrderBy("T_company_uuid", "T_task_int_id").All(&r)
 
+	// 获取总条数
+	sql := "SELECT COUNT(p.ID) FROM percentage p " +
+		"LEFT JOIN verify_company vc ON p.t_company_uuid=vc.t_uuid "
+	sql = sql + sqlWhere
+	fmt.Println(sql)
+	_, err := dao.orm.Raw(sql).ValuesList(&maps_z)
 	if err != nil {
-		logs.Error(lib.FuncName(), err)
-		return
+		return r_, 0
 	}
+	if len(maps_z) == 0 {
+		return r_, 0
+	}
+	sql = "SELECT p.t_state as t_state,p.* FROM percentage p " +
+		"LEFT JOIN verify_company vc ON p.t_company_uuid=vc.t_uuid"
 
-	cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
-	if err != nil {
-		logs.Error(lib.FuncName(), err)
-		return
+	sql = sql + sqlWhere
+
+	if T_export {
+		sql += " ORDER BY t_company_uuid asc,p.t_task_int_id asc"
+	} else {
+		sql += " ORDER BY t_state asc,p.t_task_int_id DESC"
+	}
+
+	if page_z != 9999 {
+		sql += " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
 	}
 
+	fmt.Println(sql)
+	_, err = dao.orm.Raw(sql).QueryRows(&r)
 	for _, v := range r {
 		r_ = append(r_, PercentageToPercentage_R(v))
 	}
 
-	return r_, cnt
+	count, _ := strconv.Atoi(maps_z[0][0].(string))
+	return r_, int64(count)
 }
-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) {
+func (dao *PercentageDaoImpl) Read_Percentage_User_List_SQL(T_uuid, T_name, T_start_date, T_end_date string, T_export bool, T_state, page, page_z int) (r_ []Percentage_R, cnt int64) {
 	// 也可以直接使用 Model 结构体作为表名
-	qs := dao.orm.QueryTable(new(Percentage))
-	var offset int64
+	var offset int
 	if page <= 1 {
 		offset = 0
 	} else {
-		offset = int64((page - 1) * page_z)
+		offset = (page - 1) * page_z
 	}
 
-	// 过滤
-	cond := orm.NewCondition()
-	cond1 := cond.And("T_State__gt", 0)
+	var maps_z []orm2.ParamsList
+	var r []Percentage
+	sqlWhere := " WHERE p.t_state > 0"
 	if T_state > 0 {
-		cond1 = cond1.And("T_State", T_state)
+		sqlWhere += " AND p.t_state = " + strconv.Itoa(T_state)
 	}
-
 	if len(T_name) > 0 {
-		cond1 = cond1.AndCond(cond1.Or("T_task_id__icontains", T_name).Or("T_company_uuid__in", T_company_list))
+		sqlWhere += " AND (p.t_task_id like \"%" + T_name + "%\" or vc.T_name like \"%" + T_name + "%\")"
 	}
 	if len(T_uuid) > 0 {
-		cond1 = cond1.And("T_uuid", T_uuid)
+		sqlWhere += " AND p.t_uuid = \"" + T_uuid + "\""
 	}
 	if len(T_start_date) > 0 {
-		cond1 = cond1.And("T_reporting_pass_time__gte", T_start_date+" 00:00:00")
+		sqlWhere += " AND vc.t_recoveries_time >= \"" + T_start_date + "\""
 	}
-
 	if len(T_end_date) > 0 {
-		cond1 = cond1.And("T_reporting_pass_time__lte", T_end_date+" 23:59:59")
+		sqlWhere += " AND vc.t_recoveries_time <= \"" + T_end_date + "\""
 	}
-	// 查询
-	var r []Percentage
-	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_task_int_id").All(&r)
 
+	// 获取总条数
+	sql := "SELECT COUNT(p.ID) FROM percentage p " +
+		"LEFT JOIN verify_company vc ON p.t_company_uuid=vc.t_uuid "
+	sql = sql + sqlWhere
+	fmt.Println(sql)
+	_, err := dao.orm.Raw(sql).ValuesList(&maps_z)
 	if err != nil {
-		logs.Error(lib.FuncName(), err)
-		return
+		return r_, 0
 	}
+	if len(maps_z) == 0 {
+		return r_, 0
+	}
+	sql = "SELECT p.t_state as t_state,p.* FROM percentage p " +
+		"LEFT JOIN verify_company vc ON p.t_company_uuid=vc.t_uuid"
 
-	cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
-	if err != nil {
-		logs.Error(lib.FuncName(), err)
-		return
+	sql = sql + sqlWhere
+
+	if T_export {
+		sql += " ORDER BY t_company_uuid asc,p.t_task_int_id asc"
+	} else {
+		sql += " ORDER BY t_state asc,p.t_task_int_id DESC"
+	}
+
+	if page_z != 9999 {
+		sql += " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
 	}
 
+	fmt.Println(sql)
+	_, err = dao.orm.Raw(sql).QueryRows(&r)
 	for _, v := range r {
 		r_ = append(r_, PercentageToPercentage_R(v))
 	}
 
-	return r_, cnt
+	count, _ := strconv.Atoi(maps_z[0][0].(string))
+	return r_, int64(count)
 }
 
 func (dao *PercentageDaoImpl) Read_T_uuid_List() (lists []string) {
 
 	o := orm.NewOrm()
-	sql := "SELECT DISTINCT t_uuid FROM percentage WHERE t__state > 0 LIMIT 0,1000"
+	sql := "SELECT DISTINCT t_uuid FROM percentage WHERE t_state > 0 LIMIT 0,1000"
 	_, err := o.Raw(sql).QueryRows(&lists)
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
@@ -482,48 +513,3 @@ func (dao *PercentageDaoImpl) Read_T_uuid_List() (lists []string) {
 	}
 	return lists
 }
-
-func Generate_VerifyItem_Price(T_item string) string {
-	if len(T_item) == 0 {
-		return ""
-	}
-	price := make(map[int]float32)
-	detailList := strings.Split(strings.Trim(T_item, "|"), "|")
-	for _, detail := range detailList {
-		T_id := lib.To_int(strings.Split(detail, ",")[0])
-		verifyItem := Basic.Read_VerifyItem_Get(T_id)
-		price[T_id] = verifyItem.T_price
-	}
-
-	b, _ := json.Marshal(price)
-	return string(b)
-}
-
-func Get_VerifyItem_Price(T_item_price string) map[int]float32 {
-	price := make(map[int]float32)
-	if len(T_item_price) == 0 {
-		return price
-	}
-	_ = json.Unmarshal([]byte(T_item_price), &price)
-	return price
-}
-
-// 统计待审核、审核不通过、未提交审核包含该验证项目id的总数
-func Get_Percentage_Count_ByVerifyItemId(verifyItemId int) (cnt int64, err error) {
-	o := orm.NewOrm()
-	qs := o.QueryTable(new(Percentage))
-
-	// 过滤
-	cond := orm.NewCondition()
-	// 1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款 6-未提交审核 审核状态
-	T_State := []int{1, 3, 6}
-	cond1 := cond.And("T_State__in", T_State).And("T_item__contains", fmt.Sprintf("|%d,", verifyItemId))
-
-	cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
-	if err != nil {
-		logs.Error(lib.FuncName(), err)
-		return
-	}
-
-	return
-}

+ 6 - 3
models/Percentage/verifyCompany.go

@@ -16,10 +16,11 @@ 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_Distributor_id   string    `orm:"size(256);column(t_distributor_id);null"`               // 分销商id
+	T_Distributor_name string    `orm:"size(256);column(t_distributor_name);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_name             string    `orm:"size(256);null"`                                        // 某某公司名称
+	T_recoveries_time  string    `orm:"size(200);null"`                                        // 回款时间
 	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 第一次保存时才设置时间
@@ -29,6 +30,7 @@ type VerifyCompany_R struct {
 	T_name             string
 	T_Distributor_id   string
 	T_Distributor_name string
+	T_recoveries_time  string
 	T_State            int
 }
 
@@ -69,6 +71,7 @@ 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_recoveries_time = T.T_recoveries_time
 	T_r.T_name = T.T_name
 	T_r.T_State = T.T_State
 	return T_r

+ 239 - 21
models/RepairWorkOrder/RepairWorkOrder.go

@@ -1,25 +1,243 @@
 package RepairWorkOrder
 
+import (
+	"ERP_storage/logs"
+	"ERP_storage/models/Account"
+	"github.com/beego/beego/v2/adapter/orm"
+	orm2 "github.com/beego/beego/v2/client/orm"
+	"gogs.baozhida.cn/zoie/ERP_libs/lib"
+)
+
+const (
+	Delete                int = iota
+	RepairWorkOrderOrder      // 已下发
+	RepairWorkOrderRepair     // 维修中
+	RepairWorkOrderReturn     // 已归还
+	RepairWorkOrderFinish     // 已完结
+)
+
 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
+	Id                   int    `orm:"column(ID);size(11);auto;pk"`
+	T_order_date         string `orm:"size(256);null"`     // 下单日期
+	T_repair_date        string `orm:"size(256);null"`     // 维修日期
+	T_finish_date        string `orm:"size(256);null"`     // 完结日期
+	T_state              int    `orm:"size(2);default(1)"` // 1已派发 2维修中 3已归还 4已完结
+	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_date        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_malfunction_reason string `orm:"size(256);null"`     // 故障原因
+	T_remark             string `orm:"size(256);null"`     // 备注
+	T_sn                 string `orm:"type(text);null"`    // sn
+}
+
+type RepairWorkOrder_R struct {
+	Id                   int    `orm:"column(ID);size(11);auto;pk"`
+	T_order_date         string `orm:"size(256);null"`     // 下单日期
+	T_repair_date        string `orm:"size(256);null"`     // 维修日期
+	T_finish_date        string `orm:"size(256);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_name       string `orm:"size(256);null"`     // 接收人
+	T_delivery_name      string `orm:"size(256);null"`     // 交付人
+	T_return_name        string `orm:"size(256);null"`     // 归还人
+	T_return_date        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_malfunction_reason string `orm:"size(256);null"`     // 故障原因
+	T_remark             string `orm:"size(256);null"`     // 备注
+	T_sn                 string `orm:"type(text);null"`    // sn
+}
+
+func (t *RepairWorkOrder) TableName() string {
+	return "repair_work_order" // 数据库名称   // ************** 替换 FormulaList **************
+}
+
+func init() {
+	//注册模型
+	orm.RegisterModel(new(RepairWorkOrder))
+}
+func RepairWorkOrderToRepairWorkOrder_R(t RepairWorkOrder) (r RepairWorkOrder_R) {
+	r.Id = t.Id
+	if len(t.T_order_date) > 10 {
+		r.T_order_date = t.T_order_date[:10]
+	}
+	if len(t.T_repair_date) > 10 {
+		r.T_repair_date = t.T_repair_date[:10]
+	}
+	if len(t.T_finish_date) > 10 {
+		r.T_finish_date = t.T_finish_date[:10]
+	}
+	r.T_state = t.T_state
+	r.T_product = t.T_product
+	r.T_model = t.T_model
+	r.T_repair_num = t.T_repair_num
+	r.T_source = t.T_source
+	r.T_repair_reason = t.T_repair_reason
+	r.T_picture = t.T_picture
+	r.T_receive_name = Account.Read_User_T_name_Get(t.T_receive)
+	r.T_delivery_name = Account.Read_User_T_name_Get(t.T_delivery)
+	r.T_return_name = Account.Read_User_T_name_Get(t.T_return)
+	r.T_return_date = t.T_return_date
+	r.T_return_product = t.T_return_product
+	r.T_return_model = t.T_return_model
+	r.T_return_num = t.T_return_num
+	r.T_staging_num = t.T_staging_num
+	r.T_scrap_num = t.T_scrap_num
+	r.T_malfunction_reason = t.T_malfunction_reason
+	r.T_remark = t.T_remark
+	r.T_sn = t.T_sn
+
+	return r
+}
+
+// 获取 ById
+func Read_RepairWorkOrder_ById(Id int) (r RepairWorkOrder, err error) {
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(RepairWorkOrder))
+	err = qs.Filter("Id", Id).Filter("T_state__gt", 0).One(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return
+}
+
+// 获取列表
+func Read_RepairWorkOrder_List(T_state int, T_name string, page, page_z int) (r_ []RepairWorkOrder_R, cnt int64) {
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+	qs := o.QueryTable(new(RepairWorkOrder))
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	// 过滤
+	cond := orm.NewCondition()
+	cond = cond.And("T_state__gt", 0)
+
+	if T_state > 0 {
+		cond = cond.And("T_state", T_state)
+	}
+
+	if len(T_name) > 0 {
+		cond = cond.AndCond(cond.Or("T_product__icontains", T_name).Or("T_model__icontains", T_name))
+	}
+
+	// 查询
+	var r []RepairWorkOrder
+	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond)).OrderBy("T_state").All(&r)
+
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	cnt, err = qs.SetCond((*orm2.Condition)(cond)).Count()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	for _, v := range r {
+		r_ = append(r_, RepairWorkOrderToRepairWorkOrder_R(v))
+	}
+
+	return r_, cnt
+}
+func Read_RepairWorkOrder_user_List(T_uuid string, T_state int, T_name string, page, page_z int) (r_ []RepairWorkOrder_R, cnt int64) {
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+	qs := o.QueryTable(new(RepairWorkOrder))
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	// 过滤
+	cond := orm.NewCondition()
+	cond = cond.And("T_state__gt", 0)
+	cond = cond.And("T_receive", T_uuid)
+
+	if T_state > 0 {
+		cond = cond.And("T_state", T_state)
+	}
+
+	if len(T_name) > 0 {
+		cond = cond.And("T_name__icontains", T_name)
+	}
+
+	// 查询
+	var r []RepairWorkOrder
+	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond)).OrderBy("T_state").All(&r)
+
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	cnt, err = qs.SetCond((*orm2.Condition)(cond)).Count()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	for _, v := range r {
+		r_ = append(r_, RepairWorkOrderToRepairWorkOrder_R(v))
+	}
+
+	return r_, cnt
+}
+
+// 修改
+func Update_RepairWorkOrder(m RepairWorkOrder, cols ...string) error {
+	o := orm.NewOrm()
+	_, err := o.Update(&m, cols...)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return err
+	}
+	return nil
+}
+
+// 删除
+func Delete_RepairWorkOrder(v RepairWorkOrder) error {
+	o := orm.NewOrm()
+	v.T_state = 0
+	_, err := o.Update(&v, "T_state")
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return err
+}
+
+// 添加
+func Add_RepairWorkOrder(r RepairWorkOrder) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Insert(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return id, err
 }

+ 3 - 56
models/Stock/Device.go

@@ -99,6 +99,9 @@ func DeviceToDevice_R(t Device_R) (r Device_R) {
 
 // 添加
 func (dao *DeviceDaoImpl) Add_Device(r Device) (id int64, err error) {
+	now := time.Now().Format("15:04:05")
+	date, _ := lib.TimeStrToTime(r.CreateTime.Format("2006-01-02") + " " + now)
+	r.CreateTime = date
 	id, err = dao.orm.Insert(&r)
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
@@ -117,62 +120,6 @@ func (dao *DeviceDaoImpl) AddOrUpdate_Device(r Device, T_type int) (id int64, er
 
 }
 
-//func (dao *DeviceDaoImpl) AddOrUpdate_Device1(r Device, T_type int) (id int64, err error) {
-//
-//	qs := dao.orm.QueryTable(new(Device))
-//	var device Device
-//
-//	err = qs.Filter("T_sn", r.T_sn).One(&device)
-//	if err != nil {
-//		if err.Error() == orm.ErrNoRows.Error() {
-//			r.T_remark = fmt.Sprintf("%s:%s(%s)|", time.Now().Format("2006-01-02"), "入库", r.T_in_number)
-//			if len(r.T_project) > 0 {
-//				r.T_project_log += r.T_project + "|"
-//			}
-//			id, err = dao.orm.Insert(&r)
-//			if err != nil {
-//				logs.Error(lib.FuncName(), err)
-//			}
-//			return
-//		} else {
-//			logs.Error(lib.FuncName(), err)
-//			return
-//		}
-//	}
-//
-//	T_remark := ""
-//	if T_type == 1 {
-//		T_remark = fmt.Sprintf("%s:%s(%s)|", time.Now().Format("2006-01-02"), "出库", r.T_out_number)
-//	}
-//	if T_type == 2 {
-//		T_remark = fmt.Sprintf("%s:%s(%s)|", time.Now().Format("2006-01-02"), "入库", device.T_in_number)
-//	}
-//
-//	r.Id = device.Id
-//	// T_State 1-出库 2-入库
-//	r.T_State = T_type
-//	// 出库时将入库编号服务给update结构体
-//	if len(r.T_in_number) == 0 && len(device.T_in_number) > 0 {
-//		r.T_in_number = device.T_in_number
-//	}
-//
-//	r.T_remark = device.T_remark + T_remark
-//	if len(r.T_project) > 0 {
-//		r.T_project_log = device.T_project_log + r.T_project + "|"
-//	} else {
-//		r.T_project_log = device.T_project_log
-//		r.T_project = device.T_project
-//	}
-//
-//	_, err = dao.orm.Update(&r, "T_contract_number", "T_in_number", "T_out_number", "T_State", "T_remark", "T_project", "T_project_log")
-//	if err != nil {
-//		logs.Error(lib.FuncName(), err)
-//		return
-//	}
-//
-//	return
-//}
-
 func (dao *DeviceDaoImpl) Read_Device_ByT_sn(T_sn string) (r Device, err error) {
 	qs := dao.orm.QueryTable(new(Device))
 	var list []Device

+ 2 - 0
models/init.go

@@ -5,6 +5,7 @@ import (
 	"ERP_storage/models/ContractReview"
 	"ERP_storage/models/IOTNetworkCard"
 	"ERP_storage/models/Percentage"
+	"ERP_storage/models/RepairWorkOrder"
 	"ERP_storage/models/validationtool"
 	_ "github.com/go-sql-driver/mysql"
 	"log"
@@ -27,6 +28,7 @@ func AutoMigrateDB() {
 			&IOTNetworkCard.IOTNetworkCard{},
 			&Percentage.VerifyCompany{},
 			&Percentage.Percentage{},
+			&RepairWorkOrder.RepairWorkOrder{},
 		)
 	if err != nil {
 		log.Fatalf("migrate db fail: %v", err)

+ 118 - 41
models/validationtool/validation.go

@@ -12,44 +12,24 @@ import (
 )
 
 type ValidationTool struct {
-	Id                int       `orm:"column(ID);size(11);auto;pk"`
-	T_contract_number string    `orm:"size(256);null"`                                        // 合同编号
-	T_class           int       `orm:"size(20);default(0)"`                                   // 产品分类 T_class=0 冷链验证
-	T_product_id      int       `orm:"size(20);null"`                                         // 产品id
-	Validationnumber  string    `orm:"size(256);null"`                                        // 验证工具编号
-	T_out_number      string    `orm:"size(256);null"`                                        // 出库编号
-	T_sn              string    `orm:"size(256);null"`                                        // 设备sn
-	T_iccid           string    `orm:"size(256);null"`                                        // sim卡号
-	T_imei            string    `orm:"size(256);null"`                                        // 模组imei
-	History_iccid     string    `orm:"size(256);type(json);null"`                             // 历史sim卡号
-	History_imei      string    `orm:"size(256);type(json);null"`                             //历史模组
-	T_state           int       `orm:"size(2);default(2)"`                                    // 1-已出库 2-待使用  3-待维修
-	T_remark          string    `orm:"type(text);null"`                                       // 备注
-	T_project         string    `orm:"type(text);null"`                                       // 出库项目
-	T_project_log     string    `orm:"type(text);null"`                                       // 出库项目
-	T_uuid            string    `orm:"size(256);null"`                                        //用户uuid
-	LendUser          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 保存时都会对时间自动更新
-}
-type ValidationToolUseRecord struct {
-	Id                int       `orm:"column(ID);size(11);auto;pk"`
-	T_contract_number string    `orm:"size(256);null"`                                        // 合同编号
-	T_product_id      int       `orm:"size(20);null"`                                         // 产品id
-	Validationnumber  string    `orm:"size(256);null"`                                        // 验证工具编号
-	T_out_number      string    `orm:"size(256);null"`                                        // 出库编号
-	T_sn              string    `orm:"size(256);null"`                                        // 设备sn
-	T_iccid           string    `orm:"size(256);null"`                                        // sim卡号
-	T_imei            string    `orm:"size(256);null"`                                        // 模组imei
-	History_iccid     string    `orm:"size(256);type(json);null"`                             // 历史sim卡号
-	History_imei      string    `orm:"size(256);type(json);null"`                             //历史模组
-	T_state           int       `orm:"size(2);default(2)"`                                    // 1-已出库 2-未出库/入库
-	T_remark          string    `orm:"type(text);null"`                                       // 备注
-	T_project         string    `orm:"type(text);null"`                                       // 出库项目
-	T_project_log     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 保存时都会对时间自动更新
+	Id               int       `orm:"column(ID);size(11);auto;pk"`                           // 合同编号
+	T_class          int       `orm:"size(20);default(0)"`                                   // 产品分类 T_class=0 冷链验证 	// 产品id
+	Validationnumber string    `orm:"size(256);null"`                                        // 验证工具编号
+	T_sn             string    `orm:"size(256);null"`                                        // 设备sn
+	T_iccid          string    `orm:"size(256);null"`                                        // sim卡号
+	T_imei           string    `orm:"size(256);null"`                                        // 模组imei
+	History_iccid    string    `orm:"size(256);type(json);null"`                             // 历史sim卡号
+	History_imei     string    `orm:"size(256);type(json);null"`                             // 历史模组
+	T_state          int       `orm:"size(2);default(2)"`                                    // 1-已出库 2-待使用  3-维修中 4-已报废
+	T_remark         string    `orm:"type(text);null"`                                       // 备注
+	T_project        string    `orm:"type(text);null"`                                       // 出库项目
+	T_project_log    string    `orm:"type(text);null"`                                       // 出库项目
+	T_uuid           string    `orm:"size(256);null"`                                        //用户uuid
+	LendUser         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 保存时都会对时间自动更新
 }
+
 type AddValidationTool struct {
 	T_sn             string `json:"T_sn"`
 	Validationnumber string `json:"Validationnumber"`
@@ -64,12 +44,16 @@ type LendValidationTool struct {
 	LendUser         string `json:"LendUser"`
 }
 
+type ValidationStat struct {
+	T_project  string // 出库项目
+	LendUser   string // 借出用户
+	TotalCount int    // 项目数量
+	T_state    int
+}
+
 func (t *ValidationTool) TableName() string {
 	return "ValidationTool"
 }
-func (t *ValidationToolUseRecord) TableName() string {
-	return "ValidationToolRecord"
-}
 
 type ValidationImpl struct {
 	orm orm.Ormer
@@ -88,7 +72,6 @@ func NewValidationToolUseRecord(orm orm.Ormer) *ValidationUseRecordImpl {
 func init() {
 	//注册模型
 	orm.RegisterModel(new(ValidationTool))
-	orm.RegisterModel(new(ValidationToolUseRecord))
 }
 
 // ADDValidationTool 添加
@@ -228,3 +211,97 @@ func (dao *ValidationImpl) DeleteValidationTool(sn string) (err error) {
 	_, err = qs.Filter("t_sn", sn).Delete()
 	return err
 }
+
+func (dao *ValidationImpl) Validation_stat(LendUser, T_project string, page, page_z int) (maps []ValidationStat, count int64) {
+	var offset int
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = (page - 1) * page_z
+	}
+
+	// 过滤
+	sqlWhere := " WHERE id > 0"
+	if len(LendUser) > 0 {
+		if LendUser == "未出库" {
+			sqlWhere += " AND lend_user = ''"
+		} else {
+			sqlWhere += " AND lend_user like \"%" + LendUser + "%\""
+		}
+	}
+	if len(T_project) > 0 {
+		sqlWhere += " AND t_project like \"%" + T_project + "%\""
+	}
+
+	sql := "SELECT t_project,lend_user,t_state,COUNT(*) as total_count FROM ValidationTool"
+
+	sql = sql + sqlWhere
+
+	sql += " GROUP BY lend_user,t_project ORDER BY lend_user"
+
+	var maps_z []orm2.ParamsList
+	// 获取总条数
+	countSql := "SELECT COUNT(*) FROM (" + sql + ") as subquery"
+	fmt.Println(sql)
+	_, err := dao.orm.Raw(countSql).ValuesList(&maps_z)
+	if err != nil {
+		return maps, 0
+	}
+	if len(maps_z) == 0 {
+		return maps, 0
+	}
+
+	if page_z != 9999 {
+		sql += " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
+	}
+
+	fmt.Println(sql)
+	_, err = dao.orm.Raw(sql).QueryRows(&maps)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return maps, 0
+	}
+	cnt, _ := strconv.Atoi(maps_z[0][0].(string))
+	return maps, int64(cnt)
+}
+
+func (dao *ValidationImpl) Read_lend_user_List(T_name string, page, page_z int) (lists []ValidationStat, count int64) {
+
+	var offset int
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = (page - 1) * page_z
+	}
+
+	o := orm.NewOrm()
+	sql := "SELECT lend_user,count(*) as total_count FROM ValidationTool"
+	if len(T_name) > 0 {
+		sql += " WHERE lend_user like \"%" + T_name + "%\""
+	}
+	sql += " GROUP BY lend_user ORDER BY lend_user"
+	var maps_z []orm2.ParamsList
+	// 获取总条数
+	countSql := "SELECT COUNT(*) FROM (" + sql + ") as subquery"
+	fmt.Println(sql)
+	_, err := dao.orm.Raw(countSql).ValuesList(&maps_z)
+	if err != nil {
+		return lists, 0
+	}
+	if len(maps_z) == 0 {
+		return lists, 0
+	}
+
+	if page_z != 9999 {
+		sql += " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
+	}
+
+	_, err = o.Raw(sql).QueryRows(&lists)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	cnt, _ := strconv.Atoi(maps_z[0][0].(string))
+	return lists, int64(cnt)
+
+}

+ 14 - 12
routers/Contract.go

@@ -8,17 +8,18 @@ import (
 func init() {
 
 	contract := beego.NewNamespace("/Contract",
-		beego.NSRouter("/List", &controllers.ContractController{}, "*:Contract_List"),                 // 合同列表
-		beego.NSRouter("/User_List", &controllers.ContractController{}, "*:Contract_User_List"),       // 合同列表 - 销售人员
-		beego.NSRouter("/Get", &controllers.ContractController{}, "*:Contract_Get"),                   // 合同详情
-		beego.NSRouter("/Approval", &controllers.ContractController{}, "*:Contract_Approval"),         // 合同详情
-		beego.NSRouter("/Add", &controllers.ContractController{}, "*:Contract_Add"),                   // 添加合同
-		beego.NSRouter("/Edit", &controllers.ContractController{}, "*:Contract_Edit"),                 // 编辑合同
-		beego.NSRouter("/Del", &controllers.ContractController{}, "*:Contract_Del"),                   // 删除合同
-		beego.NSRouter("/Product_List", &controllers.ContractController{}, "*:Contract_Product_List"), // 合同产品列表
-		beego.NSRouter("/Out_List", &controllers.ContractController{}, "*:Contract_List_For_Out"),     // 合同产品列表
-		beego.NSRouter("/Gen_Number", &controllers.ContractController{}, "*:Contract_GenT_number"),    // 生成合同编号
-		beego.NSRouter("/Stat", &controllers.ContractController{}, "*:Contract_Stat"),                 // 统计合同金额
+		beego.NSRouter("/List", &controllers.ContractController{}, "*:Contract_List"),                         // 合同列表
+		beego.NSRouter("/User_List", &controllers.ContractController{}, "*:Contract_User_List"),               // 合同列表 - 销售人员
+		beego.NSRouter("/Get", &controllers.ContractController{}, "*:Contract_Get"),                           // 合同详情
+		beego.NSRouter("/Approval", &controllers.ContractController{}, "*:Contract_Approval"),                 // 合同详情
+		beego.NSRouter("/Add", &controllers.ContractController{}, "*:Contract_Add"),                           // 添加合同
+		beego.NSRouter("/Edit", &controllers.ContractController{}, "*:Contract_Edit"),                         // 编辑合同
+		beego.NSRouter("/Del", &controllers.ContractController{}, "*:Contract_Del"),                           // 删除合同
+		beego.NSRouter("/Product_List", &controllers.ContractController{}, "*:Contract_Product_List"),         // 合同产品列表
+		beego.NSRouter("/Out_List", &controllers.ContractController{}, "*:Contract_List_For_Out"),             // 合同产品列表
+		beego.NSRouter("/Gen_Number", &controllers.ContractController{}, "*:Contract_GenT_number"),            // 生成合同编号
+		beego.NSRouter("/Stat", &controllers.ContractController{}, "*:Contract_Stat"),                         // 统计合同金额
+		beego.NSRouter("/Percentage_Remit", &controllers.ContractController{}, "*:Contract_Percentage_Remit"), // 提成打款
 	)
 	verifyContract := beego.NewNamespace("/VerifyContract",
 		beego.NSRouter("/List", &controllers.ContractController{}, "*:VerifyContract_List"),                       // 验证合同列表
@@ -30,7 +31,8 @@ func init() {
 		beego.NSRouter("/Update_Customer", &controllers.ContractController{}, "*:VerifyContract_Update_Customer"), // 编辑客户
 	)
 	recoveriesContract := beego.NewNamespace("/RecoveriesContract",
-		beego.NSRouter("/List", &controllers.ContractController{}, "*:Contract_List_RecoveriesMoney"), // 回款明细列表
+		beego.NSRouter("/List", &controllers.ContractController{}, "*:Contract_List_RecoveriesMoney"),          // 回款明细列表
+		beego.NSRouter("/Export", &controllers.ContractController{}, "*:Contract_List_RecoveriesMoney_Export"), // 回款明细列表
 	)
 	beego.AddNamespace(contract, verifyContract, recoveriesContract)
 }

+ 22 - 0
routers/RepairWorkOrder.go

@@ -0,0 +1,22 @@
+package routers
+
+import (
+	"ERP_storage/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+
+	RepairWorkOrder := beego.NewNamespace("/RepairWorkOrder",
+		beego.NSRouter("/List", &controllers.RepairWorkOrderController{}, "*:RepairWorkOrder_List"),                 //
+		beego.NSRouter("/User_List", &controllers.RepairWorkOrderController{}, "*:RepairWorkOrder_User_List"),       //
+		beego.NSRouter("/Add", &controllers.RepairWorkOrderController{}, "*:RepairWorkOrder_Add"),                   //
+		beego.NSRouter("/Edit", &controllers.RepairWorkOrderController{}, "*:RepairWorkOrder_Edit"),                 //
+		beego.NSRouter("/Del", &controllers.RepairWorkOrderController{}, "*:RepairWorkOrder_Del"),                   //
+		beego.NSRouter("/Return", &controllers.RepairWorkOrderController{}, "*:RepairWorkOrder_Return"),             // 归还
+		beego.NSRouter("/Redeploy", &controllers.RepairWorkOrderController{}, "*:RepairWorkOrder_Redeploy"),         // 转派
+		beego.NSRouter("/Start_Repair", &controllers.RepairWorkOrderController{}, "*:RepairWorkOrder_Start_Repair"), // 转派
+		beego.NSRouter("/Finish", &controllers.RepairWorkOrderController{}, "*:RepairWorkOrder_Finish"),             // 转派
+	)
+	beego.AddNamespace(RepairWorkOrder)
+}

+ 4 - 0
routers/vaildationTool.go

@@ -12,11 +12,15 @@ func init() {
 		beego.NSRouter("/list", &controllers.ValidationController{}, "*:ValidationList"),                       // 获取验证工具列表
 		beego.NSRouter("/del", &controllers.ValidationController{}, "*:DeleteValidationTool"),                  // 删除验证工具
 		beego.NSRouter("/update", &controllers.ValidationController{}, "*:UpdateValidationTool"),               // 修改验证工具
+		beego.NSRouter("/scrap", &controllers.ValidationController{}, "*:ScrapValidationTool"),                 // 修改验证工具
+		beego.NSRouter("/repair", &controllers.ValidationController{}, "*:RepairValidationTool"),               // 修改验证工具
 		beego.NSRouter("/readValidation", &controllers.ValidationController{}, "*:GetValidationToolBySn"),      // 修改验证工具
 		beego.NSRouter("/updateValidation", &controllers.ValidationController{}, "*:UpdateValidationToolBySn"), // 修改验证工具
 		beego.NSRouter("/ImportExcel", &controllers.ValidationController{}, "*:ImportExcel"),                   // 读取文件
 		beego.NSRouter("/exportExcel", &controllers.ValidationController{}, "*:ExportValidationListExcel"),     // 读取文件
 		beego.NSRouter("/class/list", &controllers.ValidationController{}, "*:Read_ValidationClass_List"),      // 读取文件
+		beego.NSRouter("/stat", &controllers.ValidationController{}, "*:Validation_stat"),                      // 读取文件
+		beego.NSRouter("/user/list", &controllers.ValidationController{}, "*:User_List"),                       // 读取文件
 	)
 	beego.AddNamespace(validationTool)
 }