diff --git a/pom.xml b/pom.xml index 17dd167..91ac8a9 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.14 + 2.6.15 osm.surveyor.plateau @@ -32,7 +32,7 @@ spring-security-test test - + org.springframework.boot spring-boot-starter-thymeleaf diff --git a/src/main/java/osm/surveyor/task/city/DataLoader.java b/src/main/java/osm/surveyor/task/city/DataLoader.java index 0052bcd..b2b47d8 100644 --- a/src/main/java/osm/surveyor/task/city/DataLoader.java +++ b/src/main/java/osm/surveyor/task/city/DataLoader.java @@ -17,7 +17,7 @@ import osm.surveyor.task.city.model.CityJson; import osm.surveyor.task.city.model.Citymesh; import osm.surveyor.task.city.model.Status; -import osm.surveyor.task.city.model.Task; +import osm.surveyor.task.city.model.TaskEntity; import osm.surveyor.task.util.Geojson; import osm.surveyor.task.util.JsonFeature; import osm.surveyor.task.util.JsonGeometryPoint; @@ -85,7 +85,7 @@ mesh.setPoint(geometryPoint.getCoordinates().toString()); mesh.setCity(city); - Task task = taskService.getTaskByMesh(city.getCitycode(), meshcode); + TaskEntity task = (TaskEntity) taskService.getTaskByMesh(city.getCitycode(), meshcode); if (task == null) { Status status = city.getStatus(); if (status != null) { diff --git a/src/main/java/osm/surveyor/task/city/TaskController.java b/src/main/java/osm/surveyor/task/city/TaskController.java index 89e04a2..69281e3 100644 --- a/src/main/java/osm/surveyor/task/city/TaskController.java +++ b/src/main/java/osm/surveyor/task/city/TaskController.java @@ -27,7 +27,7 @@ import osm.surveyor.task.city.model.CitymeshPK; import osm.surveyor.task.city.model.Operation; import osm.surveyor.task.city.model.Status; -import osm.surveyor.task.city.model.Task; +import osm.surveyor.task.city.model.TaskEntity; @RequiredArgsConstructor @Controller @@ -67,7 +67,7 @@ Citymesh mesh = meshRepository.getById(pk); model.addAttribute("mesh", mesh); - List tasks = taskRepository.serchByMesh(citycode, meshcode); + List tasks = taskRepository.serchByMesh(citycode, meshcode); model.addAttribute("tasks", tasks); return "tasks"; } @@ -128,7 +128,7 @@ pk.setMeshcode(meshcode); Citymesh mesh = meshRepository.getById(pk); - Task pre = service.getTaskByMesh(citycode, meshcode); + TaskEntity pre = service.getTaskByMesh(citycode, meshcode); if (pre != null) { pre.setOperation(operation); pre.setStatus(nextStatus); @@ -138,7 +138,7 @@ else { // 既存Taskが無い場合は生成する String uuid = UUID.randomUUID().toString(); - Task task = new Task(); + TaskEntity task = new TaskEntity(); task.setCurrentId(uuid); task.setPreId(uuid); task.setCitycode(citycode); @@ -154,7 +154,7 @@ @PostMapping("/task/process") public String process(@AuthenticationPrincipal UserDetails user, - @Validated @ModelAttribute Task task, + @Validated @ModelAttribute TaskEntity task, BindingResult result) { if (result.hasErrors()) { @@ -175,12 +175,12 @@ @PostMapping("/admin/download") public String download(HttpServletResponse response) { try (OutputStream os = response.getOutputStream();) { - List list = taskRepository.findAll(); + List list = taskRepository.findAll(); StringBuffer sb = new StringBuffer(); boolean c1 = false; sb.append("["); sb.append(System.lineSeparator()); - for (Task task : list) { + for (TaskEntity task : list) { if (c1) { sb.append(","); } @@ -260,7 +260,7 @@ return exceptionHandler(e.getTask(), model); } - private String exceptionHandler(Task task, Model model) { + private String exceptionHandler(TaskEntity task, Model model) { if (task == null) { return "error"; } @@ -284,7 +284,7 @@ return nextPage(task); } - private String nextPage(Task task) { + private String nextPage(TaskEntity task) { if (task.getOperation() == Operation.OK) { return "task_done"; } diff --git a/src/main/java/osm/surveyor/task/city/TaskException.java b/src/main/java/osm/surveyor/task/city/TaskException.java index 51feb08..1796ee1 100644 --- a/src/main/java/osm/surveyor/task/city/TaskException.java +++ b/src/main/java/osm/surveyor/task/city/TaskException.java @@ -2,14 +2,14 @@ import lombok.Getter; import lombok.Setter; -import osm.surveyor.task.city.model.Task; +import osm.surveyor.task.city.model.TaskEntity; @Setter @Getter public class TaskException extends RuntimeException { private static final long serialVersionUID = 1L; - private Task task; + private TaskEntity task; public TaskException(String errorMessage) { super(errorMessage); diff --git a/src/main/java/osm/surveyor/task/city/TaskRepository.java b/src/main/java/osm/surveyor/task/city/TaskRepository.java index 80ddcf5..0af0f5a 100644 --- a/src/main/java/osm/surveyor/task/city/TaskRepository.java +++ b/src/main/java/osm/surveyor/task/city/TaskRepository.java @@ -5,12 +5,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import osm.surveyor.task.city.model.TaskEntity; -import osm.surveyor.task.city.model.Task; - -public interface TaskRepository extends JpaRepository { +public interface TaskRepository extends JpaRepository { - @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); + @Query("SELECT t FROM TaskEntity 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 index 0056760..295ed94 100644 --- a/src/main/java/osm/surveyor/task/city/TaskService.java +++ b/src/main/java/osm/surveyor/task/city/TaskService.java @@ -8,7 +8,7 @@ import osm.surveyor.task.city.model.CitymeshPK; import osm.surveyor.task.city.model.Operation; import osm.surveyor.task.city.model.Status; -import osm.surveyor.task.city.model.Task; +import osm.surveyor.task.city.model.TaskEntity; import javax.transaction.Transactional; @@ -26,7 +26,7 @@ @Autowired CitymeshRepository meshRepository; - public void add(Task task, UserDetails user) { + public void add(TaskEntity task, UserDetails user) { if (task.getOperation() == Operation.RESERVE) { task.setStatus(Status.EDITING); } @@ -52,7 +52,7 @@ pk.setMeshcode(task.getMeshcode()); Citymesh mesh = meshRepository.getById(pk); - Task ctask = getTaskByMesh(task.getCitycode(), task.getMeshcode()); + TaskEntity ctask = getTaskByMesh(task.getCitycode(), task.getMeshcode()); if (ctask == null) { task.setPreId(uuid); task.setCurrentId(uuid); @@ -63,34 +63,16 @@ e.setTask(task); throw e; } - if (task.getOperation() == Operation.RESERVE) { - if ((ctask.getStatus() != Status.ACCEPTING) && (ctask.getStatus() != Status.NG)) { - NotAcceptableException e = new NotAcceptableException("予約受付中ではないためタスク予約できませんでした : "+ task.getOperation()); - e.setTask(task); - throw e; - } - } - else if (task.getOperation() == Operation.CANCEL) { + if (task.getOperation() == Operation.CANCEL) { if (ctask.getStatus() != Status.EDITING) { NotAcceptableException e = new NotAcceptableException("タスクが'編集中'ではないため'編集取消'できませんでした : "+ task.getOperation()); e.setTask(task); throw e; } - if (!ctask.getUsername().equals(user.getUsername())) { - NotAcceptableException e = new NotAcceptableException("他のマッパーの'タスク'は'編集取消'できません"); - e.setTask(task); - throw e; - } } else if (task.getOperation() == Operation.OK) { // タスク予約していなくてもインポートできる // 他のマッパーが予約していてもインポート可能 - if (ctask.getStatus() == Status.PREPARATION) { - NotAcceptableException e = new NotAcceptableException("準備中のため登録できませんでした"); - e.setTask(task); - throw e; - } - String changeset = task.getChangeSet(); if (changeset == null) { TaskException e = new TaskException("変更セットNoが入力されていません"); @@ -134,15 +116,15 @@ meshRepository.save(mesh); } - public Task getTaskByMesh(String citycode, String meshcode) { - List tasks = repository.serchByMesh(citycode, meshcode); - for (Task t : tasks) { + public TaskEntity getTaskByMesh(String citycode, String meshcode) { + List tasks = repository.serchByMesh(citycode, meshcode); + for (TaskEntity t : tasks) { return t; } return null; } - public List getTasks() { + public List getTasks() { return repository.findAll(); } } diff --git a/src/main/java/osm/surveyor/task/city/model/Operation.java b/src/main/java/osm/surveyor/task/city/model/Operation.java index 9b4cb59..e36d737 100644 --- a/src/main/java/osm/surveyor/task/city/model/Operation.java +++ b/src/main/java/osm/surveyor/task/city/model/Operation.java @@ -11,5 +11,6 @@ CANCEL, // 編集取消 NG, // 編集[NG] OK, // 編集完了 - VIEW // 参照 + VIEW, // 参照 + RESERVE_CANCEL // 予約取消 } diff --git a/src/main/java/osm/surveyor/task/city/model/Status.java b/src/main/java/osm/surveyor/task/city/model/Status.java index 46a57f0..8dae868 100644 --- a/src/main/java/osm/surveyor/task/city/model/Status.java +++ b/src/main/java/osm/surveyor/task/city/model/Status.java @@ -1,9 +1,10 @@ package osm.surveyor.task.city.model; public enum Status { - PREPARATION, // preparation 準備中 "X" - ACCEPTING, // Accepting 受付中 "1" - EDITING, // 編集待ち "2" - NG, // 検証(NG) "0" - OK // 完了 "4" + PREPARATION, // 1: preparation 準備中 "X" + ACCEPTING, // 2: Accepting 受付中 "1" + EDITING, // 4: 編集待ち "2" + RESERVED, // 3: Reserved 予約済み "3" + NG, // 5: 検証(NG) "0" + OK // 6: 完了 "4" } diff --git a/src/main/java/osm/surveyor/task/city/model/Task.java b/src/main/java/osm/surveyor/task/city/model/Task.java deleted file mode 100644 index e6ea582..0000000 --- a/src/main/java/osm/surveyor/task/city/model/Task.java +++ /dev/null @@ -1,103 +0,0 @@ -package osm.surveyor.task.city.model; - -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import javax.validation.constraints.NotBlank; - -import org.springframework.format.annotation.NumberFormat; - -import com.fasterxml.jackson.databind.JsonNode; - -import lombok.Getter; -import lombok.Setter; -import osm.surveyor.task.util.JsonTemple; - -@Getter -@Setter -@Entity -public class Task extends JsonTemple { - - @Id - @Column(name = "current_id") - private String currentId; - - @NotBlank - @Column(name = "pre_id") - private String preId; - - @NumberFormat - private String citycode; // CitymeshPK.citycode - - @NumberFormat - private String meshcode; // CitymeshPK.meshcode - - @ManyToOne - Citymesh mesh; // リレーション: to Citymesh 多対1 - - /** - * ステータス - */ - @Enumerated(EnumType.STRING) - private Status status = Status.PREPARATION; - - /** - * 編集者 - */ - private String username; - - /** - * 変更セットNo - */ - @NumberFormat - @Column(name = "changeset") - private String changeSet; - - /** - * コメント - */ - private String comment; - - /** - * 操作内容 - */ - @Enumerated(EnumType.ORDINAL) - private Operation operation = Operation.NOP; - - /** - * 更新日時 - */ - @Temporal(TemporalType.TIMESTAMP) - Date updateTime; - - @Override - public String toString() { - StringBuffer sb = new StringBuffer(); - boolean c1 = false; - sb.append("{"); - c1 = outStr(c1, sb, "currentId", this.getCurrentId()); - c1 = outStr(c1, sb, "preId", this.getPreId()); - c1 = outStr(c1, sb, "citycode", this.getCitycode()); - c1 = outStr(c1, sb, "meshcode", this.getMeshcode()); - c1 = outStr(c1, sb, "status", this.getStatus().toString()); - c1 = outStr(c1, sb, "username", this.getUsername()); - c1 = outStr(c1, sb, "changeSet", this.getChangeSet()); - c1 = outStr(c1, sb, "comment", this.getComment()); - c1 = outStr(c1, sb, "operation", this.getOperation().toString()); - c1 = outStr(c1, sb, "updateTime", (this.getUpdateTime() == null ? "" : this.getUpdateTime().toString())); - sb.append("}"); - return sb.toString(); - } - - @Override - public void parse(JsonNode node) { - // TODO - } -} diff --git a/src/main/java/osm/surveyor/task/city/model/TaskEntity.java b/src/main/java/osm/surveyor/task/city/model/TaskEntity.java new file mode 100644 index 0000000..5a6d031 --- /dev/null +++ b/src/main/java/osm/surveyor/task/city/model/TaskEntity.java @@ -0,0 +1,103 @@ +package osm.surveyor.task.city.model; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.validation.constraints.NotBlank; + +import org.springframework.format.annotation.NumberFormat; + +import com.fasterxml.jackson.databind.JsonNode; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import osm.surveyor.task.util.JsonTemple; + +@Data +@EqualsAndHashCode(callSuper=false) +@Entity +public class TaskEntity extends JsonTemple { + + @Id + @Column(name = "current_id") + private String currentId; + + @NotBlank + @Column(name = "pre_id") + private String preId; + + @NumberFormat + private String citycode; // CitymeshPK.citycode + + @NumberFormat + private String meshcode; // CitymeshPK.meshcode + + @ManyToOne + Citymesh mesh; // リレーション: to Citymesh 多対1 + + /** + * ステータス + */ + @Enumerated(EnumType.STRING) + private Status status = Status.PREPARATION; + + /** + * 編集者 + */ + private String username; + + /** + * 変更セットNo + */ + @NumberFormat + @Column(name = "changeset") + private String changeSet; + + /** + * コメント + */ + private String comment; + + /** + * 操作内容 + */ + @Enumerated(EnumType.ORDINAL) + private Operation operation = Operation.NOP; + + /** + * 更新日時 + */ + @Temporal(TemporalType.TIMESTAMP) + Date updateTime; + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + boolean c1 = false; + sb.append("{"); + c1 = outStr(c1, sb, "currentId", this.getCurrentId()); + c1 = outStr(c1, sb, "preId", this.getPreId()); + c1 = outStr(c1, sb, "citycode", this.getCitycode()); + c1 = outStr(c1, sb, "meshcode", this.getMeshcode()); + c1 = outStr(c1, sb, "status", this.getStatus().toString()); + c1 = outStr(c1, sb, "username", this.getUsername()); + c1 = outStr(c1, sb, "changeSet", this.getChangeSet()); + c1 = outStr(c1, sb, "comment", this.getComment()); + c1 = outStr(c1, sb, "operation", this.getOperation().toString()); + c1 = outStr(c1, sb, "updateTime", (this.getUpdateTime() == null ? "" : this.getUpdateTime().toString())); + sb.append("}"); + return sb.toString(); + } + + @Override + public void parse(JsonNode node) { + // TODO + } +} diff --git a/src/main/java/osm/surveyor/task/city/model/TaskStatusEntity.java b/src/main/java/osm/surveyor/task/city/model/TaskStatusEntity.java new file mode 100644 index 0000000..06880bd --- /dev/null +++ b/src/main/java/osm/surveyor/task/city/model/TaskStatusEntity.java @@ -0,0 +1,40 @@ +package osm.surveyor.task.city.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "task_status") +public class TaskStatusEntity { + + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + private Integer status_code; + + @Column(name = "status", nullable = false) + private String status; + + @Column(name = "is_reserve", nullable = false) + private Boolean isReserve; + + @Column(name = "is_reserve_cancel", nullable = false) + private Boolean isReserveCancel; + + @Column(name = "is_edit_ok", nullable = false) + private Boolean isEditOk; + + @Column(name = "is_edit_ng", nullable = false) + private Boolean isEditNg; + +} diff --git a/src/main/java/osm/surveyor/task/city/model/Tasks.java b/src/main/java/osm/surveyor/task/city/model/Tasks.java index 2851d71..c001f85 100644 --- a/src/main/java/osm/surveyor/task/city/model/Tasks.java +++ b/src/main/java/osm/surveyor/task/city/model/Tasks.java @@ -14,7 +14,7 @@ private Result result; // 処理結果 - private List tasks; // データ + private List tasks; // データ @Getter @Builder diff --git a/src/main/resources/database.sql b/src/main/resources/database.sql new file mode 100644 index 0000000..e4ac904 --- /dev/null +++ b/src/main/resources/database.sql @@ -0,0 +1,6 @@ +-- insert into task_status (status_code, status, is_reserve, is_reserve_cancel, is_edit_ok, is_edit_ng) values (1, 'PREPARATION', false,false,false,false); +-- insert into task_status (status_code, status, is_reserve, is_reserve_cancel, is_edit_ok, is_edit_ng) values (2, 'ACCEPTING', true,false,true,true); +-- insert into task_status (status_code, status, is_reserve, is_reserve_cancel, is_edit_ok, is_edit_ng) values (3, 'RESERVED', false,true,true,true); +-- insert into task_status (status_code, status, is_reserve, is_reserve_cancel, is_edit_ok, is_edit_ng) values (4, 'EDITING', false,false,true,true); +-- insert into task_status (status_code, status, is_reserve, is_reserve_cancel, is_edit_ok, is_edit_ng) values (5, 'NG', false,false,true,true); +-- insert into task_status (status_code, status, is_reserve, is_reserve_cancel, is_edit_ok, is_edit_ng) values (6, 'OK', false,false,true,true); diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index 3459ea0..229c5e7 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -12,6 +12,9 @@ # status PREPARATION = Preparation +ACCEPTING = ACCEPTING +RESERVED = RESERVED + # Task items meshcode = meshcode @@ -35,5 +38,5 @@ reserve = task reserve cancel = cancel done = done -NG = Validation(NG) -OK = Validation(OK) +NG = EDIT(NG) +OK = EDIT(OK) diff --git a/src/main/resources/i18n/messages_ja.properties b/src/main/resources/i18n/messages_ja.properties index 722d8a0..df6c9c2 100644 --- a/src/main/resources/i18n/messages_ja.properties +++ b/src/main/resources/i18n/messages_ja.properties @@ -12,6 +12,9 @@ # status PREPARATION = 準備中 +ACCEPTING = 受付中 +RESERVED = 予約済み + # Task items meshcode = 地域基準メッシュ @@ -31,7 +34,8 @@ # operation download = ダウンロード return = 戻る -reserve = 編集者登録 -cancel = 編集取消 +reserve = 編集予約 +cancel = 予約取消 +done = done NG = 編集(NG) -OK = 編集完了 +OK = 編集(OK) diff --git a/src/main/resources/static/css/app.css b/src/main/resources/static/css/app.css index 450b4c6..c2ae19d 100644 --- a/src/main/resources/static/css/app.css +++ b/src/main/resources/static/css/app.css @@ -64,6 +64,11 @@ background-color: #224abe; } +.btn-gray { + color: white; + background-color: #a9a9a9; +} + .btn-navy:hover { color: white; background-color: #0d47a1; diff --git a/src/main/resources/templates/tasks.html b/src/main/resources/templates/tasks.html index 0025551..70e54c3 100644 --- a/src/main/resources/templates/tasks.html +++ b/src/main/resources/templates/tasks.html @@ -66,7 +66,7 @@ - +