246 lines
7.5 KiB
Go
246 lines
7.5 KiB
Go
package myPlant
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
"gorm.io/gorm"
|
|
"sundynix-micro-go/app/plant/api/internal/svc"
|
|
"sundynix-micro-go/app/plant/api/internal/types"
|
|
plantModel "sundynix-micro-go/app/plant/model"
|
|
)
|
|
|
|
type GetPlantDetailLogic struct {
|
|
logx.Logger
|
|
ctx context.Context
|
|
svcCtx *svc.ServiceContext
|
|
}
|
|
|
|
func NewGetPlantDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPlantDetailLogic {
|
|
return &GetPlantDetailLogic{Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx}
|
|
}
|
|
|
|
// PlantDetailItem 植物详情 DTO
|
|
type PlantDetailItem struct {
|
|
ID string `json:"id"`
|
|
CreatedAt string `json:"createdAt"`
|
|
UpdatedAt string `json:"updatedAt"`
|
|
CreatedAtStr string `json:"createdAtStr"`
|
|
UserID string `json:"userId"`
|
|
Name string `json:"name"`
|
|
PlantTime string `json:"plantTime"`
|
|
Status int `json:"status"`
|
|
Placement string `json:"placement"`
|
|
PotMaterial string `json:"potMaterial"`
|
|
PotSize string `json:"potSize"`
|
|
Sunlight string `json:"sunlight"`
|
|
PlantingMaterial string `json:"plantingMaterial"`
|
|
ImgList []ImageInfo `json:"imgList"`
|
|
CarePlans []CarePlanItem `json:"carePlans"`
|
|
CareTasks interface{} `json:"careTasks"`
|
|
CareRecords []CareRecordItem `json:"careRecords"`
|
|
GrowthRecords []GrowthRecordItem `json:"growthRecords"`
|
|
}
|
|
|
|
type CarePlanItem struct {
|
|
ID string `json:"id"`
|
|
CreatedAt string `json:"createdAt"`
|
|
UpdatedAt string `json:"updatedAt"`
|
|
CreatedAtStr string `json:"createdAtStr"`
|
|
UserID string `json:"userId"`
|
|
PlantID string `json:"plantId"`
|
|
Icon string `json:"icon"`
|
|
Name string `json:"name"`
|
|
Period int `json:"period"`
|
|
TargetAction string `json:"targetAction"`
|
|
}
|
|
|
|
type CareRecordItem struct {
|
|
ID string `json:"id"`
|
|
CreatedAt string `json:"createdAt"`
|
|
UpdatedAt string `json:"updatedAt"`
|
|
CreatedAtStr string `json:"createdAtStr"`
|
|
UserID string `json:"userId"`
|
|
PlantID string `json:"plantId"`
|
|
PlanID string `json:"planId"`
|
|
Name string `json:"name"`
|
|
Remark string `json:"remark"`
|
|
Icon string `json:"icon"`
|
|
}
|
|
|
|
type GrowthRecordItem struct {
|
|
ID string `json:"id"`
|
|
CreatedAt string `json:"createdAt"`
|
|
UpdatedAt string `json:"updatedAt"`
|
|
CreatedAtStr string `json:"createdAtStr"`
|
|
PlantID string `json:"plantId"`
|
|
UserID string `json:"userId"`
|
|
Name string `json:"name"`
|
|
Tag string `json:"tag"`
|
|
Desc string `json:"desc"`
|
|
Content string `json:"content"`
|
|
ImgList []ImageInfo `json:"imgList"`
|
|
}
|
|
|
|
func (l *GetPlantDetailLogic) GetPlantDetail(req *types.IdPathReq) (resp interface{}, err error) {
|
|
var myPlant plantModel.MyPlant
|
|
err = l.svcCtx.DB.
|
|
Preload("CarePlans").
|
|
Preload("CareRecords", func(db *gorm.DB) *gorm.DB {
|
|
return db.Order("created_at desc")
|
|
}).
|
|
Preload("GrowthRecords", func(db *gorm.DB) *gorm.DB {
|
|
return db.Order("created_at desc")
|
|
}).
|
|
Where("id = ?", req.Id).First(&myPlant).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 查图片(本地关联表 + FileRpc)
|
|
imgList := queryPlantImages(l.ctx, l.svcCtx, req.Id)
|
|
|
|
// 成长记录图片
|
|
growthImgMap := resolveGrowthRecordImages(l.ctx, l.svcCtx, myPlant.GrowthRecords)
|
|
|
|
return &PlantDetailItem{
|
|
ID: myPlant.ID,
|
|
CreatedAt: FormatTime(myPlant.CreatedAt),
|
|
UpdatedAt: FormatTime(myPlant.UpdatedAt),
|
|
CreatedAtStr: FormatTimeShort(myPlant.CreatedAt),
|
|
UserID: myPlant.UserID,
|
|
Name: myPlant.Name,
|
|
PlantTime: FormatTime(myPlant.PlantTime),
|
|
Status: myPlant.Status,
|
|
Placement: myPlant.Placement,
|
|
PotMaterial: myPlant.PotMaterial,
|
|
PotSize: myPlant.PotSize,
|
|
Sunlight: myPlant.Sunlight,
|
|
PlantingMaterial: myPlant.PlantingMaterial,
|
|
ImgList: imgList,
|
|
CarePlans: toCarePlanItems(myPlant.CarePlans),
|
|
CareTasks: nil,
|
|
CareRecords: toCareRecordItems(myPlant.CareRecords),
|
|
GrowthRecords: toGrowthRecordItems(myPlant.GrowthRecords, growthImgMap),
|
|
}, nil
|
|
}
|
|
|
|
func queryPlantImages(ctx context.Context, svcCtx *svc.ServiceContext, plantID string) []ImageInfo {
|
|
type rel struct {
|
|
OssID string `gorm:"column:sundynix_oss_id"`
|
|
}
|
|
var rels []rel
|
|
svcCtx.DB.Table("sundynix_plant_my_plant_oss").
|
|
Where("sundynix_my_plant_id = ?", plantID).
|
|
Order("sundynix_oss_id asc").
|
|
Find(&rels)
|
|
|
|
var ids []string
|
|
for _, r := range rels {
|
|
ids = append(ids, r.OssID)
|
|
}
|
|
infos := FetchFilesByIds(ctx, svcCtx, ids)
|
|
var result []ImageInfo
|
|
for _, id := range ids {
|
|
if f, ok := infos[id]; ok {
|
|
result = append(result, f)
|
|
}
|
|
}
|
|
if result == nil {
|
|
result = []ImageInfo{}
|
|
}
|
|
return result
|
|
}
|
|
|
|
func resolveGrowthRecordImages(ctx context.Context, svcCtx *svc.ServiceContext, records []*plantModel.GrowthRecord) map[string][]ImageInfo {
|
|
var ids []string
|
|
for _, gr := range records {
|
|
ids = append(ids, gr.ID)
|
|
}
|
|
if len(ids) == 0 {
|
|
return nil
|
|
}
|
|
|
|
type rel struct {
|
|
GrowthRecordID string `gorm:"column:growth_record_id"`
|
|
OssID string `gorm:"column:oss_id"`
|
|
}
|
|
var rels []rel
|
|
svcCtx.DB.Table("sundynix_plant_growth_record_oss").
|
|
Where("growth_record_id IN ?", ids).
|
|
Find(&rels)
|
|
|
|
var allOssIds []string
|
|
gidMap := make(map[string][]string)
|
|
for _, r := range rels {
|
|
gidMap[r.GrowthRecordID] = append(gidMap[r.GrowthRecordID], r.OssID)
|
|
allOssIds = append(allOssIds, r.OssID)
|
|
}
|
|
|
|
infos := FetchFilesByIds(ctx, svcCtx, allOssIds)
|
|
result := make(map[string][]ImageInfo)
|
|
for gid, ossIds := range gidMap {
|
|
var imgs []ImageInfo
|
|
for _, oid := range ossIds {
|
|
if f, ok := infos[oid]; ok {
|
|
imgs = append(imgs, f)
|
|
}
|
|
}
|
|
result[gid] = imgs
|
|
}
|
|
return result
|
|
}
|
|
|
|
func toCarePlanItems(plans []*plantModel.CarePlan) []CarePlanItem {
|
|
var items []CarePlanItem
|
|
for _, p := range plans {
|
|
items = append(items, CarePlanItem{
|
|
ID: p.ID, CreatedAt: FormatTime(p.CreatedAt),
|
|
UpdatedAt: FormatTime(p.UpdatedAt), CreatedAtStr: FormatTimeShort(p.CreatedAt),
|
|
UserID: p.UserID, PlantID: p.PlantID, Icon: p.Icon, Name: p.Name,
|
|
Period: p.Period, TargetAction: p.TargetAction,
|
|
})
|
|
}
|
|
if items == nil {
|
|
items = []CarePlanItem{}
|
|
}
|
|
return items
|
|
}
|
|
|
|
func toCareRecordItems(records []*plantModel.CareRecord) []CareRecordItem {
|
|
var items []CareRecordItem
|
|
for _, r := range records {
|
|
items = append(items, CareRecordItem{
|
|
ID: r.ID, CreatedAt: FormatTime(r.CreatedAt),
|
|
UpdatedAt: FormatTime(r.UpdatedAt), CreatedAtStr: FormatTimeShort(r.CreatedAt),
|
|
UserID: r.UserID, PlantID: r.PlantID, PlanID: r.PlanID,
|
|
Name: r.Name, Remark: r.Remark, Icon: r.Icon,
|
|
})
|
|
}
|
|
if items == nil {
|
|
items = []CareRecordItem{}
|
|
}
|
|
return items
|
|
}
|
|
|
|
func toGrowthRecordItems(records []*plantModel.GrowthRecord, imgMap map[string][]ImageInfo) []GrowthRecordItem {
|
|
var items []GrowthRecordItem
|
|
for _, gr := range records {
|
|
item := GrowthRecordItem{
|
|
ID: gr.ID, CreatedAt: FormatTime(gr.CreatedAt),
|
|
UpdatedAt: FormatTime(gr.UpdatedAt), CreatedAtStr: FormatTimeShort(gr.CreatedAt),
|
|
PlantID: gr.PlantID, UserID: gr.UserID, Name: gr.Name,
|
|
Tag: gr.Tag, Desc: gr.Desc, Content: gr.Content,
|
|
ImgList: imgMap[gr.ID],
|
|
}
|
|
if item.ImgList == nil {
|
|
item.ImgList = []ImageInfo{}
|
|
}
|
|
items = append(items, item)
|
|
}
|
|
if items == nil {
|
|
items = []GrowthRecordItem{}
|
|
}
|
|
return items
|
|
}
|