163 lines
4.9 KiB
Go
163 lines
4.9 KiB
Go
package project
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
"github.com/gogf/gf/v2/os/glog"
|
||
)
|
||
|
||
// PvModuleStatsReq 用于查询统计信息的请求结构体
|
||
type PvModuleStatsReq struct {
|
||
g.Meta `path:"moduleStats" method:"get" tags:"项目首页相关" summary:"获取模块的统计信息"`
|
||
SubProjectId string `json:"subProjectId"`
|
||
FangzhenId string `json:"fangzhenId"`
|
||
}
|
||
|
||
// PvModuleStatsRes 用于封装统计结果的响应结构体,调整为使用字符串描述类型
|
||
type PvModuleStatsRes struct {
|
||
Data []struct {
|
||
TypeDesc string `json:"typeDesc"`
|
||
Total int `json:"total"`
|
||
Complete int `json:"complete"`
|
||
} `json:"data"`
|
||
}
|
||
|
||
func (p Project) QueryPvModuleStats(ctx context.Context, req *PvModuleStatsReq) (res *PvModuleStatsRes, err error) {
|
||
model := g.Model("pv_module").Fields("type, COUNT(*) as total, SUM(CASE WHEN status='2' THEN 1 ELSE 0 END) as complete").Group("type")
|
||
if req.SubProjectId != "" {
|
||
model = model.Where("sub_projectid", req.SubProjectId)
|
||
}
|
||
if req.FangzhenId != "" {
|
||
model = model.Where("fangzhen_id", req.FangzhenId)
|
||
}
|
||
|
||
var stats []struct {
|
||
Type int `json:"type"`
|
||
Total int `json:"total"`
|
||
Complete int `json:"complete"`
|
||
}
|
||
|
||
err = model.Scan(&stats)
|
||
if err != nil {
|
||
glog.Error(ctx, "查询 pv_module 统计信息失败:", err)
|
||
return nil, err
|
||
}
|
||
|
||
var resultStats []struct {
|
||
TypeDesc string `json:"typeDesc"`
|
||
Total int `json:"total"`
|
||
Complete int `json:"complete"`
|
||
}
|
||
|
||
for _, stat := range stats {
|
||
typeDesc, exists := ConstMap[stat.Type]
|
||
if !exists {
|
||
glog.Error(ctx, "未知的 type:", stat.Type)
|
||
continue // 或者处理未知类型
|
||
}
|
||
resultStats = append(resultStats, struct {
|
||
TypeDesc string `json:"typeDesc"`
|
||
Total int `json:"total"`
|
||
Complete int `json:"complete"`
|
||
}{TypeDesc: typeDesc, Total: stat.Total, Complete: stat.Complete})
|
||
}
|
||
|
||
return &PvModuleStatsRes{Data: resultStats}, nil
|
||
}
|
||
|
||
// 修改请求结构体以接收类型切片
|
||
type PvModuleQueryReq struct {
|
||
g.Meta `path:"indexCount" method:"get" tags:"项目首页相关" summary:"根据子项目ID、方针ID和类型来获取数据"`
|
||
SubProjectId string `json:"subProjectId"`
|
||
FangzhenId string `json:"fangzhenId"`
|
||
Types []int `json:"types"` // 新增字段,用于指定需要查询的类型
|
||
}
|
||
|
||
// 修改返回结果结构体,去除 total 和 complete
|
||
type PvModuleQueryRes struct {
|
||
Data map[int][]PVModule `json:"data"`
|
||
View string `json:"view" orm:"view"`
|
||
}
|
||
|
||
func (p Project) QueryPVModule(ctx context.Context, req *PvModuleQueryReq) (res *PvModuleQueryRes, err error) {
|
||
res = new(PvModuleQueryRes)
|
||
// 查询对应方针的 View 值
|
||
g.Model("qianqi_fangzhen").Where("id", req.FangzhenId).Scan(&res)
|
||
// 准备存储每种 type 对应的数据
|
||
data := make(map[int][]PVModule)
|
||
|
||
// 仅针对请求中指定的 type 进行查询
|
||
for _, t := range req.Types {
|
||
var modules []PVModule
|
||
queryModel := g.Model("pv_module").Where("type", t)
|
||
if req.SubProjectId != "" {
|
||
queryModel = queryModel.Where("sub_projectid", req.SubProjectId)
|
||
}
|
||
if req.FangzhenId != "" {
|
||
queryModel = queryModel.Where("fangzhen_id", req.FangzhenId)
|
||
}
|
||
|
||
err = queryModel.Scan(&modules)
|
||
if err != nil {
|
||
continue // 或处理错误
|
||
}
|
||
|
||
// 对 modules 进行处理,比如反序列化 Detail 字段、添加倾角和方位角等
|
||
var processedModules []PVModule
|
||
for _, m := range modules {
|
||
// 反序列化 Detail 字段
|
||
var detailMap map[string]interface{}
|
||
err = json.Unmarshal([]byte(m.Detail), &detailMap)
|
||
if err != nil {
|
||
continue
|
||
}
|
||
|
||
// 为其添加倾角和方位角
|
||
//detailMap["roll"] = m.Tilt
|
||
//detailMap["heading"] = m.Azimuth
|
||
// 重新序列化
|
||
serializedDetail, _ := json.Marshal(detailMap)
|
||
|
||
processedModules = append(processedModules, PVModule{
|
||
ID: m.ID,
|
||
FangzhenID: m.FangzhenID,
|
||
SubProjectID: m.SubProjectID,
|
||
WorkID: m.WorkID,
|
||
Name: m.Name,
|
||
Status: m.Status,
|
||
DoneTime: m.DoneTime,
|
||
Detail: string(serializedDetail),
|
||
Type: t,
|
||
DeviceID: m.DeviceID,
|
||
EquipmentSn: "",
|
||
})
|
||
}
|
||
|
||
// 遍历processedModules中那些DeviceID不为空的值,取出数据,然后查询equipment表,根据设备id查询equipment表,得到设备sn,赋值给EquipmentSn
|
||
for i, mod := range processedModules {
|
||
if mod.DeviceID != "" {
|
||
var equipment struct {
|
||
EquipmentSn string
|
||
}
|
||
// 使用g.DB模型查询equipment表中的SN字段,假定设备的序列号字段为SN
|
||
err := g.Model("equipment").Fields("equipmentSn").Where("id", mod.DeviceID).Scan(&equipment)
|
||
if err != nil {
|
||
// 处理查询错误,例如记录日志或跳过
|
||
continue
|
||
}
|
||
// 更新模块的EquipmentSn字段
|
||
processedModules[i].EquipmentSn = equipment.EquipmentSn
|
||
}
|
||
}
|
||
|
||
// 更新数据存储结构
|
||
data[t] = processedModules
|
||
}
|
||
|
||
res.Data = data
|
||
|
||
return res, nil
|
||
}
|