ソースを参照

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

Lijy 2 年 前
コミット
1d58638b30
52 ファイル変更1601 行追加355 行削除
  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.management.platform.entity.Project;
 import com.management.platform.entity.ProjectRequirement;
+import com.management.platform.entity.Task;
 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.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
@@ -59,6 +57,8 @@ public class ProjectRequirementController {
     private ProjectRequirementService projectRequirementService;
     @Resource
     private TaskGroupMapper taskGroupMapper;
+    @Resource
+    private TaskMapper taskMapper;
 
     @RequestMapping("/addOrMod")
     public HttpRespMsg addOrMod(ProjectRequirement record) {
@@ -89,6 +89,15 @@ public class ProjectRequirementController {
             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<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);
         HashMap map = new HashMap();
         map.put("total", total);
@@ -106,8 +115,17 @@ public class ProjectRequirementController {
         now = now.minusDays(7);
         String startDate = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
         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<>();
-        String[] titleString={"项目编号","项目名称","近七日活跃人员","人员需求","任务需求","开始时间","结束时间"};
+        String[] titleString={"项目编号","项目名称","近七日活跃人员","人员需求","任务需求","合同要求","参与部门进度","里程碑进度","开始时间","结束时间"};
         List<String> nameList = Arrays.asList(titleString);
         dataList.add(nameList);
         projectRequirementList.forEach(pr->{
@@ -117,13 +135,24 @@ public class ProjectRequirementController {
             resultData.add(pr.getActiveUsers());
             resultData.add(pr.getMembReq());
             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){
                 String s=df.format(pr.getStartDate());
                 resultData.add(s);
+            }else {
+                resultData.add("");
             }
             if(pr.getEndDate()!=null){
                 String s1=df.format(pr.getEndDate());
                 resultData.add(s1);
+            }else {
+                resultData.add("");
             }
             dataList.add(resultData);
         });
@@ -176,12 +205,16 @@ public class ProjectRequirementController {
                 XSSFCell codeCell = row.getCell(0);
                 XSSFCell taskReqCell = row.getCell(1);
                 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 (taskReqCell != null)taskReqCell.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 (endDateCell != null)endDateCell.setCellType(CellType.NUMERIC);
                 ProjectRequirement projectRequirement=new ProjectRequirement();
@@ -198,8 +231,10 @@ public class ProjectRequirementController {
                 }else{
                     list.forEach(li->{
                         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){
                             projectRequirement.setStartDate(startDateCell.getDateCellValue());
                         }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
      */
     @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,
                                   @RequestParam Integer roleId, Double monthCost, Double cost,
                                   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,
-                    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)
     private String activeUsers;
 
+    @TableField("contract_req")
+    private String contractReq;
+
+    @TableField("department_speed")
+    private String departmentSpeed;
+
+    @TableField(exist = false)
+    private Task milepost;
+
+
 
     @Override
     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;
 
-import java.math.BigDecimal;
 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 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.management.platform.entity.vo.WorktimeItem;
 import lombok.Data;
@@ -18,6 +11,13 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 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>
  * 
@@ -333,7 +333,7 @@ public class Report extends Model<Report> {
 
 
     @Override
-    protected Serializable pkVal() {
+    protected Serializable pkVal(){
         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;
 
 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 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.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
 /**
  * <p>
  * 
  * </p>
  *
  * @author Seyason
- * @since 2022-03-24
+ * @since 2022-06-13
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -38,7 +37,6 @@ public class ReportAuditLog extends Model<ReportAuditLog> {
     private String userName;
 
     @TableField("indate")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
     private LocalDateTime indate;
 
     @TableField("company_id")
@@ -56,6 +54,8 @@ public class ReportAuditLog extends Model<ReportAuditLog> {
     @TableField("audit_channel")
     private Integer auditChannel;
 
+    @TableField("project_name")
+    private String projectName;
 
     @TableField(exist = false)
     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;
 
-import java.math.BigDecimal;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
-import com.baomidou.mybatisplus.annotation.TableId;
 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.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
 /**
  * <p>
  * 
@@ -110,6 +110,13 @@ public class TimeType extends Model<TimeType> {
     @TableField("custom_degree_name")
     private String customDegreeName;
 
+
+    /**
+     * 工时填报自定义维度是否必填
+     */
+    @TableField("custom_degree_status")
+    private Integer customDegreeStatus;
+
     /**
      * 提醒内容
      */
@@ -146,6 +153,13 @@ public class TimeType extends Model<TimeType> {
     @TableField("custom_data_name")
     private String customDataName;
 
+
+    /**
+     * 工时填报数值收集字段是否必填
+     */
+    @TableField("custom_data_status")
+    private Integer customDataStatus;
+
     /**
      * 财务成本导入是否需要审核
      */
@@ -200,6 +214,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("custom_text_name")
     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.TableId;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
-import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -21,7 +19,7 @@ import java.util.List;
  * </p>
  *
  * @author Seyason
- * @since 2022-04-15
+ * @since 2022-06-14
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -29,6 +27,7 @@ import java.util.List;
 public class User extends Model<User> {
 
     private static final long serialVersionUID=1L;
+
     /**
      * 主键 雪花算法生成
      */
@@ -167,28 +166,18 @@ public class User extends Model<User> {
     @TableField("corpwx_userid")
     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")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
     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")
     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)
     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<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);
 

+ 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("endDate") String endDate,
                                                      @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,
@@ -32,13 +33,14 @@ public interface ReportMapper extends BaseMapper<Report> {
                                                      @Param("leaderId") String leaderId,
                                                      @Param("endDate") String endDate,
                                                      @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,
                                                              @Param("companyId") Integer companyId,
                                                              @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);

+ 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;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.management.platform.entity.Task;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.management.platform.entity.TimeTask;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Update;
-import org.apache.poi.ss.formula.functions.T;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * <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}")
     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> {
     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);
 

+ 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,
                            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);
 

+ 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
                     .getCostByUser(null, startDate, endDate, companyId, allUserIds);
             Map<String, List<Map<String, Object>>> tempMap = new HashMap<>();
+            List<String> names = new ArrayList<>();
             BigDecimal totalCostMoney = new BigDecimal(0);
             for (Map<String, Object> map : list) {
                 if (tempMap.containsKey(map.get("user"))) {
@@ -414,6 +415,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                     dataMap.put("time", time);
                     tempList.add(dataMap);
                 } else {
+                    names.add((String)map.get("user"));
                     //这个名字尚未装进数组中
                     List<Map<String, Object>> tempList = new ArrayList<>();
                     if (map.containsKey("project")) {
@@ -438,7 +440,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             dataList.add(titleList);
             BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
             double totalCostTime = 0;
-            for (String key : tempMap.keySet()) {
+            for (String key : names) {
                 Map<String, Object> map = new HashMap<>();
                 map.put("name", 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();
             User user = userMapper.selectById(request.getHeader("TOKEN"));
             List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
+            boolean hasDeptWorktimePriv = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看本部门工时").size() > 0;
             List<Integer> deptIds = null;
             if (functionList.size() == 0) {
                 deptIds = new ArrayList<>();
                 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> 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) {
                         deptIds.add(dept.getDepartmentId());
                         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);
             }
-            //检查是否有删除的,需要删除掉
-            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) {
                 List<Report> reportList = reportMapper.selectSimpleTime(companyId, startStr, endStr);
                 if (reportList.size() > 0) {
+                    List<Report> updateReportList = new ArrayList<>();
                     for (Report r : reportList) {
                         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);
                     map.put("membList", membList);
                     for (Map<String, Object> membMap : membList) {
+                        double pTotalTime = 0;
+                        BigDecimal pTotalMoney = new BigDecimal(0);
                         List<String> membRowData = new ArrayList<String>();
                         if (projectSum == null || projectSum == false) {
                             membRowData.add((String)map.get("projectCode"));
@@ -812,7 +814,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 sumRow.add(totalMoneyCost.toString());
                 allList.add(sumRow);
             }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> projectIds = list.stream().map(mp -> mp.get("id")).collect(Collectors.toList());
                 List<String> headList = new ArrayList<String>();
@@ -826,7 +828,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 allList=new ArrayList<>();
                 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) {
                     BigDecimal moneyCost = BigDecimal.valueOf(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("costMoney")));
                             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{
                             membRowData.add("");
                             membRowData.add("");
@@ -2971,7 +2973,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 sumRow.add(totalMoneyCost.toString());
                 allList.add(sumRow);
             }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> projectCategorys = list.stream().map(mp -> mp.get("category")).collect(Collectors.toList());
                 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("工时/合计");
+                headList.add("成本/合计");
                 allList=new ArrayList<>();
                 allList.add(headList);
                 //统计当前所有项目所有人的时间成本投入
                 List<Map<String, Object>> membList = projectMapper.getProjectCostGroupByCategory(companyId,startDate,endDate, projectCategoryId,userId);
                 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<String> membRowData=new ArrayList<>();
                     membRowData.add(user.getName());
@@ -2994,18 +2999,22 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         if(resultList.size()>0){
                             membRowData.add(String.valueOf(resultList.get(0).get("cost")));
                             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{
                             membRowData.add("");
                             membRowData.add("");
                         }
                     }
+                    membRowData.add(""+new BigDecimal(costTime).setScale(1, BigDecimal.ROUND_HALF_UP));
+                    membRowData.add(moneyCost.toString());
                     if(mapList.size()>0){
                         allList.add(membRowData);
                     }
                 }
             }
             //生成excel文件导出
-            String fileName = "项目成本工时统计_"+System.currentTimeMillis();
+            String fileName = "项目分类工时成本统计_"+System.currentTimeMillis();
             String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
             httpRespMsg.data = resp;
         } 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("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()));
                     //查找当前部门经理负责的部门
@@ -218,7 +218,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         queryDeptList = allDepts.stream().filter(dp->dp.getDepartmentId().equals(deptId)).collect(Collectors.toList());
                     } else {
                         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) {
@@ -231,7 +231,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
                         List ids = deptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
                         nameList = reportMapper.getReportNameByDateAndDept(date,
-                                ids, null, null);
+                                ids, targetUid, null);
 
                         if (nameList.size() > 0) {
                             List<String> userIds = new ArrayList<>();
@@ -1012,7 +1012,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     } else {
                         Report report = reportMapper.selectById(ids.get(0));
                         //部门待审核,部门审核通过
-                        if (report.getDepartmentAuditState() == 0) {
+                        if (report.getDepartmentAuditState() == 0){
                             report = new Report();
                             report.setDepartmentAuditState(1);
                             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-导入审核, 项目报告审核
                 ReportAuditLog log = new ReportAuditLog();
@@ -1163,6 +1166,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 log.setResult("通过");
                 log.setUserId(user.getId());
                 log.setUserName(user.getName());
+                log.setProjectName(pNames);
                 reportAuditLogMapper.insert(log);
                 //员工的日期
                 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));
-
             //对导入审核,添加记录
             int channel = oldState == -1?0:1; //0-导入审核, 项目报告审核
             ReportAuditLog log = new ReportAuditLog();
@@ -1379,6 +1382,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             log.setResult("驳回"+(StringUtils.isEmpty(reason)?"":"("+reason+")"));
             log.setUserId(user.getId());
             log.setUserName(user.getName());
+            log.setProjectName(pNames);
             reportAuditLogMapper.insert(log);
             //员工的日期
             ReportAlogMembdate membdate = new ReportAlogMembdate();
@@ -1475,6 +1479,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         HttpRespMsg departmentList = departmentService.getDepartmentList(request);
         List<DepartmentVO> list = (List<DepartmentVO>) departmentList.data;
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(curUser.getRoleId(), "查看全公司工时");
+        boolean hasDeptWorktimePriv = sysFunctionMapper.getRoleFunctions(curUser.getRoleId(), "查看本部门工时").size() > 0;
         if (functionList.size() > 0) {
             //查看全部的
             //加上未分配的部门
@@ -1482,9 +1487,20 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             unAssignedDept.setId(0);
             unAssignedDept.setLabel("未分配");
             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));
+            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) {
                 list = getSpecifiedDept(list, manageDeptId);
             } else {
@@ -1510,6 +1526,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             
             if (first.isPresent()) {
                 user.put("state", first.get().get("state"));
+                user.put("workingTime", first.get().get("workingTime"));
             }
             userMapList.add(user);
         }
@@ -1659,9 +1676,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                     System.out.println("没有其他等待的项目了,继续更新到下个流程");
                                     //没有其他待审核的项目了,流程往下走
                                     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());
                                             if (curReport.getIsDeptAudit() == 1) {
                                                 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());
                                             }
                                             curReport.setIsFinalAudit(nextNode.getIsFinal());
-                                            System.out.println("设置下个流程节点:部门审核=" + nextNode.getIsDeptAudit());
                                             upR = curReport;
                                             break;
                                         }
@@ -1705,7 +1721,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     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-导入审核, 项目报告审核
             //需要进行审核记录保存
             ReportAuditLog log = new ReportAuditLog();
@@ -1714,6 +1733,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             log.setResult("批量通过");
             log.setUserId(user.getId());
             log.setUserName(user.getName());
+            log.setProjectName(s);
             reportAuditLogMapper.insert(log);
             //当前所有员工的日期
             List<ReportAlogMembdate> membList = new ArrayList<>();
@@ -1783,7 +1803,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         item.setAuditState(2);
                         reportProfessionProgressService.update(item, new QueryWrapper<ReportProfessionProgress>().in("report_id", ids).in("profession_id", collect));
                     }
-
                 } else {
                     Report report = reportMapper.selectById(ids.get(0));
                     //部门待审核,部门审核驳回
@@ -1799,12 +1818,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         int oldState = oneReport.getState();
         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();
         log.setAuditChannel(channel);//导入审核
         log.setCompanyId(company.getId());
         log.setResult("批量驳回");
         log.setUserId(user.getId());
         log.setUserName(user.getName());
+        log.setProjectName(s);
         reportAuditLogMapper.insert(log);
         List<Report> allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
         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(), "查看全公司工时");
         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> 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<>();
                 for (Department dp : myDeptList) {
                     subDepts.addAll(getSubDepts(dp, allDepts));
@@ -2585,7 +2611,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
     //导出报告
     @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();
         try {
             String userId = request.getHeader("Token");
@@ -2626,6 +2652,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if (timeType.getCustomTextActive() == 1) {
                 titles.add(timeType.getCustomTextName());
             }
+            //项目管理专业版,需要显示任务分组和投入阶段
+            if (company.getPackageProject() == 1) {
+                titles.add("任务分组");
+                titles.add("投入阶段");
+            }
             if (timeType.getShowFillauditTime() == 1) {
                 titles.add("填写时间");
                 titles.add("审核人");
@@ -2682,28 +2713,30 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             int rowNum = 1;
             List<HashMap<String, Object>> allReportByDate = null;
             List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
+            boolean hasDeptWorktimePriv = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看本部门工时").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> 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<>();
                     allSubDepts.addAll(deptList);
                     for (Department dept: deptList) {
                         allSubDepts.addAll(getSubDepts(dept, allDeptList));
                     }
                     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;
                 //检查是否是项目负责人
                 int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", user.getId()));
                 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 {
                     //普通员工只能看自己的
-                    reportsFromProjects = reportMapper.getAllReportByDate(startDate, null, user.getId(), endDate, projectId,stateKey);
+                    reportsFromProjects = reportMapper.getAllReportByDate(startDate, null, user.getId(), endDate, projectId,stateKey,departmentId);
                 }
                 if (allReportByDate == null) {
                     allReportByDate = reportsFromProjects;
@@ -2723,7 +2756,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 //            }
             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) {
                 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():"");
                     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) {
                     row.createCell(index).setCellValue(sdf.format((Date)map.get("time")));
                     index++;
@@ -2833,9 +2873,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
 
                     index++;
-//                    titles.add("填写时间");
-//                    titles.add("审核人");
-//                    titles.add("审核时间");
                 }
                 row.createCell(index).setCellValue((String) map.get("content"));
                 index++;
@@ -3040,11 +3077,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         List<Map<String, Object>> list = null;
         //分角色权限:管理员看全部的,部门负责人看自己部门的,个人只能看自己的。
         List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全公司工时");
+        boolean hasDeptWorktimePriv = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看本部门工时").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> 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<>();
                 for (Department dp : myDeptList) {
                     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;
     @Resource
     private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private UserCustomMapper userCustomMapper;
     //登录网页端
     @Override
     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);
                 });
             }
+            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("total", total);
             httpRespMsg.data = resultMap;
@@ -591,7 +619,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     //新增或修改用户
     @Override
     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();
         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         try {
@@ -629,7 +658,13 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                                 .setDepartmentId(departmentId == null ? 0 : departmentId)
                                 .setDepartmentCascade(departmentId == null ?
                                         convertDepartmentIdToCascade(0) :
-                                        convertDepartmentIdToCascade(departmentId));
+                                        convertDepartmentIdToCascade(departmentId))
+                                .setSuperiorId(superiorId)
+                                .setPlate1(plate1)
+                                .setPlate2(plate2)
+                                .setPlate3(plate3)
+                                .setPlate4(plate4)
+                                .setPlate5(plate5);
                         if(inductionDate!=null&&inductionDate!=""){
                             user.setInductionDate(LocalDate.parse(inductionDate,dtf));
                         }
@@ -682,7 +717,13 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         .setDepartmentId(departmentId == null ? 0 : departmentId)
                         .setDepartmentCascade(departmentId == null ?
                                 convertDepartmentIdToCascade(0) :
-                                convertDepartmentIdToCascade(departmentId)));
+                                convertDepartmentIdToCascade(departmentId))
+                        .setSuperiorId(superiorId)
+                        .setPlate1(plate1)
+                        .setPlate2(plate2)
+                        .setPlate3(plate3)
+                        .setPlate4(plate4)
+                        .setPlate5(plate5));
                 if (salaryChange) {
                     UserSalary userSalary = UserSalary.copyFromUser(oldUser);
                     userSalaryMapper.insert(userSalary);

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

@@ -9,13 +9,13 @@ spring:
     multipart:
       # 配置上传文件的大小设置
       # Single file max size  即单个文件大小
-      max-file-size: 10000MB
-      max-request-size: 10000MB
+      max-file-size: 100MB
+      max-request-size: 100MB
   datasource:
     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
-    password: p011430seya1026
+    password: HuoshiDB@2022
     hikari:
       maximum-pool-size: 10
       minimum-idle: 3
@@ -24,8 +24,8 @@ spring:
     #######redis配置######
     # redis
     redis:
-      host: 118.190.47.230
-      port: 6379
+      host: 127.0.0.1
+      port: 6479
       timeout: 3
       # password:
       pool:
@@ -48,11 +48,11 @@ spring:
 logging:
   level:
     root: info
-    org.mybatis: debug
-    java.sql: debug
-    org.springframework.web: trace
+    org.mybatis: error
+    java.sql: error
+    org.springframework.web: error
     #打印sql语句
-    com.management.platform.mapper: debug
+    com.management.platform.mapper: error
   path: /log/
   file: worktime.log
 ##########
@@ -80,9 +80,26 @@ mybatis:
   mapper-locations: mappers/*Mapper.xml
 #####配置图片上传路径####
 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">
             AND b.create_date between #{startDate} and #{endDate}
         </if>
-        GROUP BY b.project_id, a.id
+        GROUP BY b.project_id, a.id order by a.department_id
     </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 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
         JOIN user AS b ON a.creator_id = b.id
         left join department on department.department_id = a.dept_id
@@ -256,14 +256,17 @@
         <if test="startDate != null and endDate != null">
             AND a.create_date between #{startDate} and #{endDate}
         </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
     </select>
 
 
     <!--获取个人每个项目分类分别需要的工时-->
     <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
         JOIN user AS b ON a.creator_id = b.id
         left join department on department.department_id = a.dept_id
@@ -278,7 +281,7 @@
         <if test="userId != null">
             AND a.creator_id = #{userId}
         </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
     </select>
 

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

@@ -30,7 +30,7 @@
     </sql>
 
     <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
         FROM project LEFT JOIN project_requirement ON project.id = project_requirement.`project_id`
         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="result" property="result" />
         <result column="audit_channel" property="auditChannel" />
+        <result column="project_name" property="projectName" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <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>
 
 </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,
         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.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
         ,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
@@ -85,6 +85,9 @@
         <if test="userId != null">
             AND a.creator_id = #{userId}
         </if>
+        <if test="departmentId != null">
+            AND department.department_id = #{departmentId}
+        </if>
 
         ORDER BY a.creator_id, a.create_date desc
     </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,
         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.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
         ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours, a.custom_text as customText
         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.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
@@ -156,6 +159,9 @@
         <if test="leaderId != null">
             AND b.incharger_id = #{leaderId}
         </if>
+        <if test="departmentId != null">
+            AND department.department_id = #{departmentId}
+        </if>
 
         ORDER BY a.creator_id, a.create_date desc
     </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,
         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.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
         ,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
@@ -189,6 +195,9 @@
         <if test="projectId != null">
             AND a.project_id = #{projectId}
         </if>
+        <if test="departmentId != null">
+            AND department.department_id = #{departmentId}
+        </if>
         <if test="deptIds != null">
             AND c.department_id in
             <foreach collection="deptIds" item="deptId" separator="," close=")" open="(" index="index">
@@ -359,7 +368,7 @@
 
     <!--根据日期获取报告上传人-->
     <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
         JOIN user AS b ON a.creator_id=b.id
         left join project on project.id = a.project_id
@@ -373,6 +382,7 @@
         <if test="leaderId != null and leaderId != ''">
             AND (a.project_auditor_id = #{leaderId} or project.incharger_id = #{leaderId})
         </if>
+        group by a.creator_id
     </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>
         and task_status = 0 order by task.id desc limit 50
     </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>

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

@@ -18,12 +18,14 @@
         <result column="fill_months" property="fillMonths" />
         <result column="custom_degree_active" property="customDegreeActive" />
         <result column="custom_degree_name" property="customDegreeName" />
+        <result column="custom_degree_status" property="customDegreeStatus" />
         <result column="alert_msg" property="alertMsg" />
         <result column="sync_corpwx_time" property="syncCorpwxTime" />
         <result column="need_dept_audit" property="needDeptAudit" />
         <result column="report_workflow" property="reportWorkflow" />
         <result column="custom_data_active" property="customDataActive" />
         <result column="custom_data_name" property="customDataName" />
+        <result column="custom_data_status" property="customDataStatus" />
         <result column="finance_audit" property="financeAudit" />
         <result column="overtime_ratio" property="overtimeRatio" />
         <result column="sync_dingding" property="syncDingding" />
@@ -33,6 +35,7 @@
         <result column="show_corpwx_cardtime" property="showCorpwxCardtime" />
         <result column="custom_text_active" property="customTextActive" />
         <result column="custom_text_name" property="customTextName" />
+        <result column="custom_text_status" property="customTextStatus" />
         <result column="lock_worktime" property="lockWorktime" />
         <result column="fill_overtime" property="fillOvertime" />
         <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_unionid" property="dingdingUnionid" />
         <result column="corpwx_userid" property="corpwxUserid" />
+        <result column="induction_date" property="inductionDate" />
         <result column="inactive_date" property="inactiveDate" />
         <result column="position" property="position" />
         <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 id="BaseResultMap2" type="com.management.platform.entity.User">
         <id column="id" property="id" />
@@ -39,13 +46,13 @@
     </resultMap>
     <!-- 通用查询结果列 -->
     <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>
     <!--单独分页获取人员-->
     <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,
         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
         LEFT JOIN department AS b ON a.department_id = b.department_id
         WHERE a.company_id = #{companyId}
@@ -67,7 +74,7 @@
     <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,
         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
         LEFT JOIN department AS b ON a.department_id = b.department_id
         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
         ${ew.customSqlSegment}
     </select>
+
 </mapper>

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

@@ -1,18 +1,18 @@
 var path = require('path')
 
 //  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 = {
   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, // 代填日报 //
         reportsDeleteAll: false, // 删除全公司日报
         importReport: false, //导入工时lij
+        reportsDept: false, //查看本部门工时
 
         // 财务核算成本 
         financialCustom: false, // 自定义薪资项 // 
@@ -95,6 +96,7 @@ const StringUtil = {
         arr[i] == '导出人员' ? obj.structureExport = true : ''
         arr[i] == '导入人员' ? obj.structureImport = true : ''
         arr[i] == '查看全公司工时' ? obj.reportsCompany = true : ''
+        arr[i] == '查看本部门工时' ? obj.reportsDept = true : ''
         arr[i] == '查看相关人员工时' ? obj.reportsPersonnel = true : ''
         arr[i] == '代填日报' ? obj.reportsFillOut = 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 style="float:right;" v-if="permissions.projectImport || permissions.projectExport || permissions.projectClassification || (user.company.packageProject == 1 && permissions.projectCostOfItems)">
                     <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-item v-if="permissions.projectImport">
                                 <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-dropdown-item>
                             <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 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 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 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-menu>
                         </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>
         </template>
       </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="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">
         <template slot-scope="scope">
           <el-button @click="demandEdit(scope.row)" size="small">修改</el-button>
@@ -129,6 +136,12 @@
       <el-form-item label="任务需求">
         <el-input style="width:350px" v-model="editParameter.taskReq" clearable></el-input>
       </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>
     <div slot="footer" class="dialog-footer">
               <el-button type="default" @click="demandEditDialog = false">取消</el-button>
@@ -305,6 +318,7 @@ export default {
 
       handleSizeChange(val){
         this.pageSize = val
+        this.pageIndex = 1
         this.getDemandList()
       },
       handleCurrentChange(val){
@@ -325,6 +339,7 @@ export default {
         this.editParameter.endDate = this.editDate2
         delete this.editParameter.reStartDate
         delete this.editParameter.reEndDate
+        delete this.editParameter.milepost
         this.http.post('/project-requirement/addOrMod',this.editParameter,
         res => {
           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="可填报加班时长" />
                 <template v-if="timeType.fillOvertime">
                 <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>
                 </template>
             </el-form-item>
@@ -191,7 +191,7 @@
                     </el-form>
                     <div class="underpanel">
                         <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>
                         </div>
                         <div class="whiteList_content">
@@ -224,6 +224,10 @@
             <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>
             <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>
         <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" >
@@ -244,6 +248,10 @@
             <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>
             <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>
         <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" >
@@ -262,6 +270,10 @@
             <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>
             <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>
         <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" >
@@ -891,6 +903,10 @@
                             }
                         }
                         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, '将要提交的值')
                         // return
                         this.http.post('/time-type/save',param,
@@ -933,6 +949,9 @@
                             this.timeType = res.data;
                             this.timeType.fillOvertime = this.timeType.fillOvertime ? 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();
                             let userlist = res.data.userList
                             this.whiteList = []
@@ -1018,7 +1037,7 @@
     top: -12px;
 }
 .underpanel .whiteList_head{
-    padding: 5px 0 0 5px;
+    padding: 5px 0 0 0;
     height: 24px;
 }
 .underpanel .whiteList_content{

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

@@ -51,27 +51,23 @@
                     <el-form-item>
                         <div style="color:#999;font-size:13px;">共{{total}}人</div>
                     </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-link type="primary" :underline="false" @click="showExportDialog">导出人员</el-link>
                     </el-form-item>
                     <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-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-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 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-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> -->
                     <!-- <el-form-item style="float:right;">
@@ -261,6 +257,14 @@
                     <el-cascader v-model="insertForm.departmentId" placeholder="请选择部门" style="width: 100%"
                     :options="option" :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false"  clearable></el-cascader>
                 </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-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">
@@ -269,6 +273,13 @@
                         </el-option>
                     </el-select>
                 </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-date-picker v-model="insertForm.inductionDate" value-format="yyyy-MM-dd"></el-date-picker>
                 </el-form-item>
@@ -276,7 +287,7 @@
                     <el-input v-model="insertForm.position" placeholder="请输入岗位职级别" clearable></el-input>
                 </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="moreList">
                         <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>
             </span>
         </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>
 </template>
 
@@ -519,7 +596,8 @@
                     costApplyDate: '2021-04-09',
                     inductionDate: '2021-04-09',
                     position: '',
-                    certJson: []
+                    certJson: [],
+                    plateMap:{}
                 },
                 rules: {
                     name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
@@ -592,7 +670,28 @@
                 },
                 managementTableData: [],
                 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: {
@@ -608,6 +707,267 @@
             that = this;
         },
         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){
                 // if (e.length == 0) {
@@ -1002,7 +1362,10 @@
                         }
                     );
             },
-
+            
+            importUserC(){
+                this.importDialog = true
+            },
             // 批量导入人员
             importUser(item) {
                 //首先判断文件类型
@@ -1017,9 +1380,10 @@
                     this.listLoading = true;
                     let formData = new FormData();
                     formData.append("file", item.file);
-                    
+                    this.importingData = true
                     this.http.uploadFile( this.port.manage.import, formData,
                     res => {
+                        this.importingData = false
                         this.$refs.upload.clearFiles();
                         this.listLoading = false;
                         if (res.code == "ok") {
@@ -1037,6 +1401,7 @@
                         }
                     },
                     error => {
+                        this.importingData = false
                         this.$refs.upload.clearFiles();
                         this.listLoading = false;
                         this.$message({
@@ -1171,8 +1536,16 @@
                                 costApplyDate: res.data.costApplyDate,
                                 inductionDate: res.data.inductionDate,
                                 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 {
                             this.$message({
                                 message: res.msg,
@@ -1204,8 +1577,17 @@
                         inductionDate: util.formatDate.format(new Date(), 'yyyy-MM-dd'),
                         position: '',
                         certJson: [],
+                        plateMap: {},
+                        plate1: null,
+                        plate2: null,
+                        plate3: null,
+                        plate4: null,
+                        plate5: null,
                     };
                     this.title = "新增人员"
+                    this.getUserCustomConfig()
+                    // this.insertForm.plateMap['定义测试文本'] = '测试文本'
+                    console.log('insertForm123',this.insertForm);
                 }
                 this.dialogVisible = true;
             },
@@ -1249,11 +1631,29 @@
                             position: this.insertForm.position,
                             certJson: JSON.stringify(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) {
                             form.id = this.insertForm.id;
                         }
+                        if (this.insertForm.superiorId){
+                            form.superiorId = this.insertForm.superiorId
+                        }
                         if (this.insertForm.costApplyDate != null) {
                             form.costApplyDate = this.insertForm.costApplyDate;
                         }

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

@@ -34,7 +34,7 @@
                 </div>
                 </div>
                 <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;">
                         <el-select v-model="selectState" size="small" @change="stateChange" >
                         <el-option value="-1" label="全部状态" >全部状态</el-option>
@@ -77,7 +77,7 @@
                     <div class="report_title" >
                         
                         <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">
                          - 已填写
                         <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-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-option v-for="item in domain.wuduList" :key="item.value" :label="item.name" :value="item.id">
                             </el-option>
                         </el-select>
                     </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-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-form-item>
                     <el-form-item v-if="reportTimeType.type == 3" label="用时占比" :prop="'domains.' + index + '.'+timeFields[reportTimeType.type]"
@@ -493,18 +493,18 @@
                             </span>
                         </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-option v-for="item in domain.wuduList" :key="item.value" :label="item.name" :value="item.id">
                                 </el-option>
                             </el-select>
                         </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-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-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-select>
                 </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-date-picker
                         v-model="exportParam.dateRange" :editable="false" 
@@ -1307,7 +1310,7 @@
                 weekDay : ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
                 statusStyle:["waiting", "filledReportStyle", "RejectStyle", "waitSubmitStyle"],
                 fillStatusList: [],
-                exportParam:{projectId: null, dateRange:[]},
+                exportParam:{projectId: null, dateRange:[], departmentId: null},
                 exportDialog:false,
                 timeFields:['timeType', 'workingTime', 'startTime', 'progress'],
                 subProjectList:[],
@@ -1458,7 +1461,8 @@
                 stateKey: '0',
                 expandDate: [],
 
-                notifySelList:[]
+                notifySelList:[],
+                departmentList: []
             };
         },
         watch: {
@@ -2406,7 +2410,7 @@
             },
 
             notifySel(sel){
-                console.log(sel);
+                // console.log(sel);
                 this.notifySelList = sel
             },
 
@@ -2612,6 +2616,8 @@
                 }
                 
                 // 获取项目相关的维度
+                // domain.degreeId = null
+                this.$set(domain,'degreeId',null)
                 this.dimension(domain, index);
                 //获取项目下的任务分组
                 this.getTaskGroups(domain, index);
@@ -3053,12 +3059,13 @@
             getDepartment() {
                 let day = (this.choseDay+1) > 9 ? "-" + (this.choseDay + 1) : "-0" + (this.choseDay + 1);
                 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; 
                 }
                 this.http.post("/report/getMembList", param,
                 res => {
                     if (res.code == "ok") {
+                        this.departmentList = 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));
                         // if (this.user.role > 0) {
@@ -3468,7 +3475,11 @@
                 if (this.exportParam.projectId != null) {
                     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.departmentId = this.user.departmentId
                 this.http.post( this.port.report.export, param,
                 res => {
                     this.listLoading = false;
@@ -3651,7 +3662,7 @@
                             }
                             if(this.user.timeType.type == 1) {
                                     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
                                 }
                             if (this.timeBasecostList && this.timeBasecostList.length > 0) {
@@ -3678,23 +3689,6 @@
             guanbi() {
                 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) {
@@ -3737,7 +3731,7 @@
                             }
                             if(this.user.timeType.type == 1) {
                                 var shuzhi = this.user.timeType.allday + ''
-                                    console.log('执行二次')
+                                    // console.log('执行二次')
                                 this.workForm.domains[0].workingTime = shuzhi.indexOf('.') == '-1' ? shuzhi + '.0' : shuzhi
                             }
                             // console.log(this.workForm)
@@ -3826,13 +3820,33 @@
             // 按周填报里内容的填写点击确定
             btnTianxiaes() {
                 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 {
                     this.$message({
                         message: '请选择审核人',
@@ -3934,7 +3948,7 @@
                 }
                 this.zhoRqi[1] = this.dateChange(1, this.zhoRqi[1])
                 
-                console.log(this.zhoRqi[1]);
+                // console.log(this.zhoRqi[1]);
                 // console.log(this.zhoRqi[1])
                 var obj = {}
                 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">
                 <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">
                         <template slot-scope="scope">
                             <div>
@@ -214,6 +219,7 @@
                             </div>
                         </template>
                     </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">
                         <template slot-scope="scope">
                             <div>
@@ -239,7 +245,7 @@
         <!-- 审核记录撤销 -->
         <el-dialog title="请输入原因"  v-if="undoFormDialog" :visible.sync="undoFormDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <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 slot="footer" class="dialog-footer">
                 <el-button  @click="undoFormDialog = false" >取消</el-button>
@@ -336,6 +342,15 @@
             }
         },
         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) {
                 this.detailsDialog = true
                 this.detailsList = item.membdateList
@@ -372,8 +387,8 @@
             undoCli(item, i) {
                 console.log(item)
                 this.undoFormDialog = true
-                this.undoForm = {}
-                this.undoForm.reason = ''
+                this.undoForm = {reason: ''}
+                // this.undoForm.reason = ''
                 this.undoForm.hisId = item.id
                 this.ioss = i
                 // if(i == 0) {    

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

@@ -1694,7 +1694,8 @@
         },
         "ansi-regex": {
           "version": "5.0.0",
-          "resolved": "",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
         },
         "semver": {
@@ -1812,9 +1813,63 @@
         },
         "ansi-regex": {
           "version": "5.0.0",
-          "resolved": "",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "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": {
           "version": "1.2.5",
           "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz",
@@ -1844,6 +1899,41 @@
           "requires": {
             "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": {
       "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",
@@ -13064,7 +13066,8 @@
       "dependencies": {
         "ansi-regex": {
           "version": "5.0.0",
-          "resolved": "",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
         },
         "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-picker show-toolbar :columns="item.wuduList" value-key="name" @confirm="choseProjects" @cancel="item.showPickDegree = false;$forceUpdate()" />
                     </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>
@@ -474,6 +472,7 @@
                 //清空分组和阶段
                 domainItem.stage = null;
                 domainItem.groupId = null;
+                domainItem.weiduName = null;
 
                 this.showPickerUserddp = false;
                 //获取子项目
@@ -488,7 +487,7 @@
 
                 // 获取1相关维度
                 this.getTaskList(domainItem.projectId)
-
+                this.dimension(domainItem.projectId)
                 //获取相关日报提交选择人
                 domainItem.projectAuditorId = null;
                 domainItem.projectAuditorName = null;
@@ -1020,6 +1019,8 @@
                 // console.log(i, item, this.form)
                 this.proIdx = i
                 this.showPickerUserddp = true
+                // console.log(item);
+                // this.dimension()
                 // this.$router.push({
                 //     path: '/search',
                 //     query: {
@@ -1029,12 +1030,14 @@
                 //     }
                 // });
             },
-            clickPickers(i) {
+            clickPickers(i,item) {
+                console.log('wudulist',item.wuduList);
                 if (!this.canEdit) return;
                 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) {
@@ -1055,10 +1058,12 @@
 
             choseProjects(value, index) {
                 // console.log(value)
+                if(value){
                 this.form.domains[this.clickIndex].weiduName = value.name;
                 this.form.domains[this.clickIndex].degreeId = value.id;
+                
+                this.$forceUpdate();}
                 this.form.domains[this.clickIndex].showPickDegree = false;
-                this.$forceUpdate();
             },
 
             choseSubProject(value, index) {
@@ -1318,7 +1323,13 @@
                         if(this.form.domains[i].degreeId) {
                             formData.append("degreeId", this.form.domains[i].degreeId);
                         } 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 {
                         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 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 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 = {
     // 关闭eslint检查