Преглед на файлове

Merge branch 'master' of http://47.100.37.243:10080/wutt/manHourHousekeeper

ggooalice преди 2 години
родител
ревизия
e913fae6fd
променени са 23 файла, в които са добавени 346 реда и са изтрити 103 реда
  1. 32 0
      fhKeeper/formulahousekeeper/inva_4_tivo/css/index.css
  2. 4 0
      fhKeeper/formulahousekeeper/inva_4_tivo/index.html
  3. 14 1
      fhKeeper/formulahousekeeper/inva_4_tivo/js/index.js
  4. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DepartmentController.java
  5. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectPercentageController.java
  6. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportExtraDegreeController.java
  7. 8 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  8. 73 73
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  9. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportAuditLog.java
  10. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/DepartmentMapper.java
  11. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java
  12. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DepartmentService.java
  13. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectPercentageService.java
  14. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TaskService.java
  15. 74 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  16. 11 14
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectPercentageServiceImpl.java
  17. 11 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  18. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  19. 6 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  20. 52 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  21. 15 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/DepartmentMapper.xml
  22. 8 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  23. 10 5
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

+ 32 - 0
fhKeeper/formulahousekeeper/inva_4_tivo/css/index.css

@@ -568,6 +568,38 @@
     width: 1248px;
     margin: auto;
 }
