Selaa lähdekoodia

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

山水共长天一色 3 vuotta sitten
vanhempi
commit
2a8a1483e3
42 muutettua tiedostoa jossa 780 lisäystä ja 115 poistoa
  1. 36 9
      fhKeeper/formulahousekeeper/inva_4_tivo/index.html
  2. 105 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyCertController.java
  3. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LeaveSheetController.java
  4. 20 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  5. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCertController.java
  6. 5 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  7. 48 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/CompanyCert.java
  8. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  9. 11 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java
  10. 60 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserCert.java
  11. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/CompanyCertMapper.java
  12. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  13. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserCertMapper.java
  14. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CompanyCertService.java
  15. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/LeaveSheetService.java
  16. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserCertService.java
  17. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  18. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyCertServiceImpl.java
  19. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  20. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  21. 23 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  22. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserCertServiceImpl.java
  23. 84 42
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  24. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  25. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyCertMapper.xml
  26. 17 10
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  27. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserCertMapper.xml
  28. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml
  29. 1 1
      fhKeeper/formulahousekeeper/timesheet/config/index.js
  30. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/permissions.js
  31. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/Register.vue
  32. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  33. 42 0
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  34. 19 3
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  35. 27 7
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  36. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  37. 36 2
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  38. 5 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/department_list.vue
  39. 5 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/index.vue
  40. 5 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/profession_list.vue
  41. 3 2
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue
  42. 10 10
      fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

+ 36 - 9
fhKeeper/formulahousekeeper/inva_4_tivo/index.html

@@ -16,13 +16,14 @@
     <link rel="icon" href="images/favicon.png">
     <!-- 定价方案(改版)样式 -->
     <link rel="stylesheet" href="./css/revision.css">
-    <script>
+    <!-- <script>
         var _hmt = _hmt || [];
         (function() {
           var hm = document.createElement("script");
           hm.src = "https://hm.baidu.com/hm.js?db6f9072933f13477e2679fb672a8761";
           var s = document.getElementsByTagName("script")[0];
           s.parentNode.insertBefore(hm, s);
+          console.log(hm, s, '你看看')
         })();
     </script>
     
@@ -34,7 +35,7 @@
       var s = document.getElementsByTagName("script")[0]; 
       s.parentNode.insertBefore(hm, s);
     })();
-    </script>
+    </script> -->
     
 </head>
 <body data-spy="scroll" data-target=".fixed-top" style="overflow-y:none">
@@ -108,7 +109,8 @@
                     <div class="row">
                         <div class="col-lg-12 col-xl-12">
                             <div class="text-container">
-                                <p class="indx">为工时填报、工时统计提供专业解决方案。提供简易的<a href='http://worktime.ttkuaiban.com/upload/员工工时统计模板.xlsx' style="color:#ffcc66;">员工工时记录表Excel</a>,上传后自动分析统计;也能提供丰富完善的个性化功能,适用于智能科技,项目研发管理,广告设计和工程项目等多种领域。</p>
+                                <!-- <p class="indx">为工时填报、工时统计提供专业解决方案。提供简易的<a href='http://worktime.ttkuaiban.com/upload/员工工时统计模板.xlsx' style="color:#ffcc66;">员工工时记录表Excel</a>,上传后自动分析统计;也能提供丰富完善的个性化功能,适用于智能科技,项目研发管理,广告设计和工程项目等多种领域。</p> -->
+                                <p class="indx">为企业工时填报,工时统计,核算项目人力成本提供专业解决方案。提供项目任务管理,项目预算设置,费用报销,客户管理,请假差旅采购等。对软硬件研发,产品设计,生产制造,药研CRO/SMO,工程管理等领域提供个性化服务。</p>
                                 <div class="col-lg-9 col-md-9 col-xl-9" style="margin: 0 auto;display: flex;justify-content: space-around;flex-wrap: wrap;margin-left: 27.5rem;">
                                     <div style="width: 100%;" class="ald">
                                         <!-- <a class="btn-solid-lg btn-solid-lg-white page-scroll overload">软件演示 -->
@@ -159,7 +161,7 @@
 		    <p><span style="color: #333">客服QQ:</span>3052894409</p>
 		</div>
         <!-- 简易版 -->
-        <div class="product">
+        <!-- <div class="product">
             <div class="pro_tops" style="padding-bottom: 0;">
                 <h2>Excel简易版</h2>
                 <p>EXCEL EASY VERSION</p>
@@ -167,7 +169,7 @@
             <div class="pro_con_pl">
                 <img src="images/img/cait.png" alt="">
             </div>
-        </div>
+        </div> -->
 
         <!-- 产品应用场景 -->
         <div class="product">
@@ -338,7 +340,7 @@
                 <p>PRICE PLAN</p>
             </div>
             <div class="pri">
