852 lines
24 KiB
Go
852 lines
24 KiB
Go
package test
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"fmt"
|
||
"strconv"
|
||
"testing"
|
||
"time"
|
||
"unsafe"
|
||
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
"github.com/samber/lo"
|
||
"github.com/tiger1103/gfast/v3/api/v1/system"
|
||
"github.com/tiger1103/gfast/v3/internal/app/system/dao"
|
||
"github.com/tiger1103/gfast/v3/internal/app/system/model"
|
||
"github.com/tiger1103/gfast/v3/internal/app/system/model/entity"
|
||
"github.com/tiger1103/gfast/v3/internal/app/system/service"
|
||
|
||
lop "github.com/samber/lo/parallel"
|
||
)
|
||
|
||
func Test_A(t *testing.T) {
|
||
service.WorkSchedule().List(context.Background(), &system.WorkScheduleSearchReq{
|
||
WorkId: "505482040829870446",
|
||
})
|
||
}
|
||
|
||
// 测试计划表进度
|
||
func Test_Progress(t *testing.T) {
|
||
// resp, err := service.WorkStatus().Progress(context.Background(), &system.WorkStatusGetProgressReq{
|
||
// FangzhenId: "2",
|
||
// })
|
||
// if err != nil {
|
||
// t.Fatal(err)
|
||
// }
|
||
|
||
// body, _ := json.Marshal(resp)
|
||
// t.Log(string(body))
|
||
}
|
||
|
||
// 获取指定方针下所有的数据,拼接父级和子集
|
||
func Test_GetAll(t *testing.T) {
|
||
fangzhenID := 2
|
||
parentID := 78
|
||
|
||
detailData := []entity.WorkStatus{}
|
||
// 查询父级下的所有子集的排期
|
||
err := dao.WorkStatus.Ctx(context.Background()).
|
||
Where(dao.WorkStatus.Columns().FangzhenId, fangzhenID).
|
||
Where(dao.WorkStatus.Columns().Parent, parentID).Scan(&detailData)
|
||
if err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
fmt.Println(detailData)
|
||
}
|
||
|
||
// 获取所有数据
|
||
func Test_GetAllData(t *testing.T) {
|
||
fangzhenID := 2
|
||
|
||
workStatusList := []entity.WorkStatus{}
|
||
// 查询父级下的所有子集的排期
|
||
if err := dao.WorkStatus.Ctx(context.Background()).Where(dao.WorkStatus.Columns().FangzhenId, fangzhenID).Scan(&workStatusList); err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
// 父列表
|
||
parentList := []entity.WorkStatus{}
|
||
// 子列表,使用 map 存储,键为父元素的 ID
|
||
childrenMap := make(map[int][]entity.WorkStatus)
|
||
|
||
// 遍历所有数据,将父级和子集分开
|
||
for _, item := range workStatusList {
|
||
if item.Parent == 0 {
|
||
parentList = append(parentList, item)
|
||
} else {
|
||
childrenMap[item.Parent] = append(childrenMap[item.Parent], item)
|
||
}
|
||
}
|
||
|
||
projectList := []*model.WorkStatusProgressRes{}
|
||
|
||
index := 1
|
||
// 遍历父级,将子集添加到父级的字段中
|
||
for _, parent := range parentList {
|
||
projectItem := model.WorkStatusProgressRes{
|
||
ID: index,
|
||
WorkID: parent.WorkId,
|
||
Startat: parent.StartAt.String(),
|
||
Endat: parent.EndAt.String(),
|
||
Name: parent.WorkName,
|
||
Total: parent.Total,
|
||
Finished: parent.Finished,
|
||
Status: parent.Status,
|
||
Children: make([]model.WorkStatusProgressRes, 0, len(workStatusList)),
|
||
}
|
||
index++
|
||
|
||
// 从 map 中获取子元素,将子元素添加到父元素的字段中
|
||
for _, child := range childrenMap[int(parent.Id)] {
|
||
projectItem.Children = append(projectItem.Children, model.WorkStatusProgressRes{
|
||
ID: index,
|
||
WorkID: child.WorkId,
|
||
Startat: child.StartAt.String(),
|
||
Endat: child.EndAt.String(),
|
||
Name: child.WorkName,
|
||
Total: child.Total,
|
||
Finished: child.Finished,
|
||
Status: child.Status,
|
||
})
|
||
index++
|
||
}
|
||
projectList = append(projectList, &projectItem)
|
||
}
|
||
}
|
||
|
||
type Scheduler struct {
|
||
// 总进度
|
||
FinishedPtr int
|
||
// 总量
|
||
Total int
|
||
// 实体
|
||
WorkStatus *entity.WorkSchedule
|
||
}
|
||
|
||
type Schdule map[string]Scheduler
|
||
|
||
// 获取指定 WorkID 的计划和总量
|
||
func (s Schdule) Get(workID string) (int, int) {
|
||
if scheduler, ok := s[workID]; ok {
|
||
return scheduler.FinishedPtr, scheduler.Total
|
||
}
|
||
return 0, 0
|
||
}
|
||
|
||
// 测试构建计划数据
|
||
func Test_Schduler(t *testing.T) {
|
||
ScheduleData := []entity.WorkSchedule{}
|
||
if err := dao.WorkSchedule.Ctx(context.Background()).Scan(&ScheduleData); err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
// 遍历 ScheduleData,将数据按照 WorkID 分组
|
||
scheduleMap := make(Schdule)
|
||
for _, item := range ScheduleData {
|
||
// 预计进度
|
||
planNum := item.PlanNum
|
||
// 实际进度
|
||
// finishedNum := item.FinishedNum
|
||
|
||
// 如果不存在的话,创建一个新的 Scheduler
|
||
if _, ok := scheduleMap[item.WorkId]; !ok {
|
||
scheduleMap[item.WorkId] = Scheduler{
|
||
WorkStatus: &item,
|
||
Total: planNum,
|
||
// FinishedPtr: finishedNum,
|
||
}
|
||
continue
|
||
}
|
||
|
||
// 如果存在的话,将计划进度和实际进度相加
|
||
scheduler := scheduleMap[item.WorkId]
|
||
scheduler.Total += planNum
|
||
// scheduler.FinishedPtr += finishedNum
|
||
}
|
||
}
|
||
|
||
// 指针情况下忽略进度字段
|
||
func Test_ProgressJson(t *testing.T) {
|
||
fangzhenID := 2
|
||
|
||
ScheduleData := []entity.WorkSchedule{}
|
||
if err := dao.WorkSchedule.Ctx(context.Background()).Scan(&ScheduleData); err != nil {
|
||
return
|
||
}
|
||
|
||
// 遍历 ScheduleData,将数据按照 WorkID 分组
|
||
scheduleMap := make(Schdule)
|
||
for _, item := range ScheduleData {
|
||
// 预计进度
|
||
planNum := item.PlanNum
|
||
// 实际进度
|
||
// finishedNum := item.FinishedNum
|
||
|
||
// 如果不存在的话,创建一个新的 Scheduler
|
||
if _, ok := scheduleMap[item.WorkId]; !ok {
|
||
scheduleMap[item.WorkId] = Scheduler{
|
||
WorkStatus: &item,
|
||
Total: planNum,
|
||
// FinishedPtr: finishedNum,
|
||
}
|
||
continue
|
||
}
|
||
|
||
// 如果存在的话,将计划进度和实际进度相加
|
||
scheduler := scheduleMap[item.WorkId]
|
||
scheduler.Total += planNum
|
||
// scheduler.FinishedPtr += finishedNum
|
||
scheduleMap[item.WorkId] = scheduler
|
||
}
|
||
|
||
workStatusList := []entity.WorkStatus{}
|
||
// 查询父级下的所有子集的排期
|
||
if err := dao.WorkStatus.Ctx(context.Background()).Where(dao.WorkStatus.Columns().FangzhenId, fangzhenID).Scan(&workStatusList); err != nil {
|
||
return
|
||
}
|
||
|
||
// 父列表
|
||
parentList := []entity.WorkStatus{}
|
||
// 子列表,使用 map 存储,键为父元素的 ID
|
||
childrenMap := make(map[int][]entity.WorkStatus)
|
||
|
||
// 遍历所有数据,将父级和子集分开
|
||
for _, item := range workStatusList {
|
||
if item.Parent == 0 {
|
||
parentList = append(parentList, item)
|
||
} else {
|
||
childrenMap[item.Parent] = append(childrenMap[item.Parent], item)
|
||
}
|
||
}
|
||
|
||
projectList := []*model.WorkStatusProgressRes{}
|
||
|
||
index := 1
|
||
// 遍历父级,将子集添加到父级的字段中
|
||
for _, parent := range parentList {
|
||
projectItem := model.WorkStatusProgressRes{
|
||
ID: index,
|
||
WorkID: parent.WorkId,
|
||
Startat: parent.StartAt.String(),
|
||
Endat: parent.EndAt.String(),
|
||
Name: parent.WorkName,
|
||
Total: parent.Total,
|
||
Finished: parent.Finished,
|
||
Status: parent.Status,
|
||
Children: make([]model.WorkStatusProgressRes, 0, len(workStatusList)),
|
||
}
|
||
index++
|
||
|
||
// 从 map 中获取子元素,将子元素添加到父元素的字段中
|
||
for _, child := range childrenMap[int(parent.Id)] {
|
||
// 根据 WorkID 获取计划和总量
|
||
finishedPtr, total := scheduleMap.Get(child.WorkId)
|
||
|
||
// 创建计划进度对象
|
||
var planProgress *model.PlanProgress
|
||
// 如果 finishedPtr 和 total 不为 0 ,那么创建计划进度对象
|
||
if finishedPtr != 0 || total != 0 {
|
||
planProgress = &model.PlanProgress{
|
||
Finished: &finishedPtr,
|
||
Total: &total,
|
||
}
|
||
}
|
||
|
||
projectItem.Children = append(projectItem.Children, model.WorkStatusProgressRes{
|
||
ID: index,
|
||
WorkID: child.WorkId,
|
||
Startat: child.StartAt.String(),
|
||
Endat: child.EndAt.String(),
|
||
Name: child.WorkName,
|
||
Total: child.Total,
|
||
Finished: child.Finished,
|
||
Status: child.Status,
|
||
PlanProgress: planProgress,
|
||
})
|
||
index++
|
||
}
|
||
projectList = append(projectList, &projectItem)
|
||
}
|
||
|
||
body, _ := json.Marshal(projectList)
|
||
println(string(body))
|
||
}
|
||
|
||
// 新增
|
||
func Test_Add(t *testing.T) {
|
||
workID := "505482040829935982"
|
||
ID := 14
|
||
SubmitTime := "2024-03-22"
|
||
FinishedNum := 2
|
||
|
||
ctx := context.Background()
|
||
|
||
// 获取指定 WorkID 的计划和总量
|
||
workSchedule := entity.WorkSchedule{}
|
||
if err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, workID).
|
||
Where(dao.WorkSchedule.Columns().Id, ID).Scan(&workSchedule); err != nil {
|
||
return
|
||
}
|
||
|
||
// 反序列化 workSchedule.Detail
|
||
var scheduleDetails []model.WorkScheduleDetail
|
||
if err := json.Unmarshal([]byte(workSchedule.Detail), &scheduleDetails); err != nil {
|
||
return
|
||
}
|
||
|
||
// 遍历 scheduleDetails 匹配 req.submitDate 的时间
|
||
totalFinishedNum := 0
|
||
for i, scheduleDetail := range scheduleDetails {
|
||
if scheduleDetail.Date == SubmitTime {
|
||
// 修改其 FinishedNum
|
||
scheduleDetails[i].FinishedNum = FinishedNum
|
||
}
|
||
totalFinishedNum += scheduleDetails[i].FinishedNum
|
||
}
|
||
|
||
// 序列化 scheduleDetails
|
||
schedulesJSON, _ := json.Marshal(scheduleDetails)
|
||
schedulesJSONStr := *(*string)(unsafe.Pointer(&schedulesJSON))
|
||
|
||
// 修改计划表中的数据
|
||
_, err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, workID).
|
||
Where(dao.WorkSchedule.Columns().Id, ID).
|
||
Data(g.Map{
|
||
dao.WorkSchedule.Columns().FinishedNum: totalFinishedNum,
|
||
dao.WorkSchedule.Columns().Detail: schedulesJSONStr,
|
||
}).
|
||
Update()
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
// 重新统计 work_schduler 的状态后更新 work_status 表
|
||
// 获取指定 WorkID 的计划和总量
|
||
finishedNum, err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, workID).
|
||
Sum(dao.WorkSchedule.Columns().FinishedNum)
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
// 更新 work_status 表
|
||
_, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, workID).
|
||
Data(g.Map{
|
||
dao.WorkStatus.Columns().Finished: int(finishedNum),
|
||
}).Update()
|
||
if err != nil {
|
||
return
|
||
}
|
||
}
|
||
|
||
// 测试更新 workschedule 表
|
||
func Test_Update(t *testing.T) {
|
||
ctx := context.Background()
|
||
workID := "505482040830329198"
|
||
|
||
var finishedNum float64 = 0
|
||
|
||
if _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, workID).
|
||
Data(dao.WorkStatus.Columns().Finished, finishedNum).Update(); err != nil {
|
||
println(err)
|
||
}
|
||
}
|
||
|
||
type scheduler struct {
|
||
// 总进度
|
||
FinishedPtr int
|
||
// 总量
|
||
Total int
|
||
// 实体
|
||
WorkStatus *entity.WorkSchedule
|
||
}
|
||
|
||
// 传入 WorkID 获取计划状态
|
||
func (s Schdule) GetStatus(workID string) (int, bool) {
|
||
if scheduler, ok := s[workID]; ok {
|
||
return scheduler.WorkStatus.Status, true
|
||
}
|
||
return 0, false
|
||
}
|
||
|
||
// 传入方阵ID 构造出 model.ProjectHierarchy 结构
|
||
// func getTree(id string) []model.ProjectHierarchy {
|
||
// ctx := context.Background()
|
||
|
||
// ScheduleData := []entity.WorkSchedule{}
|
||
// if err := dao.WorkSchedule.Ctx(ctx).Scan(&ScheduleData); err != nil {
|
||
// return nil
|
||
// }
|
||
|
||
// // 遍历 ScheduleData,将数据按照 WorkID 分组
|
||
// scheduleMap := make(Schdule)
|
||
// for _, item := range ScheduleData {
|
||
// // 预计进度
|
||
// planNum := item.PlanNum
|
||
// // 实际进度
|
||
// finishedNum := item.FinishedNum
|
||
|
||
// // 如果不存在的话,创建一个新的 Scheduler
|
||
// if _, ok := scheduleMap[item.WorkId]; !ok {
|
||
// scheduleMap[item.WorkId] = Scheduler{
|
||
// WorkStatus: &item,
|
||
// Total: planNum,
|
||
// FinishedPtr: finishedNum,
|
||
// }
|
||
// continue
|
||
// }
|
||
|
||
// // 如果存在的话,则将多个计划数据叠加
|
||
// scheduler := scheduleMap[item.WorkId]
|
||
// scheduler.Total += planNum
|
||
// scheduler.FinishedPtr += finishedNum
|
||
// scheduleMap[item.WorkId] = scheduler
|
||
// }
|
||
|
||
// // 获取指定方阵ID的所有项目
|
||
// workStatusList := []entity.WorkStatus{}
|
||
// if err := dao.WorkStatus.Ctx(context.Background()).Where(dao.WorkStatus.Columns().FangzhenId, id).Scan(&workStatusList); err != nil {
|
||
// return nil
|
||
// }
|
||
|
||
// // 父列表
|
||
// parentList := []entity.WorkStatus{}
|
||
// // 子列表,使用 map 存储,键为父元素的 ID
|
||
// childrenMap := make(map[int][]entity.WorkStatus)
|
||
|
||
// // 遍历所有数据,将父级和子集分开
|
||
// for _, item := range workStatusList {
|
||
// if item.Parent == 0 {
|
||
// parentList = append(parentList, item)
|
||
// } else {
|
||
// childrenMap[item.Parent] = append(childrenMap[item.Parent], item)
|
||
// }
|
||
// }
|
||
|
||
// // 树形结构
|
||
// projectList := []model.ProjectHierarchy{}
|
||
|
||
// for _, parent := range parentList {
|
||
// projectItem := model.ProjectHierarchy{
|
||
// Name: parent.WorkName,
|
||
// SubProjects: make([]model.SubProject, 0, len(workStatusList)),
|
||
// }
|
||
|
||
// temp := []model.SubProject{}
|
||
|
||
// for _, child := range childrenMap[int(parent.Id)] {
|
||
// // 根据 WorkID 获取计划和总量
|
||
// finishedPtr, total := scheduleMap.Get(child.WorkId)
|
||
|
||
// temp = append(temp, model.SubProject{
|
||
// Name: child.WorkName,
|
||
|
||
// })
|
||
// }
|
||
// projectList = append(projectList, projectItem)
|
||
// }
|
||
|
||
// return projectList
|
||
// }
|
||
|
||
// func Test_GetTree(t *testing.T) {
|
||
// // 获取指定方阵ID的所有项目
|
||
// result := getTree("489")
|
||
// body, _ := json.Marshal(result)
|
||
// println(string(body))
|
||
// }
|
||
|
||
// 传入子项目ID 删除及其关联数据
|
||
func Test_Delete(t *testing.T) {
|
||
ctx := context.Background()
|
||
|
||
subProjectName := "多傍屯15MW"
|
||
// subProjectName := "上令中令屯20MW"
|
||
|
||
// 获取子项目的主键ID
|
||
subProject := entity.SubProject{}
|
||
if err := dao.SubProject.Ctx(ctx).Where(dao.SubProject.Columns().ProjectName, subProjectName).Scan(&subProject); err != nil {
|
||
return
|
||
}
|
||
|
||
// 获取子项目下的所有方阵
|
||
fangzhens := []entity.QianqiFangzhen{}
|
||
if err := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, subProject.Id).Scan(&fangzhens); err != nil {
|
||
return
|
||
}
|
||
|
||
// 获取所有方阵的ID
|
||
fangzhenIds := lo.Map[entity.QianqiFangzhen, int](fangzhens, func(x entity.QianqiFangzhen, _ int) int {
|
||
return x.Id
|
||
})
|
||
|
||
// 删除所有方阵
|
||
dao.QianqiFangzhen.Ctx(ctx).WhereIn(dao.QianqiFangzhen.Columns().Id, fangzhenIds).Delete()
|
||
|
||
// 删除在 work_status 表中的数据
|
||
dao.WorkStatus.Ctx(ctx).WhereIn(dao.WorkStatus.Columns().WorkId, fangzhenIds).Delete()
|
||
|
||
// 删除子项目下的 pv
|
||
dao.PvModule.Ctx(ctx).WhereIn(dao.PvModule.Columns().FangzhenId, fangzhenIds).Delete()
|
||
|
||
// 删除箱变
|
||
dao.QianqiXiangbian.Ctx(ctx).WhereIn(dao.QianqiXiangbian.Columns().ProjectId, fangzhenIds).Delete()
|
||
}
|
||
|
||
// 前端 type 键值
|
||
func Test_Type(t *testing.T) {
|
||
ctx := context.Background()
|
||
|
||
fangzhenid := 625
|
||
SubProjectId := 26
|
||
|
||
workStatusList := []entity.WorkStatus{}
|
||
if err := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().FangzhenId, fangzhenid).
|
||
Where(dao.PvModule.Columns().SubProjectid, SubProjectId).
|
||
Fields(dao.PvModule.Columns().Type).Distinct().Scan(&workStatusList); err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
// 当前方阵所导入的 Type 列表
|
||
typeList := lop.Map[entity.WorkStatus](workStatusList, func(item entity.WorkStatus, index int) int {
|
||
return item.Type
|
||
})
|
||
|
||
// 遍历 typeList
|
||
// SELECT work_id,
|
||
// GROUP_CONCAT(name) AS names,
|
||
// GROUP_CONCAT(detail) AS details,
|
||
// type
|
||
// FROM pv_module
|
||
// WHERE fangzhen_id = 625 AND sub_projectid = 26 AND type = 2
|
||
// GROUP BY work_id;
|
||
|
||
for i := 0; i <= len(typeList); i++ {
|
||
a := entity.WorkStatus{}
|
||
if err := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().FangzhenId, fangzhenid).
|
||
Where(dao.PvModule.Columns().SubProjectid, SubProjectId).
|
||
Where(dao.PvModule.Columns().Type, typeList[i]).
|
||
Fields(dao.PvModule.Columns().WorkId, dao.PvModule.Columns().Name, dao.PvModule.Columns().Detail).
|
||
Group(dao.PvModule.Columns().WorkId).
|
||
Scan(&a); err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
fmt.Printf("a: %v\n", a)
|
||
}
|
||
}
|
||
|
||
// 测试泛型分组
|
||
// func Test_Group(t *testing.T) {
|
||
// group := lo.GroupBy[pv]([]int{1, 2, 3, 4, 5, 6, 7, 8}, func(i int) int {
|
||
// return i % 3
|
||
// })
|
||
// fmt.Println(group)
|
||
// }
|
||
|
||
// 根据 WorkID 反向找到其对应的大项目,子项目,方阵
|
||
func Test_GetProject(t *testing.T) {
|
||
// select sp.id as sub_projectid,sp.project_id as projectid,fz.name
|
||
//
|
||
// from work_status as wsa
|
||
// Inner join qianqi_fangzhen as fz on wsa.fangzhen_id = fz.id
|
||
// Inner join sub_project as sp on fz.project_id = sp.id
|
||
// where wsa.work_id = "507070097236492777"
|
||
|
||
// 获取所有的计划
|
||
d := []entity.WorkStatus{}
|
||
if err := dao.WorkSchedule.Ctx(context.Background()).Scan(&d); err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
// 遍历所有的计划
|
||
for i := 0; i < len(d); i++ {
|
||
workschdule := d[i]
|
||
|
||
// 获取该计划对应的大项目,子项目,方阵
|
||
projectID, subProjectID, _, err := getWorkDetail(workschdule.WorkId)
|
||
if err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
// 为其插入对应的大项目,子项目,方阵
|
||
_, err = dao.WorkStatus.Ctx(context.Background()).Where(dao.WorkSchedule.Columns().WorkId, workschdule.WorkId).
|
||
Data(g.Map{
|
||
dao.WorkStatus.Columns().ProjectId: projectID,
|
||
dao.WorkStatus.Columns().SubProjectid: subProjectID,
|
||
// dao.WorkStatus.Columns().FangzhenId: fangzhenid,
|
||
}).Update()
|
||
if err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
}
|
||
|
||
// 507070881722466793
|
||
// a, b, c, err := getWorkDetail("507070881722466793")
|
||
// if err != nil {
|
||
// t.Fatal(err)
|
||
// }
|
||
|
||
// fmt.Printf("a: %v, b: %v, c: %v\n", a, b, c)
|
||
}
|
||
|
||
func getWorkDetail(workID string) (int, int, int, error) {
|
||
// select sp.id as sub_projectid,sp.project_id as projectid,fz.name
|
||
//
|
||
// from work_status as wsa
|
||
// Inner join qianqi_fangzhen as fz on wsa.fangzhen_id = fz.id
|
||
// Inner join sub_project as sp on fz.project_id = sp.id
|
||
// where wsa.work_id = "507070097236492777"
|
||
type WorkDetail struct {
|
||
SubProjectID int `json:"sub_project_id"`
|
||
ProjectID int `json:"project_id"`
|
||
FangzhenID int `json:"id"`
|
||
}
|
||
|
||
workDetail := WorkDetail{}
|
||
|
||
err := dao.WorkStatus.Ctx(context.Background()).As("workStatusAlias").Where("workStatusAlias.work_id", workID).
|
||
InnerJoin("qianqi_fangzhen as fangzhenAlias", "workStatusAlias.fangzhen_id = fangzhenAlias.id").
|
||
InnerJoin("sub_project as subProjectAlias", "fangzhenAlias.project_id = subProjectAlias.id").
|
||
Fields("subProjectAlias.id as sub_project_id", "subProjectAlias.project_id as project_id", "fangzhenAlias.id").Scan(&workDetail)
|
||
|
||
return workDetail.ProjectID, workDetail.SubProjectID, workDetail.FangzhenID, err
|
||
}
|
||
|
||
func getByFangzhenID(fangzhenid string) (int, int, error) {
|
||
type Project struct {
|
||
ProjectID int `json:"project_id" orm:"project_id"`
|
||
SubID int `json:"sub_id" orm:"sub_id"`
|
||
}
|
||
|
||
project := Project{}
|
||
|
||
err := dao.QianqiFangzhen.Ctx(context.Background()).As("fangzhenAlias").Where("fangzhenAlias.id", 1959).
|
||
InnerJoin("sub_project as subProjectAlias", "fangzhenAlias.project_id = subProjectAlias.id").
|
||
InnerJoin("sys_project as projectAlias", "projectAlias.id = subProjectAlias.project_id").
|
||
Fields("projectAlias.id as project_id", "subProjectAlias.id as sub_id").Scan(&project)
|
||
if err != nil {
|
||
return 0, 0, err
|
||
}
|
||
|
||
return project.ProjectID, project.SubID, nil
|
||
}
|
||
|
||
// 根据fangzhen_ID 找到对应的主项目和子项目
|
||
func Test_GetProjectByFangzhenID(t *testing.T) {
|
||
// projectID, subID, err := getByFangzhenID("1959")
|
||
// if err != nil {
|
||
// t.Fatal(err)
|
||
// }
|
||
|
||
// fmt.Printf("projectID: %v, subID: %v\n", projectID, subID)
|
||
|
||
// 获取所有的 work_status
|
||
d := []entity.WorkStatus{}
|
||
if err := dao.WorkStatus.Ctx(context.Background()).Scan(&d); err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
// 遍历所有的 work_status
|
||
for i := 0; i <= len(d); i++ {
|
||
workStatus := d[i]
|
||
|
||
// 获取该 work_status 对应的主项目和子项目
|
||
projectID, subID, err := getByFangzhenID(workStatus.FangzhenId)
|
||
if err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
// 为其插入对应的主项目和子项目
|
||
_, err = dao.WorkStatus.Ctx(context.Background()).Where(dao.WorkStatus.Columns().FangzhenId, workStatus.FangzhenId).
|
||
Data(g.Map{
|
||
dao.WorkStatus.Columns().ProjectId: projectID,
|
||
dao.WorkStatus.Columns().SubProjectid: subID,
|
||
}).Update()
|
||
if err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
}
|
||
}
|
||
|
||
// 获取一个方阵的的所有夫级进度
|
||
func Test_GetParent(t *testing.T) {
|
||
// 根据子项目获取所有的方阵
|
||
subProjectID := 26
|
||
|
||
fangzhenList := []entity.QianqiFangzhen{}
|
||
if err := dao.QianqiFangzhen.Ctx(context.Background()).
|
||
Where(dao.QianqiFangzhen.Columns().ProjectId, subProjectID).Scan(&fangzhenList); err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
cumulativeProjects := []*model.WorkStatusProgressRes{}
|
||
firstTime := true
|
||
|
||
// 遍历项目列表
|
||
for index := 0; index < len(fangzhenList); index++ {
|
||
// 获取当前项目
|
||
project := fangzhenList[index]
|
||
|
||
// 获取当前项目的子项目
|
||
childProjects, err := GetPrarent(strconv.Itoa(project.Id))
|
||
if err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
// 如果是第一次迭代,将子项目列表赋值给累积项目列表
|
||
if firstTime {
|
||
cumulativeProjects = childProjects
|
||
// 更新标志变量,表示已经不是第一次迭代
|
||
firstTime = false
|
||
continue
|
||
}
|
||
|
||
// 遍历子项目列表后叠加到累积项目列表
|
||
for childIndex := 0; childIndex < len(childProjects); childIndex++ {
|
||
// 获取根据索引获取当前的 cumulativeProjects
|
||
singleChild := childProjects[childIndex]
|
||
comulativeChild := cumulativeProjects[childIndex]
|
||
|
||
// 将 singleChild 的 Total 和 Finished 叠加到 comulativeChild
|
||
comulativeChild.Total += singleChild.Total
|
||
comulativeChild.Finished += singleChild.Finished
|
||
}
|
||
}
|
||
|
||
// 序列化 cumulativeProjects
|
||
body, _ := json.Marshal(cumulativeProjects)
|
||
println(string(body))
|
||
}
|
||
|
||
// 获取一个方阵的所有子级进度
|
||
func GetPrarent(fangzhenID string) ([]*model.WorkStatusProgressRes, error) {
|
||
ctx := context.Background()
|
||
|
||
ScheduleData := []entity.WorkSchedule{}
|
||
if err := dao.WorkSchedule.Ctx(ctx).Scan(&ScheduleData); err != nil {
|
||
return nil, nil
|
||
}
|
||
|
||
// 遍历 ScheduleData,将数据按照 WorkID 分组
|
||
scheduleMap := make(Schdule)
|
||
for _, item := range ScheduleData {
|
||
// 预计进度
|
||
planNum := item.PlanNum
|
||
// 实际进度
|
||
finishedNum := item.FinishedNum
|
||
|
||
// 如果不存在的话,创建一个新的 Scheduler
|
||
if _, ok := scheduleMap[item.WorkId]; !ok {
|
||
scheduleMap[item.WorkId] = Scheduler{
|
||
WorkStatus: &item,
|
||
Total: planNum,
|
||
FinishedPtr: finishedNum,
|
||
}
|
||
continue
|
||
}
|
||
|
||
// 如果存在的话,则将多个计划数据叠加
|
||
scheduler := scheduleMap[item.WorkId]
|
||
scheduler.Total += planNum
|
||
scheduler.FinishedPtr += finishedNum
|
||
scheduleMap[item.WorkId] = scheduler
|
||
}
|
||
|
||
// 获取指定方阵ID的所有项目
|
||
workStatusList := []entity.WorkStatus{}
|
||
if err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, fangzhenID).Scan(&workStatusList); err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
// 父列表
|
||
parentList := []entity.WorkStatus{}
|
||
// 子列表,使用 map 存储,键为父元素的 ID
|
||
childrenMap := make(map[int][]entity.WorkStatus)
|
||
|
||
// 遍历所有数据,将父级和子集分开
|
||
for _, item := range workStatusList {
|
||
if item.Parent == 0 {
|
||
parentList = append(parentList, item)
|
||
} else {
|
||
childrenMap[item.Parent] = append(childrenMap[item.Parent], item)
|
||
}
|
||
}
|
||
|
||
index := 1
|
||
|
||
projectList := make([]*model.WorkStatusProgressRes, 0, len(parentList))
|
||
// 遍历父级,将子集添加到父级的字段中
|
||
for _, parent := range parentList {
|
||
projectItem := model.WorkStatusProgressRes{
|
||
ID: index,
|
||
WorkID: parent.WorkId,
|
||
Startat: parent.StartAt.String(),
|
||
Endat: parent.EndAt.String(),
|
||
Name: parent.WorkName,
|
||
Total: parent.Total,
|
||
Finished: parent.Finished,
|
||
Status: parent.Status,
|
||
WorkType: parent.Type,
|
||
Children: make([]model.WorkStatusProgressRes, 0, len(workStatusList)),
|
||
}
|
||
index++
|
||
|
||
// 从 map 中获取子元素,将子元素添加到父元素的字段中
|
||
for _, child := range childrenMap[int(parent.Id)] {
|
||
|
||
projectItem.Total += child.Total
|
||
projectItem.Finished += child.Finished
|
||
}
|
||
|
||
// 如果计划数量等于实际数量,且原状态非3,则更新状态为2
|
||
if projectItem.Total == projectItem.Finished {
|
||
// 并且 total,finished 不为 0
|
||
projectItem.Status = 2
|
||
} else {
|
||
projectItem.Status = 1
|
||
}
|
||
|
||
projectList = append(projectList, &projectItem)
|
||
}
|
||
|
||
return projectList, nil
|
||
}
|
||
|
||
// 测试子项目是否已完成
|
||
func Test_SubProject(t *testing.T) {
|
||
ctx := context.Background()
|
||
|
||
// 获取所有的子项目
|
||
var projectList []entity.SubProject
|
||
if err := dao.SubProject.Ctx(ctx).Scan(&projectList); err != nil {
|
||
return
|
||
}
|
||
|
||
// 遍历每个项目
|
||
for _, project := range projectList {
|
||
result, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().SubProjectid, project.Id).Fields("sum(total) as total ,sum(finished) as finished").All()
|
||
if err != nil {
|
||
continue
|
||
}
|
||
|
||
total := result[0]["total"].Int()
|
||
finished := result[0]["finished"].Int()
|
||
|
||
if total == 0 || finished == 0 {
|
||
continue
|
||
}
|
||
|
||
// 如果总量和完成量相等,则将其子项目添加完成日期
|
||
if total == finished {
|
||
// 更新项目状态
|
||
dao.SubProject.Ctx(ctx).Where(dao.SubProject.Columns().Id, project.Id).
|
||
WhereNull(dao.SubProject.Columns().DoneTime).
|
||
Update(g.Map{
|
||
dao.SubProject.Columns().DoneTime: time.Now().Format("2006-01-02"),
|
||
})
|
||
}
|
||
}
|
||
}
|