Explorar o código

add weekly plan api

Feick %!s(int64=4) %!d(string=hai) anos
pai
achega
c90769413e
Modificáronse 21 ficheiros con 837 adicións e 8 borrados
  1. 10 2
      src/main/kotlin/com/yaoxiang/planning/action/AnnualAction.kt
  2. 8 0
      src/main/kotlin/com/yaoxiang/planning/action/DepartmentAction.kt
  3. 9 0
      src/main/kotlin/com/yaoxiang/planning/action/OpenAction.kt
  4. 32 0
      src/main/kotlin/com/yaoxiang/planning/action/PlanningItemAction.kt
  5. 44 1
      src/main/kotlin/com/yaoxiang/planning/action/QuarterlyAction.kt
  6. 4 0
      src/main/kotlin/com/yaoxiang/planning/action/TestAction.kt
  7. 25 0
      src/main/kotlin/com/yaoxiang/planning/action/UserAction.kt
  8. 45 1
      src/main/kotlin/com/yaoxiang/planning/action/WeeklyAction.kt
  9. 2 1
      src/main/kotlin/com/yaoxiang/planning/config/SwaggerConfig.kt
  10. 4 0
      src/main/kotlin/com/yaoxiang/planning/domain/BaseLongEntity.kt
  11. 3 0
      src/main/kotlin/com/yaoxiang/planning/domain/QuarterlyPlan.kt
  12. 3 0
      src/main/kotlin/com/yaoxiang/planning/domain/WeeklyPlan.kt
  13. 6 1
      src/main/kotlin/com/yaoxiang/planning/repository/QuarterlyPlanRepo.kt
  14. 4 1
      src/main/kotlin/com/yaoxiang/planning/repository/WeeklyPlanRepo.kt
  15. 6 1
      src/main/kotlin/com/yaoxiang/planning/service/AnnualPlanService.kt
  16. 31 0
      src/main/kotlin/com/yaoxiang/planning/service/PlanningItemService.kt
  17. 63 0
      src/main/kotlin/com/yaoxiang/planning/service/QuarterlyPlanService.kt
  18. 16 0
      src/main/kotlin/com/yaoxiang/planning/service/UserService.kt
  19. 53 0
      src/main/kotlin/com/yaoxiang/planning/service/WeeklyPlanService.kt
  20. 205 0
      src/main/kotlin/com/yaoxiang/planning/utils/DateUtil.java
  21. 264 0
      src/main/kotlin/com/yaoxiang/planning/utils/TimeUtil.kt

+ 10 - 2
src/main/kotlin/com/yaoxiang/planning/action/AnnualAction.kt

@@ -11,10 +11,12 @@ import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.web.bind.annotation.GetMapping
 import org.springframework.web.bind.annotation.PostMapping
 import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
 import org.thymeleaf.util.DateUtils
 import java.util.*
 
 @Api(tags = ["年度计划"])
