Browse Source

订单管理

huangyan 1 month ago
parent
commit
a538484978
20 changed files with 1769 additions and 28 deletions
  1. 2 0
      Nats/NatsServer/NatsUser.go
  2. 2 2
      Z_Build.bat
  3. 11 5
      conf/app.conf
  4. 159 0
      controllers/Address.go
  5. 83 0
      controllers/NotAuth.go
  6. 721 0
      controllers/Order.go
  7. 58 0
      cron/corn.go
  8. 7 5
      go.mod
  9. 15 11
      go.sum
  10. 63 0
      lib/Aes.go
  11. 21 0
      lib/SubSms.go
  12. 98 0
      lib/sms.go
  13. 4 2
      main.go
  14. 1 1
      models/Device/DeviceData.go
  15. 186 0
      models/Function/Address.go
  16. 260 0
      models/Function/Order.go
  17. 21 0
      routers/Address.go
  18. 18 0
      routers/NotAuth.go
  19. 26 0
      routers/Order.go
  20. 13 2
      routers/filter.go

+ 2 - 0
Nats/NatsServer/NatsUser.go

@@ -7,6 +7,7 @@ import (
 	"fmt"
 	"github.com/astaxie/beego/logs"
 	"github.com/vmihailenco/msgpack/v5"
+	"log"
 	"strconv"
 	"time"
 )
@@ -46,6 +47,7 @@ func Verification(GetCookie string, GetString string) (bool, Account.User, int)
 }
 
 func CheckUserPermissions(Power_Id int, Req_Url string) bool {
+	log.Println("Power_Id:", Power_Id, "Req_Url:", Req_Url)
 	type T_Req struct {
 		Power_Id int    `xml:"Power_Id"` // 权限id
 		Req_Url  string `xml:"Req_Url"`  // 请求url

+ 2 - 2
Z_Build.bat

@@ -1,8 +1,8 @@
 cd %~dp0
 set GOARCH=amd64
 set GOOS=linux
-set GOPATH=C:\Users\SIKED\go
+set GOPATH=E:\gopath
 set GO111MODULE=auto
 
 
-go build Cold_GoodsOrder.go
+go build -o Cold_GoodsOrder6250 main.go

+ 11 - 5
conf/app.conf

@@ -8,22 +8,28 @@ copyrequestbody = true
 version = "/v3"
 
 # Redis
-Redis_address = "127.0.0.1:43379"
-Redis_password = ""
+Redis_address = "203.34.49.130:6379"
+Redis_password = "redis_JJ56d5"
 Redis_dbNum = "1"
 # Mysql
-MysqlServer_UrlPort = "127.0.0.1:40306"
+MysqlServer_UrlPort = "203.34.49.130:3306"
 MysqlServer_Database = "cold"
 MysqlServer_Username = "cold"
-MysqlServer_Password = "yjwyEckZS7rE5H!"
+MysqlServer_Password = "yjwyEckZS7rE5H"
 MysqlServer_MaxIdleConnections = 100
 MysqlServer_MaxOpenConnections = 200
 # Nats
-NatsServer_Url = "127.0.0.1:43422"
+NatsServer_Url = "203.34.49.130:4222"
 
 # 静态资源
 Qiniu_AccessKey = "-8ezB_d-8-eUFTMvhOGbGzgeQRPeKQnaQ3DBcUxo"
 Qiniu_SecretKey = "KFhkYxTAJ2ZPN3ZS3euTsfWk8-C92rKgkhAMkDRN"
 Qiniu_BUCKET = "bzdcoldverify"
 Oss = "https://bzdcoldverifyoss.baozhida.cn"
+#发送短信
+subMailappid = "97173"
+subMailsignature = "f639a60e41ee0554921d89884f5ff87e"
+orderUrl = "http://192.168.11.53:8080/#/msgAlert?"
+
+corn = "0 */1 * * * ?"
 

+ 159 - 0
controllers/Address.go

@@ -0,0 +1,159 @@
+package controllers
+
+import (
+	"Cold_GoodsOrder/Nats/NatsServer"
+	"Cold_GoodsOrder/conf"
+	"Cold_GoodsOrder/lib"
+	"Cold_GoodsOrder/models/Account"
+	"Cold_GoodsOrder/models/Function"
+	beego "github.com/beego/beego/v2/server/web"
+	"math"
+)
+
+// Handle
+type AddressController struct {
+	beego.Controller
+	User_r Account.User // 登陆的用户
+	T_pid  int          // 公司id
+}
+
+func (c *AddressController) Prepare() {
+	c.User_r = *Account.User_r
+	c.T_pid = *Account.T_pid
+}
+
+func (c *AddressController) Address_List() {
+	type R_JSONS struct {
+		//必须的大写开头
+		Data      []Function.AddressR
+		Num       int64
+		Page      int
+		Page_size int
+	}
+
+	var r_jsons 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
+	}
+	Address := c.GetString("T_Address")
+	Name := c.GetString("T_name")
+
+	r_jsons.Data, r_jsons.Num = Function.Read_Address_List(c.User_r.T_pid, page, page_z, Address, Name)
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+func (c *AddressController) AddressAdd() {
+	Address := c.GetString("T_Address")
+	Phone := c.GetString("Phone")
+	Name := c.GetString("T_name")
+	var_ := Function.Address{
+		UserId:  c.User_r.T_pid,
+		Address: Address,
+		Phone:   Phone,
+		Name:    Name,
+	}
+	id, err := Function.Add_Address(var_)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 301, Msg: "添加失败!"}
+		c.ServeJSON()
+		return
+	}
+	NatsServer.AddUserLogs(Account.User_r.T_uuid, "地址管理", "添加", var_)
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: id}
+	c.ServeJSON()
+	return
+}
+func (c *AddressController) AddressGet() {
+
+	id, _ := c.GetInt("T_id")
+	r := Function.Read_Address_ById(id)
+	// 记录不存在
+	if r.Id == 0 {
+		c.Data["json"] = lib.JSONS{Code: 204, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+	if c.User_r.T_pid != r.UserId {
+		c.Data["json"] = lib.JSONS{Code: 205, Msg: "没有权限!"}
+		c.ServeJSON()
+		return
+	}
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Function.AddressToAddressR(r)}
+	c.ServeJSON()
+	return
+}
+
+func (c *AddressController) AddressEdit() {
+	id, _ := c.GetInt("T_id")
+	r := Function.Read_Address_ById(id)
+
+	if r.Id == 0 {
+		c.Data["json"] = lib.JSONS{Code: 204, Msg: "T_id !"}
+		c.ServeJSON()
+		return
+	}
+	if c.User_r.T_pid != r.UserId {
+		c.Data["json"] = lib.JSONS{Code: 205, Msg: "没有权限!"}
+		c.ServeJSON()
+		return
+	}
+	Address := c.GetString("T_Address")
+	Phone := c.GetString("Phone")
+	Name := c.GetString("T_name")
+
+	if len(Address) > 0 {
+		r.Address = Address
+	}
+	if len(Phone) > 0 {
+		r.Phone = Phone
+	}
+	if len(Name) > 0 {
+		r.Name = Name
+	}
+	is := Function.Update_Address(r, "address", "phone", "name")
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
+		c.ServeJSON()
+		return
+	}
+	NatsServer.AddUserLogs(Account.User_r.T_uuid, "地址管理", "修改", r)
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+
+func (c *AddressController) AddressDel() {
+	id, _ := c.GetInt("T_id")
+	r := Function.Read_Address_ById(id)
+
+	if r.Id == 0 {
+		c.Data["json"] = lib.JSONS{Code: 204, Msg: "T_id !"}
+		c.ServeJSON()
+		return
+	}
+	if c.User_r.T_pid != r.UserId {
+		c.Data["json"] = lib.JSONS{Code: 205, Msg: "没有权限!"}
+		c.ServeJSON()
+		return
+	}
+	if is := Function.Delete_Address(r); !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
+		c.ServeJSON()
+		return
+	}
+	NatsServer.AddUserLogs(Account.User_r.T_uuid, "地址管理", "删除", r)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}

+ 83 - 0
controllers/NotAuth.go