+.tooltipTis {
+    width: 1200px;
+    margin: auto;
+    text-align: center;
+    font-size: 28px;
+    position: relative;
+    top: -50px;
+    transform: translate(100rem,0);
+}
+.tooltipTisFillCons {
+    animation: moves 2s;
+    animation-fill-mode: both; 
+}
+/* .fillCon {
+    width: 100%;
+    height: 38.4375rem;
+    position: relative;
+    transform: translate(0,16.25rem);
+}
+.fillCons {
+    animation: move 2s;
+    animation-fill-mode: both;
+}*/
+
+@keyframes moves {
+    0%{
+        transform: translate(100rem,0);
+    }
+    100%{
+        transform: translate(0,0);
+    }
+} 
 .li {
     text-align: center;
     background: #fff;

+ 4 - 0
fhKeeper/formulahousekeeper/inva_4_tivo/index.html

@@ -14,6 +14,9 @@
     <!-- <script src="js/js/jquery.min.js"></script> -->
     <script src="js/jquery1.42.min.js"></script>
     <script src="js/jquery.SuperSlide.2.1.3.js"></script>
+    <!-- 统计文件 -->
+    <script charset="UTF-8" id="LA_COLLECT" src="//sdk.51.la/js-sdk-pro.min.js"></script>
+    <script>LA.init({id: "Jk62Sh8gvUhl1xcU",ck: "Jk62Sh8gvUhl1xcU"})</script>
 </head>
 
 <body data-spy="scroll" data-target=".fixed-top" id="body">
@@ -475,6 +478,7 @@
         <div class="connonst">
             <h2>产品定价</h2>
         </div>
+        <div class="tooltipTis" id="tooltipTis">人数越多优惠越大</div>
         <div class="pri">
             <div class="li">
                 <div class="li_con">

+ 14 - 1
fhKeeper/formulahousekeeper/inva_4_tivo/js/index.js

@@ -42,13 +42,17 @@ let jiesaoTop = $('.jiesao').offset().top
 let znyqTop = $('.znyq').offset().top
 
 let fill = $('.fill').offset().top
+let tooltipsOffTop = $('#pricing').offset().top
 let filss = ''
+let tooltips = ''
 var devicewidth = document.documentElement.clientWidth
 if(document.documentElement.clientWidth < 1900) {
     var scale = devicewidth / 1920
     filss = fill * scale
+    tooltips = tooltipsOffTop * scale
 } else {
     filss = fill
+    tooltips = tooltipsOffTop
 }
 
 $(window).scroll(function () {
@@ -116,13 +120,22 @@ $(window).scroll(function () {
         $('#selMour7').css({'opacity': znyqTopopacityVal, 'transform':'translate('+znyqToppaddingfive+','+ znyqToppaddingfive +')'})
         $('#selMour8').css({'opacity': znyqTopopacityVal, 'transform':'translate('+znyqToppaddingfives+','+ znyqToppaddingfives +')'})
     }
-    // 加样式
+    // 加样式 (填报、审批、统计分分钟搞定)
     if(currentTop > filss - 300) {
         $('#fillCon').addClass('fillCons')
     }
     if(currentTop < filss - 400){
         $("#fillCon").removeClass("fillCons");
     }
+
+    // 加样式 (产品定价)
+    if(currentTop > tooltips - 500) {
+        $('#tooltipTis').addClass('tooltipTisFillCons')
+    }
+    if(currentTop < tooltips - 800){
+        $("#tooltipTis").removeClass("tooltipTisFillCons");
+    }
+
 })
 
 // tab点击

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DepartmentController.java

@@ -104,6 +104,11 @@ public class DepartmentController {
         return departmentService.getUserCustomDataStatistic(startDate, endDate, departmentId, request);
     }
 
+    @RequestMapping("/getDeptCustomDataStatistic")
+    public HttpRespMsg getDeptCustomDataStatistic(String startDate, String endDate, Integer departmentId, HttpServletRequest request){
+        return departmentService.getDeptCustomDataStatistic(startDate,endDate,departmentId,request);
+    }
+
     /**
      * 按人员导出工时统计,可选人员
      * departmentId 要查询的项目

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

@@ -38,8 +38,8 @@ public class ProjectPercentageController {
 
     @RequestMapping("/importData")
     public HttpRespMsg importData(Integer companyId, Integer withCheckIn,
-                                  MultipartFile file, HttpServletRequest request){
-        return projectPercentageService.importData(companyId,withCheckIn, file, request);
+                                  MultipartFile file, HttpServletRequest request,String ymonth){
+        return projectPercentageService.importData(companyId,withCheckIn, file, request,ymonth);
     }
 }
 

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportExtraDegreeController.java

@@ -186,7 +186,7 @@ public class ReportExtraDegreeController {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
 
-        List<ReportExtraDegree> all = reportExtraDegreeMapper.getAll(user.getCompanyId());
+        List<ReportExtraDegree> all = reportExtraDegreeMapper.getAll(user.getCompanyId()); 
         if (withProjects == 1) {
             List<Project> allProjects = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()));
             for (ReportExtraDegree degree : all) {

+ 8 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -599,6 +599,11 @@ public class TaskController {
         return taskService.getExecutorPanel(projectId);
     }
 
+    @RequestMapping("/getExecutorPlanHour")
+    public HttpRespMsg getExecutorPlanHour(Integer projectId){
+        return taskService.getExecutorPlanHour(projectId);
+    }
+
     @RequestMapping("/getStagesPanel")
     public HttpRespMsg getStagesPanel(Integer projectId) {
         return taskService.getStagesPanel(projectId);
@@ -698,10 +703,12 @@ public class TaskController {
     public HttpRespMsg listByPage(Integer status, Integer viewId, Integer pageIndex, Integer pageSize,Integer type) {
         HttpRespMsg msg = new HttpRespMsg();
         String userId = request.getHeader("Token");
+        User user = userMapper.selectById(userId);
+        Integer companyId = user.getCompanyId();
         QueryWrapper<Task> queryWrapper = new QueryWrapper<>();
 
         //任务状态
-        queryWrapper.eq("task_status", status);
+        queryWrapper.eq("task_status", status).eq("task.company_id", companyId);
         if (viewId == 1) {
             //我执行的任务
             queryWrapper.like("executor_id", userId);

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

@@ -977,79 +977,79 @@ public class WeiXinCorpController {
     }
 
     //老版本
-//    @RequestMapping("/getCorpMembs")
-//    public HttpRespMsg getCorpMembs(String corpId) {
-//
-//        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
-//
-//        Company company = companyMapper.selectById(wxCorpInfo.getCompanyId());
-//        String curCorpAccessToken = null;
-//        try {
-//            curCorpAccessToken = getCorpAccessToken(wxCorpInfo);
-//        } catch (Exception exception) {
-//            exception.printStackTrace();
-//        }
-//        int companyId = company.getId();
-//        //获取公司根部门人员,也就是没有分配部门的人员
-//        int companyRootDeptId = 1;
-//        JSONArray unAssignedUserList = getDeptUserSimple(curCorpAccessToken, companyRootDeptId);
-//        SysRole defaultRole = sysRoleMapper.selectOne(
-//                new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
-//
-//        for (int m=0;m<unAssignedUserList.size(); m++) {
-//            JSONObject userJson = unAssignedUserList.getJSONObject(m);
-//            String curUserid = userJson.getString("userid");
-//            System.out.println("userid="+curUserid+", name=" + userJson.getString("name")+", mobile="+userJson.getString("mobile"));
-//            //不存在的人员, 进行插入
-//            User user = new User();
-//
-//            user.setId(SnowFlake.nextId()+"")
-//                    .setRoleId(defaultRole.getId())//默认普通员工
-//                    .setRoleName(defaultRole.getRolename())
-//                    .setCompanyId(companyId)
-//                    .setName(userJson.getString("name"))
-//                    .setCorpwxUserid(curUserid)
-//                    .setColor(ColorUtil.randomColor());
-//
-//            //检查用户是否已经存在
-//            if (userMapper.selectCount(new QueryWrapper<User>().eq("corpwx_userid", curUserid)) == 0) {
-//                userMapper.insert(user);
-//            }
-//        }
-//
-//        //获取部门
-//        JSONObject deptObj = getAllDepartments(curCorpAccessToken);
-//        JSONArray deptObjJSONArray = deptObj.getJSONArray("department");
-//
-//        for (int i=0;i<deptObjJSONArray.size(); i++) {
-//            int deptId = deptObjJSONArray.getJSONObject(i).getIntValue("id");
-//
-//            JSONArray userList = getDeptUserSimple(curCorpAccessToken, deptId);
-//            for (int m=0;m<userList.size(); m++) {
-//                JSONObject userJson = userList.getJSONObject(m);
-//                String curUserid = userJson.getString("userid");
-//                System.out.println("userid="+curUserid+", name=" + userJson.getString("name")+", mobile="+userJson.getString("mobile"));
-//                //不存在的人员, 进行插入
-//                User user = new User();
-//
-//                user.setId(SnowFlake.nextId()+"")
-//                        .setRoleId(defaultRole.getId())//默认普通员工
-//                        .setRoleName(defaultRole.getRolename())
-//                        .setCompanyId(companyId)
-//                        .setDepartmentId(0)
-//                        .setName(userJson.getString("name"))
-//                        .setCorpwxUserid(curUserid)
-//                        .setColor(ColorUtil.randomColor());
-//
-//                //检查用户是否已经存在
-//                if (userMapper.selectCount(new QueryWrapper<User>().eq("corpwx_userid", curUserid)) == 0) {
-//                    userMapper.insert(user);
-//                }
-//            }
-//        }
-//
-//        return new HttpRespMsg();
-//    }
+    @RequestMapping("/getCorpMembsOld")
+    public HttpRespMsg getCorpMembsOld(String corpId) {
+
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
+
+        Company company = companyMapper.selectById(wxCorpInfo.getCompanyId());
+        String curCorpAccessToken = null;
+        try {
+            curCorpAccessToken = getCorpAccessToken(wxCorpInfo);
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        int companyId = company.getId();
+        //获取公司根部门人员,也就是没有分配部门的人员
+        int companyRootDeptId = 1;
+        JSONArray unAssignedUserList = getDeptUserSimple(curCorpAccessToken, companyRootDeptId);
+        SysRole defaultRole = sysRoleMapper.selectOne(
+                new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
+
+        for (int m=0;m<unAssignedUserList.size(); m++) {
+            JSONObject userJson = unAssignedUserList.getJSONObject(m);
+            String curUserid = userJson.getString("userid");
+            System.out.println("userid="+curUserid+", name=" + userJson.getString("name")+", mobile="+userJson.getString("mobile"));
+            //不存在的人员, 进行插入
+            User user = new User();
+
+            user.setId(SnowFlake.nextId()+"")
+                    .setRoleId(defaultRole.getId())//默认普通员工
+                    .setRoleName(defaultRole.getRolename())
+                    .setCompanyId(companyId)
+                    .setName(userJson.getString("name"))
+                    .setCorpwxUserid(curUserid)
+                    .setColor(ColorUtil.randomColor());
+
+            //检查用户是否已经存在
+            if (userMapper.selectCount(new QueryWrapper<User>().eq("corpwx_userid", curUserid)) == 0) {
+                userMapper.insert(user);
+            }
+        }
+
+        //获取部门
+        JSONObject deptObj = getAllDepartments(curCorpAccessToken);
+        JSONArray deptObjJSONArray = deptObj.getJSONArray("department");
+
+        for (int i=0;i<deptObjJSONArray.size(); i++) {
+            int deptId = deptObjJSONArray.getJSONObject(i).getIntValue("id");
+
+            JSONArray userList = getDeptUserSimple(curCorpAccessToken, deptId);
+            for (int m=0;m<userList.size(); m++) {
+                JSONObject userJson = userList.getJSONObject(m);
+                String curUserid = userJson.getString("userid");
+                System.out.println("userid="+curUserid+", name=" + userJson.getString("name")+", mobile="+userJson.getString("mobile"));
+                //不存在的人员, 进行插入
+                User user = new User();
+
+                user.setId(SnowFlake.nextId()+"")
+                        .setRoleId(defaultRole.getId())//默认普通员工
+                        .setRoleName(defaultRole.getRolename())
+                        .setCompanyId(companyId)
+                        .setDepartmentId(0)
+                        .setName(userJson.getString("name"))
+                        .setCorpwxUserid(curUserid)
+                        .setColor(ColorUtil.randomColor());
+
+                //检查用户是否已经存在
+                if (userMapper.selectCount(new QueryWrapper<User>().eq("corpwx_userid", curUserid)) == 0) {
+                    userMapper.insert(user);
+                }
+            }
+        }
+
+        return new HttpRespMsg();
+    }
 
     //新版本
     @RequestMapping("/getCorpMembs")

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportAuditLog.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
@@ -37,6 +39,8 @@ public class ReportAuditLog extends Model<ReportAuditLog> {
     private String userName;
 
     @TableField("indate")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
     private LocalDateTime indate;
 
     @TableField("company_id")

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

@@ -26,4 +26,6 @@ public interface DepartmentMapper extends BaseMapper<Department> {
     void updateNullManager(Integer departmentId);
     @Update("update department set report_audit_userid = null where department_id = #{departmentId}")
     void updateNullLeader(Integer departmentId);
+
+    List<Map<String, Object>> getDeptCustomDataStatistic(String startDate, String endDate, Integer departmentId, Integer companyId);
 }

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

@@ -43,4 +43,6 @@ public interface TaskMapper extends BaseMapper<Task> {
     void removeTaskExecutor(Integer id);
 
     List<Task> selectMilepost(@Param("ids") List<Integer> ids);
+
+    List getExecutorPlanHour(Integer projectId);
 }

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

@@ -38,4 +38,6 @@ public interface DepartmentService extends IService<Department> {
     HttpRespMsg getUserCustomDataStatistic(String startDate, String endDate, Integer departmentId, HttpServletRequest request);
 
     HttpRespMsg exportDeptStatistic(String startDate, String endDate, HttpServletRequest request);
+
+    HttpRespMsg getDeptCustomDataStatistic(String startDate, String endDate, Integer departmentId, HttpServletRequest request);
 }

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

@@ -21,5 +21,5 @@ public interface ProjectPercentageService extends IService<ProjectPercentage> {
 
     HttpRespMsg getMonthSetting(String ymonth);
 
-    HttpRespMsg importData(Integer companyId, Integer withCheckIn, MultipartFile file, HttpServletRequest request);
+    HttpRespMsg importData(Integer companyId, Integer withCheckIn, MultipartFile file, HttpServletRequest request,String ymonth);
 }

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

@@ -47,4 +47,6 @@ public interface TaskService extends IService<Task> {
     HttpRespMsg getMilestoneTaskList(Integer milestoneId);
 
     public void notifyMileStoneFinish(Integer companyId, List<Task> taskList);
+
+    HttpRespMsg getExecutorPlanHour(Integer projectId);
 }

+ 74 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -833,6 +833,80 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg getDeptCustomDataStatistic(String startDate, String endDate, Integer departmentId, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<Map<String,Object>> mapList=departmentMapper.getDeptCustomDataStatistic(startDate,endDate,departmentId,companyId);
+        Map<String, List<Map<String, Object>>> tempMap = new HashMap<>();
+        List<Department> departmentList = new ArrayList<>();
+        Double totalCost = 0.0;
+        for (Map<String, Object> map : mapList) {
+            if (tempMap.containsKey(map.get("department"))) {
+                //这个名字已经装进数组中了
+                List<Map<String, Object>> tempList = tempMap.get(map.get("department"));
+                Map<String, Object> dataMap = new HashMap<>();
+                dataMap.put("project", map.get("project"));
+                Double cost = (Double) map.getOrDefault("cost", 0);
+                totalCost = totalCost + cost;
+                dataMap.put("cost", cost);
+                tempList.add(dataMap);
+            } else {
+                Department department = new Department();
+                department.setDepartmentId(Integer.parseInt(String.valueOf(map.get("id"))));
+                department.setDepartmentName((String)map.get("department"));
+                departmentList.add(department);
+                //这个名字尚未装进数组中
+                List<Map<String, Object>> tempList = new ArrayList<>();
+                if (map.containsKey("project")) {
+                    Map<String, Object> dataMap = new HashMap<>();
+                    dataMap.put("project", map.get("project"));
+                    Double cost = (Double) map.getOrDefault("cost", 0);
+                    totalCost = totalCost + cost;
+                    dataMap.put("cost", cost);
+                    tempList.add(dataMap);
+                }
+                tempMap.put((String) map.get("department"), tempList);
+            }
+        }
+        Map<String, Object> finalMap = new HashMap<>();
+        List<Map<String, Object>> finalList = new ArrayList<>();
+        for (String key : tempMap.keySet()) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("name", key);
+            List<Map<String, Object>> userProjectTime = tempMap.get(key);
+            map.put("project", userProjectTime);
+            //计算总时间
+            double userTotalTime = 0;
+            for (Map<String, Object> timeItem: userProjectTime) {
+                double t = (double)timeItem.get("cost");
+                userTotalTime += t;
+            }
+            map.put("cost", userTotalTime);
+            finalList.add(map);
+        }
+        //排序
+        finalList = finalList.stream().sorted(new Comparator<Map<String, Object>>() {
+            @Override
+            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
+                double d1 = (double)o1.get("cost");
+                double d2 = (double)o2.get("cost");
+                if (d1 > d2) {
+                    return -1;
+                } else if (d1 == d2) {
+                    return 0;
+                } else {
+                    return 1;
+                }
+            }
+        }).collect(Collectors.toList());
+        finalMap.put("totalCost", totalCost);
+        finalMap.put("list", finalList);
+        finalMap.put("department",departmentList);
+        httpRespMsg.data = finalMap;
+        return httpRespMsg;
+    }
+
 
     private void fillDeptUser(List<DepartmentVO> list, List<HashMap> userList) {
         list.forEach(l->{

+ 11 - 14
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectPercentageServiceImpl.java

@@ -1,6 +1,7 @@
 package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.FinanceProjects;
@@ -24,8 +25,6 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.io.*;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
 import java.util.*;
 
 /**
@@ -121,7 +120,7 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
     }
 
     @Override
-    public HttpRespMsg importData(Integer companyId, Integer withCheckIn, MultipartFile multipartFile, HttpServletRequest request) {
+    public HttpRespMsg importData(Integer companyId, Integer withCheckIn, MultipartFile multipartFile, HttpServletRequest request,String ymonth) {
         HttpRespMsg msg = new HttpRespMsg();
         String fileName=multipartFile.getOriginalFilename();
         File file = new File(fileName == null ? "file" : fileName);
@@ -140,7 +139,6 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
 
             //然后解析表格
             Workbook workbook = WorkbookFactory.create(new FileInputStream(file));
-            DateFormat df = new SimpleDateFormat("yyyy-MM");
             //获取公司全部成员
             List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
             Sheet sheet = workbook.getSheetAt(0);
@@ -210,19 +208,18 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
                     //人员存在
                     User user = userMapper.selectList(new QueryWrapper<User>().eq("name", username)).get(0);
                     Integer s = 0;
-                    dataStringOne="{"+"\""+"name"+"\""+":"+"\""+username+"\""+","+"\""+"id"+"\""+":"+"\""+user.getId()+"\""+",";
+                    JSONObject jsonObject=new JSONObject();
+                    jsonObject.put("name",username);
+                    jsonObject.put("id",user.getId());
                     for (int i=projectNameStartIndex; i < projectNameStartIndex + projectList.size(); i++) {
                         if (row.getCell(i) == null) {
                             continue;
                         }
                         String stringCellValue = row.getCell(i).getStringCellValue();
                         s+=Integer.parseInt(stringCellValue);
-                        if(i!=projectNameStartIndex + projectList.size()-1){
-                            dataStringOne+="\""+projectList.get(i-1)+"\""+":"+"\""+stringCellValue+"\""+",";
-                        }else{
-                            dataStringOne+="\""+projectList.get(i-1)+"\""+":"+"\""+stringCellValue+"\""+"}";
-                        }
+                        jsonObject.put(projectList.get(i-1),stringCellValue);
                     }
+                    dataStringOne=jsonObject.toJSONString();
                     if(rowIndex!=rowNum){
                         dataString+=dataStringOne+",";
                     }else{
@@ -234,8 +231,8 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
                     }
                 }
             }
-            ProjectPercentage percentageServiceOne = projectPercentageService.getOne(new QueryWrapper<ProjectPercentage>().eq("company_id", companyId));
-            if(percentageServiceOne.getData().equals(dataString)){
+            ProjectPercentage percentageServiceOne = projectPercentageService.getOne(new QueryWrapper<ProjectPercentage>().eq("company_id", companyId).eq("ymonth",ymonth));
+            if(percentageServiceOne!=null&&percentageServiceOne.getData().equals(dataString)){
                 msg.setError("请勿导入重复数据");
                 return msg;
             }
@@ -243,13 +240,13 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
             //检查是否已经存在分摊数据
             if(percentageServiceOne!=null){
                 projectPercentage.setId(percentageServiceOne.getId());
-                projectPercentage.setYmonth(df.format(new Date()));
+                projectPercentage.setYmonth(ymonth);
                 projectPercentage.setData(dataString);
                 projectPercentage.setCompanyId(companyId);
                 projectPercentageService.updateById(projectPercentage);
             }else{
                 projectPercentage.setId(null);
-                projectPercentage.setYmonth(df.format(new Date()));
+                projectPercentage.setYmonth(ymonth);
                 projectPercentage.setData(dataString);
                 projectPercentage.setCompanyId(companyId);
                 projectPercentageService.save(projectPercentage);

+ 11 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -1268,6 +1268,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 for (int m=0;m<settings.size(); m++) {
                                     if (settings.get(m).getIsDeptAudit()== 0) {//找到项目审核的那个节点
                                         AuditWorkflowTimeSetting nextNode = settings.get(m + 1);
+//                                        System.out.println("nextNode=="+nextNode.getAuditDeptName());
                                         upR.setIsDeptAudit(nextNode.getIsDeptAudit());
                                         if (upR.getIsDeptAudit() == 1) {
                                             upR.setAuditDeptid(nextNode.getAuditDeptId());
@@ -1281,6 +1282,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 //全部更新到下一个审核阶段
                                 List<Integer> allRids = sameUserSameDayOtherReports.stream().map(Report::getId).collect(Collectors.toList());
                                 allRids.addAll(ids);
+//                                System.out.println("更新全部的日报到下个阶段:getIsDeptAudit="+upR.getIsDeptAudit()+", ");
                                 reportMapper.update(upR,
                                         new QueryWrapper<Report>().in("id", allRids));
                             }
@@ -1788,8 +1790,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                         curReport.setIsDeptAudit(nextNode.getIsDeptAudit());
                                         if (curReport.getIsDeptAudit() == 1) {
                                             curReport.setAuditDeptid(nextNode.getAuditDeptId());
-                                            curReport.setAuditDeptManagerid(allDepts.stream()
-                                                    .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
+                                            Optional<Department> first = allDepts.stream()
+                                                    .filter(ad -> ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst();
+                                            if (!first.isPresent()) {
+
+                                                System.out.println(item.getId()+"下个节点找不到: "+nextNode.getAuditDeptId()+", "+nextNode.getAuditDeptName());
+
+                                            }
+                                            String managerId = first.get().getManagerId();
+                                            curReport.setAuditDeptManagerid(managerId);
                                         }
                                         curReport.setIsFinalAudit(nextNode.getIsFinal());
                                         break;

+ 7 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -559,4 +559,11 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         }.start();
     }
 
+    @Override
+    public HttpRespMsg getExecutorPlanHour(Integer projectId) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        httpRespMsg.data=taskMapper.getExecutorPlanHour(projectId);
+        return httpRespMsg;
+    }
+
 }

+ 6 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -280,7 +280,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         }
         String url = null;
         try {
-
             startDateTime = startDateTime.withHour(0).withMinute(0).withSecond(0).withNano(0);
             long startTime = startDateTime.toEpochSecond(ZoneOffset.of("+8"));
             endDateTime = endDateTime.withHour(0).withMinute(0).withSecond(0).withNano(0);
@@ -511,6 +510,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                         //超过下午上班的开始时间,需要减去午休的时间
                         if (ct.getEndTime().compareTo(baseAfternoonStart) >= 0) {
                             //重新计算打卡工时时,需要减去中间午休时间
+
                             timeDelta -= restTime;
                         }
                     } else {
@@ -570,8 +570,11 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                 //检查请假时间段是否在打卡的时间范围内
                                 if ("上午".equals(leaveEnd) || "下午".equals(leaveEnd)) {
                                     //半天或者全天请假, 上面已经处理过结束时间为请假之前的时间了,此处不需要再处理了
-                                    if (showLog)System.out.println("====半天或者全天请假 =转化为8小时制下的时间="+(ct.getAskLeaveTime()/24*8.0));
-                                    ct.setAskLeaveTime(ct.getAskLeaveTime()/24*8.0);//转换成一天8小时工作制
+                                    if (ct.getAskLeaveTime() >= 12) {
+                                        if (showLog)System.out.println("====半天或者全天请假 =转化为8小时制下的时间="+(ct.getAskLeaveTime()/24*8.0));
+                                        //12小时以上的,是请假半天或者全天的。 防止1天有2次上下午分开的请假,导致计算两次的错误
+                                        ct.setAskLeaveTime(ct.getAskLeaveTime()/24*8.0);//转换成一天8小时工作制
+                                    }
                                 } else if (ct.getStartTime().compareTo(leaveStart) <= 0 && ct.getEndTime().compareTo(leaveEnd) >= 0) {
                                     String hourLeaveTime = leaveText.replaceAll("请假", "").replaceAll("小时", "");
                                     if (showLog)System.out.println("请假时长=" + hourLeaveTime);

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

@@ -7,6 +7,7 @@ import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.DingDingService;
+import com.management.platform.service.ThirdPartyInterfaceService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.RedisUtil;
 import com.management.platform.util.WorkDayCalculateUtils;
@@ -23,6 +24,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
+import java.security.SecureRandom;
 import java.text.DecimalFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -33,6 +35,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * Author: 吴涛涛
@@ -91,6 +94,18 @@ public class TimingTask {
     private BusinessTripMapper businessTripMapper;
     @Resource
     private SysConfigMapper sysConfigMapper;
+    @Resource
+    private ThirdPartyInterfaceMapper thirdPartyInterfaceMapper;
+    @Resource
+    private ThirdPartyInterfaceService thirdPartyInterfaceService;
+
+    private static final List<Integer> VALID_TOKEN_CHARS = new ArrayList<>();
+    static {
+        IntStream.rangeClosed('0', '9').forEach(VALID_TOKEN_CHARS::add);    // 0-9
+        IntStream.rangeClosed('A', 'Z').forEach(VALID_TOKEN_CHARS::add);    // A-Z
+        IntStream.rangeClosed('a', 'z').forEach(VALID_TOKEN_CHARS::add);    // a-z
+        IntStream.rangeClosed('!', '*').forEach(VALID_TOKEN_CHARS::add);    // !-*
+    }
 
     //检查项目到期,距离到期时间3天内的,每天提醒
     @Scheduled(cron = "0 0 10 ? * *")
@@ -226,6 +241,43 @@ public class TimingTask {
             wxCorpInfoService.getUserCheckInDayData(companyId, null, start, end, false);
         }
     }
+    //每个月第一天推送token到每个公司
+    @Scheduled(cron = "0 30 7 1 * ?")
+    public void  pushToken(){
+        int passwordLength = 30;
+        LocalDateTime localDateTime=LocalDateTime.now();
+        List<ThirdPartyInterface> thirdPartyInterfaceList = thirdPartyInterfaceMapper.selectList(null);
+        List<String> collect = thirdPartyInterfaceList.stream().map(tf -> tf.getToken()).collect(Collectors.toList());
+        for (ThirdPartyInterface thirdPartyInterface : thirdPartyInterfaceList) {
+            List<String> stringList=new ArrayList<>();
+            new SecureRandom().ints(passwordLength, 0, VALID_TOKEN_CHARS.size())
+                    .map(VALID_TOKEN_CHARS::get).forEach(v->stringList.add(String.valueOf((char) v)));
+            if(localDateTime.isAfter(thirdPartyInterface.getExpireTime())){
+                String token="";
+                for (String s : stringList) {
+                    token+=s;
+                }
+                if(collect.contains(token)){
+                    continue;
+                }
+                thirdPartyInterface.setToken(token);
+                thirdPartyInterface.setExpireTime(localDateTime.plusMonths(1));
+            }
+        }
+        thirdPartyInterfaceService.updateBatchById(thirdPartyInterfaceList);
+    }
+
+    public static void main(String[] args) {
+        int passwordLength = 30;
+        List<String> stringList=new ArrayList<>();
+        new SecureRandom().ints(passwordLength, 0, VALID_TOKEN_CHARS.size())
+                .map(VALID_TOKEN_CHARS::get).forEach(v->stringList.add(String.valueOf((char) v)));
+        String token="";
+        for (String s : stringList) {
+            token+=s;
+        }
+        System.out.println(token);
+    }
 
     //发送上周填写的工时统计
     @Scheduled(cron = "0 0 8 ? * *")

+ 15 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/DepartmentMapper.xml

@@ -88,4 +88,19 @@
         </if>
         GROUP BY b.project_id, a.id
     </select>
+    <!-- 根据部门获取自定义的日报数值 -->
+    <select id="getDeptCustomDataStatistic" resultType="java.util.Map">
+        SELECT a.department_id as id, a.department_name AS department, c.project_name AS project, IFNULL(SUM(b.custom_data),0) AS cost
+        FROM department AS a
+        LEFT JOIN report AS b ON a.department_id = b.dept_id
+        LEFT JOIN project AS c ON b.project_id = c.id
+        WHERE b.state = 1
+        <if test="companyId!=null">
+            AND a.company_id =#{companyId}
+        </if>
+        <if test="startDate!=null and endDate!=null">
+            AND b.create_date between #{startDate} and #{endDate}
+        </if>
+        GROUP BY b.project_id, a.department_id
+    </select>
 </mapper>

+ 8 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml

@@ -111,6 +111,14 @@
         WHERE a.project_id = #{projectId}
         GROUP BY b.executor_id
     </select>
+
+    <!--计算执行人任务计划工时-->
+    <select id="getExecutorPlanHour" resultType="java.util.Map">
+        SELECT IFNULL(b.executor_id,0) as executorId,IFNULL( b.executor_name,'待认领') as executorName,  sum(a.plan_hours) AS taskHours
+        FROM task a left join task_executor b on b.task_id = a.id
+        WHERE a.project_id = #{projectId}
+        GROUP BY b.executor_id
+    </select>
     <!--计算任务列表的任务分布-->
     <select id="getStagesPanel" resultType="java.util.Map">
         SELECT a.stages_id AS stagesId, stages.`stages_name` AS name,  COUNT(1) AS value

+ 10 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -12,11 +12,12 @@
             <div class="tree" :style="'height:'+ (tableHeight + 83) + 'px'">
                 <!-- <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick" accordion></el-tree> -->
                 <el-tree :data="data" :props="defaultProps" node-key="id" :expand-on-click-node="false" accordion @node-click="handleNodeClick" :default-expanded-keys="jDarr" @node-expand="jieDian" @node-collapse="shutDown" @current-change="chufa">
-                    <span class="custom-tree-node" slot-scope="{ node }" @mouseleave= mouseleave(data,$event) @mouseover= mouseover(data,$event)>
+                    <span class="custom-tree-node" style="position: relative;box-sizing: border-box;width: 10%" slot-scope="{ node }" @mouseleave= mouseleave(data,$event) @mouseover= mouseover(data,$event)>
 
-                        <span style="width: 130px;overflow:hidden;text-overflow:ellipsis;line-height: 36px; display: inline-block;">{{ node.label }}</span>
+                        <span style="padding-right: 50px;box-sizing: border-box;overflow:hidden;text-overflow:ellipsis;line-height: 36px; display: inline-block;">{{ node.label }}</span>
 
-                        <span v-if="node.label != '全部人员'" class="node none">
+                        <!-- <span v-if="node.label != '全部人员'" class="node none"> -->
+                        <span v-if="node.label != '全部人员'" class="node none poAub">
                             <el-button type="text" size="mini" @click="createDepartment(-2)" >
                                 <i class="el-icon-circle-plus-outline"></i> <!-- 新增 -->
                             </el-button>
@@ -1315,10 +1316,10 @@
                 this.jDarr = arrs
             },
             mouseleave(data,$event){
-                $event.currentTarget.firstElementChild.nextElementSibling.setAttribute('class','node none')
+                $event.currentTarget.firstElementChild.nextElementSibling.setAttribute('class','node none poAub')
             },
             mouseover(data,$event){
-                $event.currentTarget.lastChild.setAttribute('class','node block');
+                $event.currentTarget.lastChild.setAttribute('class','node block poAub');
             },
             confirmDeactive() {
                 this.http.post('/user/deactiveUser', {
@@ -2681,4 +2682,8 @@
         display: inline-block;
         margin-right: 15px;
     } 
+    .poAub {
+        position: absolute;
+        right: 10px;
+    }
 </style>