Forráskód Böngészése

1.项目成本管理的费用报销和工时成本
2.删除人员转移项目、日报、任务数据
3.周六、周日、节假日提醒功能
4.未填报人员接口的数据返回

cs 2 éve
szülő
commit
2d715c5e00
17 módosított fájl, 258 hozzáadás és 31 törlés
  1. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  2. 0 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  3. 9 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  4. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  5. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ExpenseItemMapper.java
  6. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  7. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  8. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  9. 9 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TimeTypeService.java
  10. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  11. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  12. 12 15
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  13. 46 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TimeTypeServiceImpl.java
  14. 114 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  15. 5 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  16. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ExpenseItemMapper.xml
  17. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

+ 12 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -1173,5 +1173,17 @@ public class ProjectController {
         return projectService.exportSubProjectTimeCost(request,startDate,endDate,projectId);
     }
 
+    /**
+     * 项目的工时成本
+     * @param request
+     * @param startDate
+     * @param endDate
+     * @param projectId
+     * @return
+     */
+    @RequestMapping("/timeCostAndExpenseByProject")
+    public HttpRespMsg timeCostAndExpenseByProject(HttpServletRequest request,String startDate,String endDate,Integer projectId){
+        return projectService.timeCostAndExpenseByProject(request,startDate,endDate,projectId);
+    }
 }
 

+ 0 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -1506,13 +1506,5 @@ public class ReportController {
         return reportService.correctWorkingTime(userIds,startDate,endDate);
     }
 
-    /**
-     * 转移日报
-     * @return
-     */
-    @RequestMapping("/moveReport")
-    public HttpRespMsg moveReport(String sourceId,String targetId){
-        return reportService.moveReport(sourceId,targetId,request);
-    }
 }
 

+ 9 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java

@@ -233,5 +233,14 @@ public class UserController {
         return userService.mobSkipGuidance(request);
     }
 
+    /**
+     * 转移人员的日报、任务、项目等相关信息
+     * @return
+     */
+    @RequestMapping("/moveUserData")
+    public HttpRespMsg moveUserData(String sourceId,String targetId){
+        return userService.moveUserData(sourceId,targetId,request);
+    }
+
 }
 

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -273,7 +273,7 @@ public class TimeType extends Model<TimeType> {
     private Integer alertType;
 
     /**
-     * 0:节假日不提醒,1:节假日提醒
+     * 采用三位组合,第一位代表周六,第二位代表周日,第三位代表其他节假日,0代表不提醒,1代表提醒
      */
     @TableField("alert_non_workday")
     private Integer alertNonWorkday;

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ExpenseItemMapper.java

@@ -17,4 +17,6 @@ import java.util.Map;
  */
 public interface ExpenseItemMapper extends BaseMapper<ExpenseItem> {
     List<ExpenseItemVO> getUserExpenseDetail(Integer projectId);
+
+    Double selectExpenseByProject(String startDate, String endDate, Integer projectId);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -153,4 +153,6 @@ public interface ReportMapper extends BaseMapper<Report> {
     List<HashMap<String, Object>> geReportByProject(String startDate, Integer companyId, String endDate);
 
     Map<String, Object> getDefaultDegree(Integer companyId, String userId, Integer projectId);
+
+    Map<String, Object> selectCostTimeByProject(String startDate, String endDate, Integer projectId);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java

@@ -223,4 +223,6 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg exportSubProjectTimeCost(HttpServletRequest request,String startDate,String endDate, Integer projectId);
 
     HttpRespMsg exportDegreeCost(String startDate, String endDate, Integer projectId,Integer deptId, HttpServletRequest request);
+
+    HttpRespMsg timeCostAndExpenseByProject(HttpServletRequest request, String startDate, String endDate, Integer projectId);
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java

@@ -106,5 +106,5 @@ public interface ReportService extends IService<Report> {
 
 	HttpRespMsg approveDeptAuditReport(User user, String auditDeptId);
 
-    HttpRespMsg moveReport(String sourceId,String targetId,HttpServletRequest request);
+    void moveReport(User sourceUser,User targetUser);
 }

+ 9 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TimeTypeService.java

@@ -3,6 +3,8 @@ package com.management.platform.service;
 import com.management.platform.entity.TimeType;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.time.LocalDate;
+
 /**
  * <p>
  *  服务类
@@ -12,5 +14,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @since 2021-02-07
  */
 public interface TimeTypeService extends IService<TimeType> {
-
+    /**
+     * 判断某公司某天是否为工作日
+     * @param companyId
+     * @param date
+     * @return
+     */
+    Boolean isWorkDay(Integer companyId, LocalDate date);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java

@@ -81,4 +81,6 @@ public interface UserService extends IService<User> {
     HttpRespMsg skipGuidance(HttpServletRequest request);
 
     HttpRespMsg mobSkipGuidance(HttpServletRequest request);
+
+    HttpRespMsg moveUserData(String sourceId, String targetId, HttpServletRequest request);
 }

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -9292,4 +9292,21 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return parent;
     }
 
+    /**
+     * 按照项目筛选的工时成本和报销成本
+     * @param request
+     * @param startDate
+     * @param endDate
+     * @param projectId
+     * @return
+     */
+    @Override
+    public HttpRespMsg timeCostAndExpenseByProject(HttpServletRequest request, String startDate, String endDate, Integer projectId) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        Map<String, Object> map = reportMapper.selectCostTimeByProject(startDate, endDate, projectId);
+        Double expense = expenseItemMapper.selectExpenseByProject(startDate, endDate, projectId);
+        map.put("expense",expense);
+        httpRespMsg.data = map;
+        return httpRespMsg;
+    }
 }

+ 12 - 15
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -199,6 +199,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     RestTemplate restTemplate;
     @Resource
     private ReportAuditLogService reportAuditLogService;
+    @Resource
+    private TimeTypeService timeTypeService;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -4588,7 +4590,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         continue;
                     }
                     //去掉非工作日
