zoie 1 an în urmă
părinte
comite
634ed2a75a

+ 7 - 7
Nats/Nats.go

@@ -34,7 +34,7 @@ func init() {
 func NatsInit() {
 
 	// 发布-订阅 模式,异步订阅 test1
-	_, _ = Nats.Subscribe(conf.Sys_Name+"_Read_Menu_List", func(m *nats.Msg) {
+	_, _ = Nats.Subscribe(conf.NatsSubj_Prefix+conf.Sys_Name+"_Read_Menu_List", func(m *nats.Msg) {
 
 		var t_R lib.JSONS
 
@@ -59,7 +59,7 @@ func NatsInit() {
 
 	})
 
-	_, _ = Nats.Subscribe(conf.Sys_Name+"_Read_User_Bind_Menu_List", func(m *nats.Msg) {
+	_, _ = Nats.Subscribe(conf.NatsSubj_Prefix+conf.Sys_Name+"_Read_User_Bind_Menu_List", func(m *nats.Msg) {
 
 		var t_R lib.JSONS
 
@@ -95,7 +95,7 @@ func NatsInit() {
 
 	})
 
-	_, _ = Nats.Subscribe(conf.Sys_Name+"_Add_Power", func(m *nats.Msg) {
+	_, _ = Nats.Subscribe(conf.NatsSubj_Prefix+conf.Sys_Name+"_Add_Power", func(m *nats.Msg) {
 
 		var t_Req powerlibs.Power
 		var t_R lib.JSONS
@@ -131,7 +131,7 @@ func NatsInit() {
 
 	})
 
-	_, _ = Nats.Subscribe(conf.Sys_Name+"_Read_Power_ByT_id", func(m *nats.Msg) {
+	_, _ = Nats.Subscribe(conf.NatsSubj_Prefix+conf.Sys_Name+"_Read_Power_ByT_id", func(m *nats.Msg) {
 		fmt.Printf("ERP_storage_Read_Power_ByT_id message: %+v\n", string(m.Data))
 
 		var t_R lib.JSONS
@@ -156,7 +156,7 @@ func NatsInit() {
 
 	})
 
-	_, _ = Nats.Subscribe(conf.Sys_Name+"_Update_Power", func(m *nats.Msg) {
+	_, _ = Nats.Subscribe(conf.NatsSubj_Prefix+conf.Sys_Name+"_Update_Power", func(m *nats.Msg) {
 
 		var t_Req powerlibs.Power
 		var t_R lib.JSONS
@@ -194,7 +194,7 @@ func NatsInit() {
 
 	})
 
-	_, _ = Nats.Subscribe(conf.Sys_Name+"_Delete_Power", func(m *nats.Msg) {
+	_, _ = Nats.Subscribe(conf.NatsSubj_Prefix+conf.Sys_Name+"_Delete_Power", func(m *nats.Msg) {
 
 		var t_Req powerlibs.Power
 		var t_R lib.JSONS
@@ -233,7 +233,7 @@ func NatsInit() {
 	})
 
 	// 更新合同状态
-	_, _ = Nats.Subscribe(conf.Sys_Name+"_Update_Contract_T_out", func(m *nats.Msg) {
+	_, _ = Nats.Subscribe(conf.NatsSubj_Prefix+conf.Sys_Name+"_Update_Contract_T_out", func(m *nats.Msg) {
 
 		fmt.Printf(conf.Sys_Name+"_Update_Contract_T_out message: %v\n", string(m.Data))
 

+ 18 - 6
Nats/NatsServer/NatsERP_user.go

@@ -2,6 +2,7 @@ package NatsServer
 
 import (
 	"ERP_storage/Nats"
+	"ERP_storage/conf"
 	"ERP_storage/logs"
 	natslibs "git.baozhida.cn/ERP_libs/Nats"
 	powerlibs "git.baozhida.cn/ERP_libs/Power"
@@ -12,7 +13,7 @@ import (
 // 验证TOKEY
 func Verification(GetCookie string, GetString string) (user userlibs.User, err error) {
 
-	nats := natslibs.NewNats(Nats.Nats)
+	nats := natslibs.NewNats(Nats.Nats, conf.NatsSubj_Prefix)
 	user, err = nats.Verification(GetCookie, GetString)
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
@@ -23,7 +24,7 @@ func Verification(GetCookie string, GetString string) (user userlibs.User, err e
 }
 
 func Read_User_List_All() (user []userlibs.User, err error) {
-	nats := natslibs.NewNats(Nats.Nats)
+	nats := natslibs.NewNats(Nats.Nats, conf.NatsSubj_Prefix)
 	user, err = nats.Read_User_List_All()
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
@@ -33,8 +34,19 @@ func Read_User_List_All() (user []userlibs.User, err error) {
 
 }
 
+func Read_User_List_T_uuid(T_name string, T_uuid_list []string, page, page_z int) (user []userlibs.User, cnt int64, err error) {
+	nats := natslibs.NewNats(Nats.Nats, conf.NatsSubj_Prefix)
+	user, cnt, err = nats.Read_User_List_T_uuid(T_name, T_uuid_list, page, page_z)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return user, cnt, err
+	}
+	return user, cnt, nil
+
+}
+
 func Read_Power_List_All() (power []powerlibs.Power_R, err error) {
-	nats := natslibs.NewNats(Nats.Nats)
+	nats := natslibs.NewNats(Nats.Nats, conf.NatsSubj_Prefix)
 	power, err = nats.Read_Power_List_All()
 	if err != nil {
 		logs.Error(lib.FuncName(), err)
@@ -46,18 +58,18 @@ func Read_Power_List_All() (power []powerlibs.Power_R, err error) {
 
 // 添加系统日志
 func AddSysLogs(T_class, T_title string, T_txt interface{}) {
-	nats := natslibs.NewNats(Nats.Nats)
+	nats := natslibs.NewNats(Nats.Nats, conf.NatsSubj_Prefix)
 	nats.AddSysLogs(T_class, T_title, T_txt)
 }
 
 // 添加用户日志
 func AddUserLogs(T_uuid, T_class, T_title string, T_txt interface{}) {
-	nats := natslibs.NewNats(Nats.Nats)
+	nats := natslibs.NewNats(Nats.Nats, conf.NatsSubj_Prefix)
 	nats.AddUserLogs(T_uuid, T_class, T_title, T_txt)
 }
 
 // 添加用户日志
 func AddNews(T_uuid, T_title, T_Url string) {
-	nats := natslibs.NewNats(Nats.Nats)
+	nats := natslibs.NewNats(Nats.Nats, conf.NatsSubj_Prefix)
 	nats.AddNews(T_uuid, T_title, T_Url)
 }

+ 5 - 2
conf/app.conf

@@ -7,8 +7,8 @@ copyrequestbody = true
 
 Sys_Name = "ERP_STORAGE"
 # Nats
-# NatsServer_Url = "192.168.192.251:4222"
-NatsServer_Url = "175.178.229.79:4222"
+NatsServer_Url = "127.0.0.1:4223"
+NatsSubj_Prefix = "Test_"
 
 
 # Mysql 线上
@@ -38,6 +38,9 @@ FilterOnlyLoginCheckURL =
 # 消息通知前端页面跳转url
 ContractApprovalUrl = "/contract"
 VerifyContractUrl = "/contract"
+PercentageApprovalUrl = "/percentage"
+# 财务uuid
+FinanceUuid = "NeGSMvREXA8xDZWo6q1YjLHTm0dJg7zc"
 
 # 静态资源
 Qiniu_AccessKey = -8ezB_d-8-eUFTMvhOGbGzgeQRPeKQnaQ3DBcUxo

+ 5 - 0
conf/config.go

@@ -4,6 +4,8 @@ import beego "github.com/beego/beego/v2/server/web"
 
 var Page_size = 10
 var NatsServer_Url, _ = beego.AppConfig.String("NatsServer_Url")
+var NatsSubj_Prefix, _ = beego.AppConfig.String("NatsSubj_Prefix")
+
 var RunMode, _ = beego.AppConfig.String("RunMode")
 
 var Sys_Name, _ = beego.AppConfig.String("Sys_Name")
@@ -40,3 +42,6 @@ var OssQiniu, _ = beego.AppConfig.String("OssQiniu")
 // 消息通知前端页面跳转url
 var ContractApprovalUrl, _ = beego.AppConfig.String("ContractApprovalUrl")
 var VerifyContractUrl, _ = beego.AppConfig.String("VerifyContractUrl")
+var PercentageApprovalUrl, _ = beego.AppConfig.String("PercentageApprovalUrl")
+var MyPercentageUrl, _ = beego.AppConfig.String("MyPercentageUrl")
+var FinanceUuid, _ = beego.AppConfig.String("FinanceUuid")

+ 29 - 0
controllers/Basic.go

@@ -417,3 +417,32 @@ func (c *BasicController) Product_Del() {
 	c.ServeJSON()
 	return
 }
+
+// 验证项目
+func (c *BasicController) VerifyItem_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_type, _ := c.GetInt("T_type")
+
+	R_List, R_cnt := Basic.Read_VerifyItem_List(T_type, 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
+}

+ 65 - 55
controllers/Contract.go

@@ -210,7 +210,7 @@ func (c *ContractController) Contract_Add() {
 
 	if len(T_product) == 0 {
 		o.Rollback()
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "销售合同产品明细不能为空"}
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "合同产品明细不能为空"}
 		c.ServeJSON()
 		return
 	}
@@ -355,18 +355,9 @@ func (c *ContractController) Contract_Edit() {
 		return
 	}
 
-	//合同类型 1-销售合同 2-验证合同
-	if contract.T_type == 2 {
-		o.Commit()
-		NatsServer.AddUserLogs(c.User.T_uuid, "合同", "修改", contract)
-		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: contract.Id}
-		c.ServeJSON()
-		return
-	}
-
 	if len(T_product) == 0 {
 		o.Rollback()
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "销售合同产品明细不能为空"}
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "合同产品明细不能为空"}
 		c.ServeJSON()
 		return
 	}
@@ -394,50 +385,6 @@ func (c *ContractController) Contract_Edit() {
 			return
 		}
 	}
-	//for _, v := range productList {
-	//	product_id, _ := strconv.Atoi(strings.Split(v, ",")[0])
-	//	num, _ := strconv.Atoi(strings.Split(v, ",")[1])
-	//
-	//	var cp Contract.ContractProduct
-	//	cp, err = ContractProductDao.Read_ContractProduct_ByT_number_T_product_id(T_number, product_id)
-	//	if err != nil {
-	//		if err.Error() == orm.ErrNoRows.Error() {
-	//			contractProduct := Contract.ContractProduct{
-	//				T_contract_number: T_number,
-	//				T_product_id:      product_id,
-	//				T_product_total:   num,
-	//				T_product_out:     0, // 已出库数量
-	//				T_State:           1, // 1-未出库 2-已部分出库 3-已全部出库
-	//			}
-	//			_, err = ContractProductDao.Add_ContractProduct(contractProduct)
-	//			if err != nil {
-	//				o.Rollback()
-	//				c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
-	//				c.ServeJSON()
-	//				return
-	//			}
-	//
-	//		} else {
-	//			o.Rollback()
-	//			c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
-	//			c.ServeJSON()
-	//			return
-	//		}
-	//	}
-	//	// 修改产品总数量
-	//	if cp.T_product_total == num {
-	//		continue
-	//	}
-	//	cp.T_product_total = num
-	//	err = ContractProductDao.Update_ContractProduct(cp, "T_product_total")
-	//	if err != nil {
-	//		o.Rollback()
-	//		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
-	//		c.ServeJSON()
-	//		return
-	//	}
-	//
-	//}
 	for _, v := range productList {
 		product_id, _ := strconv.Atoi(strings.Split(v, ",")[0])
 		num, _ := strconv.Atoi(strings.Split(v, ",")[1])
@@ -1185,6 +1132,69 @@ func (c *ContractController) Contract_List_RecoveriesMoney() {
 	c.ServeJSON()
 	return
 }
+func (c *ContractController) Contract_Stat() {
+
+	T_type, _ := c.GetInt("T_type")
+	T_year, _ := c.GetInt("T_year")
+
+	type R_JSONS struct {
+		ContractMoneyByYear   interface{}
+		TotalMoneyByYear      float32
+		RecoveriesMoneyByYear float32
+		ContractNumByYear     interface{}
+		TotalMumByYear        int64
+
+		ContractMoneyByMonth   interface{}
+		TotalMoneyByMonth      float32
+		RecoveriesMoneyByMonth float32
+		ContractNumByMonth     interface{}
+		TotalMumByMonth        int64
+
+		TotalMoneyByThisYear      float32 // 今年合同总金额
+		RecoveriesMoneyByThisYear float32 // 今年回款总金额
+		TotalMumByThisYear        int64   // 今年合同总数
+
+		TotalMoneyByLastYear      float32 // 去年合同总金额
+		RecoveriesMoneyByLastYear float32 // 去年回款总金额
+		TotalMumByLastYear        int64   // 去年合同总数
+	}
+
+	var r_jsons R_JSONS
+	thisYear := time.Now().Year()
+	if T_year == 0 {
+		T_year = thisYear
+	}
+
+	ContractDao := Contract.NewContract(orm.NewOrm())
+	monryStat, moneyTotal, moneyRecoveries := ContractDao.Stat_ContractMoney_ByYear(T_type)
+	numStat, numTotal := ContractDao.Stat_ContractNum_ByYear(T_type)
+
+	monryMonthStat, moneyMonthTotal, moneyMonthRecoveries := ContractDao.Stat_ContractMoney_ByMonth(T_type, T_year)
+	numMonthStat, numMonthTotal := ContractDao.Stat_ContractNum_ByMonth(T_type, T_year)
+	// 去年
+	_, r_jsons.TotalMoneyByLastYear, r_jsons.RecoveriesMoneyByLastYear = ContractDao.Stat_ContractMoney_ByMonth(T_type, T_year-1)
+	_, r_jsons.TotalMumByLastYear = ContractDao.Stat_ContractNum_ByMonth(T_type, T_year-1)
+
+	r_jsons.ContractMoneyByYear = monryStat
+	r_jsons.TotalMoneyByYear = moneyTotal
+	r_jsons.RecoveriesMoneyByYear = moneyRecoveries
+	r_jsons.ContractNumByYear = numStat
+	r_jsons.TotalMumByYear = numTotal
+
+	r_jsons.ContractMoneyByMonth = monryMonthStat
+	r_jsons.TotalMoneyByMonth = moneyMonthTotal
+	r_jsons.RecoveriesMoneyByMonth = moneyMonthRecoveries
+	r_jsons.ContractNumByMonth = numMonthStat
+	r_jsons.TotalMumByMonth = numMonthTotal
+
+	r_jsons.TotalMoneyByThisYear = moneyMonthTotal
+	r_jsons.RecoveriesMoneyByThisYear = moneyMonthRecoveries
+	r_jsons.TotalMumByThisYear = numMonthTotal
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
 
 func Cron_VerifyContract() {
 

+ 493 - 0
controllers/Percentage.go

@@ -0,0 +1,493 @@
+package controllers
+
+import (
+	"ERP_storage/Nats/NatsServer"
+	"ERP_storage/conf"
+	"ERP_storage/models/Account"
+	"ERP_storage/models/Contract"
+	"ERP_storage/models/Percentage"
+	"ERP_storage/models/Stock"
+	"fmt"
+	userlibs "git.baozhida.cn/ERP_libs/User"
+	"git.baozhida.cn/ERP_libs/lib"
+	"github.com/beego/beego/v2/adapter/orm"
+	beego "github.com/beego/beego/v2/server/web"
+	"math"
+)
+
+type PercentageController struct {
+	beego.Controller
+	User userlibs.User
+}
+
+func (c *PercentageController) Prepare() {
+	c.User = *Account.User_r
+}
+
+// 财务管理列表
+func (c *PercentageController) Percentage_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_uuid := c.GetString("T_uuid")
+	T_state, _ := c.GetInt("T_state")
+
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
+	Contract.Read_Contract_All_Map()
+	Contract.Read_VerifyContract_All_Map()
+
+	PercentageDao := Percentage.NewPercentage(orm.NewOrm())
+	R_List, R_cnt := PercentageDao.Read_Percentage_List(T_name, T_uuid, T_state, page, page_z)
+
+	var r_jsons lib.R_JSONS
+	r_jsons.Num = R_cnt
+	r_jsons.Data = R_List
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(R_cnt) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+func (c *PercentageController) Percentage_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")
+
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
+	Contract.Read_Contract_All_Map()
+	Contract.Read_VerifyContract_All_Map()
+
+	PercentageDao := Percentage.NewPercentage(orm.NewOrm())
+	R_List, R_cnt := PercentageDao.Read_Percentage_User_List(c.User.T_uuid, T_name, T_state, page, page_z)
+
+	var r_jsons lib.R_JSONS
+	r_jsons.Num = R_cnt
+	r_jsons.Data = R_List
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(R_cnt) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+func (c *PercentageController) Percentage_Get() {
+
+	// 查询
+	T_id, _ := c.GetInt("T_id")
+
+	o := orm.NewOrm()
+	PercentageDao := Percentage.NewPercentage(o)
+	ContractDao := Contract.NewContract(o)
+	DeviceDao := Stock.NewDevice(o)
+	contractProductDao := Contract.NewContractProduct(o)
+	percentage, err := PercentageDao.Read_Percentage_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
+		c.ServeJSON()
+		return
+	}
+	contract, err := ContractDao.Read_Contract_ByT_number(percentage.T_number)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
+		c.ServeJSON()
+		return
+	}
+	productList := contractProductDao.Read_ContractProduct_List(contract.T_number)
+
+	var pList []Contract.ContractProduct_R
+	for _, v := range productList {
+		p := Contract.ContractProductToContractProduct_R(v)
+		p.T_device_list, _ = DeviceDao.Read_DeviceSn_List(contract.T_number, v.T_product_id, "", "")
+		pList = append(pList, p)
+	}
+
+	userList, _ := NatsServer.Read_User_List_All()
+	Account.Read_User_All_Map(userList)
+	Contract.Read_VerifyContract_All_Map()
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Percentage.PercentageToPercentage_Detail(percentage, contract, pList)}
+	c.ServeJSON()
+	return
+}
+
+func (c *PercentageController) Percentage_Add() {
+
+	T_number := c.GetString("T_number")
+	T_uuid := c.GetString("T_uuid")
+	T_money, _ := c.GetFloat("T_money") // 总价
+	T_type, _ := c.GetInt("T_type")     // 类型
+	T_item := c.GetString("T_item")
+
+	if len(T_item) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "提成明细不能为空"}
+		c.ServeJSON()
+		return
+	}
+
+	var_ := Percentage.Percentage{
+		T_number: T_number,
+		T_uuid:   T_uuid,
+		T_money:  float32(T_money),
+		T_type:   T_type, //类型 1-验证实施 2-报告编写
+		T_State:  1,
+		T_submit: c.User.T_uuid,
+		T_item:   T_item,
+	}
+
+	o := orm.NewOrm()
+	o.Begin()
+	PercentageDao := Percentage.NewPercentage(o)
+
+	var T_type_str string
+	if T_type == 1 {
+		T_type_str = "验证实施"
+	}
+	if T_type == 2 {
+		T_type_str = "报告编写"
+	}
+	_, err := PercentageDao.Read_Percentage_ByT_number_T_type(T_number, T_type)
+	if err == nil {
+		o.Rollback()
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("该合同已提交过%s提成申请", T_type_str)}
+		c.ServeJSON()
+		return
+	}
+
+	_, err = PercentageDao.Add_Percentage(var_)
+	if err != nil {
+		o.Rollback()
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "添加失败"}
+		c.ServeJSON()
+		return
+	}
+
+	o.Commit()
+
+	NatsServer.AddNews(conf.FinanceUuid, fmt.Sprintf("【提成申请】您有一条提成申请(%s)待审核", var_.T_number), conf.PercentageApprovalUrl)
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "提成", "添加", var_)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_number}
+	c.ServeJSON()
+	return
+}
+
+func (c *PercentageController) Percentage_Approval() {
+
+	T_id, _ := c.GetInt("T_id")
+	T_state, _ := c.GetInt("T_state")
+	if T_state != Percentage.AuditPass && T_state != Percentage.AuditUnPass {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_state Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	o := orm.NewOrm()
+	PercentageDao := Percentage.NewPercentage(o)
+
+	percentage, err := PercentageDao.Read_Percentage_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
+		c.ServeJSON()
+		return
+	}
+	// 2-已通过 3-未通过
+	percentage.T_State = T_state
+	err = PercentageDao.Update_Percentage(percentage, "T_State")
+	if err != nil {
+		o.Rollback()
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
+		c.ServeJSON()
+		return
+	}
+	if T_state == Percentage.AuditPass {
+		NatsServer.AddNews(percentage.T_uuid, fmt.Sprintf("【提成申请】您提交的提成申请(%s)审核已通过", percentage.T_number), conf.MyPercentageUrl)
+	}
+	if T_state == Percentage.AuditUnPass {
+		NatsServer.AddNews(percentage.T_uuid, fmt.Sprintf("【提成申请】您提交的提成申请(%s)审核未通过", percentage.T_number), conf.MyPercentageUrl)
+	}
+	NatsServer.AddUserLogs(c.User.T_uuid, "提成", "审核", percentage)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_id}
+	c.ServeJSON()
+	return
+}
+
+func (c *PercentageController) Percentage_Edit() {
+	T_id, _ := c.GetInt("T_id")
+	T_number := c.GetString("T_number")
+	T_uuid := c.GetString("T_uuid")
+	T_money, _ := c.GetFloat("T_money") // 总价
+	T_type, _ := c.GetInt("T_type")     // 优惠价
+	T_item := c.GetString("T_item")
+
+	if len(T_item) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "提成明细不能为空"}
+		c.ServeJSON()
+		return
+	}
+
+	var T_type_str string
+	if T_type == 1 {
+		T_type_str = "验证实施"
+	}
+	if T_type == 2 {
+		T_type_str = "报告编写"
+	}
+
+	o := orm.NewOrm()
+	PercentageDao := Percentage.NewPercentage(o)
+
+	percentage, err := PercentageDao.Read_Percentage_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	percentage1, err := PercentageDao.Read_Percentage_ByT_number_T_type(T_number, T_type)
+	if err != nil && err.Error() != orm.ErrNoRows.Error() {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
+		c.ServeJSON()
+		return
+	}
+	if percentage1.Id > 0 && percentage1.Id != percentage.Id {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("该合同已提交过%s提成申请", T_type_str)}
+		c.ServeJSON()
+		return
+	}
+
+	// 1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款  合同状态为未通过,修改之后将状态更改为待审核
+	if percentage.T_State == Percentage.AuditPass || percentage.T_State == Percentage.RemitPart || percentage.T_State == Percentage.RemitAll {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("状态为%s,禁止修改!", Percentage.Read_Audit_Get(percentage.T_State))}
+		c.ServeJSON()
+		return
+	}
+
+	if len(T_number) > 0 {
+		percentage.T_number = T_number
+	}
+	if len(T_uuid) > 0 {
+		percentage.T_uuid = T_uuid
+	}
+	if T_money > 0 {
+		percentage.T_money = float32(T_money)
+	}
+	if T_type > 0 {
+		percentage.T_type = T_type
+	}
+	if len(T_item) > 0 {
+		percentage.T_item = T_item
+	}
+	percentage.T_State = 1
+
+	err = PercentageDao.Update_Percentage(percentage, "T_number", "T_uuid", "T_money", "T_type", "T_item", "T_State")
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddNews(conf.FinanceUuid, fmt.Sprintf("【提成申请】您有一条提成申请(%s)待审核", percentage.T_number), conf.PercentageApprovalUrl)
+	NatsServer.AddUserLogs(c.User.T_uuid, "提成", "修改", percentage)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: percentage.Id}
+	c.ServeJSON()
+	return
+}
+func (c *PercentageController) Percentage_Del() {
+
+	T_id, _ := c.GetInt("T_id")
+
+	o := orm.NewOrm()
+	PercentageDao := Percentage.NewPercentage(o)
+
+	percentage, err := PercentageDao.Read_Percentage_ById(T_id)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
+		c.ServeJSON()
+		return
+	}
+	// 1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款  合同状态为未通过,修改之后将状态更改为待审核
+	if percentage.T_State == Percentage.AuditPass || percentage.T_State == Percentage.RemitPart || percentage.T_State == Percentage.RemitAll {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: fmt.Sprintf("状态为%s,禁止删除!", Percentage.Read_Audit_Get(percentage.T_State))}
+		c.ServeJSON()
+		return
+	}
+
+	err = PercentageDao.Delete_Percentage(percentage)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "提成", "删除", T_id)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: T_id}
+	c.ServeJSON()
+	return
+}
+
+// 打款
+func (c *PercentageController) Percentage_Remit() {
+	T_id, _ := c.GetInt("T_id")
+	T_remit := c.GetString("T_remit")
+
+	o := orm.NewOrm()
+	PercentageDao := Percentage.NewPercentage(o)
+
+	percentage, err := PercentageDao.Read_Percentage_ById(T_id)
+	if err != nil {
+		o.Rollback()
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	// 1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款  合同状态为未通过,修改之后将状态更改为待审核
+	if percentage.T_State == 1 || percentage.T_State == 3 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "当前状态不可添加打款信息!"}
+		c.ServeJSON()
+		return
+	}
+
+	if len(T_remit) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "打款明细不能为空"}
+		c.ServeJSON()
+		return
+	}
+
+	if len(T_remit) > 0 {
+		percentage.T_remit = T_remit
+	}
+	_, money := Percentage.PercentageToPercentageRemit_R(T_remit)
+	// 部分打款
+	if percentage.T_money > money && money > 0 {
+		percentage.T_State = 4
+	}
+	// 全部打款
+	if percentage.T_money == money {
+		percentage.T_State = 5
+	}
+
+	err = PercentageDao.Update_Percentage(percentage, "T_remit", "T_State")
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "修改失败"}
+		c.ServeJSON()
+		return
+	}
+
+	if percentage.T_State == 4 {
+		NatsServer.AddNews(percentage.T_uuid, fmt.Sprintf("【提成申请】您提交的提成申请(%s)已部分打款", percentage.T_number), conf.MyPercentageUrl)
+	}
+	if percentage.T_State == 5 {
+		NatsServer.AddNews(percentage.T_uuid, fmt.Sprintf("【提成申请】您提交的提成申请(%s)已全部打款", percentage.T_number), conf.MyPercentageUrl)
+	}
+
+	NatsServer.AddUserLogs(c.User.T_uuid, "提成", "修改", percentage)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: percentage.Id}
+	c.ServeJSON()
+	return
+}
+
+func (c *PercentageController) 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")
+
+	ReimburseDao := Percentage.NewPercentage(orm.NewOrm())
+
+	uuidList := ReimburseDao.Read_T_uuid_List()
+	if len(uuidList) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+		c.ServeJSON()
+		return
+	}
+
+	R_List, R_cnt, err := NatsServer.Read_User_List_T_uuid(T_name, uuidList, page, page_z)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败"}
+		c.ServeJSON()
+		return
+	}
+
+	var U_List []userlibs.User
+	for _, user := range R_List {
+		U_List = append(U_List, user)
+	}
+
+	r_jsons.Num = R_cnt
+	r_jsons.Data = U_List
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(R_cnt) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
+func (c *PercentageController) Contract_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")
+
+	ContractDao := Contract.NewContract(orm.NewOrm())
+	R_List, R_cnt := ContractDao.Read_Contract_List("", T_name, 0, 0, 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
+}

+ 1 - 1
controllers/Stock.go

@@ -301,7 +301,7 @@ func (c *StockController) Stock_Detail_Excel() {
 	}
 	var url string
 	//// 上传 OSS
-	nats := natslibs.NewNats(Nats.Nats)
+	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!"}

+ 1 - 1
main.go

@@ -70,10 +70,10 @@ func main() {
 	beego.BConfig.RecoverFunc = RecoverPanic
 
 	go Basic.Read_ProductClass_All_Map()  // 初始化产品类型
+	go Basic.Read_VerifyItem_All_Map()    // 初始化验证项目
 	go controllers.Cron_StockMonth()      // 库存明细详情定时任务
 	go controllers.Cron_VerifyContract()  // 验证合同状态修改定时任务
 	go controllers.CheckPowerUniformity() // 检查角色是否与用户系统一致,不存在则添加
-	go controllers.UpdateVerifyContract_RecoveriesInvoice_Money()
 	beego.Run()
 
 }

+ 93 - 0
models/Basic/VerifyItem.go

@@ -0,0 +1,93 @@
+package Basic
+
+import (
+	"ERP_storage/logs"
+	"git.baozhida.cn/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"
+	"sync"
+)
+
+// 验证项目
+type VerifyItem struct {
+	Id      int     `orm:"column(ID);size(11);auto;pk"`
+	T_name  string  `orm:"size(256);null"`         // 名称
+	T_type  int     `orm:"size(2);default(1)"`     // 类型 1-验证实施 2-报告编写
+	T_price float32 `orm:"digits(12);decimals(2)"` // 单价
+}
+
+func (t *VerifyItem) TableName() string {
+	return "verify_item" // 数据库名称   // ************** 替换 FormulaList **************
+}
+
+var VerifyItem_list *sync.Map
+
+func init() {
+	//注册模型
+	orm.RegisterModel(new(VerifyItem))
+	VerifyItem_list = new(sync.Map)
+
+}
+
+// 获取列表
+func Read_VerifyItem_List(T_type int, page, page_z int) (r_ []VerifyItem, cnt int64) {
+	o := orm.NewOrm()
+	// 也可以直接使用 Model 结构体作为表名
+	qs := o.QueryTable(new(VerifyItem))
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	// 过滤
+	cond := orm.NewCondition()
+
+	if T_type > 0 {
+		cond = cond.And("T_type", T_type)
+	}
+
+	// 查询
+	var r []VerifyItem
+	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond)).OrderBy("Id").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
+	}
+
+	return r, cnt
+}
+
+// 获取全部
+func Read_VerifyItem_All_Map() {
+	o := orm.NewOrm()
+	var r []VerifyItem
+	qs := o.QueryTable(new(VerifyItem))
+	_, err := qs.All(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+
+	for _, v := range r {
+		VerifyItem_list.Store(v.Id, v)
+	}
+
+}
+func Read_VerifyItem_Get(T_id int) VerifyItem {
+	// 有先加入 给全部人发消息
+	v, ok := VerifyItem_list.Load(T_id) /*如果确定是真实的,则存在,否则不存在 */
+	if ok {
+		return v.(VerifyItem)
+	}
+	return VerifyItem{}
+}

+ 167 - 6
models/Contract/Contract.go

@@ -3,9 +3,12 @@ package Contract
 import (
 	"ERP_storage/logs"
 	"ERP_storage/models/Account"
+	"fmt"
 	"git.baozhida.cn/ERP_libs/lib"
 	orm2 "github.com/beego/beego/v2/client/orm"
+	"strconv"
 	"strings"
+	"sync"
 	"time"
 
 	_ "github.com/astaxie/beego/cache/redis"
@@ -54,9 +57,12 @@ func NewContract(orm orm.Ormer) *ContractDaoImpl {
 	return &ContractDaoImpl{orm: orm}
 }
 
+var Contract_list *sync.Map
+
 func init() {
 	//注册模型
 	orm.RegisterModel(new(Contract))
+	Contract_list = new(sync.Map)
 }
 
 type Contract_R struct {
@@ -64,7 +70,7 @@ type Contract_R struct {
 	T_number           string  // 合同编号
 	T_customer         string  // 客户名称
 	T_money            float32 // 合同金额
-	T_discount         float32 // 合同优惠价 验证合同才有优惠价
+	T_discount         float32 // 合同优惠价
 	T_type             int     // 合同类型 1-销售合同 2-验证合同
 	T_date             string  // 签订时间
 	T_out              int     // 出库状态  1-未出库 2-已部分出库 3-已全部出库
@@ -121,6 +127,16 @@ type Contract_Verify struct {
 	T_recoveries   string  // 回款信息
 	T_invoice      string  // 开票信息
 }
+type ContractMoney_Stat struct {
+	T_date             int
+	T_discount         float32
+	T_recoveries_money float32 // 回款信息
+}
+
+type ContractNum_Stat struct {
+	T_date int
+	T_num  int
+}
 
 func ContractToContractFinance_R(T_detail string) (r []ContractFinance_R, money float32) {
 
@@ -297,14 +313,10 @@ func (dao *ContractDaoImpl) Read_Contract_List(T_submit, T_name string, T_state,
 
 	// 过滤
 	cond := orm.NewCondition()
-	cond1 := cond.And("T_State__gt", 0)
+	cond1 := cond.And("T_State__gt", 0).And("T_type", 1)
 	if T_state > 0 {
 		cond1 = cond1.And("T_State", T_state)
 	}
-	if T_out != 1 {
-		cond1 = cond1.And("T_type", 1)
-
-	}
 
 	if len(T_name) > 0 {
 		cond1 = cond1.AndCond(cond.Or("T_number__icontains", T_name).Or("T_customer__icontains", T_name))
@@ -487,3 +499,152 @@ func (dao *ContractDaoImpl) Read_Contract_ByT_date(T_customer_id, T_start_date,
 	}
 	return
 }
+
+// 按年统计合同金额,汇款金额
+func (dao *ContractDaoImpl) Stat_ContractMoney_ByYear(T_type int) ([]ContractMoney_Stat, float32, float32) {
+	var stat []ContractMoney_Stat
+	var discount, recoveries float32
+
+	sql := "SELECT YEAR(t_date) AS t_date, SUM(t_discount) AS t_discount, SUM(t_recoveries_money) AS t_recoveries_money FROM contract WHERE t__state = 1"
+	if T_type > 0 {
+		sql += " AND t_type = " + strconv.Itoa(T_type)
+	}
+	sql += " GROUP BY YEAR(t_date)"
+
+	_, err := dao.orm.Raw(sql).QueryRows(&stat)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return stat, 0, 0
+	}
+
+	sqlSum := "SELECT SUM(t_discount),SUM(t_recoveries_money) FROM contract WHERE t__state = 1"
+	if T_type > 0 {
+		sqlSum += " AND t_type = " + strconv.Itoa(T_type)
+	}
+	err = dao.orm.Raw(sqlSum).QueryRow(&discount, &recoveries)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return stat, 0, 0
+	}
+
+	return stat, discount, recoveries
+
+}
+func (dao *ContractDaoImpl) Stat_ContractNum_ByYear(T_type int) ([]ContractNum_Stat, int64) {
+	var stat []ContractNum_Stat
+	var count int64
+
+	sql := "SELECT YEAR(t_date) AS t_date, COUNT(ID) AS t_num  FROM contract WHERE t__state = 1"
+	if T_type > 0 {
+		sql += " AND t_type = " + strconv.Itoa(T_type)
+	}
+	sql += " GROUP BY YEAR(t_date)"
+
+	_, err := dao.orm.Raw(sql).QueryRows(&stat)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return stat, 0
+	}
+
+	sqlCount := "SELECT COUNT(ID) FROM contract WHERE t__state = 1"
+	if T_type > 0 {
+		sqlCount += " AND t_type = " + strconv.Itoa(T_type)
+	}
+	err = dao.orm.Raw(sqlCount).QueryRow(&count)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return stat, 0
+	}
+
+	return stat, count
+
+}
+
+func (dao *ContractDaoImpl) Stat_ContractMoney_ByMonth(T_type, T_year int) ([]ContractMoney_Stat, float32, float32) {
+	//var stat []ContractMoney_Stat
+	var stat []ContractMoney_Stat
+	var discount, recoveries float32
+
+	sql := "SELECT MONTH(t_date) AS t_date, SUM(t_discount) AS t_discount, SUM(t_recoveries_money) AS t_recoveries_money FROM contract WHERE t__state = 1" +
+		" AND t_date BETWEEN '" + strconv.Itoa(T_year) + "-01-01' AND '" + strconv.Itoa(T_year) + "-12-31'"
+	if T_type > 0 {
+		sql += " AND t_type = " + strconv.Itoa(T_type)
+	}
+	sql += " GROUP BY MONTH(t_date)"
+	fmt.Println(sql)
+
+	_, err := dao.orm.Raw(sql).QueryRows(&stat)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return stat, 0, 0
+	}
+
+	sqlSum := "SELECT SUM(t_discount),SUM(t_recoveries_money) FROM contract WHERE t__state = 1" +
+		" AND t_date BETWEEN '" + strconv.Itoa(T_year) + "-01-01' AND '" + strconv.Itoa(T_year) + "-12-31'"
+	if T_type > 0 {
+		sqlSum += " AND t_type = " + strconv.Itoa(T_type)
+	}
+	err = dao.orm.Raw(sqlSum).QueryRow(&discount, &recoveries)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return stat, 0, 0
+	}
+
+	return stat, discount, recoveries
+
+}
+func (dao *ContractDaoImpl) Stat_ContractNum_ByMonth(T_type, T_year int) ([]ContractNum_Stat, int64) {
+	var stat []ContractNum_Stat
+	var count int64
+
+	sql := "SELECT MONTH(t_date) AS t_date, COUNT(ID) AS t_num FROM contract WHERE t__state = 1" +
+		" AND t_date BETWEEN '" + strconv.Itoa(T_year) + "-01-01' AND '" + strconv.Itoa(T_year) + "-12-31'"
+	if T_type > 0 {
+		sql += " AND t_type = " + strconv.Itoa(T_type)
+	}
+	sql += " GROUP BY MONTH(t_date)"
+
+	_, err := dao.orm.Raw(sql).QueryRows(&stat)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return stat, 0
+	}
+
+	sqlCount := "SELECT COUNT(ID) FROM contract WHERE t__state = 1" +
+		" AND t_date BETWEEN '" + strconv.Itoa(T_year) + "-01-01' AND '" + strconv.Itoa(T_year) + "-12-31'"
+	if T_type > 0 {
+		sqlCount += " AND t_type = " + strconv.Itoa(T_type)
+	}
+	err = dao.orm.Raw(sqlCount).QueryRow(&count)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return stat, 0
+	}
+
+	return stat, count
+
+}
+
+// 获取全部
+func Read_Contract_All_Map() {
+	o := orm.NewOrm()
+	var r []Contract
+	qs := o.QueryTable(new(Contract))
+	_, err := qs.All(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+
+	for _, v := range r {
+		Contract_list.Store(v.T_number, v)
+	}
+
+}
+func Read_Contract_Get(T_number string) Contract {
+	// 有先加入 给全部人发消息
+	v, ok := Contract_list.Load(T_number) /*如果确定是真实的,则存在,否则不存在 */
+	if ok {
+		return v.(Contract)
+	}
+	return Contract{}
+}

+ 24 - 1
models/Contract/VerifyContract.go

@@ -122,7 +122,7 @@ func (dao *VerifyContractDaoImpl) Read_VerifyContract_List(T_name string, T_stat
 	var err error
 	if page_z == 9999 {
 		_, err = qs.SetCond((*orm2.Condition)(cond)).OrderBy("-T_State").All(&r)
-	}else {
+	} else {
 		_, err = qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond)).OrderBy("-T_State").All(&r)
 	}
 
