Item.go 8.55 KB
package Api

import (
	"encoding/json"
	"github.com/aarongao/tools"
	"github.com/asaskevich/govalidator"
	"github.com/gin-gonic/gin"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"go.mongodb.org/mongo-driver/mongo/options"
	"letu/DB"
	"letu/Lib/Auth"
	"strconv"
	"strings"
	"time"
)

// @Title 查询设备信息
// @Description 设备管理 - 查询设备信息
// @Accept  json
// @Produce  json
// @Param   id     5dfb03070a9ac17ac7a82054    string     true        "设备id"
// @Success 200 {object} tools.ResponseSeccess "Tags所属标签,标签有分类;LimitHeight限高;PlayDuration游玩时长;SceneTime场次时间;Picture照片;Voice音频;AverageConsumption平均消费;Menu菜单, OpenHours开放时间: LocationDescription位置描述; Reminder温馨提示; State运行状态0=正常1=停运;Display是否在前台显示;ReminderInterval排队提醒间隔时间(用逗号分割如60,90,120)"
// @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}"
// @Router /ItemInfo? [get]
func ItemInfo(c *gin.Context) {
	c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin"))
	c.Header("Access-Control-Allow-Credentials", "true")

	if c.Query("id") == "" {
		c.JSON(200, tools.ResponseError{
			1,
			"空",
		})
		return
	}

	var SItem DB.SItem
	objID, _ := primitive.ObjectIDFromHex(c.Query("id"))
	DB.CItem.FindOne(tools.GetContext(), bson.M{"_id": objID}).Decode(&SItem)

	c.JSON(200, tools.ResponseSeccess{
		0,
		SItem,
	})

}

// @Title 查询所有游玩项目
// @Description 设备管理 - 查询所有游玩项目
// @Accept  json
// @Produce  json
// @Param   ScenicId     5dfb03070a9ac17ac7a82054    string     true        "景区id"
// @Success 200 {object} tools.ResponseSeccess "Tags所属标签,标签有分类;LimitHeight限高;PlayDuration游玩时长;SceneTime场次时间;Picture照片;Voice音频;AverageConsumption平均消费;Menu菜单, OpenHours开放时间: LocationDescription位置描述; Reminder温馨提示; State运行状态0=正常1=停运;Display是否在前台显示;ReminderInterval排队提醒间隔时间(用逗号分割如60,90,120)"
// @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}"
// @Router /AllItems? [get]
func AllItems(c *gin.Context) {
	c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin"))
	c.Header("Access-Control-Allow-Credentials", "true")

	_select := bson.M{"ScenicId": c.Query("ScenicId"), "Display": true}
	if c.Query("Display") == "all"{
		_select = bson.M{"ScenicId": c.Query("ScenicId")}
	}

	var aItems = []DB.SItem{}
	cur, err := DB.CItem.Find(tools.GetContext(), _select)
	defer cur.Close(tools.GetContext())
	if err == nil {
		for cur.Next(tools.GetContext()) {
			var e DB.SItem
			cur.Decode(&e)
			aItems = append(aItems, e)
		}
	}

	c.JSON(200, aItems)

}