-                    if (!WorkDayCalculateUtils.isWorkDay(date)) {
+                    Boolean workDay = timeTypeService.isWorkDay(companyId, date);
+                    if (!workDay){
                         continue;
                     }
                     //去掉设置了分摊比例的人员
@@ -5364,18 +5367,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     /**
-     * 转移日报
+     * 转移日报相关数据
      * @return
      */
     @Override
-    public HttpRespMsg moveReport(String sourceId,String targetId,HttpServletRequest request) {
-        HttpRespMsg httpRespMsg = new HttpRespMsg();
-        //源
-        User sourceUser = userMapper.selectById(sourceId);
-        //目标
-        User targetUser = userMapper.selectById(targetId);
+    public void moveReport(User sourceUser,User targetUser) {
         //转移日报
-        List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", sourceId));
+        List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", sourceUser.getId()));
         if (reportList.size() != 0){
             for (Report report : reportList) {
                 report.setCreatorId(targetUser.getId());
@@ -5384,7 +5382,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             reportService.updateBatchById(reportList);
         }
         //转移日报的log
-        List<ReportLog> reportCreatorLogList = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("creator_id", sourceId));
+        List<ReportLog> reportCreatorLogList = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("creator_id", sourceUser.getId()));
         if (reportCreatorLogList.size() != 0){
             for (ReportLog log : reportCreatorLogList) {
                 log.setCreatorId(targetUser.getId());
@@ -5392,7 +5390,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             reportLogService.updateBatchById(reportCreatorLogList);
         }
 
-        List<ReportLog> reportOperatorLogList = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("operator_id", sourceId));
+        List<ReportLog> reportOperatorLogList = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("operator_id", sourceUser.getId()));
         if (reportCreatorLogList.size() != 0){
             for (ReportLog log : reportOperatorLogList) {
                 log.setOperatorId(targetUser.getId());
@@ -5402,7 +5400,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             reportLogService.updateBatchById(reportOperatorLogList);
         }
 
-        List<ReportAlogMembdate> reportAlogMembdateList = reportAlogMembdateMapper.selectList(new QueryWrapper<ReportAlogMembdate>().eq("user_id", sourceId));
+        List<ReportAlogMembdate> reportAlogMembdateList = reportAlogMembdateMapper.selectList(new QueryWrapper<ReportAlogMembdate>().eq("user_id", sourceUser.getId()));
         if (reportAlogMembdateList.size() != 0){
             for (ReportAlogMembdate alogMembdate : reportAlogMembdateList) {
                 alogMembdate.setUserId(targetUser.getId());
@@ -5411,7 +5409,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             reportAlogMembdateService.updateBatchById(reportAlogMembdateList);
         }
 
-        List<ReportAuditLog> reportAuditLogList = reportAuditLogMapper.selectList(new QueryWrapper<ReportAuditLog>().eq("user_id", sourceId));
+        List<ReportAuditLog> reportAuditLogList = reportAuditLogMapper.selectList(new QueryWrapper<ReportAuditLog>().eq("user_id", sourceUser.getId()));
         if (reportAuditLogList.size() != 0){
             for (ReportAuditLog auditLog : reportAuditLogList) {
                 auditLog.setUserId(targetUser.getId());
@@ -5420,7 +5418,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             reportAuditLogService.updateBatchById(reportAuditLogList);
         }
 
-        List<ReportLogDetail> reportLogDetailsList = reportLogDetailMapper.selectList(new QueryWrapper<ReportLogDetail>().eq("operator_id",sourceId));
+        List<ReportLogDetail> reportLogDetailsList = reportLogDetailMapper.selectList(new QueryWrapper<ReportLogDetail>().eq("operator_id",sourceUser.getId()));
         if (reportLogDetailsList.size() != 0){
             for (ReportLogDetail logDetail : reportLogDetailsList) {
                 logDetail.setOperatorId(targetUser.getId());
@@ -5429,6 +5427,5 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             reportLogDetailService.updateBatchById(reportLogDetailsList);
         }
-        return httpRespMsg;
     }
 }

+ 46 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TimeTypeServiceImpl.java

@@ -1,11 +1,18 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.TimeType;
 import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.service.TimeTypeService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.WorkDayCalculateUtils;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.util.Calendar;
+import java.util.Locale;
+
 /**
  * <p>
  *  服务实现类
@@ -17,4 +24,43 @@ import org.springframework.stereotype.Service;
 @Service
 public class TimeTypeServiceImpl extends ServiceImpl<TimeTypeMapper, TimeType> implements TimeTypeService {
 
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
+
+    /**
+     * 判断某公司某天是否是工作日
+     * @param companyId
+     * @param date
+     * @return
+     */
+    @Override
+    public Boolean isWorkDay(Integer companyId, LocalDate date) {
+        Boolean workDay = true;
+        TimeType t = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", companyId));
+        String alertNonWorkday = t.getAlertNonWorkday().toString();
+        if (alertNonWorkday.length() == 1){
+            alertNonWorkday = "00" +alertNonWorkday;
+        } else if (alertNonWorkday.length() == 2){
+            alertNonWorkday = "0" + alertNonWorkday;
+        }
+        char[] alertNonWorkdays = alertNonWorkday.toCharArray();
+        char saturday = alertNonWorkdays[0];
+        char sunday = alertNonWorkdays[1];
+        char otherHolidays = alertNonWorkdays[2];
+        String displayName = date.getDayOfWeek().toString();
+        if ("SATURDAY".equals(displayName)){
+            if (saturday == '0') {
+                workDay = false;
+            }
+        }else if ("SUNDAY".equals(displayName)){
+            if (sunday == '0') {
+                workDay = false;
+            }
+        }else if (!WorkDayCalculateUtils.isWorkDay(date)){
+            if (otherHolidays == '0') {
+                workDay = false;
+            }
+        }
+        return workDay;
+    }
 }

+ 114 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -164,6 +164,22 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     SysConfigMapper sysConfigMapper;
     @Resource
     private ReportFormMapper reportFormMapper;
+    @Resource
+    private ProjectService projectService;
+    @Resource
+    private ProjectAuditorService projectAuditorService;
+    @Resource
+    private TaskService taskService;
+    @Resource
+    private TaskCommentMapper taskCommentMapper;
+    @Resource
+    private TaskCommentService taskCommentService;
+    @Resource
+    private TaskExecutorMapper taskExecutorMapper;
+    @Resource
+    private TaskExecutorService taskExecutorService;
+    @Resource
+    private TaskGroupService taskGroupService;
 
     public static String provider_access_token = null;
     public static long providerTokenExpireTime = 0L;
@@ -2562,4 +2578,102 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         }
         return true;
     }
