115 lines
2.9 KiB
Go
115 lines
2.9 KiB
Go
|
package saft_hat
|
|||
|
|
|||
|
import (
|
|||
|
"bytes"
|
|||
|
"context"
|
|||
|
"encoding/json"
|
|||
|
"fmt"
|
|||
|
"github.com/gogf/gf/v2/frame/g"
|
|||
|
"io/ioutil"
|
|||
|
"net/http"
|
|||
|
"strconv"
|
|||
|
"strings"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
// 更新设备开关机时间
|
|||
|
type UpdateTimeReq struct {
|
|||
|
g.Meta `path:"/device/uploadTime" method:"post" tags:"安全帽相关" summary:"更新设备开关机时间"`
|
|||
|
Data string `json:"data" dc:"设备号"` // 设备数据
|
|||
|
OnTime string `json:"onTime" dc:"设备开机时间,例如 09:00"` // 设备开机时间
|
|||
|
OffTime string `json:"OffTime" dc:"设备关机时间,例如 23:00"` // 设备关机时间
|
|||
|
}
|
|||
|
|
|||
|
type UpdateTimeRes struct {
|
|||
|
Code int `json:"code"` // 响应代码
|
|||
|
Data string `json:"data"` // 设备数据
|
|||
|
Msg string `json:"msg"` // 响应消息
|
|||
|
}
|
|||
|
|
|||
|
// 处理设备开关机时间的更新
|
|||
|
func (h Hat) UpdateTime(ctx context.Context, req *UpdateTimeReq) (res *UpdateTimeRes, err error) {
|
|||
|
res = new(UpdateTimeRes)
|
|||
|
data := req.Data
|
|||
|
timestamp := time.Now().Unix()
|
|||
|
|
|||
|
// 准备生成签名的参数
|
|||
|
params := map[string]string{
|
|||
|
"appid": appid,
|
|||
|
"data": data,
|
|||
|
"off_time": req.OffTime,
|
|||
|
"on_time": req.OnTime,
|
|||
|
"secret": secret,
|
|||
|
"timestamp": strconv.FormatInt(timestamp, 10),
|
|||
|
}
|
|||
|
|
|||
|
// 生成签名
|
|||
|
sign := GenerateSignature(params)
|
|||
|
|
|||
|
// 构造请求体
|
|||
|
payload := map[string]interface{}{
|
|||
|
"appid": appid,
|
|||
|
"data": data,
|
|||
|
"off_time": req.OffTime,
|
|||
|
"on_time": req.OnTime,
|
|||
|
"secret": secret,
|
|||
|
"timestamp": timestamp,
|
|||
|
"sign": sign,
|
|||
|
}
|
|||
|
payloadBytes, err := json.Marshal(payload)
|
|||
|
if err != nil {
|
|||
|
return res, err
|
|||
|
}
|
|||
|
|
|||
|
// 发送POST请求
|
|||
|
resp, err := http.Post("https://www.loctp.com/api/crm/v1/uploadTime", "application/json", bytes.NewBuffer(payloadBytes))
|
|||
|
if err != nil {
|
|||
|
return res, err
|
|||
|
}
|
|||
|
defer resp.Body.Close()
|
|||
|
|
|||
|
// 检查响应
|
|||
|
respBody, err := ioutil.ReadAll(resp.Body)
|
|||
|
if err != nil {
|
|||
|
return res, err
|
|||
|
}
|
|||
|
|
|||
|
// 解析包含多个设备号的字符串,设备号通过英文逗号分割
|
|||
|
devNums := strings.Split(req.Data, ",")
|
|||
|
|
|||
|
// 对每个设备号执行插入或更新操作
|
|||
|
for _, devNum := range devNums {
|
|||
|
// 首先去除可能的空格
|
|||
|
devNum = strings.TrimSpace(devNum)
|
|||
|
type StutusType struct {
|
|||
|
Status int
|
|||
|
}
|
|||
|
statusType := new(StutusType)
|
|||
|
// 先查看该设备的状态
|
|||
|
g.Model("device").Fields("status").Where("dev_num = ?", devNum).Scan(&statusType)
|
|||
|
// 如果设备在线(status=1)才允许更新它的开关机时间信息
|
|||
|
if statusType.Status == 1 {
|
|||
|
// 插入或更新电池开关机时间
|
|||
|
_, err := g.Model("device").Data(g.Map{
|
|||
|
"dev_num": devNum,
|
|||
|
"battery_on": req.OnTime,
|
|||
|
"battery_off": req.OffTime,
|
|||
|
}).Where("dev_num", devNum).Save()
|
|||
|
// 如果发生错误,立即返回
|
|||
|
if err != nil {
|
|||
|
fmt.Println("Error updating/inserting for device", devNum, ":", err)
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
} else {
|
|||
|
fmt.Println("Device", devNum, "is not online; skipping update.")
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
err = json.Unmarshal(respBody, res)
|
|||
|
if err != nil {
|
|||
|
return res, err
|
|||
|
}
|
|||
|
|
|||
|
return res, nil
|
|||
|
}
|