Przeglądaj źródła

加班录入时长

seyason 3 lat temu
rodzic
commit
92f428550d
38 zmienionych plików z 658 dodań i 101 usunięć
  1. 105 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyCertController.java
  2. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveSheetController.java
  3. 20 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  4. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCertController.java
  5. 5 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  6. 48 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/CompanyCert.java
  7. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  8. 11 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java
  9. 60 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserCert.java
  10. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/CompanyCertMapper.java
  11. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  12. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserCertMapper.java
  13. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CompanyCertService.java
  14. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/LeaveSheetService.java
  15. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserCertService.java
  16. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  17. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyCertServiceImpl.java
  18. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  19. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  20. 23 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  21. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserCertServiceImpl.java
  22. 84 42
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  23. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  24. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyCertMapper.xml
  25. 17 10
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  26. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserCertMapper.xml
  27. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml
  28. 9 9
      fhKeeper/formulahousekeeper/timesheet/config/index.js
  29. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/Register.vue
  30. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  31. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  32. 27 7
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  33. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  34. 12 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  35. 5 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/department_list.vue
  36. 5 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/index.vue
  37. 5 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/profession_list.vue
  38. 3 2
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue

+ 105 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyCertController.java

@@ -0,0 +1,105 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.CompanyCert;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.CompanyCert;
+import com.management.platform.entity.UserCert;
+import com.management.platform.mapper.*;
+import com.management.platform.mapper.CompanyCertMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.util.StringUtils;
+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-04-15
+ */
+@RestController
+@RequestMapping("/company-cert")
+public class CompanyCertController {
+
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    CompanyCertMapper companyCertMapper;
+    @Resource
+    UserCertMapper userCertMapper;
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(CompanyCert setting) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (StringUtils.isEmpty(setting.getName())) {
+            msg.setError("名称不能为空");
+            return msg;
+        }
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        if (setting.getId() == null) {
+            setting.setCompanyId(companyId);
+            int count = companyCertMapper.selectCount(new QueryWrapper<CompanyCert>().eq("name", setting.getName()).eq("company_id", setting.getCompanyId()));
+            if (count > 0) {
+                msg.setError("该名称已存在");
+            } else {
+                companyCertMapper.insert(setting);
+                msg.data = companyCertMapper.selectList(new QueryWrapper<CompanyCert>().eq("company_id", companyId));
+            }
+        } else {
+            int count = companyCertMapper.selectCount(new QueryWrapper<CompanyCert>().eq("name", setting.getName())
+                    .eq("company_id", companyId).ne("id", setting.getId()));
+            if (count > 0) {
+                msg.setError("该名称已存在");
+            } else {
+                //检查名称是否有变化
+                CompanyCert oldSetting = companyCertMapper.selectById(setting.getId());
+                if (!setting.getName().equals(oldSetting.getName())) {
+                    companyCertMapper.updateById(setting);
+                    UserCert cost = new UserCert();
+                    cost.setCertName(setting.getName());
+                    userCertMapper.update(cost, new QueryWrapper<UserCert>().eq("cert_id", setting.getId()));
+                }
+                msg.data = companyCertMapper.selectList(new QueryWrapper<CompanyCert>().eq("company_id", companyId));
+            }
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list() {
+        HttpRespMsg msg = new HttpRespMsg();
+
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        List<CompanyCert> list = companyCertMapper.selectList(new QueryWrapper<CompanyCert>().eq("company_id", companyId));
+        msg.data = list;
+
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        CompanyCert CompanyCert = companyCertMapper.selectById(id);
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        if (!CompanyCert.getCompanyId().equals(companyId)) {
+            msg.setError("无权操作");
+        } else {
+            companyCertMapper.deleteById(id);
+        }
+
+        return msg;
+    }
+}
+

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

@@ -94,5 +94,17 @@ public class LeaveSheetController {
         return leaveSheetService.summaryData(keyword, startDate, endDate, userId);
 
     }
+
+    /**
+     * 获取员工加班剩余可抵扣的调休天数
+     * @param userId
+     * @return
+     */
+    @RequestMapping("/getOTAvaiDays")
+    public HttpRespMsg getOTAvaiDays(String userId) {
+        return leaveSheetService.getOTAvaiDays(userId);
+    }
+
+
 }
 

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

@@ -149,7 +149,8 @@ public class ReportController {
                                   @RequestParam(required = false, defaultValue = "0") Integer draft,
                                   Integer[] groupId,//任务分组id
                                   Double[] customData,//自定义的数值
-                                  String[] projectAuditorId
+                                  String[] projectAuditorId,
+                                  Double[] overtimeHours //加班时长
                                     ) {
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
@@ -205,6 +206,12 @@ public class ReportController {
                 projectAuditorId[i] = null;
             }
         }
+        if (overtimeHours == null) {
+            overtimeHours = new Double[projectId.length];
+            for(int i=0;i<projectAuditorId.length; i++) {
+                overtimeHours[i] = null;
+            }
+        }
 
         //检查项目是否截止
         List<Integer> integers = Arrays.asList(projectId);
