dcs 10 months ago
parent
commit
149c8413ac
31 changed files with 1429 additions and 111 deletions
  1. 1 1
      pom.xml
  2. 1 1
      virgo.api/pom.xml
  3. 11 2
      virgo.api/src/main/java/com/bosshand/virgo/api/controller/ProjectController.java
  4. 29 0
      virgo.api/src/main/java/com/bosshand/virgo/api/controller/QuartzController.java
  5. 82 0
      virgo.api/src/main/java/com/bosshand/virgo/api/controller/WeeklyController.java
  6. 2 0
      virgo.api/src/main/java/com/bosshand/virgo/api/dao/PaymentDao.java
  7. 23 0
      virgo.api/src/main/java/com/bosshand/virgo/api/dao/ProjectCityWeatherDao.java
  8. 2 0
      virgo.api/src/main/java/com/bosshand/virgo/api/dao/ProjectDao.java
  9. 24 0
      virgo.api/src/main/java/com/bosshand/virgo/api/dao/WeeklyDao.java
  10. 17 0
      virgo.api/src/main/java/com/bosshand/virgo/api/dao/WeeklySetDao.java
  11. 20 0
      virgo.api/src/main/java/com/bosshand/virgo/api/dao/WeeklyTypeDao.java
  12. 51 0
      virgo.api/src/main/java/com/bosshand/virgo/api/job/JobCityWeatherQuartz.java
  13. 146 0
      virgo.api/src/main/java/com/bosshand/virgo/api/job/JobProjectWeeklyQuartz.java
  14. 90 0
      virgo.api/src/main/java/com/bosshand/virgo/api/model/JobInfo.java
  15. 13 0
      virgo.api/src/main/java/com/bosshand/virgo/api/model/Payment.java
  16. 13 0
      virgo.api/src/main/java/com/bosshand/virgo/api/model/Project.java
  17. 46 0
      virgo.api/src/main/java/com/bosshand/virgo/api/model/ProjectCityWeather.java
  18. 117 0
      virgo.api/src/main/java/com/bosshand/virgo/api/model/Weekly.java
  19. 67 0
      virgo.api/src/main/java/com/bosshand/virgo/api/model/WeeklySet.java
  20. 60 0
      virgo.api/src/main/java/com/bosshand/virgo/api/model/WeeklyType.java
  21. 11 2
      virgo.api/src/main/java/com/bosshand/virgo/api/service/ProjectService.java
  22. 219 0
      virgo.api/src/main/java/com/bosshand/virgo/api/service/QuartzService.java
  23. 75 0
      virgo.api/src/main/java/com/bosshand/virgo/api/service/WeeklyService.java
  24. 21 1
      virgo.api/src/main/resources/application.properties
  25. 9 5
      virgo.api/src/main/resources/mapper/PaymentMapper.xml
  26. 35 0
      virgo.api/src/main/resources/mapper/ProjectCityWeatherMapper.xml
  27. 8 2
      virgo.api/src/main/resources/mapper/ProjectMapper.xml
  28. 60 0
      virgo.api/src/main/resources/mapper/WeeklyMapper.xml
  29. 50 0
      virgo.api/src/main/resources/mapper/WeeklySetMapper.xml
  30. 45 0
      virgo.api/src/main/resources/mapper/WeeklyTypeMapper.xml
  31. 81 97
      virgo.core/src/main/java/com/bosshand/virgo/core/utils/HttpsUtils.java

+ 1 - 1
pom.xml

@@ -12,7 +12,7 @@
 	<parent>
 		<groupId>org.springframework.boot</groupId>
 		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.1.8.RELEASE</version>
+		<version>2.1.7.RELEASE</version>
 	</parent>
 	
 	 <properties>

+ 1 - 1
virgo.api/pom.xml

@@ -31,10 +31,10 @@
 		    <artifactId>spring-cloud-starter-openfeign</artifactId>
 		</dependency>
 
+		<!--quartz依赖-->
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-quartz</artifactId>
-			<version>2.6.2</version>
 		</dependency>
 
 

+ 11 - 2
virgo.api/src/main/java/com/bosshand/virgo/api/controller/ProjectController.java

@@ -3,6 +3,7 @@ package com.bosshand.virgo.api.controller;
 import com.bosshand.virgo.api.model.Project;
 import com.bosshand.virgo.api.service.ProjectItemTargetRoomService;
 import com.bosshand.virgo.api.service.ProjectService;