@@ -0,0 +1,83 @@
+package controllers
+
+import (
+	"Cold_GoodsOrder/Nats/NatsServer"
+	"Cold_GoodsOrder/lib"
+	"Cold_GoodsOrder/models/Device"
+	"Cold_GoodsOrder/models/Function"
+	"log"
+	"net/url"
+	"strconv"
+	"time"
+
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+type NotAuthController struct {
+	beego.Controller
+}
+
+func (c *NotAuthController) GetDeviceData() {
+	s, _ := beego.AppConfig.String("orderUrl")
+	addr := s + url.QueryEscape(lib.AesEncryptCBC("202502191739933974", lib.AesKey))
+	log.Println(addr)
+	var err error
+	order := c.GetString("order")
+	if len(order) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	Order_r := Function.Read_Order_ByOderid(order)
+	if Order_r.Id == 0 {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "Id Err!"}
+		c.ServeJSON()
+		return
+	}
+	_, err = NatsServer.ReadDeviceByT_sn(Order_r.T_sn)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 204, Msg: "T_sn Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	DeviceSensor_r := NatsServer.ReadDeviceSensorALLByT_sn(Order_r.T_sn)
+	if len(DeviceSensor_r) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: Order_r.T_sn + "设备没有数据!"}
+		c.ServeJSON()
+		return
+	}
+
+	var DeviceSensor_data []Device.DeviceData_R
+	if Order_r.T_start_Ut.IsZero() {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: Order_r.T_sn + "未开启配送"}
+		c.ServeJSON()
+		return
+	}
+	if Order_r.T_end_Ut.IsZero() {
+		Order_r.T_end_Ut = time.Now()
+	}
+	DeviceSensor_data, _ = NatsServer.ReadDeviceDataListBy_T_snid(Order_r.T_sn+","+strconv.Itoa(DeviceSensor_r[0].T_id), Order_r.T_start_Ut.Format("2006-01-02 15:04:05"), Order_r.T_end_Ut.Format("2006-01-02 15:04:05"), 0, 9999)
+	if len(DeviceSensor_data) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: Order_r.T_sn + "设备没有数据!"}
+		c.ServeJSON()
+		return
+	}
+	lastValidTsite := ""
+	for i, sensor := range DeviceSensor_data {
+		if len(sensor.T_site) <= 0 || sensor.T_site == "0,0" {
+			DeviceSensor_data[i].T_site = lastValidTsite
+		} else {
+			lastValidTsite = sensor.T_site
+		}
+	}
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "成功", Data: DeviceSensor_data}
+	c.ServeJSON()
+}
+func (c *NotAuthController) Test() {
+	time.Sleep(5 * time.Second)
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "成功", Data: nil}
+	c.ServeJSON()
+
+}

+ 721 - 0
controllers/Order.go

