Ver Fonte

工时成本预警报表接口开发

seyason há 3 anos atrás
pai
commit
64d98ea97e
37 ficheiros alterados com 680 adições e 381 exclusões
  1. 21 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectBasecostSettingController.java
  2. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  3. 35 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectCurrentcostController.java
  4. 36 27
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  5. 12 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  6. 7 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java
  7. 69 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TimeAutoExcludeController.java
  8. 2 133
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  9. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/FinanceProjects.java
  10. 5 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectAddcostItem.java
  11. 11 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectAddcostRecord.java
  12. 7 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectCurrentcost.java
  13. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectSumItem.java
  14. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  15. 45 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeAutoExclude.java
  16. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  17. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  18. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TimeAutoExcludeMapper.java
  19. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  20. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TimeAutoExcludeService.java
  21. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  22. 3 134
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  23. 34 14
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  24. 22 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectAddcostRecordServiceImpl.java
  25. 157 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  26. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  27. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TimeAutoExcludeServiceImpl.java
  28. 10 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  29. 31 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  30. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectAddcostItemMapper.xml
  31. 11 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectAddcostRecordMapper.xml
  32. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectCurrentcostMapper.xml
  33. 13 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  34. 7 6
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  35. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeAutoExcludeMapper.xml
  36. 2 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  37. 23 4
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

+ 21 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectBasecostSettingController.java

@@ -3,11 +3,11 @@ package com.management.platform.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.constant.Constant;
+import com.management.platform.entity.ProjectAddcostItem;
 import com.management.platform.entity.ProjectBasecost;
 import com.management.platform.entity.ProjectBasecostSetting;
