Browse Source

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

Lijy 2 years ago
parent
commit
1d58638b30
52 changed files with 1601 additions and 355 deletions
  1. 44 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectRequirementController.java
  2. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  3. 102 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/SubUserCustomController.java
  4. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  5. 96 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCustomController.java
  6. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectRequirement.java
  7. 10 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  8. 9 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportAuditLog.java
  9. 42 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SubUserCustom.java
  10. 26 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  11. 30 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java
  12. 48 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserCustom.java
  13. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  14. 5 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  15. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/SubUserCustomMapper.java
  16. 3 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java
  17. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserCustomMapper.java
  18. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  19. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/SubUserCustomService.java
  20. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserCustomService.java
  21. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  22. 13 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  23. 24 23
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  24. 15 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  25. 67 29
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  26. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SubUserCustomServiceImpl.java
  27. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserCustomServiceImpl.java
  28. 44 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  29. 30 13
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-dev.yml
  30. 106 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-mld.yml
  31. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/DepartmentMapper.xml
  32. 7 4
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  33. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectRequirementMapper.xml
  34. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportAuditLogMapper.xml
  35. 15 5
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  36. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SubUserCustomMapper.xml
  37. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  38. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  39. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserCustomMapper.xml
  40. 11 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml
  41. 11 11
      fhKeeper/formulahousekeeper/timesheet/config/index.js
  42. BIN
      fhKeeper/formulahousekeeper/timesheet/src/assets/image/hanglie_corp.png
  43. 2 0
      fhKeeper/formulahousekeeper/timesheet/src/permissions.js
  44. 7 8
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  45. 15 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue
  46. 22 3
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  47. 418 18
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  48. 53 39
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  49. 22 7
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  50. 94 91
      fhKeeper/formulahousekeeper/timesheet_h5/package-lock.json
  51. 23 12
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  52. 11 10
      fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

+ 44 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectRequirementController.java

@@ -4,11 +4,9 @@ package com.management.platform.controller;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.Project;
 import com.management.platform.entity.Project;
 import com.management.platform.entity.ProjectRequirement;
 import com.management.platform.entity.ProjectRequirement;
+import com.management.platform.entity.Task;
 import com.management.platform.entity.TaskGroup;
 import com.management.platform.entity.TaskGroup;
-import com.management.platform.mapper.ProjectMapper;
-import com.management.platform.mapper.ProjectRequirementMapper;
-import com.management.platform.mapper.TaskGroupMapper;
-import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.*;
 import com.management.platform.service.ProjectRequirementService;
 import com.management.platform.service.ProjectRequirementService;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
