Files
zmkgC/api/saft_hat/hat_time.go
2025-07-07 20:11:59 +08:00

115 lines
2.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}