@@ -143,3 +143,26 @@ func (dao *VerifyContractDaoImpl) Read_VerifyContract_List(T_name string, T_stat
 
 	return r_, cnt
 }
+
+// 获取全部
+func Read_VerifyContract_All_Map() {
+	o := orm.NewOrm()
+	var r []VerifyContract
+	qs := o.QueryTable(new(VerifyContract))
+	_, err := qs.All(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+
+	for _, v := range r {
+		Contract_list.Store(v.T_customer_id, v.T_customer)
+	}
+
+}
+func Read_VerifyContract_Get(T_customer_id string) string {
+	v, ok := Contract_list.Load(T_customer_id)
+	if ok {
+		return v.(string)
+	}
+	return ""
+}

+ 371 - 0
models/Percentage/Percentage.go

@@ -0,0 +1,371 @@
+package Percentage
+
+import (
+	"ERP_storage/logs"
+	"ERP_storage/models/Account"
+	"ERP_storage/models/Basic"
+	"ERP_storage/models/Contract"
+	"git.baozhida.cn/ERP_libs/lib"
+	orm2 "github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+
+	_ "github.com/astaxie/beego/cache/redis"
+	"github.com/beego/beego/v2/adapter/orm"
+	_ "github.com/go-sql-driver/mysql"
+)
+
+const (
+	Delete      int = iota
+	WaitAudit       // 待审核
+	AuditPass       // 审核通过
+	AuditUnPass     // 审核不通过
+	RemitPart       // 部分打款
+	RemitAll        // 全部打款
+
+)
+
+var (
+	AuditMap = map[int]string{
+		WaitAudit:   "待审核",
+		AuditPass:   "审核通过",
+		AuditUnPass: "审核不通过",
+		RemitPart:   "部分打款",
+		RemitAll:    "全部打款",
+	}
+)
+
+func Read_Audit_Get(Id int) string {
+	v, ok := AuditMap[Id]
+	if ok {
+		return v
+	} else {
+		return "未知状态"
+	}
+}
+
+// 提成
+type Percentage struct {
+	Id       int     `orm:"column(ID);size(11);auto;pk"`
+	T_number string  `orm:"size(256);null"`         // 合同编号
+	T_uuid   string  `orm:"size(256);null"`         // 提成人员uuid
+	T_money  float32 `orm:"digits(12);decimals(2)"` // 提成金额
+	T_type   int     `orm:"size(2);default(1)"`     // 类型 1-验证实施 2-报告编写
+	T_State  int     `orm:"size(2);default(1)"`     // 0 删除(伪删除)  1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款 审核状态
+	T_submit string  `orm:"size(256);null"`         // 提成提交人员
+	T_remit  string  `orm:"type(text);null"`        // 打款信息 打款时间,打款金额|打款时间,打款金额|
+	T_item   string  `orm:"type(text);null"`        // 提成明细 验证项目id,数量|验证项目id,数量|
+
+	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
+	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
+}
+
+func (t *Percentage) TableName() string {
+	return "percentage" // 数据库名称   // ************** 替换 FormulaList **************
+}
+
+type PercentageDaoImpl struct {
+	orm orm.Ormer
+}
+
+func NewPercentage(orm orm.Ormer) *PercentageDaoImpl {
+	return &PercentageDaoImpl{orm: orm}
+}
+
+func init() {
+	//注册模型
+	orm.RegisterModel(new(Percentage))
+}
+
+type Percentage_R struct {
+	Id                 int
+	T_number           string  // 合同编号
+	T_customer         string  // 客户名称
+	T_contract_money   float32 // 合同金额
+	T_discount         float32 // 合同优惠价
+	T_recoveries_money float32 // 回款总金额
+
+	T_uuid       string  // 提成人员uuid
+	T_uuid_name  string  // 提成人员uuid
+	T_money      float32 // 提成金额
+	T_send_money float32 // 提成已打款金额
+	T_type       int     // 类型 1-验证实施 2-报告编写
+	T_State      int     // 0 删除(伪删除)  1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款 审核状态
+}
+
+type Percentage_Detail struct {
+	Id                 int
+	T_number           string  // 合同编号
+	T_customer         string  // 客户名称
+	T_contract_money   float32 // 合同金额
+	T_discount         float32 // 合同优惠价
+	T_recoveries_money float32 // 回款总金额
+
+	T_Product []Contract.ContractProduct_R // 合同产品信息
+
+	T_uuid       string              // 提成人员uuid
+	T_uuid_name  string              // 提成人员uuid
+	T_money      float32             // 提成金额
+	T_type       int                 // 类型 1-验证实施 2-报告编写
+	T_State      int                 // 0 删除(伪删除)  1-待审核 2-审核通过 3-审核不通过 4-部分打款 5-全部打款 审核状态
+	T_remit      []PercentageRemit_R // 提成打款明细 打款时间,打款金额|打款时间,打款金额|
+	T_send_money float32             // 提成已打款金额
+	T_item       []PercentageItem_R  // 提成明细 验证项目id,数量|验证项目id,数量|
+}
+
+// 提成打款明细
+type PercentageRemit_R struct {
+	T_date  string  // 时间
+	T_money float32 // 金额)
+}
+
+// 提成打款明细
+type PercentageItem_R struct {
+	T_id    int     // 验证项目id
+	T_name  string  // 名称
+	T_num   int     // 数量
+	T_price float32 //  金额
+}
+
+func PercentageToPercentageRemit_R(T_detail string) (r []PercentageRemit_R, money float32) {
+
+	if len(T_detail) == 0 {
+		return
+	}
+	detailList := strings.Split(strings.Trim(T_detail, "|"), "|")
+	for _, detail := range detailList {
+		T_date := strings.Split(detail, ",")[0]
+		T_money := strings.Split(detail, ",")[1]
+		temp := float32(lib.StringToFloat64TwoDecimal(T_money))
+		money += temp
+		r = append(r, PercentageRemit_R{
+			T_date:  T_date,
+			T_money: temp,
+		})
+
+	}
+	return r, money
+}
+func PercentageToPercentageItem_R(T_item string) (r []PercentageItem_R) {
+
+	if len(T_item) == 0 {
+		return
+	}
+	detailList := strings.Split(strings.Trim(T_item, "|"), "|")
+	for _, detail := range detailList {
+		T_id := lib.To_int(strings.Split(detail, ",")[0])
+		T_num := lib.To_int(strings.Split(detail, ",")[1])
+		verifyItem := Basic.Read_VerifyItem_Get(T_id)
+		r = append(r, PercentageItem_R{
+			T_id:    T_id,
+			T_num:   T_num,
+			T_price: verifyItem.T_price,
+			T_name:  verifyItem.T_name,
+		})
+
+	}
+	return r
+}
+
+func PercentageToPercentage_R(t Percentage) (r Percentage_R) {
+	r.Id = t.Id
+	r.T_number = t.T_number
+	contract := Contract.Read_Contract_Get(t.T_number)
+	//1-销售合同 2-验证合同
+	if contract.T_type == 1 {
+		r.T_customer = contract.T_customer
+	}
+	if contract.T_type == 2 {
+		r.T_customer = Contract.Read_VerifyContract_Get(contract.T_customer_id)
+	}
+	r.T_contract_money = contract.T_money
+	r.T_discount = contract.T_discount
+	r.T_recoveries_money = contract.T_recoveries_money
+
+	r.T_uuid = t.T_uuid
+	r.T_uuid_name = Account.Read_User_T_name_Get(t.T_uuid)
+	r.T_money = t.T_money
+	_, r.T_send_money = PercentageToPercentageRemit_R(t.T_remit)
+	r.T_type = t.T_type
+	r.T_State = t.T_State
+	return r
+}
+
+func PercentageToPercentage_Detail(t Percentage, contract Contract.Contract, productList []Contract.ContractProduct_R) (r Percentage_Detail) {
+	r.Id = t.Id
+	r.T_number = t.T_number
+	if contract.T_type == 1 {
+		r.T_customer = contract.T_customer
+	}
+	if contract.T_type == 2 {
+		r.T_customer = Contract.Read_VerifyContract_Get(contract.T_customer_id)
+	}
+	r.T_contract_money = contract.T_money
+	r.T_discount = contract.T_discount
+	r.T_recoveries_money = contract.T_recoveries_money
+
+	r.T_Product = productList
+
+	r.T_uuid = t.T_uuid
+	r.T_uuid_name = Account.Read_User_T_name_Get(t.T_uuid)
+	r.T_money = t.T_money
+	r.T_remit, r.T_send_money = PercentageToPercentageRemit_R(t.T_remit)
+	r.T_type = t.T_type
+	r.T_State = t.T_State
+	r.T_item = PercentageToPercentageItem_R(t.T_item)
+
+	return r
+}
+
+// 添加
+func (dao *PercentageDaoImpl) Add_Percentage(r Percentage) (id int64, err error) {
+	id, err = dao.orm.Insert(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return id, err
+}
+
+// 获取 ById
+func (dao *PercentageDaoImpl) Read_Percentage_ByT_number_T_type(T_number string, T_type int) (r Percentage, err error) {
+	qs := dao.orm.QueryTable(new(Percentage))
+
+	err = qs.Filter("T_number", T_number).Filter("T_type", T_type).Filter("T_State__gt", 0).One(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return
+}
+
+func (dao *PercentageDaoImpl) Read_Percentage_ById(Id int) (r Percentage, err error) {
+	qs := dao.orm.QueryTable(new(Percentage))
+	err = qs.Filter("Id", Id).One(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return
+}
+
+// 修改
+func (dao *PercentageDaoImpl) Update_Percentage(m Percentage, cols ...string) error {
+	_, err := dao.orm.Update(&m, cols...)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return err
+	}
+	return nil
+}
+
+// 删除
+func (dao *PercentageDaoImpl) Delete_Percentage(v Percentage) error {
+	v.T_State = 0
+	_, err := dao.orm.Update(&v, "T_State")
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return err
+}
+
+// 获取列表
+func (dao *PercentageDaoImpl) Read_Percentage_List(T_name, T_uuid string, T_state, page, page_z int) (r_ []Percentage_R, cnt int64) {
+	// 也可以直接使用 Model 结构体作为表名
+	qs := dao.orm.QueryTable(new(Percentage))
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	// 过滤
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_State__gt", 0)
+	if T_state > 0 {
+		cond1 = cond1.And("T_State", T_state)
+	}
+
+	if len(T_name) > 0 {
+		cond1 = cond1.And("T_number__icontains", T_name)
+	}
+	if len(T_uuid) > 0 {
+		cond1 = cond1.And("T_uuid", T_uuid)
+	}
+
+	// 查询
+	var r []Percentage
+	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("T_State").All(&r)
+
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	for _, v := range r {
+		r_ = append(r_, PercentageToPercentage_R(v))
+	}
+
+	return r_, cnt
+}
+func (dao *PercentageDaoImpl) Read_Percentage_User_List(T_uuid, T_name string, T_state, page, page_z int) (r_ []Percentage_R, cnt int64) {
+	// 也可以直接使用 Model 结构体作为表名
+	qs := dao.orm.QueryTable(new(Percentage))
+	var offset int64
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	// 过滤
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_State__gt", 0)
+	if T_state > 0 {
+		cond1 = cond1.And("T_State", T_state)
+	}
+
+	if len(T_name) > 0 {
+		cond1 = cond1.And("T_number__icontains", T_name)
+	}
+	if len(T_uuid) > 0 {
+		cond1 = cond1.AndCond(cond.Or("T_uuid", T_uuid).Or("T_submit", T_uuid))
+	}
+
+	// 查询
+	var r []Percentage
+	_, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
+
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+
+	for _, v := range r {
+		r_ = append(r_, PercentageToPercentage_R(v))
+	}
+
+	return r_, cnt
+}
+
+func (dao *PercentageDaoImpl) Read_T_uuid_List() (lists []string) {
+
+	o := orm.NewOrm()
+	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)
+		return
+	}
+	return lists
+}

+ 4 - 1
routers/Basic.go

@@ -31,6 +31,9 @@ func init() {
 		beego.NSRouter("/Edit", &controllers.BasicController{}, "*:ProductClass_Edit"), // 添加产品分类
 		beego.NSRouter("/Del", &controllers.BasicController{}, "*:ProductClass_Del"),   // 删除产品分类
 	)
+	verifyItem := beego.NewNamespace("/VerifyItem",
+		beego.NSRouter("/List", &controllers.BasicController{}, "*:VerifyItem_List"), // 产品分类列表
+	)
 
-	beego.AddNamespace(depot, product, productClass)
+	beego.AddNamespace(depot, product, productClass, verifyItem)
 }