+
+    /**
+     * 转移日报、任务、项目
+     * @return
+     */
+    @Override
+    public HttpRespMsg moveUserData(String sourceId,String targetId,HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        //源
+        User sourceUser = userMapper.selectById(sourceId);
+        //目标
+        User targetUser = userMapper.selectById(targetId);
+        //转移日报
+        reportService.moveReport(sourceUser,targetUser);
+
+        //转移用户负责的项目
+        List<Project> projectInchargerList = projectMapper.selectList(new QueryWrapper<Project>().eq("incharger_id", sourceUser.getId()));
+        if (projectInchargerList.size() != 0){
+            for (Project project : projectInchargerList) {
+                project.setInchargerId(targetUser.getId());
+            }
+            projectService.updateBatchById(projectInchargerList);
+        }
+
+        //转移用户创建的项目
+        List<Project> projectCreatorList = projectMapper.selectList(new QueryWrapper<Project>().eq("creator_id", sourceUser.getId()));
+        if (projectCreatorList.size() != 0){
+            for (Project project : projectCreatorList) {
+                project.setCreatorId(targetUser.getId());
+                project.setCreatorName(targetUser.getName());
+            }
+            projectService.updateBatchById(projectCreatorList);
+        }
+
+        //转移项目审核人
+        List<ProjectAuditor> projectAuditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("auditor_id", sourceUser.getId()));
+        if (projectAuditorList.size() != 0){
+            for (ProjectAuditor projectAuditor : projectAuditorList) {
+                projectAuditor.setAuditorId(targetUser.getId());
+                projectAuditor.setAuditorName(targetUser.getName());
+            }
+            projectAuditorService.updateBatchById(projectAuditorList);
+        }
+
+        //转移任务创建人
+        List<Task> taskCreaterList = taskMapper.selectList(new QueryWrapper<Task>().eq("creater_id", sourceUser.getId()));
+        if (taskCreaterList.size() != 0){
+            for (Task task : taskCreaterList) {
+                task.setCreaterId(targetUser.getId());
+                task.setCreaterName(targetUser.getName());
+            }
+            taskService.updateBatchById(taskCreaterList);
+        }
+
+        //转移任务参与人
+        List<Task> taskExecutorList = taskMapper.selectList(new QueryWrapper<Task>().like("executor_id", sourceUser.getId()));
+        if (taskExecutorList.size() != 0){
+            for (Task task : taskExecutorList) {
+                String id = task.getExecutorId().replace(sourceUser.getId(), targetUser.getId());
+                task.setExecutorId(id);
+                String name = task.getExecutorName().replace(sourceUser.getName(), targetUser.getName());
+                task.setExecutorName(name);
+            }
+            taskService.updateBatchById(taskExecutorList);
+        }
+
+        //转移任务留言
+        List<TaskComment> taskCommentList = taskCommentMapper.selectList(new QueryWrapper<TaskComment>().eq("user_id", sourceUser.getId()));
+        if (taskCommentList.size() != 0){
+            for (TaskComment taskComment : taskCommentList) {
+                taskComment.setUserId(targetUser.getId());
+                taskComment.setUserName(targetUser.getName());
+                String content = taskComment.getContent().replace(taskComment.getUserName(), targetUser.getName());
+                taskComment.setContent(content);
+            }
+            taskCommentService.updateBatchById(taskCommentList);
+        }
+
+        //转移任务参与人
+        List<TaskExecutor> taskExecutor = taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().eq("executor_id", sourceUser.getId()));
+        if (taskExecutor.size() != 0){
+            for (TaskExecutor executor : taskExecutor) {
+                executor.setExecutorId(targetUser.getId());
+                executor.setExecutorName(targetUser.getName());
+            }
+            taskExecutorService.updateBatchById(taskExecutor);
+        }
+
+        //转移任务分组负责人
+        List<TaskGroup> taskGroupList = taskGroupMapper.selectList(new QueryWrapper<TaskGroup>().eq("incharger_id", sourceUser.getId()));
+        if (taskGroupList.size() != 0){
+            for (TaskGroup taskGroup : taskGroupList) {
+                taskGroup.setInchargerId(targetUser.getId());
+            }
+            taskGroupService.updateBatchById(taskGroupList);
+        }
+        return httpRespMsg;
+    }
 }