+@RestController
 @RequestMapping("annual")
 class AnnualAction {
 
@@ -37,8 +39,8 @@ class AnnualAction {
             ApiImplicitParam(name = "content", value = "计划内容", paramType = "query"),
             ApiImplicitParam(name = "year", value = "年份", paramType = "query"))
     @PostMapping("update")
-    fun update(id: Long, name: String, content: String, status: Int): Reply<Any> {
-        val result = annualPlanService.update(id, name, content, status)
+    fun update(id: Long, name: String, content: String, year: Int, status: Int): Reply<Any> {
+        val result = annualPlanService.update(id, name, content, year, status)
         return Reply(result)
     }
 
@@ -61,4 +63,10 @@ class AnnualAction {
         return Reply.ok(list)
     }
 
+    @ApiOperation("评价")
+    @PostMapping("evaluate")
+    fun evaluate(id: Long, evaluate: String): Reply<Any> {
+        val result = annualPlanService.evaluate(id, evaluate)
+        return Reply(result)
+    }
 }

+ 8 - 0
src/main/kotlin/com/yaoxiang/planning/action/DepartmentAction.kt

@@ -1,15 +1,23 @@
 package com.yaoxiang.planning.action
 
+import com.yaoxiang.planning.model.Reply
 import com.yaoxiang.planning.service.DepartmentService
 import io.swagger.annotations.Api
 import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.web.bind.annotation.GetMapping
 import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
 
 @Api(tags = ["部门"])
+@RestController
 @RequestMapping("department")
 class DepartmentAction {
 
     @Autowired
     private lateinit var departmentService: DepartmentService
 
+    @GetMapping("hello")
+    fun hello(): Reply<Any> {
+        return Reply.ok()
+    }
 }

+ 9 - 0
src/main/kotlin/com/yaoxiang/planning/action/OpenAction.kt

@@ -1,15 +1,24 @@
 package com.yaoxiang.planning.action
 
+import com.yaoxiang.planning.model.Reply
 import com.yaoxiang.planning.service.OpenService
 import io.swagger.annotations.Api
 import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.web.bind.annotation.GetMapping
 import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
 
 @Api(tags = ["开放接口"])
+@RestController
 @RequestMapping("open")
 class OpenAction {
 
     @Autowired
     private lateinit var openService: OpenService
 
+    @GetMapping("hello")
+    fun open(): Reply<Any> {
+        return Reply.ok();
+    }
+
 }

+ 32 - 0
src/main/kotlin/com/yaoxiang/planning/action/PlanningItemAction.kt

@@ -4,12 +4,17 @@ import com.yaoxiang.planning.domain.PlanningItem
 import com.yaoxiang.planning.model.Reply
 import com.yaoxiang.planning.service.PlanningItemService
 import io.swagger.annotations.Api
+import io.swagger.annotations.ApiImplicitParam
+import io.swagger.annotations.ApiImplicitParams
+import io.swagger.annotations.ApiOperation
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.web.bind.annotation.PostMapping
 import org.springframework.web.bind.annotation.RequestBody
 import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
 
 @Api(tags = ["分计划"])
+@RestController
 @RequestMapping("planningItem")
 class PlanningItemAction {
 
@@ -17,6 +22,7 @@ class PlanningItemAction {
     private lateinit var planningItemService: PlanningItemService
 
     @PostMapping("addItem")
+    @ApiOperation("增加分计划")
     fun addItem(@RequestBody item: PlanningItem): Reply<Any> {
         val result = planningItemService.addItem(item)
         return Reply(result)
@@ -28,4 +34,30 @@ class PlanningItemAction {
         return Reply(result)
     }
 
+    @PostMapping("findByPlanningIdAndType")
+    fun findByPlanningIdAndType(planningId: Long, type: Int): Reply<List<PlanningItem>> {
+        val result = planningItemService.findByPlanningIdAndType(planningId, type)
+        return Reply.ok(result)
+    }
+
+    @PostMapping("deleteItem")
+    fun deleteItem(id: Long): Reply<Any> {
+        val result = planningItemService.deleteItem(id)
+        return Reply(result)
+    }
+
+    @PostMapping("deleteItems")
+    fun deleteItems(@RequestBody ids: List<Long>): Reply<Any> {
+        val result = planningItemService.deleteItems(ids)
+        return Reply(result)
+    }
+
+    @PostMapping("deleteByPlanningIdAndType")
+    @ApiImplicitParams(ApiImplicitParam(name = "planningId", value = "计划Id", paramType = "query"),
+            ApiImplicitParam(name = "type", value = "计划类型", paramType = "query"))
+    fun deleteItem(planningId: Long, type: Int): Reply<Any> {
+        val result = planningItemService.deleteByPlanningIdAndType(planningId, type)
+        return Reply(result)
+    }
+
 }

+ 44 - 1
src/main/kotlin/com/yaoxiang/planning/action/QuarterlyAction.kt

@@ -1,15 +1,58 @@
 package com.yaoxiang.planning.action
 
+import com.yaoxiang.planning.domain.QuarterlyPlan
+import com.yaoxiang.planning.model.Reply
 import com.yaoxiang.planning.service.QuarterlyPlanService
 import io.swagger.annotations.Api
+import io.swagger.annotations.ApiImplicitParam
+import io.swagger.annotations.ApiImplicitParams
+import io.swagger.annotations.ApiOperation
 import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.*
+import org.thymeleaf.util.DateUtils
+import java.util.*
 
 @Api(tags = ["季度计划"])
+@RestController
 @RequestMapping("quarterly")
 class QuarterlyAction {
 
     @Autowired
     private lateinit var quarterlyPlanService: QuarterlyPlanService
 
+    @ApiOperation("添加季度计划")
+    @ApiImplicitParams(ApiImplicitParam(name = "name", value = "名称", paramType = "query"),
+            ApiImplicitParam(name = "content", value = "计划内容", paramType = "query"),
+            ApiImplicitParam(name = "year", value = "年份", paramType = "query"),
+            ApiImplicitParam(name = "quarter", value = "季度", paramType = "query"))
+    @PostMapping("add")
+    fun add(name: String, content: String, year: Int, quarter: Int): Reply<Any> {
+        val result = quarterlyPlanService.add(name, content, year, quarter)
+        return Reply(result)
+    }
+
+    @ApiOperation("更新季度计划")
+    @PostMapping("update")
+    fun update(id: Long, name: String, content: String, year: Int, quarter: Int, status: Int): Reply<Any> {
+        val result = quarterlyPlanService.update(id, name, content, year, quarter, status)
+        return Reply(result)
+    }
+
+    @ApiOperation("删除季度计划")
+    @PostMapping("delete")
+    fun delete(id: Long): Reply<Any> {
+        val result = quarterlyPlanService.delete(id);
+        return Reply(result);
+    }
+
+    @ApiOperation("获取季度计划")
+    @ApiImplicitParam(name = "yar", value = "year", paramType = "query")
+    @GetMapping("list")
+    fun list(@RequestParam(required = false) year: Int? = null): Reply<List<QuarterlyPlan>> {
+        val y: Int = year ?: DateUtils.year(Date())
+        val result = quarterlyPlanService.list(y)
+        return Reply.ok(result)
+    }
+
+
 }

+ 4 - 0
src/main/kotlin/com/yaoxiang/planning/action/TestAction.kt

@@ -2,13 +2,17 @@ package com.yaoxiang.planning.action
 
 import com.yaoxiang.planning.model.Reply
 import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
 import org.springframework.web.bind.annotation.GetMapping
 import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
 
 @Api(tags = ["Test"])
+@RestController
 @RequestMapping("test")
 class TestAction {
 
+    @ApiOperation("hello")
     @GetMapping("hello")
     fun hello(): Reply<String> {
         return Reply.ok("hello world")

+ 25 - 0
src/main/kotlin/com/yaoxiang/planning/action/UserAction.kt

@@ -1,15 +1,40 @@
 package com.yaoxiang.planning.action
 
+import com.yaoxiang.planning.domain.UserInfo
+import com.yaoxiang.planning.model.Reply
 import com.yaoxiang.planning.service.UserService
 import io.swagger.annotations.Api
+import io.swagger.annotations.ApiOperation
 import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.web.bind.annotation.GetMapping
 import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
 
 @Api(tags = ["用户"])
+@RestController
 @RequestMapping("user")
 class UserAction {
 
     @Autowired
     private lateinit var userService: UserService
 
+    @ApiOperation("当前用户id")
+    @GetMapping("curId")
+    fun currentUserId(): Reply<Long?> {
+        val result = userService.currentUserId()
+        return Reply.ok(result)
+    }
+
+    @ApiOperation("当前用户")
+    @GetMapping("cur")
+    fun currentUser(): Reply<UserInfo> {
+        val result = userService.currentUser()
+        if (result != null) {
+            result.salt = null
+            result.password = null
+        }
+        return Reply.ok(result)
+    }
+
+
 }

+ 45 - 1
src/main/kotlin/com/yaoxiang/planning/action/WeeklyAction.kt

@@ -1,15 +1,59 @@
 package com.yaoxiang.planning.action
 
+import com.yaoxiang.planning.domain.WeeklyPlan
+import com.yaoxiang.planning.model.Reply
 import com.yaoxiang.planning.service.WeeklyPlanService
 import io.swagger.annotations.Api
+import io.swagger.annotations.ApiImplicitParam
+import io.swagger.annotations.ApiImplicitParams
+import io.swagger.annotations.ApiOperation
 import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.*
+import org.thymeleaf.util.DateUtils
+import java.util.*
 
 @Api(tags = ["周计划"])
+@RestController
 @RequestMapping("weekly")
 class WeeklyAction {
 
     @Autowired
     private lateinit var weeklyPlanService: WeeklyPlanService
 
+    @ApiOperation("添加季度计划")
+    @ApiImplicitParams(ApiImplicitParam(name = "name", value = "名称", paramType = "query"),
+            ApiImplicitParam(name = "content", value = "计划内容", paramType = "query"),
+            ApiImplicitParam(name = "startTime", value = "计划时间", paramType = "query"),
+            ApiImplicitParam(name = "year", value = "年份", paramType = "query"))
+    @PostMapping("add")
+    fun add(name: String, content: String,
+            @RequestParam(required = false) userId: Long?,
+            @RequestParam(required = false) startTime: Long? = null): Reply<Any> {
+        val start = startTime ?: System.currentTimeMillis()
+        val year = DateUtils.year(Date(start))
+        weeklyPlanService.add(name, content, userId, start, year)
+        return Reply.ok()
+    }
+
+    @ApiOperation("更新周计划")
+    @PostMapping("update")
+    fun update(id: Long, name: String, content: String, startTime: Long, status: Int): Reply<Any> {
+        val year = DateUtils.year(Date(startTime))
+        val result = weeklyPlanService.update(id, name, content, startTime, year, status)
+        return Reply(result)
+    }
+
+    @ApiOperation("删除周计划")
+    @PostMapping("delete")
+    fun delete(id: Long): Reply<Any> {
+        val result = weeklyPlanService.delete(id)
+        return Reply(result)
+    }
+
+    @GetMapping("list")
+    fun list(startTime: Long?): Reply<List<WeeklyPlan>> {
+        val start = startTime ?: System.currentTimeMillis()
+        val result = weeklyPlanService.findByStartTime(start)
+        return Reply.ok(result)
+    }
 }

+ 2 - 1
src/main/kotlin/com/yaoxiang/planning/config/SwaggerConfig.kt

@@ -23,8 +23,9 @@ class SwaggerConfig {
                 .genericModelSubstitutes(DeferredResult::class.java)
                 .useDefaultResponseMessages(false)
                 .forCodeGeneration(true)
+                .apiInfo(apiInfo())
                 .select()
-                .apis(RequestHandlerSelectors.basePackage("com.yaoxiang.planning"))
+                .apis(RequestHandlerSelectors.basePackage("com.yaoxiang.planning.action"))
                 .paths(PathSelectors.any())
                 .build()
     }

+ 4 - 0
src/main/kotlin/com/yaoxiang/planning/domain/BaseLongEntity.kt

@@ -1,8 +1,10 @@
 package com.yaoxiang.planning.domain
 
+import com.fasterxml.jackson.annotation.JsonFormat
 import io.swagger.annotations.ApiModelProperty
 import org.hibernate.annotations.CreationTimestamp
 import org.hibernate.annotations.UpdateTimestamp
+import org.springframework.format.annotation.DateTimeFormat
 import java.io.Serializable
 import java.util.*
 import javax.persistence.*
@@ -16,9 +18,11 @@ open class BaseLongEntity : Serializable {
     @Column(columnDefinition = "int(11) COMMENT '主键'")
     open var id: Long? = null
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @CreationTimestamp
     open var createTime: Date? = null
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @UpdateTimestamp
     open var updateTime: Date? = null
 }

+ 3 - 0
src/main/kotlin/com/yaoxiang/planning/domain/QuarterlyPlan.kt

@@ -1,5 +1,6 @@
 package com.yaoxiang.planning.domain
 
+import com.fasterxml.jackson.annotation.JsonFormat
 import io.swagger.annotations.ApiModel
 import io.swagger.annotations.ApiModelProperty
 import java.util.*
@@ -16,10 +17,12 @@ class QuarterlyPlan() : Planning() {
 
     @ApiModelProperty("开始时间")
     @Column(columnDefinition = "datetime COMMENT '开始时间'")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     var startTime: Date? = null
 
     @ApiModelProperty("结束时间")
     @Column(columnDefinition = "datetime COMMENT '结束时间'")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     var endTime: Date? = null
 
 }

+ 3 - 0
src/main/kotlin/com/yaoxiang/planning/domain/WeeklyPlan.kt

@@ -1,5 +1,6 @@
 package com.yaoxiang.planning.domain
 
+import com.fasterxml.jackson.annotation.JsonFormat
 import io.swagger.annotations.ApiModel
 import io.swagger.annotations.ApiModelProperty
 import java.util.*
@@ -16,10 +17,12 @@ class WeeklyPlan() : Planning() {
 
     @Column(columnDefinition = "datetime COMMENT '开始时间'")
     @ApiModelProperty("开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     var startTime: Date? = null
 
     @ApiModelProperty("开始时间")
     @Column(columnDefinition = "datetime COMMENT '结束时间'")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     var endTime: Date? = null
 
 }

+ 6 - 1
src/main/kotlin/com/yaoxiang/planning/repository/QuarterlyPlanRepo.kt

@@ -3,6 +3,11 @@ package com.yaoxiang.planning.repository
 import com.yaoxiang.planning.domain.QuarterlyPlan
 import org.springframework.data.jpa.repository.JpaRepository
 import org.springframework.stereotype.Repository
+import java.util.*
 
 @Repository
-interface QuarterlyPlanRepo : JpaRepository<QuarterlyPlan, Long>
+interface QuarterlyPlanRepo : JpaRepository<QuarterlyPlan, Long> {
+    fun findFirstByYearAndQuarter(year: Int, quarter: Int): Optional<QuarterlyPlan>
+
+    fun findByYear(year: Int):List<QuarterlyPlan>
+}

+ 4 - 1
src/main/kotlin/com/yaoxiang/planning/repository/WeeklyPlanRepo.kt

@@ -3,6 +3,9 @@ package com.yaoxiang.planning.repository
 import com.yaoxiang.planning.domain.WeeklyPlan
 import org.springframework.data.jpa.repository.JpaRepository
 import org.springframework.stereotype.Repository
+import java.util.*
 
 @Repository
-interface WeeklyPlanRepo : JpaRepository<WeeklyPlan, Long>
+interface WeeklyPlanRepo : JpaRepository<WeeklyPlan, Long> {
+    fun findAllByUserIdAndStartTimeBetween(userId:Long,start: Date, end: Date): List<WeeklyPlan>
+}

+ 6 - 1
src/main/kotlin/com/yaoxiang/planning/service/AnnualPlanService.kt

@@ -52,7 +52,7 @@ class AnnualPlanService {
         return annualPlanRepo.findById(id)
     }
 
-    fun update(id: Long, name: String, content: String, status: Int): Boolean {
+    fun update(id: Long, name: String, content: String, year: Int, status: Int): Boolean {
         val optional = get(id)
         if (!optional.isPresent) {
             return false
@@ -61,6 +61,7 @@ class AnnualPlanService {
         plan.name = name
         plan.content = content
         plan.status = status
+        plan.year = year
         annualPlanRepo.save(plan)
         return true
     }
@@ -78,5 +79,9 @@ class AnnualPlanService {
         return annualPlanRepo.findAll()
     }
 
+    fun evaluate(id: Long, evaluate: String): Boolean {
+        return false
+    }
+
 
 }

+ 31 - 0
src/main/kotlin/com/yaoxiang/planning/service/PlanningItemService.kt

@@ -5,6 +5,7 @@ import com.yaoxiang.planning.model.PlanStatus
 import com.yaoxiang.planning.repository.PlanningItemRepo
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
+import java.util.*
 
 @Service
 class PlanningItemService {
@@ -29,4 +30,34 @@ class PlanningItemService {
     fun findByPlanningIdAndType(planningId: Long, type: Int): List<PlanningItem> {
         return planningItemRepo.findByPlanningIdAndType(planningId, type)
     }
+
+    fun findById(id: Long): Optional<PlanningItem> {
+        return planningItemRepo.findById(id)
+    }
+
+    fun deleteItem(id: Long): Boolean {
+        val optional = findById(id)
+        if (!optional.isPresent) {
+            return false
+        }
+        planningItemRepo.delete(optional.get())
+        return true
+    }
+
+    fun deleteItems(ids: List<Long>): Boolean {
+        if (ids.isEmpty()) {
+            return false
+        }
+        ids.forEach { deleteItem(it) }
+        return true
+    }
+
+    fun deleteByPlanningIdAndType(planningId: Long, type: Int): Boolean {
+        val list = findByPlanningIdAndType(planningId, type)
+        if (list.isEmpty()) {
+            return false
+        }
+        list.forEach { planningItemRepo.delete(it) }
+        return true
+    }
 }

+ 63 - 0
src/main/kotlin/com/yaoxiang/planning/service/QuarterlyPlanService.kt

@@ -1,12 +1,75 @@
 package com.yaoxiang.planning.service
 
+import com.yaoxiang.planning.domain.QuarterlyPlan
+import com.yaoxiang.planning.model.PlanType
 import com.yaoxiang.planning.repository.QuarterlyPlanRepo
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
+import java.util.*
 
 @Service
 class QuarterlyPlanService {
 
     @Autowired
     private lateinit var quarterlyPlanRepo: QuarterlyPlanRepo
+
+    @Autowired
+    private lateinit var planningService: PlanningService
+
+
+    fun add(name: String, content: String, year: Int, quarter: Int): Boolean {
+        if (exists(year, quarter)) {
+            return false
+        }
+        val planning = QuarterlyPlan()
+        planning.quarter = quarter
+        planning.type = PlanType.QUARTERLY.ordinal
+        planning.startTime = Date()
+        planning.endTime = Date()
+        planningService.add(name, content, year, planning)
+        return true
+    }
+
+    fun update(id: Long, name: String, content: String, year: Int, quarter: Int, status: Int): Boolean {
+        val optional = get(id)
+        if (!optional.isPresent) {
+            return false
+        }
+        val planning = optional.get()
+        planning.name = name
+        planning.content = content
+        planning.year = year
+        planning.quarter = quarter
+        planning.status = status
+        quarterlyPlanRepo.save(planning)
+        return true
+    }
+
+    fun exists(year: Int, quarter: Int): Boolean {
+        val optional = findByYearAndQuarter(year, quarter)
+        return optional.isPresent
+    }
+
+    fun get(id: Long): Optional<QuarterlyPlan> {
+        return quarterlyPlanRepo.findById(id)
+    }
+
+    fun findByYearAndQuarter(year: Int, quarter: Int): Optional<QuarterlyPlan> {
+        return quarterlyPlanRepo.findFirstByYearAndQuarter(year, quarter)
+    }
+
+    fun delete(id: Long): Boolean {
+        val optional = get(id)
+        if (!optional.isPresent) {
+            return false
+        }
+        quarterlyPlanRepo.delete(optional.get())
+        return true
+    }
+
+    fun list(year: Int): List<QuarterlyPlan> {
+        return quarterlyPlanRepo.findByYear(year)
+    }
+
+
 }

+ 16 - 0
src/main/kotlin/com/yaoxiang/planning/service/UserService.kt

@@ -1,7 +1,9 @@
 package com.yaoxiang.planning.service
 
 import com.yaoxiang.planning.domain.UserInfo
+import com.yaoxiang.planning.model.AuthUser
 import com.yaoxiang.planning.repository.UserInfoRepo
+import org.springframework.security.core.context.SecurityContextHolder
 import org.springframework.stereotype.Service
 import java.util.*
 import javax.annotation.Resource
@@ -15,4 +17,18 @@ class UserService {
     fun findByUsername(username: String): Optional<UserInfo> {
         return userInfoRepo.findByUsername(username)
     }
+
+    fun currentUserId(): Long? {
+        val userInfo = currentUser()
+        return userInfo?.id
+    }
+
+    fun currentUser(): UserInfo? {
+        val authentication = SecurityContextHolder.getContext().authentication
+        if (authentication != null) {
+            val user = authentication.principal as AuthUser
+            return user.userInfo
+        }
+        return null
+    }
 }

+ 53 - 0
src/main/kotlin/com/yaoxiang/planning/service/WeeklyPlanService.kt

@@ -1,8 +1,12 @@
 package com.yaoxiang.planning.service
 
+import com.yaoxiang.planning.domain.WeeklyPlan
+import com.yaoxiang.planning.model.PlanType
 import com.yaoxiang.planning.repository.WeeklyPlanRepo
+import com.yaoxiang.planning.utils.DateUtil
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
+import java.util.*
 
 @Service
 class WeeklyPlanService {
@@ -10,5 +14,54 @@ class WeeklyPlanService {
     @Autowired
     private lateinit var weeklyPlanRepo: WeeklyPlanRepo
 
+    @Autowired
+    private lateinit var userService: UserService
+
+    @Autowired
+    private lateinit var planningService: PlanningService
+
+    fun add(name: String, content: String, userId: Long?, startTime: Long, year: Int): Boolean {
+        val planning = WeeklyPlan()
+        planning.userId = userId ?: userService.currentUserId()
+        planning.startTime = Date(startTime)
+        planning.type = PlanType.WEEKLY.ordinal
+        planningService.add(name, content, year, planning)
+        return true
+    }
+
+    fun update(id: Long, name: String, content: String, startTime: Long, year: Int, status: Int): Boolean {
+        val optional = get(id)
+        if (!optional.isPresent) {
+            return false
+        }
+        val planning = optional.get()
+        planning.name = name
+        planning.content = content
+        planning.startTime = Date(startTime)
+        planning.year = year
+        planning.status = status
+        weeklyPlanRepo.save(planning)
+        return true
+    }
+
+    fun get(id: Long): Optional<WeeklyPlan> {
+        return weeklyPlanRepo.findById(id)
+    }
+
+    fun delete(id: Long): Boolean {
+        val optional = get(id)
+        if (!optional.isPresent) {
+            return false
+        }
+        weeklyPlanRepo.delete(optional.get())
+        return true
+    }
 
+    fun findByStartTime(start: Long): List<WeeklyPlan> {
+        val time = Date(start)
+        val first = DateUtil.getFirstDayOfWeek(time)
+        val last = DateUtil.getLastDayOfWeek(time)
+        val userId = userService.currentUserId()
+        return weeklyPlanRepo.findAllByUserIdAndStartTimeBetween(userId!!, first, last)
+    }
 }

+ 205 - 0
src/main/kotlin/com/yaoxiang/planning/utils/DateUtil.java

@@ -0,0 +1,205 @@
+package com.yaoxiang.planning.utils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * Created by Feick on 2017/12/06.
+ */
+public class DateUtil {
+
+    public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";
+    public static final String DATE = "yyyy-MM-dd";
+
+    private static final SimpleDateFormat format = new SimpleDateFormat();
+
+    public static String dateTime() {
+        return format(new Date());
+    }
+
+    public static String date() {
+        return format(new Date(), DATE);
+    }
+
+    public static String format(long time) {
+        return format(new Date(time));
+    }
+
+    public static String format(Date date) {
+        return format(date, DATE_TIME);
+    }
+
+    public static String format(Date date, String pattern) {
+        format.applyPattern(pattern);
+        return format.format(date);
+    }
+
+    public static int getYear(boolean simple) {
+        Date date = new Date();
+        String pattern = simple ? "yy" : "yyyy";
+        format.applyPattern(pattern);
+        String year = format.format(date);
+        return Integer.parseInt(year);
+    }
+
+    public static int getMonth() {
+        Date date = new Date();
+        String pattern = "MM";
+        format.applyPattern(pattern);
+        String month = format.format(date);
+        return Integer.parseInt(month);
+    }
+
+    public static int getDay() {
+        Date date = new Date();
+        String pattern = "dd";
+        format.applyPattern(pattern);
+        String month = format.format(date);
+        return Integer.parseInt(month);
+    }
+
+    public static Date add(Date date, int day) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.DATE, day);
+        return calendar.getTime();
+    }
+
+    public static Date parse(String str) {
+        return parse(str, DATE_TIME);
+    }
+
+    public static Date parse(String str, String pattern) {
+        format.applyPattern(pattern);
+        try {
+            return format.parse(str);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static Date getFirstDayOfNextMonth(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.add(Calendar.MONTH, 1);
+        return calendar.getTime();
+    }
+
+    public static Date getFirstDayOfMonth(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        return calendar.getTime();
+    }
+
+    public static Date getFirstTimeOfDay(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 1);
+        return calendar.getTime();
+    }
+
+    public static Date getLastTimeOfDay(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        return calendar.getTime();
+    }
+
+    public static Date getLastDayOfMonth(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.MONTH, 1);
+        calendar.add(Calendar.DAY_OF_MONTH, -1);
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 0);
+        return calendar.getTime();
+    }
+
+    public static Date getFirstDayOfYear(int year) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.YEAR, year);
+        calendar.set(Calendar.MONTH, Calendar.JANUARY);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        calendar.set(Calendar.HOUR, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 1);
+        return calendar.getTime();
+    }
+
+    public static Date getLastDayOfYear(int year) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.YEAR, year);
+        calendar.set(Calendar.MONTH, Calendar.DECEMBER);
+        calendar.set(Calendar.DAY_OF_MONTH, 31);
+        calendar.set(Calendar.HOUR, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        return calendar.getTime();
+    }
+
+    public static Date add(Date date, int filed, int amount) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(filed, amount);
+        return calendar.getTime();
+    }
+
+    public static int getDay(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return calendar.get(Calendar.DAY_OF_MONTH);
+    }
+
+    public static int getHour(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return calendar.get(Calendar.HOUR_OF_DAY);
+    }
+
+    public static int getMinute(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return calendar.get(Calendar.MINUTE);
+    }
+
+    public static Date getFirstDayOfWeek(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.setFirstDayOfWeek(Calendar.SUNDAY);
+        int dayofweek = calendar.get(Calendar.DAY_OF_WEEK);
+        calendar.add(Calendar.DATE, 1 - dayofweek);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 1);
+        return calendar.getTime();
+    }
+
+    public static Date getLastDayOfWeek(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.setFirstDayOfWeek(Calendar.SUNDAY);
+        int dayofweek = calendar.get(Calendar.DAY_OF_WEEK);
+        calendar.add(Calendar.DATE, 7 - dayofweek);
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        return calendar.getTime();
+    }
+}
+

+ 264 - 0
src/main/kotlin/com/yaoxiang/planning/utils/TimeUtil.kt

@@ -0,0 +1,264 @@
+package com.yaoxiang.planning.utils
+
+import java.text.SimpleDateFormat
+import java.util.*
+import kotlin.collections.ArrayList
+import kotlin.collections.HashMap
+
+
+/**
+ * @date: 2020/8/26 12:30
+ */
+class TimeUtil {
+    companion object {
+
+        val formatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
+
+        /**
+         * 获取当天的凌晨0点0分0秒的时间
+         */
+        fun curDate(): Date {
+            val calendar = Calendar.getInstance()
+            calendar.time = Date()
+            calendar[Calendar.HOUR_OF_DAY] = 0
+            calendar[Calendar.MINUTE] = 0
+            calendar[Calendar.SECOND] = 0
+            return calendar.time
+        }
+
+        /**
+         * 获取本周第一天的时间
+         *
+         * @return
+         */
+        fun curWeekFirstDate(): Date {
+            val cal = Calendar.getInstance()
+            cal.time = Date()
+            // 获得当前日期是一个星期的第几天
+            val dayWeek = cal[Calendar.DAY_OF_WEEK]
+            if (1 == dayWeek) {
+                cal.add(Calendar.DAY_OF_MONTH, -1)
+            }
+            // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
+            cal.firstDayOfWeek = Calendar.MONDAY
+            // 获得当前日期是一个星期的第几天
+            val day = cal[Calendar.DAY_OF_WEEK]
+            // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
+            cal.add(Calendar.DATE, cal.firstDayOfWeek - day)
+            cal[Calendar.HOUR_OF_DAY] = 0
+            cal[Calendar.MINUTE] = 0
+            cal[Calendar.SECOND] = 0
+            cal[Calendar.MILLISECOND] = 0
+            return cal.time
+        }
+
+        /**
+         * 本月第一天
+         */
+        fun curMonthFirstDate(): Date {
+            val cal = Calendar.getInstance()
+            cal.add(Calendar.MONTH, 0)
+            cal[Calendar.DAY_OF_MONTH] = 1 //设置为1号,当前日期既为本月第一天
+            cal[Calendar.HOUR_OF_DAY] = 0
+            cal[Calendar.MINUTE] = 0
+            cal[Calendar.SECOND] = 0
+            cal[Calendar.MILLISECOND] = 0
+            return cal.time
+        }
+
+        /**
+         * 本年第一天
+         */
+        fun curYearFirstDate(): Date {
+            val currCal = Calendar.getInstance()
+            val calendar = Calendar.getInstance()
+            calendar.clear()
+            calendar[Calendar.YEAR] = currCal[Calendar.YEAR]
+            return calendar.time
+        }
+
+        fun getStringDate(date: Date): String {
+            return formatter.format(date)
+        }
+
+        /**
+         * 字符串转时间date
+         */
+        fun getDateString(date: String): Date {
+            return formatter.parse(date)
+        }
+
+        fun curYearFirstDateStirng(): String {
+            return getStringDate(curYearFirstDate())
+        }
+
+        fun curMonthFirstDateString(): String {
+            return getStringDate(curMonthFirstDate())
+        }
+
+        fun curWeekFirstDateString(): String {
+            return getStringDate(curWeekFirstDate())
+        }
+
+        fun curDateString(): String {
+            return getStringDate(curDate())
+        }
+
+        /**
+         * 当前时间的字符串
+         */
+        fun curNowString(): String {
+            return getStringDate(Date())
+        }
+
+        /**
+         * 年月日时间字符 转为 年月日时分秒
+         */
+        fun dateToString(date: String): String {
+            val parse = SimpleDateFormat("yyyy-MM-dd").parse(date)
+            return formatter.format(parse)
+        }
+
+        /**
+         * 判断一个指定时间,是否在一个时间段之内,精确到年月日
+         */
+        fun contains(time: String, beginTime: String, endTime: String): Boolean {
+            val time = formatter.parse(time)
+            val beginTime = formatter.parse(beginTime)
+            val endTime = formatter.parse(endTime)
+            return (time.time >= beginTime.time && time.time <= endTime.time)
+        }
+
+        /**
+         * 比较时间大小(精确到时分秒)
+         */
+        fun compareDateString(time: String, otherTime: String): Int {
+            val source = formatter.parse(time)
+            val target = formatter.parse(otherTime)
+            return source.compareTo(target)
+        }
+
+
+        /**
+         * 获取之前数日的时间,清空时分秒
+         */
+        fun getNearlyDate(day: Int): Date {
+            val now = Calendar.getInstance()
+            now.add(Calendar.DAY_OF_MONTH, -day)
+            now[Calendar.HOUR_OF_DAY] = 0
+            now[Calendar.MINUTE] = 0
+            now[Calendar.SECOND] = 0
+            now[Calendar.MILLISECOND] = 0
+            return now.time
+        }
+
+        fun getNearlyDateString(day: Int): String {
+            return formatter.format(getNearlyDate(day))
+        }
+
+        /**
+         * 获取最近30日的日期字符  list<map>
+         */
+        fun getNearlyDateStrings(): List<Map<String, Object?>> {
+            val list = ArrayList<Map<String, Object?>>()
+            for (index in 1..30) {
+                val dateString = getNearlyDateString(index)
+                val map = HashMap<String, Object?>()
+                map.put(dateString, null)
+                list.add(map)
+            }
+            return list
+        }
+
+        /**
+         * 获取最近30日的日期字符  list
+         */
+        fun getNearlyDateStringList(): List<String> {
+            val list = ArrayList<String>()
+            for (index in 1..30) {
+                val dateString = SimpleDateFormat("yyyy-MM-dd").format(getNearlyDate(index))
+                list.add(dateString)
+            }
+            return list
+        }
+
+        /**
+         * 是否同一天
+         */
+        fun isSameDate(time: String?, otherTime: String?): Boolean {
+            val cal1 = Calendar.getInstance()
+            cal1.time = formatter.parse(time)
+            val cal2 = Calendar.getInstance()
+            cal2.time = formatter.parse(otherTime)
+            val isSameYear = cal1[Calendar.YEAR] == cal2[Calendar.YEAR]
+            val isSameMonth = (isSameYear && cal1[Calendar.MONTH] == cal2[Calendar.MONTH])
+            return (isSameMonth && cal1[Calendar.DAY_OF_MONTH] == cal2[Calendar.DAY_OF_MONTH])
+        }
+
+        /**
+         * 是否同一天
+         */
+        fun isSameDateByDate(time: String?, otherTime: String?): Boolean {
+            val cal1 = Calendar.getInstance()
+            cal1.time = SimpleDateFormat("yyyy-MM-dd").parse(time)
+            val cal2 = Calendar.getInstance()
+            cal2.time = SimpleDateFormat("yyyy-MM-dd").parse(otherTime)
+            val isSameYear = cal1[Calendar.YEAR] == cal2[Calendar.YEAR]
+            val isSameMonth = (isSameYear && cal1[Calendar.MONTH] == cal2[Calendar.MONTH])
+            return (isSameMonth && cal1[Calendar.DAY_OF_MONTH] == cal2[Calendar.DAY_OF_MONTH])
+        }
+
+        /**
+         * 截取年月日部分时间串
+         */
+        fun getDateStringFromDate(date: String): String {
+            return SimpleDateFormat("yyyy-MM-dd").format(formatter.parse(date))
+        }
+
+        /**
+         * 获取两个时间差值
+         */
+        fun getDistanceTime(startTime: String, endTime: String): Long {
+            var hour = 0
+            val time1 = formatter.parse(startTime).time
+            val time2 = formatter.parse(endTime).time
+            val diff: Long
+            diff = if (time1 < time2) {
+                time2 - time1
+            } else {
+                time1 - time2
+            }
+//            hour = (diff / (60 * 60 * 1000)).toInt()
+            return diff
+        }
+
+
+        /**
+         * 距离指定时间的第二天凌晨0点还有多长时间
+         */
+        fun dayToTomorrowTime(startTime: String): Long {
+            val date = formatter.parse(startTime)
+            val calendar = Calendar.getInstance()
+            calendar.time = date
+            calendar.add(Calendar.DAY_OF_YEAR, 1)
+            calendar.set(Calendar.HOUR_OF_DAY, 0)
+            calendar.set(Calendar.MINUTE, 0)
+            calendar.set(Calendar.SECOND, 0)
+            calendar.set(Calendar.MILLISECOND, 0)
+            return calendar.timeInMillis - date.time
+        }
+
+        /**
+         * 指定时间的凌晨0:0:0
+         */
+        fun getDateZero(time: String): String {
+            val calendar = Calendar.getInstance()
+            calendar.time = formatter.parse(time)
+            calendar[Calendar.HOUR_OF_DAY] = 0
+            calendar[Calendar.MINUTE] = 0
+            calendar[Calendar.SECOND] = 0
+            return formatter.format(calendar.time)
+        }
+    }
+
+}