@@ -0,0 +1,721 @@
+package controllers
+
+import (
+	"Cold_GoodsOrder/Nats/NatsServer"
+	"Cold_GoodsOrder/conf"
+	"Cold_GoodsOrder/lib"
+	"Cold_GoodsOrder/models/Account"
+	"Cold_GoodsOrder/models/Device"
+	"Cold_GoodsOrder/models/Function"
+	"encoding/base64"
+	"fmt"
+	"image"
+	"log"
+	"math"
+	"net/url"
+	"os"
+	"strconv"
+	"strings"
+	"time"
+
+	beego "github.com/beego/beego/v2/server/web"
+	"github.com/qiniu/go-sdk/v7/sms/bytes"
+	"github.com/signintech/gopdf"
+)
+
+// Handle
+type OrderController struct {
+	beego.Controller
+	User_r Account.User // 登陆的用户
+	T_pid  int          // 公司id
+}
+
+func (c *OrderController) Prepare() {
+	c.User_r = *Account.User_r
+	c.T_pid = *Account.T_pid
+}
+
+func (c *OrderController) Order_List() {
+	type R_JSONS struct {
+		//必须的大写开头
+		Data      []Function.OrderR
+		Num       int64
+		Page      int
+		Page_size int
+	}
+
+	var r_jsons 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_sn := c.GetString("t_sn")
+	orderid := c.GetString("t_orderid")
+	startTime := c.GetString("startTime")
+	endTime := c.GetString("endTime")
+	c.Data["Name"] = t_sn
+
+	r_jsons.Data, r_jsons.Num = Function.Read_Order_List(c.User_r.T_pid, page, page_z, orderid, t_sn, startTime, endTime)
+	r_jsons.Page = page
+	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+func (c *OrderController) CreateOrderNo() {
+	format := time.Now().Format("20060102")
+	unix := time.Now().Unix()
+	OrderNo := fmt.Sprintf("%v%v", format, unix)
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: OrderNo}
+	c.ServeJSON()
+	return
+}
+func (c *OrderController) Order_Add() {
+	T_orderid := c.GetString("T_orderid")
+	WaybillNo := c.GetString("WaybillNo")
+	T_sn := c.GetString("T_sn")
+	T_receiving := c.GetString("T_receiving")
+	ShippingUnit := c.GetString("ShippingUnit")
+	EstimateStartTime := c.GetString("EstimateStartTime")
+	EstimateEndTime := c.GetString("EstimateEndTime")
+	T_text := c.GetString("T_text")
+	PeerList := c.GetString("PeerList")
+	DeviceType := c.GetString("DeviceType")
+	IsExpatriate, _ := c.GetInt("IsExpatriate")
+	Phone := c.GetString("Phone")
+	ChildPid := c.GetString("ChildPid")
+	if len(EstimateStartTime) <= 0 || len(EstimateEndTime) <= 0 {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "时间参数异常!"}
+		c.ServeJSON()
+		return
+	}
+	start, err := time.Parse("2006-01-02", EstimateStartTime)
+	endtime, err := time.Parse("2006-01-02", EstimateEndTime)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "时间参数异常!"}
+		c.ServeJSON()
+		return
+	}
+	var_ := Function.Order{
+		T_pid:             c.User_r.T_pid,
+		T_orderid:         T_orderid,
+		WaybillNo:         WaybillNo,
+		ShippingUnit:      ShippingUnit,
+		T_sn:              T_sn,
+		T_receiving:       T_receiving,
+		EstimateStartTime: start,
+		EstimateEndTime:   endtime,
+		T_text:            T_text,
+		T_State:           1,
+		PeerList:          PeerList,
+		DeviceType:        DeviceType,
+		IsExpatriate:      IsExpatriate,
+		Phone:             Phone,
+		ChildPid:          ChildPid,
+	}
+	id, err := Function.Add_Order(var_)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 301, Msg: "添加失败!"}
+		c.ServeJSON()
+		return
+	}
+	if var_.IsExpatriate == 2 {
+		if len(var_.Phone) < 0 {
+			c.Data["json"] = lib.JSONS{Code: 203, Msg: "电话号码不能为空!"}
+			c.ServeJSON()
+			return
+		}
+		s, _ := beego.AppConfig.String("orderUrl")
+		addr := s + url.QueryEscape(lib.AesEncryptCBC(var_.T_orderid, lib.AesKey))
+		log.Println(addr)
+		sprintf := fmt.Sprintf("【冷链订单配送】您的订单正在配送中点击下方链接查看%v", addr)
+		err = lib.SendModel(Phone, sprintf)
+		if err != nil {
+			c.Data["json"] = lib.JSONS{Code: 203, Msg: "发送短信失败!"}
+			c.ServeJSON()
+			return
+		}
+		var_.ExpatriateReceiving = T_receiving
+	}
+	NatsServer.AddUserLogs(Account.User_r.T_uuid, "订单系统", "添加", var_)
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: id}
+	c.ServeJSON()
+}
+func (c *OrderController) Order_Get() {
+
+	id, _ := c.GetInt("T_id")
+	r := Function.Read_Order_ById(id)
+	// 记录不存在
+	if r.Id == 0 {
+		c.Data["json"] = lib.JSONS{Code: 204, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	if c.User_r.T_pid != r.T_pid {
+		c.Data["json"] = lib.JSONS{Code: 205, Msg: "没有权限!"}
+		c.ServeJSON()
+		return
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Function.OrderToOrderR(r)}
+	c.ServeJSON()
+}
+
+func (c *OrderController) Order_Edit() {
+	id, _ := c.GetInt("T_id")
+	r := Function.Read_Order_ById(id)
+
+	if r.Id == 0 {
+		c.Data["json"] = lib.JSONS{Code: 204, Msg: "T_id !"}
+		c.ServeJSON()
+		return
+	}
+	if c.User_r.T_pid != r.T_pid {
+		c.Data["json"] = lib.JSONS{Code: 205, Msg: "没有权限!"}
+		c.ServeJSON()
+		return
+	}
+	WaybillNo := c.GetString("WaybillNo")
+	T_sn := c.GetString("T_sn")
+	T_receiving := c.GetString("T_receiving")
+	ShippingUnit := c.GetString("ShippingUnit")
+	EstimateStartTime := c.GetString("EstimateStartTime")
+	EstimateEndTime := c.GetString("EstimateEndTime")
+	T_text := c.GetString("T_text")
+	PeerList := c.GetString("PeerList")
+	DeviceType := c.GetString("DeviceType")
+	IsExpatriate, _ := c.GetInt("IsExpatriate")
+	Phone := c.GetString("Phone")
+	ChildPid := c.GetString("ChildPid")
+	T_State, _ := c.GetInt("T_State")
+	if len(EstimateStartTime) <= 0 || len(EstimateEndTime) <= 0 {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "时间参数异常!"}
+		c.ServeJSON()
+		return
+	}
+	start, err := time.Parse("2006-01-02", EstimateStartTime)
+	endtime, err := time.Parse("2006-01-02", EstimateEndTime)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "时间参数异常!"}
+		c.ServeJSON()
+		return
+	}
+	if len(WaybillNo) > 0 {
+		r.WaybillNo = WaybillNo
+	}
+	if len(T_sn) > 0 {
+		r.T_sn = T_sn
+	}
+	if len(T_receiving) > 0 {
+		r.T_receiving = T_receiving
+	}
+	if len(T_text) > 0 {
+		r.T_text = T_text
+	}
+	if len(ShippingUnit) > 0 {
+		r.ShippingUnit = ShippingUnit
+	}
+	if len(EstimateStartTime) > 0 {
+		r.EstimateStartTime = start
+	}
+	if len(EstimateEndTime) > 0 {
+		r.EstimateEndTime = endtime
+	}
+	if len(PeerList) > 0 {
+		r.PeerList = PeerList
+	}
+	if len(DeviceType) > 0 {
+		r.DeviceType = DeviceType
+	}
+	if IsExpatriate != r.IsExpatriate {
+		r.IsExpatriate = IsExpatriate
+	}
+	if len(Phone) > 0 {
+		r.Phone = Phone
+	}
+	if len(ChildPid) > 0 {
+		r.ChildPid = ChildPid
+	}
+	if T_State != 0 {
+		r.T_State = T_State
+	}
+	is := Function.Update_Order(r, "waybill_no", "t_sn", "t_receiving", "shipping_unit", "estimate_start_time", "estimate_end_time", "peer_list", "device_type", "is_expatriate", "phone", "child_pid", "t__state", "t_text")
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
+		c.ServeJSON()
+		return
+	}
+	NatsServer.AddUserLogs(Account.User_r.T_uuid, "订单系统", "修改", r)
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+}
+func (c *OrderController) GetDeviceData() {
+	var err error
+	Id, _ := c.GetInt("T_id")
+	if Id == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	Order_r := Function.Read_Order_ById(Id)
+	if Order_r.Id == 0 {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "Id Err!"}
+		c.ServeJSON()
+		return
+	}
+	_, err = NatsServer.ReadDeviceByT_sn(Order_r.T_sn)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 204, Msg: "T_sn Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	DeviceSensor_r := NatsServer.ReadDeviceSensorALLByT_sn(Order_r.T_sn)
+	if len(DeviceSensor_r) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: Order_r.T_sn + "设备没有数据!"}
+		c.ServeJSON()
+		return
+	}
+
+	var DeviceSensor_data []Device.DeviceData_R
+	if Order_r.T_start_Ut.IsZero() {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: Order_r.T_sn + "未开启配送"}
+		c.ServeJSON()
+		return
+	}
+	if Order_r.T_end_Ut.IsZero() {
+		Order_r.T_end_Ut = time.Now()
+	}
+	DeviceSensor_data, _ = NatsServer.ReadDeviceDataListBy_T_snid(Order_r.T_sn+","+strconv.Itoa(DeviceSensor_r[0].T_id), Order_r.T_start_Ut.Format("2006-01-02 15:04:05"), Order_r.T_end_Ut.Format("2006-01-02 15:04:05"), 0, 9999)
+	if len(DeviceSensor_data) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: Order_r.T_sn + "设备没有数据!"}
+		c.ServeJSON()
+		return
+	}
+	lastValidTsite := ""
+	for i, sensor := range DeviceSensor_data {
+		if len(sensor.T_site) <= 0 || sensor.T_site == "0,0" {
+			DeviceSensor_data[i].T_site = lastValidTsite
+		} else {
+			lastValidTsite = sensor.T_site
+		}
+	}
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "成功", Data: DeviceSensor_data}
+	c.ServeJSON()
+}
+
+func (c *OrderController) Order_Del() {
+
+	Id, _ := c.GetInt("T_id")
+	r := Function.Read_Order_ById(Id)
+
+	if r.Id == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+	if c.User_r.T_pid != r.T_pid {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "没有权限!"}
+		c.ServeJSON()
+		return
+	}
+
+	if is := Function.Delete_Order(r); !is {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
+		c.ServeJSON()
+		return
+	}
+	NatsServer.AddUserLogs(Account.User_r.T_uuid, "订单系统", "删除", r)
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+
+}
+
+// Order_PDF 列表 - 接口
+func (c *OrderController) Order_PDF() {
+	var err error
+	Id, _ := c.GetInt("T_id")
+	if Id == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	Order_r := Function.Read_Order_ById(Id)
+	if Order_r.Id == 0 {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "Id Err!"}
+		c.ServeJSON()
+		return
+	}
+	Device_r, err := NatsServer.ReadDeviceByT_sn(Order_r.T_sn)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 204, Msg: "T_sn Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	DeviceSensor_r := NatsServer.ReadDeviceSensorALLByT_sn(Order_r.T_sn)
+	if len(DeviceSensor_r) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: Order_r.T_sn + "设备没有数据!"}
+		c.ServeJSON()
+		return
+	}
+
+	var DeviceSensor_data []Device.DeviceData_R
+	DeviceSensor_data, _ = NatsServer.ReadDeviceDataListBy_T_snid(Order_r.T_sn+","+strconv.Itoa(DeviceSensor_r[0].T_id), Order_r.T_start_Ut.Format("2006-01-02 15:04:05"), Order_r.T_end_Ut.Format("2006-01-02 15:04:05"), 0, 9999)
+
+	if len(DeviceSensor_data) == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: Order_r.T_sn + "设备没有数据!"}
+		c.ServeJSON()
+		return
+	}
+
+	pdf := &gopdf.GoPdf{}
+	pdf.Start(gopdf.Config{PageSize: gopdf.Rect{W: 595.28, H: 841.89}}) //595.28, 841.89 = A4
+
+	err = pdf.AddTTFFont("simsun", "static/fonts/三极行楷简体-粗.ttf")
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 204, Msg: err.Error()}
+		c.ServeJSON()
+		return
+	}
+	err = pdf.SetFont("simsun", "", 24)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 205, Msg: err.Error()}
+		c.ServeJSON()
+		return
+	}
+
+	pdf.SetGrayFill(0.5)
+
+	pdf.SetMargins(0, 20, 0, 20)
+	pdf.AddPage()
+
+	company, _ := NatsServer.Read_Company_ById(c.T_pid)
+	log.Println(c.T_pid, c.User_r.T_pid)
+	textw, _ := pdf.MeasureTextWidth(company.T_name + "-货单详情")
+	pdf.SetX((595 / 2) - (textw / 2))
+	pdf.SetY(40)
+	pdf.Text(company.T_name + "-货单详情")
+
+	// 线
+	pdf.SetLineWidth(2)
+	pdf.SetLineType("dashed")
+	pdf.Line(10, 60, 585, 60)
+
+	err = pdf.AddTTFFont("wts", "static/fonts/MiSans-Medium.ttf")
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 206, Msg: err.Error()}
+		c.ServeJSON()
+		return
+	}
+	err = pdf.SetFont("wts", "", 10)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: err.Error()}
+		c.ServeJSON()
+		return
+	}
+	pages := pdf.GetNumberOfPages()
+	pagenums := fmt.Sprintf("第 %d 页", pages)
+	pagenum, _ := pdf.MeasureTextWidth(pagenums)
+	pdf.SetX((595 / 2) - (pagenum / 2))
+	pdf.SetY(830) // 设置页码位置
+	pdf.Cell(nil, pagenums)
+	// -------------
+	x := 22.0
+	w1 := 80.0
+	w2 := 195.0
+
+	lib.RectFillColor(pdf, "订单号:", 12, x, 80, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, Order_r.T_orderid, 12, x, 80, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+
+	lib.RectFillColor(pdf, "运单号:", 12, x, 80, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, Order_r.T_outorderid, 12, x, 80, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+	// -------------
+	x = 22.0
+	w1 = 80.0
+	w2 = 195.0
+
+	lib.RectFillColor(pdf, "设备名称:", 12, x, 100, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, Device_r.T_devName, 12, x, 100, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+
+	lib.RectFillColor(pdf, "设备编号:", 12, x, 100, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, Device_r.T_sn, 12, x, 100, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+	// -------------
+	x = 22.0
+	w1 = 80.0
+	w2 = 240.0
+	T_time := fmt.Sprintf("%s", Order_r.T_start_Ut.Format("2006-01-02 15:04:05")+" - "+Order_r.T_end_Ut.Format("2006-01-02 15:04:05"))
+	lib.RectFillColor(pdf, "送货时间:", 12, x, 120, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, T_time, 12, x, 120, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+
+	T_time = fmt.Sprintf("%s", Order_r.CreateTime.Format("2006-01-02 15:04:05"))
+	lib.RectFillColor(pdf, "订单时间:", 12, x, 120, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, T_time, 12, x, 120, 150, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+
+	// -------------
+	x = 22.0
+	w1 = 80.0
+	w2 = 195.0*2 + 80
+	ShippingUnit := fmt.Sprintf("%s", Order_r.ShippingUnit)
+	lib.RectFillColor(pdf, "发货单位:", 12, x, 140, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, ShippingUnit, 12, x, 140, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+	x = 22.0
+	T_text := fmt.Sprintf("%s", Order_r.T_receiving)
+	lib.RectFillColor(pdf, "收货单位:", 12, x, 160, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, T_text, 12, x, 160, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+	// 数据汇总--------------------------------
+
+	// 最低温度
+	var T_t_l float32 = 100.0
+	// 最高温度
+	var T_t_u float32 = 0.0
+	var T_t_v float32 = 0.0
+	for n := 0; len(DeviceSensor_data) > n; n++ {
+		// -计算温度
+		if DeviceSensor_data[n].T_t < T_t_l {
+			T_t_l = DeviceSensor_data[n].T_t
+		}
+		if DeviceSensor_data[n].T_t > T_t_u {
+			T_t_u = DeviceSensor_data[n].T_t
+		}
+		T_t_v += DeviceSensor_data[n].T_t
+	}
+
+	var y float64 = 180
+	x = 22.0
+	w1 = 60.0
+	w2 = 50.0
+
+	err = pdf.SetFont("wts", "", 10)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: err.Error()}
+		c.ServeJSON()
+		return
+	}
+	T_t := fmt.Sprintf(" %.1f℃ ", DeviceSensor_data[len(DeviceSensor_data)-1].T_t)
+	lib.RectFillColor(pdf, "起送温度", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, T_t, 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+
+	T_t = fmt.Sprintf(" %.1f℃ ", DeviceSensor_data[0].T_t)
+	lib.RectFillColor(pdf, "送达温度", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, T_t, 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+
+	T_t = fmt.Sprintf(" %.1f℃ ", T_t_l)
+	lib.RectFillColor(pdf, "最低温度", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, T_t, 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+
+	T_t = fmt.Sprintf(" %.1f℃ ", T_t_v/float32(len(DeviceSensor_data)))
+	lib.RectFillColor(pdf, "平均温度", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, T_t, 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+
+	T_t = fmt.Sprintf(" %.1f℃ ", T_t_u)
+	lib.RectFillColor(pdf, "最高温度", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, T_t, 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+	var height int
+	getString := c.GetString("images")
+	split := strings.Split(getString, ",")
+	if len(split) >= 2 {
+		imageBytes, err := base64.StdEncoding.DecodeString(split[1])
+		if err != nil {
+			c.Data["json"] = lib.JSONS{Code: 207, Msg: "无效的图像数据"}
+			c.ServeJSON()
+			return
+		}
+		decode, _, err := image.Decode(bytes.NewReader(imageBytes))
+		// 获取图片的高度
+		bounds := decode.Bounds()
+		height = bounds.Dy()
+		if height >= 500 {
+			height = 500
+		}
+
+		with := bounds.Dx()
+		log.Println("图片宽高", with, height)
+		y = 220
+		imgH, err := gopdf.ImageHolderByBytes(imageBytes)
+		err = pdf.ImageByHolder(imgH, 10, y, &gopdf.Rect{W: 575, H: float64(height)})
+		if err != nil {
+			c.Data["json"] = lib.JSONS{Code: 207, Msg: "添加图片失败"}
+			c.ServeJSON()
+			return
+		}
+	} else {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "无效的图像数据"}
+		c.ServeJSON()
+		return
+	}
+	// -----------
+	textw, _ = pdf.MeasureTextWidth("历史数据")
+	pdf.SetX(20)
+	pdf.SetY(float64(230 + height))
+	pdf.Text("历史数据:")
+
+	// 数据展示--------------------------------
+	//var y float64 = 220
+	y = float64(240 + height)
+	x = 22.0
+	w1 = 94.0
+	w2 = 43.0
+
+	lib.RectFillColor(pdf, "记录时间", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, "温度℃", 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+	lib.RectFillColor(pdf, "记录时间", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, "温度℃", 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+	lib.RectFillColor(pdf, "记录时间", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, "温度℃", 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+	lib.RectFillColor(pdf, "记录时间", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w1
+	lib.RectFillColor(pdf, "温度℃", 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+	x += w2
+	// 数据展示--------------------------------
+
+	y = float64(260 + height)
+
+	err = pdf.SetFont("wts", "", 8)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: err.Error()}
+		c.ServeJSON()
+		return
+	}
+	nln := 0
+	x = 22.0
+	for n := 0; len(DeviceSensor_data) > n; n++ {
+		var textH float64 = 25 // if text height is 25px.
+		pdf.SetNewY(y, textH)
+		y = pdf.GetY()
+
+		nln++
+		if nln > 4 {
+			nln = 1
+			x = 22.0
+			y += 18
+		}
+
+		if y >= 794 {
+			err = pdf.SetFont("wts", "", 10)
+			if err != nil {
+				c.Data["json"] = lib.JSONS{Code: 207, Msg: err.Error()}
+				c.ServeJSON()
+				return
+			}
+			pdf.AddPage()
+			pages := pdf.GetNumberOfPages()
+			pagenums := fmt.Sprintf("第 %d 页", pages)
+			pagenum, _ := pdf.MeasureTextWidth(pagenums)
+			pdf.SetX((595 / 2) - (pagenum / 2))
+			pdf.SetY(830) // 设置页码位置
+			pdf.Cell(nil, pagenums)
+			x = 22.0
+			y = 20
+			lib.RectFillColor(pdf, "记录时间", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+			x += w1
+			lib.RectFillColor(pdf, "温度℃", 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+			x += w2
+			lib.RectFillColor(pdf, "记录时间", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+			x += w1
+			lib.RectFillColor(pdf, "温度℃", 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+			x += w2
+			lib.RectFillColor(pdf, "记录时间", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+			x += w1
+			lib.RectFillColor(pdf, "温度℃", 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+			x += w2
+			lib.RectFillColor(pdf, "记录时间", 10, x, y, w1, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+			x += w1
+			lib.RectFillColor(pdf, "温度℃", 10, x, y, w2, 20, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+			x += w2
+			x = 22.0
+			y += 20
+
+		}
+		err = pdf.SetFont("wts", "", 8)
+
+		// ------------------
+		T_t = fmt.Sprintf(" %.1f ", DeviceSensor_data[n].T_t)
+		T_time = fmt.Sprintf("%s", DeviceSensor_data[n].T_time)
+
+		lib.RectFillColor(pdf, T_time, 10, x, y, w1, 18, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+		x += w1
+		lib.RectFillColor(pdf, T_t, 10, x, y, w2, 18, 255, 255, 255, lib.AlignCenter, lib.ValignMiddle)
+		x += w2
+
+	}
+
+	err = pdf.SetFont("wts", "", 10)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: err.Error()}
+		c.ServeJSON()
+		return
+	}
+
+	//----------------
+	timeStr := "ofile/" + time.Now().Format("20060102150405") + ".pdf"
+
+	err = pdf.WritePdf(timeStr)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: err.Error()}
+		c.ServeJSON()
+		return
+	}
+
+	//上传 OSS
+	//url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/"+timeStr, timeStr)
+	url, is := NatsServer.Qiniu_UploadFile(timeStr, timeStr)
+	if !is {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "oss!"}
+		c.ServeJSON()
+		return
+	}
+	//删除目录
+	err = os.Remove(timeStr)
+	if err != nil {
+		fmt.Println(err)
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
+	c.ServeJSON()
+	return
+
+}

+ 58 - 0
cron/corn.go

@@ -0,0 +1,58 @@
+package cron
+
+import (
+	"Cold_GoodsOrder/Nats/NatsServer"
+	"Cold_GoodsOrder/models/Function"
+	"github.com/beego/beego/v2/adapter/orm"
+	beego "github.com/beego/beego/v2/server/web"
+	"github.com/robfig/cron/v3"
+	"time"
+)
+
+func Cron_WarningRate() {
+	// 创建一个定时任务对象
+	c := cron.New(cron.WithSeconds())
+	// 给对象增加定时任务
+	// @daily 每日运行一次
+	corn, _ := beego.AppConfig.String("corn")
+	c.AddFunc(corn, CronUpdateOrderState)
+	// 启动定时任务
+	c.Start()
+	defer c.Stop()
+
+	// 查询语句,阻塞,让main函数不退出,保持程序运行
+	select {}
+
+}
+func CronUpdateOrderState() {
+	var err error
+	o := orm.NewOrm()
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+	var orders []Function.Order
+	_, err = o.Raw("SELECT * FROM `order` WHERE t__state = ? OR t__state = ?", 1, 2).QueryRows(&orders)
+	for _, v := range orders {
+		d, _ := NatsServer.ReadDeviceByT_sn(v.T_sn)
+		if len(d.T_sn) != 0 {
+			// 监控状态 0 未监控 1 监控
+			if v.T_State == 1 && d.T_monitor == 1 {
+				v.T_State = 2 // 更新状态为在途
+				v.T_start_Ut = time.Now()
+				// 更新订单状态到数据库
+				_, err = o.Update(&v, "t__state", "t_start__ut")
+				Function.Redis_Order_Set(v)
+			} else if v.T_State == 2 && !v.T_start_Ut.IsZero() && d.T_monitor == 0 {
+				v.T_State = 3 // 更新状态为已完成
+				v.T_end_Ut = time.Now()
+				// 更新订单状态到数据库
+				_, err = o.Update(&v, "t__state", "t_end__ut")
+				Function.Redis_Order_Set(v)
+			}
+		}
+	}
+}

+ 7 - 5
go.mod

@@ -5,6 +5,7 @@ go 1.19
 require (
 	github.com/astaxie/beego v1.12.3
 	github.com/beego/beego/v2 v2.0.7
+	github.com/go-resty/resty/v2 v2.16.5
 	github.com/go-sql-driver/mysql v1.7.0
 	github.com/nats-io/nats.go v1.22.1
 	github.com/qiniu/go-sdk/v7 v7.14.0
@@ -30,13 +31,14 @@ require (
 	github.com/prometheus/client_model v0.3.0 // indirect
 	github.com/prometheus/common v0.37.0 // indirect
 	github.com/prometheus/procfs v0.8.0 // indirect
+	github.com/robfig/cron/v3 v3.0.1 // indirect
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
-	golang.org/x/crypto v0.5.0 // indirect
-	golang.org/x/net v0.5.0 // indirect
-	golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
-	golang.org/x/sys v0.4.0 // indirect
-	golang.org/x/text v0.6.0 // indirect
+	golang.org/x/crypto v0.31.0 // indirect
+	golang.org/x/net v0.33.0 // indirect
+	golang.org/x/sync v0.10.0 // indirect
+	golang.org/x/sys v0.28.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
 	google.golang.org/protobuf v1.28.1 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect

+ 15 - 11
go.sum

@@ -99,6 +99,8 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+
 github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
 github.com/go-playground/validator/v10 v10.8.0/go.mod h1:9JhgTzTaE31GZDpH/HSvHiRJrJ3iKAgqqH0Bl/Ocjdk=
 github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
+github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM=
+github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
 github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
@@ -263,6 +265,8 @@ github.com/qiniu/dyn v1.3.0/go.mod h1:E8oERcm8TtwJiZvkQPbcAh0RL8jO1G0VXJMW3FAWdk
 github.com/qiniu/go-sdk/v7 v7.14.0 h1:6icihMTKHoKMmeU1mqtIoHUv7c1LrLjYm8wTQaYDqmw=
 github.com/qiniu/go-sdk/v7 v7.14.0/go.mod h1:btsaOc8CA3hdVloULfFdDgDc+g4f3TDZEFsDY0BLE+w=
 github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs=
+github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
+github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
@@ -314,8 +318,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
-golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -379,8 +383,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=
-golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -397,8 +401,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8=
-golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -441,8 +445,8 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
-golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -452,12 +456,12 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
-golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=

+ 63 - 0
lib/Aes.go

@@ -0,0 +1,63 @@
+package lib
+
+import (
+	"bytes"
+	"crypto/aes"
+	"crypto/cipher"
+	"encoding/base64"
+)
+
+var AesKey = "xJy1C2Eo5N7qR8Vr"
+
+func AesEncryptCBC(orig string, key string) string {
+	// 转成字节数组
+	origData := []byte(orig)
+	k := []byte(key)
+	// 分组秘钥
+	// NewCipher该函数限制了输入k的长度必须为16, 24或者32
+	block, _ := aes.NewCipher(k)
+	// 获取秘钥块的长度
+	blockSize := block.BlockSize()
+	// 补全码
+	origData = PKCS7Padding(origData, blockSize)
+	// 加密模式
+	blockMode := cipher.NewCBCEncrypter(block, k[:blockSize])
+	// 创建数组
+	cryted := make([]byte, len(origData))
+	// 加密
+	blockMode.CryptBlocks(cryted, origData)
+	return base64.StdEncoding.EncodeToString(cryted)
+}
+func AesDecryptCBC(cryted string, key string) string {
+	// 转成字节数组
+	crytedByte, _ := base64.StdEncoding.DecodeString(cryted)
+	k := []byte(key)
+	// 分组秘钥
+	block, _ := aes.NewCipher(k)
+	// 获取秘钥块的长度
+	blockSize := block.BlockSize()
+	// 加密模式
+	blockMode := cipher.NewCBCDecrypter(block, k[:blockSize])
+	// 创建数组
+	orig := make([]byte, len(crytedByte))
+	// 解密
+	blockMode.CryptBlocks(orig, crytedByte)
+	// 去补全码
+	orig = PKCS7UnPadding(orig)
+	return string(orig)
+}
+
+// 补码
+// AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。
+func PKCS7Padding(ciphertext []byte, blocksize int) []byte {
+	padding := blocksize - len(ciphertext)%blocksize
+	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
+	return append(ciphertext, padtext...)
+}
+
+// 去码
+func PKCS7UnPadding(origData []byte) []byte {
+	length := len(origData)
+	unpadding := int(origData[length-1])
+	return origData[:(length - unpadding)]
+}

+ 21 - 0
lib/SubSms.go

@@ -0,0 +1,21 @@
+package lib
+
+import (
+	"errors"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func SendModel(phone, content string) error {
+	subMailappid, err := beego.AppConfig.String("subMailappid")
+	subMailsignature, err := beego.AppConfig.String("subMailsignature")
+	ss := NewSMS(subMailappid, subMailsignature)
+	if err != nil {
+		return errors.New("获取短信参数失败")
+	}
+	res, err := ss.SmsXSend(phone, content)
+	if err != nil || res.Status != SUCCESS {
+		return errors.New("发送短信出现异常")
+	} else {
+		return nil
+	}
+}

+ 98 - 0
lib/sms.go

@@ -0,0 +1,98 @@
+package lib
+
+import (
+	"encoding/json"
+	"github.com/go-resty/resty/v2"
+)
+
+const (
+	SUCCESS = "success"
+)
+
+type SMS struct {
+	Appid     string
+	Signature string
+}
+
+func NewSMS(appid, signature string) *SMS {
+	return &SMS{
+		Appid:     appid,
+		Signature: signature,
+	}
+}
+
+type SendRes struct {
+	Status  string `json:"status"`
+	Send_id string `json:"send_id"`
+	Fee     int    `json:"fee"`
+	Msg     string `json:"msg"`
+	Code    int    `json:"code"`
+}
+type XSendRes struct {
+	Status  string  `json:"status"`
+	Send_id string  `json:"send_id"`
+	Fee     float64 `json:"fee"`
+	Msg     string  `json:"msg"`
+	Code    string  `json:"code"`
+}
+
+// 短信发送
+func (t *SMS) Send(to, content string) (SendRes, error) {
+
+	client := resty.New()
+	resp, err := client.R().
+		SetHeader("Content-Type", "application/x-www-form-urlencoded").
+		SetFormData(map[string]string{
+			"appid":     t.Appid,
+			"signature": t.Signature,
+			"to":        to,
+			"content":   content,
+		}).
+		SetResult(&SendRes{}).
+		Post("https://api-v4.mysubmail.com/sms/send.json")
+
+	if err != nil {
+		return SendRes{}, err
+	}
+
+	temp := SendRes{}
+	if err = json.Unmarshal(resp.Body(), &temp); err != nil {
+		return SendRes{}, err
+	}
+	return temp, nil
+}
+
+// SmsXSend 短信模板发送
+func (t *SMS) SmsXSend(to, addr string) (XSendRes, error) {
+
+	type Vars struct {
+		Addr string `json:"addr"`
+	}
+
+	vars := Vars{Addr: addr}
+
+	b, _ := json.Marshal(vars)
+
+	client := resty.New()
+	resp, err := client.R().
+		SetHeader("Content-Type", "application/x-www-form-urlencoded").
+		SetFormData(map[string]string{
+			"appid":     t.Appid,
+			"signature": t.Signature,
+			"to":        to,
+			"project":   "Z5wH13",
+			"vars":      string(b),
+		}).
+		SetResult(&XSendRes{}).
+		Post("https://api-v4.mysubmail.com/sms/xsend")
+
+	if err != nil {
+		return XSendRes{}, err
+	}
+
+	temp := XSendRes{}
+	if err = json.Unmarshal(resp.Body(), &temp); err != nil {
+		return XSendRes{}, err
+	}
+	return temp, nil
+}

+ 4 - 2
main.go

@@ -3,10 +3,12 @@ package main
 import (
 	_ "Cold_GoodsOrder/Nats"
 	"Cold_GoodsOrder/conf"
+	"Cold_GoodsOrder/cron"
 	"Cold_GoodsOrder/routers"
 	_ "Cold_GoodsOrder/routers"
 	"fmt"
 	"github.com/beego/beego/v2/adapter/orm"
+	orm2 "github.com/beego/beego/v2/client/orm"
 	beego "github.com/beego/beego/v2/server/web"
 	"github.com/beego/beego/v2/server/web/filter/cors"
 	_ "github.com/go-sql-driver/mysql"
@@ -17,11 +19,12 @@ import (
 func init() {
 	fmt.Println(runtime.GOOS)
 	orm.RegisterDriver("mysql", orm.DRMySQL)
-	//orm.RegisterDataBase("default", "mysql", "zdxq:7e5853d9178edfcc@tcp(47.108.133.234:3306)/zdxq?charset=utf8",100,200)
 	orm.RegisterDataBase("default", "mysql",
 		conf.MysqlServer_Username+":"+conf.MysqlServer_Password+"@tcp("+conf.MysqlServer_UrlPort+")/"+conf.MysqlServer_Database+"?charset=utf8mb4&loc=Local&parseTime=True",
 		conf.MysqlServer_MaxIdleConnections, conf.MysqlServer_MaxOpenConnections)
 	orm.RunSyncdb("default", false, true) // 创建本地数据库
+	orm2.Debug = true
+	go cron.Cron_WarningRate()
 }
 
 func main() {
@@ -46,7 +49,6 @@ func main() {
 	beego.BConfig.ServerName = conf.AppName + conf.HTTPPort //server  名称
 	beego.BConfig.RunMode = "dev"                           //  应用的运行模式
 	beego.BConfig.Listen.HTTPPort = HTTPPort_int            //监听端口  本地:8518  线上:8528
-
 	beego.Run()
 
 }

+ 1 - 1
models/Device/DeviceData.go

@@ -11,7 +11,7 @@ type DeviceData_R struct {
 	T_name string  // 传感器名称
 	T_t    float32 // 温度
 	T_rh   float32 // 湿度
-	T_Site string  // GPS
+	T_site string  // GPS
 	T_tl   float32 // 温度下限
 	T_tu   float32 // 温度上限
 	T_rhl  float32 // 湿度下限

+ 186 - 0
models/Function/Address.go

@@ -0,0 +1,186 @@
+package Function
+
+import (
+	"Cold_GoodsOrder/conf"
+	"encoding/json"
+	"fmt"
+	"github.com/astaxie/beego/cache"
+	"github.com/beego/beego/v2/adapter/orm"
+	orm2 "github.com/beego/beego/v2/client/orm"
+	_ "github.com/go-sql-driver/mysql"
+	"strconv"
+	"time"
+)
+
+// Address Order 模板
+type Address struct {
+	Id         int       `json:"Id" orm:"column(ID);size(11);auto;pk"`
+	Name       string    `json:"T_name" orm:"size(256);null"`                          // 公司名称
+	Address    string    `json:"T_Address" orm:"size(256);null"`                       // 地址详情
+	Phone      string    `orm:"size(256);null"`                                        // 电话
+	Email      string    `orm:"size(256);null"`                                        // 邮箱
+	UserId     int       `orm:"index;size(256);null"`                                  // 用户ID
+	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` // 创建时间
+	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     // 更新时间
+}
+type AddressR struct {
+	Id         int    `json:"Id"`        // ID
+	Name       string `json:"T_name"`    // 地址名称
+	Address    string `json:"T_Address"` // 地址详情
+	Phone      string // 电话
+	Email      string // 邮箱
+	UserId     int    // 用户ID
+	CreateTime string // 创建时间
+	UpdateTime string // 更新时间
+}
+
+func AddressToAddressR(t Address) (r AddressR) {
+	r.Id = t.Id
+	r.Name = t.Name
+	r.Address = t.Address
+	r.Phone = t.Phone
+	r.Email = t.Email
+	r.UserId = t.UserId
+	r.CreateTime = t.CreateTime.Format("2006-01-02 15:04:05")
+	r.UpdateTime = t.UpdateTime.Format("2006-01-02 15:04:05")
+	return
+}
+
+func (t *Address) TableName() string {
+	return "address" // 数据库名称
+}
+
+var redisCache_Address cache.Cache
+
+func init() {
+	//注册模型
+	orm.RegisterModel(new(Address))
+	config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
+		"redis_Address", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
+	fmt.Println(config)
+	var err error
+	redisCache_Address, err = cache.NewCache("redis", config)
+	if err != nil || redisCache_Address == nil {
+		errMsg := "failed to init redis"
+		fmt.Println(errMsg, err)
+	}
+
+}
+
+// ---------------- Redis -------------------
+func Redis_Address_Set(r Address) (err error) {
+	//json序列化
+	str, err := json.Marshal(r)
+	if err != nil {
+		fmt.Print(err)
+		return
+	}
+
+	err = redisCache_Address.Put(strconv.Itoa(r.Id), str, 24*time.Hour)
+	if err != nil {
+		fmt.Println("set key:", strconv.Itoa(r.Id), ",value:", str, err)
+	}
+	return
+}
+
+func Redis_Address_Get(key string) (r Address, is bool) {
+	if redisCache_Address.IsExist(key) {
+		//println("找到key:",key)
+		v := redisCache_Address.Get(key)
+
+		json.Unmarshal(v.([]byte), &r)
+		return r, true
+	}
+	//println("没有 找到key:",key)
+	return Address{}, false
+}
+
+func Redis_Address_DelK(key string) (err error) {
+	err = redisCache_Address.Delete(key)
+	return
+}
+
+// ---------------- 特殊方法 -------------------
+
+// 获取 ById
+func Read_Address_ById(id int) (r Address) {
+	if r, is := Redis_Address_Get(strconv.Itoa(id)); is {
+		return r
+	}
+
+	o := orm.NewOrm()
+	r = Address{Id: id}
+	err := o.Read(&r)
+	if err != nil {
+		fmt.Println(err)
+	}
+	return r
+}
+
+// 添加
+func Add_Address(m Address) (id int64, err error) {
+	o := orm.NewOrm()
+
+	id, err = o.Insert(&m)
+	if err != nil {
+		fmt.Println(err)
+	}
+	Redis_Address_Set(m)
+	return id, err
+}
+
+// 修改
+func Update_Address(r Address, cols ...string) bool {
+	o := orm.NewOrm()
+	if num, err := o.Update(&r, cols...); err == nil {
+		fmt.Println("Number of records updated in database:", num)
+		Redis_Address_Set(r)
+		return true
+	}
+	return false
+}
+
+// 删除
+func Delete_Address(m Address) bool {
+	o := orm.NewOrm()
+	if num, err := o.Delete(&m); err == nil {
+		fmt.Println("Number of records deleted in database:", num)
+		Redis_Address_DelK(strconv.Itoa(m.Id))
+		return true
+	}
+	return false
+}
+
+// 获取列表
+func Read_Address_List(userId int, page int, page_z int, address, name string) (t []AddressR, cnt int64) {
+	o := orm.NewOrm()
+
+	// 也可以直接使用 Model 结构体作为表名
+	qs := o.QueryTable(new(Address))
+	var offset int64
+	if page_z == 0 {
+		page_z = conf.Page_size
+	}
+	var r []Address
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	cond := orm.NewCondition()
+	cond1 := cond.And("UserId", userId)
+	if len(address) > 0 {
+		cond1 = cond1.And("address__icontains", address)
+	}
+	if len(name) > 0 {
+		cond1 = cond1.And("name__icontains", name)
+	}
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
+	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()
+
+	for _, v := range r {
+		t = append(t, AddressToAddressR(v))
+	}
+	return t, cnt
+}

+ 260 - 0
models/Function/Order.go

@@ -0,0 +1,260 @@
+package Function
+
+import (
+	"Cold_GoodsOrder/Nats/NatsServer"
+	"Cold_GoodsOrder/conf"
+	"encoding/json"
+	"fmt"
+	"github.com/astaxie/beego/cache"
+	"github.com/beego/beego/v2/adapter/orm"
+	orm2 "github.com/beego/beego/v2/client/orm"
+	_ "github.com/go-sql-driver/mysql"
+	"strconv"
+	"time"
+)
+
+// Order 模板
+type Order struct {
+	Id                  int       `orm:"column(ID);size(11);auto;pk"`
+	T_pid               int       `orm:"index;size(256);null"`                                  // Account.Company 绑定公司
+	ChildPid            string    `orm:"index;size(256);null"`                                  //子公司id
+	T_orderid           string    `orm:"size(256);null"`                                        // 订单号
+	T_outorderid        string    `orm:"size(256);null"`                                        // 出库订单号
+	WaybillNo           string    `orm:"size(256);null"`                                        //运单号
+	T_sn                string    `orm:"size(256);null"`                                        // 设备sn
+	DeviceType          string    `orm:"size(256);null"`                                        // 设备类型
+	T_receiving         string    `orm:"size(256);null"`                                        // 收货单位
+	ShippingUnit        string    `orm:"size(256);null"`                                        //发货单位
+	T_start_Ut          time.Time `orm:"type(timestamp);null;"`                                 // 起运时间
+	T_end_Ut            time.Time `orm:"type(timestamp);null;"`                                 // 到达时间
+	EstimateEndTime     time.Time `orm:"type(timestamp);null;"`                                 // 预计到达时间
+	EstimateStartTime   time.Time `orm:"type(timestamp);null;"`                                 // 预计开始时间
+	PeerList            string    `orm:"size(256);null"`                                        //随货同行单
+	T_text              string    `orm:"type(text);null"`                                       // 详情
+	T_State             int       `orm:"size(2);default(1)"`                                    //1 正常 2 在途 3 已到达
+	IsExpatriate        int       `orm:"size(2);default(1)"`                                    //1 非外派  2外派
+	ExpatriateReceiving string    `orm:"size(256);null"`                                        //外派收货单位
+	Phone               string    `orm:"size(256);"`                                            //电话
+	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 OrderR struct {
+	Id                int     // ID
+	T_orderid         string  // 订单号
+	T_outorderid      string  // 出库订单号
+	ShippingUnit      string  //发货单位
+	T_name            string  // 设备名称
+	DeviceType        string  // 设备类型
+	T_sn              string  // 设备sn
+	T_receiving       string  // 收货单位
+	T_start_Ut        string  // 起运时间
+	T_start_Ut_T      float32 // 起运温度
+	T_end_Ut          string  // 到达时间
+	T_end_Ut_T        float32 // 到达时间
+	T_text            string  // 详情
+	PeerList          string  //随货同行单号
+	WaybillNo         string
+	T_State           int
+	ChildPid          string
+	IsExpatriate      int    //1 非外派  2外派
+	Phone             string //电话
+	EstimateStartTime string
+	EstimateEndTime   string
+}
+
+func OrderToOrderR(t Order) (r OrderR) {
+	r.Id = t.Id
+	r.T_orderid = t.T_orderid
+	r.T_outorderid = t.T_outorderid
+	Device_r, err := NatsServer.ReadDeviceByT_sn(t.T_sn)
+	r.T_name = t.T_sn
+	if err == nil {
+		r.T_name = Device_r.T_devName
+	}
+	r.WaybillNo = t.WaybillNo
+	r.ChildPid = t.ChildPid
+	r.IsExpatriate = t.IsExpatriate
+	r.Phone = t.Phone
+	r.T_sn = t.T_sn
+	r.T_receiving = t.T_receiving
+	if !t.T_start_Ut.IsZero() {
+		r.T_start_Ut = t.T_start_Ut.Format("2006-01-02 15:04:05")
+	}
+	if !t.T_end_Ut.IsZero() {
+		r.T_end_Ut = t.T_end_Ut.Format("2006-01-02 15:04:05")
+	}
+	if !t.EstimateStartTime.IsZero() {
+		r.EstimateStartTime = t.EstimateStartTime.Format("2006-01-02 15:04:05")
+	}
+	if !t.EstimateEndTime.IsZero() {
+		r.EstimateEndTime = t.EstimateEndTime.Format("2006-01-02 15:04:05")
+	}
+	r.T_text = t.T_text
+	r.PeerList = t.PeerList
+	r.ShippingUnit = t.ShippingUnit
+	r.DeviceType = t.DeviceType
+	r.T_State = t.T_State
+	return
+}
+
+func (t *Order) TableName() string {
+	return "order" // 数据库名称   // ************** 替换 FormulaList **************
+}
+
+var redisCache_Order cache.Cache
+
+func init() {
+	//注册模型
+	orm.RegisterModel(new(Order))
+	config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
+		"redis_Order", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
+	fmt.Println(config)
+	var err error
+	redisCache_Order, err = cache.NewCache("redis", config)
+	if err != nil || redisCache_Order == nil {
+		errMsg := "failed to init redis"
+		fmt.Println(errMsg, err)
+	}
+
+}
+
+// ---------------- Redis -------------------
+func Redis_Order_Set(r Order) (err error) {
+	//json序列化
+	str, err := json.Marshal(r)
+	if err != nil {
+		fmt.Print(err)
+		return
+	}
+
+	err = redisCache_Order.Put(strconv.Itoa(r.Id), str, 24*time.Hour)
+	if err != nil {
+		fmt.Println("set key:", strconv.Itoa(r.Id), ",value:", str, err)
+	}
+	return
+}
+
+func Redis_Order_Get(key string) (r Order, is bool) {
+	if redisCache_Order.IsExist(key) {
+		//println("找到key:",key)
+		v := redisCache_Order.Get(key)
+
+		json.Unmarshal(v.([]byte), &r)
+		return r, true
+	}
+	//println("没有 找到key:",key)
+	return Order{}, false
+}
+
+func Redis_Order_DelK(key string) (err error) {
+	err = redisCache_Order.Delete(key)
+	return
+}
+
+// ---------------- 特殊方法 -------------------
+
+// 获取 ById
+func Read_Order_ById(id int) (r Order) {
+	if r, is := Redis_Order_Get(strconv.Itoa(id)); is {
+		return r
+	}
+
+	o := orm.NewOrm()
+	r = Order{Id: id}
+	err := o.Read(&r)
+	if err != nil {
+		fmt.Println(err)
+	}
+	return r
+}
+func Read_Order_ByOderid(t_orderid string) (r Order) {
+
+	o := orm.NewOrm()
+	r = Order{T_orderid: t_orderid}
+	err := o.Raw("SELECT * FROM `order` WHERE t_orderid = ?", t_orderid).QueryRow(&r)
+	if err != nil {
+		fmt.Println(err)
+	}
+	return r
+}
+func Read_Order_ByOrderid(id int) (r Order) {
+	o := orm.NewOrm()
+	r = Order{Id: id}
+	err := o.Read(&r)
+	if err != nil {
+		fmt.Println(err)
+	}
+	return r
+}
+
+// 添加
+func Add_Order(m Order) (id int64, err error) {
+	o := orm.NewOrm()
+
+	id, err = o.Insert(&m)
+	if err != nil {
+		fmt.Println(err)
+	}
+	Redis_Order_Set(m)
+	return id, err
+}
+
+// 修改
+func Update_Order(r Order, cols ...string) bool {
+	o := orm.NewOrm()
+	if num, err := o.Update(&r, cols...); err == nil {
+		fmt.Println("Number of records updated in database:", num)
+		Redis_Order_Set(r)
+		return true
+	}
+	return false
+}
+
+// 删除
+func Delete_Order(m Order) bool {
+	o := orm.NewOrm()
+	m.T_State = 0
+	if num, err := o.Delete(&m); err == nil {
+		fmt.Println("Number of records deleted in database:", num)
+		Redis_Order_DelK(strconv.Itoa(m.Id))
+		return true
+	}
+	return false
+}
+
+// Read_Order_List 获取列表
+func Read_Order_List(T_pid int, page int, page_z int, order, sn, startTime, endTime string) (t []OrderR, cnt int64) {
+	o := orm.NewOrm()
+
+	// 也可以直接使用 Model 结构体作为表名
+	qs := o.QueryTable(new(Order))
+	var offset int64
+	if page_z == 0 {
+		page_z = conf.Page_size
+	}
+	var r []Order
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	cond := orm.NewCondition().And("T_pid", T_pid).Or("child_pid", T_pid)
+	cond1 := orm.NewCondition().AndCond(cond)
+	if len(order) > 0 {
+		cond1 = cond1.And("T_orderid__icontains", order)
+	}
+	if len(sn) > 0 {
+		cond1 = cond1.And("T_sn__icontains", sn)
+	}
+	if len(startTime) > 0 && len(endTime) > 0 {
+		cond1 = cond1.And("T_start_Ut__gte", startTime).And("T_start_Ut__lte", endTime)
+	}
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
+	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()
+
+	for _, v := range r {
+		t = append(t, OrderToOrderR(v))
+	}
+	return t, cnt
+}

+ 21 - 0
routers/Address.go

@@ -0,0 +1,21 @@
+package routers
+
+import (
+	"Cold_GoodsOrder/conf"
+	"Cold_GoodsOrder/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+	// 地址管理
+	ns := beego.NewNamespace(conf.Version,
+		beego.NSNamespace("/Addr",
+			beego.NSRouter("List", &controllers.AddressController{}, "*:Address_List"), // 地址列表
+			beego.NSRouter("Get", &controllers.AddressController{}, "*:AddressGet"),    // 获取地址
+			beego.NSRouter("Add", &controllers.AddressController{}, "*:AddressAdd"),    // 添加地址
+			beego.NSRouter("Edit", &controllers.AddressController{}, "*:AddressEdit"),  // 编辑地址
+			beego.NSRouter("Del", &controllers.AddressController{}, "*:AddressDel"),    // 删除地址
+		),
+	)
+	beego.AddNamespace(ns)
+}

+ 18 - 0
routers/NotAuth.go

@@ -0,0 +1,18 @@
+package routers
+
+import (
+	"Cold_GoodsOrder/conf"
+	"Cold_GoodsOrder/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+	// 订单管理
+	ns := beego.NewNamespace(conf.Version,
+		beego.NSNamespace("/Order",
+			beego.NSRouter("GetDeviceDataNot", &controllers.NotAuthController{}, "*:GetDeviceData"), // 获取设备数据
+			beego.NSRouter("Test", &controllers.NotAuthController{}, "*:Test"),                      // 获取设备数据
+		),
+	)
+	beego.AddNamespace(ns)
+}

+ 26 - 0
routers/Order.go

@@ -0,0 +1,26 @@
+package routers
+
+import (
+	"Cold_GoodsOrder/conf"
+	"Cold_GoodsOrder/controllers"
+	beego "github.com/beego/beego/v2/server/web"
+)
+
+func init() {
+	// 订单管理
+	ns := beego.NewNamespace(conf.Version,
+		beego.NSNamespace("/Order",
+			beego.NSRouter("List", &controllers.OrderController{}, "*:Order_List"),             // 订单列表
+			beego.NSRouter("CreateOrderNo", &controllers.OrderController{}, "*:CreateOrderNo"), // 获取订单号
+			beego.NSRouter("Get", &controllers.OrderController{}, "*:Order_Get"),               // 获取订单
+			beego.NSRouter("Add", &controllers.OrderController{}, "*:Order_Add"),               // 添加订单
+			beego.NSRouter("Edit", &controllers.OrderController{}, "*:Order_Edit"),             // 编辑订单
+			beego.NSRouter("Del", &controllers.OrderController{}, "*:Order_Del"),               // 删除订单
+			beego.NSRouter("PDF", &controllers.OrderController{}, "*:Order_PDF"),               // 订单pdf
+			beego.NSRouter("GetDeviceData", &controllers.OrderController{}, "*:GetDeviceData"), // 获取设备数据
+		),
+	)
+
+	beego.AddNamespace(ns)
+
+}

+ 13 - 2
routers/filter.go

@@ -5,9 +5,16 @@ import (
 	"Cold_GoodsOrder/lib"
 	"Cold_GoodsOrder/models/Account"
 	"github.com/beego/beego/v2/server/web/context"
+	"log"
+	"strings"
 )
 
 func RBACFilter(ctx *context.Context) {
+	//过滤/v3/Order/GetDeviceData接口不验证登录
+	log.Println(ctx.Request.URL.String())
+	if strings.Contains(ctx.Request.URL.String(), "/v3/Order/GetDeviceDataNot") || strings.Contains(ctx.Request.URL.String(), "/Cold_GoodsOrder/v3/Order/Test") {
+		return
+	}
 	b_, User_r, T_pid := NatsServer.Verification(ctx.GetCookie("User_tokey"), ctx.Input.Query("User_tokey"))
 	if !b_ {
 		ctx.Output.JSON(lib.JSONS{Code: 201, Msg: "请重新登陆!"}, true, false)
@@ -16,8 +23,12 @@ func RBACFilter(ctx *context.Context) {
 
 	Account.User_r = &User_r
 	Account.T_pid = &T_pid
-
-	flag := NatsServer.CheckUserPermissions(Account.User_r.T_power, ctx.Request.URL.Path)
+	index := strings.Index(ctx.Request.URL.Path, "/v3")
+	if index == -1 {
+		data := lib.JSONS{Code: 202, Msg: "无权访问!"}
+		ctx.Output.JSON(data, true, false)
+	}
+	flag := NatsServer.CheckUserPermissions(Account.User_r.T_power, ctx.Request.URL.Path[index:])
 
 	if !flag {
 		data := lib.JSONS{Code: 202, Msg: "无权访问!"}