// @Title 更新设施
// @Description 设备管理 - 更新设施
// @Accept  json
// @Produce  json
// @Param   id     5dfb03070a9ac17ac7a82054    string     true        "设备id"
// @Param   ScenicId     5dfb03070a9ac17ac7a82054    string     true        "景区id"
// @Param   Token     wgergejfwe    string     true        "用户token"
// @Success 200 {object} tools.ResponseSeccess "Tags所属标签,标签有分类;LimitHeight限高;PlayDuration游玩时长;SceneTime场次时间;Picture照片;Voice音频;AverageConsumption平均消费;Menu菜单, OpenHours开放时间: LocationDescription位置描述; Reminder温馨提示; State运行状态0=正常1=停运"
// @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}"
// @Router /UpdateItem? [post]
func UpdateItem(c *gin.Context) {
	c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin"))
	c.Header("Access-Control-Allow-Credentials", "true")

	_user, _ := c.Get("UserInfo")
	user := _user.(*DB.SMember)
	err := Auth.CheckScenicAuth(c.PostForm("ScenicId"), user)
	if err != nil {
		c.JSON(200, tools.ResponseError{
			401,
			"没有权限",
		})
		return
	}

	var Location DB.SLocation
	json.Unmarshal([]byte(c.PostForm("Location")), &Location)

	var Tags []DB.STag
	json.Unmarshal([]byte(c.PostForm("Tags")), &Tags)

	var Picture []string
	json.Unmarshal([]byte(c.PostForm("Picture")), &Picture)

	var CustomAttribute []DB.SCustomAttribute
	json.Unmarshal([]byte(c.PostForm("CustomAttribute")), &CustomAttribute)

	var ReminderInterval = strings.Split(c.PostForm("ReminderInterval"),",")

	var id primitive.ObjectID
	if pid := c.PostForm("id"); pid == "null" {
		id = primitive.NewObjectID()
	} else {
		id, _ = primitive.ObjectIDFromHex(pid)
	}

	poststate, _ := strconv.Atoi(c.PostForm("State"))
	Display, _ := strconv.ParseBool(c.PostForm("Display"))
	WaitingTimeDisplay, _ := strconv.ParseBool(c.PostForm("WaitingTimeDisplay"))


	Item := &DB.SItem{
		Id:                  &id,
		Name:                c.PostForm("Name"),
		SubName:             c.PostForm("SubName"),
		ScenicId:            c.PostForm("ScenicId"),
		Location:            Location,
		Icon:                c.PostForm("Icon"),
		LimitHeight:         c.PostForm("LimitHeight"),
		PlayDuration:        c.PostForm("PlayDuration"),
		SceneTime:           c.PostForm("SceneTime"),
		Picture:             Picture,
		Voice:               c.PostForm("Voice"),
		Tel:                 c.PostForm("Tel"),
		AverageConsumption:  c.PostForm("AverageConsumption"),
		Menu:                c.PostForm("Menu"),
		Tags:                Tags,
		OpenHours:           c.PostForm("OpenHours"),
		LocationDescription: c.PostForm("LocationDescription"),
		Reminder:            c.PostForm("Reminder"),
		State:               poststate,
		CustomAttribute:     CustomAttribute,
		Display:             Display,
		WaitingTimeDisplay:  WaitingTimeDisplay,
		ReminderInterval:    ReminderInterval,
	}

	_, err = govalidator.ValidateStruct(Item);
	if err != nil {
		c.JSON(200, tools.ResponseError{
			1,
			err.Error(),
		})
		return
	}

	upsert := true
	DB.CItem.FindOneAndUpdate(tools.GetContext(),
		bson.M{"_id": id},
		bson.M{"$set": Item}, &options.FindOneAndUpdateOptions{
			Upsert: &upsert,
		},
	)

	// 更新等待时间
	allteim := DB.Redis.Get("AllItemTime_" + c.PostForm("ScenicId"))
	jsond, _ := json.Marshal(allteim)

	var ItemTime map[string]string
	json.Unmarshal([]byte(jsond), &ItemTime)

	if poststate == 1 {
		ItemTime[c.PostForm("id")] = "--"
	}
	//if poststate == 0 {
	//	ItemTime[c.PostForm("id")] = "0"
	//}

	DB.Redis.Set("AllItemTime_"+c.PostForm("ScenicId"), ItemTime, time.Second*60*60*24*30)

	c.JSON(200, tools.ResponseSeccess{
		0,
		"ok",
	})

}

type ItemTime struct {
	Id   string `json:"id"`
	Time string `json:"time"`
}

// @Title 更新等待时间
// @Description 设备管理 - 更新等待时间
// @Accept  json
// @Produce  json
// @Param   ScenicId     5dfb03070a9ac17ac7a82054    string     true        "景区id"
// @Param   Token     wgergejfwe    string     true        "用户token"
// @Param   item     [{"id":"5df864740a9ac17ac7a7feb8","time":"20"},{"id":"5df8660924e03417008b4567","time":"33"}]    string     true        "设备列表"
// @Success 200 {object} tools.ResponseSeccess "{errcode: 0, result: "ok"}"
// @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}"
// @Router /UpdateItemTime? [post]
func UpdateItemTime(c *gin.Context) {
	c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin"))
	c.Header("Access-Control-Allow-Credentials", "true")

	_user, _ := c.Get("UserInfo")
	user := _user.(*DB.SMember)
	err := Auth.CheckScenicAuth(c.PostForm("ScenicId"), user)
	if err != nil {
		c.JSON(200, tools.ResponseError{
			401,
			"没有权限",
		})
		return
	}

	var ItemTime []ItemTime
	json.Unmarshal([]byte(c.PostForm("items")), &ItemTime)

	var RedisData = make(map[string]string)
	for _, v := range ItemTime {
		RedisData[v.Id] = v.Time
	}

	DB.Redis.Set("AllItemTime_"+c.PostForm("ScenicId"), RedisData, time.Second*60*60*24*30)
	c.JSON(200, tools.ResponseSeccess{
		0,
		"ok",
	})
}

// @Title 获得所有设备的等待时间
// @Description 设备管理 - 获得所有设备的等待时间
// @Accept  json
// @Produce  json
// @Param   ScenicId     5dfb03070a9ac17ac7a82054    string     true        "景区id"
// @Success 200 {object} tools.ResponseSeccess "{5df864740a9ac17ac7a7feb8: '20',.....}"
// @Failure 500 {object} tools.ResponseError "{}"
// @Router /AllItemTime? [get]
func AllItemTime(c *gin.Context) {
	c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin"))
	c.Header("Access-Control-Allow-Credentials", "true")

	allteim := DB.Redis.Get("AllItemTime_" + c.Query("ScenicId"))
	if allteim != nil {
		c.JSON(200, allteim)
	} else {
		c.String(200, "{}")
	}

}