@@ -1367,9 +1367,101 @@ func ReExecuteTaskOnWorkflowV1(c echo.Context) error {
13671367 if err := controller .BindAndValidateReq (c , req ); err != nil {
13681368 return controller .JSONBaseErrorReq (c , err )
13691369 }
1370+ projectUid , err := dms .GetProjectUIDByName (context .TODO (), c .Param ("project_name" ), true )
1371+ if err != nil {
1372+ return controller .JSONBaseErrorReq (c , err )
1373+ }
1374+ workflowId := c .Param ("workflow_id" )
1375+ taskId := c .Param ("task_id" )
1376+ reExecSqlIds := req .ExecSqlIds
1377+
1378+ s := model .GetStorage ()
1379+ workflow , err := dms .GetWorkflowDetailByWorkflowId (projectUid , workflowId , s .GetWorkflowDetailWithoutInstancesByWorkflowID )
1380+ if err != nil {
1381+ return controller .JSONBaseErrorReq (c , err )
1382+ }
1383+
1384+ task , exist , err := s .GetTaskDetailById (taskId )
1385+ if err != nil {
1386+ return controller .JSONBaseErrorReq (c , err )
1387+ }
1388+ if ! exist {
1389+ return controller .JSONBaseErrorReq (c , fmt .Errorf ("task is not exist" ))
1390+ }
1391+
1392+ user , err := controller .GetCurrentUser (c , dms .GetUser )
1393+ if err != nil {
1394+ return controller .JSONBaseErrorReq (c , err )
1395+ }
1396+
1397+ if err := PrepareForTaskReExecution (c , projectUid , workflow , user , task , reExecSqlIds ); err != nil {
1398+ return controller .JSONBaseErrorReq (c , err )
1399+ }
1400+
1401+ err = server .ReExecuteTaskSQLs (workflow , task , reExecSqlIds , user )
1402+ if err != nil {
1403+ return controller .JSONBaseErrorReq (c , err )
1404+ }
1405+
13701406 return c .JSON (http .StatusOK , controller .NewBaseReq (nil ))
13711407}
13721408
1409+ func PrepareForTaskReExecution (c echo.Context , projectID string , workflow * model.Workflow , user * model.User , task * model.Task , reExecSqlIds []uint ) error {
1410+ // 只有上线失败的工单可以重新上线sql
1411+ if workflow .Record .Status != model .WorkflowStatusExecFailed {
1412+ return errors .New (errors .DataInvalid , e .New ("workflow status is not exec failed" ))
1413+ }
1414+
1415+ if task .Status != model .TaskStatusExecuteFailed {
1416+ return errors .New (errors .DataInvalid , e .New ("task status is not execute failed" ))
1417+ }
1418+
1419+ err := CheckCurrentUserCanOperateTasks (c , projectID , workflow , []dmsV1.OpPermissionType {dmsV1 .OpPermissionTypeExecuteWorkflow }, []uint {task .ID })
1420+ if err != nil {
1421+ return err
1422+ }
1423+
1424+ for _ , record := range workflow .Record .InstanceRecords {
1425+ if record .TaskId != task .ID {
1426+ continue
1427+ }
1428+
1429+ for _ , u := range strings .Split (record .ExecutionAssignees , "," ) {
1430+ if u == user .GetIDStr () {
1431+ goto CheckReExecSqlIds
1432+ }
1433+ }
1434+ }
1435+
1436+ return e .New ("you are not allow to execute the task" )
1437+
1438+ CheckReExecSqlIds:
1439+ // 校验reExecSqlIds对应的SQL状态是否都为SQLExecuteStatusFailed
1440+ if len (reExecSqlIds ) == 0 {
1441+ return errors .New (errors .DataInvalid , e .New ("re-execute sql ids cannot be empty" ))
1442+ }
1443+
1444+ // 创建一个map用于快速查找ExecuteSQLs中的SQL
1445+ execSqlMap := make (map [uint ]* model.ExecuteSQL )
1446+ for _ , execSql := range task .ExecuteSQLs {
1447+ execSqlMap [execSql .ID ] = execSql
1448+ }
1449+
1450+ // 检查每个reExecSqlId
1451+ for _ , sqlId := range reExecSqlIds {
1452+ execSql , exists := execSqlMap [sqlId ]
1453+ if ! exists {
1454+ return errors .New (errors .DataInvalid , fmt .Errorf ("execute sql id %d not found in task" , sqlId ))
1455+ }
1456+
1457+ if execSql .ExecStatus != model .SQLExecuteStatusFailed && execSql .ExecStatus != model .SQLExecuteStatusInitialized {
1458+ return errors .New (errors .DataInvalid , fmt .Errorf ("execute sql id %d status is %s, only failed or initialized sql can be re-executed" , sqlId , execSql .ExecStatus ))
1459+ }
1460+ }
1461+
1462+ return nil
1463+ }
1464+
13731465type GetWorkflowResV1 struct {
13741466 controller.BaseRes
13751467 Data * WorkflowResV1 `json:"data"`
0 commit comments