@@ -59,6 +57,8 @@ public class ProjectRequirementController {
     private ProjectRequirementService projectRequirementService;
     private ProjectRequirementService projectRequirementService;
     @Resource
     @Resource
     private TaskGroupMapper taskGroupMapper;
     private TaskGroupMapper taskGroupMapper;
+    @Resource
+    private TaskMapper taskMapper;
 
 
     @RequestMapping("/addOrMod")
     @RequestMapping("/addOrMod")
     public HttpRespMsg addOrMod(ProjectRequirement record) {
     public HttpRespMsg addOrMod(ProjectRequirement record) {
@@ -89,6 +89,15 @@ public class ProjectRequirementController {
             projectIds = taskGroups.stream().map(TaskGroup::getProjectId).collect(Collectors.toList());
             projectIds = taskGroups.stream().map(TaskGroup::getProjectId).collect(Collectors.toList());
         }
         }
         List<ProjectRequirement> projectRequirements = projectRequirementMapper.customSelect(companyId, startDate, projectId, projectIds.size()==0?null:projectIds, startIndex, pageSize,reStartDate,reEndDate);
         List<ProjectRequirement> projectRequirements = projectRequirementMapper.customSelect(companyId, startDate, projectId, projectIds.size()==0?null:projectIds, startIndex, pageSize,reStartDate,reEndDate);
+        List<Integer> collect = projectRequirements.stream().map(pr -> pr.getProjectId()).collect(Collectors.toList());
+        List<Task> milepostList=taskMapper.selectMilepost(collect);
+        projectRequirements.forEach(pr->{
+            milepostList.forEach(mp->{
+                if(pr.getProjectId().equals(mp.getProjectId())){
+                    pr.setMilepost(mp);
+                }
+            });
+        });
         long total=projectRequirementMapper.selectCountByDate(companyId, startDate, projectId, projectIds.size()==0?null:projectIds, startIndex, pageSize,reStartDate,reEndDate);
         long total=projectRequirementMapper.selectCountByDate(companyId, startDate, projectId, projectIds.size()==0?null:projectIds, startIndex, pageSize,reStartDate,reEndDate);
         HashMap map = new HashMap();
         HashMap map = new HashMap();
         map.put("total", total);
         map.put("total", total);
@@ -106,8 +115,17 @@ public class ProjectRequirementController {
         now = now.minusDays(7);
         now = now.minusDays(7);
         String startDate = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
         String startDate = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
         List<ProjectRequirement> projectRequirementList = projectRequirementMapper.customSelect(companyId,startDate, null, null, null, null,null,null);
         List<ProjectRequirement> projectRequirementList = projectRequirementMapper.customSelect(companyId,startDate, null, null, null, null,null,null);
+        List<Integer> collect = projectRequirementList.stream().map(pr -> pr.getProjectId()).collect(Collectors.toList());
+        List<Task> milepostList=taskMapper.selectMilepost(collect);
+        projectRequirementList.forEach(pr->{
+            milepostList.forEach(mp->{
+                if(pr.getProjectId().equals(mp.getProjectId())){
+                    pr.setMilepost(mp);
+                }
+            });
+        });
         List<List<String>> dataList=new ArrayList<>();
         List<List<String>> dataList=new ArrayList<>();
-        String[] titleString={"项目编号","项目名称","近七日活跃人员","人员需求","任务需求","开始时间","结束时间"};
+        String[] titleString={"项目编号","项目名称","近七日活跃人员","人员需求","任务需求","合同要求","参与部门进度","里程碑进度","开始时间","结束时间"};
         List<String> nameList = Arrays.asList(titleString);
         List<String> nameList = Arrays.asList(titleString);
         dataList.add(nameList);
         dataList.add(nameList);
         projectRequirementList.forEach(pr->{
         projectRequirementList.forEach(pr->{
@@ -117,13 +135,24 @@ public class ProjectRequirementController {
             resultData.add(pr.getActiveUsers());
             resultData.add(pr.getActiveUsers());
             resultData.add(pr.getMembReq());
             resultData.add(pr.getMembReq());
             resultData.add(pr.getTaskReq());
             resultData.add(pr.getTaskReq());
+            resultData.add(pr.getContractReq());
+            resultData.add(pr.getDepartmentSpeed());
+            if(pr.getMilepost()!=null){
+                resultData.add(pr.getMilepost().getName()+"-完成时间:"+pr.getMilepost().getFinishDate());
+            }else{
+                resultData.add("");
+            }
             if(pr.getStartDate()!=null){
             if(pr.getStartDate()!=null){
                 String s=df.format(pr.getStartDate());
                 String s=df.format(pr.getStartDate());
                 resultData.add(s);
                 resultData.add(s);
+            }else {
+                resultData.add("");
             }
             }
             if(pr.getEndDate()!=null){
             if(pr.getEndDate()!=null){
                 String s1=df.format(pr.getEndDate());
                 String s1=df.format(pr.getEndDate());
                 resultData.add(s1);
                 resultData.add(s1);
+            }else {
+                resultData.add("");
             }
             }
             dataList.add(resultData);
             dataList.add(resultData);
         });
         });
@@ -176,12 +205,16 @@ public class ProjectRequirementController {
                 XSSFCell codeCell = row.getCell(0);
                 XSSFCell codeCell = row.getCell(0);
                 XSSFCell taskReqCell = row.getCell(1);
                 XSSFCell taskReqCell = row.getCell(1);
                 XSSFCell membReqCell = row.getCell(2);
                 XSSFCell membReqCell = row.getCell(2);
-                XSSFCell startDateCell = row.getCell(3);
-                XSSFCell endDateCell = row.getCell(4);
+                XSSFCell contractReqCell = row.getCell(3);
+                XSSFCell departmentSpeedCell = row.getCell(4);
+                XSSFCell startDateCell = row.getCell(5);
+                XSSFCell endDateCell = row.getCell(6);
 
 
                 if (codeCell != null)codeCell.setCellType(CellType.STRING);
                 if (codeCell != null)codeCell.setCellType(CellType.STRING);
                 if (taskReqCell != null)taskReqCell.setCellType(CellType.STRING);
                 if (taskReqCell != null)taskReqCell.setCellType(CellType.STRING);
                 if (membReqCell != null)membReqCell.setCellType(CellType.STRING);
                 if (membReqCell != null)membReqCell.setCellType(CellType.STRING);
+                if (contractReqCell != null)contractReqCell.setCellType(CellType.STRING);
+                if (departmentSpeedCell != null)departmentSpeedCell.setCellType(CellType.STRING);
                 if (startDateCell != null)startDateCell.setCellType(CellType.NUMERIC);
                 if (startDateCell != null)startDateCell.setCellType(CellType.NUMERIC);
                 if (endDateCell != null)endDateCell.setCellType(CellType.NUMERIC);
                 if (endDateCell != null)endDateCell.setCellType(CellType.NUMERIC);
                 ProjectRequirement projectRequirement=new ProjectRequirement();
                 ProjectRequirement projectRequirement=new ProjectRequirement();
@@ -198,8 +231,10 @@ public class ProjectRequirementController {
                 }else{
                 }else{
                     list.forEach(li->{
                     list.forEach(li->{
                         projectRequirement.setProjectId(li.getId());
                         projectRequirement.setProjectId(li.getId());
-                        projectRequirement.setTaskReq(StringUtils.isEmpty(taskReqCell.getStringCellValue())?"":taskReqCell.getStringCellValue());
-                        projectRequirement.setMembReq(StringUtils.isEmpty(membReqCell.getStringCellValue())?"":membReqCell.getStringCellValue());
+                        projectRequirement.setTaskReq(StringUtils.isEmpty(taskReqCell)?"":taskReqCell.getStringCellValue());
+                        projectRequirement.setMembReq(StringUtils.isEmpty(membReqCell)?"":membReqCell.getStringCellValue());
+                        projectRequirement.setContractReq(StringUtils.isEmpty(contractReqCell)?"":contractReqCell.getStringCellValue());
+                        projectRequirement.setDepartmentSpeed(StringUtils.isEmpty(departmentSpeedCell)?"":departmentSpeedCell.getStringCellValue());
                         if(startDateCell!=null){
                         if(startDateCell!=null){
                             projectRequirement.setStartDate(startDateCell.getDateCellValue());
                             projectRequirement.setStartDate(startDateCell.getDateCellValue());
                         }else {
                         }else {

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

@@ -92,8 +92,8 @@ public class ReportController {
      * date 日期 格式yyyy-mm-dd
      * date 日期 格式yyyy-mm-dd
      */
      */
     @RequestMapping("/exportReport")
     @RequestMapping("/exportReport")
-    public HttpRespMsg exportReport(String startDate, String endDate, Integer projectId,@RequestParam(defaultValue = "0") Integer stateKey) {
-        return reportService.exportReport(startDate, endDate, projectId,stateKey, request);
+    public HttpRespMsg exportReport(String startDate, String endDate, Integer projectId,@RequestParam(defaultValue = "0") Integer stateKey,Integer departmentId) {
+        return reportService.exportReport(startDate, endDate, projectId,stateKey,departmentId, request);
     }
     }
 
 
 
 

+ 102 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/SubUserCustomController.java

@@ -0,0 +1,102 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.SubUserCustom;
+import com.management.platform.entity.User;
+import com.management.platform.entity.UserCustom;
+import com.management.platform.mapper.SubUserCustomMapper;
+import com.management.platform.mapper.UserCustomMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.SubUserCustomService;
+import com.management.platform.service.UserCustomService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+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-06-13
+ */
+@RestController
+@RequestMapping("/sub-user-custom")
+public class SubUserCustomController {
+    @Autowired
+    private SubUserCustomService subUserCustomService;
+    @Resource
+    private UserCustomService userCustomService;
+    @Resource
+    private SubUserCustomMapper subUserCustomMapper;
+    @Resource
+    private UserCustomMapper userCustomMapper;
+    @Resource
+    private UserMapper userMapper;
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(SubUserCustom subUserCustom){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer cut = subUserCustomMapper.selectCount(new QueryWrapper<SubUserCustom>().eq("name", subUserCustom.getName()).eq("user_custom_id",subUserCustom.getUserCustomId()));
+        if(cut>0){
+            msg.setError("名称["+subUserCustom.getName()+"]已存在");
+            return msg;
+        }
+        subUserCustomService.saveOrUpdate(subUserCustom);
+        return msg;
+    }
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id, HttpServletRequest request){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        SubUserCustom subUserCustom = subUserCustomService.getById(id);
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<UserCustom> userCustomList = userCustomMapper.selectList(new QueryWrapper<UserCustom>().eq("company_id", companyId));
+        Integer num=null;
+        for(int i=0;i<userCustomList.size();i++){
+            if(subUserCustom.getUserCustomId().equals(userCustomList.get(i).getId())){
+                num=i;
+            }
+        }
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+        for(User user:userList) {
+            Object result=null;
+            switch (num){
+                case 0:
+                    result=user.getPlate1();
+                    break;
+                case 1:
+                    result=user.getPlate2();
+                    break;
+                case 2:
+                    result=user.getPlate3();
+                    break;
+                case 3:
+                    result=user.getPlate4();
+                    break;
+                case 4:
+                    result=user.getPlate5();
+                    break;
+            }
+            if(result!=null && !result.equals("") &&result.equals(subUserCustom.getName())){
+                httpRespMsg.setError("当前配置["+subUserCustom.getName()+"]已使用");
+                return httpRespMsg;
+            }
+        }
+        subUserCustomService.removeById(id);
+        return new HttpRespMsg();
+    }
+    @RequestMapping("/list")
+    public HttpRespMsg list(Integer userCustomId){
+        HttpRespMsg msg=new HttpRespMsg();
+        List<SubUserCustom> subUserCustomList = subUserCustomMapper.selectList(new QueryWrapper<SubUserCustom>().eq("user_custom_id", userCustomId));
+        msg.data=subUserCustomList;
+        return msg;
+    }
+}
+

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

@@ -129,9 +129,10 @@ public class UserController {
     public HttpRespMsg insertUser(String id, @RequestParam String name, String phone,
     public HttpRespMsg insertUser(String id, @RequestParam String name, String phone,
                                   @RequestParam Integer roleId, Double monthCost, Double cost,
                                   @RequestParam Integer roleId, Double monthCost, Double cost,
                                   Integer departmentId, Integer salaryType, String costApplyDate,
                                   Integer departmentId, Integer salaryType, String costApplyDate,
-                                    String position, String certJson,String inductionDate) {
+                                    String position, String certJson,String inductionDate,String superiorId,
+                                    String plate1,String plate2,String plate3,String plate4,String plate5) {
         return userService.insertUser(id, name, phone, roleId, monthCost, cost, departmentId, salaryType, costApplyDate,
         return userService.insertUser(id, name, phone, roleId, monthCost, cost, departmentId, salaryType, costApplyDate,
-                    position, certJson, request,inductionDate);
+                    position, certJson, request,inductionDate,superiorId,plate1, plate2, plate3,plate4,plate5);
     }
     }
 
 
     /**
     /**

+ 96 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCustomController.java

@@ -0,0 +1,96 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.User;
+import com.management.platform.entity.UserCustom;
+import com.management.platform.mapper.UserCustomMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.UserCustomService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+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-06-13
+ */
+@RestController
+@RequestMapping("/user-custom")
+public class UserCustomController {
+    @Autowired
+    private UserCustomService userCustomService;
+    @Resource
+    private UserCustomMapper userCustomMapper;
+    @Resource
+    private UserMapper userMapper;
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(String json, HttpServletRequest request){
+        List<UserCustom> userCustomList = JSONArray.parseArray(json, UserCustom.class);
+        HttpRespMsg msg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        for(UserCustom userCustom:userCustomList){
+            userCustom.setCompanyId(user.getCompanyId());
+        }
+        userCustomService.saveOrUpdateBatch(userCustomList);
+        return msg;
+    }
+    @RequestMapping("/list")
+    public HttpRespMsg getUserCustomList(HttpServletRequest request){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<UserCustom> userCustomList = userCustomMapper.selectList(new QueryWrapper<UserCustom>().eq("company_id", companyId));
+        httpRespMsg.data=userCustomList;
+        return httpRespMsg;
+    }
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id,HttpServletRequest request){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<UserCustom> userCustomList = userCustomMapper.selectList(new QueryWrapper<UserCustom>().eq("company_id", companyId));
+        Integer num=null;
+        for(int i=0;i<userCustomList.size();i++){
+            if(id.equals(userCustomList.get(i).getId())){
+                num=i;
+            }
+        }
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+        for(User user:userList) {
+            Object result=null;
+            switch (num){
+                case 0:
+                    result=user.getPlate1();
+                    break;
+                case 1:
+                    result=user.getPlate2();
+                    break;
+                case 2:
+                    result=user.getPlate3();
+                    break;
+                case 3:
+                    result=user.getPlate4();
+                    break;
+                case 4:
+                    result=user.getPlate5();
+                    break;
+            }
+            if(result!=null && !result.equals("")){
+                httpRespMsg.setError("当前配置已被使用");
+                return httpRespMsg;
+            }
+        }
+        userCustomService.removeById(id);
+        return new HttpRespMsg();
+    }
+}
+

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectRequirement.java

@@ -59,6 +59,16 @@ public class ProjectRequirement extends Model<ProjectRequirement> {
     @TableField(exist = false)
     @TableField(exist = false)
     private String activeUsers;
     private String activeUsers;
 
 
+    @TableField("contract_req")
+    private String contractReq;
+
+    @TableField("department_speed")
+    private String departmentSpeed;
+
+    @TableField(exist = false)
+    private Task milepost;
+
+
 
 
     @Override
     @Override
     protected Serializable pkVal() {
     protected Serializable pkVal() {

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

@@ -1,16 +1,9 @@
 package com.management.platform.entity;
 package com.management.platform.entity;
 
 
-import java.math.BigDecimal;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
-import java.time.LocalDate;
-import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.List;
-
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.management.platform.entity.vo.WorktimeItem;
 import com.management.platform.entity.vo.WorktimeItem;
 import lombok.Data;
 import lombok.Data;
@@ -18,6 +11,13 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.format.annotation.DateTimeFormat;
 
 
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+
 /**
 /**
  * <p>
  * <p>
  * 
  * 
@@ -333,7 +333,7 @@ public class Report extends Model<Report> {
 
 
 
 
     @Override
     @Override
-    protected Serializable pkVal() {
+    protected Serializable pkVal(){
         return this.id;
         return this.id;
     }
     }
 
 

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

@@ -1,25 +1,24 @@
 package com.management.platform.entity;
 package com.management.platform.entity;
 
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
-import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import lombok.experimental.Accessors;
 
 
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
 /**
 /**
  * <p>
  * <p>
  * 
  * 
  * </p>
  * </p>
  *
  *
  * @author Seyason
  * @author Seyason
- * @since 2022-03-24
+ * @since 2022-06-13
  */
  */
 @Data
 @Data
 @EqualsAndHashCode(callSuper = false)
 @EqualsAndHashCode(callSuper = false)
@@ -38,7 +37,6 @@ public class ReportAuditLog extends Model<ReportAuditLog> {
     private String userName;
     private String userName;
 
 
     @TableField("indate")
     @TableField("indate")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
     private LocalDateTime indate;
     private LocalDateTime indate;
 
 
     @TableField("company_id")
     @TableField("company_id")
@@ -56,6 +54,8 @@ public class ReportAuditLog extends Model<ReportAuditLog> {
     @TableField("audit_channel")
     @TableField("audit_channel")
     private Integer auditChannel;
     private Integer auditChannel;
 
 
+    @TableField("project_name")
+    private String projectName;
 
 
     @TableField(exist = false)
     @TableField(exist = false)
     private List<ReportAlogMembdate> membdateList;
     private List<ReportAlogMembdate> membdateList;

+ 42 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/SubUserCustom.java

@@ -0,0 +1,42 @@
+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-06-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class SubUserCustom extends Model<SubUserCustom> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("user_custom_id")
+    private Integer userCustomId;
+
+    @TableField("name")
+    private String name;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

@@ -1,16 +1,16 @@
 package com.management.platform.entity;
 package com.management.platform.entity;
 
 
-import java.math.BigDecimal;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
-import java.util.List;
-
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import lombok.experimental.Accessors;
 
 
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
 /**
 /**
  * <p>
  * <p>
  * 
  * 
@@ -110,6 +110,13 @@ public class TimeType extends Model<TimeType> {
     @TableField("custom_degree_name")
     @TableField("custom_degree_name")
     private String customDegreeName;
     private String customDegreeName;
 
 
+
+    /**
+     * 工时填报自定义维度是否必填
+     */
+    @TableField("custom_degree_status")
+    private Integer customDegreeStatus;
+
     /**
     /**
      * 提醒内容
      * 提醒内容
      */
      */
@@ -146,6 +153,13 @@ public class TimeType extends Model<TimeType> {
     @TableField("custom_data_name")
     @TableField("custom_data_name")
     private String customDataName;
     private String customDataName;
 
 
+
+    /**
+     * 工时填报数值收集字段是否必填
+     */
+    @TableField("custom_data_status")
+    private Integer customDataStatus;
+
     /**
     /**
      * 财务成本导入是否需要审核
      * 财务成本导入是否需要审核
      */
      */
@@ -200,6 +214,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("custom_text_name")
     @TableField("custom_text_name")
     private String customTextName;
     private String customTextName;
 
 
+    /**
+     * 自定义文本信息是否必填 0-否 1-是
+     */
+    @TableField("custom_text_status")
+    private Integer customTextStatus;
+
     /**
     /**
      * 是否锁定每日填报时长
      * 是否锁定每日填报时长
      */
      */

+ 30 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java

@@ -3,11 +3,9 @@ package com.management.platform.entity;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import lombok.experimental.Accessors;
-import org.springframework.format.annotation.DateTimeFormat;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
@@ -21,7 +19,7 @@ import java.util.List;
  * </p>
  * </p>
  *
  *
  * @author Seyason
  * @author Seyason
- * @since 2022-04-15
+ * @since 2022-06-14
  */
  */
 @Data
 @Data
 @EqualsAndHashCode(callSuper = false)
 @EqualsAndHashCode(callSuper = false)
@@ -29,6 +27,7 @@ import java.util.List;
 public class User extends Model<User> {
 public class User extends Model<User> {
 
 
     private static final long serialVersionUID=1L;
     private static final long serialVersionUID=1L;
+
     /**
     /**
      * 主键 雪花算法生成
      * 主键 雪花算法生成
      */
      */
@@ -167,28 +166,18 @@ public class User extends Model<User> {
     @TableField("corpwx_userid")
     @TableField("corpwx_userid")
     private String corpwxUserid;
     private String corpwxUserid;
 
 
-
-    @TableField(exist = false)
-    private String departmentName;
-    /**
-     * 离职日期
-     */
-    @TableField("inactive_date")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private LocalDate inactiveDate;
-
     /**
     /**
      * 入职日期
      * 入职日期
      */
      */
     @TableField("induction_date")
     @TableField("induction_date")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate inductionDate;
     private LocalDate inductionDate;
 
 
+    /**
+     * 离职日期
+     */
+    @TableField("inactive_date")
+    private LocalDate inactiveDate;
 
 
-    @TableField(exist = false)
-    private double totalHours;
     /**
     /**
      * 岗位职级
      * 岗位职级
      */
      */
@@ -201,6 +190,29 @@ public class User extends Model<User> {
     @TableField("report_status")
     @TableField("report_status")
     private Integer reportStatus;
     private Integer reportStatus;
 
 
+    @TableField("superior_id")
+    private String superiorId;
+
+    @TableField("plate1")
+    private String plate1;
+
+    @TableField("plate2")
+    private String plate2;
+
+    @TableField("plate3")
+    private String plate3;
+
+    @TableField("plate4")
+    private String plate4;
+
+    @TableField("plate5")
+    private String plate5;
+
+    @TableField(exist = false)
+    private String departmentName;
+
+    @TableField(exist = false)
+    private double totalHours;
 
 
     @TableField(exist = false)
     @TableField(exist = false)
     private List<UserCert> certList;
     private List<UserCert> certList;

+ 48 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserCustom.java

@@ -0,0 +1,48 @@
+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-06-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class UserCustom extends Model<UserCustom> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField("name")
+    private String name;
+
+    /**
+     * 0-下拉框 1-输入框
+     */
+    @TableField("type")
+    private Integer type;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

@@ -85,7 +85,7 @@ public interface ProjectMapper extends BaseMapper<Project> {
 
 
     List getBaseCostAndRealCost(Integer companyId, Integer pageStart, Integer pageSize, Integer projectId);
     List getBaseCostAndRealCost(Integer companyId, Integer pageStart, Integer pageSize, Integer projectId);
 
 
-    List<Map<String, Object>> getProjectCostGroupByProject(Integer companyId, String startDate, String endDate, Integer projectId);
+    List<Map<String, Object>> getProjectCostGroupByProject(Integer companyId, String startDate, String endDate, Integer projectId,String userId);
 
 
     List<Map<String, Object>> getTimeCostByCategory(Integer companyId, String startDate, String endDate, Integer projectCategoryId, String userId);
     List<Map<String, Object>> getTimeCostByCategory(Integer companyId, String startDate, String endDate, Integer projectCategoryId, String userId);
 
 

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

@@ -24,7 +24,8 @@ public interface ReportMapper extends BaseMapper<Report> {
                                                      @Param("userId") String userId,
                                                      @Param("userId") String userId,
                                                      @Param("endDate") String endDate,
                                                      @Param("endDate") String endDate,
                                                      @Param("projectId") Integer projectId,
                                                      @Param("projectId") Integer projectId,
-                                                     @Param("stateKey") Integer stateKey
+                                                     @Param("stateKey") Integer stateKey,
+                                                     @Param("departmentId")Integer departmentId
                                                  );
                                                  );
 
 
     List<HashMap<String, Object>> getProjectMembReportByDate(@Param("startDate") String startDate,
     List<HashMap<String, Object>> getProjectMembReportByDate(@Param("startDate") String startDate,
@@ -32,13 +33,14 @@ public interface ReportMapper extends BaseMapper<Report> {
                                                      @Param("leaderId") String leaderId,
                                                      @Param("leaderId") String leaderId,
                                                      @Param("endDate") String endDate,
                                                      @Param("endDate") String endDate,
                                                      @Param("projectId") Integer projectId,
                                                      @Param("projectId") Integer projectId,
-                                                     @Param("stateKey") Integer stateKey);
+                                                     @Param("stateKey") Integer stateKey,
+                                                     @Param("departmentId")Integer departmentId);
 
 
     //获取部门下的人员的日报
     //获取部门下的人员的日报
     List<HashMap<String, Object>> getDeptMembReportByDate(@Param("startDate") String startDate,
     List<HashMap<String, Object>> getDeptMembReportByDate(@Param("startDate") String startDate,
                                                              @Param("companyId") Integer companyId,
                                                              @Param("companyId") Integer companyId,
                                                              @Param("deptIds") List<Integer> deptIds,
                                                              @Param("deptIds") List<Integer> deptIds,
-                                                             @Param("endDate") String endDate, @Param("projectId") Integer projectId,@Param("stateKey")Integer stateKey);
+                                                             @Param("endDate") String endDate, @Param("projectId") Integer projectId,@Param("stateKey")Integer stateKey,@Param("departmentId")Integer departmentId);
 
 
     //按当前人员获取本人报告
     //按当前人员获取本人报告
     List<Map<String, Object>> getReportByDate(@Param("date") String date, @Param("id") String id);
     List<Map<String, Object>> getReportByDate(@Param("date") String date, @Param("id") String id);

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

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

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

@@ -1,16 +1,14 @@
 package com.management.platform.mapper;
 package com.management.platform.mapper;
 
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.management.platform.entity.Task;
 import com.management.platform.entity.Task;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.management.platform.entity.TimeTask;
 import com.management.platform.entity.TimeTask;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Update;
 import org.apache.ibatis.annotations.Update;
-import org.apache.poi.ss.formula.functions.T;
 
 
 import java.util.List;
 import java.util.List;
-import java.util.Map;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -43,4 +41,6 @@ public interface TaskMapper extends BaseMapper<Task> {
 
 
     @Update("update task set executor_id = null, executor_name = null, executor_color=null where id=#{id}")
     @Update("update task set executor_id = null, executor_name = null, executor_color=null where id=#{id}")
     void removeTaskExecutor(Integer id);
     void removeTaskExecutor(Integer id);
+
+    List<Task> selectMilepost(List<Integer> collect);
 }
 }

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

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

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

@@ -23,7 +23,7 @@ import java.util.List;
 public interface ReportService extends IService<Report> {
 public interface ReportService extends IService<Report> {
     HttpRespMsg getReportList(String date, Integer deptId, String userId, HttpServletRequest request);
     HttpRespMsg getReportList(String date, Integer deptId, String userId, HttpServletRequest request);
 
 
-    HttpRespMsg exportReport(@RequestParam String startDate, @RequestParam String endDate, Integer projectId,Integer stateKey, HttpServletRequest request);
+    HttpRespMsg exportReport(@RequestParam String startDate, @RequestParam String endDate, Integer projectId,Integer stateKey,Integer departmentId, HttpServletRequest request);
 
 
     HttpRespMsg getReport(String date, HttpServletRequest request);
     HttpRespMsg getReport(String date, HttpServletRequest request);
 
 

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

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

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

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

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

@@ -33,7 +33,7 @@ public interface UserService extends IService<User> {
 
 
     HttpRespMsg insertUser(String id, String name, String phone, Integer roleId, Double monthCost, Double cost, Integer departmentId,
     HttpRespMsg insertUser(String id, String name, String phone, Integer roleId, Double monthCost, Double cost, Integer departmentId,
                            Integer salaryType, String costApplyDate, String position, String certJson,
                            Integer salaryType, String costApplyDate, String position, String certJson,
-                           HttpServletRequest request,String inductionDate);
+                           HttpServletRequest request,String inductionDate, String superiorId,String plate1,String plate2,String plate3,String plate4,String plate5);
 
 
     HttpRespMsg importUser(MultipartFile multipartFile, HttpServletRequest request);
     HttpRespMsg importUser(MultipartFile multipartFile, HttpServletRequest request);
 
 

+ 13 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -400,6 +400,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             List<Map<String, Object>> list = departmentMapper
             List<Map<String, Object>> list = departmentMapper
                     .getCostByUser(null, startDate, endDate, companyId, allUserIds);
                     .getCostByUser(null, startDate, endDate, companyId, allUserIds);
             Map<String, List<Map<String, Object>>> tempMap = new HashMap<>();
             Map<String, List<Map<String, Object>>> tempMap = new HashMap<>();
+            List<String> names = new ArrayList<>();
             BigDecimal totalCostMoney = new BigDecimal(0);
             BigDecimal totalCostMoney = new BigDecimal(0);
             for (Map<String, Object> map : list) {
             for (Map<String, Object> map : list) {
                 if (tempMap.containsKey(map.get("user"))) {
                 if (tempMap.containsKey(map.get("user"))) {
@@ -414,6 +415,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                     dataMap.put("time", time);
                     dataMap.put("time", time);
                     tempList.add(dataMap);
                     tempList.add(dataMap);
                 } else {
                 } else {
+                    names.add((String)map.get("user"));
                     //这个名字尚未装进数组中
                     //这个名字尚未装进数组中
                     List<Map<String, Object>> tempList = new ArrayList<>();
                     List<Map<String, Object>> tempList = new ArrayList<>();
                     if (map.containsKey("project")) {
                     if (map.containsKey("project")) {
@@ -438,7 +440,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             dataList.add(titleList);
             dataList.add(titleList);
             BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
             BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
             double totalCostTime = 0;
             double totalCostTime = 0;
-            for (String key : tempMap.keySet()) {
+            for (String key : names) {
                 Map<String, Object> map = new HashMap<>();
                 Map<String, Object> map = new HashMap<>();
                 map.put("name", key);
                 map.put("name", key);
                 map.put("project", tempMap.get(key));
                 map.put("project", tempMap.get(key));
@@ -652,14 +654,23 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
             User user = userMapper.selectById(request.getHeader("TOKEN"));
             User user = userMapper.selectById(request.getHeader("TOKEN"));
             List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
             List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
+            boolean hasDeptWorktimePriv = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看本部门工时").size() > 0;
             List<Integer> deptIds = null;
             List<Integer> deptIds = null;
             if (functionList.size() == 0) {
             if (functionList.size() == 0) {
                 deptIds = new ArrayList<>();
                 deptIds = new ArrayList<>();
                 deptIds.add(-1);
                 deptIds.add(-1);
-                if (user.getManageDeptId() != 0) {
+                if (hasDeptWorktimePriv || (user.getManageDeptId() != null && user.getManageDeptId() != 0)) {
                     //有负责的部门
                     //有负责的部门
                     List<Department> myDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()));
                     List<Department> myDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()));
                     List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
                     List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
+                    if (hasDeptWorktimePriv && user.getDepartmentId() != null) {
+                        Department ownerDept = departmentMapper.selectById(user.getDepartmentId());
+                        //要加上自己的部门,如果没有的话
+                        if (!myDeptList.stream().anyMatch(d->d.getDepartmentId().equals(ownerDept.getDepartmentId()))) {
+                            myDeptList.add(ownerDept);
+                        }
+                    }
+
                     for (Department dept: myDeptList) {
                     for (Department dept: myDeptList) {
                         deptIds.add(dept.getDepartmentId());
                         deptIds.add(dept.getDepartmentId());
                         deptIds.addAll(getBranchDepartment(dept.getDepartmentId(), allDeptList));
                         deptIds.addAll(getBranchDepartment(dept.getDepartmentId(), allDeptList));

+ 24 - 23
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -358,38 +358,39 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 }
                 }
                 userService.updateBatchById(dbUpUserList);
                 userService.updateBatchById(dbUpUserList);
             }
             }
-            //检查是否有删除的,需要删除掉
-            List<Integer> readyForDelete = new ArrayList<>();
-            oldFinanceList.forEach(old->{
-                boolean exists = false;
-                if (financeList.stream().filter(f->f.getName().equals(old.getName())).findAny().isPresent()) {
-                    exists = true;
-                }
-                if (!exists) {
-                    readyForDelete.add(old.getId());
-                }
-            });
-            if (readyForDelete.size() > 0) {
-                financeService.removeByIds(readyForDelete);
-            }
+            //修改成每次上传都新增更新,不删除。 前端界面增加删除功能。
+//            List<Integer> readyForDelete = new ArrayList<>();
+//            oldFinanceList.forEach(old->{
+//                boolean exists = false;
+//                if (financeList.stream().filter(f->f.getName().equals(old.getName())).findAny().isPresent()) {
+//                    exists = true;
+//                }
+//                if (!exists) {
+//                    readyForDelete.add(old.getId());
+//                }
+//            });
+//            if (readyForDelete.size() > 0) {
+//                financeService.removeByIds(readyForDelete);
+//            }
             //如果有必要,更新该月份的日报相关的成本
             //如果有必要,更新该月份的日报相关的成本
             if (syncHistoryReport) {
             if (syncHistoryReport) {
                 List<Report> reportList = reportMapper.selectSimpleTime(companyId, startStr, endStr);
                 List<Report> reportList = reportMapper.selectSimpleTime(companyId, startStr, endStr);
                 if (reportList.size() > 0) {
                 if (reportList.size() > 0) {
+                    List<Report> updateReportList = new ArrayList<>();
                     for (Report r : reportList) {
                     for (Report r : reportList) {
                         Optional<User> first = updateUserList.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
                         Optional<User> first = updateUserList.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
-                        if (!first.isPresent()) {
-                            String notFillUser = userMapper.selectById(r.getCreatorId()).getName();
-                            System.out.println("缺少[" + notFillUser + "]的薪资成本, 请修改数据重新上传");
-                            throw new UserNotFoundException("缺少[" + notFillUser + "]的薪资成本, 请修改数据重新上传");
+                        if (first.isPresent()) {
+                            BigDecimal hourCost = first.get().getCost();
+                            r.setCost(hourCost.multiply(new BigDecimal(r.getWorkingTime())));
+                            r.setCreatorId(null);
+                            r.setWorkingTime(null);
+                            updateReportList.add(r);
                         }
                         }
-                        BigDecimal hourCost = first.get().getCost();
-                        r.setCost(hourCost.multiply(new BigDecimal(r.getWorkingTime())));
-                        r.setCreatorId(null);
-                        r.setWorkingTime(null);
                     }
                     }
                     //批量更新日报的成本
                     //批量更新日报的成本
-                    reportService.updateBatchById(reportList);
+                    if (updateReportList.size() > 0) {
+                        reportService.updateBatchById(updateReportList);
+                    }
                 }
                 }
             }
             }
 
 

+ 15 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -783,6 +783,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     List<Map<String, Object>> membList = projectMapper.getProjectCost(companyId,startDate, endDate, curProjectId, userId);
                     List<Map<String, Object>> membList = projectMapper.getProjectCost(companyId,startDate, endDate, curProjectId, userId);
                     map.put("membList", membList);
                     map.put("membList", membList);
                     for (Map<String, Object> membMap : membList) {
                     for (Map<String, Object> membMap : membList) {
+                        double pTotalTime = 0;
+                        BigDecimal pTotalMoney = new BigDecimal(0);
                         List<String> membRowData = new ArrayList<String>();
                         List<String> membRowData = new ArrayList<String>();
                         if (projectSum == null || projectSum == false) {
                         if (projectSum == null || projectSum == false) {
                             membRowData.add((String)map.get("projectCode"));
                             membRowData.add((String)map.get("projectCode"));
@@ -812,7 +814,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 sumRow.add(totalMoneyCost.toString());
                 sumRow.add(totalMoneyCost.toString());
                 allList.add(sumRow);
                 allList.add(sumRow);
             }else{
             }else{
-                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active", 1));
+                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
                 List<Object> projectNames = list.stream().map(mp -> mp.get("project")).collect(Collectors.toList());
                 List<Object> projectNames = list.stream().map(mp -> mp.get("project")).collect(Collectors.toList());
                 List<Object> projectIds = list.stream().map(mp -> mp.get("id")).collect(Collectors.toList());
                 List<Object> projectIds = list.stream().map(mp -> mp.get("id")).collect(Collectors.toList());
                 List<String> headList = new ArrayList<String>();
                 List<String> headList = new ArrayList<String>();
@@ -826,7 +828,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 allList=new ArrayList<>();
                 allList=new ArrayList<>();
                 allList.add(headList);
                 allList.add(headList);
                 //统计当前所有项目所有人的时间成本投入
                 //统计当前所有项目所有人的时间成本投入
-                List<Map<String, Object>> membList = projectMapper.getProjectCostGroupByProject(companyId,startDate, endDate, projectId);
+                List<Map<String, Object>> membList = projectMapper.getProjectCostGroupByProject(companyId,startDate, endDate, projectId,userId);
                 for (User user : userList) {
                 for (User user : userList) {
                     BigDecimal moneyCost = BigDecimal.valueOf(0);
                     BigDecimal moneyCost = BigDecimal.valueOf(0);
                     double costTime = 0;
                     double costTime = 0;
@@ -839,7 +841,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             membRowData.add(String.valueOf(resultList.get(0).get("cost")));
                             membRowData.add(String.valueOf(resultList.get(0).get("cost")));
                             membRowData.add(String.valueOf(resultList.get(0).get("costMoney")));
                             membRowData.add(String.valueOf(resultList.get(0).get("costMoney")));
                             costTime += (Double)resultList.get(0).get("cost");
                             costTime += (Double)resultList.get(0).get("cost");
-                            moneyCost = totalMoneyCost.add((BigDecimal)resultList.get(0).get("costMoney"));
+                            moneyCost = moneyCost.add((BigDecimal)resultList.get(0).get("costMoney"));
                         }else{
                         }else{
                             membRowData.add("");
                             membRowData.add("");
                             membRowData.add("");
                             membRowData.add("");
@@ -2971,7 +2973,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 sumRow.add(totalMoneyCost.toString());
                 sumRow.add(totalMoneyCost.toString());
                 allList.add(sumRow);
                 allList.add(sumRow);
             }else{
             }else{
-                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active", 1));
+                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
                 List<Object> projectCategoryNameS = list.stream().map(mp -> mp.get("categoryName")).collect(Collectors.toList());
                 List<Object> projectCategoryNameS = list.stream().map(mp -> mp.get("categoryName")).collect(Collectors.toList());
                 List<Object> projectCategorys = list.stream().map(mp -> mp.get("category")).collect(Collectors.toList());
                 List<Object> projectCategorys = list.stream().map(mp -> mp.get("category")).collect(Collectors.toList());
                 List<String> headList = new ArrayList<String>();
                 List<String> headList = new ArrayList<String>();
@@ -2980,12 +2982,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     headList.add(String.valueOf(pc)+"/工时");
                     headList.add(String.valueOf(pc)+"/工时");
                     headList.add(String.valueOf(pc)+"/成本");
                     headList.add(String.valueOf(pc)+"/成本");
                 });
                 });
+                headList.add("工时/合计");
+                headList.add("成本/合计");
                 allList=new ArrayList<>();
                 allList=new ArrayList<>();
                 allList.add(headList);
                 allList.add(headList);
                 //统计当前所有项目所有人的时间成本投入
                 //统计当前所有项目所有人的时间成本投入
                 List<Map<String, Object>> membList = projectMapper.getProjectCostGroupByCategory(companyId,startDate,endDate, projectCategoryId,userId);
                 List<Map<String, Object>> membList = projectMapper.getProjectCostGroupByCategory(companyId,startDate,endDate, projectCategoryId,userId);
                 for (User user : userList) {
                 for (User user : userList) {
-                    boolean flag=false;
+                    BigDecimal moneyCost = BigDecimal.valueOf(0);
+                    double costTime = 0;
                     List<Map<String, Object>> mapList = membList.stream().filter(mb -> mb.get("creatorId").equals(user.getId())).collect(Collectors.toList());
                     List<Map<String, Object>> mapList = membList.stream().filter(mb -> mb.get("creatorId").equals(user.getId())).collect(Collectors.toList());
                     List<String> membRowData=new ArrayList<>();
                     List<String> membRowData=new ArrayList<>();
                     membRowData.add(user.getName());
                     membRowData.add(user.getName());
@@ -2994,18 +2999,22 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         if(resultList.size()>0){
                         if(resultList.size()>0){
                             membRowData.add(String.valueOf(resultList.get(0).get("cost")));
                             membRowData.add(String.valueOf(resultList.get(0).get("cost")));
                             membRowData.add(String.valueOf(resultList.get(0).get("costMoney")));
                             membRowData.add(String.valueOf(resultList.get(0).get("costMoney")));
+                            costTime += (Double)resultList.get(0).get("cost");
+                            moneyCost = moneyCost.add((BigDecimal)resultList.get(0).get("costMoney"));
                         }else{
                         }else{
                             membRowData.add("");
                             membRowData.add("");
                             membRowData.add("");
                             membRowData.add("");
                         }
                         }
                     }
                     }
+                    membRowData.add(""+new BigDecimal(costTime).setScale(1, BigDecimal.ROUND_HALF_UP));
+                    membRowData.add(moneyCost.toString());
                     if(mapList.size()>0){
                     if(mapList.size()>0){
                         allList.add(membRowData);
                         allList.add(membRowData);
                     }
                     }
                 }
                 }
             }
             }
             //生成excel文件导出
             //生成excel文件导出
-            String fileName = "项目成本工时统计_"+System.currentTimeMillis();
+            String fileName = "项目分类工时成本统计_"+System.currentTimeMillis();
             String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
             String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
             httpRespMsg.data = resp;
             httpRespMsg.data = resp;
         } catch (NullPointerException e) {
         } catch (NullPointerException e) {

+ 67 - 29
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -207,9 +207,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     map.put("cost", total);
                     map.put("cost", total);
                     map.put("state", state);
                     map.put("state", state);
                 }
                 }
-
-                //部门经理需要看本部门的所有人员的日报
-                if (user.getManageDeptId() != null &&  user.getManageDeptId() > 0) {
+                boolean hasDeptWorktimePriv = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看本部门工时").size() > 0;
+                //需要看本部门的所有人员的日报
+                if (hasDeptWorktimePriv || (user.getManageDeptId() != null &&  user.getManageDeptId() > 0)) {
                     //找到该部门的所有子部门
                     //找到该部门的所有子部门
                     List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
                     List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
                     //查找当前部门经理负责的部门
                     //查找当前部门经理负责的部门
@@ -218,7 +218,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         queryDeptList = allDepts.stream().filter(dp->dp.getDepartmentId().equals(deptId)).collect(Collectors.toList());
                         queryDeptList = allDepts.stream().filter(dp->dp.getDepartmentId().equals(deptId)).collect(Collectors.toList());
                     } else {
                     } else {
                         queryDeptList = allDepts.stream().filter(
                         queryDeptList = allDepts.stream().filter(
-                                dp -> user.getId().equals(dp.getManagerId())).collect(Collectors.toList());
+                                dp -> user.getId().equals(dp.getManagerId()) || (hasDeptWorktimePriv && dp.getDepartmentId().equals(user.getDepartmentId()))).collect(Collectors.toList());
                     }
                     }
 
 
                     if (queryDeptList.size() > 0) {
                     if (queryDeptList.size() > 0) {
@@ -231,7 +231,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
 
                         List ids = deptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
                         List ids = deptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
                         nameList = reportMapper.getReportNameByDateAndDept(date,
                         nameList = reportMapper.getReportNameByDateAndDept(date,
-                                ids, null, null);
+                                ids, targetUid, null);
 
 
                         if (nameList.size() > 0) {
                         if (nameList.size() > 0) {
                             List<String> userIds = new ArrayList<>();
                             List<String> userIds = new ArrayList<>();
@@ -1012,7 +1012,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     } else {
                     } else {
                         Report report = reportMapper.selectById(ids.get(0));
                         Report report = reportMapper.selectById(ids.get(0));
                         //部门待审核,部门审核通过
                         //部门待审核,部门审核通过
-                        if (report.getDepartmentAuditState() == 0) {
+                        if (report.getDepartmentAuditState() == 0){
                             report = new Report();
                             report = new Report();
                             report.setDepartmentAuditState(1);
                             report.setDepartmentAuditState(1);
                             reportMapper.update(report, new QueryWrapper<Report>().in("id", ids));
                             reportMapper.update(report, new QueryWrapper<Report>().in("id", ids));
@@ -1154,7 +1154,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         }
                         }
                     }
                     }
                 }
                 }
-
+                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
+                List<Integer> collect = reportList.stream().map(rl -> rl.getProjectId()).distinct().collect(Collectors.toList());
+                List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", collect));
+                String pNames = projectList.stream().map(Project::getProjectName).collect(Collectors.joining(", ", "[", "]"));
                 //对导入审核,添加记录
                 //对导入审核,添加记录
                 int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
                 int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
                 ReportAuditLog log = new ReportAuditLog();
                 ReportAuditLog log = new ReportAuditLog();
@@ -1163,6 +1166,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 log.setResult("通过");
                 log.setResult("通过");
                 log.setUserId(user.getId());
                 log.setUserId(user.getId());
                 log.setUserName(user.getName());
                 log.setUserName(user.getName());
+                log.setProjectName(pNames);
                 reportAuditLogMapper.insert(log);
                 reportAuditLogMapper.insert(log);
                 //员工的日期
                 //员工的日期
                 ReportAlogMembdate membdate = new ReportAlogMembdate();
                 ReportAlogMembdate membdate = new ReportAlogMembdate();
@@ -1370,7 +1374,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             }
 
 
             informationMapper.insert(new Information().setType(0).setContent(date).setUserId(fillUserId).setMsg(str));
             informationMapper.insert(new Information().setType(0).setContent(date).setUserId(fillUserId).setMsg(str));
-
             //对导入审核,添加记录
             //对导入审核,添加记录
             int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
             int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
             ReportAuditLog log = new ReportAuditLog();
             ReportAuditLog log = new ReportAuditLog();
@@ -1379,6 +1382,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             log.setResult("驳回"+(StringUtils.isEmpty(reason)?"":"("+reason+")"));
             log.setResult("驳回"+(StringUtils.isEmpty(reason)?"":"("+reason+")"));
             log.setUserId(user.getId());
             log.setUserId(user.getId());
             log.setUserName(user.getName());
             log.setUserName(user.getName());
+            log.setProjectName(pNames);
             reportAuditLogMapper.insert(log);
             reportAuditLogMapper.insert(log);
             //员工的日期
             //员工的日期
             ReportAlogMembdate membdate = new ReportAlogMembdate();
             ReportAlogMembdate membdate = new ReportAlogMembdate();
@@ -1475,6 +1479,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         HttpRespMsg departmentList = departmentService.getDepartmentList(request);
         HttpRespMsg departmentList = departmentService.getDepartmentList(request);
         List<DepartmentVO> list = (List<DepartmentVO>) departmentList.data;
         List<DepartmentVO> list = (List<DepartmentVO>) departmentList.data;
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(curUser.getRoleId(), "查看全公司工时");
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(curUser.getRoleId(), "查看全公司工时");
+        boolean hasDeptWorktimePriv = sysFunctionMapper.getRoleFunctions(curUser.getRoleId(), "查看本部门工时").size() > 0;
         if (functionList.size() > 0) {
         if (functionList.size() > 0) {
             //查看全部的
             //查看全部的
             //加上未分配的部门
             //加上未分配的部门
@@ -1482,9 +1487,20 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             unAssignedDept.setId(0);
             unAssignedDept.setId(0);
             unAssignedDept.setLabel("未分配");
             unAssignedDept.setLabel("未分配");
             list.add(unAssignedDept);
             list.add(unAssignedDept);
-        } else if (manageDeptId != null && manageDeptId > 0) {
+        } else if (hasDeptWorktimePriv || (manageDeptId != null && manageDeptId > 0)) {
             //指定查看某个部门下的,一个人可能负责多个部门
             //指定查看某个部门下的,一个人可能负责多个部门
             List<Department> allMDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", token));
             List<Department> allMDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", token));
+            if (hasDeptWorktimePriv && curUser.getDepartmentId() != null) {
+                Department ownerDept = departmentMapper.selectById(curUser.getDepartmentId());
+                //要加上自己的部门,如果没有的话
+                if (!allMDeptList.stream().anyMatch(d->d.getDepartmentId().equals(ownerDept.getDepartmentId()))) {
+                    allMDeptList.add(ownerDept);
+                }
+                if (manageDeptId == null || manageDeptId == 0) {
+                    manageDeptId = curUser.getDepartmentId();
+                }
+            }
+
             if (allMDeptList.size() == 1) {
             if (allMDeptList.size() == 1) {
                 list = getSpecifiedDept(list, manageDeptId);
                 list = getSpecifiedDept(list, manageDeptId);
             } else {
             } else {
@@ -1510,6 +1526,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             
             
             if (first.isPresent()) {
             if (first.isPresent()) {
                 user.put("state", first.get().get("state"));
                 user.put("state", first.get().get("state"));
+                user.put("workingTime", first.get().get("workingTime"));
             }
             }
             userMapList.add(user);
             userMapList.add(user);
         }
         }
@@ -1659,9 +1676,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                     System.out.println("没有其他等待的项目了,继续更新到下个流程");
                                     System.out.println("没有其他等待的项目了,继续更新到下个流程");
                                     //没有其他待审核的项目了,流程往下走
                                     //没有其他待审核的项目了,流程往下走
                                     Report upR = new Report();
                                     Report upR = new Report();
-                                    for (int m=0;m<settings.size(); m++) {
-                                        if (settings.get(m).getIsDeptAudit()== 0) {//找到项目审核的那个节点
-                                            AuditWorkflowTimeSetting nextNode = settings.get(m + 1);
+                                    for (int m=0;m<deptSettings.size(); m++) {
+                                        if (deptSettings.get(m).getIsDeptAudit()== 0) {//找到项目审核的那个节点
+                                            AuditWorkflowTimeSetting nextNode = deptSettings.get(m + 1);
                                             curReport.setIsDeptAudit(nextNode.getIsDeptAudit());
                                             curReport.setIsDeptAudit(nextNode.getIsDeptAudit());
                                             if (curReport.getIsDeptAudit() == 1) {
                                             if (curReport.getIsDeptAudit() == 1) {
                                                 curReport.setAuditDeptid(nextNode.getAuditDeptId());
                                                 curReport.setAuditDeptid(nextNode.getAuditDeptId());
@@ -1669,7 +1686,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                                         .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
                                                         .filter(ad->ad.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId());
                                             }
                                             }
                                             curReport.setIsFinalAudit(nextNode.getIsFinal());
                                             curReport.setIsFinalAudit(nextNode.getIsFinal());
-                                            System.out.println("设置下个流程节点:部门审核=" + nextNode.getIsDeptAudit());
                                             upR = curReport;
                                             upR = curReport;
                                             break;
                                             break;
                                         }
                                         }
@@ -1705,7 +1721,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     reportService.updateBatchById(updateReportList);
                     reportService.updateBatchById(updateReportList);
                 }
                 }
             }
             }
-
+            List<Integer> collect = allReports.stream().map(ar -> ar.getProjectId()).distinct().collect(Collectors.toList());
+            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", collect));
+            List<String> stringList = projectList.stream().map(pl -> pl.getProjectName()).distinct().collect(Collectors.toList());
+            String s = org.apache.commons.lang3.StringUtils.join(stringList, ",");
             int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
             int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
             //需要进行审核记录保存
             //需要进行审核记录保存
             ReportAuditLog log = new ReportAuditLog();
             ReportAuditLog log = new ReportAuditLog();
@@ -1714,6 +1733,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             log.setResult("批量通过");
             log.setResult("批量通过");
             log.setUserId(user.getId());
             log.setUserId(user.getId());
             log.setUserName(user.getName());
             log.setUserName(user.getName());
+            log.setProjectName(s);
             reportAuditLogMapper.insert(log);
             reportAuditLogMapper.insert(log);
             //当前所有员工的日期
             //当前所有员工的日期
             List<ReportAlogMembdate> membList = new ArrayList<>();
             List<ReportAlogMembdate> membList = new ArrayList<>();
@@ -1783,7 +1803,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         item.setAuditState(2);
                         item.setAuditState(2);
                         reportProfessionProgressService.update(item, new QueryWrapper<ReportProfessionProgress>().in("report_id", ids).in("profession_id", collect));
                         reportProfessionProgressService.update(item, new QueryWrapper<ReportProfessionProgress>().in("report_id", ids).in("profession_id", collect));
                     }
                     }
-
                 } else {
                 } else {
                     Report report = reportMapper.selectById(ids.get(0));
                     Report report = reportMapper.selectById(ids.get(0));
                     //部门待审核,部门审核驳回
                     //部门待审核,部门审核驳回
@@ -1799,12 +1818,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         int oldState = oneReport.getState();
         int oldState = oneReport.getState();
         int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
         int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
         //需要进行审核记录保存
         //需要进行审核记录保存
+        List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
+        List<Integer> collect = reportList.stream().map(rl -> rl.getProjectId()).distinct().collect(Collectors.toList());
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", collect));
+        List<String> stringList = projectList.stream().map(pl -> pl.getProjectName()).distinct().collect(Collectors.toList());
+        String s = org.apache.commons.lang3.StringUtils.join(stringList, ",");
         ReportAuditLog log = new ReportAuditLog();
         ReportAuditLog log = new ReportAuditLog();
         log.setAuditChannel(channel);//导入审核
         log.setAuditChannel(channel);//导入审核
         log.setCompanyId(company.getId());
         log.setCompanyId(company.getId());
         log.setResult("批量驳回");
         log.setResult("批量驳回");
         log.setUserId(user.getId());
         log.setUserId(user.getId());
         log.setUserName(user.getName());
         log.setUserName(user.getName());
+        log.setProjectName(s);
         reportAuditLogMapper.insert(log);
         reportAuditLogMapper.insert(log);
         List<Report> allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
         List<Report> allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
         List<User> allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
         List<User> allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
@@ -2073,10 +2098,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         //分角色权限:管理员看全部的,部门负责人看自己部门的,个人只能看自己的。
         //分角色权限:管理员看全部的,部门负责人看自己部门的,个人只能看自己的。
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
         if (functionList.size() == 0) {
         if (functionList.size() == 0) {
+            boolean hasDeptWorktimePriv = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看本部门工时").size() > 0;
             //检查是不是部门负责人
             //检查是不是部门负责人
-            if (user.getManageDeptId() != null && user.getManageDeptId() != 0) {
+            if (hasDeptWorktimePriv || (user.getManageDeptId() != null && user.getManageDeptId() != 0)) {
                 List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
                 List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
-                List<Department> myDeptList = allDepts.stream().filter(d->user.getId().equals(d.getManagerId())).collect(Collectors.toList());
+                List<Department> myDeptList = allDepts.stream().filter(d->user.getId().equals(d.getManagerId()) || (hasDeptWorktimePriv && d.getDepartmentId().equals(user.getDepartmentId()))).collect(Collectors.toList());
                 List<Department> subDepts = new ArrayList<>();
                 List<Department> subDepts = new ArrayList<>();
                 for (Department dp : myDeptList) {
                 for (Department dp : myDeptList) {
                     subDepts.addAll(getSubDepts(dp, allDepts));
                     subDepts.addAll(getSubDepts(dp, allDepts));
@@ -2585,7 +2611,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
 
     //导出报告
     //导出报告
     @Override
     @Override
-    public HttpRespMsg exportReport(@RequestParam String startDate, @RequestParam String endDate, Integer projectId,Integer stateKey, HttpServletRequest request) {
+    public HttpRespMsg exportReport(@RequestParam String startDate, @RequestParam String endDate, Integer projectId,Integer stateKey,Integer departmentId, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
         try {
             String userId = request.getHeader("Token");
             String userId = request.getHeader("Token");
@@ -2626,6 +2652,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if (timeType.getCustomTextActive() == 1) {
             if (timeType.getCustomTextActive() == 1) {
                 titles.add(timeType.getCustomTextName());
                 titles.add(timeType.getCustomTextName());
             }
             }
+            //项目管理专业版,需要显示任务分组和投入阶段
+            if (company.getPackageProject() == 1) {
+                titles.add("任务分组");
+                titles.add("投入阶段");
+            }
             if (timeType.getShowFillauditTime() == 1) {
             if (timeType.getShowFillauditTime() == 1) {
                 titles.add("填写时间");
                 titles.add("填写时间");
                 titles.add("审核人");
                 titles.add("审核人");
@@ -2682,28 +2713,30 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             int rowNum = 1;
             int rowNum = 1;
             List<HashMap<String, Object>> allReportByDate = null;
             List<HashMap<String, Object>> allReportByDate = null;
             List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
             List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
+            boolean hasDeptWorktimePriv = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看本部门工时").size() > 0;
+
             if (functionList.size() == 0) {
             if (functionList.size() == 0) {
                 //检查是否是部门负责人
                 //检查是否是部门负责人
-                if (user.getManageDeptId() > 0) {
+                if (hasDeptWorktimePriv || (user.getManageDeptId() != null && user.getManageDeptId() > 0)) {
                     List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
                     List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
-                    List<Department> deptList = allDeptList.stream().filter(dept->user.getId().equals(dept.getManagerId())).collect(Collectors.toList());
+                    List<Department> deptList = allDeptList.stream().filter(dept->user.getId().equals(dept.getManagerId())|| (hasDeptWorktimePriv && dept.getDepartmentId().equals(user.getDepartmentId()))).collect(Collectors.toList());
                     List<Department> allSubDepts = new ArrayList<>();
                     List<Department> allSubDepts = new ArrayList<>();
                     allSubDepts.addAll(deptList);
                     allSubDepts.addAll(deptList);
                     for (Department dept: deptList) {
                     for (Department dept: deptList) {
                         allSubDepts.addAll(getSubDepts(dept, allDeptList));
                         allSubDepts.addAll(getSubDepts(dept, allDeptList));
                     }
                     }
                     List<Integer> collect = allSubDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList());
                     List<Integer> collect = allSubDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList());
-                    allReportByDate = reportMapper.getDeptMembReportByDate(startDate, null, collect, endDate, projectId,stateKey);
+                    allReportByDate = reportMapper.getDeptMembReportByDate(startDate, null, collect, endDate, projectId,stateKey,departmentId);
                 }
                 }
 
 
                 List<HashMap<String, Object>> reportsFromProjects = null;
                 List<HashMap<String, Object>> reportsFromProjects = null;
                 //检查是否是项目负责人
                 //检查是否是项目负责人
                 int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", user.getId()));
                 int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", user.getId()));
                 if (cnt > 0) {
                 if (cnt > 0) {
-                    reportsFromProjects = reportMapper.getProjectMembReportByDate(startDate, null, user.getId(), endDate, projectId,stateKey);
+                    reportsFromProjects = reportMapper.getProjectMembReportByDate(startDate, null, user.getId(), endDate, projectId,stateKey,departmentId);
                 } else {
                 } else {
                     //普通员工只能看自己的
                     //普通员工只能看自己的
-                    reportsFromProjects = reportMapper.getAllReportByDate(startDate, null, user.getId(), endDate, projectId,stateKey);
+                    reportsFromProjects = reportMapper.getAllReportByDate(startDate, null, user.getId(), endDate, projectId,stateKey,departmentId);
                 }
                 }
                 if (allReportByDate == null) {
                 if (allReportByDate == null) {
                     allReportByDate = reportsFromProjects;
                     allReportByDate = reportsFromProjects;
@@ -2723,7 +2756,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 //            }
 //            }
             else {
             else {
                 //看公司所有人的
                 //看公司所有人的
-                allReportByDate = reportMapper.getAllReportByDate(startDate, user.getCompanyId(), null, endDate, projectId,stateKey);
+                allReportByDate = reportMapper.getAllReportByDate(startDate, user.getCompanyId(), null, endDate, projectId,stateKey,departmentId);
             }
             }
             if (timeType.getMultiWorktime() == 1) {
             if (timeType.getMultiWorktime() == 1) {
                 java.text.DecimalFormat df = new java.text.DecimalFormat("#0.00");
                 java.text.DecimalFormat df = new java.text.DecimalFormat("#0.00");
@@ -2821,6 +2854,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     row.createCell(index).setCellValue(map.get("customText") != null?map.get("customText").toString():"");
                     row.createCell(index).setCellValue(map.get("customText") != null?map.get("customText").toString():"");
                     index++;
                     index++;
                 }
                 }
+                //项目管理专业版,需要显示任务分组和投入阶段
+                if (company.getPackageProject() == 1) {
+                    row.createCell(index).setCellValue(map.get("groupName") != null? map.get("groupName").toString():"");
+                    index++;
+                    row.createCell(index).setCellValue(map.get("stage") != null?map.get("stage").toString():"");
+                    index++;
+                }
                 if (timeType.getShowFillauditTime() == 1) {
                 if (timeType.getShowFillauditTime() == 1) {
                     row.createCell(index).setCellValue(sdf.format((Date)map.get("time")));
                     row.createCell(index).setCellValue(sdf.format((Date)map.get("time")));
                     index++;
                     index++;
@@ -2833,9 +2873,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                     }
 
 
                     index++;
                     index++;
-//                    titles.add("填写时间");
-//                    titles.add("审核人");
-//                    titles.add("审核时间");
                 }
                 }
                 row.createCell(index).setCellValue((String) map.get("content"));
                 row.createCell(index).setCellValue((String) map.get("content"));
                 index++;
                 index++;
@@ -3040,11 +3077,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         List<Map<String, Object>> list = null;
         List<Map<String, Object>> list = null;
         //分角色权限:管理员看全部的,部门负责人看自己部门的,个人只能看自己的。
         //分角色权限:管理员看全部的,部门负责人看自己部门的,个人只能看自己的。
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
+        boolean hasDeptWorktimePriv = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看本部门工时").size() > 0;
         if (functionList.size() == 0) {
         if (functionList.size() == 0) {
             //检查是不是部门负责人
             //检查是不是部门负责人
-            if (user.getManageDeptId() != null && user.getManageDeptId() != 0) {
+            if (hasDeptWorktimePriv || (user.getManageDeptId() != null && user.getManageDeptId() != 0)) {
                 List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
                 List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
-                List<Department> myDeptList = allDepts.stream().filter(d->user.getId().equals(d.getManagerId())).collect(Collectors.toList());
+                List<Department> myDeptList = allDepts.stream().filter(d->user.getId().equals(d.getManagerId())|| (hasDeptWorktimePriv && d.getDepartmentId().equals(user.getDepartmentId()))).collect(Collectors.toList());
                 List<Department> subDepts = new ArrayList<>();
                 List<Department> subDepts = new ArrayList<>();
                 for (Department dp : myDeptList) {
                 for (Department dp : myDeptList) {
                     subDepts.addAll(getSubDepts(dp, allDepts));
                     subDepts.addAll(getSubDepts(dp, allDepts));

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.SubUserCustom;
+import com.management.platform.mapper.SubUserCustomMapper;
+import com.management.platform.service.SubUserCustomService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-06-13
+ */
+@Service
+public class SubUserCustomServiceImpl extends ServiceImpl<SubUserCustomMapper, SubUserCustom> implements SubUserCustomService {
+
+}

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.UserCustom;
+import com.management.platform.mapper.UserCustomMapper;
+import com.management.platform.service.UserCustomService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-06-13
+ */
+@Service
+public class UserCustomServiceImpl extends ServiceImpl<UserCustomMapper, UserCustom> implements UserCustomService {
+
+}

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

@@ -129,6 +129,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private CompanyDingdingService companyDingdingService;
     private CompanyDingdingService companyDingdingService;
     @Resource
     @Resource
     private WxCorpInfoService wxCorpInfoService;
     private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private UserCustomMapper userCustomMapper;
     //登录网页端
     //登录网页端
     @Override
     @Override
     public HttpRespMsg loginAdmin(String username, String password) {
     public HttpRespMsg loginAdmin(String username, String password) {
@@ -423,6 +425,32 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     li.put("cost", 0.0);
                     li.put("cost", 0.0);
                 });
                 });
             }
             }
+            List<UserCustom> userCustomList = userCustomMapper.selectList(new QueryWrapper<UserCustom>().eq("company_id", companyId));
+            if(!StringUtils.isEmpty(list)){
+                for(Map<String,Object> u:list) {
+                    HashMap map=new HashMap();
+                    for (int i = 0; i < userCustomList.size(); i++) {
+                        switch (i) {
+                            case 0:
+                                map.put(userCustomList.get(i).getName(), u.get("plate1"));
+                                break;
+                            case 1:
+                                map.put(userCustomList.get(i).getName(), u.get("plate2"));
+                                break;
+                            case 2:
+                                map.put(userCustomList.get(i).getName(), u.get("plate3"));
+                                break;
+                            case 3:
+                                map.put(userCustomList.get(i).getName(), u.get("plate4"));
+                                break;
+                            case 4:
+                                map.put(userCustomList.get(i).getName(), u.get("plate5"));
+                                break;
+                        }
+                    }
+                    u.put("plateMap",map);
+                }
+            }
             resultMap.put("records", list);
             resultMap.put("records", list);
             resultMap.put("total", total);
             resultMap.put("total", total);
             httpRespMsg.data = resultMap;
             httpRespMsg.data = resultMap;
@@ -591,7 +619,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     //新增或修改用户
     //新增或修改用户
     @Override
     @Override
     public HttpRespMsg insertUser(String targetId, String name, String phone, Integer roleId, Double monthCost, Double cost,
     public HttpRespMsg insertUser(String targetId, String name, String phone, Integer roleId, Double monthCost, Double cost,
-                                  Integer departmentId, Integer salaryType, String costApplyDate, String position, String certJson, HttpServletRequest request,String inductionDate) {
+                                  Integer departmentId, Integer salaryType, String costApplyDate, String position, String certJson, HttpServletRequest request,String inductionDate,
+                                  String superiorId,   String plate1,String plate2,String plate3,String plate4,String plate5) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         try {
         try {
@@ -629,7 +658,13 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                                 .setDepartmentId(departmentId == null ? 0 : departmentId)
                                 .setDepartmentId(departmentId == null ? 0 : departmentId)
                                 .setDepartmentCascade(departmentId == null ?
                                 .setDepartmentCascade(departmentId == null ?
                                         convertDepartmentIdToCascade(0) :
                                         convertDepartmentIdToCascade(0) :
-                                        convertDepartmentIdToCascade(departmentId));
+                                        convertDepartmentIdToCascade(departmentId))
+                                .setSuperiorId(superiorId)
+                                .setPlate1(plate1)
+                                .setPlate2(plate2)
+                                .setPlate3(plate3)
+                                .setPlate4(plate4)
+                                .setPlate5(plate5);
                         if(inductionDate!=null&&inductionDate!=""){
                         if(inductionDate!=null&&inductionDate!=""){
                             user.setInductionDate(LocalDate.parse(inductionDate,dtf));
                             user.setInductionDate(LocalDate.parse(inductionDate,dtf));
                         }
                         }
@@ -682,7 +717,13 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         .setDepartmentId(departmentId == null ? 0 : departmentId)
                         .setDepartmentId(departmentId == null ? 0 : departmentId)
                         .setDepartmentCascade(departmentId == null ?
                         .setDepartmentCascade(departmentId == null ?
                                 convertDepartmentIdToCascade(0) :
                                 convertDepartmentIdToCascade(0) :
-                                convertDepartmentIdToCascade(departmentId)));
+                                convertDepartmentIdToCascade(departmentId))
+                        .setSuperiorId(superiorId)
+                        .setPlate1(plate1)
+                        .setPlate2(plate2)
+                        .setPlate3(plate3)
+                        .setPlate4(plate4)
+                        .setPlate5(plate5));
                 if (salaryChange) {
                 if (salaryChange) {
                     UserSalary userSalary = UserSalary.copyFromUser(oldUser);
                     UserSalary userSalary = UserSalary.copyFromUser(oldUser);
                     userSalaryMapper.insert(userSalary);
                     userSalaryMapper.insert(userSalary);

+ 30 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-dev.yml

@@ -9,13 +9,13 @@ spring:
     multipart:
     multipart:
       # 配置上传文件的大小设置
       # 配置上传文件的大小设置
       # Single file max size  即单个文件大小
       # Single file max size  即单个文件大小
-      max-file-size: 10000MB
-      max-request-size: 10000MB
+      max-file-size: 100MB
+      max-request-size: 100MB
   datasource:
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://118.190.47.230:3306/man2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
+    url: jdbc:mysql://127.0.0.1:3306/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
     username: root
     username: root
-    password: p011430seya1026
+    password: HuoshiDB@2022
     hikari:
     hikari:
       maximum-pool-size: 10
       maximum-pool-size: 10
       minimum-idle: 3
       minimum-idle: 3
@@ -24,8 +24,8 @@ spring:
     #######redis配置######
     #######redis配置######
     # redis
     # redis
     redis:
     redis:
-      host: 118.190.47.230
-      port: 6379
+      host: 127.0.0.1
+      port: 6479
       timeout: 3
       timeout: 3
       # password:
       # password:
       pool:
       pool:
@@ -48,11 +48,11 @@ spring:
 logging:
 logging:
   level:
   level:
     root: info
     root: info
-    org.mybatis: debug
-    java.sql: debug
-    org.springframework.web: trace
+    org.mybatis: error
+    java.sql: error
+    org.springframework.web: error
     #打印sql语句
     #打印sql语句
-    com.management.platform.mapper: debug
+    com.management.platform.mapper: error
   path: /log/
   path: /log/
   file: worktime.log
   file: worktime.log
 ##########
 ##########
@@ -80,9 +80,26 @@ mybatis:
   mapper-locations: mappers/*Mapper.xml
   mapper-locations: mappers/*Mapper.xml
 #####配置图片上传路径####
 #####配置图片上传路径####
 upload:
 upload:
-  path: /www/worktime/client/timesheet/upload/
+  path: /www/staticproject/timesheet/upload/
+
+
+
 
 
-configEnv:
-  isDev: true
 
 
+##actuator健康检查配置
+management:
+  security:
+    enabled:false:
+  server:
+    port: 10011
+  #  endpoints:
+  #    web:
+  #      exposure:
+  #        include: "*"
 
 
+  health:
+    redis:
+      enabled: false
+
+configEnv:
+  isDev: true

+ 106 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-mld.yml

@@ -0,0 +1,106 @@
+# 重庆美莱德服务器配置
+server:
+  port: 10010
+  tomcat:
+    uri-encoding: utf-8
+    max-http-form-post-size: -1
+    connection-timeout: 18000000s
+spring:
+  servlet:
+    multipart:
+      # 配置上传文件的大小设置
+      # Single file max size  即单个文件大小
+      max-file-size: 100MB
+      max-request-size: 100MB
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://10.1.10.33:3306/man_mld?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
+    username: root
+    password: Mld2022@#
+    hikari:
+      maximum-pool-size: 10
+      minimum-idle: 3
+      max-lifetime: 30000
+      connection-test-query: SELECT 1
+    #######redis配置######
+    # redis
+    redis:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 3
+      # password:
+      pool:
+        minIdle: 1
+        maxIdle: 10
+        maxWait: 3
+        maxActive: 8
+    ####全局配置时间返回格式#####
+  jackson:
+    #参数意义:
+    #JsonInclude.Include.ALWAYS       默认
+    #JsonInclude.Include.NON_DEFAULT   属性为默认值不序列化
+    #JsonInclude.Include.NON_EMPTY     属性为 空(””) 或者为 NULL 都不序列化
+    #JsonInclude.Include.NON_NULL      属性为NULL  不序列化
+    default-property-inclusion: ALWAYS
+    time-zone: GMT+8
+    date-format: yyyy-MM-dd HH:mm:ss
+
+##########日志配置
+logging:
+  level:
+    root: info
+    org.mybatis: error
+    java.sql: error
+    org.springframework.web: error
+    #打印sql语句
+    com.management.platform.mapper: error
+  path: /log/
+  file: worktime.log
+##########
+mybatis-plus:
+  #  mapper-locations: classpath:mapper/*/*.xml
+  #  #实体扫描,多个package用逗号或者分号分隔
+  #  typeAliasesPackage: com.hssx.cloudmodel
+  global-config:
+    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
+    id-type: 0
+    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
+    field-strategy: 2
+    db-column-underline: true
+    refresh-mapper:
+    #################插入和更新非null判断
+    db-config:
+      insert-strategy: not_null
+      update-strategy: not_null
+  configuration:
+    map-underscore-to-camel-case: true
+    cache-enabled: false
+######mybstis配置#######
+mybatis:
+  type-aliases-package: com.management.platform.entity
+  mapper-locations: mappers/*Mapper.xml
+#####配置图片上传路径####
+upload:
+  path: /www/staticproject/timesheet/upload/
+
+
+
+
+
+##actuator健康检查配置
+management:
+  security:
+    enabled:false:
+  server:
+    port: 10011
+  #  endpoints:
+  #    web:
+  #      exposure:
+  #        include: "*"
+
+  health:
+    redis:
+      enabled: false
+
+configEnv:
+  isDev: false

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

@@ -58,7 +58,7 @@
         <if test="startDate != null and endDate != null">
         <if test="startDate != null and endDate != null">
             AND b.create_date between #{startDate} and #{endDate}
             AND b.create_date between #{startDate} and #{endDate}
         </if>
         </if>
-        GROUP BY b.project_id, a.id
+        GROUP BY b.project_id, a.id order by a.department_id
     </select>
     </select>
 
 
     <!-- 根据人员获取自定义的日报数值 -->
     <!-- 根据人员获取自定义的日报数值 -->

+ 7 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -245,7 +245,7 @@
 
 
     <!--获取个人每个项目分别需要的工时-->
     <!--获取个人每个项目分别需要的工时-->
     <select id="getProjectCostGroupByProject" resultType="java.util.Map">
     <select id="getProjectCostGroupByProject" resultType="java.util.Map">
-        SELECT b.id as creatorId,a.creator_id as creatorId,a.project_id as projectId, b.name,a.dept_id as deptId, IFNULL(department.department_name, '未分配') as departmentName, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
+        SELECT b.id as creatorId,a.project_id as projectId, b.name,a.dept_id as deptId, IFNULL(department.department_name, '未分配') as departmentName, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
         FROM report AS a
         FROM report AS a
         JOIN user AS b ON a.creator_id = b.id
         JOIN user AS b ON a.creator_id = b.id
         left join department on department.department_id = a.dept_id
         left join department on department.department_id = a.dept_id
@@ -256,14 +256,17 @@
         <if test="startDate != null and endDate != null">
         <if test="startDate != null and endDate != null">
             AND a.create_date between #{startDate} and #{endDate}
             AND a.create_date between #{startDate} and #{endDate}
         </if>
         </if>
-        GROUP BY b.id, a.dept_id,a.project_id
+        <if test="userId != null">
+            AND a.creator_id = #{userId}
+        </if>
+        GROUP BY b.id,a.project_id
         ORDER BY b.id ASC, a.dept_id ASC
         ORDER BY b.id ASC, a.dept_id ASC
     </select>
     </select>
 
 
 
 
     <!--获取个人每个项目分类分别需要的工时-->
     <!--获取个人每个项目分类分别需要的工时-->
     <select id="getProjectCostGroupByCategory" resultType="java.util.Map">
     <select id="getProjectCostGroupByCategory" resultType="java.util.Map">
-        SELECT b.id as creatorId,a.creator_id as creatorId,ifnull(c.category_name,'未分类') as categoryName,ifnull(c.category,0) as category, b.name,a.dept_id as deptId, IFNULL(department.department_name, '未分配') as departmentName, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
+        SELECT a.creator_id as creatorId,ifnull(c.category_name,'未分类') as categoryName,ifnull(c.category,0) as category, b.name,a.dept_id as deptId, IFNULL(department.department_name, '未分配') as departmentName, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
         FROM report AS a
         FROM report AS a
         JOIN user AS b ON a.creator_id = b.id
         JOIN user AS b ON a.creator_id = b.id
         left join department on department.department_id = a.dept_id
         left join department on department.department_id = a.dept_id
@@ -278,7 +281,7 @@
         <if test="userId != null">
         <if test="userId != null">
             AND a.creator_id = #{userId}
             AND a.creator_id = #{userId}
         </if>
         </if>
-        GROUP BY b.id, a.dept_id,c.category
+        GROUP BY b.id,c.category
         ORDER BY b.id ASC, a.dept_id ASC
         ORDER BY b.id ASC, a.dept_id ASC
     </select>
     </select>
 
 

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

@@ -30,7 +30,7 @@
     </sql>
     </sql>
 
 
     <select id="customSelect" resultMap="RichMap">
     <select id="customSelect" resultMap="RichMap">
-        SELECT project_requirement.id, project.id AS project_id, project.`project_name`, project.`project_code`, project_requirement.`memb_req`, project_requirement.`task_req`,project_requirement.start_date,project_requirement.end_date,
+        SELECT project_requirement.id, project.id AS project_id, project.`project_name`, project.`project_code`, project_requirement.`memb_req`, project_requirement.`task_req`,project_requirement.contract_req,project_requirement.department_speed,project_requirement.start_date,project_requirement.end_date,
         (SELECT GROUP_CONCAT(DISTINCT user.`name`) FROM report LEFT JOIN `user` ON user.`id` = report.`creator_id` WHERE report.company_id=#{companyId} AND report.create_time >= #{startDate} AND report.`project_id` = project.id) AS active_users
         (SELECT GROUP_CONCAT(DISTINCT user.`name`) FROM report LEFT JOIN `user` ON user.`id` = report.`creator_id` WHERE report.company_id=#{companyId} AND report.create_time >= #{startDate} AND report.`project_id` = project.id) AS active_users
         FROM project LEFT JOIN project_requirement ON project.id = project_requirement.`project_id`
         FROM project LEFT JOIN project_requirement ON project.id = project_requirement.`project_id`
         WHERE project.`company_id` = #{companyId}
         WHERE project.`company_id` = #{companyId}

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

@@ -11,11 +11,12 @@
         <result column="company_id" property="companyId" />
         <result column="company_id" property="companyId" />
         <result column="result" property="result" />
         <result column="result" property="result" />
         <result column="audit_channel" property="auditChannel" />
         <result column="audit_channel" property="auditChannel" />
+        <result column="project_name" property="projectName" />
     </resultMap>
     </resultMap>
 
 
     <!-- 通用查询结果列 -->
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
-        id, user_id, user_name, indate, company_id, result, audit_channel
+        id, user_id, user_name, indate, company_id, result, audit_channel, project_name
     </sql>
     </sql>
 
 
 </mapper>
 </mapper>

+ 15 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -57,7 +57,7 @@
         SELECT a.id, c.name, b.project_name AS project,b.category_name as categoryName, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
         SELECT a.id, c.name, b.project_name AS project,b.category_name as categoryName, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
-        a.department_audit_state as departmentAuditState, a.pic_str as picStr, multi_worktime as multiWorktime
+        a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, department.department_name as departmentName, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as projectAuditTime
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, department.department_name as departmentName, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as projectAuditTime
         FROM report AS a
         FROM report AS a
@@ -85,6 +85,9 @@
         <if test="userId != null">
         <if test="userId != null">
             AND a.creator_id = #{userId}
             AND a.creator_id = #{userId}
         </if>
         </if>
+        <if test="departmentId != null">
+            AND department.department_id = #{departmentId}
+        </if>
 
 
         ORDER BY a.creator_id, a.create_date desc
         ORDER BY a.creator_id, a.create_date desc
     </select>
     </select>
@@ -93,7 +96,7 @@
         SELECT c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
         SELECT c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
-        a.department_audit_state as departmentAuditState, a.pic_str as picStr, multi_worktime as multiWorktime
+        a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours, a.custom_text as customText
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours, a.custom_text as customText
         FROM report AS a
         FROM report AS a
@@ -123,7 +126,7 @@
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as
         isOvertime,a.progress as progress,
         isOvertime,a.progress as progress,
-        a.department_audit_state as departmentAuditState, a.pic_str as picStr, multi_worktime as multiWorktime
+        a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as
         degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId,
         degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId,
         a.custom_data as customData
         a.custom_data as customData
@@ -156,6 +159,9 @@
         <if test="leaderId != null">
         <if test="leaderId != null">
             AND b.incharger_id = #{leaderId}
             AND b.incharger_id = #{leaderId}
         </if>
         </if>
+        <if test="departmentId != null">
+            AND department.department_id = #{departmentId}
+        </if>
 
 
         ORDER BY a.creator_id, a.create_date desc
         ORDER BY a.creator_id, a.create_date desc
     </select>
     </select>
@@ -164,7 +170,7 @@
         SELECT a.id, c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
         SELECT a.id, c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
-        a.department_audit_state as departmentAuditState, a.pic_str as picStr, multi_worktime as multiWorktime
+        a.department_audit_state as departmentAuditState,a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, department.department_name as departmentName, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as projectAuditTime
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, department.department_name as departmentName, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as projectAuditTime
         FROM report AS a
         FROM report AS a
@@ -189,6 +195,9 @@
         <if test="projectId != null">
         <if test="projectId != null">
             AND a.project_id = #{projectId}
             AND a.project_id = #{projectId}
         </if>
         </if>
+        <if test="departmentId != null">
+            AND department.department_id = #{departmentId}
+        </if>
         <if test="deptIds != null">
         <if test="deptIds != null">
             AND c.department_id in
             AND c.department_id in
             <foreach collection="deptIds" item="deptId" separator="," close=")" open="(" index="index">
             <foreach collection="deptIds" item="deptId" separator="," close=")" open="(" index="index">
@@ -359,7 +368,7 @@
 
 
     <!--根据日期获取报告上传人-->
     <!--根据日期获取报告上传人-->
     <select id="getReportNameByDate" resultType="java.util.Map">
     <select id="getReportNameByDate" resultType="java.util.Map">
-        SELECT DISTINCT b.id, b.name, a.state, a.department_audit_state as departmentAuditState
+        SELECT DISTINCT b.id, b.name, a.state, a.department_audit_state as departmentAuditState, IFNULL(sum(a.working_time),0) as workingTime
         FROM report AS a
         FROM report AS a
         JOIN user AS b ON a.creator_id=b.id
         JOIN user AS b ON a.creator_id=b.id
         left join project on project.id = a.project_id
         left join project on project.id = a.project_id
@@ -373,6 +382,7 @@
         <if test="leaderId != null and leaderId != ''">
         <if test="leaderId != null and leaderId != ''">
             AND (a.project_auditor_id = #{leaderId} or project.incharger_id = #{leaderId})
             AND (a.project_auditor_id = #{leaderId} or project.incharger_id = #{leaderId})
         </if>
         </if>
+        group by a.creator_id
     </select>
     </select>
 
 
     <!--根据日期,部门,指定人员获取报告上传人-->
     <!--根据日期,部门,指定人员获取报告上传人-->

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/SubUserCustomMapper.xml

@@ -0,0 +1,17 @@
+<?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.SubUserCustomMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.SubUserCustom">
+        <id column="id" property="id" />
+        <result column="user_custom_id" property="userCustomId" />
+        <result column="name" property="name" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, user_custom_id, name
+    </sql>
+
+</mapper>

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

@@ -189,4 +189,16 @@
         </if>
         </if>
         and task_status = 0 order by task.id desc limit 50
         and task_status = 0 order by task.id desc limit 50
     </select>
     </select>
+    <select id="selectMilepost" resultType="com.management.platform.entity.Task">
+        select * from task where task.project_id in
+        <foreach collection="list" index="index" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        and task.task_type=1 and task.finish_date in
+        (select MAX(task.finish_date)from task where  task.project_id in
+        <foreach collection="list" index="index" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+         and task.task_type=1   group by project_id) group by task.project_id
+    </select>
 </mapper>
 </mapper>

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml

@@ -18,12 +18,14 @@
         <result column="fill_months" property="fillMonths" />
         <result column="fill_months" property="fillMonths" />
         <result column="custom_degree_active" property="customDegreeActive" />
         <result column="custom_degree_active" property="customDegreeActive" />
         <result column="custom_degree_name" property="customDegreeName" />
         <result column="custom_degree_name" property="customDegreeName" />
+        <result column="custom_degree_status" property="customDegreeStatus" />
         <result column="alert_msg" property="alertMsg" />
         <result column="alert_msg" property="alertMsg" />
         <result column="sync_corpwx_time" property="syncCorpwxTime" />
         <result column="sync_corpwx_time" property="syncCorpwxTime" />
         <result column="need_dept_audit" property="needDeptAudit" />
         <result column="need_dept_audit" property="needDeptAudit" />
         <result column="report_workflow" property="reportWorkflow" />
         <result column="report_workflow" property="reportWorkflow" />
         <result column="custom_data_active" property="customDataActive" />
         <result column="custom_data_active" property="customDataActive" />
         <result column="custom_data_name" property="customDataName" />
         <result column="custom_data_name" property="customDataName" />
+        <result column="custom_data_status" property="customDataStatus" />
         <result column="finance_audit" property="financeAudit" />
         <result column="finance_audit" property="financeAudit" />
         <result column="overtime_ratio" property="overtimeRatio" />
         <result column="overtime_ratio" property="overtimeRatio" />
         <result column="sync_dingding" property="syncDingding" />
         <result column="sync_dingding" property="syncDingding" />
@@ -33,6 +35,7 @@
         <result column="show_corpwx_cardtime" property="showCorpwxCardtime" />
         <result column="show_corpwx_cardtime" property="showCorpwxCardtime" />
         <result column="custom_text_active" property="customTextActive" />
         <result column="custom_text_active" property="customTextActive" />
         <result column="custom_text_name" property="customTextName" />
         <result column="custom_text_name" property="customTextName" />
+        <result column="custom_text_status" property="customTextStatus" />
         <result column="lock_worktime" property="lockWorktime" />
         <result column="lock_worktime" property="lockWorktime" />
         <result column="fill_overtime" property="fillOvertime" />
         <result column="fill_overtime" property="fillOvertime" />
         <result column="show_fillaudit_time" property="showFillauditTime" />
         <result column="show_fillaudit_time" property="showFillauditTime" />

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserCustomMapper.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.UserCustomMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.UserCustom">
+        <id column="id" property="id" />
+        <result column="company_id" property="companyId" />
+        <result column="name" property="name" />
+        <result column="type" property="type" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company_id, name, type
+    </sql>
+
+</mapper>

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

@@ -27,9 +27,16 @@
         <result column="dingding_userid" property="dingdingUserid" />
         <result column="dingding_userid" property="dingdingUserid" />
         <result column="dingding_unionid" property="dingdingUnionid" />
         <result column="dingding_unionid" property="dingdingUnionid" />
         <result column="corpwx_userid" property="corpwxUserid" />
         <result column="corpwx_userid" property="corpwxUserid" />
+        <result column="induction_date" property="inductionDate" />
         <result column="inactive_date" property="inactiveDate" />
         <result column="inactive_date" property="inactiveDate" />
         <result column="position" property="position" />
         <result column="position" property="position" />
         <result column="report_status" property="reportStatus" />
         <result column="report_status" property="reportStatus" />
+        <result column="superior_id" property="superiorId" />
+        <result column="plate1" property="plate1" />
+        <result column="plate2" property="plate2" />
+        <result column="plate3" property="plate3" />
+        <result column="plate4" property="plate4" />
+        <result column="plate5" property="plate5" />
     </resultMap>
     </resultMap>
     <resultMap id="BaseResultMap2" type="com.management.platform.entity.User">
     <resultMap id="BaseResultMap2" type="com.management.platform.entity.User">
         <id column="id" property="id" />
         <id column="id" property="id" />
@@ -39,13 +46,13 @@
     </resultMap>
     </resultMap>
     <!-- 通用查询结果列 -->
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
-        id, name, phone, password, portrait_url, create_time, role, company_id, department_id, department_cascade, cost, month_cost, salary_type, manage_dept_id, color, is_active, wx_openid, role_id, role_name, cost_apply_date, dingding_userid, dingding_unionid, corpwx_userid, inactive_date, position,report_status
+        id, name, phone, password, portrait_url, create_time, role, company_id, department_id, department_cascade, cost, month_cost, salary_type, manage_dept_id, color, is_active, wx_openid, role_id, role_name, cost_apply_date, dingding_userid, dingding_unionid, corpwx_userid, induction_date, inactive_date, position, report_status, superior_id, plate1, plate2, plate3, plate4, plate5
     </sql>
     </sql>
     <!--单独分页获取人员-->
     <!--单独分页获取人员-->
     <select id="getUserByDepartment" resultType="java.util.Map">
     <select id="getUserByDepartment" resultType="java.util.Map">
         SELECT a.id, a.role_id as roleId, a.role_name as roleName, a.name, a.phone, a.portrait_url AS portraitUrl, a.role, a.company_id AS companyId, a.cost,
         SELECT a.id, a.role_id as roleId, a.role_name as roleName, a.name, a.phone, a.portrait_url AS portraitUrl, a.role, a.company_id AS companyId, a.cost,
         a.department_id AS departmentId, b.department_name AS departmentName, a.department_cascade AS departmentCascade,
         a.department_id AS departmentId, b.department_name AS departmentName, a.department_cascade AS departmentCascade,
-        a.month_cost as monthCost, a.salary_type as salaryType, a.is_active as isActive, a.cost_apply_date as costApplyDate
+        a.month_cost as monthCost, a.salary_type as salaryType, a.is_active as isActive, a.cost_apply_date as costApplyDate,a.plate1,a.plate2,a.plate3,a.plate4,a.plate5
         FROM user AS a
         FROM user AS a
         LEFT JOIN department AS b ON a.department_id = b.department_id
         LEFT JOIN department AS b ON a.department_id = b.department_id
         WHERE a.company_id = #{companyId}
         WHERE a.company_id = #{companyId}
@@ -67,7 +74,7 @@
     <select id="getUserByDepartmentList" resultType="java.util.Map">
     <select id="getUserByDepartmentList" resultType="java.util.Map">
         SELECT a.id,  a.role_id as roleId, a.role_name as roleName,  a.name, a.phone, a.portrait_url AS portraitUrl, a.role, a.company_id AS companyId, a.cost,
         SELECT a.id,  a.role_id as roleId, a.role_name as roleName,  a.name, a.phone, a.portrait_url AS portraitUrl, a.role, a.company_id AS companyId, a.cost,
         a.department_id AS departmentId, b.department_name AS departmentName, a.department_cascade AS departmentCascade,
         a.department_id AS departmentId, b.department_name AS departmentName, a.department_cascade AS departmentCascade,
-        a.month_cost as monthCost, a.salary_type as salaryType, a.is_active as isActive, a.cost_apply_date as costApplyDate
+        a.month_cost as monthCost, a.salary_type as salaryType, a.is_active as isActive, a.cost_apply_date as costApplyDate,a.plate1,a.plate2,a.plate3,a.plate4,a.plate5
         FROM user AS a
         FROM user AS a
         LEFT JOIN department AS b ON a.department_id = b.department_id
         LEFT JOIN department AS b ON a.department_id = b.department_id
         WHERE a.company_id = #{companyId} AND a.department_id IN
         WHERE a.company_id = #{companyId} AND a.department_id IN
@@ -130,4 +137,5 @@
         select user.id, name, department.department_name from user left join department on department.department_id = user.department_id
         select user.id, name, department.department_name from user left join department on department.department_id = user.department_id
         ${ew.customSqlSegment}
         ${ew.customSqlSegment}
     </select>
     </select>
+
 </mapper>
 </mapper>

+ 11 - 11
fhKeeper/formulahousekeeper/timesheet/config/index.js

@@ -1,18 +1,18 @@
 var path = require('path')
 var path = require('path')
 
 
 //  var ip = '127.0.0.1'
 //  var ip = '127.0.0.1'
-// var ip = '192.168.2.9'
-var ip = '192.168.2.39'
+// var ip = '47.100.37.243'
+// var ip = '192.168.2.30'
 
 
-// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
-// for (var i in ifaces) {
-//     for (var j in ifaces[i]) {
-//         var val = ifaces[i][j]
-//         if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
-//             ip = val.address
-//         }
-//     }
-// }
+var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+for (var i in ifaces) {
+    for (var j in ifaces[i]) {
+        var val = ifaces[i][j]
+        if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
+            ip = val.address
+        }
+    }
+}
 
 
 module.exports = {
 module.exports = {
   build: {
   build: {

BIN
fhKeeper/formulahousekeeper/timesheet/src/assets/image/hanglie_corp.png


+ 2 - 0
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -28,6 +28,7 @@ const StringUtil = {
         reportsFillOut: false, // 代填日报 //
         reportsFillOut: false, // 代填日报 //
         reportsDeleteAll: false, // 删除全公司日报
         reportsDeleteAll: false, // 删除全公司日报
         importReport: false, //导入工时lij
         importReport: false, //导入工时lij
+        reportsDept: false, //查看本部门工时
 
 
         // 财务核算成本 
         // 财务核算成本 
         financialCustom: false, // 自定义薪资项 // 
         financialCustom: false, // 自定义薪资项 // 
@@ -95,6 +96,7 @@ const StringUtil = {
         arr[i] == '导出人员' ? obj.structureExport = true : ''
         arr[i] == '导出人员' ? obj.structureExport = true : ''
         arr[i] == '导入人员' ? obj.structureImport = true : ''
         arr[i] == '导入人员' ? obj.structureImport = true : ''
         arr[i] == '查看全公司工时' ? obj.reportsCompany = true : ''
         arr[i] == '查看全公司工时' ? obj.reportsCompany = true : ''
+        arr[i] == '查看本部门工时' ? obj.reportsDept = true : ''
         arr[i] == '查看相关人员工时' ? obj.reportsPersonnel = true : ''
         arr[i] == '查看相关人员工时' ? obj.reportsPersonnel = true : ''
         arr[i] == '代填日报' ? obj.reportsFillOut = true : ''
         arr[i] == '代填日报' ? obj.reportsFillOut = true : ''
         arr[i] == '自定义薪资项' ? obj.financialCustom = true : ''
         arr[i] == '自定义薪资项' ? obj.financialCustom = true : ''

+ 7 - 8
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -56,26 +56,25 @@
                 </el-form-item>  -->
                 </el-form-item>  -->
                 <el-form-item style="float:right;" v-if="permissions.projectImport || permissions.projectExport || permissions.projectClassification || (user.company.packageProject == 1 && permissions.projectCostOfItems)">
                 <el-form-item style="float:right;" v-if="permissions.projectImport || permissions.projectExport || permissions.projectClassification || (user.company.packageProject == 1 && permissions.projectCostOfItems)">
                     <el-dropdown>
                     <el-dropdown>
-                        <span class="el-dropdown-link">
-                            查看更多<i class="el-icon-arrow-down el-icon--right"></i>
-                        </span>
+                        <el-link type="primary" :underline="false">查看更多<i class="el-icon-arrow-down el-icon--right"></i></el-link>
+                        
                         <el-dropdown-menu slot="dropdown">
                         <el-dropdown-menu slot="dropdown">
                             <el-dropdown-item v-if="permissions.projectImport">
                             <el-dropdown-item v-if="permissions.projectImport">
                                 <el-upload ref="upload" action="#" :limit="1" :http-request="importProject" :show-file-list="false">
                                 <el-upload ref="upload" action="#" :limit="1" :http-request="importProject" :show-file-list="false">
-                                    <el-link :underline="false" >导入项目</el-link>
+                                    <el-link type="primary" :underline="false" >导入项目</el-link>
                                 </el-upload>
                                 </el-upload>
                             </el-dropdown-item>
                             </el-dropdown-item>
                             <el-dropdown-item v-if="permissions.projectImport">
                             <el-dropdown-item v-if="permissions.projectImport">
-                                <el-link :underline="false" href="./upload/项目导入模板.xlsx" download="项目导入模板.xlsx">模板下载</el-link>
+                                <el-link type="primary" :underline="false" href="./upload/项目导入模板.xlsx" download="项目导入模板.xlsx">模板下载</el-link>
                             </el-dropdown-item>
                             </el-dropdown-item>
                             <el-dropdown-item v-if="permissions.projectExport">
                             <el-dropdown-item v-if="permissions.projectExport">
-                                <el-link :underline="false" @click="exportProjectData" download="项目导出.xlsx">导出项目</el-link>
+                                <el-link type="primary" :underline="false" @click="exportProjectData" download="项目导出.xlsx">导出项目</el-link>
                             </el-dropdown-item>
                             </el-dropdown-item>
                             <el-dropdown-item v-if="user.company.packageProject == 1 && permissions.projectCostOfItems">
                             <el-dropdown-item v-if="user.company.packageProject == 1 && permissions.projectCostOfItems">
-                                <el-link :underline="false" @click="showBaseCostItemDialog">基线成本项</el-link>
+                                <el-link type="primary" :underline="false" @click="showBaseCostItemDialog">基线成本项</el-link>
                             </el-dropdown-item>
                             </el-dropdown-item>
                             <el-dropdown-item v-if="permissions.projectClassification">
                             <el-dropdown-item v-if="permissions.projectClassification">
-                                <el-link :underline="false" @click="showClfDialog = true">分类管理</el-link>
+                                <el-link type="primary" :underline="false" @click="showClfDialog = true">分类管理</el-link>
                             </el-dropdown-item>
                             </el-dropdown-item>
                         </el-dropdown-menu>
                         </el-dropdown-menu>
                         </el-dropdown>
                         </el-dropdown>

+ 15 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue

@@ -84,8 +84,15 @@
           <span>{{scope.row.startDate ? scope.row.startDate + ' ~ ' + scope.row.endDate : ''}}</span>
           <span>{{scope.row.startDate ? scope.row.startDate + ' ~ ' + scope.row.endDate : ''}}</span>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
+      <el-table-column label="合同要求" prop="contractReq" min-width="240" show-overflow-tooltip></el-table-column>
+      <el-table-column label="里程碑进度" prop="milepost" min-width="280">
+        <template slot-scope="scope">
+          <span>{{scope.row.milepost ? scope.row.milepost.name + '\u3000完成时间:' + scope.row.milepost.finishDate : ''}}</span>
+        </template>
+      </el-table-column>
       <el-table-column label="人员需求" prop="membReq" min-width="280"></el-table-column>
       <el-table-column label="人员需求" prop="membReq" min-width="280"></el-table-column>
       <el-table-column label="任务需求" prop="taskReq" min-width="280"></el-table-column>
       <el-table-column label="任务需求" prop="taskReq" min-width="280"></el-table-column>
+      <el-table-column label="参与部门进度" prop="departmentSpeed" min-width="280"></el-table-column>
       <el-table-column label="操作" width="120" align="center" fixed="right">
       <el-table-column label="操作" width="120" align="center" fixed="right">
         <template slot-scope="scope">
         <template slot-scope="scope">
           <el-button @click="demandEdit(scope.row)" size="small">修改</el-button>
           <el-button @click="demandEdit(scope.row)" size="small">修改</el-button>
@@ -129,6 +136,12 @@
       <el-form-item label="任务需求">
       <el-form-item label="任务需求">
         <el-input style="width:350px" v-model="editParameter.taskReq" clearable></el-input>
         <el-input style="width:350px" v-model="editParameter.taskReq" clearable></el-input>
       </el-form-item>
       </el-form-item>
+      <el-form-item label="合同要求">
+        <el-input style="width:350px" v-model="editParameter.contractReq" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="部门进度">
+        <el-input style="width:350px" v-model="editParameter.departmentSpeed" clearable></el-input>
+      </el-form-item>
     </el-form>
     </el-form>
     <div slot="footer" class="dialog-footer">
     <div slot="footer" class="dialog-footer">
               <el-button type="default" @click="demandEditDialog = false">取消</el-button>
               <el-button type="default" @click="demandEditDialog = false">取消</el-button>
@@ -305,6 +318,7 @@ export default {
 
 
       handleSizeChange(val){
       handleSizeChange(val){
         this.pageSize = val
         this.pageSize = val
+        this.pageIndex = 1
         this.getDemandList()
         this.getDemandList()
       },
       },
       handleCurrentChange(val){
       handleCurrentChange(val){
@@ -325,6 +339,7 @@ export default {
         this.editParameter.endDate = this.editDate2
         this.editParameter.endDate = this.editDate2
         delete this.editParameter.reStartDate
         delete this.editParameter.reStartDate
         delete this.editParameter.reEndDate
         delete this.editParameter.reEndDate
+        delete this.editParameter.milepost
         this.http.post('/project-requirement/addOrMod',this.editParameter,
         this.http.post('/project-requirement/addOrMod',this.editParameter,
         res => {
         res => {
           if(res.code == 'ok'){
           if(res.code == 'ok'){

+ 22 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -33,7 +33,7 @@
                 <el-checkbox v-model="timeType.fillOvertime" label="可填报加班时长" />
                 <el-checkbox v-model="timeType.fillOvertime" label="可填报加班时长" />
                 <template v-if="timeType.fillOvertime">
                 <template v-if="timeType.fillOvertime">
                 <el-checkbox v-model="timeType.payOvertime" label="加班工时记入成本" />
                 <el-checkbox v-model="timeType.payOvertime" label="加班工时记入成本" />
-                <!-- <el-checkbox v-model="timeType.doubleOvertime" label="加班双倍成本" :disabled="!timeType.payOvertime"/> -->`
+                <!-- <el-checkbox v-model="timeType.doubleOvertime" label="加班双倍成本" :disabled="!timeType.payOvertime"/> -->
                 <el-input v-model="timeType.overtimeRatio" placeholder="" clearable style="width: 100px;margin: 0 10px 0 20px" v-if="timeType.payOvertime" @keyup.native="timeType.overtimeRatio = oninput(timeType.overtimeRatio, 1)"></el-input> <span v-if="timeType.payOvertime">倍工资</span>
                 <el-input v-model="timeType.overtimeRatio" placeholder="" clearable style="width: 100px;margin: 0 10px 0 20px" v-if="timeType.payOvertime" @keyup.native="timeType.overtimeRatio = oninput(timeType.overtimeRatio, 1)"></el-input> <span v-if="timeType.payOvertime">倍工资</span>
                 </template>
                 </template>
             </el-form-item>
             </el-form-item>
@@ -191,7 +191,7 @@
                     </el-form>
                     </el-form>
                     <div class="underpanel">
                     <div class="underpanel">
                         <div class="whiteList_head">
                         <div class="whiteList_head">
-                            <span style="float:left;">不提醒人员设置</span>
+                            <span style="float:left;color:#999">不提醒人员设置</span>
                             <el-link type="primary" style="float:left;margin-left:15px" :underline="false" @click="addWhite">添加</el-link>
                             <el-link type="primary" style="float:left;margin-left:15px" :underline="false" @click="addWhite">添加</el-link>
                         </div>
                         </div>
                         <div class="whiteList_content">
                         <div class="whiteList_content">
@@ -224,6 +224,10 @@
             <p style="margin-left:10px;color:#666;">自定义日报填报列表</p>
             <p style="margin-left:10px;color:#666;">自定义日报填报列表</p>
             <el-switch style="margin-left: 40px" v-model="timeType.customDegreeActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
             <el-switch style="margin-left: 40px" v-model="timeType.customDegreeActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
             <span style="margin-left:10px;color:#999;">开启后系统可按该字段数据进行分类统计工时成本</span>
             <span style="margin-left:10px;color:#999;">开启后系统可按该字段数据进行分类统计工时成本</span>
+            <template v-if="timeType.customDegreeActive">
+            <el-switch style="margin-left: 40px" v-model="timeType.customDegreeStatus" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
+            <span style="margin-left:10px;color:#999;">是否为必填项</span>
+            </template>
         </div>
         </div>
         <el-row v-if="timeType.customDegreeActive" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
         <el-row v-if="timeType.customDegreeActive" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
             <el-col :span="24" >
             <el-col :span="24" >
@@ -244,6 +248,10 @@
             <p style="margin-left:10px;color:#666;"><span>自定义日报填报数值</span></p>
             <p style="margin-left:10px;color:#666;"><span>自定义日报填报数值</span></p>
             <el-switch style="margin-left: 40px" v-model="timeType.customDataActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
             <el-switch style="margin-left: 40px" v-model="timeType.customDataActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
             <span style="margin-left:10px;color:#999;">开启后可按项目,部门和人员统计该数值</span>
             <span style="margin-left:10px;color:#999;">开启后可按项目,部门和人员统计该数值</span>
+            <template v-if="timeType.customDataActive">
+            <el-switch style="margin-left: 40px" v-model="timeType.customDataStatus" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
+            <span style="margin-left:10px;color:#999;">是否为必填项</span>
+            </template>
         </div>
         </div>
         <el-row v-if="timeType.customDataActive && user.company.packageProject==1" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
         <el-row v-if="timeType.customDataActive && user.company.packageProject==1" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
             <el-col :span="24" >
             <el-col :span="24" >
@@ -262,6 +270,10 @@
             <p style="margin-left:10px;color:#666;"><span>自定义日报填报文本</span></p>
             <p style="margin-left:10px;color:#666;"><span>自定义日报填报文本</span></p>
             <el-switch style="margin-left: 40px" v-model="timeType.customTextActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
             <el-switch style="margin-left: 40px" v-model="timeType.customTextActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
             <span style="margin-left:10px;color:#999;">开启后可员工可额外填写该信息</span>
             <span style="margin-left:10px;color:#999;">开启后可员工可额外填写该信息</span>
+            <template v-if="timeType.customTextActive">
+            <el-switch style="margin-left: 40px" v-model="timeType.customTextStatus" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
+            <span style="margin-left:10px;color:#999;">是否为必填项</span>
+            </template>
         </div>
         </div>
         <el-row v-if="timeType.customTextActive" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
         <el-row v-if="timeType.customTextActive" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
             <el-col :span="24" >
             <el-col :span="24" >
@@ -891,6 +903,10 @@
                             }
                             }
                         }
                         }
                         delete param.userList
                         delete param.userList
+                        param.customTextStatus = param.customTextStatus && param.customTextActive ? 1 : 0
+                        param.customDegreeStatus = param.customDegreeStatus && param.customDegreeActive ? 1 : 0
+                        param.customDataStatus = param.customDataStatus && param.customDataActive ? 1 : 0
+                        
                         // console.log(param, '将要提交的值')
                         // console.log(param, '将要提交的值')
                         // return
                         // return
                         this.http.post('/time-type/save',param,
                         this.http.post('/time-type/save',param,
@@ -933,6 +949,9 @@
                             this.timeType = res.data;
                             this.timeType = res.data;
                             this.timeType.fillOvertime = this.timeType.fillOvertime ? true : false
                             this.timeType.fillOvertime = this.timeType.fillOvertime ? true : false
                             this.timeType.lockWorktime = this.timeType.lockWorktime ? true : false
                             this.timeType.lockWorktime = this.timeType.lockWorktime ? true : false
+                            this.timeType.customTextStatus = this.timeType.customTextStatus ? true : false
+                            this.timeType.customDegreeStatus = this.timeType.customDegreeStatus ? true : false
+                            this.timeType.customDataStatus = this.timeType.customDataStatus ? true : false
                             this.timeChange();
                             this.timeChange();
                             let userlist = res.data.userList
                             let userlist = res.data.userList
                             this.whiteList = []
                             this.whiteList = []
@@ -1018,7 +1037,7 @@
     top: -12px;
     top: -12px;
 }
 }
 .underpanel .whiteList_head{
 .underpanel .whiteList_head{
-    padding: 5px 0 0 5px;
+    padding: 5px 0 0 0;
     height: 24px;
     height: 24px;
 }
 }
 .underpanel .whiteList_content{
 .underpanel .whiteList_content{

+ 418 - 18
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -51,27 +51,23 @@
                     <el-form-item>
                     <el-form-item>
                         <div style="color:#999;font-size:13px;">共{{total}}人</div>
                         <div style="color:#999;font-size:13px;">共{{total}}人</div>
                     </el-form-item>
                     </el-form-item>
+                    <el-form-item style="float:right;" v-if="permissions.structureExport">
+                        <el-link type="primary" :underline="false" @click="customConfigShow">自定义配置</el-link>
+                    </el-form-item>
                     <el-form-item style="float:right;" v-if="permissions.structureExport">
                     <el-form-item style="float:right;" v-if="permissions.structureExport">
                         <el-link type="primary" :underline="false" @click="showExportDialog">导出人员</el-link>
                         <el-link type="primary" :underline="false" @click="showExportDialog">导出人员</el-link>
                     </el-form-item>
                     </el-form-item>
                     <el-form-item style="float:right;" v-if="user.dingdingUserid == null && permissions.structureAdd">
                     <el-form-item style="float:right;" v-if="user.dingdingUserid == null && permissions.structureAdd">
                         <el-link type="primary" :underline="false" @click="openInsertDialog(null)">添加人员</el-link>
                         <el-link type="primary" :underline="false" @click="openInsertDialog(null)">添加人员</el-link>
                     </el-form-item>
                     </el-form-item>
-                    <!-- 原来的 -->
-                    <!-- <el-form-item style="float:right;" v-if="depData != null && depData.id != -1 && depData.id != 0">
-                        <el-upload ref="upload" action="#" :limit="1" :http-request="importUser" :show-file-list="false">
-                            <el-link type="primary" :underline="false">批量导入</el-link>
-                        </el-upload>
-                    </el-form-item> -->
+                    
                     <el-form-item style="float:right;" v-if="user.dingdingUserid == null && permissions.structureImport">
                     <el-form-item style="float:right;" v-if="user.dingdingUserid == null && permissions.structureImport">
-                        <el-upload ref="upload" action="#" :limit="1" :http-request="importUser" :show-file-list="false">
-                            <el-link type="primary" :underline="false">批量导入</el-link>
-                        </el-upload>
+                            <el-link type="primary" :underline="false" @click="importUserC">批量导入</el-link>
                     </el-form-item>
                     </el-form-item>
 
 
-                    <el-form-item style="float:right;" v-if="user.dingdingUserid == null && permissions.structureImport">
+                    <!-- <el-form-item style="float:right;" v-if="user.dingdingUserid == null && permissions.structureImport">
                         <el-link type="primary" :underline="false" href="./upload/人员导入模板.xlsx" download="人员导入模板.xlsx">模板下载</el-link>
                         <el-link type="primary" :underline="false" href="./upload/人员导入模板.xlsx" download="人员导入模板.xlsx">模板下载</el-link>
-                    </el-form-item>
+                    </el-form-item> -->
                     <!-- <el-form-item  v-if="depData != null && depData.id != -1 && depData.id != 0" style="float:right;border: 0.5px solid #20a0ff;height: 27px;margin-top: 6px;">
                     <!-- <el-form-item  v-if="depData != null && depData.id != -1 && depData.id != 0" style="float:right;border: 0.5px solid #20a0ff;height: 27px;margin-top: 6px;">
                     </el-form-item> -->
                     </el-form-item> -->
                     <!-- <el-form-item style="float:right;">
                     <!-- <el-form-item style="float:right;">
@@ -261,6 +257,14 @@
                     <el-cascader v-model="insertForm.departmentId" placeholder="请选择部门" style="width: 100%"
                     <el-cascader v-model="insertForm.departmentId" placeholder="请选择部门" style="width: 100%"
                     :options="option" :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false"  clearable></el-cascader>
                     :options="option" :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false"  clearable></el-cascader>
                 </el-form-item>
                 </el-form-item>
+                <el-form-item label="直属上级">
+                    <el-select v-model="insertForm.superiorId" placeholder="请选择角色" style="width: 100%" filterable>
+                        <el-option v-for="item in users" :label="item.name" :value="item.id" :key="item.id">
+                            <span style="float: left">{{item.name}}</span>
+                            <span style="float: right; color: #8492a6; font-size: 13px">{{item.departmentName}}</span>
+                        </el-option>
+                    </el-select>
+                </el-form-item>
                 <el-form-item label="角色" prop="roleId">
                 <el-form-item label="角色" prop="roleId">
                     <el-select v-model="insertForm.roleId" placeholder="请选择角色" style="width: 100%">
                     <el-select v-model="insertForm.roleId" placeholder="请选择角色" style="width: 100%">
                         <el-option v-for="item in acquireRoleList" :label="item.rolename" :value="item.id" :key="item.name">
                         <el-option v-for="item in acquireRoleList" :label="item.rolename" :value="item.id" :key="item.name">
@@ -269,6 +273,13 @@
                         </el-option>
                         </el-option>
                     </el-select>
                     </el-select>
                 </el-form-item>
                 </el-form-item>
+                <el-form-item :label="item.name" v-for="item,index in userCustomConfig" :key="item.id">
+                    <el-select v-if="item.type == 0" v-model="insertForm[suoying[index]]" placeholder="请选择" clearable style="width: 100%">
+                        <el-option v-for="option in item.itemList" :label="option.name" :value="option.name" :key="option.id">
+                        </el-option>
+                    </el-select>
+                    <el-input v-else v-model="insertForm[suoying[index]]" placeholder="请输入" clearable></el-input>
+                </el-form-item>
                 <el-form-item label="入职时间" prop="phone">
                 <el-form-item label="入职时间" prop="phone">
                     <el-date-picker v-model="insertForm.inductionDate" value-format="yyyy-MM-dd"></el-date-picker>
                     <el-date-picker v-model="insertForm.inductionDate" value-format="yyyy-MM-dd"></el-date-picker>
                 </el-form-item>
                 </el-form-item>
@@ -276,7 +287,7 @@
                     <el-input v-model="insertForm.position" placeholder="请输入岗位职级别" clearable></el-input>
                     <el-input v-model="insertForm.position" placeholder="请输入岗位职级别" clearable></el-input>
                 </el-form-item>
                 </el-form-item>
 
 
-                <div class="zhaunye"><p>专业证书</p><p><el-link type="primary" @click="addCertificateList()">添加更多证书123</el-link><el-link v-if="permissions.structureCertificate" type="primary" @click="managementDiolog = true" style="margin-left: 20px">管理专业证书</el-link></p></div>
+                <div class="zhaunye"><p>专业证书</p><p><el-link type="primary" @click="addCertificateList()">添加更多证书</el-link><el-link v-if="permissions.structureCertificate" type="primary" @click="managementDiolog = true" style="margin-left: 20px">管理专业证书</el-link></p></div>
                 <div class="certificateList">
                 <div class="certificateList">
                     <div class="moreList">
                     <div class="moreList">
                         <div class="moreLiList" v-for="(item,index) in insertForm.certJson" :key="index">
                         <div class="moreLiList" v-for="(item,index) in insertForm.certJson" :key="index">
@@ -443,6 +454,72 @@
                 <el-button type="primary" @click="addManagementForm('managementForm')">提 交</el-button>
                 <el-button type="primary" @click="addManagementForm('managementForm')">提 交</el-button>
             </span>
             </span>
         </el-dialog>
         </el-dialog>
+        <!-- 自定义配置项 -->
+        <el-dialog title="自定义配置项管理" show-header="false" v-if="customConfigDialog" :visible.sync="customConfigDialog" :close-on-click-modal="false" customClass="customWidth" width="650px" top="20px">
+            <div style="margin-left:30px;">
+            <p v-for="item,index in customConfigList" :key="index">
+                <el-input size="medium" v-model="item.name" placeholder="请输入自定义配置项名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+                    <el-radio size="medium" :disabled="!item.name" v-model="item.type" :label="0" style="margin-right:10px;margin-left:10px">下拉</el-radio>
+                    <el-radio size="medium" :disabled="!item.name" v-model="item.type" :label="1">输入</el-radio>
+                <span style="display:inline-block;width:100px"><el-button v-if="cusItemTypes[index] == 0" type="primary" size="small" @click="getConfigItemBtn(item)">配置选项</el-button></span>
+                <el-button type="danger" size="small" @click="customConfigDelete(item,index)" style="">删除</el-button>
+            </p>
+            
+            </div>
+            <div slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="customConfigDialog = false" >关闭</el-button>
+                <el-button type="primary" @click="customConfigListAdd" :disabled="customConfigList.length >= 5">新增</el-button>
+                <el-button type="primary" @click="customConfigListSave" >保存</el-button>
+                
+            </div>
+
+
+            <!-- 为下拉时的选项配置 -->
+            <el-dialog title="配置选项" v-if="configItemDialog" :visible.sync="configItemDialog" :close-on-click-modal="false" customClass="customWidth" width="500px" append-to-body>
+                <el-table :data="configItemList" height="400px" style="width:100%" key="configItemTable">
+                    <el-table-column prop="id" width="60" label="序号">
+                        <template slot-scope="scope" >
+                            {{scope.$index + 1}}
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="name" label="名称" ></el-table-column>
+                    <el-table-column label="操作" width="150">
+                        <template slot-scope="scope" >
+                            <el-button size="small" type="primary" @click="configItemAorM(scope.row)">编辑</el-button>
+                            <el-button size="small" type="danger" @click="configItemDelete(scope.row)">删除</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <div slot="footer" class="dialog-footer">
+                    <el-button type="primary" @click="configItemDialog = false" >关闭</el-button>
+                    <el-button type="primary" @click="configItemAorM" >新增配置选项</el-button>
+                </div>
+
+                <el-dialog title="新增/编辑配置选项" v-if="configItemAorMDialog" :visible.sync="configItemAorMDialog" :close-on-click-modal="false" customClass="customWidth" width="500px" append-to-body>
+                    <span>名称</span>
+                    <el-input size="medium" v-model="AorMitem.name" placeholder="请输入自定义配置项名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+
+                    <div slot="footer" class="dialog-footer">
+                        <el-button type="primary" @click="configItemAorMDialog = false" >取消</el-button>
+                        <el-button type="primary" @click="configItemAorMSure" >提交</el-button>
+                    </div>
+                </el-dialog>
+            </el-dialog>
+        </el-dialog>
+
+
+        <!-- 批量导入 -->
+        <el-dialog title="人员批量导入" v-if="importDialog" :visible.sync="importDialog" customClass="customWidth" width="500px">
+            <p>1. 下载
+            <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/人员导入模板.xlsx" download="人员导入模板.xlsx">人员导入模板.xlsx</el-link>
+            </p>
+            <p>2. 填写excel模板,并上传。</p>
+            <p style="display: flex;justify-content: center;padding-bottom:1em;">
+                <el-upload ref="upload"  action="#" :limit="1" :http-request="importUser" :show-file-list="false">
+                <el-button type="primary" :underline="false" :loading="importingData">开始导入</el-button>
+            </el-upload>
+            </p>
+        </el-dialog>
     </section>
     </section>
 </template>
 </template>
 
 
@@ -519,7 +596,8 @@
                     costApplyDate: '2021-04-09',
                     costApplyDate: '2021-04-09',
                     inductionDate: '2021-04-09',
                     inductionDate: '2021-04-09',
                     position: '',
                     position: '',
-                    certJson: []
+                    certJson: [],
+                    plateMap:{}
                 },
                 },
                 rules: {
                 rules: {
                     name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
                     name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
@@ -592,7 +670,28 @@
                 },
                 },
                 managementTableData: [],
                 managementTableData: [],
                 certificate: '',
                 certificate: '',
-                addUserId: ''
+                addUserId: '',
+                userCustomConfig: [],
+
+                customConfigDialog: false,
+                importDialog: false,
+                importingData: false,
+                customConfigList: [],
+                cusItemTypes: [],
+                configItemList: [],
+                configItemId: null,
+                configItemDialog: false,
+
+                configItemAorMDialog: false,
+                AorMitem: {
+                    name: null,
+                    userCustomId: null,
+                    id: null
+                },
+                tableLoading: false,
+
+                suoying: ['plate1','plate2','plate3','plate4','plate5'],
+                insertFormPlates: []
             };
             };
         },
         },
         filters: {
         filters: {
@@ -608,6 +707,267 @@
             that = this;
             that = this;
         },
         },
         methods: {
         methods: {
+            test(){
+                this.getCustomConfigList()
+            },
+            // 自定义配置项
+            customConfigShow(){
+                this.getCustomConfigList()
+                this.customConfigDialog = true
+            },
+            getConfigItemBtn(item){
+                this.configItemDialog = true
+                this.AorMitem.userCustomId = item.id
+                this.getConfigItem()
+            },
+            getConfigItem(){ // 获取配置下拉数据
+                this.http.post('/sub-user-custom/list',{
+                    userCustomId: this.AorMitem.userCustomId
+                },res => {
+                    if(res.code == 'ok'){
+                        this.configItemList = res.data
+                    }else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.tableLoading = false
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
+            getCustomConfigList(){ // 获取自定义配置
+                this.http.post('/user-custom/list',{},
+                res => {
+                    if(res.code == 'ok'){
+                        let lists = JSON.parse(JSON.stringify(res.data))
+                        this.userCustomConfig = JSON.parse(JSON.stringify(res.data))
+                        // let lists = res.data
+                        this.customConfigList = res.data
+                        // this.customConfigList = [
+                        //     { name: '', id: null, type: 1, companyId: null },
+                        //     { name: '', id: null, type: 1, companyId: null },
+                        //     { name: '', id: null, type: 1, companyId: null },
+                        //     { name: '', id: null, type: 1, companyId: null },
+                        //     { name: '', id: null, type: 1, companyId: null },
+                        // ]
+                        // for(let i in lists){
+                        //     this.$set(this.customConfigList[i],'name',lists[i].name)
+                        //     this.$set(this.customConfigList[i],'id',lists[i].id)
+                        //     this.$set(this.customConfigList[i],'type',lists[i].type)
+                        //     this.$set(this.customConfigList[i],'companyId',lists[i].companyId)
+                        // }
+                        console.log('customConfigList',this.customConfigList);
+                        this.cusItemTypes = []
+                        for(let j in this.customConfigList){
+                            if(this.customConfigList[j].type == null || this.customConfigList[j].type == 0){
+                                this.customConfigList[j].type = 0
+                                this.cusItemTypes[j] = 0
+                            }else{
+                                this.cusItemTypes[j] = 1
+                            }
+                        }
+                    }else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
+            customConfigListSave(){ // 保存/修改自定义配置
+                // let jsonStr = ''
+                // for(let i in this.customConfigList){
+                //     if(this.customConfigList[i].name){
+                //         jsonStr += JSON.stringify(this.customConfigList[i]) + ','
+                //     }
+                // }
+                // jsonStr = jsonStr.substring(0,jsonStr.length - 1)
+                // let jsonStr = []
+                for(let i in this.customConfigList){
+                    let text = this.customConfigList[i].name.trim()
+                    if(!text){
+                        this.customConfigList.splice(i,1)
+                    }
+                }
+                
+                this.http.post('/user-custom/addOrMod',{
+                    json: JSON.stringify(this.customConfigList)
+                },res => {
+                    if(res.code == 'ok'){
+                        this.getCustomConfigList()
+                        this.customConfigDialog = false
+                        this.$message({
+                            message: '保存成功',
+                            type: 'success'
+                        })
+                    }else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
+            customConfigDelete(item,index){
+                if(item.id){
+                this.http.post('/user-custom/delete',{
+                    id: item.id
+                },res => {
+                    if(res.code == 'ok'){
+                        this.getCustomConfigList()
+                        this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        })
+                    }else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+                }else{
+                    this.customConfigList.splice(index,1)
+                }
+            },
+
+            configItemAorM(item){
+                this.configItemAorMDialog = true
+                if(item){
+                    this.AorMitem.name = item.name
+                    this.AorMitem.id = item.id
+                }else{
+                    this.AorMitem.name = null
+                    this.AorMitem.id = null
+                }
+            },
+            configItemAorMSure(){ // 新增/修改配置下拉选项
+                if(!this.AorMitem.name){
+                    this.$message({
+                        message: '名称不能为空',
+                        type: 'error'
+                    })
+                    return
+                }
+                this.http.post('/sub-user-custom/addOrMod',this.AorMitem,res => {
+                    if(res.code == 'ok'){
+                        this.configItemAorMDialog = false
+                        this.getConfigItem()
+                        this.$message({
+                            message: '提交成功',
+                            type: 'success'
+                        })
+                    }else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
+            configItemDelete(item){ // 删除配置下拉选项
+                this.http.post('/sub-user-custom/delete',{
+                    id: item.id
+                },res => {
+                    if(res.code == 'ok'){
+                        this.getConfigItem()
+                        this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        })
+                    }else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
+
+
+            // 获取添加人员时的自定义配置信息
+            getUserCustomConfig(e){
+                this.http.post('/user-custom/list',{},
+                res => {
+                    if(res.code == 'ok'){
+                        this.userCustomConfig = JSON.parse(JSON.stringify(res.data))
+                        for(let i in this.userCustomConfig){
+                            if(this.userCustomConfig[i].type == 0){
+                                
+                                this.http.post('/sub-user-custom/list',{
+                                    userCustomId: this.userCustomConfig[i].id
+                                },res => {
+                                    if(res.code == 'ok'){
+                                        // this.userCustomConfig[i].itemList = res.data
+                                        this.$set(this.userCustomConfig[i],'itemList',res.data)
+                                    }else { 
+                                        this.$message({
+                                            message: res.msg,
+                                            type: 'error'
+                                        })
+                                    }
+                                },err => {
+                                    this.$message({
+                                        message: err,
+                                        type: 'error'
+                                    })
+                                })
+                            }
+                        }
+                        this.$nextTick(()=>{
+                            // let opt = this.users[0].plateMap[this.userCustomConfig[0].name]
+                            console.log('userCustomConfig',this.userCustomConfig);
+                            console.log('insertForm',this.insertForm);
+                        })
+                    }else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
+            customConfigListAdd(){
+                this.customConfigList.push({
+                    name: '',
+                    type: 1
+                })
+            },
             // 批量修改部门
             // 批量修改部门
             handleSelectionZzjg(e){
             handleSelectionZzjg(e){
                 // if (e.length == 0) {
                 // if (e.length == 0) {
@@ -1002,7 +1362,10 @@
                         }
                         }
                     );
                     );
             },
             },
-
+            
+            importUserC(){
+                this.importDialog = true
+            },
             // 批量导入人员
             // 批量导入人员
             importUser(item) {
             importUser(item) {
                 //首先判断文件类型
                 //首先判断文件类型
@@ -1017,9 +1380,10 @@
                     this.listLoading = true;
                     this.listLoading = true;
                     let formData = new FormData();
                     let formData = new FormData();
                     formData.append("file", item.file);
                     formData.append("file", item.file);
-                    
+                    this.importingData = true
                     this.http.uploadFile( this.port.manage.import, formData,
                     this.http.uploadFile( this.port.manage.import, formData,
                     res => {
                     res => {
+                        this.importingData = false
                         this.$refs.upload.clearFiles();
                         this.$refs.upload.clearFiles();
                         this.listLoading = false;
                         this.listLoading = false;
                         if (res.code == "ok") {
                         if (res.code == "ok") {
@@ -1037,6 +1401,7 @@
                         }
                         }
                     },
                     },
                     error => {
                     error => {
+                        this.importingData = false
                         this.$refs.upload.clearFiles();
                         this.$refs.upload.clearFiles();
                         this.listLoading = false;
                         this.listLoading = false;
                         this.$message({
                         this.$message({
@@ -1171,8 +1536,16 @@
                                 costApplyDate: res.data.costApplyDate,
                                 costApplyDate: res.data.costApplyDate,
                                 inductionDate: res.data.inductionDate,
                                 inductionDate: res.data.inductionDate,
                                 position: res.data.position,
                                 position: res.data.position,
-                                certJson: res.data.certList
+                                certJson: res.data.certList,
+                                plateMap: {},
+                                superiorId: res.data.superiorId,
+                                plate1: res.data.plate1,
+                                plate2: res.data.plate2,
+                                plate3: res.data.plate3,
+                                plate4: res.data.plate4,
+                                plate5: res.data.plate5,
                             };
                             };
+                            this.getUserCustomConfig(1)
                         } else {
                         } else {
                             this.$message({
                             this.$message({
                                 message: res.msg,
                                 message: res.msg,
@@ -1204,8 +1577,17 @@
                         inductionDate: util.formatDate.format(new Date(), 'yyyy-MM-dd'),
                         inductionDate: util.formatDate.format(new Date(), 'yyyy-MM-dd'),
                         position: '',
                         position: '',
                         certJson: [],
                         certJson: [],
+                        plateMap: {},
+                        plate1: null,
+                        plate2: null,
+                        plate3: null,
+                        plate4: null,
+                        plate5: null,
                     };
                     };
                     this.title = "新增人员"
                     this.title = "新增人员"
+                    this.getUserCustomConfig()
+                    // this.insertForm.plateMap['定义测试文本'] = '测试文本'
+                    console.log('insertForm123',this.insertForm);
                 }
                 }
                 this.dialogVisible = true;
                 this.dialogVisible = true;
             },
             },
@@ -1249,11 +1631,29 @@
                             position: this.insertForm.position,
                             position: this.insertForm.position,
                             certJson: JSON.stringify(this.insertForm.certJson),
                             certJson: JSON.stringify(this.insertForm.certJson),
                             // certJson: this.insertForm.certJson
                             // certJson: this.insertForm.certJson
-                            inductionDate: this.insertForm.inductionDate
+                            inductionDate: this.insertForm.inductionDate,
+                            plate1: this.insertForm.plate1,
+                            plate2: this.insertForm.plate2,
+                            plate3: this.insertForm.plate3,
+                            plate4: this.insertForm.plate4,
+                            plate5: this.insertForm.plate5,
                         };
                         };
+
+                        
+                        // for(let i=0;i<5;i++) {
+                        //     if(this.insertFormPlates[i]){
+                        //         form[this.suoying[i]] = this.insertFormPlates[i]
+                        //     }
+                        // }
+
+                        console.log(form, 'form')
+                        
                         if (this.insertForm.id != null) {
                         if (this.insertForm.id != null) {
                             form.id = this.insertForm.id;
                             form.id = this.insertForm.id;
                         }
                         }
+                        if (this.insertForm.superiorId){
+                            form.superiorId = this.insertForm.superiorId
+                        }
                         if (this.insertForm.costApplyDate != null) {
                         if (this.insertForm.costApplyDate != null) {
                             form.costApplyDate = this.insertForm.costApplyDate;
                             form.costApplyDate = this.insertForm.costApplyDate;
                         }
                         }

+ 53 - 39
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -34,7 +34,7 @@
                 </div>
                 </div>
                 </div>
                 </div>
                 <div style="display:flex;">
                 <div style="display:flex;">
-                <div v-if="permissions.reportsCompany || user.manageDeptId != 0" :style="'overflow-x:hidden;overflow-y:auto;height:' + tableHeight + 'px;'">
+                <div v-if="permissions.reportsCompany || user.manageDeptId != 0 || permissions.reportsDept" :style="'overflow-x:hidden;overflow-y:auto;height:' + tableHeight + 'px;'">
                     <div style="width:205px;">
                     <div style="width:205px;">
                         <el-select v-model="selectState" size="small" @change="stateChange" >
                         <el-select v-model="selectState" size="small" @change="stateChange" >
                         <el-option value="-1" label="全部状态" >全部状态</el-option>
                         <el-option value="-1" label="全部状态" >全部状态</el-option>
@@ -77,7 +77,7 @@
                     <div class="report_title" >
                     <div class="report_title" >
                         
                         
                         <span>工作日报 </span>
                         <span>工作日报 </span>
-                        <span v-if="permissions.reportsCompany||user.manageDeptId != 0">| {{depData != null ?depData.label:""}}
+                        <span v-if="permissions.reportsCompany||user.manageDeptId != 0 || permissions.reportsDept">| {{depData != null ?depData.label:""}}
                         <span v-if="targetUid == null">
                         <span v-if="targetUid == null">
                          - 已填写
                          - 已填写
                         <el-link :underline="false" @click="showMembList(1)"><span style="margin-left:5px;margin-right:5px;color:green;">{{reportList.length}}</span></el-link>人,
                         <el-link :underline="false" @click="showMembList(1)"><span style="margin-left:5px;margin-right:5px;color:green;">{{reportList.length}}</span></el-link>人,
@@ -374,18 +374,18 @@
                         </el-select>
                         </el-select>
                     </el-form-item>
                     </el-form-item>
                     <!-- 相关维度/自定义维度 -->
                     <!-- 相关维度/自定义维度 -->
-                    <el-form-item :label="yonghuUser.customDegreeName" v-if="domain.projectId && yonghuUser.customDegreeActive == 1">
+                    <el-form-item :label="yonghuUser.customDegreeName" v-if="domain.projectId && yonghuUser.customDegreeActive == 1" :rules="user.timeType.customDegreeStatus == 1 && domain.wuduList != undefined && domain.wuduList != [] ? { required: true, message: '请选择' + yonghuUser.customDegreeName, trigger: ['change','blur'] } : null" :prop="'domains.' + index + '.degreeId'">
                         <el-select v-model="domain.degreeId" clearable placeholder="请选择" :disabled="!canEdit">
                         <el-select v-model="domain.degreeId" clearable placeholder="请选择" :disabled="!canEdit">
                             <el-option v-for="item in domain.wuduList" :key="item.value" :label="item.name" :value="item.id">
                             <el-option v-for="item in domain.wuduList" :key="item.value" :label="item.name" :value="item.id">
                             </el-option>
                             </el-option>
                         </el-select>
                         </el-select>
                     </el-form-item>
                     </el-form-item>
                     <!-- 相关数值 -->
                     <!-- 相关数值 -->
-                    <el-form-item :label="yonghuUser.customDataName" v-if="yonghuUser.customDataActive == 1">
+                    <el-form-item :label="yonghuUser.customDataName" v-if="yonghuUser.customDataActive == 1 && user.timeType.customDataStatus == 1" :prop="'domains.' + index + '.customData'" :rules="user.timeType.customDataStatus == 1 ? { type: 'number', required: true, message: '请填写' + yonghuUser.customDataName, trigger: ['change','blur'] } : null">
                         <el-input-number :id="'numberData_'+index" :disabled="!canEdit" v-model="domain.customData" style="width:200px;" @keyup.native="restrictNumber('numberData_'+index)"></el-input-number>
                         <el-input-number :id="'numberData_'+index" :disabled="!canEdit" v-model="domain.customData" style="width:200px;" @keyup.native="restrictNumber('numberData_'+index)"></el-input-number>
                     </el-form-item>
                     </el-form-item>
                     <!-- 自定义文本 -->
                     <!-- 自定义文本 -->
-                    <el-form-item :label="yonghuUser.customTextName + '123'" v-if="yonghuUser.customTextActive == 1">
+                    <el-form-item :label="yonghuUser.customTextName" v-if="yonghuUser.customTextActive == 1" :prop="'domains.' + index + '.customText'" :rules="user.timeType.customTextStatus == 1 ? { required: true, message: '请填写' + yonghuUser.customTextName, trigger: ['change','blur'] } : null">
                         <el-input :disabled="!canEdit" v-model="domain.customText" style="width:75%;margin-right:7%" maxlength="25" show-word-limit></el-input>
                         <el-input :disabled="!canEdit" v-model="domain.customText" style="width:75%;margin-right:7%" maxlength="25" show-word-limit></el-input>
                     </el-form-item>
                     </el-form-item>
                     <el-form-item v-if="reportTimeType.type == 3" label="用时占比" :prop="'domains.' + index + '.'+timeFields[reportTimeType.type]"
                     <el-form-item v-if="reportTimeType.type == 3" label="用时占比" :prop="'domains.' + index + '.'+timeFields[reportTimeType.type]"
@@ -493,18 +493,18 @@
                             </span>
                             </span>
                         </el-form-item>
                         </el-form-item>
                         <!-- 相关维度 -->
                         <!-- 相关维度 -->
-                        <el-form-item :label="yonghuUser.customDegreeName" v-if="domain.projectId && yonghuUser.customDegreeActive == 1">
+                        <el-form-item :label="yonghuUser.customDegreeName" v-if="domain.projectId && yonghuUser.customDegreeActive == 1" :rules="user.timeType.customDegreeStatus == 1 && domain.wuduList.length != 0 ? { required: true, message: '请选择' + yonghuUser.customDegreeName, trigger: ['change','blur'] } : null" :prop="'domains.' + index + '.degreeId'">
                             <el-select v-model="domain.degreeId" clearable placeholder="请选择">
                             <el-select v-model="domain.degreeId" clearable placeholder="请选择">
                                 <el-option v-for="item in domain.wuduList" :key="item.value" :label="item.name" :value="item.id">
                                 <el-option v-for="item in domain.wuduList" :key="item.value" :label="item.name" :value="item.id">
                                 </el-option>
                                 </el-option>
                             </el-select>
                             </el-select>
                         </el-form-item>
                         </el-form-item>
                         <!-- 相关数值 -->
                         <!-- 相关数值 -->
-                        <el-form-item :label="yonghuUser.customDataName" v-if="domain.projectId && yonghuUser.customDataActive == 1">
+                        <el-form-item :label="yonghuUser.customDataName" v-if="domain.projectId && yonghuUser.customDataActive == 1" :prop="'domains.' + index + '.customData'" :rules="user.timeType.customDataStatus == 1 ? { type: 'number', required: true, message: '请填写' + yonghuUser.customDataName, trigger: ['change','blur'] } : null">
                             <el-input-number :id="'numberData_'+index" v-model="domain.customData" style="width:200px;" @keyup.native="restrictNumber('numberData_'+index)"></el-input-number>
                             <el-input-number :id="'numberData_'+index" v-model="domain.customData" style="width:200px;" @keyup.native="restrictNumber('numberData_'+index)"></el-input-number>
                         </el-form-item>
                         </el-form-item>
                         <!-- 自定义文本 -->
                         <!-- 自定义文本 -->
-                        <el-form-item :label="yonghuUser.customTextName" v-if="yonghuUser.customTextActive == 1">
+                        <el-form-item :label="yonghuUser.customTextName" v-if="yonghuUser.customTextActive == 1" :prop="'domains.' + index + '.customText'" :rules="user.timeType.customTextStatus == 1 ? { required: true, message: '请填写' + yonghuUser.customTextName, trigger: ['change','blur'] } : null">
                             <el-input :disabled="!canEdit" v-model="domain.customText" style="width:75%;margin-right:7%" maxlength="25" show-word-limit></el-input>
                             <el-input :disabled="!canEdit" v-model="domain.customText" style="width:75%;margin-right:7%" maxlength="25" show-word-limit></el-input>
                         </el-form-item>
                         </el-form-item>
                         <!--项目管理专业版模式下,项目下的近期执行的任务 -->
                         <!--项目管理专业版模式下,项目下的近期执行的任务 -->
@@ -765,6 +765,9 @@
                         <el-option v-for="item in projectList"  :key="item.id" :label="item.projectName" :value="item.id"></el-option>
                         <el-option v-for="item in projectList"  :key="item.id" :label="item.projectName" :value="item.id"></el-option>
                     </el-select>
                     </el-select>
                 </el-form-item>
                 </el-form-item>
+                <el-form-item prop="departmentId" label="选择部门" v-if="permissions.reportsCompany">
+                    <el-cascader v-model="exportParam.departmentId" placeholder="全部部门" :options="departmentList" :props="{ checkStrictly: true, value: 'id' }" clearable style="width: 350px;"></el-cascader>
+                </el-form-item>
                 <el-form-item prop="projectId" label="日期范围">
                 <el-form-item prop="projectId" label="日期范围">
                     <el-date-picker
                     <el-date-picker
                         v-model="exportParam.dateRange" :editable="false" 
                         v-model="exportParam.dateRange" :editable="false" 
@@ -1307,7 +1310,7 @@
                 weekDay : ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
                 weekDay : ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
                 statusStyle:["waiting", "filledReportStyle", "RejectStyle", "waitSubmitStyle"],
                 statusStyle:["waiting", "filledReportStyle", "RejectStyle", "waitSubmitStyle"],
                 fillStatusList: [],
                 fillStatusList: [],
-                exportParam:{projectId: null, dateRange:[]},
+                exportParam:{projectId: null, dateRange:[], departmentId: null},
                 exportDialog:false,
                 exportDialog:false,
                 timeFields:['timeType', 'workingTime', 'startTime', 'progress'],
                 timeFields:['timeType', 'workingTime', 'startTime', 'progress'],
                 subProjectList:[],
                 subProjectList:[],
@@ -1458,7 +1461,8 @@
                 stateKey: '0',
                 stateKey: '0',
                 expandDate: [],
                 expandDate: [],
 
 
-                notifySelList:[]
+                notifySelList:[],
+                departmentList: []
             };
             };
         },
         },
         watch: {
         watch: {
@@ -2406,7 +2410,7 @@
             },
             },
 
 
             notifySel(sel){
             notifySel(sel){
-                console.log(sel);
+                // console.log(sel);
                 this.notifySelList = sel
                 this.notifySelList = sel
             },
             },
 
 
@@ -2612,6 +2616,8 @@
                 }
                 }
                 
                 
                 // 获取项目相关的维度
                 // 获取项目相关的维度
+                // domain.degreeId = null
+                this.$set(domain,'degreeId',null)
                 this.dimension(domain, index);
                 this.dimension(domain, index);
                 //获取项目下的任务分组
                 //获取项目下的任务分组
                 this.getTaskGroups(domain, index);
                 this.getTaskGroups(domain, index);
@@ -3053,12 +3059,13 @@
             getDepartment() {
             getDepartment() {
                 let day = (this.choseDay+1) > 9 ? "-" + (this.choseDay + 1) : "-0" + (this.choseDay + 1);
                 let day = (this.choseDay+1) > 9 ? "-" + (this.choseDay + 1) : "-0" + (this.choseDay + 1);
                 var param = {date:this.date + day};
                 var param = {date:this.date + day};
-                if (this.user.manageDeptId != 0 && !this.permissions.reportsCompany) {
+                if (this.user.manageDeptId != 0 && !this.permissions.reportsCompany && !this.permissions.reportsDept) {
                     param.manageDeptId = this.user.manageDeptId; 
                     param.manageDeptId = this.user.manageDeptId; 
                 }
                 }
                 this.http.post("/report/getMembList", param,
                 this.http.post("/report/getMembList", param,
                 res => {
                 res => {
                     if (res.code == "ok") {
                     if (res.code == "ok") {
+                        this.departmentList = JSON.parse(JSON.stringify(res.data))
                         var list = res.data , list1 = JSON.parse(JSON.stringify(res.data));
                         var list = res.data , list1 = JSON.parse(JSON.stringify(res.data));
                         // let noAllData = JSON.parse(JSON.stringify(res.data));
                         // let noAllData = JSON.parse(JSON.stringify(res.data));
                         // if (this.user.role > 0) {
                         // if (this.user.role > 0) {
@@ -3468,7 +3475,11 @@
                 if (this.exportParam.projectId != null) {
                 if (this.exportParam.projectId != null) {
                     param.projectId = this.exportParam.projectId;
                     param.projectId = this.exportParam.projectId;
                 }
                 }
+                if (this.exportParam.departmentId != null) {
+                    param.departmentId = this.exportParam.departmentId[this.exportParam.departmentId.length - 1]
+                }
                 param.stateKey = this.stateKey
                 param.stateKey = this.stateKey
+                // param.departmentId = this.user.departmentId
                 this.http.post( this.port.report.export, param,
                 this.http.post( this.port.report.export, param,
                 res => {
                 res => {
                     this.listLoading = false;
                     this.listLoading = false;
@@ -3651,7 +3662,7 @@
                             }
                             }
                             if(this.user.timeType.type == 1) {
                             if(this.user.timeType.type == 1) {
                                     var shuzhi = this.user.timeType.allday + ''
                                     var shuzhi = this.user.timeType.allday + ''
-                                    console.log('执行一次', shuzhi.indexOf('.'))
+                                    // console.log('执行一次', shuzhi.indexOf('.'))
                                     this.workForm.domains[0].workingTime = shuzhi.indexOf('.') == '-1' ? shuzhi + '.0' : shuzhi
                                     this.workForm.domains[0].workingTime = shuzhi.indexOf('.') == '-1' ? shuzhi + '.0' : shuzhi
                                 }
                                 }
                             if (this.timeBasecostList && this.timeBasecostList.length > 0) {
                             if (this.timeBasecostList && this.timeBasecostList.length > 0) {
@@ -3678,23 +3689,6 @@
             guanbi() {
             guanbi() {
                 this.falsss = false
                 this.falsss = false
             },
             },
-            // wuduLists(id) {
-            //     this.http.post('/project/getDegreeList',{ 
-            //         projectId: id,
-            //     },
-            //     res => {
-            //         if (res.code == "ok") {
-            //             return res.data
-            //         } 
-            //     },
-            //     error => {
-            //         this.$message({
-            //             message: error,
-            //             type: "error"
-            //         });
-            //         }
-            //     );
-            // },
 
 
             // 打开日报填写
             // 打开日报填写
             fillInReport(i, isBatch) {
             fillInReport(i, isBatch) {
@@ -3737,7 +3731,7 @@
                             }
                             }
                             if(this.user.timeType.type == 1) {
                             if(this.user.timeType.type == 1) {
                                 var shuzhi = this.user.timeType.allday + ''
                                 var shuzhi = this.user.timeType.allday + ''
-                                    console.log('执行二次')
+                                    // console.log('执行二次')
                                 this.workForm.domains[0].workingTime = shuzhi.indexOf('.') == '-1' ? shuzhi + '.0' : shuzhi
                                 this.workForm.domains[0].workingTime = shuzhi.indexOf('.') == '-1' ? shuzhi + '.0' : shuzhi
                             }
                             }
                             // console.log(this.workForm)
                             // console.log(this.workForm)
@@ -3826,13 +3820,33 @@
             // 按周填报里内容的填写点击确定
             // 按周填报里内容的填写点击确定
             btnTianxiaes() {
             btnTianxiaes() {
                 if (this.zhoBao.projectAuditorId) {
                 if (this.zhoBao.projectAuditorId) {
-                    this.tianxieDialogVisible = false
-                    var zhong = this.zhoData
-                    zhong[this.zhoBaoIdx][this.zhoBaoName] = this.zhoBao
-                    this.zhoData = zhong
-                    if(this.reportTimeType.type == 1) this.zhoXuan(this.zhoBao, this.zhoBaoIdx)
-                    if(this.reportTimeType.type == 2) this.zhoTimes(this.zhoBao, this.zhoBaoIdx)
-                    if(this.reportTimeType.type == 3) this.addBli(this.zhoBao, this.zhoBaoIdx)
+                    
+                    let errtips = ''
+                    if(this.user.timeType.customDegreeStatus == 1 && this.zhoBao.wuduList.length != 0 && !this.zhoBao.degreeId) {
+                        errtips += this.user.timeType.customDegreeName + '、'
+                    }
+                    if(this.user.timeType.customDataStatus == 1 && !this.zhoBao.customData){
+                        errtips += this.user.timeType.customDataName + '、'
+                    }
+                    if(this.user.timeType.customTextStatus == 1 && !this.zhoBao.customText){
+                        errtips += this.user.timeType.customTextName + '、'
+                    }
+                    if(errtips != ''){
+                        errtips = errtips.substring(0,errtips.length - 1)
+                        this.$message({
+                            message: '请对' + errtips + '进行填写',
+                            type: 'error'
+                        })
+                    }else {
+                        this.tianxieDialogVisible = false
+                        var zhong = this.zhoData
+                        zhong[this.zhoBaoIdx][this.zhoBaoName] = this.zhoBao
+                        this.zhoData = zhong
+                        if(this.reportTimeType.type == 1) this.zhoXuan(this.zhoBao, this.zhoBaoIdx)
+                        if(this.reportTimeType.type == 2) this.zhoTimes(this.zhoBao, this.zhoBaoIdx)
+                        if(this.reportTimeType.type == 3) this.addBli(this.zhoBao, this.zhoBaoIdx)
+                    }
+                    
                 } else {
                 } else {
                     this.$message({
                     this.$message({
                         message: '请选择审核人',
                         message: '请选择审核人',
@@ -3934,7 +3948,7 @@
                 }
                 }
                 this.zhoRqi[1] = this.dateChange(1, this.zhoRqi[1])
                 this.zhoRqi[1] = this.dateChange(1, this.zhoRqi[1])
                 
                 
-                console.log(this.zhoRqi[1]);
+                // console.log(this.zhoRqi[1]);
                 // console.log(this.zhoRqi[1])
                 // console.log(this.zhoRqi[1])
                 var obj = {}
                 var obj = {}
                 obj.zhoDataTime = this.zhoRqi[1]
                 obj.zhoDataTime = this.zhoRqi[1]

+ 22 - 7
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

@@ -183,12 +183,17 @@
 
 
         
         
         <!-- 审核记录弹窗 -->
         <!-- 审核记录弹窗 -->
-        <el-dialog title="审核记录" :visible.sync="recordDialogVisible" width="800px" :before-close="handleClose">
+        <el-dialog title="审核记录" :visible.sync="recordDialogVisible" width="1000px" :before-close="handleClose">
             <div style="height: 430px">
             <div style="height: 430px">
                 <el-table :data="recordLists" style="width: 100%" height="400">
                 <el-table :data="recordLists" style="width: 100%" height="400">
-                    <el-table-column prop="userName" label="操作人" width="150"></el-table-column>
-                    <el-table-column prop="indate" label="审核时间"></el-table-column>
-                    <el-table-column prop="result" label="审核结果"></el-table-column>
+                    <el-table-column prop="userName" label="操作人" width="120"></el-table-column>
+                    
+                    <el-table-column prop="indate" label="审核时间">
+                        <template slot-scope="scope">
+                            <span>{{tableIndateEdit(scope.row.indate)}}</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="result" label="审核结果" width="120"></el-table-column>
                     <el-table-column prop="date" label="员工/日期" width="200">
                     <el-table-column prop="date" label="员工/日期" width="200">
                         <template slot-scope="scope">
                         <template slot-scope="scope">
                             <div>
                             <div>
@@ -214,6 +219,7 @@
                             </div>
                             </div>
                         </template>
                         </template>
                     </el-table-column>
                     </el-table-column>
+                    <el-table-column prop="projectName" label="项目" width="200" show-overflow-tooltip></el-table-column>
                     <el-table-column prop="date" label="操作" width="100">
                     <el-table-column prop="date" label="操作" width="100">
                         <template slot-scope="scope">
                         <template slot-scope="scope">
                             <div>
                             <div>
@@ -239,7 +245,7 @@
         <!-- 审核记录撤销 -->
         <!-- 审核记录撤销 -->
         <el-dialog title="请输入原因"  v-if="undoFormDialog" :visible.sync="undoFormDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
         <el-dialog title="请输入原因"  v-if="undoFormDialog" :visible.sync="undoFormDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <div>
             <div>
-                <el-input type="textarea" v-model="undoForm.reason" rows="2" placeholder="请输入您决定撤销原因'" />
+                <el-input type="textarea" v-model="undoForm.reason" rows="2" placeholder="请输入您决定撤销原因" />
             </div>
             </div>
             <div slot="footer" class="dialog-footer">
             <div slot="footer" class="dialog-footer">
                 <el-button  @click="undoFormDialog = false" >取消</el-button>
                 <el-button  @click="undoFormDialog = false" >取消</el-button>
@@ -336,6 +342,15 @@
             }
             }
         },
         },
         methods: {
         methods: {
+            tableIndateEdit(row){
+                let indate = row[0] + '-' + (row[1] < 10 ? '0' + row[1] : row[1]) + '-' + (row[2] < 10 ? '0' + row[2] : row[2]) + ' ' + (row[3] < 10 ? '0' + row[3] : row[3]) + ':' + (row[4] < 10 ? '0' + row[4] : row[4])
+                if(row[5]){
+                    indate = indate + ':' + (row[5] < 10 ? '0' + row[5] : row[5])
+                }else{
+                    indate = indate + ':00'
+                }
+                return indate
+            },
             detailsClick(item, i) {
             detailsClick(item, i) {
                 this.detailsDialog = true
                 this.detailsDialog = true
                 this.detailsList = item.membdateList
                 this.detailsList = item.membdateList
@@ -372,8 +387,8 @@
             undoCli(item, i) {
             undoCli(item, i) {
                 console.log(item)
                 console.log(item)
                 this.undoFormDialog = true
                 this.undoFormDialog = true
-                this.undoForm = {}
-                this.undoForm.reason = ''
+                this.undoForm = {reason: ''}
+                // this.undoForm.reason = ''
                 this.undoForm.hisId = item.id
                 this.undoForm.hisId = item.id
                 this.ioss = i
                 this.ioss = i
                 // if(i == 0) {    
                 // if(i == 0) {    

+ 94 - 91
fhKeeper/formulahousekeeper/timesheet_h5/package-lock.json

@@ -1694,7 +1694,8 @@
         },
         },
         "ansi-regex": {
         "ansi-regex": {
           "version": "5.0.0",
           "version": "5.0.0",
-          "resolved": "",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
           "dev": true
         },
         },
         "semver": {
         "semver": {
@@ -1812,9 +1813,63 @@
         },
         },
         "ansi-regex": {
         "ansi-regex": {
           "version": "5.0.0",
           "version": "5.0.0",
-          "resolved": "",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
           "dev": true
         },
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "emojis-list": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
+          "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
         "minimist": {
         "minimist": {
           "version": "1.2.5",
           "version": "1.2.5",
           "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz",
           "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz",
@@ -1844,6 +1899,41 @@
           "requires": {
           "requires": {
             "ansi-regex": "^5.0.0"
             "ansi-regex": "^5.0.0"
           }
           }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
+          },
+          "dependencies": {
+            "chalk": {
+              "version": "4.1.2",
+              "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+              "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+              }
+            }
+          }
         }
         }
       }
       }
     },
     },
@@ -12025,94 +12115,6 @@
         }
         }
       }
       }
     },
     },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.8.3",
-      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
-      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hash-sum": "^2.0.0",
-        "loader-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "emojis-list": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
-          "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
     "vue-router": {
     "vue-router": {
       "version": "3.5.1",
       "version": "3.5.1",
       "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1617697843139&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",
       "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1617697843139&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",
@@ -13064,7 +13066,8 @@
       "dependencies": {
       "dependencies": {
         "ansi-regex": {
         "ansi-regex": {
           "version": "5.0.0",
           "version": "5.0.0",
-          "resolved": "",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
           "dev": true
         },
         },
         "cliui": {
         "cliui": {

+ 23 - 12
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -77,17 +77,15 @@
 
 
 
 
                     <!-- 相关维度 -->
                     <!-- 相关维度 -->
-                    <van-field :value="item.weiduName" v-if="item.projectId && user.timeType.customDegreeActive == 1"  readonly  name="id" clickable :label="user.timeType.customDegreeName" placeholder="请选择" @click="clickPickers(index)"/>
+                    <van-field :value="item.weiduName" v-if="item.projectId && user.timeType.customDegreeActive == 1"  readonly  name="id" clickable :label="user.timeType.customDegreeName" placeholder="请选择" @click="clickPickers(index,item)"/>
                     <van-popup v-model="item.showPickDegree" position="bottom">
                     <van-popup v-model="item.showPickDegree" position="bottom">
                         <van-picker show-toolbar :columns="item.wuduList" value-key="name" @confirm="choseProjects" @cancel="item.showPickDegree = false;$forceUpdate()" />
                         <van-picker show-toolbar :columns="item.wuduList" value-key="name" @confirm="choseProjects" @cancel="item.showPickDegree = false;$forceUpdate()" />
                     </van-popup>
                     </van-popup>
 
 
                     <!-- 自定义数值 -->
                     <!-- 自定义数值 -->
-                    <van-field v-if="user.timeType.customDataActive==1" type="number" :disabled="!canEdit" v-model="item.customData" :label="user.timeType.customDataName" 
-                         placeholder="请输入数字" ></van-field> 
+                    <van-field v-if="user.timeType.customDataActive==1" type="number" :disabled="!canEdit" v-model="item.customData" :label="user.timeType.customDataName" placeholder="请输入数字" :rules="user.timeType.customDataStatus == 1 ? [{ required: true, message: '请输入' + user.timeType.customDataName }] : []"></van-field> 
                     <!-- 自定义文本 -->
                     <!-- 自定义文本 -->
-                    <van-field v-if="user.timeType.customTextActive==1" :disabled="!canEdit" v-model="item.customText" :label="user.timeType.customTextName" 
-                         placeholder="请输入" maxlength="25"></van-field> 
+                    <van-field v-if="user.timeType.customTextActive==1" :disabled="!canEdit" v-model="item.customText" :label="user.timeType.customTextName" placeholder="请输入" maxlength="25" :rules="user.timeType.customTextStatus ? [{ required: true, message: '请选择' + user.timeType.customTextName }] : []"></van-field> 
 
 
                     <van-cell title="专业进度" v-if="user.company.packageEngineering == 1">
                     <van-cell title="专业进度" v-if="user.company.packageEngineering == 1">
                     </van-cell>
                     </van-cell>
@@ -474,6 +472,7 @@
                 //清空分组和阶段
                 //清空分组和阶段
                 domainItem.stage = null;
                 domainItem.stage = null;
                 domainItem.groupId = null;
                 domainItem.groupId = null;
+                domainItem.weiduName = null;
 
 
                 this.showPickerUserddp = false;
                 this.showPickerUserddp = false;
                 //获取子项目
                 //获取子项目
@@ -488,7 +487,7 @@
 
 
                 // 获取1相关维度
                 // 获取1相关维度
                 this.getTaskList(domainItem.projectId)
                 this.getTaskList(domainItem.projectId)
-
+                this.dimension(domainItem.projectId)
                 //获取相关日报提交选择人
                 //获取相关日报提交选择人
                 domainItem.projectAuditorId = null;
                 domainItem.projectAuditorId = null;
                 domainItem.projectAuditorName = null;
                 domainItem.projectAuditorName = null;
@@ -1020,6 +1019,8 @@
                 // console.log(i, item, this.form)
                 // console.log(i, item, this.form)
                 this.proIdx = i
                 this.proIdx = i
                 this.showPickerUserddp = true
                 this.showPickerUserddp = true
+                // console.log(item);
+                // this.dimension()
                 // this.$router.push({
                 // this.$router.push({
                 //     path: '/search',
                 //     path: '/search',
                 //     query: {
                 //     query: {
@@ -1029,12 +1030,14 @@
                 //     }
                 //     }
                 // });
                 // });
             },
             },
-            clickPickers(i) {
+            clickPickers(i,item) {
+                console.log('wudulist',item.wuduList);
                 if (!this.canEdit) return;
                 if (!this.canEdit) return;
                 this.clickIndex = i;
                 this.clickIndex = i;
-                this.form.domains[this.clickIndex].showPickDegree = true;
-                var proId = this.form.domains[this.clickIndex].projectId
-                this.dimension(proId)
+                // item.showPickDegree = true;
+                this.$set(item,'showPickDegree',true)
+                // var proId = this.form.domains[this.clickIndex].projectId
+                // this.dimension(proId)
             },
             },
             //选择任务
             //选择任务
             clickPickerTask(i) {
             clickPickerTask(i) {
@@ -1055,10 +1058,12 @@
 
 
             choseProjects(value, index) {
             choseProjects(value, index) {
                 // console.log(value)
                 // console.log(value)
+                if(value){
                 this.form.domains[this.clickIndex].weiduName = value.name;
                 this.form.domains[this.clickIndex].weiduName = value.name;
                 this.form.domains[this.clickIndex].degreeId = value.id;
                 this.form.domains[this.clickIndex].degreeId = value.id;
+                
+                this.$forceUpdate();}
                 this.form.domains[this.clickIndex].showPickDegree = false;
                 this.form.domains[this.clickIndex].showPickDegree = false;
-                this.$forceUpdate();
             },
             },
 
 
             choseSubProject(value, index) {
             choseSubProject(value, index) {
@@ -1318,7 +1323,13 @@
                         if(this.form.domains[i].degreeId) {
                         if(this.form.domains[i].degreeId) {
                             formData.append("degreeId", this.form.domains[i].degreeId);
                             formData.append("degreeId", this.form.domains[i].degreeId);
                         } else {
                         } else {
-                            formData.append("degreeId", -1);
+                            if(this.user.timeType.customDegreeStatus && this.form.domains[i].wuduList.length){
+                                this.$toast.fail('请选择' + this.user.timeType.customDegreeName)
+                                return
+                            }else{
+                                formData.append("degreeId", -1);
+                            }
+                            
                         }
                         }
                     } else {
                     } else {
                         formData.append("degreeId", -1);
                         formData.append("degreeId", -1);

+ 11 - 10
fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

@@ -3,17 +3,18 @@ const pxtorem = require("postcss-pxtorem");
 const path = require('path');
 const path = require('path');
 const themePath = path.resolve(__dirname,'src/assets/style/theme.less');
 const themePath = path.resolve(__dirname,'src/assets/style/theme.less');
 
 
-var ip = '192.168.2.39'
+// var ip = '47.100.37.243'
+// var ip = '192.168.2.30'
 // var ip = '127.0.0.1'
 // var ip = '127.0.0.1'
-// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
-// for (var i in ifaces) {
-//     for (var j in ifaces[i]) {
-//         var val = ifaces[i][j]
-//         if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
-//             ip = val.address
-//         }
-//     }
-// }
+var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+for (var i in ifaces) {
+    for (var j in ifaces[i]) {
+        var val = ifaces[i][j]
+        if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
+            ip = val.address
+        }
+    }
+}
 
 
 module.exports = {
 module.exports = {
     // 关闭eslint检查
     // 关闭eslint检查