diff --git a/TaskStatus.png b/TaskStatus.png new file mode 100644 index 0000000..fba2e7d --- /dev/null +++ b/TaskStatus.png Binary files differ diff --git a/TaskStatus.pu b/TaskStatus.pu new file mode 100644 index 0000000..9660266 --- /dev/null +++ b/TaskStatus.pu @@ -0,0 +1,23 @@ +@startuml + +[*] --> PREPARATION +PREPARATION --> ACCEPTING : DataLoad +ACCEPTING --> RESERVED : RESERVE(マッパー登録) +RESERVED --> IMPORTED : DONE(インポート済み) +IMPORTED -> verification : 検証者登録 +verification --> END : [検証結果=OK] +ACCEPTING <-- verification : [検証結果=NG] + +state "PREPARATION\n準備中" as PREPARATION { +} + +state "ACCEPTING\n受付中" as ACCEPTING { +} + +state "RESERVED\n予約済み" as RESERVED { +} + +state "IMPORTED\nインポート済み" as IMPORTED { +} + +@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 eb04458..77cc2d9 100644 --- a/src/main/java/osm/surveyor/task/city/TaskController.java +++ b/src/main/java/osm/surveyor/task/city/TaskController.java @@ -1,9 +1,9 @@ package osm.surveyor.task.city; -import java.util.Date; import java.util.List; import java.util.UUID; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Controller; @@ -30,6 +30,9 @@ private final CitymeshRepository meshRepository; private final TaskRepository taskRepository; + @Autowired + private TaskService service; + /** * ログインユーザーが関係しているTASKリスト * @param model @@ -72,7 +75,8 @@ * @return */ @GetMapping("/task/reserve") - public String showTask(@AuthenticationPrincipal UserDetails user, Model model, + public String reserve(@AuthenticationPrincipal UserDetails user, + Model model, @RequestParam(name="citycode") String citycode, @RequestParam(name="meshcode") String meshcode) { @@ -93,25 +97,26 @@ pk.setMeshcode(meshcode); Citymesh mesh = meshRepository.getById(pk); - List tasks = taskRepository.serchByMesh(citycode, meshcode); - for (Task t : tasks) { - model.addAttribute("task", t); + Task pre = service.getTaskByMesh(citycode, meshcode); + if (pre != null) { + model.addAttribute("task", pre); return "task"; } - - // Taskが無い場合は生成する - String uuid = UUID.randomUUID().toString(); - Task task = new Task(); - task.setCurrentId(uuid); - task.setPreId(uuid); - task.setCitycode(citycode); - task.setMeshcode(meshcode); - task.setMesh(mesh); - task.setStatus(Status.PREPARATION); - task.setUsername(loginName); - task.setOperation(Operation.RESERVE); - model.addAttribute("task", task); - return "task"; + else { + // Taskが無い場合は生成する + String uuid = UUID.randomUUID().toString(); + Task task = new Task(); + task.setCurrentId(uuid); + task.setPreId(uuid); + task.setCitycode(citycode); + task.setMeshcode(meshcode); + task.setMesh(mesh); + task.setStatus(Status.PREPARATION); + task.setUsername(loginName); + task.setOperation(Operation.RESERVE); + model.addAttribute("task", task); + return "task"; + } } @GetMapping("/task/add") @@ -129,10 +134,10 @@ BindingResult result) { if (result.hasErrors()) { + // エラーがある場合 return "task"; } - task.setUpdateTime(new Date()); - taskRepository.save(task); + service.add(task); return "redirect:/tasks?citycode="+ task.getCitycode() +"&meshcode="+ task.getMeshcode(); } diff --git a/src/main/java/osm/surveyor/task/city/TaskRepository.java b/src/main/java/osm/surveyor/task/city/TaskRepository.java index 4ef1a9e..80ddcf5 100644 --- a/src/main/java/osm/surveyor/task/city/TaskRepository.java +++ b/src/main/java/osm/surveyor/task/city/TaskRepository.java @@ -10,7 +10,7 @@ public interface TaskRepository extends JpaRepository { - @Query("SELECT t FROM Task t WHERE t.citycode = :citycode AND t.meshcode = :meshcode order by update_time") - List serchByMesh(@Param("citycode")String citycode,@Param("meshcode")String meshcode); + @Query("SELECT t FROM Task t WHERE t.citycode = :citycode AND t.meshcode = :meshcode order by update_time DESC") + List serchByMesh(@Param("citycode")String citycode, @Param("meshcode")String meshcode); } diff --git a/src/main/java/osm/surveyor/task/city/TaskService.java b/src/main/java/osm/surveyor/task/city/TaskService.java new file mode 100644 index 0000000..4245c78 --- /dev/null +++ b/src/main/java/osm/surveyor/task/city/TaskService.java @@ -0,0 +1,69 @@ +package osm.surveyor.task.city; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import osm.surveyor.task.city.model.Operation; +import osm.surveyor.task.city.model.Status; +import osm.surveyor.task.city.model.Task; + +import javax.transaction.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.UUID; + +@Service +@Transactional // メソッド開始時にトランザクションを開始、終了時にコミットする +public class TaskService { + + @Autowired + TaskRepository repository; + + public void add(Task task) { + if (task.getOperation() == Operation.RESERVE) { + task.setStatus(Status.RESERVED); + } + else { + throw new RuntimeException("未サポートのオペレーション: "+ task.getOperation()); + } + + String uuid = UUID.randomUUID().toString(); + + Task ctask = getTaskByMesh(task.getCitycode(), task.getMeshcode()); + if (ctask == null) { + task.setPreId(uuid); + task.setCurrentId(uuid); + } + else { + if (!ctask.getCurrentId().equals(task.getCurrentId())) { + throw new RuntimeException("タスクが変更されたため更新できません"); + } + if (task.getOperation() == Operation.RESERVE) { + if (ctask.getStatus() != Status.ACCEPTING) { + throw new RuntimeException("ACCEPTIONGではないため予約できません: "+ task.getOperation()); + } + } + task.setPreId(ctask.getCurrentId()); + task.setCurrentId(uuid); + } + + task.setUpdateTime(new Date()); + + // データベースに格納 + repository.save(task); + } + + public Task getTaskByMesh(String citycode, String meshcode) { + List tasks = repository.serchByMesh(citycode, meshcode); + for (Task t : tasks) { + return t; + } + return null; + } + + public List getTasks() { + return repository.findAll(); + } + +} diff --git a/src/main/java/osm/surveyor/task/city/model/CityPK.java b/src/main/java/osm/surveyor/task/city/model/CityPK.java deleted file mode 100644 index d432954..0000000 --- a/src/main/java/osm/surveyor/task/city/model/CityPK.java +++ /dev/null @@ -1,33 +0,0 @@ -package osm.surveyor.task.city.model; - -import java.io.Serializable; - -import javax.persistence.Embeddable; - -import lombok.Getter; -import lombok.Setter; - -@SuppressWarnings("serial") -@Getter -@Setter -@Embeddable -public class CityPK implements Serializable { - private String citycode; - - public CityPK() { - } - - public boolean equals(Object obj) { - if (obj instanceof CityPK) { - if (((CityPK)obj).getCitycode().equals(this.citycode)) { - return true; - } - } - return false; - } - - public int hashCode() { - String s = this.citycode; - return s.hashCode(); - } -} diff --git a/src/main/java/osm/surveyor/task/city/model/Tasks.java b/src/main/java/osm/surveyor/task/city/model/Tasks.java new file mode 100644 index 0000000..2851d71 --- /dev/null +++ b/src/main/java/osm/surveyor/task/city/model/Tasks.java @@ -0,0 +1,25 @@ +package osm.surveyor.task.city.model; + +import java.util.List; + +import lombok.Builder; +import lombok.Getter; + +/** + * レスポンス用クラス。 + */ +@Getter +@Builder +public class Tasks { + + private Result result; // 処理結果 + + private List tasks; // データ + + @Getter + @Builder + public static class Result { + private String message; // 処理結果メッセージ + private int count; // データ件数 + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d09573d..08d7896 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,4 +1,6 @@ +# i18n spring.messages.fallback-to-system-locale=false +spring.messages.basename=i18n/messages # DataSource spring.datasource.url=jdbc:h2:./taskdb @@ -12,5 +14,3 @@ spring.h2.console.settings.web-allow-others=true spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update - -spring.messages.basename=org/springframework/security/messages diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties new file mode 100644 index 0000000..38fe006 --- /dev/null +++ b/src/main/resources/i18n/messages.properties @@ -0,0 +1,27 @@ +mapper = Mapper +email = Email +role = role +osmid = OpenStreetMap userid +confirmationMessage = Registration has been completed with the following +register = Register +tasklist = Task list +typeMismatch.citycode = Must be 5 digit Number. +typeMismatch.lat = Must be Number. +typeMismatch.lng = Must be Number. +PREPARATION = Preparation +status = status +meshcode = meshcode +operation = operation +username = mapper +status = status +citycode = city code +cityname = city name +meshcode = mesh code +folder = folder +path = file +updateTime = update time + +download = download +return = return +reserve = task reserve +confirm = confirm diff --git a/src/main/resources/i18n/messages_ja.properties b/src/main/resources/i18n/messages_ja.properties new file mode 100644 index 0000000..2afd393 --- /dev/null +++ b/src/main/resources/i18n/messages_ja.properties @@ -0,0 +1,27 @@ +mapper = ユーザ登録 +email = メールアドレス +role = 役割 +osmid = OpenStreetMapのユーザID +confirmationMessage = 以下の内容で登録が完了しました。 +register = 登録 +tasklist = タスクリスト +typeMismatch.citycode = 5桁の数字が必須です +typeMismatch.lat = 数字を入力してください +typeMismatch.lng = 数字を入力してください +PREPARATION = 準備中 +status = ステータス +meshcode = 地域基準メッシュ +operation = タスク操作 +username = マッパー +status = ステータス +citycode = 自治体コード +cityname = 市町村 +meshcode = 地域メッシュ +folder = フォルダー +path = ファイル +updateTime = 更新日時 + +download = ダウンロード +return = 戻る +reserve = タスク登録 +confirm = 確定 \ No newline at end of file diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties deleted file mode 100644 index 10daa54..0000000 --- a/src/main/resources/messages.properties +++ /dev/null @@ -1,11 +0,0 @@ -mapper = Mapper -osmid = OpenStreetMap userid -confirmationMessage = Registration has been completed with the following -register = Register -tasklist = Task list -typeMismatch.citycode = Must be 5 digit Number. -typeMismatch.lat = Must be Number. -typeMismatch.lng = Must be Number. -PREPARATION = Preparation -status = status -meshcode = meshcode \ No newline at end of file diff --git a/src/main/resources/messages_ja.properties b/src/main/resources/messages_ja.properties deleted file mode 100644 index 4f0a860..0000000 --- a/src/main/resources/messages_ja.properties +++ /dev/null @@ -1,11 +0,0 @@ -mapper = ユーザ登録 -osmid = OpenStreetMapのユーザID -confirmationMessage = 以下の内容で登録が完了しました。 -register = 登録 -tasklist = タスクリスト -typeMismatch.citycode = 5桁の数字が必須です -typeMismatch.lat = 数字を入力してください -typeMismatch.lng = 数字を入力してください -PREPARATION = 準備中 -status = ステータス -meshcode = 地域基準メッシュ \ No newline at end of file diff --git a/src/main/resources/templates/cities.html b/src/main/resources/templates/cities.html index 43c5eba..39a7bec 100644 --- a/src/main/resources/templates/cities.html +++ b/src/main/resources/templates/cities.html @@ -52,10 +52,10 @@ - - - - + + + + @@ -67,8 +67,7 @@ diff --git a/src/main/resources/templates/list.html b/src/main/resources/templates/list.html index 44af72c..3e569ca 100644 --- a/src/main/resources/templates/list.html +++ b/src/main/resources/templates/list.html @@ -33,9 +33,9 @@ - - - + + + diff --git a/src/main/resources/templates/meshes.html b/src/main/resources/templates/meshes.html index dffe1a3..8479c6f 100644 --- a/src/main/resources/templates/meshes.html +++ b/src/main/resources/templates/meshes.html @@ -26,14 +26,13 @@
-
Plateau 3D都市データ
+
-
@@ -47,11 +46,11 @@
statuscitycodecitynamefolder
- - タスク +
#ユーザ名Email権限
- - + + - - + + @@ -61,9 +60,11 @@ diff --git a/src/main/resources/templates/task.html b/src/main/resources/templates/task.html index ceb682c..971e5c5 100644 --- a/src/main/resources/templates/task.html +++ b/src/main/resources/templates/task.html @@ -3,7 +3,9 @@ xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/layout}"> - + + + @@ -29,7 +31,7 @@
タスク登録
-
+
@@ -45,19 +47,19 @@
- +
- +
- +
@@ -65,14 +67,14 @@
- +
- +
@@ -80,9 +82,11 @@

+ + +
@@ -93,6 +97,6 @@
- + diff --git a/src/main/resources/templates/tasks.html b/src/main/resources/templates/tasks.html index 0b513f1..ff1e88c 100644 --- a/src/main/resources/templates/tasks.html +++ b/src/main/resources/templates/tasks.html @@ -55,9 +55,11 @@
ステータス地域メッシュ versionfileoperation
+ + + - - タスク +
+ + + - - 予約登録 + @@ -73,11 +75,11 @@ - - - - - + + + + +
ステータス自治体コードインポート実行者オペレーション更新日時