item | +value | +comment | +
---|---|---|
currentId | ++ | + |
preId | ++ | + |
+ | + | + |
+ | + | + |
+ | + | + |
+ | + | + |
+ | + | + |
+ | + | + |
+ | + | + |
+ + +
diff --git a/TaskStatus.png b/TaskStatus.png index acda9c0..56730b0 100644 --- a/TaskStatus.png +++ b/TaskStatus.png Binary files differ diff --git a/TaskStatus.pu b/TaskStatus.pu index ea1f8c7..0052b39 100644 --- a/TaskStatus.pu +++ b/TaskStatus.pu @@ -2,13 +2,14 @@ [*] --> PREPARATION PREPARATION --> ACCEPTING : DataLoad -ACCEPTING --> RESERVED : RESERVE(マッパー登録) -RESERVED --> IMPORTED : DONE(インポート済み) -ACCEPTING <-- RESERVED : CANCEL(取消) +ACCEPTING --> RESERVED : RESERVE(タスク予約) +ACCEPTING --> IMPORTED : DONE(編集完了) +RESERVED --> IMPORTED : DONE(編集完了) +IMPORTED --> IMPORTED : DONE(編集完了) +ACCEPTING <-- RESERVED : CANCEL(タスク予約取消) -IMPORTED -> VERIFICATION : VALID(検証者登録) -VERIFICATION --> END : [検証結果=OK] -ACCEPTING <-- VERIFICATION : [検証結果=NG] +IMPORTED --> END : OK[検証結果=OK] +ACCEPTING <-- IMPORTED : NG[検証結果=NG] state "PREPARATION\n準備中" as PREPARATION { } @@ -17,9 +18,17 @@ } state "RESERVED\n予約済み" as RESERVED { + RESERVED : 編集者 } state "IMPORTED\nインポート済み" as IMPORTED { + IMPORTED : 編集者 + IMPORTED : 変更セットNo } +state "END\n完了" as END { + END : 編集者 + END : 変更セットNo + END : 検証者 +} @enduml \ No newline at end of file diff --git a/src/main/java/osm/surveyor/task/city/TaskController.java b/src/main/java/osm/surveyor/task/city/TaskController.java index 93973a0..7ce017b 100644 --- a/src/main/java/osm/surveyor/task/city/TaskController.java +++ b/src/main/java/osm/surveyor/task/city/TaskController.java @@ -84,23 +84,33 @@ { String next = "task"; Operation operation = Operation.NOP; - Status baseStatus = Status.PREPARATION; + Status nextStatus = Status.PREPARATION; if (op.equals(Operation.RESERVE.toString())) { model.addAttribute("command", "タスク予約"); operation = Operation.RESERVE; - baseStatus = Status.PREPARATION; + nextStatus = Status.RESERVED; } else if (op.equals(Operation.CANCEL.toString())) { model.addAttribute("command", "タスク予約取消"); operation = Operation.CANCEL; - baseStatus = Status.ACCEPTING; + nextStatus = Status.ACCEPTING; } else if (op.equals(Operation.DONE.toString())) { model.addAttribute("command", "編集完了"); operation = Operation.DONE; - baseStatus = Status.IMPORTED; + nextStatus = Status.IMPORTED; next = "task_done"; } + else if (op.equals(Operation.NG.toString())) { + model.addAttribute("command", "検証(NG)"); + operation = Operation.NG; + nextStatus = Status.ACCEPTING; + } + else if (op.equals(Operation.OK.toString())) { + model.addAttribute("command", "検証(OK)"); + operation = Operation.OK; + nextStatus = Status.END; + } // ログイン名を取得 String loginName = ""; @@ -122,7 +132,12 @@ Task pre = service.getTaskByMesh(citycode, meshcode); if (pre != null) { pre.setOperation(operation); - pre.setUsername(loginName); + if (op.equals(Operation.OK.toString()) || op.equals(Operation.NG.toString())) { + pre.setValidator(loginName); + } + else { + pre.setUsername(loginName); + } model.addAttribute("task", pre); return next; } @@ -135,8 +150,11 @@ task.setCitycode(citycode); task.setMeshcode(meshcode); task.setMesh(mesh); - task.setStatus(baseStatus); + task.setStatus(nextStatus); task.setUsername(loginName); + if (op.equals(Operation.OK.toString()) || op.equals(Operation.NG.toString())) { + task.setValidator(loginName); + } task.setOperation(operation); model.addAttribute("task", task); return next; @@ -150,10 +168,7 @@ { if (result.hasErrors()) { // エラーがある場合 - if (task.getOperation() == Operation.DONE) { - return "task_done"; - } - return "task"; + return nextPage(task); } service.add(task, user); @@ -173,7 +188,7 @@ public String taskExceptionHandler(TaskException e, Model model) { model.addAttribute("error", "400 Bad Request"); - model.addAttribute("message", e.toString()); + model.addAttribute("message", e.getMessage()); model.addAttribute("status", HttpStatus.BAD_REQUEST); return exceptionHandler(e.getTask(), model); } @@ -192,7 +207,7 @@ public String notAcceptableExceptionHandler(NotAcceptableException e, Model model) { model.addAttribute("error", "406 Not Acceptable"); - model.addAttribute("message", e.toString()); + model.addAttribute("message", e.getMessage()); model.addAttribute("status", HttpStatus.NOT_ACCEPTABLE); return exceptionHandler(e.getTask(), model); } @@ -211,7 +226,7 @@ public String conflictExceptionHandler(ConflictException e, Model model) { model.addAttribute("error", "409 Conflict"); - model.addAttribute("message", e.toString()); + model.addAttribute("message", e.getMessage()); model.addAttribute("status", HttpStatus.CONFLICT); return exceptionHandler(e.getTask(), model); } @@ -230,10 +245,20 @@ else if (task.getOperation() == Operation.DONE) { model.addAttribute("command", "編集済み"); } + else if (task.getOperation() == Operation.NG) { + model.addAttribute("command", "検証(NG)"); + } + else if (task.getOperation() == Operation.OK) { + model.addAttribute("command", "検証(OK)"); + } model.addAttribute("citycode", task.getCitycode()); model.addAttribute("meshcode", task.getMeshcode()); model.addAttribute("task", task); + return nextPage(task); + } + + private String nextPage(Task task) { if (task.getOperation() == Operation.DONE) { return "task_done"; } diff --git a/src/main/java/osm/surveyor/task/city/TaskService.java b/src/main/java/osm/surveyor/task/city/TaskService.java index 49eecad..dac7d67 100644 --- a/src/main/java/osm/surveyor/task/city/TaskService.java +++ b/src/main/java/osm/surveyor/task/city/TaskService.java @@ -36,6 +36,12 @@ else if (task.getOperation() == Operation.DONE) { task.setStatus(Status.IMPORTED); } + else if (task.getOperation() == Operation.NG) { + task.setStatus(Status.ACCEPTING); + } + else if (task.getOperation() == Operation.OK) { + task.setStatus(Status.END); + } else { NotAcceptableException e = new NotAcceptableException("未サポートのオペレーションです: "+ task.getOperation()); e.setTask(task); @@ -69,7 +75,7 @@ } else if (task.getOperation() == Operation.CANCEL) { if (ctask.getStatus() != Status.RESERVED) { - NotAcceptableException e = new NotAcceptableException("ステータスがRESERVEDではないため予約取消できませんでした : "+ task.getOperation()); + NotAcceptableException e = new NotAcceptableException("ステータスが予約中ではないため予約取消できませんでした : "+ task.getOperation()); e.setTask(task); throw e; } @@ -82,6 +88,17 @@ else if (task.getOperation() == Operation.DONE) { // タスク予約していなくてもインポートできる // 他のマッパーが予約していてもインポート可能 + if (ctask.getStatus() == Status.PREPARATION) { + NotAcceptableException e = new NotAcceptableException("準備中のため登録できませんでした"); + e.setTask(task); + throw e; + } + if (ctask.getStatus() == Status.END) { + NotAcceptableException e = new NotAcceptableException("既にタスクが完了しているため登録できませんでした"); + e.setTask(task); + throw e; + } + String changeset = task.getChangeSet(); if (changeset == null) { TaskException e = new TaskException("変更セットNoが入力されていません"); @@ -93,15 +110,35 @@ e.setTask(task); throw e; } - try { - Long.parseLong(changeset); + else { + try { + Long.parseLong(changeset); + } + catch (NumberFormatException nfe) { + TaskException e = new TaskException("変更セットNoに数字以外の文字が入っています"); + e.setTask(task); + throw e; + } } - catch (NumberFormatException nfe) { - TaskException e = new TaskException("変更セットNoに数字以外の文字が入っています"); + } + else if ((task.getOperation() == Operation.NG) || (task.getOperation() == Operation.NG)) { + if (ctask.getStatus() != Status.IMPORTED) { + NotAcceptableException e = new NotAcceptableException("編集されていないため検証できません"); e.setTask(task); throw e; } - + if (ctask.getUsername().equals(user.getUsername())) { + TaskException e = new TaskException("自己の編集を検証することはできません"); + e.setTask(task); + throw e; + } + + String comment = task.getComment(); + if (comment == null || comment.isEmpty()) { + TaskException e = new TaskException("コメントが入力されていません"); + e.setTask(task); + throw e; + } } task.setPreId(ctask.getCurrentId()); task.setCurrentId(uuid); diff --git a/src/main/java/osm/surveyor/task/city/model/Task.java b/src/main/java/osm/surveyor/task/city/model/Task.java index 1e8cc7e..088181f 100644 --- a/src/main/java/osm/surveyor/task/city/model/Task.java +++ b/src/main/java/osm/surveyor/task/city/model/Task.java @@ -63,6 +63,11 @@ private String changeSet; /** + * コメント + */ + private String comment; + + /** * 操作内容 */ @Enumerated(EnumType.ORDINAL) diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index 916bf02..d927716 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -26,11 +26,13 @@ folder = folder path = file updateTime = update time +comment = comment # operation download = download return = return reserve = task reserve cancel = cancel -confirm = confirm done = done +NG = Validation(NG) +OK = Validation(OK) diff --git a/src/main/resources/i18n/messages_ja.properties b/src/main/resources/i18n/messages_ja.properties index 655d648..80428c5 100644 --- a/src/main/resources/i18n/messages_ja.properties +++ b/src/main/resources/i18n/messages_ja.properties @@ -25,11 +25,13 @@ updateTime = 更新日時 changeSet = 変更セット validator = 検証者 +comment = コメント # operation download = ダウンロード return = 戻る reserve = タスク予約 cancel = タスク予約取消 -confirm = 確定 done = 編集完了 +NG = 検証(NG) +OK = 検証(OK) diff --git a/src/main/resources/templates/task.html b/src/main/resources/templates/task.html index 13f8ec4..31cdd2f 100644 --- a/src/main/resources/templates/task.html +++ b/src/main/resources/templates/task.html @@ -103,6 +103,15 @@ +
item | +value | +comment | +
---|---|---|
currentId | ++ | + |
preId | ++ | + |
+ | + | + |
+ | + | + |
+ | + | + |
+ | + | + |
+ | + | + |
+ | + | + |
+ | + | + |
- | - | - | - | - | + |
+
+ :
+
+
+ :
+
+
+ :
+
+ |
---|---|---|---|---|---|---|
+ | @@ -74,33 +77,43 @@ + + + + + + + + |
履歴 | +||||||||
---|---|---|---|---|---|---|---|---|
- | - | + | ||||||
- | - | + |