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 }