-import com.management.platform.mapper.ProjectBasecostMapper;
-import com.management.platform.mapper.ProjectBasecostSettingMapper;
-import com.management.platform.mapper.UserMapper;
+import com.management.platform.entity.ProjectCurrentcost;
+import com.management.platform.mapper.*;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -38,6 +38,10 @@ public class ProjectBasecostSettingController {
 
     @Resource
     ProjectBasecostMapper projectBasecostMapper;
+    @Resource
+    ProjectAddcostItemMapper projectAddcostItemMapper;
+    @Resource
+    ProjectCurrentcostMapper projectCurrentcostMapper;
 
     @RequestMapping("/addOrMod")
     public HttpRespMsg addOrMod(ProjectBasecostSetting setting) {
@@ -64,13 +68,22 @@ public class ProjectBasecostSettingController {
             } else {
                 //检查名称是否有变化
                 ProjectBasecostSetting oldSetting = projectBasecostSettingMapper.selectById(setting.getId());
-                if (!setting.getName().equals(oldSetting.getName())) {
+                if (!setting.getName().equals(oldSetting.getName()) || !setting.getAlarmType().equals(oldSetting.getAlarmType())) {
                     projectBasecostSettingMapper.updateById(setting);
-                    ProjectBasecost cost = new ProjectBasecost();
-                    cost.setBaseName(setting.getName());
-                    projectBasecostMapper.update(cost, new QueryWrapper<ProjectBasecost>().eq("base_id", setting.getId()));
+                    if (!setting.getName().equals(oldSetting.getName())) {
+                        //名称发生变化了,要更新关联表
+                        ProjectBasecost cost = new ProjectBasecost();
+                        cost.setBaseName(setting.getName());
+                        projectBasecostMapper.update(cost, new QueryWrapper<ProjectBasecost>().eq("base_id", setting.getId()));
+                        ProjectAddcostItem addItem = new ProjectAddcostItem();
+                        addItem.setBaseName(setting.getName());
+                        projectAddcostItemMapper.update(addItem, new QueryWrapper<ProjectAddcostItem>().eq("base_id", setting.getId()));
+                        ProjectCurrentcost currentcost = new ProjectCurrentcost();
+                        currentcost.setBaseName(setting.getName());
+                        projectCurrentcostMapper.update(currentcost, new QueryWrapper<ProjectCurrentcost>().eq("base_id", setting.getId()));
+                    }
+                    msg.data = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
                 }
-                msg.data = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
             }
         }
 

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

@@ -71,6 +71,13 @@ public class ProjectController {
         return projectService.saveBatchAccoDegrees(ids, associateDegrees, associateDegreeNames, request);
     }
 
+    @RequestMapping("/addBatchAccoDegrees")
+    public HttpRespMsg addBatchAccoDegrees(String ids,
+                                            String associateDegrees,
+                                            String associateDegreeNames) {
+        return projectService.addBatchAccoDegrees(ids, associateDegrees, associateDegreeNames, request);
+    }
+
     /**
      * 添加或编辑项目
      * id 要编辑项目的id 可填
@@ -415,5 +422,15 @@ public class ProjectController {
     public HttpRespMsg getMyUsers() {
         return projectService.getMyUsers(request);
     }
+
+    @RequestMapping("/getBaseCostAndRealCost")
+    public HttpRespMsg getBaseCostAndRealCost(Integer pageIndex, Integer pageSize) {return projectService.getBaseCostAndRealCost(pageIndex, pageSize, request);}
+
+    //导出项目收支平衡表
+    @RequestMapping("/exportBaseCostAndRealCost")
+    public HttpRespMsg exportBaseCostAndRealCost() {
+        return projectService.exportBaseCostAndRealCost(request);
+    }
+
 }
 

+ 35 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectCurrentcostController.java

@@ -14,9 +14,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Optional;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -41,18 +41,44 @@ public class ProjectCurrentcostController {
         List<ProjectCurrentcost> projectCurrentcosts = projectCurrentcostService.list(new QueryWrapper<ProjectCurrentcost>().eq("project_id", projectId));
         HttpRespMsg msg = new HttpRespMsg();
         List<ProjectBasecostSetting> basecostSettingList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
-        double costLimit = projectCurrentcosts.stream().filter(cur->basecostSettingList.stream().anyMatch(setting -> setting.getId().equals(cur.getBaseId()))).mapToDouble(ProjectCurrentcost::getBaseAmount).sum();
+        List<Integer> projectIds = new ArrayList<>();
+        projectIds.add(projectId);
+        List<Map<String, Object>> projectCost = reportMapper.getOneProjectBaseCost(projectId);
+
+        //设置alarmType类型, 实际成本
         projectCurrentcosts.forEach(cur->{
             Optional<ProjectBasecostSetting> first = basecostSettingList.stream().filter(base -> base.getId().equals(cur.getBaseId())).findFirst();
             if (first.isPresent()) {
                 cur.setAlarmType(first.get().getAlarmType());
             }
+            for (Map<String, Object> map : projectCost) {
+                int bid = (int)map.get("basecostId");
+                if (bid == cur.getBaseId()) {
+                    double cost = ((BigDecimal)map.get("cost")).doubleValue();
+                    cur.setRealCost(cost);
+                    break;
+                }
+            }
         });
-        double cost = reportMapper.getOneProjectCost(projectId);
-        HashMap map = new HashMap();
-        map.put("list", projectCurrentcosts);
-        map.put("reportCost", cost);
-        map.put("costLimit", costLimit);
+
+//        double cost = reportMapper.getOneProjectCost(projectId);
+//        HashMap map = new HashMap();
+//        map.put("list", projectCurrentcosts);
+//        map.put("reportCost", cost);
+        msg.data = projectCurrentcosts;
+        return msg;
+    }
+
+    @RequestMapping("/getTimeSheetCostListByProject")
+    public HttpRespMsg getTimeSheetCostListByProject(Integer companyId, Integer projectId) {
+        List<ProjectCurrentcost> projectCurrentcosts = projectCurrentcostService.list(new QueryWrapper<ProjectCurrentcost>().eq("project_id", projectId));
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ProjectBasecostSetting> basecostSettingList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+        //取alarmType为1的,即是工时预警类型的
+        projectCurrentcosts = projectCurrentcosts.stream().filter(cur->{
+            int alarmType = basecostSettingList.stream().filter(base->base.getId().equals(cur.getBaseId())).findFirst().get().getAlarmType();
+            return alarmType == 1;
+        }).collect(Collectors.toList());
         msg.data = projectCurrentcosts;
         return msg;
     }

+ 36 - 27
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -158,7 +158,8 @@ public class ReportController {
                                   Double[] customData,//自定义的数值
                                   String[] projectAuditorId,
                                   Double[] overtimeHours, //加班时长
-                                  String[] customText
+                                  String[] customText,
+                                  Integer[] basecostId //成本基线项的id
                                     ) {
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
@@ -232,6 +233,13 @@ public class ReportController {
                 customText[i] = "-";
             }
         }
+        if (basecostId == null) {
+            basecostId = new Integer[projectId.length];
+            for(int i=0;i<basecostId.length; i++) {
+                basecostId[i] = 0;
+            }
+        }
+
 
         //检查项目是否截止
         List<Integer> integers = Arrays.asList(projectId);
@@ -468,6 +476,7 @@ public class ReportController {
                             report.setProjectAuditorId(projectAuditorId[i]);
                             report.setTaskFinish(taskFinish[i]);
                             report.setCustomText(customText[i]);
+                            report.setBasecostId(basecostId[i]);
 
                             if (auditWorkflowList.size() == 0) {
                                 //没有自定义审核流,默认的直接是项目负责人审核
@@ -526,6 +535,7 @@ public class ReportController {
                                 report.setProjectAuditState(0);
                                 report.setTaskFinish(taskFinish[i]);
                                 report.setCustomText(customText[i]);
+                                report.setBasecostId(basecostId[i]);
                                 if (auditWorkflowList.size() == 0) {
                                     //没有自定义审核流,默认的直接是项目负责人审核
                                     report.setIsDeptAudit(0);
@@ -583,6 +593,7 @@ public class ReportController {
                         report.setProjectAuditorId(projectAuditorId[i]);
                         report.setTaskFinish(taskFinish[i]);
                         report.setCustomText(customText[i]);
+                        report.setBasecostId(basecostId[i]);
                         if (auditWorkflowList.size() == 0) {
                             //没有自定义审核流,默认的直接是项目负责人审核
                             report.setIsDeptAudit(0);
@@ -645,6 +656,7 @@ public class ReportController {
                             report.setProjectAuditState(1);
                             report.setTaskFinish(taskFinish[i]);
                             report.setCustomText(customText[i]);
+                            report.setBasecostId(basecostId[i]);
                             if (auditWorkflowList.size() == 0) {
                                 //没有自定义审核流,直接代填的,就算审核通过
                                 report.setIsDeptAudit(0);
@@ -736,37 +748,34 @@ public class ReportController {
         if (projectBasecostSettings.size() > 0) {
             List<Integer> collect = projectBasecostSettings.stream().map(ProjectBasecostSetting::getId).collect(Collectors.toList());
             List<Integer> projectIds = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
-            //获取当前项目的成本基线值
+//            //获取当前项目的当前成本基线值
             List<ProjectCurrentcost> projectCurrentcosts = projectCurrentcostMapper.selectList(new QueryWrapper<ProjectCurrentcost>().in("base_id", collect).in("project_id", projectIds));
-            Map<Integer, List<ProjectCurrentcost>> listMap = projectCurrentcosts.stream().collect(Collectors.groupingBy(ProjectCurrentcost::getProjectId));
+
             List<Map<String, Object>> costList = reportMapper.getProjectCost(user.getCompanyId(), projectIds);
-            for (Integer pId : projectIds) {
-                List<ProjectCurrentcost> projectCurrentcosts1 = listMap.get(pId);
-                if (projectCurrentcosts1 != null) {
-                    //预算总上限
-                    double total = projectCurrentcosts1.stream().mapToDouble(ProjectCurrentcost::getBaseAmount).sum();
-                    double fillCost = 0;
-                    for (int i=0;i<costList.size(); i++) {
-                        Map<String, Object> mapItem = costList.get(i);
-                        if (((Integer)mapItem.get("projectId")).intValue() == pId) {
-                            fillCost = (double)mapItem.get("cost");
-                            break;
+            for (Report report : reportList) {
+                if (report.getBasecostId() != null && report.getBasecostId() != 0) {
+                    Optional<ProjectCurrentcost> first = projectCurrentcosts.stream().filter(cur -> cur.getProjectId().equals(report.getProjectId()) && cur.getBaseId().equals(report.getBasecostId())).findFirst();
+                    if (first.isPresent()) {
+                        //匹配上了当前成本基线项的设置
+                        double max = first.get().getBaseAmount();
+                        double realCost = 0;
+                        //匹配当前项目的当前成本项已填的成本金额
+                        for (Map<String, Object> mapItem : costList) {
+                            int pid = (int)mapItem.get("projectId");
+                            int baseId = (int) mapItem.get("basecostId");
+                            if (pid == report.getProjectId() && baseId == report.getBasecostId()) {
+                                realCost = ((BigDecimal)mapItem.get("cost")).doubleValue();
+                                break;
+                            }
                         }
-                    }
-                    double leftCost = total - fillCost;
-                    BigDecimal bigDecimal = new BigDecimal(0);
-                    for (Report report : reportList) {
-                        if (report.getProjectId().equals(pId)) {
-                            bigDecimal = bigDecimal.add(report.getCost());
+                        if (max > 0 && realCost > max) {
+                            //超支了,不能提交
+                            String name = projectList.stream().filter(p->p.getId().equals(report.getProjectId())).findFirst().get().getProjectName();
+                            HttpRespMsg msg = new HttpRespMsg();
+                            msg.setError("项目["+name+"]的["+first.get().getBaseName()+"]预算不足,请联系管理人员下拨预算");
+                            return msg;
                         }
                     }
-                    double curFillCost = bigDecimal.doubleValue();
-                    if (curFillCost > leftCost) {
-                        String name = projectList.stream().filter(p->p.getId().equals(pId)).findFirst().get().getProjectName();
-                        HttpRespMsg msg = new HttpRespMsg();
-                        msg.setError("项目["+name+"]工时相关预算不足,请联系管理人员下拨预算");
-                        return msg;
-                    }
                 }
             }
         }

+ 12 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -165,13 +165,13 @@ public class TaskController {
             if (ids.size() > 0) {
                 taskExecutorService.removeByIds(ids);
             }
-
-            task.getExecutorList().forEach(exe->exe.setTaskId(task.getId()));
-            taskExecutorService.saveOrUpdateBatch(task.getExecutorList());
-
-            //新增的执行人
-            msgRecepientList = task.getExecutorList().stream().filter(newT->newT.getExecutorId() != null && !oldExeList.stream().anyMatch(old->newT.getExecutorId().equals(old.getExecutorId())))
-                    .map(TaskExecutor::getExecutorId).collect(Collectors.toList());
+            if (task.getExecutorList().size() > 0) {
+                task.getExecutorList().forEach(exe->exe.setTaskId(task.getId()));
+                taskExecutorService.saveOrUpdateBatch(task.getExecutorList());
+                //新增的执行人
+                msgRecepientList = task.getExecutorList().stream().filter(newT->newT.getExecutorId() != null && !oldExeList.stream().anyMatch(old->newT.getExecutorId().equals(old.getExecutorId())))
+                        .map(TaskExecutor::getExecutorId).collect(Collectors.toList());
+            }
         }
         taskService.saveOrUpdate(task);
         if (isNew) {
@@ -592,6 +592,11 @@ public class TaskController {
     @RequestMapping("/delete")
     public HttpRespMsg delete(Integer id) {
         Task task = taskService.getById(id);
+        if (task == null) {
+            HttpRespMsg msg = new HttpRespMsg();
+            msg.setError("该任务不存在,请刷新查看");
+            return msg;
+        }
         if (task.getParentTid() == null) {
             //删除的是第一级任务,需要调整顺序
             List<Task> afterList = taskService.list(new QueryWrapper<Task>().eq("stages_id", task.getStagesId()).isNull("parent_tid").gt("seq", task.getSeq()));

+ 7 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java

@@ -149,12 +149,14 @@ public class TaskGroupController {
     @RequestMapping("/getGroupIncharger")
     public HttpRespMsg getGroupIncharger(Integer groupId) {
         TaskGroup group = taskGroupService.getById(groupId);
-        User user = userMapper.selectById(group.getInchargerId());
-        HashMap map = new HashMap();
-        map.put("auditorId", user.getId());
-        map.put("auditorName", user.getName());
         List list = new ArrayList();
-        list.add(map);
+        if (!StringUtils.isEmpty(group.getInchargerId())) {
+            User user = userMapper.selectById(group.getInchargerId());
+            HashMap map = new HashMap();
+            map.put("auditorId", user.getId());
+            map.put("auditorName", user.getName());
+            list.add(map);
+        }
         HttpRespMsg msg = new HttpRespMsg();
         msg.data = list;
         return msg;

+ 69 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TimeAutoExcludeController.java

@@ -0,0 +1,69 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.TimeAutoExclude;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.TimeAutoExcludeMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.TimeAutoExcludeService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-09
+ */
+@RestController
+@RequestMapping("/time-auto-exclude")
+public class TimeAutoExcludeController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private TimeAutoExcludeService timeAutoExcludeService;
+    @Resource
+    private UserMapper userMapper;
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(TimeAutoExclude item) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        item.setCompanyId(user.getCompanyId());
+        timeAutoExcludeService.saveOrUpdate(item);
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        String token = request.getHeader("TOKEN");
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(token);
+        if (user.getCompanyId().intValue() == timeAutoExcludeService.getById(id).getCompanyId()) {
+            timeAutoExcludeService.removeById(id);
+        } else {
+            msg.setError("无权操作");
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list() {
+        String token = request.getHeader("TOKEN");
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(token);
+        List<TimeAutoExclude> list = timeAutoExcludeService.list(new QueryWrapper<TimeAutoExclude>().eq("company_id", user.getCompanyId()));
+        msg.data = list;
+        return msg;
+    }
+}
+

+ 2 - 133
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -430,7 +430,6 @@ public class WeiXinCorpController {
                         company = new Company().setCompanyName(corpName)
                                 .setExpirationDate(LocalDateTime.now().plusMonths(1));
                         company.setPackageProject(1);
-                        company.setPackageCustomer(1);
                         company.setPackageExpense(1);
                         companyMapper.insert(company);
 
@@ -755,7 +754,7 @@ public class WeiXinCorpController {
                     LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
             //检测是否是项目经理,项目经理有审核功能权限
             userVO.setLeader(judgeIsLeader(userVO.getId()));
-            getUserRoleMenu(userVO);
+            userService.setUserRoleMenu(userVO);
             msg.data = userVO;
 
         }
@@ -805,7 +804,7 @@ public class WeiXinCorpController {
                 num = auditWorkflowTimeSettingMapper.selectCount(new QueryWrapper<AuditWorkflowTimeSetting>().in("audit_dept_id", deptIds));
             }
             userVO.setHasAuditDept(num>0);
-            getUserRoleMenu(userVO);
+            userService.setUserRoleMenu(userVO);
             msg.data = userVO;
         } else {
             msg.setError("该用户尚未绑定企业微信,需要通过账号密码登录");
@@ -813,136 +812,6 @@ public class WeiXinCorpController {
         return msg;
     }
 
-
-    public void getUserRoleMenu(UserVO user) {
-        Integer roleId = user.getRoleId();
-        //获取公司的套餐
-        Company company = companyMapper.selectById(user.getCompanyId());
-        TimeType timeType = timeTypeMapper.selectById(company.getId());
-        //按照公司开通的模块进行匹配
-        QueryWrapper<SysModule> queryWrapper = new QueryWrapper<SysModule>().eq("package_time", 1);
-        if (company.getPackageProject() == 1) {
-            queryWrapper.or().eq("package_project", 1);
-        }
-        if (company.getPackageOa() == 1) {
-            queryWrapper.or().eq("package_oa", 1);
-        }
-        if (company.getPackageExpense() == 1) {
-            queryWrapper.or().eq("package_expense", 1);
-        }
-        if (company.getPackageCustomer() == 1) {
-            queryWrapper.or().eq("package_customer", 1);
-        }
-        if (company.getPackageEngineering() == 1) {
-            queryWrapper.or().eq("package_engineering", 1);
-        }
-        if (company.getPackageContract() == 1) {
-            queryWrapper.or().eq("package_contract", 1);
-        }
-        if (company.getPackageEtimecard()== 1) {
-            queryWrapper.or().eq("package_etimecard", 1);
-        }
-        if (company.getPackageFinance() == 1) {
-            queryWrapper.or().eq("package_finance", 1);
-        }
-        if (timeType.getReportWorkflow() == 1) {
-            queryWrapper.or().eq("report_workflow", 1);
-        }
-        if (timeType.getNeedDeptAudit() == 1) {
-            queryWrapper.or().eq("need_dept_audit", 1);
-        }
-        queryWrapper.orderByAsc("orderitem");
-
-        //返回菜单
-        List<SysRoleModule> rModules = sysRoleModuleMapper.selectList(new QueryWrapper<SysRoleModule>().eq("role_id", roleId));
-        List<Integer> ids = rModules.stream().map(SysRoleModule::getModuleId).collect(Collectors.toList());
-        //项目报告审核模块,如果参与日报的审核,需要自动加上
-        if (user.isLeader() || user.isHasAuditDept()) {
-            SysModule projectAuditModule = sysModuleMapper.selectOne(new QueryWrapper<SysModule>().eq("name", "项目报告审核"));
-            if (!ids.contains(projectAuditModule.getId())) {
-                ids.add(projectAuditModule.getId());
-            }
-        }
-        List<SysModule> moduleList = sysModuleMapper.selectList(queryWrapper);
-        //过滤一下,这个角色选中的模块
-        moduleList = moduleList.stream().filter(m->ids.contains(m.getId())).collect(Collectors.toList());
-        if (company.getPackageEngineering() == 1) {
-            //生成虚拟的两个审核放进去
-            SysModule proModule = new SysModule();
-            proModule.setName("专业审核");
-            proModule.setPath("/reviewProfession");
-            proModule.setId(0);
-            moduleList.add(1,proModule);
-            SysModule deptModule = new SysModule();
-            deptModule.setName("部门审核");
-            deptModule.setPath("/reviewDepartment");
-            deptModule.setId(0);
-            moduleList.add(2,deptModule);
-        }
-        //组装层级关系,默认只有两级
-        List<SysModule> menuList = new ArrayList<>();
-        for (SysModule module : moduleList) {
-            if (module.getParentId() == null) {
-                menuList.add(module);
-            }
-        }
-        for (SysModule mainMenu : menuList) {
-            List<SysModule> list = moduleList.stream().filter(mod -> mainMenu.getId().equals(mod.getParentId())).collect(Collectors.toList());
-            mainMenu.setChildren(list);
-        }
-        user.setModuleList(menuList);
-        //此处返回权限集合
-        List<Integer> functionIdList = new ArrayList<>();
-        //获取角色所有的功能id
-        List<SysRoleFunction> funList = sysRoleFunctionMapper.selectList(new QueryWrapper<SysRoleFunction>()
-                .eq("role_id", roleId));
-        for (SysRoleFunction sysRoleFunction : funList) {
-            functionIdList.add(sysRoleFunction.getFunctionId());
-        }
-        if (functionIdList.size() > 0) {
-            //根据功能id获取可用的操作代码
-            QueryWrapper<SysFunction> functionQueryWrapper = new QueryWrapper<SysFunction>().eq("package_time", 1);
-            if (company.getPackageProject() == 1) {
-                functionQueryWrapper.or().eq("package_project", 1);
-            }
-            if (company.getPackageOa() == 1) {
-                functionQueryWrapper.or().eq("package_oa", 1);
-            }
-            if (company.getPackageExpense() == 1) {
-                functionQueryWrapper.or().eq("package_expense", 1);
-            }
-            if (company.getPackageCustomer() == 1) {
-                functionQueryWrapper.or().eq("package_customer", 1);
-            }
-            if (company.getPackageEngineering() == 1) {
-                functionQueryWrapper.or().eq("package_engineering", 1);
-            }
-            if (company.getPackageContract() == 1) {
-                functionQueryWrapper.or().eq("package_contract", 1);
-            }
-            if (company.getPackageEtimecard()== 1) {
-                functionQueryWrapper.or().eq("package_etimecard", 1);
-            }
-            if (company.getPackageFinance() == 1) {
-                functionQueryWrapper.or().eq("package_finance", 1);
-            }
-            if (timeType.getReportWorkflow() == 1) {
-                queryWrapper.or().eq("report_workflow", 1);
-            }
-            if (timeType.getNeedDeptAudit() == 1) {
-                queryWrapper.or().eq("need_dept_audit", 1);
-            }
-            functionQueryWrapper.orderByAsc("seq");
-
-            List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);
-            functionList = functionList.stream().filter(f->functionIdList.contains(f.getId())).collect(Collectors.toList());
-            user.setFunctionList(functionList);
-        } else {
-            user.setFunctionList(new ArrayList<>());
-        }
-    }
-
-
     //获取企业微信考勤打卡统计数据
     @RequestMapping("/getUserCheckInDayData")
     public HttpRespMsg getUserCheckInDayData(int companyId, String userId, String startDate, String endDate) {

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/FinanceProjects.java

@@ -57,6 +57,9 @@ public class FinanceProjects extends Model<FinanceProjects> {
     @TableField(exist = false)
     private String categoryName;
 
+    @TableField(exist = false)
+    private Integer categoryId;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 5 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectAddcostItem.java

@@ -1,6 +1,8 @@
 package com.management.platform.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
 import lombok.Data;
@@ -13,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-05-07
+ * @since 2022-05-09
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -22,7 +24,7 @@ public class ProjectAddcostItem extends Model<ProjectAddcostItem> {
 
     private static final long serialVersionUID=1L;
 
-    @TableField("id")
+    @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
     /**
@@ -55,7 +57,7 @@ public class ProjectAddcostItem extends Model<ProjectAddcostItem> {
 
     @Override
     protected Serializable pkVal() {
-        return null;
+        return this.id;
     }
 
 }

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

@@ -8,9 +8,11 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
 import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
@@ -18,7 +20,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-05-07
+ * @since 2022-05-09
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -40,8 +42,16 @@ public class ProjectAddcostRecord extends Model<ProjectAddcostRecord> {
     private String userName;
 
     @TableField("indate")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
     private LocalDateTime indate;
 
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+
 
     @TableField(exist = false)
     private List<ProjectAddcostItem> addItemList;

+ 7 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectCurrentcost.java

@@ -1,6 +1,8 @@
 package com.management.platform.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
 import lombok.Data;
@@ -13,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-05-07
+ * @since 2022-05-09
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -22,7 +24,7 @@ public class ProjectCurrentcost extends Model<ProjectCurrentcost> {
 
     private static final long serialVersionUID=1L;
 
-    @TableField("id")
+    @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
     /**
@@ -52,11 +54,12 @@ public class ProjectCurrentcost extends Model<ProjectCurrentcost> {
     @TableField(exist = false)
     private Integer alarmType;
 
-
+    @TableField(exist = false)
+    private Double realCost;
 
     @Override
     protected Serializable pkVal() {
-        return null;
+        return this.id;
     }
 
 }

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

@@ -8,6 +8,7 @@ import java.math.BigDecimal;
 public class ProjectSumItem {
     public String project;
     //项目分类
+    public Integer categoryId;
     public String categoryName;
     public String projectCode;
     public Integer projectId;

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

@@ -24,7 +24,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2022-05-08
+ * @since 2022-05-09
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -314,6 +314,12 @@ public class Report extends Model<Report> {
     @TableField("custom_text")
     private String customText;
 
+    /**
+     * 对应成本项的id
+     */
+    @TableField("basecost_id")
+    private Integer basecostId;
+
 
     @Override
     protected Serializable pkVal() {

+ 45 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeAutoExclude.java

@@ -0,0 +1,45 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class TimeAutoExclude extends Model<TimeAutoExclude> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField("start_time")
+    private String startTime;
+
+    @TableField("end_time")
+    private String endTime;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

@@ -76,4 +76,6 @@ public interface ProjectMapper extends BaseMapper<Project> {
 
     //获取项目的成本预警和实际工时表
     List<HashMap> getProjectCostAlarm(Integer companyId, Integer pageStart, Integer pageSize);
+
+    List getBaseCostAndRealCost(Integer companyId, Integer pageStart, Integer pageSize);
 }

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

@@ -108,5 +108,5 @@ public interface ReportMapper extends BaseMapper<Report> {
 
     List<Map<String, Object>> getProjectCost(Integer companyId, List<Integer> projectIds);
 
-    Double getOneProjectCost(Integer projectId);
+    List<Map<String, Object>> getOneProjectBaseCost(Integer projectId);
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TimeAutoExcludeMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.TimeAutoExclude;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-09
+ */
+public interface TimeAutoExcludeMapper extends BaseMapper<TimeAutoExclude> {
+
+}

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

@@ -115,4 +115,10 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg saveBatchAccoDegrees(String ids, String associateDegrees, String associateDegreeNames, HttpServletRequest request);
 
     HttpRespMsg getProjectCostAlarm(Integer pageIndex, Integer pageSize, HttpServletRequest request);
+
+    HttpRespMsg addBatchAccoDegrees(String ids, String associateDegrees, String associateDegreeNames, HttpServletRequest request);
+
+    HttpRespMsg getBaseCostAndRealCost(Integer pageIndex, Integer pageSize, HttpServletRequest request);
+
+    HttpRespMsg exportBaseCostAndRealCost(HttpServletRequest request);
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TimeAutoExcludeService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.TimeAutoExclude;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-09
+ */
+public interface TimeAutoExcludeService extends IService<TimeAutoExclude> {
+
+}

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

@@ -2,6 +2,7 @@ package com.management.platform.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.User;
+import com.management.platform.entity.vo.UserVO;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -16,6 +17,8 @@ import javax.servlet.http.HttpServletRequest;
  * @since 2019-12-31
  */
 public interface UserService extends IService<User> {
+    public void setUserRoleMenu(UserVO user);
+
     HttpRespMsg loginAdmin(String username, String password);
 
     HttpRespMsg getUserInfo(String id);

+ 3 - 134
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -137,9 +137,9 @@ public class DingDingServiceImpl implements DingDingService {
                 smanager = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", company.getId()).eq("rolename", Constant.ROLE_SUPER_MANAGER));
             }
         } else {
-            //首先生成一个新公司,增加会员的试用一个月
+            //首先生成一个新公司,增加会员的试用15天
             company = new Company().setCompanyName(corpName)
-                    .setExpirationDate(LocalDateTime.now().plusMonths(1));
+                    .setExpirationDate(LocalDateTime.now().plusDays(15));
             company.setPackageProject(1);
             company.setPackageExpense(1);
             company.setPackageCustomer(1);
@@ -474,7 +474,7 @@ public class DingDingServiceImpl implements DingDingService {
                         num = auditWorkflowTimeSettingMapper.selectCount(new QueryWrapper<AuditWorkflowTimeSetting>().in("audit_dept_id", deptIds));
                     }
                     userVO.setHasAuditDept(num>0);
-                    getUserRoleMenu(userVO);
+                    userService.setUserRoleMenu(userVO);
                     httpRespMsg.data = userVO;
                 }
             }
@@ -485,137 +485,6 @@ public class DingDingServiceImpl implements DingDingService {
     }
 
 
-
-
-    public void getUserRoleMenu(UserVO user) {
-        Integer roleId = user.getRoleId();
-        //获取公司的套餐
-        Company company = companyMapper.selectById(user.getCompanyId());
-        TimeType timeType = timeTypeMapper.selectById(company.getId());
-        //按照公司开通的模块进行匹配
-        QueryWrapper<SysModule> queryWrapper = new QueryWrapper<SysModule>().eq("package_time", 1);
-        if (company.getPackageProject() == 1) {
-            queryWrapper.or().eq("package_project", 1);
-        }
-        if (company.getPackageOa() == 1) {
-            queryWrapper.or().eq("package_oa", 1);
-        }
-        if (company.getPackageExpense() == 1) {
-            queryWrapper.or().eq("package_expense", 1);
-        }
-        if (company.getPackageCustomer() == 1) {
-            queryWrapper.or().eq("package_customer", 1);
-        }
-        if (company.getPackageEngineering() == 1) {
-            queryWrapper.or().eq("package_engineering", 1);
-        }
-        if (company.getPackageContract() == 1) {
-            queryWrapper.or().eq("package_contract", 1);
-        }
-        if (company.getPackageEtimecard()== 1) {
-            queryWrapper.or().eq("package_etimecard", 1);
-        }
-        if (company.getPackageFinance() == 1) {
-            queryWrapper.or().eq("package_finance", 1);
-        }
-        if (timeType.getReportWorkflow() == 1) {
-            queryWrapper.or().eq("report_workflow", 1);
-        }
-        if (timeType.getNeedDeptAudit() == 1) {
-            queryWrapper.or().eq("need_dept_audit", 1);
-        }
-        queryWrapper.orderByAsc("orderitem");
-
-        //返回菜单
-        List<SysRoleModule> rModules = sysRoleModuleMapper.selectList(new QueryWrapper<SysRoleModule>().eq("role_id", roleId));
-        List<Integer> ids = rModules.stream().map(SysRoleModule::getModuleId).collect(Collectors.toList());
-        //项目报告审核模块,如果参与日报的审核,需要自动加上
-        if (user.isLeader() || user.isHasAuditDept()) {
-            SysModule projectAuditModule = sysModuleMapper.selectOne(new QueryWrapper<SysModule>().eq("name", "项目报告审核"));
-            if (!ids.contains(projectAuditModule.getId())) {
-                ids.add(projectAuditModule.getId());
-            }
-        }
-        List<SysModule> moduleList = sysModuleMapper.selectList(queryWrapper);
-        //过滤一下,这个角色选中的模块
-        moduleList = moduleList.stream().filter(m->ids.contains(m.getId())).collect(Collectors.toList());
-        if (company.getPackageEngineering() == 1) {
-            //生成虚拟的两个审核放进去
-            SysModule proModule = new SysModule();
-            proModule.setName("专业审核");
-            proModule.setPath("/reviewProfession");
-            proModule.setId(0);
-            moduleList.add(1,proModule);
-            SysModule deptModule = new SysModule();
-            deptModule.setName("部门审核");
-            deptModule.setPath("/reviewDepartment");
-            deptModule.setId(0);
-            moduleList.add(2,deptModule);
-        }
-        //组装层级关系,默认只有两级
-        List<SysModule> menuList = new ArrayList<>();
-        for (SysModule module : moduleList) {
-            if (module.getParentId() == null) {
-                menuList.add(module);
-            }
-        }
-        for (SysModule mainMenu : menuList) {
-            List<SysModule> list = moduleList.stream().filter(mod -> mainMenu.getId().equals(mod.getParentId())).collect(Collectors.toList());
-            mainMenu.setChildren(list);
-        }
-        user.setModuleList(menuList);
-        //此处返回权限集合
-        List<Integer> functionIdList = new ArrayList<>();
-        //获取角色所有的功能id
-        List<SysRoleFunction> funList = sysRoleFunctionMapper.selectList(new QueryWrapper<SysRoleFunction>()
-                .eq("role_id", roleId));
-        for (SysRoleFunction sysRoleFunction : funList) {
-            functionIdList.add(sysRoleFunction.getFunctionId());
-        }
-        if (functionIdList.size() > 0) {
-            //根据功能id获取可用的操作代码
-            QueryWrapper<SysFunction> functionQueryWrapper = new QueryWrapper<SysFunction>().eq("package_time", 1);
-            if (company.getPackageProject() == 1) {
-                functionQueryWrapper.or().eq("package_project", 1);
-            }
-            if (company.getPackageOa() == 1) {
-                functionQueryWrapper.or().eq("package_oa", 1);
-            }
-            if (company.getPackageExpense() == 1) {
-                functionQueryWrapper.or().eq("package_expense", 1);
-            }
-            if (company.getPackageCustomer() == 1) {
-                functionQueryWrapper.or().eq("package_customer", 1);
-            }
-            if (company.getPackageEngineering() == 1) {
-                functionQueryWrapper.or().eq("package_engineering", 1);
-            }
-            if (company.getPackageContract() == 1) {
-                functionQueryWrapper.or().eq("package_contract", 1);
-            }
-            if (company.getPackageEtimecard()== 1) {
-                functionQueryWrapper.or().eq("package_etimecard", 1);
-            }
-            if (company.getPackageFinance() == 1) {
-                functionQueryWrapper.or().eq("package_finance", 1);
-            }
-            if (timeType.getReportWorkflow() == 1) {
-                queryWrapper.or().eq("report_workflow", 1);
-            }
-            if (timeType.getNeedDeptAudit() == 1) {
-                queryWrapper.or().eq("need_dept_audit", 1);
-            }
-            functionQueryWrapper.orderByAsc("seq");
-
-            List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);
-            functionList = functionList.stream().filter(f->functionIdList.contains(f.getId())).collect(Collectors.toList());
-            user.setFunctionList(functionList);
-        } else {
-            user.setFunctionList(new ArrayList<>());
-        }
-    }
-
-
     @Override
     @Async
     public HttpRespMsg testAsync() {

+ 34 - 14
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -79,6 +79,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     private FinanceFixedcolnameService financeFixedcolnameService;
     @Resource
     private FinanceImportMapper financeImportMapper;
+    @Resource
+    private ProjectCategoryMapper projectCategoryMapper;
 
     @Resource
     private ProjectMapper projectMapper;
@@ -482,7 +484,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
 
             //计算每个项目的时间和成本
             ProjectSumItem item = new ProjectSumItem();
-            List<ProjectSumItem> pList = new ArrayList<ProjectSumItem>();
+            final List<ProjectSumItem> pList = new ArrayList<ProjectSumItem>();
 
             //计算每个人的实际时薪(包含工资,奖金等)
             HashMap<String, UserWorkTime> userTime = new HashMap<String, UserWorkTime>();
@@ -522,7 +524,9 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 Optional<Project> curP = allProjects.stream().filter(p->p.getId().equals(f.getProjectId())).findFirst();
                 if (curP.isPresent()) {
                     String name = curP.get().getCategoryName();
-                    if (name == null) name = "其他";
+                    if (name == null) {
+                        name = "其他";
+                    }
                     f.setCategoryName(name);
                 } else {
                     httpRespMsg.setError("项目["+f.getProjectName()+"]已不存在");
@@ -946,20 +950,36 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                     }
                     //添加按分类汇总的项
                     pList.add(p);
+
+                }
+                //获取到公司下所有的项目分类
+
+                List<ProjectCategory> projectCategories = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>()
+                        .eq("company_id", companyId));
+                List<ProjectSumItem> orderedList = new ArrayList<>();
+                for (ProjectCategory category : projectCategories) {
+                    Optional<ProjectSumItem> first = pList.stream().filter(p -> p.getCategoryName().equals(category.getName())).findFirst();
+                    if (first.isPresent()) {
+                        orderedList.add(first.get());
+                    }
                 }
+                //用排序后的列表来赋值
+                pList.clear();
+                pList.addAll(orderedList);
+                final int scaleSize = 2;
                 pList.forEach(p->{
-                    p.cost = p.cost.setScale(2, BigDecimal.ROUND_HALF_UP);
-                    p.salary = p.salary.setScale(2, BigDecimal.ROUND_HALF_UP);
-                    p.bonus = p.bonus.setScale(2, BigDecimal.ROUND_HALF_UP);
-                    p.allowance = p.allowance.setScale(2, BigDecimal.ROUND_HALF_UP);
-                    p.old = p.old.setScale(2, BigDecimal.ROUND_HALF_UP);
-                    p.medical = p.medical.setScale(2, BigDecimal.ROUND_HALF_UP);
-                    p.loseJob = p.loseJob.setScale(2, BigDecimal.ROUND_HALF_UP);
-                    p.injury = p.injury.setScale(2, BigDecimal.ROUND_HALF_UP);
-                    p.house = p.house.setScale(2, BigDecimal.ROUND_HALF_UP);
-                    p.field1 = p.field1.setScale(2, BigDecimal.ROUND_HALF_UP);
-                    p.field2 = p.field2.setScale(2, BigDecimal.ROUND_HALF_UP);
-                    p.field3 = p.field3.setScale(2, BigDecimal.ROUND_HALF_UP);
+                    p.cost = p.cost.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
+                    p.salary = p.salary.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
+                    p.bonus = p.bonus.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
+                    p.allowance = p.allowance.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
+                    p.old = p.old.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
+                    p.medical = p.medical.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
+                    p.loseJob = p.loseJob.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
+                    p.injury = p.injury.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
+                    p.house = p.house.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
+                    p.field1 = p.field1.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
+                    p.field2 = p.field2.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
+                    p.field3 = p.field3.setScale(scaleSize, BigDecimal.ROUND_HALF_UP);
 
                     List<String> rowData = new ArrayList<String>();
                     rowData.add(p.categoryName);

+ 22 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectAddcostRecordServiceImpl.java

@@ -2,14 +2,8 @@ package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.management.platform.entity.ProjectAddcostItem;
-import com.management.platform.entity.ProjectAddcostRecord;
-import com.management.platform.entity.ProjectBasecostSetting;
-import com.management.platform.entity.ProjectCurrentcost;
-import com.management.platform.mapper.ProjectAddcostItemMapper;
-import com.management.platform.mapper.ProjectAddcostRecordMapper;
-import com.management.platform.mapper.ProjectBasecostSettingMapper;
-import com.management.platform.mapper.ProjectCurrentcostMapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
 import com.management.platform.service.ProjectAddcostItemService;
 import com.management.platform.service.ProjectAddcostRecordService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -47,12 +41,29 @@ public class ProjectAddcostRecordServiceImpl extends ServiceImpl<ProjectAddcostR
     private ProjectCurrentcostService projectCurrentcostService;
     @Resource
     private ProjectBasecostSettingMapper projectBasecostSettingMapper;
+    @Resource
+    private ProjectBasecostMapper projectBasecostMapper;
 
     @Override
     public HttpRespMsg add(ProjectAddcostRecord item, String itemList) {
         projectAddcostRecordMapper.insert(item);
         List<ProjectAddcostItem> list = JSONArray.parseArray(itemList, ProjectAddcostItem.class);
         List<ProjectCurrentcost> curList = projectCurrentcostMapper.selectList(new QueryWrapper<ProjectCurrentcost>().eq("project_id", item.getProjectId()));
+
+        //校验,当前下拨的不能超过剩余可下拨金额
+        List<ProjectBasecost> totalCost = projectBasecostMapper.selectList(new QueryWrapper<ProjectBasecost>().eq("project_id", item.getProjectId()));
+        for (ProjectAddcostItem addItem : list) {
+            if (addItem.getBaseAmount() > 0) {
+                double available = totalCost.stream().filter(t->t.getBaseId().intValue() == addItem.getBaseId().intValue()).findFirst().get().getBaseAmount()
+                            - curList.stream().filter(t->t.getBaseId().intValue() == addItem.getBaseId().intValue()).findFirst().get().getBaseAmount();
+                if (addItem.getBaseAmount() > available) {
+                    HttpRespMsg msg = new HttpRespMsg();
+                    msg.setError(addItem.getBaseName()+"可下拨额度不足"+addItem.getBaseAmount()+", 请校正总成本预算。");
+                    return msg;
+                }
+
+            }
+        }
         list.forEach(li->{
             li.setRecordId(item.getId());
             li.setProjectId(item.getProjectId());
@@ -114,6 +125,9 @@ public class ProjectAddcostRecordServiceImpl extends ServiceImpl<ProjectAddcostR
                     cur.setBaseAmount(cur.getBaseAmount() - matchItem.getBaseAmount());
                 });
                 projectCurrentcostService.updateBatchById(curList);
+                //删除添加的这条记录
+                projectAddcostItemMapper.delete(new QueryWrapper<ProjectAddcostItem>().eq("record_id", id));
+                projectAddcostRecordMapper.deleteById(id);
             } else {
                 msg.setError("只有最新的一次下拨可以撤销");
             }

+ 157 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -91,6 +91,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     StagesMapper stagesMapper;
     @Resource
+    ProjectBasecostSettingMapper projectBasecostSettingMapper;
+    @Resource
+    ProjectCurrentcostMapper projectCurrentcostMapper;
+    @Resource
     FinanceMapper financeMapper;
     @Resource
     TaskGroupMapper taskGroupMapper;
@@ -1882,7 +1886,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 //处理子项目
                 if (subNameCell != null) {
                     //兼容中英文逗号
-                    String[] subNames = subNameCell.getStringCellValue().trim().split(",|,");
+                    String[] subNames = subNameCell.getStringCellValue().trim().split(",|\\,");
                     if (subNames != null) {
                         for (String s : subNames) {
                             if (!StringUtils.isEmpty(s)) {
@@ -2236,6 +2240,158 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg addBatchAccoDegrees(String ids, String associateDegrees, String associateDegreeNames, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (!StringUtils.isEmpty(ids)) {
+            List<Integer> array = JSONArray.parseArray(ids, Integer.class);
+            if (array.size() > 0) {
+                List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", array));
+                List<Project> proUpdateList = new ArrayList<>();
+                for (Project project : projectList) {
+                    String degreeIds = project.getAssociateDegrees();
+                    String degreeNames = project.getAssociateDegreeNames();
+                    List<String> newIdDataList = new ArrayList<>();
+                    List<String> newNameDataList = new ArrayList<>();
+                    String[] newIdsArr = associateDegrees.split("\\,");
+                    String[] newNamesArr = associateDegreeNames.split("\\,");
+                    for (int i=0;i<newIdsArr.length; i++) {
+                        String newId = newIdsArr[i];
+                        String newName = newNamesArr[i];
+                        boolean find = false;
+                        if (newId.length() > 0) {
+                            if (!StringUtils.isEmpty(degreeIds)) {
+                                String[] idArr = degreeIds.split("\\,");
+                                for (String oldId : idArr) {
+                                    if (oldId.equals(newId)) {
+                                        find = true;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                        if (!find) {
+                            //原来没有的,需要加上去
+                            newIdDataList.add(newId);
+                            newNameDataList.add(newName);
+                        }
+                    }
+                    if (newIdDataList.size() > 0) {
+                        degreeIds = degreeIds + "," + newIdDataList.stream().collect(Collectors.joining(","));
+                        degreeNames = degreeNames + "," +newNameDataList.stream().collect(Collectors.joining(","));
+                        Project updateP = new Project();
+                        updateP.setId(project.getId());
+                        updateP.setAssociateDegrees(degreeIds);
+                        updateP.setAssociateDegreeNames(degreeNames);
+                        proUpdateList.add(updateP);
+                    }
+                }
+                if (proUpdateList.size() > 0) {
+                    updateBatchById(proUpdateList);
+                }
+            } else {
+                msg.setError("项目不能为空");
+            }
+        } else {
+            msg.setError("项目不能为空");
+        }
+
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg getBaseCostAndRealCost(Integer pageIndex, Integer pageSize, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        Integer companyId = user.getCompanyId();
+        //撤销的项目不算
+        QueryWrapper<Project> queryWrapper = new QueryWrapper<Project>().eq("company_id", companyId);
+        queryWrapper.and(wrapper->wrapper.isNull("status").or().ne("status", 3));
+        int total = projectMapper.selectCount(queryWrapper);
+        int pageStart = (pageIndex -1) * pageSize;
+        List projectList = projectMapper.getBaseCostAndRealCost(companyId, pageStart, pageSize);
+        //查询项目的各个成本项实际的成本
+        List<Integer> pids = new ArrayList<>();
+        for (int i=0;i<projectList.size(); i++) {
+            HashMap map = (HashMap)projectList.get(i);
+            pids.add((Integer)map.get("id"));
+        }
+        //列
+        List<ProjectBasecostSetting> settingList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+
+        HashMap map = new HashMap();
+        map.put("columns", settingList);
+        if (pids.size() > 0) {
+            List<ProjectCurrentcost> currentcostList = projectCurrentcostMapper.selectList(new QueryWrapper<ProjectCurrentcost>().in("project_id", pids));
+            List realCostData = reportMapper.getProjectCost(companyId, pids);
+            for (int i=0;i<projectList.size(); i++) {
+                HashMap item = (HashMap)projectList.get(i);
+                int pid = (Integer)item.get("id");
+                item.put("curcostList", currentcostList.stream().filter(cur->cur.getProjectId() == pid));
+                List proRealCost = new ArrayList();
+                for (int m=0;m<realCostData.size(); m++) {
+                    HashMap realCostItem = (HashMap)realCostData.get(m);
+                    if ((int)realCostItem.get("projectId") == pid) {
+                        proRealCost.add(realCostItem);
+                    }
+                }
+                item.put("realcostList", proRealCost);
+            }
+        }
+
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        map.put("records", projectList);
+        map.put("total", total);
+        httpRespMsg.data = map;
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg exportBaseCostAndRealCost(HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        //通过公司id获取该公司所有的项目列表
+        User user = userMapper.selectById(request.getHeader("Token"));
+        Integer companyId = user.getCompanyId();
+
+        List<HashMap> projectList = projectMapper.getBaseCostAndRealCost(companyId, null, null);
+        List<List<String>> exportList = new ArrayList<>();
+        String[] titles = {"项目编号", "项目名称", "当前总预算", "已发生总工时成本"};
+        ArrayList<String> headList = Lists.list(titles);
+        //列,根据定义的工时预警类型的成本项来
+        List<ProjectBasecostSetting> settingList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+        for (ProjectBasecostSetting setting : settingList) {
+            headList.add(setting.getName()+"成本预算");
+            headList.add(setting.getName()+"已发生成本");
+            headList.add(setting.getName()+"已发生占比");
+        }
+        exportList.add(headList);
+        for (HashMap project : projectList) {
+            List<String> data = new ArrayList<>();
+            data.add((String)project.get("projectCode"));
+            data.add((String)project.get("projectName"));
+            data.add(project.get("baseCurcost") != null?project.get("baseCurcost").toString():"");
+            data.add(""+project.get("freeMan"));
+//            data.add(project.getFeeNormal().toString());
+//            data.add(project.getFeeTravel().toString());
+//            data.add(project.getFeeOutsourcing().toString());
+//            double totalFee = project.getFeeMan() + project.getFeeNormal()+ project.getFeeTravel()+ project.getFeeOutsourcing();
+//            data.add(totalFee+"");
+//            if (project.getContractAmount() != null && project.getContractAmount() > 0) {
+//                double profitAmt = project.getContractAmount() - totalFee;
+//                data.add(profitAmt+"");
+//                data.add(new java.text.DecimalFormat("#.0").format((100*profitAmt/project.getContractAmount()))+"%");
+//            } else {
+//                double profitAmt = -totalFee;
+//                data.add(profitAmt+"");
+//                data.add("");
+//            }
+            exportList.add(data);
+        }
+        String fileName = "工时成本预警表_"+System.currentTimeMillis();
+        ExcelUtil.exportGeneralExcelByTitleAndList(fileName, exportList, path);
+        httpRespMsg.data =  pathPrefix + fileName+".xls";
+        return httpRespMsg;
+    }
+
 
     private List<Department> getSubDepts(Department dp, List<Department> list) {
         List<Department> collect = list.stream().filter(l -> dp.getDepartmentId().equals(l.getSuperiorId())).collect(Collectors.toList());;

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -73,6 +73,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private SysFunctionMapper sysFunctionMapper;
     @Resource
+    private ProjectBasecostSettingMapper projectBasecostSettingMapper;
+    @Resource
     private UserDingdingTimeMapper userDingdingTimeMapper;
     @Resource
     private ReportService reportService;
@@ -611,6 +613,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             resultMap.put("project", allProjectList);
             //顺便返回公司的工作时间设置
             resultMap.put("timeType",timeType);
+            //返回公司的项目工时预警的成本项列表
+            List<ProjectBasecostSetting> timeBasecostList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+            resultMap.put("timeBasecostList",timeBasecostList);
 
             httpRespMsg.data = resultMap;
         } catch (NullPointerException e) {

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TimeAutoExcludeServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.TimeAutoExclude;
+import com.management.platform.mapper.TimeAutoExcludeMapper;
+import com.management.platform.service.TimeAutoExcludeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-09
+ */
+@Service
+public class TimeAutoExcludeServiceImpl extends ServiceImpl<TimeAutoExcludeMapper, TimeAutoExclude> implements TimeAutoExcludeService {
+
+}

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

@@ -179,7 +179,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             }
             userVO.setHasAuditDept(num>0);
             //获取当前角色的权限菜单
-            getUserRoleMenu(userVO);
+            setUserRoleMenu(userVO);
 
             httpRespMsg.data = userVO;
         } else {
@@ -189,7 +189,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     }
 
 
-    public void getUserRoleMenu(UserVO user) {
+    public void setUserRoleMenu(UserVO user) {
         Integer roleId = user.getRoleId();
         //获取公司的套餐
         Company company = companyMapper.selectById(user.getCompanyId());
@@ -226,6 +226,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         if (timeType.getNeedDeptAudit() == 1) {
             queryWrapper.or().eq("need_dept_audit", 1);
         }
+
         queryWrapper.orderByAsc("orderitem");
 
         //返回菜单
@@ -239,7 +240,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             }
         }
 
-        System.out.println(ids);
         List<SysModule> moduleList = sysModuleMapper.selectList(queryWrapper);
 
         //过滤一下,这个角色选中的模块
@@ -304,11 +304,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             if (company.getPackageFinance() == 1) {
                 functionQueryWrapper.or().eq("package_finance", 1);
             }
-            if (timeType.getReportWorkflow() == 1) {
-                queryWrapper.or().eq("report_workflow", 1);
+            if (timeType.getShowCorpwxCardtime() == 1) {
+                functionQueryWrapper.or().eq("sync_corpwx_time", 1);
             }
-            if (timeType.getNeedDeptAudit() == 1) {
-                queryWrapper.or().eq("need_dept_audit", 1);
+            if (timeType.getFinanceAudit() == 1) {
+                functionQueryWrapper.or().eq("finance_audit", 1);
             }
             functionQueryWrapper.orderByAsc("seq");
 
@@ -1105,7 +1105,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
                 userVO.setLeader(judgeIsLeader(userVO.getId()));
 
-                getUserRoleMenu(userVO);
+                setUserRoleMenu(userVO);
                 respMsg.data = userVO;
             } else {
                 respMsg.setError(OpenidJSONO.getString("errcode") + ":" + OpenidJSONO.getString("errmsg"));
@@ -1447,7 +1447,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
                 //检测是否是项目经理,项目经理有审核功能权限
                 userVO.setLeader(judgeIsLeader(userVO.getId()));
-                getUserRoleMenu(userVO);
+                setUserRoleMenu(userVO);
                 respMsg.data = userVO;
             } else {
                 respMsg.setError(OpenidJSONO.getString("errcode") + ":" + OpenidJSONO.getString("errmsg"));
@@ -1506,7 +1506,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         }
         userVO.setHasAuditDept(num>0);
         //获取当前角色的权限菜单
-        getUserRoleMenu(userVO);
+        setUserRoleMenu(userVO);
         httpRespMsg.data = userVO;
         return httpRespMsg;
     }

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

@@ -81,6 +81,8 @@ public class TimingTask {
     private CompanyDingdingService companyDingdingService;
     @Resource
     private DingDingService dingDingService;
+    @Resource
+    private BusinessTripMapper businessTripMapper;
 
     //检查项目到期,距离到期时间3天内的,每天提醒
     @Scheduled(cron = "0 0 10 ? * *")
@@ -247,6 +249,35 @@ public class TimingTask {
         }
     }
 
+    //发送关联出差的提醒
+    @Scheduled(cron = "0 5 9 ? * *")
+    private void linkBusinessTripAlert() {
+//        if (isDev) return;
+        List<TimeType> timeTypes = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_dingding", 1));
+        List<Integer> companyIds = timeTypes.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
+        List<CompanyDingding> dingdingList = companyDingdingService.list(
+                new QueryWrapper<CompanyDingding>().in("company_id", companyIds)
+                    .isNotNull("custom_appkey"));
+        //每分钟5000条,待后续处理
+        for (CompanyDingding dingding : dingdingList) {
+            List<BusinessTrip> businessTrips = businessTripMapper.selectList(new QueryWrapper<BusinessTrip>().eq("company_id", dingding.getCompanyId())
+                                        .isNull("project_id"));
+            //有未关联的出差数据
+            if (businessTrips.size() > 0) {
+                List<String> ownerIds = businessTrips.stream().map(BusinessTrip::getOwnerId).collect(Collectors.toList());
+                List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", ownerIds));
+                String userDDIds = userList.stream().map(User::getDingdingUserid).distinct().collect(Collectors.joining(","));
+                System.out.println("发送出差待关联给=="+dingding.getCorpName()+", "+userDDIds);
+                if (userList.size() > 1000) {
+                    System.out.println("Exception: 人数超过1000人,需要分批发送,待完善。。。");
+                }
+                //每次最多1000条
+                companyDingdingService.sendBusinessTripSettingMsg(dingding.getCompanyId(), dingding.getAgentId(), userDDIds);
+            }
+        }
+
+    }
+
     //每分钟校验是否有需要提醒的填报
     @Scheduled(fixedRate = 60 * 1000)
     private void process() {

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectAddcostItemMapper.xml

@@ -4,7 +4,7 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectAddcostItem">
-        <result column="id" property="id" />
+        <id column="id" property="id" />
         <result column="project_id" property="projectId" />
         <result column="base_id" property="baseId" />
         <result column="base_name" property="baseName" />

+ 11 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectAddcostRecordMapper.xml

@@ -9,6 +9,7 @@
         <result column="user_id" property="userId" />
         <result column="user_name" property="userName" />
         <result column="indate" property="indate" />
+        <result column="remark" property="remark" />
     </resultMap>
 
     <resultMap id="CompMap" type="com.management.platform.entity.ProjectAddcostRecord">
@@ -23,15 +24,22 @@
         </collection>
     </resultMap>
 
+    <resultMap id="ItemResultMap" type="com.management.platform.entity.ProjectAddcostItem">
+        <result column="id" property="id" />
+        <result column="project_id" property="projectId" />
+        <result column="base_id" property="baseId" />
+        <result column="base_name" property="baseName" />
+        <result column="base_amount" property="baseAmount" />
+        <result column="record_id" property="recordId" />
+    </resultMap>
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, project_id, user_id, user_name, indate
+        id, project_id, user_id, user_name, indate, remark
     </sql>
-
     <select id="getWithSubList" resultMap="CompMap">
         select * from project_addcost_record where project_id=#{projectId}
     </select>
-    <select id="getItemList" resultMap="CompMap">
+    <select id="getItemList" resultMap="ItemResultMap">
         select * from project_addcost_item where record_id=#{recordId}
     </select>
 </mapper>

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectCurrentcostMapper.xml

@@ -4,7 +4,7 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectCurrentcost">
-        <result column="id" property="id" />
+        <id column="id" property="id" />
         <result column="project_id" property="projectId" />
         <result column="base_id" property="baseId" />
         <result column="base_name" property="baseName" />

+ 13 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -422,4 +422,17 @@
             LIMIT #{pageStart},#{pageSize}
         </if>
     </select>
+
+    <select id="getBaseCostAndRealCost" resultType="java.util.HashMap">
+        SELECT project.id,project_code as projectCode, project.`project_name` as projectName,
+        (SELECT IFNULL(SUM(base_amount), 0) FROM project_currentcost LEFT JOIN project_basecost_setting
+        ON project_basecost_setting.id = project_currentcost.`base_id` WHERE alarm_type=1 AND company_id=10 AND project_currentcost.`project_id`=project.id) AS baseCurcost,
+        (SELECT IFNULL(SUM(cost), 0) FROM report WHERE report.`company_id` = #{companyId} AND project_id = project.id AND state=1 AND basecost_id >0) AS feeMan
+        FROM project WHERE (STATUS &lt;&gt; 3  OR project.status IS NULL) AND company_id=#{companyId}
+        <if test="pageStart != null and pageSize != null">
+            LIMIT #{pageStart},#{pageSize}
+        </if>
+    </select>
+
+
 </mapper>

Diff do ficheiro suprimidas por serem muito extensas
+ 7 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml


+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeAutoExcludeMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.TimeAutoExcludeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.TimeAutoExclude">
+        <id column="id" property="id" />
+        <result column="company_id" property="companyId" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company_id, start_time, end_time
+    </sql>
+
+</mapper>

+ 2 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -2739,6 +2739,8 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
                         delete this.addForm.subTaskList;
                         delete this.addForm.refTaskList;
                         delete this.addForm.progress;
+                        //去掉没有执行人的
+                        this.addForm.executorListFront = this.addForm.executorListFront.filter(exe=>exe.executorId);
                         this.addForm.executorListStr = JSON.stringify(this.addForm.executorListFront);
                         this.addLoading = true;
                         this.http.post('/task/save',this.addForm,

+ 23 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -330,7 +330,7 @@
                         :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)" @change="updateSubProject">
                             <el-option v-for="item in domain.subProjectList" :key="item.id" :label="item.name" :value="item.id"></el-option>
                         </el-select>
-
+                        
                         <el-link v-if="index >= 1" type="primary" :underline="false" @click="delDomain(index)" style="float:right;margin-right:10px;"
                             :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)">
                             <i class="fa fa-trash" style="color: red;;font-size:18px;"></i>
@@ -341,7 +341,12 @@
                     <el-form-item :label="user.companyId==781?'描述':'项目描述'" v-if="user.company.packageProject==0&&domain.projectId&&projectList.filter(p=>p.id == domain.projectId)[0].projectDesc">
                         <span>{{projectList.filter(p=>p.id == domain.projectId)[0].projectDesc}}</span>
                     </el-form-item>
-
+                    <!--如果设置了工时成本预警的预算成本项-->
+                    <el-form-item label="预算来源" v-if="timeBasecostList &&timeBasecostList.length>0">
+                        <el-select v-model="domain.basecostId" :disabled="!canEdit" @change="$forceUpdate()">
+                            <el-option v-for="item in timeBasecostList" :label="item.name" :value="item.id" :key="item.id"></el-option>
+                        </el-select>
+                    </el-form-item>
                     <el-form-item label="任务分组" v-if="user.company.packageProject == 1">
                         <!-- 任务分组 -->
                         <el-select v-model="domain.groupId" placeholder="请选择任务分组" style="width:200px;" clearable="true" 
@@ -439,7 +444,15 @@
                             <el-link type="primary" v-if="workForm.domains[index].state == 0 || workForm.domains[index].state == 2"
                                 :underline="false" style="margin-left:10px;" @click="copyProject(index)">复制</el-link>
                         </el-form-item>
-                        
+                        <el-form-item :label="user.companyId==781?'描述':'项目描述'" v-if="user.company.packageProject==0&&domain.projectId&&projectList.filter(p=>p.id == domain.projectId)[0].projectDesc">
+                            <span>{{projectList.filter(p=>p.id == domain.projectId)[0].projectDesc}}</span>
+                        </el-form-item>
+                        <!--如果设置了工时成本预警的预算成本项-->
+                        <el-form-item label="预算来源" v-if="timeBasecostList &&timeBasecostList.length>0">
+                            <el-select v-model="domain.basecostId" :disabled="!canEdit" @change="$forceUpdate()">
+                                <el-option v-for="item in timeBasecostList" :label="item.name" :value="item.id" :key="item.id"></el-option>
+                            </el-select>
+                        </el-form-item>
                         <el-form-item label="任务分组" v-if="user.company.packageProject == 1">
                             <!-- 任务分组 -->
                             <el-select v-model="domain.groupId" placeholder="请选择任务分组" style="width:200px;" clearable="true" 
@@ -1201,6 +1214,7 @@
     export default {
         data() {
             return {
+                timeBasecostList:null,
                 tbload: false,
                 exportTimeDialog: false,
                 searchKeyword: '',
@@ -3326,6 +3340,7 @@
                         this.jsTime = quanbu
                         var list = res.data;
                         this.report = list;
+                        this.timeBasecostList = res.data.timeBasecostList;
                         if(list.report.length != 0) {
                             var arr = [];
                             this.canEdit = false;
@@ -4455,7 +4470,11 @@
                             } else {
                                 formData.append("overtimeHours", 0);
                             }
-                            
+                            if(this.workForm.domains[i].basecostId) {
+                                formData.append("basecostId", this.workForm.domains[i].basecostId);
+                            } else {
+                                formData.append("basecostId", 0);
+                            }
                             if (this.workForm.userId != null) {
                                 var targetUids = '';
                                 this.workForm.userId.forEach(u=>{