소스 검색

完善任务管理。

tom 5 달 전
부모
커밋
e44b1cfaf3

+ 23 - 10
ruoyi-sim/src/main/java/com/ruoyi/sim/controller/TaskController.java

@@ -2,8 +2,9 @@ package com.ruoyi.sim.controller;
 
 
 import java.util.List;
 import java.util.List;
 
 
+import com.ruoyi.sim.domain.Task;
+import com.ruoyi.sim.domain.vo.TaskCUVo;
 import com.ruoyi.sim.domain.vo.TaskVo;
 import com.ruoyi.sim.domain.vo.TaskVo;
-import com.ruoyi.sim.service.impl.SimService;
 import com.ruoyi.sim.service.impl.TaskService;
 import com.ruoyi.sim.service.impl.TaskService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
@@ -40,7 +41,7 @@ public class TaskController extends BaseController {
 
 
     @GetMapping("/list")
     @GetMapping("/list")
     @ApiOperation("查询任务列表")
     @ApiOperation("查询任务列表")
-    public TableDataInfo list(TaskVo q) {
+    public TableDataInfo list(Task q) {
         startPage();
         startPage();
         List<TaskVo> list = taskService.list(q);
         List<TaskVo> list = taskService.list(q);
         return getDataTable(list);
         return getDataTable(list);
@@ -52,21 +53,33 @@ public class TaskController extends BaseController {
         return taskService.selectTaskByTaskId(taskId);
         return taskService.selectTaskByTaskId(taskId);
     }
     }
 
 
-    @Autowired
-    private SimService simService;
+    @PostMapping(path = "/obj")
+    @ApiOperation("新增任务Obj")
+    public AjaxResult addObj(@RequestBody TaskVo tv) {
+        return taskService.insertTaskByTeacher(tv);
+    }
 
 
-    @PostMapping
+    @PostMapping(path = "/")
     @ApiOperation("新增任务")
     @ApiOperation("新增任务")
-    public AjaxResult add(@RequestBody TaskVo tv) {
-        return taskService.insertTaskByTeacher(tv);
+    public AjaxResult add(@RequestBody TaskCUVo vo) {
+        if (vo != null) {
+            vo.setTaskId(null);
+        }
+        return taskService.insertOrUpdateTaskByTeacher(vo);
     }
     }
 
 
-    @PutMapping
-    @ApiOperation("修改任务")
-    public AjaxResult edit(@RequestBody TaskVo tv) {
+    @PutMapping(path = "/obj")
+    @ApiOperation("修改任务Obj")
+    public AjaxResult editObj(@RequestBody TaskVo tv) {
         return taskService.updateTaskByTeacher(tv);
         return taskService.updateTaskByTeacher(tv);
     }
     }
 
 
+    @PutMapping(path = "/")
+    @ApiOperation("修改任务")
+    public AjaxResult edit(@RequestBody TaskCUVo vo) {
+        return taskService.insertOrUpdateTaskByTeacher(vo);
+    }
+
     @DeleteMapping("/{taskIds}")
     @DeleteMapping("/{taskIds}")
     @ApiOperation("批量删除任务")
     @ApiOperation("批量删除任务")
     public AjaxResult remove(@PathVariable Long[] taskIds) {
     public AjaxResult remove(@PathVariable Long[] taskIds) {

+ 2 - 2
ruoyi-sim/src/main/java/com/ruoyi/sim/domain/TaskFault.java

@@ -22,13 +22,13 @@ public class TaskFault extends BaseEntity {
     /**
     /**
      * $column.columnComment
      * $column.columnComment
      */
      */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    @Excel(name = "", readConverterExp = "")
     private Long taskId;
     private Long taskId;
 
 
     /**
     /**
      * $column.columnComment
      * $column.columnComment
      */
      */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    @Excel(name = "", readConverterExp = "")
     private String faultId;
     private String faultId;
 
 
     /**
     /**

+ 53 - 0
ruoyi-sim/src/main/java/com/ruoyi/sim/domain/vo/TaskCUVo.java

@@ -0,0 +1,53 @@
+package com.ruoyi.sim.domain.vo;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+public class TaskCUVo {
+
+    private Long taskId;
+    private String simType;
+    private String name;
+    private String[] faultIds;
+
+    public Long getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
+    }
+
+    public String getSimType() {
+        return simType;
+    }
+
+    public void setSimType(String simType) {
+        this.simType = simType;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String[] getFaultIds() {
+        return faultIds;
+    }
+
+    public void setFaultIds(String[] faultIds) {
+        this.faultIds = faultIds;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this)
+                .append("taskId", taskId)
+                .append("simType", simType)
+                .append("name", name)
+                .append("faultIds", faultIds)
+                .toString();
+    }
+}

+ 1 - 1
ruoyi-sim/src/main/java/com/ruoyi/sim/mapper/TaskMapper.java

@@ -33,7 +33,7 @@ public interface TaskMapper {
      * @param task 任务
      * @param task 任务
      * @return 结果
      * @return 结果
      */
      */
-    public int insertTask(Task task);
+    public long insertTask(Task task);
 
 
     /**
     /**
      * 修改任务
      * 修改任务

+ 56 - 4
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/FaultService.java

@@ -108,6 +108,26 @@ public class FaultService {
         return !isEnable(faultId);
         return !isEnable(faultId);
     }
     }
 
 
+    public boolean isExist(final String simType, final String faultId) {
+        Fault f = selectFaultByFaultId(faultId);
+        if (f == null) {
+            return false;
+        }
+        return f.getSimType().equals(simType);
+    }
+
+    public boolean isExist(final String simType, final String[] faultIds) {
+        if (faultIds == null || faultIds.length == 0) {
+            return false;
+        }
+        for (String faultId : faultIds) {
+            if (!isExist(simType, faultId)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     public List<Fault> listAllEnable(final String simType) {
     public List<Fault> listAllEnable(final String simType) {
         Fault q = new Fault();
         Fault q = new Fault();
         q.setSimType(simType);
         q.setSimType(simType);
@@ -151,6 +171,7 @@ public class FaultService {
         if (!simService.checkSimTypeOk(simType)) {
         if (!simService.checkSimTypeOk(simType)) {
             return AjaxResult.error("simType value error!");
             return AjaxResult.error("simType value error!");
         }
         }
+        // do.
         return AjaxResult.success(listAllListTreeStyleBySimType(simType));
         return AjaxResult.success(listAllListTreeStyleBySimType(simType));
     }
     }
 
 
@@ -169,15 +190,42 @@ public class FaultService {
             BeanUtils.copyProperties(s, t);
             BeanUtils.copyProperties(s, t);
             tempListNode.add(t);
             tempListNode.add(t);
         }
         }
-        l.info(Objects.requireNonNull(tempListNode).toString());
+        // l.info(Objects.requireNonNull(tempListNode).toString());
         List<FaultTreeVo> tree = toTree(tempListNode, Fault.ROOT_FAULT_ID);
         List<FaultTreeVo> tree = toTree(tempListNode, Fault.ROOT_FAULT_ID);
-        l.info(Objects.requireNonNull(tree).toString());
+        // l.info(Objects.requireNonNull(tree).toString());
         return tree;
         return tree;
     }
     }
 
 
-    public Set<Fault> listType1ByType3(final String[] faultType3Ids) {
+    /**
+     * 通过Type3 List 获取到不重复的Type1 List。·
+     *
+     * @param list
+     * @return
+     */
+    public List<Fault> listType1ByType3(List<Fault> list) {
+        if (list == null || list.isEmpty()) {
+            return Collections.emptyList();
+        }
+        String[] faultIds = new String[list.size()];
+        for (int i = 0; i < list.size(); i++) {
+            faultIds[i] = list.get(i).getFaultId();
+        }
+        return setType1ByType3(faultIds).stream().toList();
+    }
+
+    public int countType1ByType3(List<Fault> list) {
+        if (list == null || list.isEmpty()) {
+            return 0;
+        }
+        return listType1ByType3(list).size();
+    }
+
+    public Set<Fault> setType1ByType3(String[] faultIdsType3) {
+        if (faultIdsType3 == null || faultIdsType3.length == 0) {
+            return Collections.emptySet();
+        }
         Set<Fault> set = new HashSet<>();
         Set<Fault> set = new HashSet<>();
-        for (String id : faultType3Ids) {
+        for (String id : faultIdsType3) {
             Fault t3 = selectFaultByFaultId(id);
             Fault t3 = selectFaultByFaultId(id);
             Fault t1 = selectFaultByFaultId(t3.getParentFaultId());
             Fault t1 = selectFaultByFaultId(t3.getParentFaultId());
             set.add(t1);
             set.add(t1);
@@ -196,6 +244,10 @@ public class FaultService {
         return type.equals(f.getFaultType());
         return type.equals(f.getFaultType());
     }
     }
 
 
+    public boolean isType3(String faultId) {
+        return isType(faultId, Fault.Type.TYPE_GZBW);
+    }
+
 
 
 //    private static List<FaultNode> toTree2(List<FaultNode> list) {
 //    private static List<FaultNode> toTree2(List<FaultNode> list) {
 //        List<FaultNode> tree = new ArrayList<>();
 //        List<FaultNode> tree = new ArrayList<>();

+ 58 - 19
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/TaskFaultService.java

@@ -1,14 +1,16 @@
 package com.ruoyi.sim.service.impl;
 package com.ruoyi.sim.service.impl;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.List;
 
 
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.sim.domain.Fault;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import com.ruoyi.sim.mapper.TaskFaultMapper;
 import com.ruoyi.sim.mapper.TaskFaultMapper;
 import com.ruoyi.sim.domain.TaskFault;
 import com.ruoyi.sim.domain.TaskFault;
-import org.springframework.transaction.annotation.Transactional;
 
 
 /**
 /**
  * 任务故障关联Service业务层处理
  * 任务故障关联Service业务层处理
@@ -20,6 +22,8 @@ import org.springframework.transaction.annotation.Transactional;
 public class TaskFaultService {
 public class TaskFaultService {
     @Autowired
     @Autowired
     private TaskFaultMapper taskFaultMapper;
     private TaskFaultMapper taskFaultMapper;
+    @Autowired
+    private FaultService faultService;
 
 
     /**
     /**
      * 查询任务故障关联
      * 查询任务故障关联
@@ -109,11 +113,21 @@ public class TaskFaultService {
     }
     }
 
 
     public int insertOrUpdateTaskFault(TaskFault tf) {
     public int insertOrUpdateTaskFault(TaskFault tf) {
-        TaskFault f = selectUniqueTaskFault(tf.getTaskId(), tf.getFaultId());
-        if (f == null) {
+        if (tf == null) {
+            return 0;
+        }
+        if (tf.getTaskId() == null || tf.getTaskId() == 0) {
             return insertTaskFault(tf);
             return insertTaskFault(tf);
         } else {
         } else {
-            return updateTaskFault(tf);
+            if (tf.getRelId() == null || tf.getRelId() == 0) {
+                TaskFault tf2 = selectUniqueTaskFault(tf.getTaskId(), tf.getFaultId());
+                tf2.setTaskId(tf.getTaskId());
+                tf2.setFaultId(tf.getFaultId());
+                tf2.setFlag(tf.getFlag());
+                return updateTaskFault(tf2);
+            } else {
+                return updateTaskFault(tf);
+            }
         }
         }
     }
     }
 
 
@@ -130,28 +144,53 @@ public class TaskFaultService {
         return list.size();
         return list.size();
     }
     }
 
 
-    public int countTypeGZBW(Long taskId) {
-        TaskFault q = new TaskFault();
-        q.setTaskId(taskId);
-        q.setFlag(TaskFault.YES);
-        List<TaskFault> list = selectTaskFaultList(q);
-        if (list == null || list.isEmpty()) {
-            return 0;
-        } else {
-            return list.size();
+    public List<Fault> toFaultList(List<TaskFault> taskFaultList) {
+        if (taskFaultList == null || taskFaultList.isEmpty()) {
+            return Collections.emptyList();
+        }
+        List<Fault> listF = new ArrayList<>();
+        for (TaskFault tf : taskFaultList) {
+            Fault f = faultService.selectFaultByFaultId(tf.getFaultId());
+            if (f == null) {
+                continue;
+            }
+            listF.add(f);
         }
         }
+        return listF;
     }
     }
 
 
-    public List<TaskFault> listType3(Long taskId) {
+    /**
+     * 理论上应该只有故障部位有Yes数据。
+     *
+     * @param taskId
+     * @param faultType
+     * @return
+     */
+    public List<TaskFault> listYesByFaultType(Long taskId, String faultType) {
+        if (taskId == 0L || StringUtils.isBlank(faultType)) {
+            return Collections.emptyList();
+        }
         TaskFault q = new TaskFault();
         TaskFault q = new TaskFault();
         q.setTaskId(taskId);
         q.setTaskId(taskId);
         q.setFlag(TaskFault.YES);
         q.setFlag(TaskFault.YES);
         List<TaskFault> list1 = selectTaskFaultList(q);
         List<TaskFault> list1 = selectTaskFaultList(q);
-        List<TaskFault> list2 = new ArrayList<TaskFault>();
-
-
-
-
+        List<TaskFault> list2 = new ArrayList<>();
+        if (list1 == null || list1.isEmpty()) {
+            return Collections.emptyList();
+        }
+        list1.forEach(tf -> {
+            Fault f = faultService.selectFaultByFaultId(tf.getFaultId());
+            if (f == null) {
+                return;
+            }
+            if (f.getFaultType().equals(faultType)) {
+                list2.add(tf);
+            }
+        });
         return list2;
         return list2;
     }
     }
+
+    public int countYesByFaultType(Long taskId, String faultType) {
+        return listYesByFaultType(taskId, faultType).size();
+    }
 }
 }

+ 211 - 131
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/TaskService.java

@@ -1,7 +1,6 @@
 package com.ruoyi.sim.service.impl;
 package com.ruoyi.sim.service.impl;
 
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DateUtils;
@@ -9,6 +8,7 @@ import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.sim.domain.Fault;
 import com.ruoyi.sim.domain.Fault;
 import com.ruoyi.sim.domain.TaskFault;
 import com.ruoyi.sim.domain.TaskFault;
 import com.ruoyi.sim.domain.vo.FaultTreeVo;
 import com.ruoyi.sim.domain.vo.FaultTreeVo;
+import com.ruoyi.sim.domain.vo.TaskCUVo;
 import com.ruoyi.sim.domain.vo.TaskVo;
 import com.ruoyi.sim.domain.vo.TaskVo;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
@@ -60,10 +60,10 @@ public class TaskService {
         String simType = t.getSimType();
         String simType = t.getSimType();
         BeanUtils.copyProperties(t, vo);
         BeanUtils.copyProperties(t, vo);
         // 查询获得数据结构。
         // 查询获得数据结构。
-        List<FaultTreeVo> listToQ = (List<FaultTreeVo>) faultService.listAllARTreeStyleBySimType(simType).get(AjaxResult.DATA_TAG);
+        List<FaultTreeVo> listStyleT = faultService.listAllListTreeStyleBySimType(simType);
         // 变成扁平list
         // 变成扁平list
-        List<FaultTreeVo> listToF = FaultService.flatten(listToQ);
-        for (FaultTreeVo o : listToF) {
+        List<FaultTreeVo> listStyleF = FaultService.flatten(listStyleT);
+        for (FaultTreeVo o : listStyleF) {
             if (o == null) {
             if (o == null) {
                 continue;
                 continue;
             }
             }
@@ -77,7 +77,11 @@ public class TaskService {
             }
             }
         }
         }
         // 变成树list
         // 变成树list
-        vo.setSelectedData(FaultService.toTree(listToF, Fault.ROOT_FAULT_ID));
+        vo.setSelectedData(FaultService.toTree(listStyleF, Fault.ROOT_FAULT_ID));
+        // 故障现象
+        vo.setCountGZXX(getCountGZXX(taskId));
+        // 故障部位
+        vo.setCountGZBW(getCountGZBW(taskId));
         //
         //
         return AjaxResult.success(vo);
         return AjaxResult.success(vo);
     }
     }
@@ -88,28 +92,122 @@ public class TaskService {
      * @param q 任务
      * @param q 任务
      * @return 任务
      * @return 任务
      */
      */
-    public List<TaskVo> list(TaskVo q) {
-        Task qT = new Task();
-        BeanUtils.copyProperties(q, qT);
-        List<Task> listT = taskMapper.selectTaskList(qT);
-        List<TaskVo> listTVo = new ArrayList<>(listT.size());
-        Long taskId = q.getTaskId();
-        listT.stream().forEach(t -> {
+    public List<TaskVo> list(Task q) {
+        if (q == null) {
+            return Collections.emptyList();
+        }
+        List<Task> listT = taskMapper.selectTaskList(q);
+        List<TaskVo> listVo = new ArrayList<>(listT.size());
+        listT.forEach(t -> {
             TaskVo vo = new TaskVo();
             TaskVo vo = new TaskVo();
             BeanUtils.copyProperties(t, vo);
             BeanUtils.copyProperties(t, vo);
-            {
-                int countGZXX = 0;
-                int countGZBW = 0;
-                //
-                countGZBW = taskFaultService.countTypeGZBW(taskId);
-                // todo:故障现象
-                // countGZXX = faultService.listType1ByType3
-                vo.setCountGZXX(countGZXX);
-                vo.setCountGZBW(countGZBW);
-            }
-            listTVo.add(vo);
+            // 故障现象
+            vo.setCountGZXX(getCountGZXX(t.getTaskId()));
+            // 故障部位
+            vo.setCountGZBW(getCountGZBW(t.getTaskId()));
+            listVo.add(vo);
         });
         });
-        return listTVo;
+        return listVo;
+    }
+
+    public int getCountGZXX(long taskId) {
+        return faultService.countType1ByType3(
+                taskFaultService.toFaultList(
+                        taskFaultService.listYesByFaultType(taskId, Fault.Type.TYPE_GZBW)
+                )
+        );
+    }
+
+    public int getCountGZBW(long taskId) {
+        return taskFaultService.countYesByFaultType(taskId, Fault.Type.TYPE_GZBW);
+    }
+
+    @Transactional()
+    public AjaxResult insertOrUpdateTaskByTeacher(TaskCUVo v) {
+        String simType = v.getSimType();
+        String[] faultIds = v.getFaultIds();
+        l.info("simType = {}", simType);
+        // check
+        AjaxResult arE1 = check(simType, faultIds);
+        if (arE1.isError()) {
+            return arE1;
+        }
+        Set<String> hashSet = new HashSet<>(Arrays.asList(faultIds));
+        l.info("hashSet = {}", hashSet);
+        TaskVo tv = buildBlankTaskVo(simType);
+        // 查询获得数据结构。
+        List<FaultTreeVo> listStyleT = tv.getSelectedData();
+        // 变成扁平list
+        List<FaultTreeVo> listStyleF = FaultService.flatten(listStyleT);
+        listStyleF
+                .stream()
+                .filter(vo -> hashSet.contains(vo.getFaultId()))
+                .forEach(vo -> vo.getTaskFault().setFlag(TaskFault.YES));
+        if (v.getTaskId() == null || v.getTaskId() == 0) {
+            tv.setTaskId(null);
+        } else {
+            tv.setTaskId(v.getTaskId());
+        }
+        tv.setName(v.getName());
+        tv.setSimType(v.getSimType());
+        l.info("listStyleF.size = {}", listStyleF.size());
+        // 变回tree
+        tv.setSelectedData(FaultService.toTree(listStyleF, Fault.ROOT_FAULT_ID));
+        AjaxResult arE2 = null;
+        if (v.getTaskId() == null || v.getTaskId() == 0) {
+            arE2 = insertTaskByTeacher(tv);
+        } else {
+            arE2 = updateTaskByTeacher(tv);
+        }
+        if (arE2 == null || arE2.isError()) {
+            return arE2;
+        }
+        return AjaxResult.success();
+    }
+
+    public AjaxResult check(String simType, String[] faultIds) {
+        for (String faultId : faultIds) {
+            if (!faultService.isType3(faultId)) {
+                return AjaxResult.error("faultId not TYPE_GZBW!");
+            }
+        }
+        if (!faultService.isExist(simType, faultIds)) {
+            return AjaxResult.error("faultId not exist!");
+        }
+        return AjaxResult.success();
+    }
+
+    /**
+     * 新增任务
+     *
+     * @param tv 任务
+     * @return 结果
+     * todo:事务有问题。
+     */
+    @Transactional()
+    public AjaxResult insertTaskByTeacher(TaskVo tv) {
+        l.info("insertTaskByTeacher {}", tv);
+        // check
+        AjaxResult arE1 = checkAddOrEdit(tv);
+        if (arE1.isError()) {
+            return arE1;
+        }
+        //
+        tv.setCreateByUserId(SecurityUtils.getUserId());
+        tv.setCreateBy(SecurityUtils.getUsername());
+        tv.setCreateTime(DateUtils.getNowDate());
+        tv.setUpdateBy(SecurityUtils.getUsername());
+        tv.setUpdateTime(DateUtils.getNowDate());
+        // do.
+        // id新增一定要null。
+        tv.setTaskId(null);
+        taskMapper.insertTask(tv);
+        // do ref.
+        AjaxResult arRef = dealRef(tv);
+        if (arRef.isError()) {
+            return arRef;
+        }
+        return AjaxResult.success();
     }
     }
 
 
     /**
     /**
@@ -121,11 +219,35 @@ public class TaskService {
     public AjaxResult updateTaskByTeacher(TaskVo tv) {
     public AjaxResult updateTaskByTeacher(TaskVo tv) {
         l.info("updateTaskByTeacher " + tv);
         l.info("updateTaskByTeacher " + tv);
         // check
         // check
+        AjaxResult arE1 = checkAddOrEdit(tv);
+        if (arE1.isError()) {
+            return arE1;
+        }
+        //
+        tv.setCreateByUserId(SecurityUtils.getUserId());
+        tv.setCreateBy(SecurityUtils.getUsername());
+        tv.setCreateTime(DateUtils.getNowDate());
+        tv.setUpdateBy(SecurityUtils.getUsername());
+        tv.setUpdateTime(DateUtils.getNowDate());
+        // do.
+        if (tv.getTaskId() == null || tv.getTaskId() == 0) {
+            return AjaxResult.error("taskId not exist!");
+        }
+        taskMapper.updateTask(tv);
+        // do ref.
+        AjaxResult arE2 = dealRef(tv);
+        if (arE2.isError()) {
+            return arE2;
+        }
+        return AjaxResult.success();
+    }
+
+    public AjaxResult checkAddOrEdit(TaskVo tv) {
         if (tv == null) {
         if (tv == null) {
             return AjaxResult.error("TaskVo empty!");
             return AjaxResult.error("TaskVo empty!");
         }
         }
         if (!simService.checkSimTypeOk(tv.getSimType())) {
         if (!simService.checkSimTypeOk(tv.getSimType())) {
-            return AjaxResult.error("getSimType error!");
+            return AjaxResult.error("simType value error!");
         }
         }
         if (!Task.Type.TEACHER_ADD.equals(tv.getTaskType())) {
         if (!Task.Type.TEACHER_ADD.equals(tv.getTaskType())) {
             return AjaxResult.error("taskType value error!");
             return AjaxResult.error("taskType value error!");
@@ -133,46 +255,60 @@ public class TaskService {
         if (StringUtils.isEmpty(tv.getName())) {
         if (StringUtils.isEmpty(tv.getName())) {
             return AjaxResult.error("name isEmpty!");
             return AjaxResult.error("name isEmpty!");
         }
         }
-        //
-        tv.setCreateByUserId(SecurityUtils.getUserId());
-        tv.setCreateBy(SecurityUtils.getUsername());
-        tv.setCreateTime(DateUtils.getNowDate());
-        tv.setUpdateBy(SecurityUtils.getUsername());
-        tv.setUpdateTime(DateUtils.getNowDate());
-        tv.setRemark("");
-        tv.setUpdateTime(DateUtils.getNowDate());
-        taskMapper.updateTask(tv);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 处理关联数据。
+     *
+     * @param tv
+     */
+    public AjaxResult dealRef(TaskVo tv) {
         List<FaultTreeVo> selectedData = tv.getSelectedData();
         List<FaultTreeVo> selectedData = tv.getSelectedData();
-        if (selectedData != null) {
-            List<FaultTreeVo> list = FaultService.flatten(selectedData);
-            for (FaultTreeVo ftv : list) {
-                if (ftv == null) {
-                    continue;
-                }
-                if (!Fault.Type.TYPE_GZBW.equals(ftv.getFaultType())) {
-                    continue;
-                }
-                TaskFault tf = ftv.getTaskFault();
-                // check
-                if (tf == null) {
-                    return AjaxResult.error("TaskFault empty!");
-                }
-                String flag = tf.getFlag();
-                if (StringUtils.isEmpty(flag)) {
-                    return AjaxResult.error("flag empty!");
-                }
-                if (TaskFault.UNKNOWN.equals(flag)) {
-                    return AjaxResult.error("flag UNKNOWN!");
-                }
-                if (!TaskFault.YES.equals(flag) && !TaskFault.NO.equals(flag)) {
-                    return AjaxResult.error("flag must YES or NO!");
-                }
-                // todo:选中数量限制
+        if (selectedData == null) {
+            return AjaxResult.error("selectedData null!");
+        }
+        List<FaultTreeVo> list = FaultService.flatten(selectedData);
+        dealRef(tv.getTaskId(), list);
+        return AjaxResult.success();
+    }
 
 
-                // todo:故障部位冲突
-                tf.setTaskId(tv.getTaskId());
-                taskFaultService.insertOrUpdateTaskFault(tf);
+    /**
+     * @param flatten 扁平list
+     * @return
+     */
+    public AjaxResult dealRef(Long taskId, List<FaultTreeVo> flatten) {
+        for (FaultTreeVo ftv : flatten) {
+            if (ftv == null) {
+                continue;
             }
             }
+            // 仅仅处理故障部位。
+            if (!Fault.Type.TYPE_GZBW.equals(ftv.getFaultType())) {
+                continue;
+            }
+            TaskFault tf = ftv.getTaskFault();
+            // check
+            if (tf == null) {
+                return AjaxResult.error("TaskFault empty!");
+            }
+            String flag = tf.getFlag();
+            if (StringUtils.isEmpty(flag)) {
+                return AjaxResult.error("flag empty!");
+            }
+            if (!TaskFault.YES.equals(flag) &&
+                    !TaskFault.NO.equals(flag) &&
+                    !TaskFault.UNKNOWN.equals(flag)) {
+                return AjaxResult.error("flag must YES or NO,UNKNOWN!");
+            }
+            // todo:选中数量限制
+
+            // 故障部位冲突 暂时没有故障部位冲突。
+            // UNKNOWN 作为 NO 插入或修改数据。
+            if (TaskFault.UNKNOWN.equals(flag)) {
+                tf.setFlag(TaskFault.NO);
+            }
+            tf.setTaskId(taskId);
+            taskFaultService.insertOrUpdateTaskFault(tf);
         }
         }
         return AjaxResult.success();
         return AjaxResult.success();
     }
     }
@@ -207,70 +343,6 @@ public class TaskService {
 
 
 
 
     /**
     /**
-     * 新增任务
-     *
-     * @param tv 任务
-     * @return 结果
-     * todo:事务有问题。
-     */
-    @Transactional
-    public AjaxResult insertTaskByTeacher(TaskVo tv) {
-        // check
-        if (tv == null) {
-            return AjaxResult.error("TaskVo empty!");
-        }
-        if (!simService.checkSimTypeOk(tv.getSimType())) {
-            return AjaxResult.error("getSimType error!");
-        }
-        if (!Task.Type.TEACHER_ADD.equals(tv.getTaskType())) {
-            return AjaxResult.error("getTaskType value error!");
-        }
-        if (StringUtils.isEmpty(tv.getName())) {
-            return AjaxResult.error("getName isEmpty!");
-        }
-        //
-        tv.setCreateByUserId(SecurityUtils.getUserId());
-        tv.setCreateBy(SecurityUtils.getUsername());
-        tv.setCreateTime(DateUtils.getNowDate());
-        tv.setUpdateBy(SecurityUtils.getUsername());
-        tv.setUpdateTime(DateUtils.getNowDate());
-        taskMapper.insertTask(tv);
-        List<FaultTreeVo> selectedData = tv.getSelectedData();
-        if (selectedData != null) {
-            List<FaultTreeVo> list = FaultService.flatten(selectedData);
-            for (FaultTreeVo ftv : list) {
-                if (ftv == null) {
-                    continue;
-                }
-                if (!Fault.Type.TYPE_GZBW.equals(ftv.getFaultType())) {
-                    continue;
-                }
-                TaskFault tf = ftv.getTaskFault();
-                // check
-                if (tf == null) {
-                    return AjaxResult.error("TaskFault empty!");
-                }
-                String flag = tf.getFlag();
-                if (StringUtils.isEmpty(flag)) {
-                    return AjaxResult.error("flag empty!");
-                }
-                if (TaskFault.UNKNOWN.equals(flag)) {
-                    return AjaxResult.error("flag UNKNOWN!");
-                }
-                if (!TaskFault.YES.equals(flag) && !TaskFault.NO.equals(flag)) {
-                    return AjaxResult.error("flag must YES or NO!");
-                }
-                // todo:选中数量限制
-
-                // 故障部位冲突 暂时没有故障部位冲突。
-                tf.setTaskId(tv.getTaskId());
-                taskFaultService.insertOrUpdateTaskFault(tf);
-            }
-        }
-        return AjaxResult.success();
-    }
-
-    /**
      * 为了新建Task,返回一个带tree结构的任务详细信息。
      * 为了新建Task,返回一个带tree结构的任务详细信息。
      *
      *
      * @return 任务
      * @return 任务
@@ -283,13 +355,21 @@ public class TaskService {
         if (!simService.checkSimTypeOk(simType)) {
         if (!simService.checkSimTypeOk(simType)) {
             return AjaxResult.error("simType value error!");
             return AjaxResult.error("simType value error!");
         }
         }
-        // query obj.
+        return AjaxResult.success(buildBlankTaskVo(simType));
+    }
+
+    /**
+     * @param simType
+     * @return tree style
+     */
+    public TaskVo buildBlankTaskVo(final String simType) {
         List<FaultTreeVo> ftList = faultService.listAllListTreeStyleBySimType(simType);
         List<FaultTreeVo> ftList = faultService.listAllListTreeStyleBySimType(simType);
         TaskVo t = new TaskVo();
         TaskVo t = new TaskVo();
-        t.setTaskId(Task.EMPTY_TASK_ID);
+        t.setTaskId(null);
         t.setSimType(simType);
         t.setSimType(simType);
+        t.setTaskType(Task.Type.TEACHER_ADD);
         t.setSelectedData(ftList);
         t.setSelectedData(ftList);
-        return AjaxResult.success(t);
+        return t;
     }
     }
 
 
     /**
     /**
@@ -299,7 +379,7 @@ public class TaskService {
      * @return 结果
      * @return 结果
      */
      */
     @Transactional
     @Transactional
-    public int insertTaskWithFault(Task task) {
+    public long insertTaskWithFault(Task task) {
         Long taskId = task.getTaskId();
         Long taskId = task.getTaskId();
         if (selectTaskByTaskId(taskId) != null) {
         if (selectTaskByTaskId(taskId) != null) {
             // 已经存在
             // 已经存在