+ 1 - 0
routers/Contract.go

@@ -18,6 +18,7 @@ func init() {
 		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"),                 // 统计合同金额
 	)
 	verifyContract := beego.NewNamespace("/VerifyContract",
 		beego.NSRouter("/List", &controllers.ContractController{}, "*:VerifyContract_List"),                       // 验证合同列表

+ 23 - 0
routers/Percentage.go

@@ -0,0 +1,23 @@
+package routers
+
+import (
+	"ERP_storage/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+
+	percentage := beego.NewNamespace("/Percentage",
+		beego.NSRouter("/List", &controllers.PercentageController{}, "*:Percentage_List"),           // 提成列表
+		beego.NSRouter("/User_List", &controllers.PercentageController{}, "*:Percentage_User_List"), // 提成列表 - 员工
+		beego.NSRouter("/Get", &controllers.PercentageController{}, "*:Percentage_Get"),             // 提成详情
+		beego.NSRouter("/Add", &controllers.PercentageController{}, "*:Percentage_Add"),             // 添加提成
+		beego.NSRouter("/Edit", &controllers.PercentageController{}, "*:Percentage_Edit"),           // 编辑提成
+		beego.NSRouter("/Del", &controllers.PercentageController{}, "*:Percentage_Del"),             // 删除提成
+		beego.NSRouter("/Approval", &controllers.PercentageController{}, "*:Percentage_Approval"),   // 提成审核
+		beego.NSRouter("/Remit", &controllers.PercentageController{}, "*:Percentage_Remit"),         // 打款明细
+		beego.NSRouter("/User/List", &controllers.PercentageController{}, "*:User_List"),            // 提成审核
+	)
+
+	beego.AddNamespace(percentage)
+}