Newer
Older
task-bldg / src / main / java / osm / surveyor / task / city / TaskController.java
@haya4 haya4 on 26 Sep 2023 8 KB fix : Task.html
  1. package osm.surveyor.task.city;
  2.  
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import java.util.List;
  6. import java.util.UUID;
  7.  
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.http.HttpStatus;
  12. import org.springframework.stereotype.Controller;
  13. import org.springframework.ui.Model;
  14. import org.springframework.validation.BindingResult;
  15. import org.springframework.validation.annotation.Validated;
  16. import org.springframework.web.bind.annotation.ExceptionHandler;
  17. import org.springframework.web.bind.annotation.GetMapping;
  18. import org.springframework.web.bind.annotation.ModelAttribute;
  19. import org.springframework.web.bind.annotation.PostMapping;
  20. import org.springframework.web.bind.annotation.RequestParam;
  21.  
  22. import com.fasterxml.jackson.core.JsonProcessingException;
  23. import com.fasterxml.jackson.databind.ObjectMapper;
  24.  
  25. import lombok.RequiredArgsConstructor;
  26. import osm.surveyor.task.city.model.City;
  27. import osm.surveyor.task.city.model.Citymesh;
  28. import osm.surveyor.task.city.model.CitymeshPK;
  29. import osm.surveyor.task.city.model.Operation;
  30. import osm.surveyor.task.city.model.Status;
  31. import osm.surveyor.task.city.model.TaskEntity;
  32.  
  33. @RequiredArgsConstructor
  34. @Controller
  35. public class TaskController {
  36. private final CityRepository cityRepository;
  37. private final CitymeshRepository meshRepository;
  38. private final TaskRepository taskRepository;
  39. @Autowired
  40. private TaskService service;
  41. /**
  42. * ログインユーザーが関係しているTASKリスト
  43. * @param model
  44. * @return
  45. */
  46. @GetMapping("/tasks")
  47. public String showList(Model model,
  48. @RequestParam(name="citycode") String citycode,
  49. @RequestParam(name="meshcode") String meshcode)
  50. {
  51. City city = cityRepository.findByCitycode(citycode);
  52. model.addAttribute("citycode", citycode);
  53. model.addAttribute("cityname", city.getCityname());
  54. model.addAttribute("meshcode", meshcode);
  55. model.addAttribute("site", city.getSite());
  56. Citymesh mesh = meshRepository.findOne(citycode,meshcode);
  57. model.addAttribute("mesh", mesh);
  58. String meshstr = "{}";
  59. try {
  60. ObjectMapper objectMapper = new ObjectMapper();
  61. meshstr = objectMapper.writeValueAsString(mesh);
  62. } catch (JsonProcessingException e) {
  63. e.printStackTrace();
  64. }
  65. model.addAttribute("meshstr", meshstr);
  66. model.addAttribute("mesh", mesh);
  67. String citystr = "{}";
  68. try {
  69. ObjectMapper objectMapper = new ObjectMapper();
  70. citystr = objectMapper.writeValueAsString(city);
  71. } catch (JsonProcessingException e) {
  72. e.printStackTrace();
  73. }
  74. model.addAttribute("citystr", citystr);
  75. List<TaskEntity> tasks = taskRepository.serchByMesh(citycode, meshcode);
  76. model.addAttribute("tasks", tasks);
  77. return "tasks";
  78. }
  79.  
  80. /**
  81. * 「タスク操作」
  82. * @param citycode
  83. * @param meshcode
  84. * @param task
  85. * @return
  86. */
  87. @GetMapping("/task/add")
  88. public String addTask(Model model,
  89. @RequestParam(name="op") String op,
  90. @RequestParam(name="citycode") String citycode,
  91. @RequestParam(name="meshcode") String meshcode)
  92. {
  93. String next = "task";
  94. Operation operation = Operation.NOP;
  95. Status nextStatus = Status.PREPARATION;
  96. if (op.equals(Operation.RESERVE.toString())) {
  97. model.addAttribute("command", "編集者登録");
  98. operation = Operation.RESERVE;
  99. nextStatus = Status.RESERVED;
  100. }
  101. else if (op.equals(Operation.CANCEL.toString())) {
  102. model.addAttribute("command", "編集取消");
  103. operation = Operation.CANCEL;
  104. nextStatus = Status.ACCEPTING;
  105. }
  106. else if (op.equals(Operation.OK.toString())) {
  107. model.addAttribute("command", "編集完了");
  108. operation = Operation.OK;
  109. nextStatus = Status.OK;
  110. next = "task_done";
  111. }
  112. else if (op.equals(Operation.NG.toString())) {
  113. model.addAttribute("command", "編集(NG)");
  114. operation = Operation.NG;
  115. nextStatus = Status.ACCEPTING;
  116. }
  117.  
  118. City city = cityRepository.getById(citycode);
  119. model.addAttribute("citycode", citycode);
  120. model.addAttribute("cityname", city.getCityname());
  121. model.addAttribute("meshcode", meshcode);
  122. CitymeshPK pk = new CitymeshPK();
  123. pk.setCitycode(citycode);
  124. pk.setMeshcode(meshcode);
  125. Citymesh mesh = meshRepository.getById(pk);
  126. TaskEntity pre = service.getTaskByMesh(citycode, meshcode);
  127. if (pre != null) {
  128. pre.setOperation(operation);
  129. pre.setStatus(nextStatus);
  130. model.addAttribute("task", pre);
  131. return next;
  132. }
  133. else {
  134. // 既存Taskが無い場合は生成する
  135. String uuid = UUID.randomUUID().toString();
  136. TaskEntity task = new TaskEntity();
  137. task.setCurrentId(uuid);
  138. task.setPreId(uuid);
  139. task.setCitycode(citycode);
  140. task.setMeshcode(meshcode);
  141. task.setMesh(mesh);
  142. task.setStatus(nextStatus);
  143. task.setUsername("");
  144. task.setOperation(operation);
  145. model.addAttribute("task", task);
  146. return next;
  147. }
  148. }
  149. @PostMapping("/task/process")
  150. public String process(@Validated @ModelAttribute TaskEntity task,
  151. BindingResult result)
  152. {
  153. if (result.hasErrors()) {
  154. // エラーがある場合
  155. return nextPage(task);
  156. }
  157. service.add(task);
  158. return "redirect:/tasks?citycode="+ task.getCitycode() +"&meshcode="+ task.getMeshcode();
  159. }
  160. @GetMapping("/admin")
  161. public String admin()
  162. {
  163. return "admin";
  164. }
  165.  
  166. @PostMapping("/admin/download")
  167. public String download(HttpServletResponse response) {
  168. try (OutputStream os = response.getOutputStream();) {
  169. List<TaskEntity> list = taskRepository.findAll();
  170. StringBuffer sb = new StringBuffer();
  171. boolean c1 = false;
  172. sb.append("[");
  173. sb.append(System.lineSeparator());
  174. for (TaskEntity task : list) {
  175. if (c1) {
  176. sb.append(",");
  177. }
  178. else {
  179. c1 = true;
  180. }
  181. sb.append(task.toString());
  182. sb.append(System.lineSeparator());
  183. }
  184. sb.append("]");
  185. byte[] fb1 = String.valueOf(sb).getBytes();
  186.  
  187. response.setContentType("application/octet-stream");
  188. response.setHeader("Content-Disposition", "attachment; filename="+ "task-bldg.json");
  189. response.setContentLength(fb1.length);
  190. os.write(fb1);
  191. os.flush();
  192. } catch (IOException e) {
  193. e.printStackTrace();
  194. }
  195. return null;
  196. }
  197. /**
  198. * 400 Bad Request
  199. *
  200. * @param e
  201. * @param model
  202. * @param citycode
  203. * @param meshcode
  204. * @return
  205. */
  206. @ExceptionHandler(TaskException.class)
  207. public String taskExceptionHandler(TaskException e, Model model)
  208. {
  209. model.addAttribute("error", "400 Bad Request");
  210. model.addAttribute("message", e.getMessage());
  211. model.addAttribute("status", HttpStatus.BAD_REQUEST);
  212. return exceptionHandler(e.getTask(), model);
  213. }
  214.  
  215. /**
  216. * 406 Not Acceptable
  217. * "ACCEPTIONGではないため予約できません"
  218. *
  219. * @param e
  220. * @param model
  221. * @param citycode
  222. * @param meshcode
  223. * @return
  224. */
  225. @ExceptionHandler(NotAcceptableException.class)
  226. public String notAcceptableExceptionHandler(NotAcceptableException e, Model model)
  227. {
  228. model.addAttribute("error", "406 Not Acceptable");
  229. model.addAttribute("message", e.getMessage());
  230. model.addAttribute("status", HttpStatus.NOT_ACCEPTABLE);
  231. return exceptionHandler(e.getTask(), model);
  232. }
  233.  
  234. /**
  235. * 409 Conflict
  236. * "タスクが変更されたため更新できません"
  237. *
  238. * @param e
  239. * @param model
  240. * @param citycode
  241. * @param meshcode
  242. * @return
  243. */
  244. @ExceptionHandler(ConflictException.class)
  245. public String conflictExceptionHandler(ConflictException e, Model model)
  246. {
  247. model.addAttribute("error", "409 Conflict");
  248. model.addAttribute("message", e.getMessage());
  249. model.addAttribute("status", HttpStatus.CONFLICT);
  250. return exceptionHandler(e.getTask(), model);
  251. }
  252. private String exceptionHandler(TaskEntity task, Model model) {
  253. if (task == null) {
  254. return "error";
  255. }
  256. if (task.getOperation() == Operation.RESERVE) {
  257. model.addAttribute("command", "タスク予約");
  258. }
  259. else if (task.getOperation() == Operation.CANCEL) {
  260. model.addAttribute("command", "タスク予約取消");
  261. }
  262. else if (task.getOperation() == Operation.OK) {
  263. model.addAttribute("command", "編集済み");
  264. }
  265. else if (task.getOperation() == Operation.NG) {
  266. model.addAttribute("command", "編集(NG)");
  267. }
  268. model.addAttribute("citycode", task.getCitycode());
  269. model.addAttribute("meshcode", task.getMeshcode());
  270. model.addAttribute("task", task);
  271. return nextPage(task);
  272. }
  273. private String nextPage(TaskEntity task) {
  274. if (task.getOperation() == Operation.OK) {
  275. return "task_done";
  276. }
  277. return "task";
  278. }
  279. }