+import com.bosshand.virgo.api.service.QuartzService;
 import com.bosshand.virgo.core.response.Response;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -24,6 +25,9 @@ public class ProjectController {
     @Autowired
     ProjectItemTargetRoomService projectItemTargetRoomService;
 
+    @Autowired
+    QuartzService quartzService;
+
     @ApiOperation("获取")
     @RequestMapping(value = "/{currPage}/{pageSize}", method = RequestMethod.POST)
     public Response list(@RequestBody Project project, @PathVariable int currPage, @PathVariable int pageSize) {
@@ -57,14 +61,19 @@ public class ProjectController {
     @ApiOperation("新增")
     @RequestMapping(value = "", method = RequestMethod.POST)
     public Response insertProject(@RequestBody Project project) {
-        projectService.insert(project);
-        projectItemTargetRoomService.projectCache.clear();
+        Project p = projectService.insert(project);
+        // 每天0点定时保存项目地址天气
+        quartzService.executeJobCityWeatherQuartz(p);
+        // 定时生成项目周报数据
+        quartzService.executeJobProjectWeeklyQuartz(p);
         return Response.ok();
     }
 
     @ApiOperation("删除")
     @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE)
     public Response deleteProject(@PathVariable long id) {
+        Project project = projectService.getProject(id);
+        quartzService.deleteJobQuartz(project);
         projectService.deleteProject(id);
         projectItemTargetRoomService.projectCache.clear();
         return Response.ok();

+ 29 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/controller/QuartzController.java

@@ -0,0 +1,29 @@
+package com.bosshand.virgo.api.controller;
+
+import com.bosshand.virgo.api.model.JobInfo;
+import com.bosshand.virgo.api.service.QuartzService;
+import com.bosshand.virgo.core.response.Response;
+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;
+
+@RestController
+@RequestMapping("/quartz")
+public class QuartzController {
+
+    @Autowired
+    QuartzService quartzService;
+
+    @PostMapping("/deleteJob")
+    public Response deleteJob(@RequestBody JobInfo jobInfo) {
+        return Response.ok(quartzService.deleteCronJob(jobInfo.getJobName(), jobInfo.getJobGroup(), jobInfo.getTriggerName(), jobInfo.getTriggerGroup()));
+    }
+
+    @PostMapping("/queryJob")
+    public Response queryJob() {
+        return Response.ok(quartzService.getScheduleJobList());
+    }
+
+}

+ 82 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/controller/WeeklyController.java

@@ -0,0 +1,82 @@
+package com.bosshand.virgo.api.controller;
+
+import com.bosshand.virgo.api.model.Weekly;
+import com.bosshand.virgo.api.model.WeeklySet;
+import com.bosshand.virgo.api.model.WeeklyType;
+import com.bosshand.virgo.api.service.WeeklyService;
+import com.bosshand.virgo.core.response.Response;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("weekly")
+@Api(tags = {"周报管理"})
+public class WeeklyController {
+
+    @Autowired
+    private WeeklyService weeklyService;
+
+    @ApiOperation(value = "根据project获取周报", notes = "根据project获取周报")
+    @RequestMapping(value = "/{projectId}", method = RequestMethod.GET)
+    public Response list(@PathVariable long projectId) {
+        return Response.ok(weeklyService.getByProjectId(projectId));
+    }
+
+    @ApiOperation(value = "获取提交出来的周报", notes = "获取提交出来的周报")
+    @RequestMapping(value = "/submit/{projectId}", method = RequestMethod.GET)
+    public Response listProjectSubmit(@PathVariable long projectId) {
+        return Response.ok(weeklyService.getByProject(projectId));
+    }
+
+    @ApiOperation(value = "获取与自己企业相关的提交出来的周报", notes = "根据project获取提交出来的周报")
+    @RequestMapping(value = "/submit/{organizationId}/{projectId}", method = RequestMethod.GET)
+    public Response listOrganizationSubmit(@PathVariable long organizationId, @PathVariable long projectId) {
+        return Response.ok(weeklyService.getByOrganization(organizationId, projectId));
+    }
+
+    @ApiOperation(value = "修改周报状态", notes = "修改周报状态")
+    @RequestMapping(method = RequestMethod.PUT)
+    public Response updateState(@RequestBody Weekly weekly) {
+        return Response.ok(weeklyService.updateState(weekly));
+    }
+
+    @ApiOperation(value = "周报类型详情", notes = "周报类型详情")
+    @RequestMapping(value = "/type/{weeklyId}", method = RequestMethod.GET)
+    public Response getWeeklyType(@PathVariable long weeklyId) {
+        return Response.ok(weeklyService.getByWeeklyId(weeklyId));
+    }
+
+    @ApiOperation(value = "新增类型", notes = "新增类型")
+    @RequestMapping(value = "/type", method = RequestMethod.POST)
+    public Response addWeeklyType(@RequestBody WeeklyType weeklyType) {
+        return Response.ok(weeklyService.saveWeeklyType(weeklyType));
+    }
+
+    @ApiOperation(value = "编辑类型", notes = "编辑类型")
+    @RequestMapping(value = "/type", method = RequestMethod.PUT)
+    public Response editWeeklyType(@RequestBody WeeklyType weeklyType) {
+        return Response.ok(weeklyService.updateWeeklyType(weeklyType));
+    }
+
+    @ApiOperation(value = "新增配置", notes = "新增配置")
+    @RequestMapping(value = "/set", method = RequestMethod.POST)
+    public Response saveWeeklySet(@RequestBody WeeklySet weeklySet) {
+        return Response.ok(weeklyService.saveWeeklySet(weeklySet));
+    }
+
+    @ApiOperation(value = "编辑配置", notes = "编辑配置")
+    @RequestMapping(value = "/set", method = RequestMethod.PUT)
+    public Response updateWeeklySet(@RequestBody WeeklySet weeklySet) {
+        return Response.ok(weeklyService.updateWeeklySet(weeklySet));
+    }
+
+    @ApiOperation(value = "获取配置", notes = "获取配置")
+    @RequestMapping(value = "/set/query", method = RequestMethod.POST)
+    public Response getByWeeklySet(@RequestBody WeeklySet weeklySet) {
+        return Response.ok(weeklyService.getByWeeklySet(weeklySet));
+    }
+
+
+}

+ 2 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/dao/PaymentDao.java

@@ -17,6 +17,8 @@ public interface PaymentDao {
 
     int updateStatus(long id, Integer status);
 
+    int updateReminderStatus(long id, Integer reminderStatus);
+
     List<Payment> getContractId(long contractId);
 
     int getTotalCount(Payment payment);

+ 23 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/dao/ProjectCityWeatherDao.java

@@ -0,0 +1,23 @@
+package com.bosshand.virgo.api.dao;
+
+import com.bosshand.virgo.api.model.ProjectCityWeather;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ProjectCityWeatherDao {
+
+    void save (ProjectCityWeather projectCityWeather);
+
+    void delete (long id);
+
+    List<ProjectCityWeather> getList(long projectId);
+
+    ProjectCityWeather getMax(long projectId);
+
+    List<ProjectCityWeather> getProjectId(@Param(value = "startDate") String startDate,
+                                          @Param(value = "endDate")String endDate,
+                                          @Param(value = "projectId")long projectId);
+}

+ 2 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/dao/ProjectDao.java

@@ -20,6 +20,8 @@ public interface ProjectDao {
 
     Project getProject(long id);
 
+    List<Project> getAll();
+
     List<Project> getProjectByOrganizationId(long organizationId);
 
     int getTotalCount(Project project);

+ 24 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/dao/WeeklyDao.java

@@ -0,0 +1,24 @@
+package com.bosshand.virgo.api.dao;
+
+import com.bosshand.virgo.api.model.Weekly;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface WeeklyDao {
+
+    int save(Weekly weekly);
+
+    Weekly get(long id);
+
+    List<Weekly> getByProjectId(long projectId);
+
+    Weekly getMax(long projectId);
+
+    int updateState(Weekly weekly);
+
+    List<Weekly> getByProject(long projectId);
+
+    List<Weekly> getByOrganization(long organizationId, long projectId);
+}

+ 17 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/dao/WeeklySetDao.java

@@ -0,0 +1,17 @@
+package com.bosshand.virgo.api.dao;
+
+import com.bosshand.virgo.api.model.WeeklySet;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface WeeklySetDao {
+
+    int save(WeeklySet weeklySet);
+
+    int update(WeeklySet weeklySet);
+
+    List<WeeklySet> get(WeeklySet weeklySet);
+
+}

+ 20 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/dao/WeeklyTypeDao.java

@@ -0,0 +1,20 @@
+package com.bosshand.virgo.api.dao;
+
+import com.bosshand.virgo.api.model.WeeklyType;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface WeeklyTypeDao {
+
+    int save(WeeklyType weeklyType);
+
+    int batchSave(List<WeeklyType> list);
+
+    int update(WeeklyType WeeklyType);
+
+    WeeklyType getWeeklyType(long id);
+
+    List<WeeklyType> getByWeeklyId(long weeklyId);
+}

+ 51 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/job/JobCityWeatherQuartz.java

@@ -0,0 +1,51 @@
+package com.bosshand.virgo.api.job;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.bosshand.virgo.api.dao.ProjectCityWeatherDao;
+import com.bosshand.virgo.api.model.ProjectCityWeather;
+import com.bosshand.virgo.core.utils.HttpsUtils;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+/**
+ * 定时保存项目所在城市天气
+ */
+public class JobCityWeatherQuartz extends QuartzJobBean {
+
+    @Autowired
+    ProjectCityWeatherDao projectCityWeatherDao;
+
+    static Logger log = LoggerFactory.getLogger(JobCityWeatherQuartz.class);
+
+    @Override
+    public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+
+        log.info("=========================保存城市天气====================");
+        log.info("jobName:{}", jobExecutionContext.getJobDetail().getKey().getName());
+        log.info("jobGroup:{}", jobExecutionContext.getJobDetail().getKey().getGroup());
+        log.info("triggerName:{}", jobExecutionContext.getTrigger().getKey().getName());
+        log.info("triggerGroup:{}", jobExecutionContext.getTrigger().getKey().getGroup());
+        log.info("上次触发时间:{}", DateUtil.formatDateTime(jobExecutionContext.getPreviousFireTime()));
+        log.info("本次触发时间:{}", DateUtil.formatDateTime(jobExecutionContext.getFireTime()));
+        log.info("下次触发时间:{}", DateUtil.formatDateTime(jobExecutionContext.getNextFireTime()));
+        log.info("调度时间:{}", DateUtil.formatDateTime(jobExecutionContext.getScheduledFireTime()));
+
+        JobDataMap mergedJobDataMap = jobExecutionContext.getMergedJobDataMap();
+        String data = mergedJobDataMap.getString("data");
+        JSONObject json = JSONObject.parseObject(data);
+        ProjectCityWeather projectCityWeather = new ProjectCityWeather();
+        projectCityWeather.setDate(jobExecutionContext.getFireTime());
+        projectCityWeather.setProjectId(json.getLongValue("projectId"));
+        String url = "https://restapi.amap.com/v3/weather/weatherInfo?city=" + json.getString("city") + "&extensions=all&key=8d6519155e085eb1b83d1de7953b2414";
+        projectCityWeather.setWeatherData(HttpsUtils.getResult(url));
+        projectCityWeatherDao.save(projectCityWeather);
+
+    }
+
+}

+ 146 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/job/JobProjectWeeklyQuartz.java

@@ -0,0 +1,146 @@
+package com.bosshand.virgo.api.job;
+
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.bosshand.virgo.api.dao.ProjectCityWeatherDao;
+import com.bosshand.virgo.api.dao.ProjectDao;
+import com.bosshand.virgo.api.dao.WeeklyDao;
+import com.bosshand.virgo.api.dao.WeeklyTypeDao;
+import com.bosshand.virgo.api.model.Project;
+import com.bosshand.virgo.api.model.ProjectCityWeather;
+import com.bosshand.virgo.api.model.Weekly;
+import com.bosshand.virgo.api.model.WeeklyType;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 定时生成项目周报数据
+ */
+public class JobProjectWeeklyQuartz extends QuartzJobBean {
+
+    @Autowired
+    WeeklyDao weeklyDao;
+
+    @Autowired
+    WeeklyTypeDao weeklyTypeDao;
+
+    @Autowired
+    ProjectDao projectDao;
+
+    @Autowired
+    ProjectCityWeatherDao projectCityWeatherDao;
+
+    static Logger log = LoggerFactory.getLogger(JobProjectWeeklyQuartz.class);
+
+    @Override
+    public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        log.info("=========================生成项目周报====================");
+        JobDataMap mergedJobDataMap = jobExecutionContext.getMergedJobDataMap();
+        String data = mergedJobDataMap.getString("data");
+        JSONObject json = JSONObject.parseObject(data);
+        long projectId = json.getLongValue("projectId");
+        Date createDate = json.getDate("createDate");
+        Project project = projectDao.getProject(projectId);
+
+        Weekly weekly = new Weekly();
+        weekly.setOrganizationId(project.getOrganizationId());
+        weekly.setProjectId(projectId);
+        weekly.setName(project.getName() + "项目周报");
+
+        Weekly max = weeklyDao.getMax(projectId);
+        if (max != null) {
+            int number = max.getNumber();
+            weekly.setNumber(number + 1);
+            weekly.setStartDate(DateUtil.formatDateTime(jobExecutionContext.getFireTime()));
+            weekly.setEndDate(DateUtil.formatDateTime(jobExecutionContext.getNextFireTime()));
+        } else {
+            weekly.setNumber(1);
+            weekly.setStartDate(DateUtil.formatDateTime(createDate));
+            weekly.setEndDate(DateUtil.formatDateTime(jobExecutionContext.getFireTime()));
+        }
+
+        weeklyDao.save(weekly);
+        weeklyTypeDao.batchSave(initWorkTypeList(projectId, weekly.getId(), weekly.getStartDate(), weekly.getEndDate()));
+
+    }
+
+    private List<WeeklyType> initWorkTypeList(long projectId, long weeklyId, String startDate, String endDate) {
+        List<WeeklyType> list = new ArrayList<>();
+        String[] typeNameList = WeeklyType.TYPENAMELIST;
+        for (int i = 0; i < typeNameList.length; i++) {
+            WeeklyType wt = new WeeklyType();
+            wt.setWeeklyId(weeklyId);
+            wt.setName(typeNameList[i]);
+            wt.setType(i);
+            switch (i) {
+                //天气情况
+                case 0:
+                    String start = DateUtil.formatDate(DateUtil.parseDate(startDate));
+                    String end = DateUtil.formatDate(DateUtil.parseDate(endDate));
+                    List<ProjectCityWeather> weatherList = projectCityWeatherDao.getProjectId(start, end, projectId);
+                    if (weatherList.size() > 0) {
+                        List<JSONObject> ls = new ArrayList<>();
+                        for (ProjectCityWeather weather : weatherList) {
+                            JSONObject json = new JSONObject();
+                            json.put("date", DateUtil.formatDate(weather.getDate()));
+                            json.put("weather", weather.getWeatherData());
+                            ls.add(json);
+                        }
+                        wt.setData(ls.toString());
+                    }
+                    break;
+                //进度情况
+                case 1:
+                    wt.setData(null);
+                    break;
+                //安全情况
+                case 2:
+                    wt.setData(null);
+                    break;
+                //质量情况
+                case 3:
+                    wt.setData(null);
+                    break;
+                //技术情况
+                case 4:
+                    wt.setData(null);
+                    break;
+                //资源情况
+                case 5:
+                    wt.setData(null);
+                    break;
+                //下周计划
+                case 6:
+                    wt.setData(null);
+                    break;
+                //问题协调
+                case 7:
+                    wt.setData(null);
+                    break;
+                //现场照片
+                case 8:
+                    wt.setData(null);
+                    break;
+                //周报文档
+                case 9:
+                    wt.setData(null);
+                    break;
+                default:
+                    throw new IllegalStateException("Unexpected value: " + i);
+            }
+            list.add(wt);
+        }
+        return list;
+    }
+
+}

+ 90 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/model/JobInfo.java

@@ -0,0 +1,90 @@
+package com.bosshand.virgo.api.model;
+
+import org.quartz.JobDataMap;
+
+/**
+ * 定时任务信息
+ */
+public class JobInfo {
+
+    private String jobName;
+
+    private String cron;
+
+    private String jobGroup;
+
+    private String triggerName;
+
+    private String triggerGroup;
+
+    private String jobClassName;
+
+    private String jobStatus;
+
+    private JobDataMap jobDataMap;
+
+    public String getJobName() {
+        return jobName;
+    }
+
+    public void setJobName(String jobName) {
+        this.jobName = jobName;
+    }
+
+    public String getCron() {
+        return cron;
+    }
+
+    public void setCron(String cron) {
+        this.cron = cron;
+    }
+
+    public String getJobGroup() {
+        return jobGroup;
+    }
+
+    public void setJobGroup(String jobGroup) {
+        this.jobGroup = jobGroup;
+    }
+
+    public String getTriggerName() {
+        return triggerName;
+    }
+
+    public void setTriggerName(String triggerName) {
+        this.triggerName = triggerName;
+    }
+
+    public String getTriggerGroup() {
+        return triggerGroup;
+    }
+
+    public void setTriggerGroup(String triggerGroup) {
+        this.triggerGroup = triggerGroup;
+    }
+
+    public String getJobClassName() {
+        return jobClassName;
+    }
+
+    public void setJobClassName(String jobClassName) {
+        this.jobClassName = jobClassName;
+    }
+
+    public String getJobStatus() {
+        return jobStatus;
+    }
+
+    public void setJobStatus(String jobStatus) {
+        this.jobStatus = jobStatus;
+    }
+
+    public JobDataMap getJobDataMap() {
+        return jobDataMap;
+    }
+
+    public void setJobDataMap(JobDataMap jobDataMap) {
+        this.jobDataMap = jobDataMap;
+    }
+
+}

+ 13 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/model/Payment.java

@@ -15,6 +15,11 @@ public class Payment {
      */
     private String reminderDate;
 
+    /**
+     * 提醒状态
+     */
+    private Integer reminderStatus;
+
     /**
      * 项目id
      */
@@ -101,6 +106,14 @@ public class Payment {
         this.reminderDate = reminderDate;
     }
 
+    public Integer getReminderStatus() {
+        return reminderStatus;
+    }
+
+    public void setReminderStatus(Integer reminderStatus) {
+        this.reminderStatus = reminderStatus;
+    }
+
     public long getProjectId() {
         return projectId;
     }

+ 13 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/model/Project.java

@@ -12,6 +12,11 @@ public class Project {
 
     private long id;
 
+    /**
+     * 生成周报(周一至周日 1,2,3,4,5,6,7)
+     */
+    private Integer generateWeeklyDate;
+
     /**
      * 类型
      */
@@ -85,6 +90,14 @@ public class Project {
 
     private List<ProjectItem> projectItemList;
 
+    public Integer getGenerateWeeklyDate() {
+        return generateWeeklyDate;
+    }
+
+    public void setGenerateWeeklyDate(Integer generateWeeklyDate) {
+        this.generateWeeklyDate = generateWeeklyDate;
+    }
+
     public long getId() {
         return id;
     }

+ 46 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/model/ProjectCityWeather.java

@@ -0,0 +1,46 @@
+package com.bosshand.virgo.api.model;
+
+import java.util.Date;
+
+public class ProjectCityWeather {
+
+    private long id;
+
+    private long projectId;
+
+    private Date date;
+
+    private String weatherData;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public long getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(long projectId) {
+        this.projectId = projectId;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+    public String getWeatherData() {
+        return weatherData;
+    }
+
+    public void setWeatherData(String weatherData) {
+        this.weatherData = weatherData;
+    }
+}

+ 117 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/model/Weekly.java

@@ -0,0 +1,117 @@
+package com.bosshand.virgo.api.model;
+
+/**
+ * 周报
+ */
+public class Weekly {
+
+    private long id;
+
+    private String name;
+
+    private long organizationId;
+
+    private String organizationName;
+
+    private long projectId;
+
+    private String projectName;
+
+    private String createDate;
+
+    private String startDate;
+
+    private String endDate;
+
+    private int state;
+
+    private int number;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public long getOrganizationId() {
+        return organizationId;
+    }
+
+    public void setOrganizationId(long organizationId) {
+        this.organizationId = organizationId;
+    }
+
+    public String getOrganizationName() {
+        return organizationName;
+    }
+
+    public void setOrganizationName(String organizationName) {
+        this.organizationName = organizationName;
+    }
+
+    public long getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(long projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    public String getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(String createDate) {
+        this.createDate = createDate;
+    }
+
+    public String getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(String startDate) {
+        this.startDate = startDate;
+    }
+
+    public String getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(String endDate) {
+        this.endDate = endDate;
+    }
+
+    public int getState() {
+        return state;
+    }
+
+    public void setState(int state) {
+        this.state = state;
+    }
+
+    public int getNumber() {
+        return number;
+    }
+
+    public void setNumber(int number) {
+        this.number = number;
+    }
+}

+ 67 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/model/WeeklySet.java

@@ -0,0 +1,67 @@
+package com.bosshand.virgo.api.model;
+
+/**
+ * 周报设置
+ */
+public class WeeklySet {
+
+    private long id;
+
+    private long organizationId;
+
+    private long projectId;
+
+    private String submiter;
+
+    private String checker;
+
+    private int type;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public long getOrganizationId() {
+        return organizationId;
+    }
+
+    public void setOrganizationId(long organizationId) {
+        this.organizationId = organizationId;
+    }
+
+    public long getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(long projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getSubmiter() {
+        return submiter;
+    }
+
+    public void setSubmiter(String submiter) {
+        this.submiter = submiter;
+    }
+
+    public String getChecker() {
+        return checker;
+    }
+
+    public void setChecker(String checker) {
+        this.checker = checker;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+}

+ 60 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/model/WeeklyType.java

@@ -0,0 +1,60 @@
+package com.bosshand.virgo.api.model;
+
+/**
+ * 周报子分类
+ */
+public class WeeklyType {
+
+    public static final String[] TYPENAMELIST = {"天气情况", "进度情况", "安全情况", "质量情况", "技术情况", "资源情况", "下周计划", "问题协调", "现场照片", "周报文档"};
+
+    private long id;
+
+    private String name;
+
+    private String data;
+
+    private int type;
+
+    private long weeklyId;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    public long getWeeklyId() {
+        return weeklyId;
+    }
+
+    public void setWeeklyId(long weeklyId) {
+        this.weeklyId = weeklyId;
+    }
+
+}

+ 11 - 2
virgo.api/src/main/java/com/bosshand/virgo/api/service/ProjectService.java

@@ -34,8 +34,17 @@ public class ProjectService {
 		return project;
 	}
 
-	public int insert(Project project) {
-		return projectDao.insert(project);
+	public Project getProject(long id) {
+		return projectDao.getProject(id);
+	}
+
+	public List<Project> getAll() {
+		return projectDao.getAll();
+	}
+
+	public Project insert(Project project) {
+		projectDao.insert(project);
+		return project;
 	}
 
 	public int update(Project project) {

+ 219 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/service/QuartzService.java

@@ -0,0 +1,219 @@
+package com.bosshand.virgo.api.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.bosshand.virgo.api.model.JobInfo;
+import com.bosshand.virgo.api.model.Project;
+import org.quartz.*;
+import org.quartz.impl.matchers.GroupMatcher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class QuartzService {
+
+    @Autowired
+    private Scheduler scheduler;
+
+    private static final String DEFAULT_JOB_GROUP = "default_job_group";
+
+    private static final String DEFAULT_TRIGGER_GROUP = "default_trigger_group";
+
+    private static final String TRIGGER_PRE = "Trigger_";
+
+    private static Map<Integer, String> CRON_MAP = new HashMap<>();
+
+    // cron 每周几0点1分执行
+    static {
+        CRON_MAP.put(1, "0 1 0 ? * 2");
+        CRON_MAP.put(2, "0 1 0 ? * 3");
+        CRON_MAP.put(3, "0 1 0 ? * 4");
+        CRON_MAP.put(4, "0 1 0 ? * 5");
+        CRON_MAP.put(5, "0 1 0 ? * 6");
+        CRON_MAP.put(6, "0 1 0 ? * 7");
+        CRON_MAP.put(7, "0 1 0 ? * 1");
+    }
+
+    static Logger log = LoggerFactory.getLogger(QuartzService.class);
+
+    /**
+     * 定时保存项目所在城市天气
+     */
+    public void executeJobCityWeatherQuartz(Project project) {
+        long projectId = project.getId();
+        JSONArray jsonArray = JSONArray.parseArray(project.getAddress());
+        String city = jsonArray.getString(2);
+
+        JSONObject js = new JSONObject();
+        js.put("projectId", projectId);
+        js.put("city", city);
+
+        // 执行保存项目所在城市天气任务,任务名称(projectId_city)
+        String jobName = projectId + "_" + city;
+        String jobClassName = "com.bosshand.virgo.api.job.JobCityWeatherQuartz";
+        addCronJob(jobName, "0 0 0 * * ?", jobClassName, js);
+        // 首次执行一次保存任务
+        executeImmediately(jobName + "_" + projectId, jobClassName, js);
+    }
+
+    /**
+     * 定时生成项目周报
+     */
+    public void executeJobProjectWeeklyQuartz(Project project) {
+        Integer generateWeeklyDate = project.getGenerateWeeklyDate();
+        JSONObject js = new JSONObject();
+        js.put("projectId", project.getId());
+        js.put("createDate", project.getCreateDate());
+        // 执行生成周报任务,任务名称(projectId_projectName)
+        String s = addCronJob(project.getId() + "_" + project.getName(), CRON_MAP.get(generateWeeklyDate), "com.bosshand.virgo.api.job.JobProjectWeeklyQuartz", js);
+        log.info(project.getId() + "_" + project.getName()+"周报定时任务启动:{}", s);
+    }
+
+    /**
+     * 删除项目定时任务
+     */
+    public void deleteJobQuartz(Project project) {
+        JSONArray jsonArray = JSONArray.parseArray(project.getAddress());
+        String city = jsonArray.getString(2);
+        // 天气
+        deleteCronJob(project.getId() + "_" + city, DEFAULT_JOB_GROUP, TRIGGER_PRE + project.getId() + "_" + city, DEFAULT_TRIGGER_GROUP);
+        // 周报
+        deleteCronJob(project.getId() + "_" + project.getName(), DEFAULT_JOB_GROUP, TRIGGER_PRE + project.getId() + "_" + project.getName(), DEFAULT_TRIGGER_GROUP);
+    }
+
+    public String addCronJob(String jobName, String cron, String jobClassName, JSONObject data) {
+        try {
+            // 当前任务不存在才进行添加
+            JobKey jobKey = JobKey.jobKey(jobName, DEFAULT_JOB_GROUP);
+            if (scheduler.checkExists(jobKey)) {
+                log.info("[添加定时任务]已存在该作业,jobkey为:{}", jobKey);
+                return "已存在该作业";
+            }
+
+            // 构建 Job
+            JobDetail job = JobBuilder.newJob(getClass(jobClassName).getClass())
+                    .withIdentity(jobKey).build();
+
+            job.getJobDataMap().put("data", data.toJSONString());
+
+            // cron表达式定时构造器
+            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
+
+            // 构建 Trigger
+            Trigger trigger = TriggerBuilder.newTrigger()
+                    .withIdentity(TriggerKey.triggerKey(TRIGGER_PRE + jobName, DEFAULT_TRIGGER_GROUP))
+                    .withSchedule(cronScheduleBuilder).build();
+
+            // 启动调度器
+            scheduler.scheduleJob(job, trigger);
+            scheduler.start();
+            return "SUCCESS";
+        } catch (Exception e) {
+            log.error("[新增定时任务]失败,报错:", e);
+            return "FAIL";
+        }
+
+    }
+
+    public String deleteCronJob(String jobName, String jobGroup, String triggerName, String triggerGroup) {
+        try {
+
+            JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
+
+            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup);
+
+            Trigger trigger = scheduler.getTrigger(triggerKey);
+
+            if (null == trigger) {
+                log.info("[停止定时任务]根据triggerName:{}和triggerGroup:{}未查询到相应的trigger!");
+                return "SUCCESS";
+            }
+            // 暂停触发器
+            scheduler.pauseTrigger(triggerKey);
+            // 移除触发器
+            scheduler.unscheduleJob(triggerKey);
+            // 删除任务
+            scheduler.deleteJob(jobKey);
+
+            log.info("[停止定时任务]jobName:{},jobGroup:{}, triggerName:{}, triggerGroup:{},停止--------------", jobName, jobGroup, triggerName, triggerGroup);
+
+            return "SUCCESS";
+
+        } catch (SchedulerException e) {
+            log.error("[停止定时任务]失败,报错:", e);
+            return "FAIL";
+        }
+    }
+
+    public static Job getClass(String className) throws Exception {
+        Class<?> classTemp = Class.forName(className);
+        return (Job) classTemp.newInstance();
+    }
+
+    public String executeImmediately(String jobName, String jobClassName, JSONObject data) {
+        try {
+            JobKey jobKey = JobKey.jobKey(jobName, DEFAULT_JOB_GROUP);
+            JobDetail job = JobBuilder.newJob(getClass(jobClassName).getClass())
+                    .withIdentity(jobKey).build();
+
+            job.getJobDataMap().put("data", data.toJSONString());
+
+            Trigger trigger = TriggerBuilder.newTrigger()
+                    .withIdentity(TriggerKey.triggerKey(TRIGGER_PRE + jobName, DEFAULT_TRIGGER_GROUP))
+                    .build();
+
+            // 启动调度器
+            scheduler.scheduleJob(job, trigger);
+            scheduler.start();
+            return "SUCCESS";
+        } catch (Exception e) {
+            log.error("[立即执行一次任务,不定时]失败,报错:", e);
+            return "FAIL";
+        }
+    }
+
+
+    /**
+     * 查询定时任务列表
+     */
+    public List<JobInfo> getScheduleJobList() {
+        List<JobInfo> list = new ArrayList<>();
+        try {
+            for (String groupJob : scheduler.getJobGroupNames()) {
+                for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.<JobKey>groupEquals(groupJob))) {
+                    List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
+                    for (Trigger trigger : triggers) {
+                        JobInfo jobInfo = new JobInfo();
+                        Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
+                        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
+                        String cronExpression = "";
+                        if (trigger instanceof CronTrigger) {
+                            CronTrigger cronTrigger = (CronTrigger) trigger;
+                            cronExpression = cronTrigger.getCronExpression();
+                            jobInfo.setCron(cronExpression);
+                        }
+                        jobInfo.setJobName(jobKey.getName());
+                        jobInfo.setJobGroup(jobKey.getGroup());
+                        jobInfo.setTriggerGroup(trigger.getKey().getGroup());
+                        jobInfo.setTriggerName(trigger.getKey().getName());
+                        jobInfo.setJobStatus(triggerState.name());
+                        jobInfo.setJobClassName(jobDetail.getJobClass().toGenericString());
+                        jobInfo.setJobDataMap(jobDetail.getJobDataMap());
+                        list.add(jobInfo);
+                    }
+                }
+            }
+        } catch (SchedulerException e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+}

+ 75 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/service/WeeklyService.java

@@ -0,0 +1,75 @@
+package com.bosshand.virgo.api.service;
+
+import com.bosshand.virgo.api.dao.WeeklyDao;
+import com.bosshand.virgo.api.dao.WeeklySetDao;
+import com.bosshand.virgo.api.dao.WeeklyTypeDao;
+import com.bosshand.virgo.api.model.Weekly;
+import com.bosshand.virgo.api.model.WeeklySet;
+import com.bosshand.virgo.api.model.WeeklyType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class WeeklyService {
+
+    @Autowired
+    WeeklyDao weeklyDao;
+
+    @Autowired
+    WeeklyTypeDao weeklyTypeDao;
+
+    @Autowired
+    WeeklySetDao weeklySetDao;
+
+    public List<Weekly> getByProjectId(long projectId){
+       return weeklyDao.getByProjectId(projectId);
+    }
+
+    public List<Weekly> getByProject(long projectId) {
+        return weeklyDao.getByProject(projectId);
+    }
+
+    public List<Weekly> getByOrganization(long organizationId, long projectId) {
+        return weeklyDao.getByOrganization(organizationId, projectId);
+    }
+
+    public Weekly updateState(Weekly weekly){
+        weeklyDao.updateState(weekly);
+        return weeklyDao.get(weekly.getId());
+    }
+
+    public WeeklyType saveWeeklyType (WeeklyType weeklyType){
+        weeklyTypeDao.save(weeklyType);
+        return weeklyType;
+    }
+
+    public WeeklyType updateWeeklyType (WeeklyType weeklyType){
+        weeklyTypeDao.update(weeklyType);
+        return weeklyType;
+    }
+
+    public List<WeeklyType> getByWeeklyId (long weeklyId){
+        return weeklyTypeDao.getByWeeklyId(weeklyId);
+    }
+
+    public WeeklyType getWeeklyType (long id){
+        return weeklyTypeDao.getWeeklyType(id);
+    }
+
+    public WeeklySet saveWeeklySet(WeeklySet weeklySet) {
+        weeklySetDao.save(weeklySet);
+        return weeklySet;
+    }
+
+    public WeeklySet updateWeeklySet(WeeklySet weeklySet) {
+        weeklySetDao.update(weeklySet);
+        return weeklySet;
+    }
+
+    public List<WeeklySet> getByWeeklySet(WeeklySet weeklySet) {
+        return weeklySetDao.get(weeklySet);
+    }
+
+}

+ 21 - 1
virgo.api/src/main/resources/application.properties

@@ -48,4 +48,24 @@ spring.redis.jedis.pool.max-wait=-1
 spring.redis.jedis.pool.max-idle=8
 spring.redis.jedis.pool.min-idle=0
 spring.redis.timeout=3000
-spring.redis.expire=3600
+spring.redis.expire=3600
+
+spring.quartz.job-store-type=jdbc
+spring.quartz.wait-for-jobs-to-complete-on-shutdown=false
+spring.quartz.overwrite-existing-jobs=true
+spring.quartz.auto-startup=true
+spring.quartz.startup-delay=0s
+spring.quartz.jdbc.initialize-schema=never
+spring.quartz.properties.org.quartz.scheduler.instanceName=QuartzScheduler
+spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
+spring.quartz.properties.org.quartz.jobStore.class=org.springframework.scheduling.quartz.LocalDataSourceJobStore
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
+spring.quartz.properties.org.quartz.jobStore.isClustered=true
+spring.quartz.properties.org.quartz.jobStore.dataSource=quartz
+spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=10000
+spring.quartz.properties.org.quartz.jobStore.useProperties=false
+spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+spring.quartz.properties.org.quartz.threadPool.threadCount=10
+spring.quartz.properties.org.quartz.threadPool.threadPriority=5
+spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true

+ 9 - 5
virgo.api/src/main/resources/mapper/PaymentMapper.xml

@@ -7,6 +7,7 @@
     <resultMap type="com.bosshand.virgo.api.model.Payment" id="paymentResult">
         <id column="id" property="id"/>
         <result column="reminderDate" property="reminderDate"/>
+        <result column="reminderStatus" property="reminderStatus"/>
         <result column="projectId" property="projectId"/>
         <result column="contractCode" property="contractCode"/>
         <result column="contractId" property="contractId"/>
@@ -37,11 +38,11 @@
     </delete>
 
     <update id="updateStatus" parameterType="com.bosshand.virgo.api.model.Payment">
-        UPDATE payment
-        <trim prefix="set" suffixOverrides=",">
-            <if test="status!=null">status=#{status},</if>
-        </trim>
-        WHERE id=#{id}
+        UPDATE payment SET status= #{status} WHERE id=#{id}
+    </update>
+
+    <update id="updateReminderStatus" parameterType="com.bosshand.virgo.api.model.Payment">
+        UPDATE payment SET reminderStatus= #{reminderStatus} WHERE id=#{id}
     </update>
 
     <select id="getContractId" resultMap="paymentResult">
@@ -81,6 +82,9 @@
             <if test="status != null">
                 and status = #{status}
             </if>
+            <if test="reminderStatus != null">
+                and reminderStatus = #{reminderStatus}
+            </if>
         </where>
     </select>
 

+ 35 - 0
virgo.api/src/main/resources/mapper/ProjectCityWeatherMapper.xml

@@ -0,0 +1,35 @@
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.bosshand.virgo.api.dao.ProjectCityWeatherDao">
+
+    <resultMap type="com.bosshand.virgo.api.model.ProjectCityWeather" id="projectCityWeatherResult">
+        <id column="id" property="id"/>
+        <result column="projectId" property="projectId"/>
+        <result column="date" property="date"/>
+        <result column="weatherData" property="weatherData"/>
+    </resultMap>
+
+    <insert id="save" parameterType="com.bosshand.virgo.api.model.ProjectCityWeather" useGeneratedKeys="true" keyProperty="id">
+        insert into project_city_weather(projectId, date, weatherData) VALUES (#{projectId}, #{date}, #{weatherData})
+    </insert>
+
+    <select id="getMax" resultMap="projectCityWeatherResult">
+        SELECT * FROM project_city_weather WHERE date = ( SELECT MAX(date) FROM project_city_weather ) and projectId = #{projectId}
+    </select>
+
+    <select id="getList" resultMap="projectCityWeatherResult">
+        select * from project_city_weather where projectId = #{projectId}
+    </select>
+
+    <select id="getProjectId" resultMap="projectCityWeatherResult">
+        select * from project_city_weather where date  <![CDATA[>=]]>  #{startDate} and date <![CDATA[<=]]> #{endDate}
+        and projectId = #{projectId}
+    </select>
+
+    <delete id="delete">
+        delete from project_city_weather where id = #{id}
+    </delete>
+
+</mapper>

+ 8 - 2
virgo.api/src/main/resources/mapper/ProjectMapper.xml

@@ -4,6 +4,7 @@
 
 	<resultMap type="com.bosshand.virgo.api.model.Project" id="result">
 		<id column="id" property="id"/>
+		<result column="generateWeeklyDate" property="generateWeeklyDate"/>
 		<result column="type" property="type"/>
 		<result column="name" property="name"/>
 		<result column="createDate" property="createDate"/>
@@ -20,6 +21,7 @@
 
 	<resultMap type="com.bosshand.virgo.api.model.Project" id="projectResult">
 		<id column="id" property="id"/>
+		<result column="generateWeeklyDate" property="generateWeeklyDate"/>
 		<result column="type" property="type"/>
 		<result column="name" property="name"/>
 		<result column="createDate" property="createDate"/>
@@ -67,6 +69,10 @@
 		SELECT * FROM project WHERE id=#{id}
 	</select>
 
+	<select id="getAll" resultMap="result">
+		SELECT * FROM project WHERE deleteState = 0
+	</select>
+
 	<select id="getIds" resultMap="result">
 		SELECT * FROM project WHERE id in
 		<foreach collection="list" open="(" separator="," close=")" item="id">
@@ -85,8 +91,8 @@
 	</select>
 
 	<insert id="insert" parameterType="com.bosshand.virgo.api.model.Project" useGeneratedKeys="true" keyProperty="id">
-		INSERT INTO project(`type`, `name`, `createDate`, `organizationId`, `address`, `picture`, `tagIds`, `comment`, `coordinates`, `supportingFacilities`, `data`)
-		VALUES (#{type}, #{name}, now(), #{organizationId}, #{address}, #{picture}, #{tagIds}, #{comment}, #{coordinates}, #{supportingFacilities}, #{data})
+		INSERT INTO project(`generateWeeklyDate`, `type`, `name`, `createDate`, `organizationId`, `address`, `picture`, `tagIds`, `comment`, `coordinates`, `supportingFacilities`, `data`)
+		VALUES (#{generateWeeklyDate}, #{type}, #{name}, now(), #{organizationId}, #{address}, #{picture}, #{tagIds}, #{comment}, #{coordinates}, #{supportingFacilities}, #{data})
 	</insert>
 
 	<update id="delete">

+ 60 - 0
virgo.api/src/main/resources/mapper/WeeklyMapper.xml

@@ -0,0 +1,60 @@
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.bosshand.virgo.api.dao.WeeklyDao">
+
+    <resultMap type="com.bosshand.virgo.api.model.Weekly" id="weeklyResult">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="organizationId" property="organizationId"/>
+        <result column="organizationName" property="organizationName"/>
+        <result column="projectId" property="projectId"/>
+        <result column="projectName" property="projectName"/>
+        <result column="createDate" property="createDate"/>
+        <result column="startDate" property="startDate"/>
+        <result column="endDate" property="endDate"/>
+        <result column="state" property="state"/>
+        <result column="number" property="number"/>
+    </resultMap>
+
+    <insert id="save" parameterType="com.bosshand.virgo.api.model.Weekly" useGeneratedKeys="true" keyProperty="id">
+        insert into weekly(name, organizationId, projectId, createDate, startDate, endDate, state, number) VALUES
+        (#{name}, #{organizationId}, #{projectId}, now(), #{startDate}, #{endDate}, #{state}, #{number})
+    </insert>
+
+    <sql id="query">
+        SELECT a.*, b.name as organizationName, c.name as projectName FROM weekly a
+        LEFT JOIN mgr_organization b ON a.organizationId = b.id
+        LEFT JOIN project c ON a.projectId = c.id
+    </sql>
+
+    <select id="getByProject" resultMap="weeklyResult">
+        <include refid="query"/>
+        where a.projectId = #{projectId} and a.state = 1
+    </select>
+
+    <select id="getByOrganization" resultMap="weeklyResult">
+        <include refid="query"/>
+        where a.organizationId = #{organizationId} and a.projectId = #{projectId} and a.state = 1
+    </select>
+
+    <select id="getByProjectId" resultMap="weeklyResult">
+        <include refid="query"/>
+        where a.projectId = #{projectId}
+    </select>
+
+    <select id="getMax" resultMap="weeklyResult">
+        SELECT * FROM weekly WHERE number=(SELECT Max(number) FROM weekly) and projectId  = #{projectId}
+    </select>
+
+    <select id="get" resultMap="weeklyResult">
+        <include refid="query"/>
+        where a.id = #{id}
+    </select>
+
+    <update id="updateState" parameterType="com.bosshand.virgo.api.model.Weekly">
+        update weekly set state =#{state} where id = #{id}
+    </update>
+
+</mapper>

+ 50 - 0
virgo.api/src/main/resources/mapper/WeeklySetMapper.xml

@@ -0,0 +1,50 @@
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.bosshand.virgo.api.dao.WeeklySetDao">
+
+    <resultMap type="com.bosshand.virgo.api.model.WeeklySet" id="weeklySetResult">
+        <id column="id" property="id"/>
+        <result column="organizationId" property="organizationId"/>
+        <result column="projectId" property="projectId"/>
+        <result column="submiter" property="submiter"/>
+        <result column="checker" property="checker"/>
+        <result column="type" property="type"/>
+    </resultMap>
+
+    <insert id="save" parameterType="com.bosshand.virgo.api.model.WeeklySet" useGeneratedKeys="true" keyProperty="id">
+        insert into weekly_set(organizationId, projectId, submiter, checker, type) VALUES (#{organizationId}, #{projectId}, #{submiter}, #{checker}, #{type})
+    </insert>
+
+    <select id="get" resultMap="weeklySetResult">
+        SELECT * FROM weekly_set
+        <where>
+            <if test="id != 0">
+                and id = #{id}
+            </if>
+            <if test="projectId != 0">
+                and projectId = #{projectId}
+            </if>
+            <if test="organizationId != 0">
+                and organizationId = #{organizationId}
+            </if>
+            <if test="type != 0">
+                and type = #{type}
+            </if>
+        </where>
+    </select>
+
+    <update id="update" parameterType="com.bosshand.virgo.api.model.WeeklyType">
+        update weekly_set
+        <trim prefix="set" suffixOverrides=",">
+            <if test="organizationId!=0">organizationId=#{organizationId},</if>
+            <if test="projectId!=0">projectId=#{projectId},</if>
+            <if test="submiter!=null">submiter=#{submiter},</if>
+            <if test="checker!=null">checker=#{checker},</if>
+            <if test="type!=0">type=#{type},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+</mapper>

+ 45 - 0
virgo.api/src/main/resources/mapper/WeeklyTypeMapper.xml

@@ -0,0 +1,45 @@
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.bosshand.virgo.api.dao.WeeklyTypeDao">
+
+    <resultMap type="com.bosshand.virgo.api.model.WeeklyType" id="weeklyTypeResult">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="data" property="data"/>
+        <result column="type" property="type"/>
+        <result column="weeklyId" property="weeklyId"/>
+    </resultMap>
+
+    <insert id="save" parameterType="com.bosshand.virgo.api.model.WeeklyType" useGeneratedKeys="true" keyProperty="id">
+        insert into weekly_type(name, data, type, weeklyId) VALUES
+        (#{name}, #{data}, #{type}, #{weeklyId})
+    </insert>
+
+    <insert id="batchSave" parameterType="com.bosshand.virgo.api.model.WeeklyType" useGeneratedKeys="true" keyProperty="id">
+        insert into weekly_type(name, data, type, weeklyId) VALUES
+        <foreach collection="list" item="node" separator="," index="index">
+            (#{node.name}, #{node.data}, #{node.type}, #{node.weeklyId})
+        </foreach>
+    </insert>
+
+    <select id="getByWeeklyId" resultMap="weeklyTypeResult">
+        select * from weekly_type where weeklyId = #{weeklyId}
+    </select>
+
+    <select id="getWeeklyType" resultMap="weeklyTypeResult">
+        select * from weekly_type where id = #{id}
+    </select>
+
+    <update id="update" parameterType="com.bosshand.virgo.api.model.WeeklyType">
+        update weekly_type
+        <trim prefix="set" suffixOverrides=",">
+            <if test="name!=null">name=#{name},</if>
+            <if test="data!=null">data=#{data},</if>
+            <if test="weeklyId!=0">weeklyId=#{weeklyId},</if>
+        </trim>
+       where id = #{id}
+    </update>
+
+</mapper>

+ 81 - 97
virgo.core/src/main/java/com/bosshand/virgo/core/utils/HttpsUtils.java

@@ -1,116 +1,100 @@
 package com.bosshand.virgo.core.utils;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.X509TrustManager;
+import java.io.*;
 import java.net.URL;
 import java.net.URLConnection;
+import java.nio.charset.StandardCharsets;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
 
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSocketFactory;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-
 public class HttpsUtils implements X509TrustManager {
 
-	public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {
-		StringBuffer buffer = null;
-		try {
-			// 创建SSLContext
-			SSLContext sslContext = SSLContext.getInstance("SSL");
-			TrustManager[] tm = { new HttpsUtils() };
-			// 初始化
-			sslContext.init(null, tm, new java.security.SecureRandom());
+    public static String httpsRequest(String requestUrl, String requestMethod, String output) {
+        try {
+            URL url = new URL(requestUrl);
+            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setUseCaches(false);
+            connection.setRequestMethod(requestMethod);
+            if (null != output) {
+                OutputStream outputStream = connection.getOutputStream();
+                outputStream.write(output.getBytes(StandardCharsets.UTF_8));
+                outputStream.close();
+            }
+            // 从输入流读取返回内容
+            InputStream inputStream = connection.getInputStream();
+            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
+            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
+            String str;
+            StringBuilder buffer = new StringBuilder();
+            while ((str = bufferedReader.readLine()) != null) {
+                buffer.append(str);
+            }
+            bufferedReader.close();
+            inputStreamReader.close();
+            inputStream.close();
+            connection.disconnect();
+            return buffer.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
 
-			// 获取SSLSocketFactory对象
-			SSLSocketFactory ssf = sslContext.getSocketFactory();
-			URL url = new URL(requestUrl);
-			HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
-			conn.setDoOutput(true);
-			conn.setDoInput(true);
-			conn.setUseCaches(false);
-			conn.setRequestMethod(requestMethod);
-			// 设置当前实例使用的SSLSoctetFactory
-			conn.setSSLSocketFactory(ssf);
-			conn.connect();
-			// 往服务器端写内容
-			if (null != outputStr) {
-				OutputStream os = conn.getOutputStream();
-				os.write(outputStr.getBytes("utf-8"));
-				os.close();
-			}
+    public static String getResult(String url) {
+        return httpsRequest(url, "GET", null);
+    }
 
-			// 读取服务器端返回的内容
-			InputStream is = conn.getInputStream();
-			InputStreamReader isr = new InputStreamReader(is, "utf-8");
-			BufferedReader br = new BufferedReader(isr);
-			buffer = new StringBuffer();
-			String line = null;
-			while ((line = br.readLine()) != null) {
-				buffer.append(line);
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return buffer.toString();
-	}
+    public static String getHttpsResult(String projectUrl) {
+        String url = projectUrl = projectUrl.replaceAll("http", "https").replaceAll(":80/", "/");
+        return httpsRequest(url, "GET", null);
+    }
 
-	public static String getResult(String url) {
-		return httpsRequest(url, "GET", null);
-	}
-	
-	public static String getHttpsResult(String projectUrl) {
-		String url = projectUrl = projectUrl.replaceAll("http", "https").replaceAll(":80/", "/");
-		return httpsRequest(url, "GET", null);
-	}
+    @Override
+    public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
 
-	@Override
-	public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+    }
 
-	}
+    @Override
+    public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
 
-	@Override
-	public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+    }
 
-	}
+    @Override
+    public X509Certificate[] getAcceptedIssuers() {
+        return null;
+    }
 
-	@Override
-	public X509Certificate[] getAcceptedIssuers() {
-		return null;
-	}
-	
-	public static String getPath(String url) {
-		String result = "";
-		BufferedReader read = null;
-		try {
-			URL realurl = new URL(url);
-			URLConnection connection = realurl.openConnection();
-			connection.setRequestProperty("accept", "*/*");
-			connection.setRequestProperty("connection", "Keep-Alive");
-			connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
-			connection.connect();
-			read = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
-			String line;
-			while ((line = read.readLine()) != null) {
-				result += line;
-			}
-		} catch (IOException e) {
-			e.printStackTrace();
-		} finally {
-			if (read != null) {
-				try {
-					read.close();
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-		return result;
-	}
+    public static String getPath(String url) {
+        String result = "";
+        BufferedReader read = null;
+        try {
+            URL realurl = new URL(url);
+            URLConnection connection = realurl.openConnection();
+            connection.setRequestProperty("accept", "*/*");
+            connection.setRequestProperty("connection", "Keep-Alive");
+            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            connection.connect();
+            read = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
+            String line;
+            while ((line = read.readLine()) != null) {
+                result += line;
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (read != null) {
+                try {
+                    read.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return result;
+    }
 
 }