+ 5 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -129,6 +129,8 @@ public class TimingTask {
     private TaskMapper taskMapper;
     @Resource
     private TaskExecutorMapper taskExecutorMapper;
+    @Resource
+    private TimeTypeService timeTypeService;
 
     private static final List<Integer> VALID_TOKEN_CHARS = new ArrayList<>();
     static {
@@ -862,11 +864,9 @@ public class TimingTask {
         typeList.forEach(t->{
             if (str.equals(t.getAlertTime())) {
                 //节假日是否提醒
-                if (t.getAlertNonWorkday().equals(0)){
-                    //判断是否是工作日,非工作日不提醒
-                    if (!WorkDayCalculateUtils.isWorkDay(localDate)) {
-                        return;
-                    }
+                Boolean workDay = timeTypeService.isWorkDay(t.getCompanyId(), localDate);
+                if (!workDay){
+                    return;
                 }
                 //发送推送提醒
                 Company company = companyMapper.selectById(t.getCompanyId());

+ 12 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ExpenseItemMapper.xml

@@ -49,4 +49,16 @@
         where a.project_id = #{projectId}
     </select>
 
+    <select id="selectExpenseByProject" resultType="java.lang.Double">
+        select IFNULL(sum(expense_item.amount),0)
+        from expense_item
+        left join expense_sheet on expense_sheet.id = expense_item.expense_id
+        where expense_item.project_id = #{projectId}
+        <if test="startDate!=null and endDate!=null">
+            and happen_date between #{startDate} and #{endDate}
+        </if>
+        and expense_item.amount is not null
+        and expense_sheet.status = 0
+    </select>
+
 </mapper>

+ 12 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -749,4 +749,16 @@
         ORDER BY create_time DESC
         LIMIT 1
     </select>
+
+    <select id="selectCostTimeByProject" resultType="java.util.Map">
+        select IFNULL(sum(cost),0) as cost,IFNULL(sum(working_time),0) as workingTime
+        from report
+        where report.project_id = #{projectId}
+        <if test="startDate!=null and endDate!=null">
+            and create_time between #{startDate} and #{endDate}
+        </if>
+        and report.cost is not null
+        and state = 1
+    </select>
+
 </mapper>