-                <div class="li">
+                <!-- <div class="li">
                     <div class="li_con">
                         <div>Excel简易版</div>
                         <div>¥<span>58</span>/人/年</div>
@@ -361,7 +363,7 @@
                         </ul>
                     </div>
                     <div class="btn"><a href="http://worktime.ttkuaiban.com/#/login"></a></div>
-                </div>
+                </div> -->
 
                 <div class="li">
                     <div class="li_con">
@@ -406,8 +408,8 @@
                             <li>项目成本预估</li>
                             <li>费用报销管理</li>
                             <li>项目报表服务</li>
-                            <li>客户管理</li>
                             <li>支持PC端,微信端和钉钉填报</li>
+                            <li></li>
                         </ul>
                     </div>
                     <div class="btn"><a href="http://worktime.ttkuaiban.com/#/login"></a></div>
@@ -423,7 +425,7 @@
                             <li>技术支持: 7X24小时</li>
                             <li>1对1客服</li>
                             <li>免费使用培训</li>
-                            <li style="color: #ff6565;">项目管理全部功能+</li>
+                            <li style="color: #ff6565;">项目管理专业版全部功能+</li>
                             <li>工程专业管理</li>
                             <li>项目关联专业</li>
                             <li>设置专业负责人</li>
@@ -437,6 +439,31 @@
                     </div>
                     <div class="btn"><a href="http://worktime.ttkuaiban.com/#/login"></a></div>
                 </div>
+
+                <div class="li">
+                    <div class="li_con">
+                        <div>企业旗舰版</div>
+                        <div>¥<span>368</span>/人/年</div>
+                    </div>
+                    <div>
+                        <ul style="padding: 0;">
+                            <li>技术支持: 7X24小时</li>
+                            <li>1对1客服</li>
+                            <li>免费使用培训</li>
+                            <li style="color: #ff6565;">项目管理专业版全部功能+</li>
+                            <li>自定义审批流</li>
+                            <li>请假管理</li>
+                            <li>出差管理</li>
+                            <li>客户管理</li>
+                            <li>日报审批流</li>
+                            <li>请假审批流</li>
+                            <li>出差审批流</li>
+                            <li>支持PC端,微信端和钉钉填报</li>
+                            <li></li>
+                        </ul>
+                    </div>
+                    <div class="btn"><a href="http://worktime.ttkuaiban.com/#/login"></a></div>
+                </div>
             </div>
         </div>
 

+ 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">

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

@@ -2,7 +2,7 @@ var path = require('path')
 
 //  var ip = '127.0.0.1'
 // var ip = '192.168.2.20'
-var ip = '192.168.2.25'
+var ip = '192.168.2.32'
 // var ip = '47.100.37.243' 
 
 // var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -26,7 +26,7 @@ const StringUtil = {
         reportsPersonnel: false, // 查看相关人员工时 // 后台
         reportsFillOut: false, // 代填日报 //
         reportsDeleteAll: false, // 删除全公司日报
-        importReport: false, //导入工时
+        importReport: false, //导入工时lij
 
         // 财务核算成本 
         financialCustom: false, // 自定义薪资项 // 

+ 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>

+ 42 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -26,6 +26,7 @@
             <el-form-item label="加班设置" prop="allday">
                 <el-checkbox v-model="timeType.payOvertime" label="加班工时记入成本" />
                 <!-- <el-checkbox v-model="timeType.doubleOvertime" label="加班双倍成本" :disabled="!timeType.payOvertime"/> -->
+                <el-input v-model="timeType.overtimeRatio" placeholder="" clearable style="width: 100px;margin: 0 10px 0 20px" v-if="timeType.payOvertime" @keyup.native="timeType.overtimeRatio = oninput(timeType.overtimeRatio, 1)"></el-input> <span v-if="timeType.payOvertime">倍工资</span>
             </el-form-item>
             </el-form>
             
@@ -503,6 +504,17 @@
                         } else {
                             param.customDataActive = 0
                         }
+                        if(param.payOvertime) {
+                            if(param.overtimeRatio == 0 || param.overtimeRatio == '') {
+                                this.$message({
+                                    message:"请设置加班几倍工资",
+                                    type:"error"
+                                })
+                                return
+                            }
+                        }
+                        // console.log(param, '将要提交的值')
+                        // return
                         this.http.post('/time-type/save',param,
                             res => {
                                 this.listLoading = false;
@@ -559,6 +571,36 @@
                     );
             },
 