@@ -439,6 +446,7 @@ public class ReportController {
                             report.setDeptId(user.getDepartmentId());
                             report.setProjectAuditState(0);
                             report.setProjectAuditorId(projectAuditorId[i]);
+
                             if (auditWorkflowList.size() == 0) {
                                 //没有自定义审核流,默认的直接是项目负责人审核
                                 report.setIsDeptAudit(0);
@@ -457,6 +465,7 @@ public class ReportController {
                             if (isOvertime != null && isOvertime[i] != null) {
                                 report.setIsOvertime(isOvertime[i]);
                             }
+                            report.setOvertimeHours(overtimeHours[i]);
                             if (progress != null && progress[i] != null) {
                                 report.setProgress(progress[i]);
                             }
@@ -511,6 +520,7 @@ public class ReportController {
                                 if (isOvertime != null && isOvertime[i] != null) {
                                     report.setIsOvertime(isOvertime[i]);
                                 }
+                                report.setOvertimeHours(overtimeHours[i]);
                                 if (progress != null && progress[i] != null) {
                                     report.setProgress(progress[i]);
                                 }
@@ -565,6 +575,7 @@ public class ReportController {
                         if (isOvertime != null && isOvertime[i] != null) {
                             report.setIsOvertime(isOvertime[i]);
                         }
+                        report.setOvertimeHours(overtimeHours[i]);
                         if (progress != null && progress[i] != null) {
                             report.setProgress(progress[i]);
                         }
@@ -641,6 +652,7 @@ public class ReportController {
                             if (isOvertime != null && isOvertime[i] != null) {
                                 report.setIsOvertime(isOvertime[i]);
                             }
+                            report.setOvertimeHours(overtimeHours[i]);
                             if (progress != null && progress[i] != null) {
                                 report.setProgress(progress[i]);
                             }
@@ -678,6 +690,13 @@ public class ReportController {
                 httpRespMsg.setError("请填写工作时长");
                 return httpRespMsg;
             }
+            if (report.getIsOvertime() != null && report.getIsOvertime() == 1) {
+                if (report.getOvertimeHours() > report.getWorkingTime()) {
+                    HttpRespMsg httpRespMsg = new HttpRespMsg();
+                    httpRespMsg.setError("加班时长("+report.getOvertimeHours()+"h)不能超过工作时长("+report.getWorkingTime()+"h)");
+                    return httpRespMsg;
+                }
+            }
         }
 
         return reportService.editReport(reportList, createDate.length > 0 ? createDate[0] : null, targetUserList, hourCost, user.getCompanyId());

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCertController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-15
+ */
+@RestController
+@RequestMapping("/user-cert")
+public class UserCertController {
+
+}
+

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

@@ -127,8 +127,11 @@ public class UserController {
      */
     @RequestMapping("/insertUser")
     public HttpRespMsg insertUser(String id, @RequestParam String name, String phone,
-                                  @RequestParam Integer roleId, Double monthCost, Double cost, Integer departmentId, Integer salaryType, String costApplyDate) {
-        return userService.insertUser(id, name, phone, roleId, monthCost, cost, departmentId, salaryType, costApplyDate, request);
+                                  @RequestParam Integer roleId, Double monthCost, Double cost,
+                                  Integer departmentId, Integer salaryType, String costApplyDate,
+                                    String position, String certJson) {
+        return userService.insertUser(id, name, phone, roleId, monthCost, cost, departmentId, salaryType, costApplyDate,
+                    position, certJson, request);
     }
 
     /**

+ 48 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/CompanyCert.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-04-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class CompanyCert extends Model<CompanyCert> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 证书名称
+     */
+    @TableField("name")
+    private String name;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

@@ -24,7 +24,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2022-04-09
+ * @since 2022-04-18
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -291,6 +291,12 @@ public class Report extends Model<Report> {
     @TableField("dept_id")
     private Integer deptId;
 
+    /**
+     * 加班时长
+     */
+    @TableField("overtime_hours")
+    private Double overtimeHours;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -7,6 +7,7 @@ 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 lombok.Data;
@@ -20,7 +21,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2021-08-26
+ * @since 2022-04-15
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -180,6 +181,15 @@ public class User extends Model<User> {
 
     @TableField(exist = false)
     private double totalHours;
+    /**
+     * 岗位职级
+     */
+    @TableField("position")
+    private String position;
+
+
+    @TableField(exist = false)
+    private List<UserCert> certList;
 
     @Override
     protected Serializable pkVal() {

+ 60 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserCert.java

@@ -0,0 +1,60 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class UserCert extends Model<UserCert> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("user_id")
+    private String userId;
+
+    @TableField("cert_id")
+    private Integer certId;
+
+    /**
+     * 证书名称
+     */
+    @TableField("cert_name")
+    private String certName;
+
+    /**
+     * 发证日期
+     */
+    @TableField("cert_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate certDate;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

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

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

@@ -101,4 +101,6 @@ public interface ReportMapper extends BaseMapper<Report> {
     List<Map<String, Object>> getDuplicate(Integer companyId);
 
     List<Map> getSameDayPassReport(Integer companyId, @Param("dateReportList") List<Report> dateReportList);
+
+    double getMyOvertime(String userId);
 }

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

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

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

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

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

@@ -26,4 +26,6 @@ public interface LeaveSheetService extends IService<LeaveSheet> {
     HttpRespMsg deny(Integer id);
 
     HttpRespMsg summaryData(String keyword, String startDate, String endDate, String userId);
+
+    HttpRespMsg getOTAvaiDays(String userId);
 }

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

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

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

@@ -29,7 +29,7 @@ public interface UserService extends IService<User> {
     HttpRespMsg insertCompany(String companyName, String name, String phone, String vcode, String pwd, Integer type);
 
     HttpRespMsg insertUser(String id, String name, String phone, Integer roleId, Double monthCost, Double cost, Integer departmentId,
-                           Integer salaryType, String costApplyDate,
+                           Integer salaryType, String costApplyDate, String position, String certJson,
                            HttpServletRequest request);
 
     HttpRespMsg importUser(MultipartFile multipartFile, HttpServletRequest request);

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.CompanyCert;
+import com.management.platform.mapper.CompanyCertMapper;
+import com.management.platform.service.CompanyCertService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-15
+ */
+@Service
+public class CompanyCertServiceImpl extends ServiceImpl<CompanyCertMapper, CompanyCert> implements CompanyCertService {
+
+}

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -120,9 +120,10 @@ public class DingDingServiceImpl implements DingDingService {
             //首先生成一个新公司,增加会员的试用一个月
             company = new Company().setCompanyName(corpName)
                     .setExpirationDate(LocalDateTime.now().plusMonths(1));
+            company.setPackageProject(1);
             company.setPackageExpense(1);
             company.setPackageCustomer(1);
-            company.setPackageProject(1);
+            company.setPackageOa(1);
             companyMapper.insert(company);
 
             //生成工作时长

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

@@ -32,12 +32,15 @@ import java.util.Map;
 @Service
 @Transactional
 public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSheet> implements LeaveSheetService {
+    public static final Integer exLeaveDay = 6;
     @Resource
     private UserMapper userMapper;
     @Resource
     private LeaveSheetMapper leaveSheetMapper;
     @Resource
     private TimeTypeMapper timeTypeMapper;
+    @Resource
+    private ReportMapper reportMapper;
 
 
     @Override
@@ -137,4 +140,21 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         msg.data = leaveSheetMapper.summaryData(keyword, startDate, endDate, companyId);
         return msg;
     }
+
+    @Override
+    public HttpRespMsg getOTAvaiDays(String userId) {
+        //非驳回和撤回状态的都要统计进去
+        List<LeaveSheet> list = leaveSheetMapper.selectList(new QueryWrapper<LeaveSheet>().eq("owner_id", userId).eq("leave_type", exLeaveDay).ne("status", 2).ne("status", 3));
+        double alreadyHours = list.stream().mapToDouble(LeaveSheet::getTimeHours).sum();
+        double overtime = reportMapper.getMyOvertime(userId);
+        double leftHours = overtime - alreadyHours;
+        if (leftHours < 0) {
+            leftHours = 0;
+        }
+        float allDayHours = timeTypeMapper.selectById(userMapper.selectById(userId).getCompanyId()).getAllday();
+        double d = leftHours/allDayHours;
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = d;
+        return msg;
+    }
 }

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

@@ -2373,7 +2373,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             sheet.createFreezePane(0,1);
             List<String> titles = new ArrayList<String>();
             titles.addAll(Arrays.asList(new String[]{
-                    "序号","上传者","项目名称","子项目名称"
+                    "序号","员工","所在部门","项目名称","子项目名称"
             }));
 
             //项目管理专业版以上,包括任务
@@ -2385,9 +2385,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if (timeType.getMultiWorktime() == 1) {
                 titles.add("工时时间");
             }
-            if (timeType.getMultiWorktime() == 0) {
-                titles.add("是否加班");
-            }
+            titles.add("加班");
             //是否启用自定义的维度了
             if (timeType.getCustomDegreeActive() == 1) {
                 titles.add(timeType.getCustomDegreeName());
@@ -2402,7 +2400,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 int width = 10;
                 if (i == 0) {
                     width = 10;
-                } else if (i == 4 && company.getPackageProject() == 1){
+                } else if (i == 5 && company.getPackageProject() == 1){
                     width = 60;
                 } else if (i == titles.size() -1){
                     //最后一个是工作事项
@@ -2492,6 +2490,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 for (HashMap<String, Object> map : allReportByDate) {
                     if ((Integer)map.get("multiWorktime") == 1) {
                         String data = (String)map.get("content");
+                        Integer isOvertime = (Integer) map.get("isOvertime");
                         JSONArray array = JSONArray.parseArray(data);
                         if (array != null) {
                             for (int i=0;i<array.size(); i++) {
@@ -2503,6 +2502,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 newMap.put("endTime", worktimeItem.getEndTime());
                                 newMap.put("content", worktimeItem.getContent());
                                 newMap.put("duration", df.format(worktimeItem.getTime()));
+                                //第一条填充加班
+                                if (isOvertime == 1 && i == 0) {
+                                    newMap.put("isOvertime", 1);
+                                    newMap.put("overtimeHours", map.get("overtimeHours"));
+                                } else {
+                                    newMap.put("isOvertime", 0);
+                                }
                                 dealDataList.add(newMap);
                             }
                         } else {
@@ -2520,15 +2526,17 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 allReportByDate = dealDataList;
             }
 
+            DecimalFormat df = new DecimalFormat("#0.0");
             for (Map<String, Object> map : allReportByDate) {
                 HSSFRow row = sheet.createRow(rowNum);
                 row.createCell(0).setCellValue(rowNum);
                 row.createCell(1).setCellValue((String) map.get("name"));
-                row.createCell(2).setCellValue((String) map.get("project"));
-                row.createCell(3).setCellValue((String) map.get("subProjectName"));
-                int index = 4;
+                row.createCell(2).setCellValue((String) map.get("departmentName"));
+                row.createCell(3).setCellValue((String) map.get("project"));
+                row.createCell(4).setCellValue((String) map.get("subProjectName"));
+                int index = 5;
                 if (company.getPackageProject() == 1) {
-                    row.createCell(4).setCellValue((String) map.get("taskName"));
+                    row.createCell(5).setCellValue((String) map.get("taskName"));
                     index++;
                 }
                 HSSFCell cell = row.createCell(index);
@@ -2545,10 +2553,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         row.createCell(index).setCellValue("");
                     }
                     index++;
+                    //加班情况
+                    int isOverTime = (Integer) map.get("isOvertime");
+                    row.createCell(index).setCellValue(isOverTime==1?(df.format((double)map.get("overtimeHours"))):"-");
+                    index++;
+
                 }
                 if (timeType.getMultiWorktime() == 0) {
                     int isOverTime = (Integer) map.get("isOvertime");
-                    row.createCell(index).setCellValue(isOverTime==1?"加班":"-");
+                    row.createCell(index).setCellValue(isOverTime==1?(df.format((double)map.get("overtimeHours"))):"-");
                     index++;
                 }
                 //是否启用自定义的维度了

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.UserCert;
+import com.management.platform.mapper.UserCertMapper;
+import com.management.platform.service.UserCertService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-15
+ */
+@Service
+public class UserCertServiceImpl extends ServiceImpl<UserCertMapper, UserCert> implements UserCertService {
+
+}

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

@@ -121,6 +121,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private ProjectAuditorMapper projectAuditorMapper;
     @Resource
     private SysRoleMapper sysRoleMapper;
+    @Resource
+    private UserCertMapper userCertMapper;
+    @Resource
+    private UserCertService userCertService;
     //登录网页端
     @Override
     public HttpRespMsg loginAdmin(String username, String password) {
@@ -337,6 +341,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             if (dp != null) {
                 user.setDepartmentName(dp.getDepartmentName());
             }
+            //设置用户的证书列表
+            List<UserCert> certList = userCertMapper.selectList(new QueryWrapper<UserCert>().eq("user_id", user.getId()));
+            user.setCertList(certList);
+
             httpRespMsg.data = user;
         }
         return httpRespMsg;
@@ -490,20 +498,22 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             Company company = new Company().setCompanyName(companyName)
                     .setExpirationDate(LocalDateTime.now().plusMonths(1));
             //设置版本
-            if (type == 0) {
+            if (type == 0) {//简易版
                 company.setPackageSimple(1);
-            } else if (type == 1) {
-                company.setPackageSimple(0);
+            } else if (type == 1) {//基础版
                 company.setPackageProject(0);
                 company.setPackageExpense(0);
                 company.setPackageCustomer(0);
-            } else if (type == 2) {
-                company.setPackageSimple(0);
+            } else if (type == 2) {//项目管理专业版
+                company.setPackageProject(1);
+                company.setPackageExpense(1);
+                company.setPackageCustomer(0);
+            }  else if (type == 3) {//企业办公旗舰版
                 company.setPackageProject(1);
                 company.setPackageExpense(1);
                 company.setPackageCustomer(1);
-            } else {
-                company.setPackageSimple(0);
+                company.setPackageOa(1);
+            } else {//工程管理专业版
                 company.setPackageProject(1);
                 company.setPackageExpense(1);
                 company.setPackageCustomer(1);
@@ -552,7 +562,7 @@ 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, HttpServletRequest request) {
+                                  Integer departmentId, Integer salaryType, String costApplyDate, String position, String certJson, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             User creator = userMapper.selectById(request.getHeader("Token"));
@@ -561,43 +571,48 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             BigDecimal monthCostValue = (monthCost == null ? BigDecimal.valueOf(0) : BigDecimal.valueOf(monthCost));
             if (targetId == null) {
                 //新增
-                if (roleId == 1) {
-                    httpRespMsg.setError("不可新增负责人");
+                //电话号码列 检测重名
+                if (!StringUtils.isEmpty(phone) && userMapper.selectList(new QueryWrapper<User>().eq("phone", phone)).size() > 0) {
+                    httpRespMsg.setError("电话号码重复");
                 } else {
-                    //电话号码列 检测重名
-                    if (!StringUtils.isEmpty(phone) && userMapper.selectList(new QueryWrapper<User>().eq("phone", phone)).size() > 0) {
-                        httpRespMsg.setError("电话号码重复");
+                    //只计算活跃的用户
+                    if (userMapper.selectCount(new QueryWrapper<User>()
+                            .eq("company_id", creator.getCompanyId()).eq("is_active", 1)) >=
+                            (companyMapper.selectById(creator.getCompanyId()).getStaffCountMax())) {
+                        httpRespMsg.setError("公司人员已达上限");
                     } else {
-                        //只计算活跃的用户
-                        if (userMapper.selectCount(new QueryWrapper<User>()
-                                .eq("company_id", creator.getCompanyId()).eq("is_active", 1)) >=
-                                (companyMapper.selectById(creator.getCompanyId()).getStaffCountMax())) {
-                            httpRespMsg.setError("公司人员已达上限");
+                        Long id = SnowFlake.nextId();
+                        User user = new User()
+                                .setId(id.toString())
+                                .setName(name)
+                                .setPassword(MD5Util.getPassword("000000"))
+                                .setPhone(phone)
+                                .setRoleId(roleId)
+                                .setRoleName(sysRoleMapper.selectById(roleId).getRolename())
+                                .setCompanyId(creator.getCompanyId())
+                                .setMonthCost(monthCostValue)
+                                .setCost(costValue)
+                                .setPosition(position)
+                                .setColor(ColorUtil.randomColor())
+                                .setSalaryType(salaryType)
+                                .setCostApplyDate(costApplyDate)
+                                .setDepartmentId(departmentId == null ? 0 : departmentId)
+                                .setDepartmentCascade(departmentId == null ?
+                                        convertDepartmentIdToCascade(0) :
+                                        convertDepartmentIdToCascade(departmentId));
+                        if (userMapper.insert(user) == 0) {
+                            httpRespMsg.setError("操作失败");
                         } else {
-                            Long id = SnowFlake.nextId();
-                            User user = new User()
-                                    .setId(id.toString())
-                                    .setName(name)
-                                    .setPassword(MD5Util.getPassword("000000"))
-                                    .setPhone(phone)
-                                    .setRoleId(roleId)
-                                    .setRoleName(sysRoleMapper.selectById(roleId).getRolename())
-                                    .setCompanyId(creator.getCompanyId())
-                                    .setMonthCost(monthCostValue)
-                                    .setCost(costValue)
-                                    .setColor(ColorUtil.randomColor())
-                                    .setSalaryType(salaryType)
-                                    .setCostApplyDate(costApplyDate)
-                                    .setDepartmentId(departmentId == null ? 0 : departmentId)
-                                    .setDepartmentCascade(departmentId == null ?
-                                            convertDepartmentIdToCascade(0) :
-                                            convertDepartmentIdToCascade(departmentId));
-                            if (userMapper.insert(user) == 0) {
-                                httpRespMsg.setError("操作失败");
-                            } else {
-                                //插入人员历史成本表
-                                UserSalary userSalary = UserSalary.copyFromUser(user);
-                                userSalaryMapper.insert(userSalary);
+                            //插入人员历史成本表
+                            UserSalary userSalary = UserSalary.copyFromUser(user);
+                            userSalaryMapper.insert(userSalary);
+                            //插入人员专业证书表
+                            if (!StringUtils.isEmpty(certJson)) {
+                                List<UserCert> certList = JSONArray.parseArray(certJson, UserCert.class);
+                                certList.forEach(c->{
+                                    c.setUserId(user.getId());
+                                });
+                                userCertService.saveBatch(certList);
                             }
                         }
                     }
@@ -625,6 +640,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         .setRoleName(sysRoleMapper.selectById(roleId).getRolename())
                         .setMonthCost(monthCostValue)
                         .setCost(costValue)
+                        .setPosition(position)
                         .setCostApplyDate(costApplyDate)
                         .setSalaryType(salaryType)
                         .setDepartmentId(departmentId == null ? 0 : departmentId)
@@ -635,6 +651,32 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     UserSalary userSalary = UserSalary.copyFromUser(oldUser);
                     userSalaryMapper.insert(userSalary);
                 }
+                //更新人员专业证书表
+                List<UserCert> oldCertList = userCertMapper.selectList(new QueryWrapper<UserCert>().eq("user_id", targetId));
+                List<Integer> removeCertList = new ArrayList<>();
+                List<UserCert> certList = new ArrayList<>();
+                if (!StringUtils.isEmpty(certJson)) {
+                    certList = JSONArray.parseArray(certJson, UserCert.class);
+                    certList.forEach(c->{
+                        c.setUserId(oldUser.getId());
+                    });
+
+                }
+                //批量更新或新增
+                if (certList.size() > 0) {
+                    userCertService.saveOrUpdateBatch(certList);
+                }
+                for (int i=0;i<oldCertList.size(); i++) {
+                    UserCert oldC = oldCertList.get(i);
+                    if (!certList.stream().anyMatch(newCert->newCert.getId().equals(oldC.getId()))) {
+                        removeCertList.add(oldC.getId());
+                    }
+                }
+                //批量删除需要移除的
+                if (removeCertList.size() > 0) {
+                    userCertService.removeByIds(removeCertList);
+                }
+
                 //薪资或者
                 DateTimeFormatter sdf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                 String now = sdf.format(LocalDateTime.now());

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

@@ -118,6 +118,7 @@ referer:
     - www.ttkuaiban.com
     - mobworktime.ttkuaiban.com
     - worktime.ttkuaiban.com
+    - app71020.eapps.dingtalkcloud.com
 excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/error,/testClient,/corpWXAuth,/wx-corp-info/*,/clean/*,/innerRoles/*
 
 #企业微信相关参数

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

+ 17 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -40,11 +40,12 @@
         <result column="custom_data" property="customData" />
         <result column="project_auditor_id" property="projectAuditorId" />
         <result column="dept_id" property="deptId" />
+        <result column="overtime_hours" property="overtimeHours" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, creator_id, project_id, create_date, working_time, content, state, create_time, time_type, cost, start_time, end_time, report_time_type, sub_project_id, task_id, is_overtime, progress, department_audit_state, stage, pic_str, multi_worktime, reject_reason, reject_username, reject_userid, degree_id, company_id, fill_userid, audit_deptid, is_dept_audit, audit_dept_managerid, is_final_audit, project_audit_state, group_id, custom_data, project_auditor_id, dept_id
+        id, creator_id, project_id, create_date, working_time, content, state, create_time, time_type, cost, start_time, end_time, report_time_type, sub_project_id, task_id, is_overtime, progress, department_audit_state, stage, pic_str, multi_worktime, reject_reason, reject_username, reject_userid, degree_id, company_id, fill_userid, audit_deptid, is_dept_audit, audit_dept_managerid, is_final_audit, project_audit_state, group_id, custom_data, project_auditor_id, dept_id, overtime_hours
     </sql>
 
     <!--根据日期获取全部报告信息-->
@@ -54,7 +55,7 @@
         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
         , 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
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, department.department_name as departmentName, a.overtime_hours as overtimeHours
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -63,6 +64,7 @@
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
+        left join department on department.department_id = c.department_id
         WHERE a.state = 1
         <if test="startDate != null and startDate != ''">
             AND a.create_date between #{startDate} and #{endDate}
@@ -85,7 +87,7 @@
         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
         , 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
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -113,7 +115,7 @@
         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
         , 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
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, department.department_name as departmentName, a.overtime_hours as overtimeHours
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -122,6 +124,7 @@
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
+        left join department on department.department_id = c.department_id
         WHERE a.state = 1
         <if test="startDate != null and startDate != ''">
             AND a.create_date between #{startDate} and #{endDate}
@@ -144,7 +147,7 @@
         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
         , 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
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, department.department_name as departmentName, a.overtime_hours as overtimeHours
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN user AS c ON a.creator_id=c.id
@@ -153,6 +156,7 @@
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
+        left join department on department.department_id = c.department_id
         WHERE a.state = 1
         <if test="startDate != null and startDate != ''">
             AND a.create_date between #{startDate} and #{endDate}
@@ -182,7 +186,7 @@
         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,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,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
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
@@ -208,7 +212,7 @@
         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,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,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
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
@@ -237,7 +241,7 @@
         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,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,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
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours
         FROM report AS a
         left join user on user.id = a.creator_id
         JOIN project AS b ON a.project_id=b.id
@@ -282,7 +286,7 @@
         a.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName,
         a.is_overtime as isOvertime,a.progress as progress, 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
+        task_group.name as groupName,a.group_id as groupId, a.custom_data as customData, a.overtime_hours as overtimeHours
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
@@ -310,7 +314,7 @@
         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,
         department.department_name as auditDeptName, a.is_dept_audit as isDeptAudit, a.project_audit_state as projectAuditState,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
+        ,u.name as projectAuditorName, a.project_auditor_id as projectAuditorId, a.overtime_hours as overtimeHours
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id
         left join sub_project as d on d.id = a.sub_project_id
@@ -524,4 +528,7 @@
         </foreach>
         )
     </select>
+    <select id="getMyOvertime"  resultType="java.lang.Double">
+        select sum(overtime_hours) from report where creator_id=#{userId}
+    </select>
 </mapper>

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserCertMapper.xml

@@ -0,0 +1,19 @@
+<?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.UserCertMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.UserCert">
+        <id column="id" property="id" />
+        <result column="user_id" property="userId" />
+        <result column="cert_id" property="certId" />
+        <result column="cert_name" property="certName" />
+        <result column="cert_date" property="certDate" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, user_id, cert_id, cert_name, cert_date
+    </sql>
+
+</mapper>

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

@@ -28,11 +28,12 @@
         <result column="dingding_unionid" property="dingdingUnionid" />
         <result column="corpwx_userid" property="corpwxUserid" />
         <result column="inactive_date" property="inactiveDate" />
+        <result column="position" property="position" />
     </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
+        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
     </sql>
     <!--单独分页获取人员-->
     <select id="getUserByDepartment" resultType="java.util.Map">

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

@@ -5,16 +5,16 @@ var path = require('path')
 var ip = '192.168.2.25'
 // var ip = '47.100.37.243' 
 
-// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+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
-//         }
-//     } 
-// }
+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: {

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/Register.vue

@@ -50,7 +50,7 @@
         data() {
             return {
                 typeList:[{id:0,name:'工时统计表简易版'},{id:1,name:'工时统计基础版'},
-                {id:2,name:'项目管理专业版'},{id:3,name:'工程管理专业版'}],
+                {id:2,name:'项目管理专业版'},{id:3,name:'企业办公旗舰版'},{id:4,name:'工程管理专业版'}],
                 logining: false,
                 showTimer: false,
                 countNum: 60,

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

@@ -188,7 +188,7 @@
                     <el-input v-model="addForm.code" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目编号" clearable></el-input>
                 </el-form-item>
                 <el-form-item label="项目分类">
-                    <el-select v-model="addForm.category" clearable :disabled="!permissions.projectManagement && addForm.creatorId != user.id">
+                    <el-select v-model="addForm.category"  style="width:32%;" clearable :disabled="!permissions.projectManagement && addForm.creatorId != user.id">
                         <el-option v-for="(item) in baseClfList" :key="item.id" :value="item.id" :label="item.name"></el-option>
                     </el-select>
                 </el-form-item>
@@ -203,8 +203,8 @@
                     <el-tooltip effect="dark" content="普通项目只对参与人员开放,公共项目对所有成员开放" placement="top-start">
                     <i class="el-icon-question"></i>
                     </el-tooltip>
-                    <div v-if="user.company.packageProject==1" style="display: inline-block;width: 50%">
-                        <span style="margin-left:63px;margin-right:10px;" v-if="user.company.packageCustomer == 1">客户</span>
+                    <div v-if="user.company.packageCustomer == 1" style="display: inline-block;width: 50%">
+                        <span style="margin-left:63px;margin-right:10px;" >客户</span>
                         <el-select v-model="addForm.customerId" clearable="true" filterable placeholder="请选择客户" style="width:70%;" >
                             <el-option v-for="item in customerList" :key="item.id" :label="item.customerName" :value="item.id"></el-option>
                         </el-select>

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

@@ -273,7 +273,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()">添加更多证书</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">
@@ -286,7 +286,7 @@
                             <div style="color: red;margin-left: 15px;cursor:pointer;" @click="deteFrames(index)"><i class="el-icon-delete"></i></div>
                         </div>
                     </div>
-                </div>
+                </div> -->
             </el-form>
             <span slot="footer" class="dialog-footer">
                 <el-button @click="dialogVisible=false">取消</el-button>

+ 27 - 7
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -192,17 +192,17 @@
                                                 <span v-if="item2.reportTimeType == 0" style="margin-right:10px;">{{typeList[item2.timeType]}}</span>
                                                 <span v-if="item2.reportTimeType == 2" style="margin-right:10px;">{{item2.startTime+'-'+item2.endTime}}</span>
                                             {{item2.time.toFixed(1)}}h  
-                                            <el-tag type="danger" size="mini" style="margin-left: 65px" v-if="item2.isOvertime === 1">加班</el-tag>
+                                            <el-tag type="danger" size="mini" style="margin-left: 65px" v-if="item2.isOvertime === 1">加班<span v-if="item2.overtimeHours">{{item2.overtimeHours.toFixed(1)}}小时</span></el-tag>
                                             </p>
                                             <p>事项:<span v-html="item2.content"></span></p>
                                             </div>
                                             <div v-if="item2.multiWorktime==1" >
+                                                <p>项目时长:{{item2.time.toFixed(1)}}h  <el-tag type="danger" size="mini" style="margin-left: 65px" v-if="item2.isOvertime === 1">加班<span v-if="item2.overtimeHours">{{item2.overtimeHours.toFixed(1)}}小时</span></el-tag></p>
                                                 <div v-for="(timeItem, tIndex) in item2.worktimeList" :key="tIndex"
                                                     style="border: 0.5px #ddd solid;margin-bottom:5px;padding:5px;">
                                                     <p style="display: inline-block;">时长:
                                                         <span v-if="item2.reportTimeType == 2" style="margin-right:10px;">{{timeItem.startTime+'-'+timeItem.endTime}}</span>
                                                     {{timeItem.time.toFixed(1)}}h  
-                                                    <el-tag type="danger" size="mini" style="margin-left: 65px" v-if="item2.isOvertime === 1">加班</el-tag>
                                                     </p>
                                                     <p>事项:<span v-html="timeItem.content"></span></p>
                                                 </div>
@@ -302,7 +302,10 @@
                             @change="iptChang()">
                         </el-time-picker>
                         </span>
-                        <div class="overtime"><el-checkbox :disabled="!canEdit" v-model="domain.isOvertime">加班</el-checkbox></div>
+                        <div class="overtime">
+                            <el-checkbox :disabled="!canEdit" v-model="domain.isOvertime">加班</el-checkbox>
+                            <el-input :disabled="!canEdit || domain.isOvertime==null || domain.isOvertime==0" v-model="domain.overtimeHours" @blur="triggerCalculateOT(index)" @input="domain.overtimeHours=domain.overtimeHours.replace(/[^\d.]/g,'')" style="width: 100px;"></el-input><span style="margin-left:5px">小时</span>
+                        </div>
                     </el-form-item>
                     
                     <el-form-item label="投入项目" :prop="'domains.' + index + '.projectId'"
@@ -370,7 +373,9 @@
                             <el-col span="14"><el-slider :disabled="!canEdit" v-model="domain.progress" :min="10" :show-tooltip="false" :step="10" style="width:180px;" @input="domain.workingTime = (reportTimeType.allday*domain.progress/100).toFixed(1)" @change="seleChn(0)"></el-slider></el-col>
                             <el-col span="10"><span style="margin-left:10px;float:right;"><span style="margin-right:10px;">{{domain.progress}}%</span>{{domain.workingTime}}小时</span></el-col>
                         </div>
-                        <div class="overtime"><el-checkbox :disabled="!canEdit" v-model="domain.isOvertime">加班</el-checkbox></div>
+                        <div class="overtime"><el-checkbox :disabled="!canEdit" v-model="domain.isOvertime">加班</el-checkbox>
+                        <el-input :disabled="!canEdit || domain.isOvertime==null || domain.isOvertime==0" v-model="domain.overtimeHours"  @blur="triggerCalculateOT(index)" @input="domain.overtimeHours=domain.overtimeHours.replace(/[^\d.]/g,'')" style="width: 100px;"></el-input><span style="margin-left:5px">小时</span>
+                        </div>
                     </el-form-item>
                     <!--工程专业版本模式下, 各个专业的进度填报 -->
                     <el-form-item label="专业进度" :prop="'domains.' + index + '.professionProgress'" v-if="user.company.packageEngineering==1">
@@ -416,7 +421,9 @@
                                 <i class="fa fa-trash" style="color: red;;font-size:18px;"></i>
                             </el-link>
 
-                            <div class="overtime"><el-checkbox :disabled="!canEdit" v-model="domain.isOvertime">加班</el-checkbox></div>
+                            <div class="overtime"><el-checkbox :disabled="!canEdit" v-model="domain.isOvertime">加班</el-checkbox>
+                            <el-input :disabled="!canEdit || domain.isOvertime==null || domain.isOvertime==0" v-model="domain.overtimeHours" @blur="triggerCalculateOT(index)" @input="domain.overtimeHours=domain.overtimeHours.replace(/[^\d.]/g,'')" style="width: 100px;"></el-input><span style="margin-left:5px">小时</span>
+                            </div>
                             
                             <el-link type="primary" v-if="workForm.domains[index].state == 0 || workForm.domains[index].state == 2"
                                 :underline="false" style="margin-left:10px;" @click="copyProject(index)">复制</el-link>
@@ -1353,6 +1360,15 @@
             
         },
         methods: {
+            triggerCalculateOT(index) {
+                var str = this.workForm.domains[index].overtimeHours + ''
+                if(str.indexOf('.') != '-1') {
+                    var s = str.split('.')[0]
+                    var st = str.split('.')[1]
+                    var sts = st.split('')
+                    this.workForm.domains[index].overtimeHours = s + '.' + sts[0]
+                }
+            },
             searchScreen(e){
                 if(e){
                     this.monthNotWorkDateS = []
@@ -1956,13 +1972,11 @@
             this.monthnotworkDateS1 = res.data
             this.monthnotTotal = res.data.length
             // 2222111
-            // var infoList = []
             if (this.monthnotworkDateS1.length > 20) {
                 this.monthNotWorkDateS = this.monthnotworkDateS1.slice(0,20);
             } else {
                 this.monthNotWorkDateS = this.monthnotworkDateS1
             }
-            this.monthNotWorkDateS = infoList;
             // 判断
             if (this.monthnotworkDateS1.length > 0) {
                 setTimeout(() => {
@@ -3243,6 +3257,7 @@
                                     auditUserList: list.report[i].auditUserList,
                                     projectAuditorId: list.report[i].projectAuditorId,
                                     projectAuditorName: list.report[i].projectAuditorName,
+                                    overtimeHours: list.report[i].overtimeHours
                                 })
                                 if (list.report[i].state >= 2) {
                                     this.canEdit = true;
@@ -4295,6 +4310,11 @@
                             } else {
                                 formData.append("isOvertime", 0);
                             }
+                            if(this.workForm.domains[i].overtimeHours && this.workForm.domains[i].isOvertime == 1) {
+                                formData.append("overtimeHours", this.workForm.domains[i].overtimeHours);
+                            } else {
+                                formData.append("overtimeHours", 0);
+                            }
                             
                             if (this.workForm.userId != null) {
                                 var targetUids = '';

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

@@ -93,10 +93,10 @@
                                     <!-- 阶段 -->
                                     <span v-if="item.stage != null" style="margin-left:10px;"> 投入阶段:{{item.stage}}</span>
                                 </p>
-                                <div v-if="item.multiWorktime==0">
-                                <p>时长:{{item.time}}h <span class="propsbtn" v-if="item.isOvertime === 1">
-                                    <el-tag type="danger" size="mini" style="margin-left: 65px">加班</el-tag></span>
+                                <p><span v-if="item.multiWorktime==1">项目</span>时长:{{item.time.toFixed(1)}}h <span class="propsbtn" v-if="item.isOvertime === 1">
+                                    <el-tag type="danger" size="mini" style="margin-left: 65px">加班<span v-if="item.overtimeHours">{{item.overtimeHours.toFixed(1)}}小时</span></el-tag></span>
                                 </p>
+                                <div v-if="item.multiWorktime==0">
                                 <p>事项:<span v-html="item.content"></span></p>
                                 </div>
                                 <div v-if="item.multiWorktime==1" >

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

@@ -217,7 +217,10 @@
                     </div>
                     
                     <div class="overtime" >
-                        <van-checkbox :disabled="!canEdit" v-model="item.isOvertime" v-if="reportTimeType.multiWorktime !=1">加班</van-checkbox>
+                        <van-checkbox :disabled="!canEdit" v-model="item.isOvertime" >加班</van-checkbox>
+                        <van-field v-model="item.overtimeHours" type="number" :disabled="!canEdit || item.isOvertime==null||item.isOvertime==0"
+                        placeholder="请输入加班时长"></van-field><span style="margin-left:5px">小时</span>    
+
                         <van-tag style="position:absolute;right:10px;" v-if="isCorpWX&&canEdit" type="primary" size="large" @click="takePhoto(index)">拍照上传</van-tag>
                         <!-- <van-tag style="position:absolute;right:10px;" type="primary" size="large" @click="takePhoto(index)">拍照上传</van-tag> -->
                     </div>
@@ -868,6 +871,7 @@
                                     projectAuditorId: list[i].projectAuditorId,
                                     projectAuditorName: list[i].projectAuditorName,
                                     auditUserList: list[i].auditUserList,
+                                    overtimeHours: list[i].overtimeHours,
                                 })
                                 if (list[i].state >= 2) {
                                     this.canEdit = true;
@@ -1287,6 +1291,13 @@
                     }
                     formData.append("createDate", this.form.createDate);
                     formData.append("isOvertime", this.form.domains[i].isOvertime?1:0);
+                    if (this.form.domains[i].overtimeHours && this.form.domains[i].isOvertime == 1) {
+                        formData.append("overtimeHours", this.form.domains[i].overtimeHours);
+                    } else {
+                        formData.append("overtimeHours", 0);
+                    }
+                    
+
 
                     //项目专业进度
                     if (this.form.domains[i].professionProgress) {

+ 5 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/department_list.vue

@@ -36,12 +36,16 @@
                             <div class="project_time">时长:
                                 <span v-if="item1.reportTimeType == 0" style="margin-right:10px;">{{fullDayTxt[item1.timeType]}}</span>
                                 <span v-if="item1.reportTimeType == 2" style="margin-right:10px;">{{item1.startTime+'-'+item1.endTime}}</span>{{item1.time.toFixed(1)}}h
-                                <div class="button" v-if="item1.isOvertime == 1">加班</div>
+                                <div class="button" v-if="item1.isOvertime == 1">加班<span v-if="item1.overtimeHours">{{item1.overtimeHours.toFixed(1)}}h</span></div>
                             </div>
                             <div class="project_content">事项:<span v-html="item1.content"></span></div>
                             
                         </div>
                         <div v-if="item1.multiWorktime == 1">
+                            <div>
+                                项目时长:<span style="margin-right:10px;">{{item1.time.toFixed(1)}}h</span>
+                            <div class="button" v-if="item1.isOvertime == 1">加班<span v-if="item1.overtimeHours">{{item1.overtimeHours.toFixed(1)}}h</span></div>
+                            </div>
                             <div style="position:relative;border:#ccc 0.5px solid;padding:3px;margin:5px 0px;" v-for="(timeItem, index) in item1.worktimeList" :key="index" >
                                 <div class="project_time">时长:
                                     <!-- <span v-if="timeItem.reportTimeType == 0" style="margin-right:10px;">{{fullDayTxt[item1.timeType]}}</span> -->

+ 5 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/index.vue

@@ -54,11 +54,15 @@
                             <div class="project_time">时长:
                                 <span v-if="item1.reportTimeType == 0" style="margin-right:10px;">{{fullDayTxt[item1.timeType]}}</span>
                                 <span v-if="item1.reportTimeType == 2" style="margin-right:10px;">{{item1.startTime+'-'+item1.endTime}}</span>{{item1.time.toFixed(1)}}h
-                                <div class="button" v-if="item1.isOvertime == 1">加班</div>
+                                <div class="button" v-if="item1.isOvertime == 1">加班<span v-if="item1.overtimeHours">{{item1.overtimeHours.toFixed(1)}}h</span></div>
                             </div>
                             <div class="project_content">事项:<span v-html="item1.content"></span></div>
                         </div>
                         <div v-if="item1.multiWorktime == 1">
+                            <div>
+                                项目时长:<span style="margin-right:10px;">{{item1.time.toFixed(1)}}h</span>
+                            <div class="button" v-if="item1.isOvertime == 1">加班<span v-if="item1.overtimeHours">{{item1.overtimeHours.toFixed(1)}}h</span></div>
+                            </div>
                             <div style="position:relative;border:#ccc 0.5px solid;padding:3px;margin:5px 0px;" v-for="(timeItem, index) in item1.worktimeList" :key="index" >
                                 <div class="project_time">时长:
                                     <!-- <span v-if="timeItem.reportTimeType == 0" style="margin-right:10px;">{{fullDayTxt[item1.timeType]}}</span> -->

+ 5 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/profession_list.vue

@@ -34,12 +34,16 @@
                             <div class="project_time">时长:
                                 <span v-if="item1.reportTimeType == 0" style="margin-right:10px;">{{fullDayTxt[item1.timeType]}}</span>
                                 <span v-if="item1.reportTimeType == 2" style="margin-right:10px;">{{item1.startTime+'-'+item1.endTime}}</span>{{item1.time.toFixed(1)}}h
-                                <div class="button" v-if="item1.isOvertime == 1">加班</div>
+                                <div class="button" v-if="item1.isOvertime == 1">加班<span v-if="item1.overtimeHours">{{item1.overtimeHours.toFixed(1)}}h</span></div>
                             </div>
                             <div class="project_content">事项:<span v-html="item1.content"></span></div>
                             
                         </div>
                         <div v-if="item1.multiWorktime == 1">
+                            <div>
+                                项目时长:<span style="margin-right:10px;">{{item1.time.toFixed(1)}}h</span>
+                                <div class="button" v-if="item1.isOvertime == 1">加班<span v-if="item1.overtimeHours">{{item1.overtimeHours.toFixed(1)}}h</span></div>
+                            </div>
                             <div style="position:relative;border:#ccc 0.5px solid;padding:3px;margin:5px 0px;" v-for="(timeItem, index) in item1.worktimeList" :key="index" >
                                 <div class="project_time">时长:
                                     <!-- <span v-if="timeItem.reportTimeType == 0" style="margin-right:10px;">{{fullDayTxt[item1.timeType]}}</span> -->

+ 3 - 2
fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue

@@ -57,12 +57,13 @@
                             <div class="project_time">时长:
                                 <span v-if="item1.reportTimeType == 0" style="margin-right:10px;">{{fullDayTxt[item1.timeType]}}</span>
                                 <span v-if="item1.reportTimeType == 2" style="margin-right:10px;">{{item1.startTime+'-'+item1.endTime}}</span>{{item1.time.toFixed(1)}}h
-                                <div class="button" v-if="item1.isOvertime == 1">加班</div>
+                                <div class="button" v-if="item1.isOvertime == 1">加班<span v-if="item1.overtimeHours">{{item1.overtimeHours.toFixed(1)}}h</span></div>
                             </div>
                             <div class="project_content">事项:<span v-html="item1.content"></span></div>
                             
                         </div>
                         <div v-if="item1.multiWorktime == 1">
+                            <div>项目时长:<span style="margin-right:10px;">{{item1.time.toFixed(1)}}h</span> <div class="button" v-if="item1.isOvertime == 1">加班<span v-if="item1.overtimeHours">{{item1.overtimeHours.toFixed(1)}}h</span></div></div>
                             <div style="position:relative;border:#ccc 0.5px solid;padding:3px;margin:5px 0px;" v-for="(timeItem, index) in item1.worktimeList" :key="index" >
                                 <div class="project_time">时长:
                                     <!-- <span v-if="timeItem.reportTimeType == 0" style="margin-right:10px;">{{fullDayTxt[item1.timeType]}}</span> -->
@@ -243,7 +244,7 @@
     }
     .button {
         float: right;
-        width: 50px;
+        width: 80px;
         height: 25px;
         line-height: 25px;
         text-align: center;