746 lines
21 KiB
Go
746 lines
21 KiB
Go
package task
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"likedream-goframe/internal/application/cpdaily"
|
|
"likedream-goframe/internal/application/cpdaily/cryptoutil"
|
|
"likedream-goframe/internal/application/cpdaily/imageuploader"
|
|
"likedream-goframe/internal/application/cpdaily/submitcaptcha"
|
|
"likedream-goframe/internal/application/cpdaily/task/formtype"
|
|
"likedream-goframe/internal/application/cpdaily/taskhelper"
|
|
"likedream-goframe/internal/application/cpdaily/types"
|
|
"likedream-goframe/internal/common/errors"
|
|
"likedream-goframe/internal/utils"
|
|
"slices"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/avast/retry-go/v4"
|
|
"github.com/gogf/gf/v2/container/gvar"
|
|
"github.com/google/uuid"
|
|
"github.com/samber/oops"
|
|
"github.com/tidwall/match"
|
|
"resty.dev/v3"
|
|
)
|
|
|
|
type CpdailyAutoSignTask struct {
|
|
client *resty.Client
|
|
host string
|
|
}
|
|
|
|
var _ CpdailyTask = (*CpdailyAutoSignTask)(nil)
|
|
|
|
func NewAutoSignTask(client *resty.Client, host string) *CpdailyAutoSignTask {
|
|
return &CpdailyAutoSignTask{
|
|
client: client,
|
|
host: host,
|
|
}
|
|
}
|
|
|
|
func (c *CpdailyAutoSignTask) getReqUrl(path ...string) string {
|
|
appendPath := strings.Join(path, "/")
|
|
return fmt.Sprintf("%s/wec-counselor-sign-apps/stu/sign/%s", c.host, appendPath)
|
|
}
|
|
|
|
func (c *CpdailyAutoSignTask) GetRecentTaskTitle(ctx context.Context) []string {
|
|
response, err := c.client.R().
|
|
SetBody(map[string]any{}).
|
|
WithContext(ctx).
|
|
Post(c.getReqUrl("getStuSignInfosInOneDay"))
|
|
|
|
utils.OkOrPanic(err, func(err error) error {
|
|
return oops.
|
|
With("host", c.host).
|
|
In("CpdailyAutoSignTask.GetRecentTaskTitle").
|
|
Wrap(err)
|
|
})
|
|
|
|
responseJSON := utils.ReadGjsonResult(response.Body)
|
|
datas := responseJSON.Get("datas")
|
|
|
|
if !datas.Exists() {
|
|
utils.OkOrPanic(errors.NewBusinessError(500, "今日校园返回空数据"), func(err error) error {
|
|
return oops.
|
|
With("host", c.host).
|
|
In("CpdailyAutoSignTask.GetRecentTaskTitle").
|
|
Wrap(err)
|
|
})
|
|
}
|
|
|
|
titleSet := map[string]bool{}
|
|
|
|
// 处理未签到任务
|
|
unsignedTasks := datas.Get("unSignedTasks").Array()
|
|
for _, task := range unsignedTasks {
|
|
title := task.Get("taskName").String()
|
|
if title != "" {
|
|
titleSet[title] = true
|
|
}
|
|
}
|
|
|
|
// 处理请假任务
|
|
leaveTasks := datas.Get("leaveTasks").Array()
|
|
for _, task := range leaveTasks {
|
|
title := task.Get("taskName").String()
|
|
if title != "" {
|
|
titleSet[title] = true
|
|
}
|
|
}
|
|
|
|
// 处理已签到任务
|
|
signedTasks := datas.Get("signedTasks").Array()
|
|
for _, task := range signedTasks {
|
|
title := task.Get("taskName").String()
|
|
if title != "" {
|
|
titleSet[title] = true
|
|
}
|
|
}
|
|
|
|
// 处理二维码任务
|
|
codeRcvdTasks := datas.Get("codeRcvdTasks").Array()
|
|
for _, task := range codeRcvdTasks {
|
|
title := task.Get("taskName").String()
|
|
if title != "" {
|
|
titleSet[title] = true
|
|
}
|
|
}
|
|
|
|
titles := make([]string, 0, len(titleSet))
|
|
for title := range titleSet {
|
|
titles = append(titles, title)
|
|
}
|
|
if len(titles) == 0 {
|
|
utils.OkOrPanic(errors.NewBusinessError(503, "没有查询到签到任务"), func(err error) error {
|
|
return oops.
|
|
With("host", c.host).
|
|
In("CpdailySignTask.Count").
|
|
Wrap(err)
|
|
})
|
|
}
|
|
return titles
|
|
}
|
|
|
|
func (c *CpdailyAutoSignTask) QueryFormByTitle(ctx context.Context, titleGlob string) map[string]*gvar.Var {
|
|
response, err := c.client.R().
|
|
SetBody(map[string]any{}).
|
|
WithContext(ctx).
|
|
Post(c.getReqUrl("getStuSignInfosInOneDay"))
|
|
|
|
utils.OkOrPanic(err, func(err error) error {
|
|
return oops.With("host", c.host).
|
|
In("CpdailyAutoSignTask.QueryFormByTitle").
|
|
Wrap(err)
|
|
})
|
|
|
|
responseJSON := utils.ReadJson[map[string]*gvar.Var](response.Body)
|
|
datas := responseJSON["datas"].MapStrVar()
|
|
|
|
if len(datas) == 0 {
|
|
utils.OkOrPanic(errors.NewBusinessError(500, "今日校园返回空数据"), func(err error) error {
|
|
return oops.With("host", c.host).
|
|
In("CpdailyAutoSignTask.QueryFormByTitle").
|
|
Wrap(err)
|
|
})
|
|
}
|
|
|
|
findMatchTitle := func(jsonArr []any) map[string]*gvar.Var {
|
|
for _, rawJson := range jsonArr {
|
|
item := gvar.New(rawJson).MapStrVar()
|
|
if len(item) == 0 {
|
|
continue
|
|
}
|
|
taskName, exist := item["taskName"]
|
|
if !exist || taskName.String() == "" {
|
|
continue
|
|
}
|
|
if match.Match(taskName.String(), titleGlob) {
|
|
return item
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
unSignedTasks := datas["unSignedTasks"].Array()
|
|
leaveTasks := datas["leaveTasks"].Array()
|
|
signedTasks := datas["signedTasks"].Array()
|
|
codeRcvdTasks := datas["codeRcvdTasks"].Array()
|
|
|
|
var matchTask map[string]*gvar.Var
|
|
|
|
// 按优先级查找匹配任务:未签到 > 请假 > 二维码 > 已签到
|
|
matchTask = findMatchTitle(unSignedTasks)
|
|
if matchTask == nil {
|
|
matchTask = findMatchTitle(leaveTasks)
|
|
if matchTask == nil {
|
|
matchTask = findMatchTitle(codeRcvdTasks)
|
|
if matchTask == nil {
|
|
matchTask = findMatchTitle(signedTasks)
|
|
if matchTask == nil {
|
|
utils.OkOrPanic(errors.NewBusinessError(503, fmt.Sprintf("任务未找到: %s", titleGlob)), func(err error) error {
|
|
return oops.With("host", c.host).
|
|
In("CpdailyAutoSignTask.QueryFormByTitle").
|
|
Wrap(err)
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
realTitle := matchTask["taskName"].String()
|
|
|
|
detailResponse, err := c.client.R().
|
|
SetBody(map[string]*gvar.Var{
|
|
"taskName": gvar.New(realTitle),
|
|
"signWid": matchTask["signWid"],
|
|
"signInstanceWid": matchTask["signInstanceWid"],
|
|
}).
|
|
WithContext(ctx).
|
|
Post(c.getReqUrl("detailSignInstance"))
|
|
|
|
utils.OkOrPanic(err, func(err error) error {
|
|
return oops.With("host", c.host).
|
|
In("CpdailyAutoSignTask.QueryFormByTitle").
|
|
With("titleGlob", titleGlob).
|
|
Wrap(err)
|
|
})
|
|
|
|
detailResponseJSON := utils.ReadJson[map[string]*gvar.Var](detailResponse.Body)
|
|
formDatas := detailResponseJSON["datas"].MapStrVar()
|
|
|
|
if len(formDatas) == 0 {
|
|
utils.OkOrPanic(errors.NewBusinessError(503, "任务数据为空"), func(err error) error {
|
|
return oops.With("host", c.host).
|
|
In("CpdailyAutoSignTask.QueryFormByTitle").
|
|
With("titleGlob", titleGlob).
|
|
Wrap(err)
|
|
})
|
|
}
|
|
|
|
result := make(map[string]*gvar.Var)
|
|
result["realTitle"] = gvar.New(realTitle)
|
|
result["taskInfo"] = gvar.New(matchTask)
|
|
result["rows"] = gvar.New(formDatas)
|
|
return result
|
|
}
|
|
|
|
func (c *CpdailyAutoSignTask) QueryFormByYearMonth(ctx context.Context, titleGlob string, year, month string) map[string]*gvar.Var {
|
|
if len(month) == 1 {
|
|
month = "0" + month
|
|
}
|
|
|
|
response, err := c.client.R().
|
|
SetBody(map[string]any{
|
|
"statisticYearMonth": fmt.Sprintf("%s-%s", year, month),
|
|
}).
|
|
WithContext(ctx).
|
|
Post(c.getReqUrl("getStuSignInfosByWeekMonth"))
|
|
|
|
utils.OkOrPanic(err, func(err error) error {
|
|
return oops.
|
|
With("host", c.host).
|
|
With("year", year).
|
|
With("month", month).
|
|
In("CpdailyAutoSignTask.QueryFormByYearMonth").
|
|
Wrap(err)
|
|
})
|
|
|
|
responseJSON := utils.ReadJson[map[string]*gvar.Var](response.Body)
|
|
datas := responseJSON["datas"].MapStrVar()
|
|
|
|
if len(datas) == 0 {
|
|
utils.OkOrPanic(errors.NewBusinessError(500, "今日校园返回空数据"), func(err error) error {
|
|
return oops.
|
|
With("host", c.host).
|
|
With("year", year).
|
|
With("month", month).
|
|
In("CpdailyAutoSignTask.QueryFormByYearMonth").
|
|
Wrap(err)
|
|
})
|
|
}
|
|
|
|
findMatchTitle := func(jsonArr []any) map[string]*gvar.Var {
|
|
for _, rawJson := range jsonArr {
|
|
item, ok := rawJson.(map[string]*gvar.Var)
|
|
if !ok {
|
|
continue
|
|
}
|
|
taskName, exist := item["taskName"]
|
|
if !exist || taskName.String() == "" {
|
|
continue
|
|
}
|
|
if match.Match(taskName.String(), titleGlob) {
|
|
return item
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
unSignedTasks := datas["unSignedTasks"].Array()
|
|
leaveTasks := datas["leaveTasks"].Array()
|
|
signedTasks := datas["signedTasks"].Array()
|
|
codeRcvdTasks := datas["codeRcvdTasks"].Array()
|
|
|
|
var matchTask map[string]*gvar.Var
|
|
|
|
// 按优先级查找匹配任务:未签到 > 请假 > 二维码 > 已签到
|
|
matchTask = findMatchTitle(unSignedTasks)
|
|
if matchTask == nil {
|
|
matchTask = findMatchTitle(leaveTasks)
|
|
if matchTask == nil {
|
|
matchTask = findMatchTitle(codeRcvdTasks)
|
|
if matchTask == nil {
|
|
matchTask = findMatchTitle(signedTasks)
|
|
if matchTask == nil {
|
|
utils.OkOrPanic(errors.NewBusinessError(503, fmt.Sprintf("任务未找到: %s", titleGlob)), func(err error) error {
|
|
return oops.
|
|
With("host", c.host).
|
|
With("year", year).
|
|
With("month", month).
|
|
With("titleGlob", titleGlob).
|
|
In("CpdailyAutoSignTask.QueryFormByYearMonth").
|
|
Wrap(err)
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
realTitle := matchTask["taskName"].String()
|
|
|
|
detailResponse, err := c.client.R().
|
|
SetBody(map[string]*gvar.Var{
|
|
"signInstanceWid": matchTask["signInstanceWid"],
|
|
"signWid": matchTask["signWid"],
|
|
"taskName": gvar.New(realTitle),
|
|
}).
|
|
WithContext(ctx).
|
|
Post(c.getReqUrl("detailSignInstance"))
|
|
|
|
utils.OkOrPanic(err, func(err error) error {
|
|
return oops.
|
|
With("host", c.host).
|
|
With("year", year).
|
|
With("month", month).
|
|
With("titleGlob", titleGlob).
|
|
In("CpdailyAutoSignTask.QueryFormByYearMonth").
|
|
Wrap(err)
|
|
})
|
|
|
|
detailResponseJSON := utils.ReadJson[map[string]*gvar.Var](detailResponse.Body)
|
|
formDatas := detailResponseJSON["datas"].MapStrVar()
|
|
|
|
if len(formDatas) == 0 {
|
|
utils.OkOrPanic(errors.NewBusinessError(503, "任务数据为空"), func(err error) error {
|
|
return oops.
|
|
With("host", c.host).
|
|
With("year", year).
|
|
With("month", month).
|
|
With("titleGlob", titleGlob).
|
|
In("CpdailyAutoSignTask.QueryFormByYearMonth").
|
|
Wrap(err)
|
|
})
|
|
}
|
|
|
|
result := make(map[string]*gvar.Var)
|
|
result["rows"] = gvar.New(formDatas)
|
|
result["taskInfo"] = gvar.New(matchTask)
|
|
result["realTitle"] = gvar.New(realTitle)
|
|
return result
|
|
}
|
|
|
|
func (c *CpdailyAutoSignTask) ParseFormJson(ctx context.Context, rawJson map[string]*gvar.Var) []*formtype.CpTaskFormItem {
|
|
rows := rawJson["rows"].MapStrVar()
|
|
|
|
if len(rows) == 0 {
|
|
utils.OkOrPanic(errors.NewBusinessError(503, "任务表单为空"), oops.WithContext(ctx).Wrap)
|
|
}
|
|
|
|
var list []*formtype.CpTaskFormItem
|
|
|
|
// 经纬度
|
|
//dto := &formtype.CpTaskFormItem{
|
|
// Title: "经度",
|
|
// ColName: "lon",
|
|
// Type: formtype.ItemTypeInput,
|
|
// Required: true,
|
|
//}
|
|
//list = append(list, dto)
|
|
//
|
|
//dto = &formtype.CpTaskFormItem{
|
|
// Title: "纬度",
|
|
// ColName: "lat",
|
|
// Type: formtype.ItemTypeInput,
|
|
// Required: true,
|
|
//}
|
|
//list = append(list, dto)
|
|
dto := &formtype.CpTaskFormItem{
|
|
Title: "经纬度",
|
|
ColName: "latAndLon",
|
|
Type: formtype.ItemTypeLatAndLon,
|
|
Required: true,
|
|
Tip: "您可以通过地址搜索签到经纬度,如果觉得不够准确可以自行修改",
|
|
}
|
|
list = append(list, dto)
|
|
|
|
dto = &formtype.CpTaskFormItem{
|
|
Title: "签到具体地址",
|
|
ColName: "address",
|
|
Type: formtype.ItemTypeInput,
|
|
Required: true,
|
|
Tip: "这个就是指签到完毕后查看时最底部那个最详细的地址信息哦",
|
|
}
|
|
list = append(list, dto)
|
|
|
|
if isPhoto := rows["isPhoto"]; isPhoto != nil && isPhoto.Int() == 1 {
|
|
dto = &formtype.CpTaskFormItem{
|
|
Title: "签到照片",
|
|
ColName: "signImg",
|
|
Type: formtype.ItemTypeImage,
|
|
Required: true,
|
|
Tip: "您可以上传多张图片,会顺序轮换更新的哦~",
|
|
}
|
|
list = append(list, dto)
|
|
}
|
|
|
|
// 是否范围外签到
|
|
dto = &formtype.CpTaskFormItem{
|
|
Title: "是否范围外签到",
|
|
ColName: "isMalposition",
|
|
Type: formtype.ItemTypeSingle,
|
|
Required: true,
|
|
Options: []formtype.CpTaskFormItemOption{
|
|
{
|
|
Content: "是",
|
|
ShowLogic: []string{"abnormalReason"},
|
|
IsOtherItems: false,
|
|
},
|
|
{
|
|
Content: "否",
|
|
IsOtherItems: false,
|
|
},
|
|
},
|
|
Tip: "一般在学校就是选否,如果在外实习、请假之类的才选是",
|
|
}
|
|
list = append(list, dto)
|
|
|
|
// 范围外签到原因
|
|
dto = &formtype.CpTaskFormItem{
|
|
Title: "范围外签到原因",
|
|
ColName: "abnormalReason",
|
|
Type: formtype.ItemTypeInput,
|
|
Required: true,
|
|
LogicWid: "abnormalReason",
|
|
}
|
|
list = append(list, dto)
|
|
|
|
current := uint(1)
|
|
// 处理额外字段
|
|
if isNeedExtra := rows["isNeedExtra"]; isNeedExtra != nil && isNeedExtra.Int() == 1 {
|
|
extraField := rows["extraField"].Array()
|
|
for _, field := range extraField {
|
|
fieldObj := gvar.New(field).MapStrVar()
|
|
title := fieldObj["title"].String()
|
|
isRequired := fieldObj["isRequired"].Bool()
|
|
hasOtherItems := fieldObj["hasOtherItems"].Bool()
|
|
|
|
dto = &formtype.CpTaskFormItem{
|
|
Title: title,
|
|
ColName: title,
|
|
Type: formtype.ItemTypeSingle,
|
|
Number: current,
|
|
Required: isRequired,
|
|
IsOther: hasOtherItems,
|
|
}
|
|
current++
|
|
|
|
// 处理选项
|
|
extraFieldItems := fieldObj["extraFieldItems"].Array()
|
|
var options []formtype.CpTaskFormItemOption
|
|
for _, item := range extraFieldItems {
|
|
itemObj := gvar.New(item).MapStrVar()
|
|
option := formtype.CpTaskFormItemOption{
|
|
Content: itemObj["content"].String(),
|
|
IsOtherItems: itemObj["isOtherItems"].Bool(),
|
|
}
|
|
options = append(options, option)
|
|
}
|
|
dto.Options = options
|
|
list = append(list, dto)
|
|
}
|
|
}
|
|
|
|
for key, item := range list {
|
|
list[key].Show = item.LogicWid == ""
|
|
}
|
|
|
|
return list
|
|
}
|
|
|
|
func (c *CpdailyAutoSignTask) FillCustomForm(ctx context.Context, form map[string]*gvar.Var, paramList []*formtype.CpTaskFormItem, deviceId, imgId string) map[string]*gvar.Var {
|
|
var resultForm map[string]*gvar.Var
|
|
|
|
// 填充必要变量
|
|
rows := form["rows"].MapStrVar()
|
|
resultForm = make(map[string]*gvar.Var)
|
|
|
|
// 填充必要变量
|
|
// 获取经纬度、地址
|
|
var lat, lon, address string
|
|
for _, v := range paramList {
|
|
switch v.ColName {
|
|
case "lat":
|
|
lat = v.Content
|
|
case "lon":
|
|
lon = v.Content
|
|
case "address":
|
|
address = v.Content
|
|
case "latAndLon":
|
|
{
|
|
res := strings.Split(v.Content, ",")
|
|
lat, lon = res[1], res[0]
|
|
}
|
|
}
|
|
}
|
|
|
|
resultForm["latitude"] = gvar.New(lat)
|
|
resultForm["longitude"] = gvar.New(lon)
|
|
resultForm["position"] = gvar.New(address)
|
|
resultForm["signVersion"] = gvar.New("1.0.0")
|
|
resultForm["uaIsCpadaily"] = gvar.New(true)
|
|
|
|
// 处理签到照片
|
|
if isPhoto := rows["isPhoto"]; isPhoto != nil && isPhoto.Int() == 1 {
|
|
var targetParam *formtype.CpTaskFormItem
|
|
for _, v := range paramList {
|
|
if v.ColName == "signImg" {
|
|
targetParam = v
|
|
break
|
|
}
|
|
}
|
|
|
|
if targetParam == nil || targetParam.Content == "" {
|
|
utils.OkOrPanic(errors.NewBusinessError(400, "签到需要图片,但是当前图片为空"), oops.WithContext(ctx).Wrap)
|
|
}
|
|
|
|
if imgId == "" {
|
|
utils.OkOrPanic(errors.NewBusinessError(400, "签到照片未上传"), oops.WithContext(ctx).Wrap)
|
|
}
|
|
|
|
imageId, e := uuid.Parse(imgId)
|
|
utils.OkOrPanic(e, oops.WithContext(ctx).Wrap)
|
|
|
|
previewUrl := imageuploader.UploadImageFromStorage(ctx, c.host, imageId, types.TaskTypeSign, c.client)
|
|
|
|
resultForm["signPhotoUrl"] = gvar.New(previewUrl)
|
|
}
|
|
|
|
// 处理验证码
|
|
submitCaptchaResolver := submitcaptcha.NewNormalResolver(c.client, c.host, deviceId, types.TaskTypeSign)
|
|
captchaInfo := submitCaptchaResolver.GetValidationInfo(ctx)
|
|
|
|
if captchaInfo.Validation {
|
|
var ticket string
|
|
|
|
e := retry.Do(func() error {
|
|
return utils.Catch(func() {
|
|
ticket = submitCaptchaResolver.GetCaptchaTicket(ctx, captchaInfo)
|
|
})
|
|
}, retry.MaxDelay(15*time.Second), retry.Attempts(5), retry.Context(ctx))
|
|
if e != nil {
|
|
utils.OkOrPanic(errors.NewBusinessError(503, "提交验证码识别失败").WithInnerError(e), oops.WithContext(ctx).Wrap)
|
|
}
|
|
|
|
resultForm["ticket"] = gvar.New(ticket)
|
|
} else {
|
|
resultForm["ticket"] = gvar.New("")
|
|
}
|
|
|
|
// 处理额外字段
|
|
if isNeedExtra := rows["isNeedExtra"]; isNeedExtra != nil && isNeedExtra.Int() == 1 {
|
|
resultForm["isNeedExtra"] = gvar.New(1)
|
|
|
|
// 收集所有数字
|
|
var numbers []uint
|
|
for _, v := range paramList {
|
|
if v.Number > 0 {
|
|
numbers = append(numbers, v.Number)
|
|
}
|
|
}
|
|
|
|
extraField := rows["extraField"].Array()
|
|
var extraFieldItemValues []map[string]*gvar.Var
|
|
|
|
for i, field := range extraField {
|
|
current := uint(i + 1)
|
|
// 检查数字是否在范围内
|
|
found := slices.Contains(numbers, current)
|
|
if !found {
|
|
utils.OkOrPanic(errors.NewBusinessError(500, "非法的额外信息数据"), oops.WithContext(ctx).Wrap)
|
|
}
|
|
|
|
// 找到对应的参数
|
|
var targetParam *formtype.CpTaskFormItem
|
|
for _, v := range paramList {
|
|
if v.Number == current {
|
|
targetParam = v
|
|
break
|
|
}
|
|
}
|
|
|
|
if targetParam == nil {
|
|
continue
|
|
}
|
|
|
|
fieldObj := gvar.New(field).MapStrVar()
|
|
fieldTitle := fieldObj["title"].String()
|
|
|
|
if targetParam.Title != fieldTitle {
|
|
utils.OkOrPanic(errors.NewBusinessError(500, fmt.Sprintf("自定义表单第[%d]项标题不匹配,请重新自定义表单, 目标标题: [%s], 实际标题: [%s]", i+1, fieldTitle, targetParam.Title)), oops.WithContext(ctx).Wrap)
|
|
}
|
|
|
|
extraFieldItems := fieldObj["extraFieldItems"].Array()
|
|
var extraFieldItemValue map[string]*gvar.Var
|
|
|
|
for _, item := range extraFieldItems {
|
|
itemObj := gvar.New(item).MapStrVar()
|
|
content := itemObj["content"].String()
|
|
|
|
if content == targetParam.Content {
|
|
extraFieldItemValue = make(map[string]*gvar.Var)
|
|
extraFieldItemValue["extraFieldItemValue"] = gvar.New(targetParam.Content)
|
|
extraFieldItemValue["extraFieldItemWid"] = gvar.New(itemObj["wid"].String())
|
|
|
|
if itemObj["isOtherItems"].Bool() {
|
|
if targetParam.OtherValue == "" {
|
|
utils.OkOrPanic(errors.NewBusinessError(500, "暂不支持\"其它\"类型选项,请等待臭若离完善..."), oops.WithContext(ctx).Wrap)
|
|
}
|
|
extraFieldItemValue["extraFieldItemValue"] = gvar.New(targetParam.OtherValue)
|
|
}
|
|
break
|
|
}
|
|
}
|
|
|
|
if extraFieldItemValue != nil {
|
|
extraFieldItemValues = append(extraFieldItemValues, extraFieldItemValue)
|
|
}
|
|
}
|
|
|
|
resultForm["extraFieldItems"] = gvar.New(extraFieldItemValues)
|
|
} else {
|
|
resultForm["isNeedExtra"] = gvar.New(0)
|
|
}
|
|
|
|
// 查找 qrUuid 参数
|
|
var qrUuidParam *formtype.CpTaskFormItem
|
|
for _, v := range paramList {
|
|
if v.ColName == "qrUuid" {
|
|
qrUuidParam = v
|
|
break
|
|
}
|
|
}
|
|
|
|
if qrUuidParam != nil {
|
|
// 如果存在 qrUuid,直接填充
|
|
resultForm["qrUuid"] = gvar.New(qrUuidParam.Content)
|
|
} else {
|
|
// 否则,填充签到其他参数
|
|
if signInstanceWidVar := rows["signInstanceWid"]; signInstanceWidVar != nil {
|
|
resultForm["signInstanceWid"] = gvar.New(signInstanceWidVar.String())
|
|
} else {
|
|
resultForm["signInstanceWid"] = gvar.New("")
|
|
}
|
|
|
|
// 查找 isMalposition 参数
|
|
var isMalpositionParam *formtype.CpTaskFormItem
|
|
for _, v := range paramList {
|
|
if v.ColName == "isMalposition" {
|
|
isMalpositionParam = v
|
|
break
|
|
}
|
|
}
|
|
|
|
if isMalpositionParam != nil && isMalpositionParam.Content == "是" {
|
|
resultForm["isMalposition"] = gvar.New(1)
|
|
// 查找 abnormalReason 参数
|
|
var abnormalReason string
|
|
for _, v := range paramList {
|
|
if v.ColName == "abnormalReason" {
|
|
abnormalReason = v.Content
|
|
break
|
|
}
|
|
}
|
|
resultForm["abnormalReason"] = gvar.New(abnormalReason)
|
|
} else {
|
|
resultForm["isMalposition"] = gvar.New(0)
|
|
resultForm["abnormalReason"] = gvar.New("")
|
|
}
|
|
}
|
|
|
|
return resultForm
|
|
}
|
|
|
|
func (c *CpdailyAutoSignTask) Submit(ctx context.Context, form map[string]*gvar.Var, username, deviceId string) {
|
|
cpdailyInfo := cpdaily.GetInfo(ctx)
|
|
|
|
extensionForm := map[string]*gvar.Var{
|
|
"lon": form["longitude"],
|
|
"lat": form["latitude"],
|
|
"model": gvar.New(uuid.New().String()),
|
|
"appVersion": gvar.New(cpdailyInfo.AppVersion),
|
|
"systemVersion": gvar.New(cpdailyInfo.SystemVersion),
|
|
"userId": gvar.New(username),
|
|
"systemName": gvar.New("android"),
|
|
"deviceId": gvar.New(deviceId),
|
|
"cpdailyVersion": gvar.New(cpdailyInfo.AppVersion),
|
|
}
|
|
|
|
extensionString := taskhelper.GetCpdailyExtension(ctx, extensionForm)
|
|
|
|
bodyString := taskhelper.GetBodyString(ctx, form)
|
|
|
|
// 构造提交数据
|
|
submitData := map[string]*gvar.Var{
|
|
"lon": form["longitude"],
|
|
"version": gvar.New(cryptoutil.EncryptVersion),
|
|
"calVersion": gvar.New(cpdailyInfo.CalVersion),
|
|
"deviceId": extensionForm["deviceId"],
|
|
"userId": gvar.New(username),
|
|
"systemName": gvar.New("android"),
|
|
"bodyString": gvar.New(bodyString),
|
|
"lat": form["latitude"],
|
|
"systemVersion": gvar.New(cpdailyInfo.SystemVersion),
|
|
"appVersion": gvar.New(cpdailyInfo.AppVersion),
|
|
"model": extensionForm["model"],
|
|
}
|
|
|
|
sign := taskhelper.GetSubmitSign(submitData)
|
|
|
|
submitData["sign"] = gvar.New(sign)
|
|
|
|
response, e := c.client.R().
|
|
SetBody(submitData).
|
|
WithContext(ctx).
|
|
SetHeader("Cpdaily-Extension", extensionString).
|
|
Post(c.getReqUrl("submitSign"))
|
|
|
|
utils.OkOrPanic(e, func(err error) error {
|
|
return oops.
|
|
With("host", c.host).
|
|
With("username", username).
|
|
With("deviceId", deviceId).
|
|
In("CpdailyAutoSignTask.Submit").
|
|
Wrap(err)
|
|
})
|
|
|
|
responseJSON := utils.ReadGjsonResult(response.Body)
|
|
|
|
if responseJSON.Get("code").String() != "0" {
|
|
message := responseJSON.Get("message").String()
|
|
if message == "" {
|
|
message = "今日校园返回未知错误"
|
|
}
|
|
utils.OkOrPanic(errors.NewBusinessError(503, message), oops.WithContext(ctx).Wrap)
|
|
}
|
|
}
|