+            // 限制加班填写的即被工作
+             oninput(num, limit) {
+                var str = num
+                var len1 = str.substr(0, 1)
+                var len2 = str.substr(1, 1)
+                //如果第一位是0,第二位不是点,就用数字把点替换掉
+                if (str.length > 1 && len1 == 0 && len2 != ".") {
+                    str = str.substr(1, 1)
+                }
+                //第一位不能是.
+                if (len1 == ".") {
+                    str = ""
+                }
+                //限制只能输入一个小数点
+                if (str.indexOf(".") != -1) {
+                    var str_ = str.substr(str.indexOf(".") + 1)
+                    if (str_.indexOf(".") != -1) {
+                    str = str.substr(0, str.indexOf(".") + str_.indexOf(".") + 1)
+                    }
+                }
+                //正则替换
+                str = str.replace(/[^\d^\.]+/g, '') // 保留数字和小数点
+                if (limit / 1 === 1) {
+                    str = str.replace(/^\D*([0-9]\d*\.?\d{0,1})?.*$/,'$1') // 小数点后只能输 1 位
+                } else {
+                    str = str.replace(/^\D*([0-9]\d*\.?\d{0,2})?.*$/,'$1') // 小数点后只能输 2 位
+                }
+                return str
+            }
+
         },
         created() {
             let height = window.innerHeight;

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

@@ -287,6 +287,7 @@
                         </div>
                     </div>
                 </div>
+
             </el-form>
             <span slot="footer" class="dialog-footer">
                 <el-button @click="dialogVisible=false">取消</el-button>
@@ -1207,13 +1208,27 @@
             submitInsert() {
                 var form = {}
                 var ssR = this.upRepeat(this.insertForm.certJson)
+                var trs = true
                 this.$refs.form1.validate(valid => {
                     if (valid) {
                         this.submitLoading = true;
                         if(ssR) {
                             this.$message({
                                 message: '重复证书',
-                                type: 'warning'
+                                type: 'error'
+                            });
+                            this.submitLoading = false;
+                            return false
+                        }
+                        for(var s in this.insertForm.certJson) {
+                            if(!this.insertForm.certJson[s].certDate || !this.insertForm.certJson[s].certId) {
+                                trs = false
+                            }
+                        }
+                        if(!trs) {
+                            this.$message({
+                                message: '证书未填写完整',
+                                type: 'error'
                             });
                             this.submitLoading = false;
                             return false
@@ -1241,9 +1256,10 @@
                         }
                     }
                 });
-                // console.log(form, '提交的数据')
+                console.log(form, '提交的数据')
                 // return
-                if(!ssR) {
+                console.log(ssR, trs)
+                if(!ssR && trs) {
                     this.http.post( this.port.manage.insert, form,
                     res => {
                         this.submitLoading = false;

+ 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" >

+ 36 - 2
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -217,9 +217,15 @@
                     </div>
                     
                     <div class="overtime" >
-                        <van-checkbox :disabled="!canEdit" v-model="item.isOvertime" v-if="reportTimeType.multiWorktime !=1">加班</van-checkbox>
+                        <div class="overTimeClas">
+                            <van-checkbox :disabled="!canEdit" v-model="item.isOvertime" style="width: 4.3rem;">加班</van-checkbox>
+                            <van-field v-model="item.overtimeHours" type="number" :disabled="!canEdit || item.isOvertime==null||item.isOvertime==0"
+                            placeholder="请输入加班时长" style="width: 5rem"></van-field>
+                            <span :class="canEdit ? 'overListTime' : 'overListTime hoveOver'">小时</span>    
+                        </div>
                         <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> -->
+                        <!-- <van-tag style="position:absolute;right:10px;" type="primary" size="large" @click="takePhoto(index)">拍照上传</van-tag> -->
                     </div>
                     <div style="padding:5px;text-align:center;" v-if="!isIOSystem">
                         <span v-for="(p, index) in item.pics"  :key="p" style="margin-right:15px;">
@@ -868,6 +874,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 +1294,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) {
@@ -1510,7 +1524,12 @@
             margin-right: 5px;
         }
     }
-    
+    .overTimeClas{
+        display: flex;
+        width: 7.4rem;
+        // justify-content: space-between;
+        align-items: center;
+    }
 </style>
 <style lang="less">
     
@@ -1556,6 +1575,21 @@
         text-overflow:ellipsis;
         white-space: nowrap;
     }
+    .overListTime {
+        margin-left:5px;
+        display: inline-block;
+        width: 2rem;
+        color: #646566;
+    }
+    .hoveOver {
+        color: #C8C9CC;
+    }
+    .van-checkbox__label {
+        color: #646566 !important;
+    }
+    .van-checkbox__label--disabled {
+        color: #c8c9cc !important;
+    }
 </style>
 
 

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

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

@@ -4,17 +4,17 @@ const path = require('path');
 const themePath = path.resolve(__dirname,'src/assets/style/theme.less');
 
 // var ip = '127.0.0.1'
-// var ip = '192.168.2.159'
+var ip = '192.168.2.27'
 // var ip = '47.100.37.243'
-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检查