|
|
@@ -48,7 +48,7 @@ func NewOpsEventTaskService(ctx context.Context) (svc *OpsEventTaskService, err
|
|
|
|
|
|
// GetList 分页查询任务列表
|
|
|
func (s *OpsEventTaskService) GetList(req *opsdevmodel.OpsEventTaskSearchReq) (total int, list []*opsdevmodel.OpsEventTaskRsp, err error) {
|
|
|
- db := s.TaskDao.FieldsEx(s.TaskDao.Columns.DeletedTime)
|
|
|
+ db := s.TaskDao.FieldsEx(s.TaskDao.Columns.DeletedTime, s.TaskDao.Columns.TaskDesc)
|
|
|
|
|
|
// 项目ID筛选(单选)
|
|
|
if req.ProjectId > 0 {
|
|
|
@@ -60,6 +60,15 @@ func (s *OpsEventTaskService) GetList(req *opsdevmodel.OpsEventTaskSearchReq) (t
|
|
|
db = db.Where(s.TaskDao.Columns.ProjectId+" in (?)", req.ProjectIds)
|
|
|
}
|
|
|
|
|
|
+ // 产品线筛选:仅 projectId=0 且未指定 projectIds 时生效,通过 EXISTS 关联项目表
|
|
|
+ if req.ProductLine != "" && req.ProjectId <= 0 && len(req.ProjectIds) == 0 {
|
|
|
+ db = db.Where(fmt.Sprintf(
|
|
|
+ "EXISTS (SELECT 1 FROM %s p WHERE p.id = %s AND p.product_line = ? AND p.deleted_time IS NULL)",
|
|
|
+ s.ProjectDao.Table,
|
|
|
+ s.TaskDao.Columns.ProjectId,
|
|
|
+ ), req.ProductLine)
|
|
|
+ }
|
|
|
+
|
|
|
// 关联事件ID筛选
|
|
|
if req.EventId > 0 {
|
|
|
db = db.Where(s.TaskDao.Columns.EventId, req.EventId)
|
|
|
@@ -1421,12 +1430,23 @@ func (s *OpsEventTaskService) GetDashboardData(startDate, endDate string) (*opsd
|
|
|
IFNULL(DATE(plan_end_time), '') AS plan_end_time
|
|
|
FROM ops_event_task
|
|
|
WHERE ops_user_id = ?
|
|
|
- AND plan_start_time >= ? AND plan_start_time <= ?
|
|
|
AND deleted_time IS NULL
|
|
|
+ AND (
|
|
|
+ -- 有结束日期的任务:时间区间与查询周有交集
|
|
|
+ (plan_end_time IS NOT NULL AND plan_end_time != ''
|
|
|
+ AND plan_start_time <= ? AND plan_end_time >= ?)
|
|
|
+ OR
|
|
|
+ -- 无结束日期的任务:仅按开始日期筛选(原逻辑)
|
|
|
+ ((plan_end_time IS NULL OR plan_end_time = '')
|
|
|
+ AND plan_start_time >= ? AND plan_start_time <= ?)
|
|
|
+ )
|
|
|
ORDER BY plan_start_time, priority
|
|
|
`
|
|
|
var taskRows []taskRow
|
|
|
- err := db.GetScan(&taskRows, taskSQL, userId, startDate, endDate+" 23:59:59")
|
|
|
+ err := db.GetScan(&taskRows, taskSQL, userId,
|
|
|
+ endDate+" 23:59:59", startDate,
|
|
|
+ startDate, endDate+" 23:59:59",
|
|
|
+ )
|
|
|
if err != nil {
|
|
|
g.Log().Error(err)
|
|
|
return nil, myerrors.DbError("查询任务数据失败")
|
|
|
@@ -1477,8 +1497,7 @@ func (s *OpsEventTaskService) GetDashboardData(startDate, endDate string) (*opsd
|
|
|
taskMap := make(map[string][]*opsdevmodel.DashboardTaskRsp, 7)
|
|
|
for i := range taskRows {
|
|
|
row := &taskRows[i]
|
|
|
- date := row.PlanStartDate
|
|
|
- taskMap[date] = append(taskMap[date], &opsdevmodel.DashboardTaskRsp{
|
|
|
+ taskItem := &opsdevmodel.DashboardTaskRsp{
|
|
|
Id: row.Id,
|
|
|
TaskNo: row.TaskNo,
|
|
|
TaskTitle: row.TaskTitle,
|
|
|
@@ -1489,7 +1508,24 @@ func (s *OpsEventTaskService) GetDashboardData(startDate, endDate string) (*opsd
|
|
|
ActualWorkHour: row.ActualWorkHour,
|
|
|
EstimateWorkHour: row.EstimateWorkHour,
|
|
|
PlanEndTime: row.PlanEndTime,
|
|
|
- })
|
|
|
+ }
|
|
|
+
|
|
|
+ taskEndDate := row.PlanEndTime
|
|
|
+ if taskEndDate == "" {
|
|
|
+ taskMap[row.PlanStartDate] = append(taskMap[row.PlanStartDate], taskItem)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ start := gtime.New(row.PlanStartDate)
|
|
|
+ end := gtime.New(taskEndDate)
|
|
|
+ daysCount := int(end.Sub(start).Hours()/24) + 1
|
|
|
+ for d := 0; d < daysCount; d++ {
|
|
|
+ current := start.AddDate(0, 0, d)
|
|
|
+ dateStr := current.Format("Y-m-d")
|
|
|
+ if dateStr >= startDate && dateStr <= endDate {
|
|
|
+ taskMap[dateStr] = append(taskMap[dateStr], taskItem)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
overdueCount, err := db.GetValue(
|
|
|
@@ -1669,4 +1705,155 @@ func (s *OpsEventTaskService) GetScheduleStats(req *opsdevmodel.OpsEventTaskSche
|
|
|
return &opsdevmodel.OpsEventTaskScheduleStatRsp{List: list}, nil
|
|
|
}
|
|
|
|
|
|
+func (s *OpsEventTaskService) Export(ctx context.Context, req *opsdevmodel.OpsEventTaskExportReq) (content *opsdevmodel.OpsEventTaskExportContent, err error) {
|
|
|
+ db := s.TaskDao.FieldsEx(s.TaskDao.Columns.DeletedTime, s.TaskDao.Columns.TaskDesc)
|
|
|
+
|
|
|
+ if req.ProjectId > 0 {
|
|
|
+ db = db.Where(s.TaskDao.Columns.ProjectId, req.ProjectId)
|
|
|
+ }
|
|
|
+ if len(req.ProjectIds) > 0 {
|
|
|
+ db = db.Where(s.TaskDao.Columns.ProjectId+" in (?)", req.ProjectIds)
|
|
|
+ }
|
|
|
+ if req.ProductLine != "" && req.ProjectId <= 0 && len(req.ProjectIds) == 0 {
|
|
|
+ db = db.Where(fmt.Sprintf(
|
|
|
+ "EXISTS (SELECT 1 FROM %s p WHERE p.id = %s AND p.product_line = ? AND p.deleted_time IS NULL)",
|
|
|
+ s.ProjectDao.Table, s.TaskDao.Columns.ProjectId,
|
|
|
+ ), req.ProductLine)
|
|
|
+ }
|
|
|
+ if req.EventId > 0 {
|
|
|
+ db = db.Where(s.TaskDao.Columns.EventId, req.EventId)
|
|
|
+ }
|
|
|
+ if req.TaskTitle != "" {
|
|
|
+ db = db.Where(s.TaskDao.Columns.TaskTitle+" like ?", "%"+req.TaskTitle+"%")
|
|
|
+ }
|
|
|
+ if len(req.TaskType) > 0 {
|
|
|
+ db = db.Where(s.TaskDao.Columns.TaskType+" in (?)", req.TaskType)
|
|
|
+ }
|
|
|
+ if len(req.TaskStatus) > 0 {
|
|
|
+ db = db.Where(s.TaskDao.Columns.TaskStatus+" in (?)", req.TaskStatus)
|
|
|
+ }
|
|
|
+ if len(req.Priority) > 0 {
|
|
|
+ db = db.Where(s.TaskDao.Columns.Priority+" in (?)", req.Priority)
|
|
|
+ }
|
|
|
+ if len(req.OpsUserName) > 0 {
|
|
|
+ db = db.Where(s.TaskDao.Columns.OpsUserName+" in (?)", req.OpsUserName)
|
|
|
+ }
|
|
|
+ if req.ScheduleStatus == "scheduled" {
|
|
|
+ db = db.Where(s.TaskDao.Columns.PlanStartTime + " is not null").Where(s.TaskDao.Columns.PlanEndTime + " is not null")
|
|
|
+ } else if req.ScheduleStatus == "unscheduled" {
|
|
|
+ db = db.Where(s.TaskDao.Columns.PlanStartTime + " is null or " + s.TaskDao.Columns.PlanEndTime + " is null")
|
|
|
+ }
|
|
|
+ if req.PlanStartDateStart != "" {
|
|
|
+ db = db.Where(s.TaskDao.Columns.PlanStartTime+" >= ?", req.PlanStartDateStart+" 00:00:00")
|
|
|
+ }
|
|
|
+ if req.PlanStartDateEnd != "" {
|
|
|
+ db = db.Where(s.TaskDao.Columns.PlanStartTime+" <= ?", req.PlanStartDateEnd+" 23:59:59")
|
|
|
+ }
|
|
|
+ if req.PlanEndDateStart != "" {
|
|
|
+ db = db.Where(s.TaskDao.Columns.PlanEndTime+" >= ?", req.PlanEndDateStart+" 00:00:00")
|
|
|
+ }
|
|
|
+ if req.PlanEndDateEnd != "" {
|
|
|
+ db = db.Where(s.TaskDao.Columns.PlanEndTime+" <= ?", req.PlanEndDateEnd+" 23:59:59")
|
|
|
+ }
|
|
|
+ if req.CreatedTimeStart != "" {
|
|
|
+ db = db.Where(s.TaskDao.Columns.CreatedTime+" >= ?", req.CreatedTimeStart+" 00:00:00")
|
|
|
+ }
|
|
|
+ if req.CreatedTimeEnd != "" {
|
|
|
+ db = db.Where(s.TaskDao.Columns.CreatedTime+" <= ?", req.CreatedTimeEnd+" 23:59:59")
|
|
|
+ }
|
|
|
+ if req.CompleteTimeStart != "" {
|
|
|
+ db = db.Where(s.TaskDao.Columns.CompleteTime+" >= ?", req.CompleteTimeStart+" 00:00:00")
|
|
|
+ }
|
|
|
+ if req.CompleteTimeEnd != "" {
|
|
|
+ db = db.Where(s.TaskDao.Columns.CompleteTime+" <= ?", req.CompleteTimeEnd+" 23:59:59")
|
|
|
+ }
|
|
|
+
|
|
|
+ var entityList []*opsdevmodel.OpsEventTask
|
|
|
+ err = db.Order(s.TaskDao.Columns.CreatedTime + " desc").Scan(&entityList)
|
|
|
+ if err != nil {
|
|
|
+ g.Log().Error(err)
|
|
|
+ return nil, myerrors.DbError("查询任务列表失败")
|
|
|
+ }
|
|
|
+
|
|
|
+ taskTypeMap := map[string]string{
|
|
|
+ "10": "需求评审",
|
|
|
+ "20": "功能开发",
|
|
|
+ "25": "缺陷修复",
|
|
|
+ "30": "功能测试",
|
|
|
+ "35": "BUG",
|
|
|
+ "38": "系统发版",
|
|
|
+ "40": "系统发版",
|
|
|
+ "41": "硬件安装",
|
|
|
+ "42": "硬件发货",
|
|
|
+ }
|
|
|
+ taskStatusMap := map[string]string{
|
|
|
+ "10": "待处理",
|
|
|
+ "20": "处理中",
|
|
|
+ "25": "暂停",
|
|
|
+ "30": "已完成",
|
|
|
+ "70": "阻塞",
|
|
|
+ "90": "作废",
|
|
|
+ }
|
|
|
+ defectTypeMap := map[string]string{
|
|
|
+ "10": "前端",
|
|
|
+ "20": "后端",
|
|
|
+ }
|
|
|
+
|
|
|
+ exportDataList := make([]map[string]interface{}, 0)
|
|
|
+ for _, task := range entityList {
|
|
|
+ planStartTime := ""
|
|
|
+ if task.PlanStartTime != nil && !task.PlanStartTime.IsZero() {
|
|
|
+ planStartTime = task.PlanStartTime.Format("Y-m-d")
|
|
|
+ }
|
|
|
+ planEndTime := ""
|
|
|
+ if task.PlanEndTime != nil && !task.PlanEndTime.IsZero() {
|
|
|
+ planEndTime = task.PlanEndTime.Format("Y-m-d")
|
|
|
+ }
|
|
|
+ completeTime := ""
|
|
|
+ if task.CompleteTime != nil && !task.CompleteTime.IsZero() {
|
|
|
+ completeTime = task.CompleteTime.Format("Y-m-d")
|
|
|
+ }
|
|
|
+ createdTime := ""
|
|
|
+ if task.CreatedTime != nil && !task.CreatedTime.IsZero() {
|
|
|
+ createdTime = task.CreatedTime.Format("Y-m-d H:i:s")
|
|
|
+ }
|
|
|
+
|
|
|
+ attribute2Label := "-"
|
|
|
+ if task.Attribute2 == "10" {
|
|
|
+ attribute2Label = "是"
|
|
|
+ } else if task.Attribute2 == "20" {
|
|
|
+ attribute2Label = "否"
|
|
|
+ }
|
|
|
+
|
|
|
+ exportData := map[string]interface{}{
|
|
|
+ "taskNo": task.TaskNo,
|
|
|
+ "taskTitle": task.TaskTitle,
|
|
|
+ "taskType": taskTypeMap[task.TaskType],
|
|
|
+ "taskStatus": taskStatusMap[task.TaskStatus],
|
|
|
+ "functionName": task.FunctionName,
|
|
|
+ "opsUserName": task.OpsUserName,
|
|
|
+ "planStartTime": planStartTime,
|
|
|
+ "planEndTime": planEndTime,
|
|
|
+ "completeTime": completeTime,
|
|
|
+ "estimateWorkHour": gconv.String(task.EstimateWorkHour),
|
|
|
+ "actualWorkHour": gconv.String(task.ActualWorkHour),
|
|
|
+ "defectType": defectTypeMap[task.DefectType],
|
|
|
+ "attribute2": attribute2Label,
|
|
|
+ "releaseVersion": task.ReleaseVersion,
|
|
|
+ "projectName": task.ProjectName,
|
|
|
+ "createdName": task.CreatedName,
|
|
|
+ "createdTime": createdTime,
|
|
|
+ }
|
|
|
+ exportDataList = append(exportDataList, exportData)
|
|
|
+ }
|
|
|
+
|
|
|
+ exportContent := new(opsdevmodel.OpsEventTaskExportContent)
|
|
|
+ contentBase64, err := service.CommonExportExcel(ctx, "软件交付任务", opsdevmodel.OpsEventTaskExportData{}, exportDataList)
|
|
|
+ if err != nil {
|
|
|
+ g.Log().Error(err)
|
|
|
+ return nil, myerrors.DbError("导出任务数据失败")
|
|
|
+ }
|
|
|
+ exportContent.Content = contentBase64
|
|
|
+ return exportContent, nil
|
|
|
+}
|
|
|
|