seyason %!s(int64=4) %!d(string=hai) anos
pai
achega
960d40e259
Modificáronse 28 ficheiros con 494 adicións e 120 borrados
  1. 28 0
      fhKeeper/formulahousekeeper/inva_4_tivo/css/styles.css
  2. 10 11
      fhKeeper/formulahousekeeper/inva_4_tivo/index.html
  3. 33 0
      fhKeeper/formulahousekeeper/management-platform/pom.xml
  4. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DepartmentController.java
  5. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  6. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  7. 13 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Department.java
  8. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  9. 8 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java
  10. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/DepartmentVO.java
  11. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ProjectDataItem.java
  12. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DepartmentService.java
  13. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  14. 48 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  15. 29 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  16. 100 24
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  17. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  18. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CodeGenerator.java
  19. 8 7
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/DepartmentMapper.xml
  20. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  21. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  22. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml
  23. 28 8
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  24. 21 10
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  25. 96 16
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  26. 6 7
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  27. 10 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  28. 1 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue

+ 28 - 0
fhKeeper/formulahousekeeper/inva_4_tivo/css/styles.css

@@ -2180,6 +2180,8 @@ a:hover.back-to-top {
 	z-index: 99999999;
 }
 
+
+
 .overload .service img {
 	width: 8rem;
 }
@@ -2197,6 +2199,32 @@ a:hover.back-to-top {
 	display: block;
 }
 
+.overload .service2 {
+	display: none;
+	position: absolute;
+	top: 2.8rem;
+	padding: 1rem;
+	background: #fff;
+	box-shadow: 3px 3px 10px #ccc;
+	z-index: 99999999;
+}
+
+.overload .service2 img {
+	width: 8rem;
+}
+
+.overload .service2 p {
+	margin-bottom: 0;
+	margin: 0.5rem 0;
+}
+
+.overload .service2 p:last-child {
+	color: #20a0ff;
+}
+
+.overload:hover .service2 {
+	display: block;
+}
 #scenes {
 	background: #f3f7fd;
 }

+ 10 - 11
fhKeeper/formulahousekeeper/inva_4_tivo/index.html

@@ -3,9 +3,9 @@
 <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-    <meta name="keywords" content="工时管理,工时统计,工时填报,项目成本统计,人员成本统计,生产工时管理系统,工时成本管理,工时管理软件,研发工时管理系统,企业工时管理系统,项目工时统计,项目工时统计软件,项目工时统计系统,工时统计系统,工时统计表" />
-    <meta name="description" content="工时管家提供专业的工时填报和统计报表。支持PC和手机端。可按项目,部门,岗位等多维度统计成本。"/>
-    <title>工时管家-专注工时管理,手机移动填报,核算项目投入人力成本,企业IPO利器!</title>
+    <meta name="keywords" content="工时管理,成本管理,工时统计,项目成本统计,生产工时管理系统" />
+    <meta name="description" content="工时管家是专业的工时管理软件,提供专业的工时填报,审核和统计功能。引进现代工时管理的理念,核算项目投入成本准确便捷,企业IPO利器"/>
+    <title>工时管理|工时记录|成本管理-工时管家是专业便捷的工时管理系统。 手机移动填报|核算项目成本|企业IPO利器!</title>
     <link href="https://fonts.googleapis.com/css?family=Open+Sans:400,400i,700&display=swap&subset=latin-ext" rel="stylesheet">
     <link href="css/bootstrap.css" rel="stylesheet">
     <!-- <link href="css/fontawesome-all.css" rel="stylesheet"> -->
@@ -97,13 +97,12 @@
                             <p class="p-large">为工时填报/审核/统计提供专业解决方案,支持PC端和<b>手机端</b>。基于项目/部门/岗位<b>多维度统计</b>工时,实现可视化工时数据展示。</p>
                             <div class="col-lg-9 col-md-9 col-xl-9" style="margin: 0 auto;">
                                 <a class="btn-solid-lg btn-solid-lg-white page-scroll overload" style="margin-right: 5rem;">软件演示
-                                    <div class="service">
-                                        <p style="color: #333">扫码获取演示账号</p>
+                                    <div class="service2">
+                                        <p style="color: #333">微信扫码</p>
                                         <img src="./images/code.jpg">
-                                        <p><span style="color: #333">QQ:</span>3052894409</p>
+                                        <p><span style="color: #333">客服QQ:</span>3052894409</p>
                                     </div>
                                 </a>
-                            
                                 <a class="btn-solid-lg page-scroll" style="margin-right: 5rem;" href="http://worktime.ttkuaiban.com/#/login" target="_blank">免费使用</a>
                                 <a class="btn-solid-lg page-scroll" href="./mobile.html" target="_blank">手机版</a>
                             </div>
@@ -197,7 +196,7 @@
                         </div>
                         <div class="card-body">
                             <h4 class="card-title">工时日报</h4>
-                            <p>员工填写工时日报<br>领导在线查看审批<br>支持微信端方便快捷</p>
+                            <p>员工填写工时日报<br>项目经理在线审批<br>支持微信端方便快捷</p>
                         </div>
                     </div>
                     <div class="card">
@@ -228,7 +227,7 @@
                         </div>
                         <div class="card-body">
                             <h4 class="card-title">项目管理</h4>
-                            <p>多项目同时在线管理<br>按项目划分人员<br>有利于领导对项目整体进度进行调整</p>
+                            <p>项目和子项目在线管理<br>按项目划分人员<br>有利于领导对项目整体进度进行调整</p>
                         </div>
                     </div>
                     <div class="card">
@@ -236,8 +235,8 @@
                             <img class="img-fluid" src="images/5.png" alt="alternative">
                         </div>
                         <div class="card-body">
-                            <h4 class="card-title">组织结构</h4>
-                            <p>多级部门层级<br>支持批量导入员工<br>员工和领导权限分离</p>
+                            <h4 class="card-title">自动计时</h4>
+                            <p>选择项目开始计时<br>停止计时自动计算时长<br>一键生成日报,方便快捷</p>
                         </div>
                     </div>
                     <div class="card">

+ 33 - 0
fhKeeper/formulahousekeeper/management-platform/pom.xml

@@ -18,6 +18,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.github.pagehelper</groupId>
             <artifactId>pagehelper-spring-boot-starter</artifactId>
@@ -125,4 +129,33 @@
             </plugin>
         </plugins>
     </build>
+
+    <!--配置阿里云仓库-->
+    <repositories>
+        <repository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
 </project>

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

@@ -48,8 +48,8 @@ public class DepartmentController {
      * parentId 父级部门id
      */
     @RequestMapping("/add")
-    public HttpRespMsg insertDepartment(@RequestParam String name, Integer parentId, HttpServletRequest request) {
-        return departmentService.insertDepartment(name, parentId, request);
+    public HttpRespMsg insertDepartment(@RequestParam String name, Integer parentId, String managerId, HttpServletRequest request) {
+        return departmentService.insertDepartment(name, parentId, managerId, request);
     }
 
     /**
@@ -58,8 +58,8 @@ public class DepartmentController {
      * name 部门名称
      */
     @RequestMapping("/edit")
-    public HttpRespMsg updateDepartment(@RequestParam Integer id, @RequestParam String name, HttpServletRequest request) {
-        return departmentService.updateDepartment(id, name, request);
+    public HttpRespMsg updateDepartment(@RequestParam Integer id, @RequestParam String name, String managerId, HttpServletRequest request) {
+        return departmentService.updateDepartment(id, name, managerId, request);
     }
 
     /**

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

@@ -89,7 +89,11 @@ public class ReportController {
         String token = request.getHeader("Token");
         BigDecimal hourCost = userService.getById(token).getCost();
         SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+
+
         try {
+            System.out.println("reportTimeType.length=="+reportTimeType.length);
+            System.out.println("content.length=="+content.length);
             for (int i = 0; i < id.length; i++) {
                 Report report = new Report()
                         .setId(id[i] == -1 ? null : id[i])

+ 7 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java

@@ -89,6 +89,13 @@ public class UserController {
         return userService.editPassword(originPassword, newPassword, request);
     }
 
+    @RequestMapping("/resetPwd")
+    public HttpRespMsg resetPwd(@RequestParam String userId) {
+        return userService.resetPwd(userId);
+    }
+
+
+
     /**
      * 新增公司和负责人
      * companyName 公司名

+ 13 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Department.java

@@ -2,29 +2,28 @@ package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
-import java.io.Serializable;
-
 /**
  * <p>
  * 部门
  * </p>
  *
- * @author 吴涛涛
- * @since 2020-02-13
+ * @author Seyason
+ * @since 2021-03-31
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 public class Department extends Model<Department> {
 
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID=1L;
 
     /**
      * 主键
@@ -41,7 +40,7 @@ public class Department extends Model<Department> {
     /**
      * 上级部门id
      */
-    @TableField(value = "superior_id", updateStrategy = FieldStrategy.IGNORED)
+    @TableField("superior_id")
     private Integer superiorId;
 
     /**
@@ -50,6 +49,12 @@ public class Department extends Model<Department> {
     @TableField("company_id")
     private Integer companyId;
 
+    /**
+     * 部门负责人id
+     */
+    @TableField(value = "manager_id", updateStrategy= FieldStrategy.IGNORED)
+    private String managerId;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-02-27
+ * @since 2021-03-29
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -66,6 +66,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("type")
     private Integer type;
 
+    /**
+     * 是否计算加班工时工资
+     */
+    @TableField("pay_overtime")
+    private Boolean payOvertime;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -16,7 +16,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-02-27
+ * @since 2021-03-31
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -103,10 +103,17 @@ public class User extends Model<User> {
     @TableField("salary_type")
     private Integer salaryType;
 
+    /**
+     * 管理的部门
+     */
+    @TableField("manage_dept_id")
+    private Integer manageDeptId;
+
 
     @TableField(exist = false)
     private String departmentName;
 
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/DepartmentVO.java

@@ -15,6 +15,7 @@ public class DepartmentVO {
     private Integer id;
     private String label;
     private Integer parentId;
+    private String managerId;
     private List<DepartmentVO> children;
     private List<HashMap> userList;
 }

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

@@ -0,0 +1,10 @@
+package com.management.platform.entity.vo;
+
+import java.math.BigDecimal;
+
+public class ProjectDataItem {
+    public int id;
+    public String project;
+    public double cost;
+    public BigDecimal costMoney;
+}

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

@@ -15,9 +15,9 @@ import javax.servlet.http.HttpServletRequest;
  * @since 2020-02-11
  */
 public interface DepartmentService extends IService<Department> {
-    HttpRespMsg insertDepartment(String departmentName, Integer superiorId, HttpServletRequest request);
+    HttpRespMsg insertDepartment(String departmentName, Integer superiorId, String managerId, HttpServletRequest request);
 
-    HttpRespMsg updateDepartment(Integer departmentId, String departmentName, HttpServletRequest request);
+    HttpRespMsg updateDepartment(Integer departmentId, String departmentName, String managerId, HttpServletRequest request);
 
     HttpRespMsg deleteDepartment(Integer departmentId, HttpServletRequest request);
 

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

@@ -37,4 +37,6 @@ public interface UserService extends IService<User> {
     HttpRespMsg importUser(Integer departmentId, MultipartFile multipartFile, HttpServletRequest request);
 
     HttpRespMsg switchPermission(String id, HttpServletRequest request);
+
+    HttpRespMsg resetPwd(String userId);
 }

+ 48 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -36,7 +36,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
 
     //新增部门
     @Override
-    public HttpRespMsg insertDepartment(String departmentName, Integer superiorId, HttpServletRequest request) {
+    public HttpRespMsg insertDepartment(String departmentName, Integer superiorId, String managerId, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
@@ -47,9 +47,18 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 Department department = new Department()
                         .setDepartmentName(departmentName)
                         .setSuperiorId(superiorId)
+                        .setManagerId(managerId)
                         .setCompanyId(companyId);
                 if (departmentMapper.insert(department) == 0) {
-                    httpRespMsg.setError("修改失败");
+                    httpRespMsg.setError("添加失败");
+                } else {
+                    //修改负责人的部门
+                    if (managerId != null) {
+                        User manager = new User();
+                        manager.setId(managerId);
+                        manager.setManageDeptId(department.getDepartmentId());
+                        userMapper.updateById(manager);
+                    }
                 }
             } else {
                 httpRespMsg.setError("无所选父级部门");
@@ -63,7 +72,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
 
     //更新部门
     @Override
-    public HttpRespMsg updateDepartment(Integer departmentId, String departmentName, HttpServletRequest request) {
+    public HttpRespMsg updateDepartment(Integer departmentId, String departmentName,String managerId, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
@@ -71,8 +80,34 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             if (!department.getCompanyId().equals(companyId)) {
                 httpRespMsg.setError("不能修改其他公司的部门");
             } else {
-                if (departmentMapper.updateById(department.setDepartmentName(departmentName)) == 0) {
+                department.setDepartmentName(departmentName);
+                department.setManagerId(managerId);
+                if (departmentMapper.updateById(department) == 0) {
                     httpRespMsg.setError("修改失败");
+                } else {
+                    //修改负责人的部门
+                    if (managerId != null) {
+                        User manager = userMapper.selectById(managerId);
+                        if (!departmentId.equals(manager.getManageDeptId())) {
+                            //部门负责人发生变化了,找到之前的部门的负责人,取消管理的部门
+                            User manageDeptOldUser= userMapper.selectOne(new QueryWrapper<User>().eq("manage_dept_id", departmentId));
+                            if (manageDeptOldUser != null) {
+                                manageDeptOldUser.setManageDeptId(0);
+                                userMapper.updateById(manageDeptOldUser);
+                            }
+
+                            //新的部门负责人设置管理的部门
+                            manager.setManageDeptId(departmentId);
+                            userMapper.updateById(manager);
+                        }
+                    } else {
+                        //取消了部门管理员
+                        User manageDeptOldUser= userMapper.selectOne(new QueryWrapper<User>().eq("manage_dept_id", departmentId));
+                        if (manageDeptOldUser != null) {
+                            manageDeptOldUser.setManageDeptId(0);
+                            userMapper.updateById(manageDeptOldUser);
+                        }
+                    }
                 }
             }
         } catch (NullPointerException e) {
@@ -100,6 +135,9 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                     userMapper.update(new User().setDepartmentId(0).setDepartmentCascade("0"), new QueryWrapper<User>()
                             .eq("company_id", companyId)
                             .eq("department_id", departmentId));
+                    //修改部门负责人
+                    userMapper.update(new User().setManageDeptId(0), new QueryWrapper<User>()
+                            .eq("manage_dept_id", departmentId));
                 }
             }
         } catch (NullPointerException e) {
@@ -242,6 +280,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         //这俩东西并没有继承关系
         return new DepartmentVO()
                 .setId(department.getDepartmentId())
+                .setManagerId(department.getManagerId())
                 .setLabel(department.getDepartmentName())
                 .setParentId(department.getSuperiorId());
     }
@@ -293,16 +332,16 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 List<Map<String, Object>> list = departmentMapper
                         .getCostByUser(getBranchDepartment(departmentId, companyId), startDate, endDate);
                 Map<String, List<Map<String, Object>>> tempMap = new HashMap<>();
-                Double totalCostMoney = (double) 0;
+                BigDecimal totalCostMoney = new BigDecimal(0);
                 for (Map<String, Object> map : list) {
                     if (tempMap.containsKey(map.get("user"))) {
                         //这个名字已经装进数组中了
                         List<Map<String, Object>> tempList = tempMap.get(map.get("user"));
                         Map<String, Object> dataMap = new HashMap<>();
                         dataMap.put("project", map.get("project"));
-                        Double money = (Double) map.getOrDefault("money", 0);
+                        BigDecimal money = (BigDecimal) map.getOrDefault("money", 0);
                         Double time = (Double) map.getOrDefault("time", 0);
-                        totalCostMoney += money;
+                        totalCostMoney = totalCostMoney.add(money);
                         dataMap.put("money", money);
                         dataMap.put("time", time);
                         tempList.add(dataMap);
@@ -312,9 +351,9 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                         if (map.containsKey("project")) {
                             Map<String, Object> dataMap = new HashMap<>();
                             dataMap.put("project", map.get("project"));
-                            Double money = (Double) map.getOrDefault("money", 0);
+                            BigDecimal money = (BigDecimal) map.getOrDefault("money", 0);
                             Double time = (Double) map.getOrDefault("time", 0);
-                            totalCostMoney += money;
+                            totalCostMoney = totalCostMoney.add(money);
                             dataMap.put("money", money);
                             dataMap.put("time", time);
                             tempList.add(dataMap);

+ 29 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
+import com.management.platform.entity.vo.ProjectDataItem;
 import com.management.platform.entity.vo.ProjectVO;
 import com.management.platform.mapper.*;
 import com.management.platform.service.ProjectService;
@@ -19,6 +20,10 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAccessor;
 import java.util.*;
 
 
@@ -43,6 +48,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     private ProjectTimerMapper projectTimerMapper;
     @Resource
+    private TimeTypeMapper timeTypeMapper;
+    @Resource
     private HttpServletResponse response;
 
     @Value(value = "${upload.path}")
@@ -169,13 +176,30 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return httpRespMsg;
     }
 
+    private static int monthsNum(String startDate, String endDate) {
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate localDateTime = LocalDate.parse(startDate, df);
+        LocalDate localDateTime2 = LocalDate.parse(endDate, df);
+
+        int m = (localDateTime2.getYear() - localDateTime.getYear())*12 + (localDateTime2.getMonthValue() - localDateTime.getMonthValue()) + 1;
+        return m;
+    }
+
+    public static void main(String[] args) {
+        String startDate = "2020-12-01";
+        String endDate = "2021-01-31";
+        System.out.println(monthsNum(startDate, endDate));
+    }
+
     //获取查询者所在公司每个项目的工时成本
     @Override
     public HttpRespMsg getTimeCost(String startDate, String endDate, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
+            //根据系统配置的员工成本计算方式,按固定时薪还是固定月薪,分情况计算。
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
             Map<String, Object> resultMap = new HashMap<>();
+            //时薪固定计算
             List<Map<String, Object>> list = projectMapper.getTimeCost(companyId, startDate, endDate);
             BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
             for (Map<String, Object> map : list) {
@@ -185,7 +209,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if (!map.containsKey("costMoney")) {
                     map.put("costMoney", 0);
                 } else {
-                    totalMoneyCost = totalMoneyCost.add(BigDecimal.valueOf((Double) map.get("costMoney")));
+                    totalMoneyCost = totalMoneyCost.add((BigDecimal)map.get("costMoney"));
                 }
             }
             resultMap.put("costList", list);
@@ -222,14 +246,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if (!map.containsKey("costMoney")) {
                     map.put("costMoney", 0);
                 } else {
-                    totalMoneyCost = totalMoneyCost.add(BigDecimal.valueOf((Double) map.get("costMoney")));
+                    totalMoneyCost = totalMoneyCost.add((BigDecimal)map.get("costMoney"));
                 }
                 totalCostTime += (Double)map.get("cost");
                 List<String> rowData = new ArrayList<String>();
                 rowData.add((String)map.get("project"));
                 rowData.add("");
                 rowData.add(((Double)map.get("cost")).toString());
-                rowData.add(((Double)map.get("costMoney")).toString());
+                rowData.add(((BigDecimal)map.get("costMoney")).toString());
                 allList.add(rowData);
                 //统计每个项目中的人员时间成本投入
                 int projectId = (Integer)map.get("id");
@@ -240,7 +264,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     membRowData.add("");
                     membRowData.add((String)membMap.get("name"));
                     membRowData.add(((Double)membMap.get("cost")).toString());
-                    membRowData.add(((Double)membMap.get("costMoney")).toString());
+                    membRowData.add(((BigDecimal)membMap.get("costMoney")).toString());
                     allList.add(membRowData);
                 }
             }
@@ -281,7 +305,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if (!map.containsKey("costMoney")) {
                         map.put("costMoney", 0);
                     } else {
-                        totalMoneyCost = totalMoneyCost.add(BigDecimal.valueOf((Double) map.get("costMoney")));
+                        totalMoneyCost = totalMoneyCost.add((BigDecimal)map.get("costMoney"));
                     }
                 }
                 resultMap.put("costList", list);

+ 100 - 24
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -18,6 +18,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.sql.Timestamp;
 import java.text.DecimalFormat;
 import java.text.ParseException;
@@ -110,30 +111,82 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     map.put("state", state);
                 }
 
-                int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", leaderId));
-                if (cnt > 0) {
-                    //担任项目经理,查找相关的人员的日报
-                    List<Map<String, Object>> puserNames = reportMapper.getReportNameByDate(date, user.getCompanyId(), leaderId);
-                    List<Map<String, Object>> inchargeReportList= reportMapper.getInchargeReportByDate(date, leaderId, null);
-                    for (Map<String, Object> map2 : puserNames) {
-                        nameList.add(map2);
-                        //再根据人分别获取当天的报告
-                        List<Map<String, Object>> list2 =
-                                inchargeReportList.stream().filter(i->i.get("creatorId").equals(map2.get("id"))).collect(Collectors.toList());
-                        map2.put("data", list2);
-                        double reportTime = 0;
-                        BigDecimal total = new BigDecimal(0);
-                        for (Map<String, Object> m : list2) {
-                            double t = (double) m.get("time");
-                            reportTime += t;
-                            total = total.add((BigDecimal)m.get("cost"));
+                //部门经理需要看本部门的所有人员的日报
+                if (user.getManageDeptId() != null &&  user.getManageDeptId() > 0) {
+                    int manageDeptId = user.getManageDeptId();
+                    //找到该部门的所有子部门
+                    List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
+                    Optional<Department> first = allDepts.stream().filter(d -> d.getDepartmentId().equals(manageDeptId)).findFirst();
+                    if (first.isPresent()) {
+                        Department department = first.get();
+                        //递归获取全部子部门
+                        List<Department> deptList = getSubDepts(department, allDepts);
+                        deptList.add(department);
+                        List ids = deptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
+                        nameList = reportMapper.getReportNameByDateAndDept(date,
+                                ids, null, null);
+
+                        if (nameList.size() > 0) {
+                            List<String> userIds = new ArrayList<>();
+                            nameList.forEach(n->{
+                                String id = (String) n.get("id");
+                                userIds.add(id);
+                            });
+                            List<Map<String, Object>> reportList = reportMapper.getUserReportByDate(date, userIds);
+                            for (Map<String, Object> memb : nameList) {
+                                //再根据人分别获取当天的报告
+                                List<Map<String, Object>> rList = new ArrayList<Map<String, Object>>();
+                                BigDecimal total = new BigDecimal(0);
+                                for (Map<String, Object> report : reportList) {
+                                    if (((String)report.get("creatorId")).equals((String)memb.get("id"))) {
+                                        rList.add(report);
+                                        total = total.add((BigDecimal) report.get("cost"));
+                                    }
+                                }
+                                memb.put("data", rList);
+                                memb.put("cost", total);
+                                double reportTime = 0;
+                                if (list.size() > 0) {
+                                    for (Map<String, Object> m : list) {
+                                        double t = (double) m.get("time");
+                                        reportTime += t;
+                                    }
+                                    memb.put("state", list.get(0).get("state"));
+                                }
+                                DecimalFormat df = new DecimalFormat("0.00");
+                                memb.put("reportTime", df.format(reportTime));
+                            }
+                        }
+                    }
+                } else {
+                    //非部门经理,检查是否是项目经理
+                    int cnt = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", leaderId));
+                    if (cnt > 0) {
+                        //担任项目经理,查找相关的人员的日报
+                        List<Map<String, Object>> puserNames = reportMapper.getReportNameByDate(date, user.getCompanyId(), leaderId);
+                        List<Map<String, Object>> inchargeReportList= reportMapper.getInchargeReportByDate(date, leaderId, null);
+                        for (Map<String, Object> map2 : puserNames) {
+                            nameList.add(map2);
+                            //再根据人分别获取当天的报告
+                            List<Map<String, Object>> list2 =
+                                    inchargeReportList.stream().filter(i->i.get("creatorId").equals(map2.get("id"))).collect(Collectors.toList());
+                            map2.put("data", list2);
+                            double reportTime = 0;
+                            BigDecimal total = new BigDecimal(0);
+                            for (Map<String, Object> m : list2) {
+                                double t = (double) m.get("time");
+                                reportTime += t;
+                                total = total.add((BigDecimal)m.get("cost"));
+                            }
+                            DecimalFormat df = new DecimalFormat("0.00");
+                            map2.put("reportTime", df.format(reportTime));
+                            map2.put("cost", total);
+                            map2.put("state", list2.get(0).get("state"));
                         }
-                        DecimalFormat df = new DecimalFormat("0.00");
-                        map2.put("reportTime", df.format(reportTime));
-                        map2.put("cost", total);
-                        map2.put("state", list2.get(0).get("state"));
                     }
                 }
+
+
             } else {
                 Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
                 List<Integer> ids = null;
@@ -151,9 +204,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 nameList = reportMapper.getReportNameByDateAndDept(date,
                         ids, targetUid, companyId);
-                nameList.forEach(n->{
-                    System.out.println("name=="+n.get("name"));
-                });
+
                 if (nameList.size() > 0) {
                     List<String> userIds = new ArrayList<>();
                     nameList.forEach(n->{
@@ -257,6 +308,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     public HttpRespMsg editReport(List<Report> reportList, String date) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         List<Integer> idList = new ArrayList<>();
+        BigDecimal hourCost = userMapper.selectById(reportList.get(0).getCreatorId()).getCost();
+        Integer companyId = userMapper.selectById(reportList.get(0).getCreatorId()).getCompanyId();
+        TimeType timeType = timeTypeMapper.selectById(companyId);
+        double totalWorkTime = 0;
+        for (Report report : reportList) {
+            totalWorkTime +=report.getWorkingTime();
+        }
         for (Report report : reportList) {
             //获取一下信息
             if (report.getWorkingTime() <= 0.0) {
@@ -264,12 +322,30 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 return httpRespMsg;
             }
             if (report.getId() == null) {
+                //检查是否存在计算加班工资的情况
+                if (!timeType.getPayOvertime()) {
+                    //不能超过最多时间,超过的话,等比例核算
+                    if (totalWorkTime > timeType.getAllday()) {
+                        BigDecimal cost = hourCost.multiply(new BigDecimal(timeType.getAllday()))
+                                .multiply(new BigDecimal(report.getWorkingTime())).divide(new BigDecimal(totalWorkTime), RoundingMode.HALF_UP);
+                        report.setCost(cost);
+                    }
+                }
                 if (reportMapper.insert(report) == 0) {
                     httpRespMsg.setError("操作失败");
                 }
             } else {
                 //只操作没有审核通过的
                 if (reportMapper.selectById(report.getId()).getState() != 1) {
+                    //检查是否存在计算加班工资的情况
+                    if (!timeType.getPayOvertime()) {
+                        //不能超过最多时间,超过的话,等比例核算
+                        if (totalWorkTime > timeType.getAllday()) {
+                            BigDecimal cost = hourCost.multiply(new BigDecimal(timeType.getAllday()))
+                                    .multiply(new BigDecimal(report.getWorkingTime())).divide(new BigDecimal(totalWorkTime), RoundingMode.HALF_UP);
+                            report.setCost(cost);
+                        }
+                    }
                     if (reportMapper.updateById(report) == 0) {
                         httpRespMsg.setError("操作失败");
                     }

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -548,4 +548,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         }
         return httpRespMsg;
     }
+
+    @Override
+    public HttpRespMsg resetPwd(String userId) {
+        User user = new User();
+        user.setId(userId);
+        user.setPassword(MD5Util.getPassword("000000"));
+        userMapper.updateById(user);
+
+        return new HttpRespMsg();
+    }
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CodeGenerator.java

@@ -204,7 +204,7 @@ public class CodeGenerator {
         //若想要生成的实体类继承某个Controller,则可打开下面注释。写上需要继承的Controller的位置即可
 //        strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
         //此处user是表名,多个英文逗号分割
-        strategy.setInclude("project_timer");
+        strategy.setInclude("user");
 //        strategy.setExclude();//数据库表全生成
 //        strategy.setInclude(scanner("user").split(","));//表名,多个英文逗号分割
         strategy.setControllerMappingHyphenStyle(true);

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

@@ -4,20 +4,21 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.management.platform.entity.Department">
-        <id column="department_id" property="departmentId"/>
-        <result column="department_name" property="departmentName"/>
-        <result column="superior_id" property="superiorId"/>
-        <result column="company_id" property="companyId"/>
+        <id column="department_id" property="departmentId" />
+        <result column="department_name" property="departmentName" />
+        <result column="superior_id" property="superiorId" />
+        <result column="company_id" property="companyId" />
+        <result column="manager_id" property="managerId" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        department_id, department_name, superior_id, company_id
+        department_id, department_name, superior_id, company_id, manager_id
     </sql>
 
     <!--根据部门获取成本-->
     <select id="getCostByDepartment" resultType="java.util.Map">
-        SELECT SUM(b.working_time) AS time, cast(SUM(b.working_time * a.cost) AS decimal(11,2)) AS money
+        SELECT SUM(b.working_time) AS time, SUM(b.cost) AS money
         FROM user AS a
         LEFT JOIN report AS b ON a.id = b.creator_id
         WHERE b.state = 1
@@ -32,7 +33,7 @@
 
     <!--根据人员获取成本-->
     <select id="getCostByUser" resultType="java.util.Map">
-        SELECT a.name AS user, c.project_name AS project, SUM(b.working_time) AS time, SUM(b.working_time * a.cost) AS
+        SELECT a.name AS user, c.project_name AS project, SUM(b.working_time) AS time, SUM(b.cost) AS
         money
         FROM user AS a
         LEFT JOIN report AS b ON a.id = b.creator_id

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

@@ -29,7 +29,7 @@
 
     <!--获取查询者所在公司每个项目的工时成本-->
     <select id="getTimeCost" resultType="java.util.Map">
-        SELECT a.id, a.project_name AS project, SUM(b.working_time) AS cost, SUM(b.working_time * c.cost) AS costMoney
+        SELECT a.id, a.project_name AS project, SUM(b.working_time) AS cost, SUM(b.cost) AS costMoney
         FROM project AS a
         LEFT JOIN report AS b ON b.project_id = a.id
         JOIN user AS c ON b.creator_id = c.id
@@ -44,7 +44,7 @@
 
     <!--获取某个项目每个人分别需要的工时-->
     <select id="getProjectCost" resultType="java.util.Map">
-        SELECT b.name, SUM(a.working_time) AS cost, SUM(a.working_time * b.cost) AS costMoney
+        SELECT b.name, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
         FROM report AS a
         JOIN user AS b ON a.creator_id = b.id
         WHERE a.project_id = #{projectId}

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

@@ -11,11 +11,12 @@
         <result column="month_days" property="monthDays" />
         <result column="hour_cost_input_type" property="hourCostInputType" />
         <result column="type" property="type" />
+        <result column="pay_overtime" property="payOvertime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        company_id, allday, am, pm, month_days, hour_cost_input_type, type
+        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime
     </sql>
 
 </mapper>

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

@@ -17,13 +17,15 @@
         <result column="cost" property="cost" />
         <result column="month_cost" property="monthCost" />
         <result column="salary_type" property="salaryType" />
+        <result column="manage_dept_id" property="manageDeptId" />
     </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
+        id, name, phone, password, portrait_url, create_time, role, company_id, department_id, department_cascade, cost, month_cost, salary_type, manage_dept_id
     </sql>
 
+
     <!--单独分页获取人员-->
     <select id="getUserByDepartment" resultType="java.util.Map">
         SELECT a.id, a.name, a.phone, a.portrait_url AS portraitUrl, a.role, a.company_id AS companyId, a.cost,

+ 28 - 8
fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue

@@ -1,17 +1,30 @@
 <template>
     <section>
         <el-col :span="24" style="padding-bottom: 0px;text-align:center;">
+            <!-- <el-date-picker
+                v-model="dateRange"
+                type="monthrange"
+                align="right"
+                unlink-panels
+                :clearable="false" 
+                range-separator="至"
+                start-placeholder="开始月份"
+                end-placeholder="结束月份"
+                :picker-options="pickerOptions"
+                value-format="yyyy-MM"
+                @change="getEchart">
+            </el-date-picker> -->
             <el-date-picker
-            v-model="dateRange"
-            type="daterange"
-            value-format="yyyy-MM-dd"
-            align="right"
-            unlink-panels
+            v-model="dateRange" :editable="false" 
+            format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
+            @change="getEchart" 
+            :clearable="true" 
             range-separator="至"
+            type="daterange" 
             start-placeholder="开始日期"
             end-placeholder="结束日期"
-            @change="getEchart">
-            </el-date-picker>
+            ></el-date-picker>
+
             <el-radio-group v-model="radio" @change="getEchart">
                 <el-radio-button label="项目"></el-radio-button>
                 <el-radio-button label="部门"></el-radio-button>
@@ -27,7 +40,7 @@
     export default {
         data() {
             return {
-                dateRange:null,
+                dateRange:[],
                 user: JSON.parse(sessionStorage.getItem("user")),
                 radio: sessionStorage.radio!=null?sessionStorage.radio:'项目',
                 containerHeight: 0,    
@@ -208,7 +221,14 @@
             };
             if (this.$route.query.startDate != null) {
                 this.dateRange = [this.$route.query.startDate, this.$route.query.endDate];
+            } else {
+                //默认查看本月
+                var now = new Date();
+                var t = util.formatDate.format(now, 'yyyy-MM-dd');
+                var startStr = util.formatDate.format(new Date(), 'yyyy-MM') + "-01";
+                this.dateRange = [startStr,t];
             }
+            
             this.getEchart();
             var _this = this;
             window.addEventListener("resize", function() {

+ 21 - 10
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -3,26 +3,34 @@
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
                 <el-form-item label="系统基础设置" style="margin-top:5px;">
-            </el-form-item>
+                </el-form-item>
+                <el-form-item  style="float:right">
+                    <el-button  type="primary" @click="submitInsert" :loading="addLoading">保存</el-button>
+                </el-form-item>
             </el-form>
         </el-col>
         <p style="padding-top:80px;margin-left:10px;color:#666;">员工时薪录入方式设置</p>
-        <div class="panel" style="height:100px;margin-left:20px;margin-right:20px;">
-        <el-radio v-model="timeType.hourCostInputType" :label="0" style="width:100%;margin-left:10px;">方式一: 录入月薪,自动计算时薪
-            <el-form ref="form0" :inline=true :model="timeType" label-width="120px">
-            <el-form-item label="平均每月工作" prop="monthDays">
-            <el-input v-model="timeType.monthDays"  type="number" style="width:150px;"></el-input>
+        <div class="panel" style="height:120px;margin-left:20px;margin-right:20px;">
+        <el-radio v-model="timeType.hourCostInputType" :label="0" style="width:100%;margin-left:10px;">方式一: 录入月成本,自动计算时薪<span class="tip">(适合企业全职员工)</span>
+            <el-form ref="form0" :inline="true" :model="timeType" label-width="150px" style="margin-top:10px;">
+            <el-form-item label="平均每月工作天数" prop="monthDays">
+            <el-input v-model="timeType.monthDays"  type="number" style="width:120px;"></el-input>
             </el-form-item>    
-            <el-form-item label="每日工作时长" prop="allday">
-                <el-select v-model="timeType.allday" placeholder="请选择工作时长" style="width:150px;" @change="timeChange">
+            <el-form-item label="每日正常工作时长" prop="allday">
+                <el-select v-model="timeType.allday" placeholder="请选择工作时长" style="width:120px;" @change="timeChange">
                     <el-option v-for="item in times" :key="item" :label="item" :value="item"></el-option>
                 </el-select>
-                小时<span style="color:orange;margin-left:10px;font-size:12px;vertical-align:center;">(时薪 = 月薪/每月工作天数/每天工作时长)</span>
+                小时
+            </el-form-item>
+            <el-form-item label="加班设置" prop="allday">
+                <el-checkbox v-model="timeType.payOvertime" label="加班工时记入成本" />
+                <!-- <el-checkbox v-model="timeType.doubleOvertime" label="加班双倍成本" :disabled="!timeType.payOvertime"/> -->
             </el-form-item>
             </el-form>
+            
         </el-radio>
-        <el-radio v-model="timeType.hourCostInputType" :label="1" style="width:100%;margin-left:10px;">方式二:直接录入时薪</el-radio>
+        <el-radio v-model="timeType.hourCostInputType" :label="1" style="width:100%;margin-left:10px;">方式二:直接录入时薪<span class="tip">(适合计时发放酬劳的小时工,兼职员工)</span></el-radio>
         </div>
         <el-divider></el-divider>
         <!--设置时长样式内容-->
@@ -254,4 +262,7 @@
     margin-top:30px;
     color: #999;
 }
+.tip {
+    margin-left:10px; color:gray;
+}
 </style>

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

@@ -49,7 +49,7 @@
                         <el-link type="danger" v-if="depData != null && depData.id != -1 && depData.id != 0" :underline="false" @click="deleteDep(null)">删除部门</el-link>
                     </el-form-item>
                     <el-form-item style="float:right;">
-                        <el-link type="primary" v-if="depData != null && depData.id != -1 && depData.id != 0" :underline="false" @click="createDepartment(-1)">新增子部门</el-link>
+                        <el-link type="primary" v-if="depData != null && depData.id != -1 && depData.id != 0" :underline="false" @click="createDepartment(-2)">新增子部门</el-link>
                     </el-form-item>
                 </el-form>
             </el-col>
@@ -67,7 +67,7 @@
                 <el-table-column label="角色" width="100">
                     <template slot-scope="scope">{{scope.row.role == 0 ? "普通员工" : scope.row.role == 1 ? "负责人" : "管理员"}}</template>
                 </el-table-column>
-                <el-table-column prop="monthCost" label="月" sortable>
+                <el-table-column prop="monthCost" label="月成本" sortable>
                     <template slot-scope="scope">{{scope.row.monthCost==null?0:scope.row.monthCost}} 元</template>
                 </el-table-column>
                 <el-table-column prop="cost" label="时薪" sortable>
@@ -75,8 +75,9 @@
                 </el-table-column>
                 <el-table-column label="操作" width="280">
                     <template slot-scope="scope">
-                        <el-button size="small" v-if="scope.row.role == 0 && user.role == 1" @click="switchRole(scope.$index)">切换为管理员</el-button>
-                        <el-button size="small" v-if="scope.row.role == 2 && user.role == 1" @click="switchRole(scope.$index)">切换为员工</el-button>
+                        <!-- <el-button size="small" v-if="scope.row.role == 0 && user.role == 1" @click="switchRole(scope.$index)">切换为管理员</el-button>
+                        <el-button size="small" v-if="scope.row.role == 2 && user.role == 1" @click="switchRole(scope.$index)">切换为员工</el-button> -->
+                        <el-button size="small" type="default" v-if="scope.row.role != 1" @click="resetPwd(scope.row)">重置密码</el-button>
                         <el-button size="small" type="primary" v-if="scope.row.role != 1" @click="openInsertDialog(scope.$index)">编辑</el-button>
                         <el-button size="small" type="primary" v-if="scope.row.role == 1" @click="openInsertDialog1(scope.$index)">编辑</el-button>
                         <el-button size="small" type="danger" v-if="scope.row.role == 0" @click="deleteUser(scope.$index)">删除</el-button>
@@ -104,6 +105,11 @@
                 <el-form-item label="部门名称" prop="name">
                     <el-input v-model="depForm.name" placeholder="请输入部门名称" clearable></el-input>
                 </el-form-item>
+                <el-form-item label="负责人" prop="managerId">
+                    <el-select v-model="depForm.managerId" filterable  clearable  placeholder="请选择部门负责人" >
+                        <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
             </el-form>
             <span slot="footer" class="dialog-footer">
                 <el-button @click="departmentVisible = false">取消</el-button>
@@ -122,13 +128,13 @@
                 </el-form-item>
                 <el-form-item label="薪酬方式" prop="salaryType">
                     <el-radio-group v-model="insertForm.salaryType" @change="onSalaryTypeChange">
-                    <el-radio  :label="0" >固定月</el-radio>
+                    <el-radio  :label="0" >固定月成本</el-radio>
                     <el-radio  :label="1">计时工资</el-radio>
                     </el-radio-group>
                 </el-form-item>
-                <el-form-item label="月" prop="monthCost" v-if="insertForm.salaryType == 0">
-                    <el-input v-model.number="insertForm.monthCost" @input="oninput" placeholder="请输入月,单位:元" clearable></el-input>
-                    <span style="color:orange;font-size:12px;">按照每个月工作{{timeType.monthDays}}天,每天{{timeType.allday}}小时核算</span>
+                <el-form-item label="月成本" prop="monthCost" v-if="insertForm.salaryType == 0">
+                    <el-input v-model.number="insertForm.monthCost" @input="oninput" placeholder="请输入月成本,单位:元" clearable></el-input>
+                    <span style="color:orange;font-size:12px;">按照每个月工作{{timeType.monthDays}}天,每天{{timeType.allday}}小时预估时薪</span>
                     <el-link :underline="false" style="color:blue;font-size:12px;margin-left:7px;" href="#/timetype">修改工作时长</el-link>
                 </el-form-item>
                 <el-form-item label="时薪" prop="cost">
@@ -155,13 +161,13 @@
             <el-form ref="form1" :model="insertForm" :rules="rules" label-width="80px">
                 <el-form-item label="薪酬方式" prop="salaryType">
                     <el-radio-group v-model="insertForm.salaryType" @change="onSalaryTypeChange">
-                    <el-radio  :label="0" >固定月</el-radio>
+                    <el-radio  :label="0" >固定月成本</el-radio>
                     <el-radio  :label="1">计时工资</el-radio>
                     </el-radio-group>
                 </el-form-item>
-                <el-form-item label="月" prop="monthCost" v-if="insertForm.salaryType == 0">
-                    <el-input v-model.number="insertForm.monthCost" @input="oninput" placeholder="请输入月,单位:元" clearable></el-input>
-                    <span style="color:orange;font-size:12px;">按照每个月工作{{timeType.monthDays}}天,每天{{timeType.allday}}小时核算</span>
+                <el-form-item label="月成本" prop="monthCost" v-if="insertForm.salaryType == 0">
+                    <el-input v-model.number="insertForm.monthCost" @input="oninput" placeholder="请输入月成本,单位:元" clearable></el-input>
+                    <span style="color:orange;font-size:12px;">按照每个月工作{{timeType.monthDays}}天,每天{{timeType.allday}}小时预估时薪</span>
                     <el-link :underline="false" style="color:blue;font-size:12px;margin-left:7px;" href="#/timetype">修改工作时长</el-link>
                 </el-form-item>
                 <el-form-item label="时薪" prop="cost">
@@ -190,7 +196,7 @@
             return {
                 value:{},
                 user: JSON.parse(sessionStorage.getItem("user")),
-
+                users:[],
                 tableHeight: 0,
                 listLoading: false,
                 total: 0,
@@ -245,6 +251,7 @@
                     id: null,
                     name: null,
                     parentId: null,
+                    managerId: null,
                 },
                 depRules: {
                     name: [{ required: true, message: "请输入部门名称", trigger: "blur" }],
@@ -253,6 +260,29 @@
             };
         },
         methods: {
+            getUsers() {
+                this.http.post(this.port.manage.list, {
+                    departmentId: -1,
+                    pageIndex: 1,
+                    pageSize: 99999
+                },
+                res => {
+                    if (res.code == "ok") {
+                        this.users = res.data.records;
+                    } else {
+                        this.$message({
+                        message: res.msg,
+                        type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
             onSalaryTypeChange(value) {
                 if (value == 1) {
                     this.insertForm.monthCost = null;
@@ -262,7 +292,7 @@
             choseDept(value) {
                 console.log(value);
             },
-            //月输入变化
+            //月成本输入变化
             oninput(e) {
                 this.insertForm.cost = (this.insertForm.monthCost/this.timeType.monthDays/this.timeType.allday).toFixed(2);
             },
@@ -375,6 +405,38 @@
                 });
             },
 
+            resetPwd(user) {
+                this.$confirm( "确定要为" + user.name + "重置密码吗?", "重置密码", {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+                    type: "warning"
+                })
+                .then(() => {
+                    this.http.post('/user/resetPwd', { userId: user.id },
+                    res => {
+                        if (res.code == "ok") {
+                            this.$message({
+                                message: "密码已重置为000000,请通知员工及时修改",
+                                type: "success"
+                            });
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.listLoading = false;
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                })
+                .catch(() => {});
+            },
+
             // 新增、编辑人员
             openInsertDialog(i) {
                 if (i != null) {
@@ -661,21 +723,31 @@
 
             // 新增、修改部门
             createDepartment(i) {
-                if(i == -1) {
+                if(i == -2) {//创建子部门
                     this.depForm = {
                         id: null,
                         name: null,
                         parentId: null,
+                        managerId: null,
                     }
                     if(this.depData.id != -1 && this.depData.id != 0) {
                         this.depForm.parentId = this.depData.id;
                     }
+                    this.depTitle = "新增子部门";
+                } else if(i == -1) {//创建一级部门
+                    this.depForm = {
+                        id: null,
+                        name: null,
+                        parentId: null,
+                        managerId: null,
+                    }
                     this.depTitle = "新增部门";
                 } else {
                     this.depForm = {
                         id: this.depData.id,
                         name: this.depData.label,
                         parentId: this.depData.parentId,
+                        managerId: this.depData.managerId,
                     }
                     this.depTitle = "编辑部门";
                 }
@@ -694,6 +766,9 @@
                         if(this.depForm.parentId != null) {
                             form.parentId = this.depForm.parentId
                         }
+                        if (this.depForm.managerId != null) {
+                            form.managerId = this.depForm.managerId
+                        }
                         this.http.post( this.depForm.id==null?this.port.manage.add:this.port.manage.edit, form,
                         res => {
                             if (res.code == "ok") {
@@ -702,7 +777,11 @@
                                     type: "success"
                                 });
                                 this.departmentVisible = false;
-                                this.depData.label = form.name;
+                                if (this.depForm.id !=null) {
+                                    this.depData.label = form.name;
+                                    this.depData.managerId = form.managerId;
+                                }
+
                                 this.getDepartment();
                             } else {
                                 this.$message({
@@ -776,6 +855,7 @@
             this.getDepartment();
             this.getUser();
             this.getCompanyTimeSetting();
+            this.getUsers();
         }
     };
 </script>

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

@@ -86,8 +86,8 @@
                                     工作总时长:
                                     <!-- <span :style="parseFloat(item1.reportTime)>parseFloat(item1.calculateTime)+0.5?'color:red':''">{{item1.reportTime}}h</span> -->
                                     <span >{{item1.reportTime}}</span>h
-                                    <span style="margin-left:10px;">成本:</span>
-                                    <span >{{item1.cost}}</span>元
+                                    <span v-if="user.role > 0"><span  style="margin-left:10px;">成本:</span>
+                                    <span >{{item1.cost}}</span>元</span>
                                 </span>
                             </span>
                             <div class="checkbtn">
@@ -140,11 +140,8 @@
                 </el-form-item> -->
                 
                 <div v-for="(domain, index) in workForm.domains" :key="domain.id">
-                    <el-form-item label="工作时长" :prop="'domains.' + index + '.timeType'"
+                    <el-form-item label="工作时长" :prop="'domains.' + index + '.'+timeFields[reportTimeType.type]"
                         :rules="{ required: true, message: '请选择工作时长', trigger: 'blur' }">
-                        <!-- <el-input v-model.number="domain.workingTime" placeholder="请输入投入时长" type='number' clearable style="width:200px;"
-                         :disabled="workForm.domains.length==0?true:(workForm.domains[0].state==2?false:true)"></el-input> -->
-                        <!-- 全天/上下午 -->
                         <el-select v-model="domain.timeType" 
                         v-if="reportTimeType.type == 0"
                         placeholder="请选择工作时长" 
@@ -191,6 +188,7 @@
                         </el-time-select>
                         </span>
                     </el-form-item>
+                    
                     <el-form-item label="投入项目" :prop="'domains.' + index + '.projectId'"
                         :rules="{ required: true, message: '请选择投入项目', trigger: ['change','blur'] }">
                         <el-select v-model="domain.projectId" placeholder="请选择" style="width:200px;" clearable="true" @change="selectProject(domain, index)"
@@ -244,9 +242,10 @@
     export default {
         data() {
             return {
+                timeFields:['timeType', 'workingTime', 'startTime'],
                 subProjectList:[],
                 canEdit: true,
-                timeRange:[0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.5,13.0,13.5,14.0,14.5,15.0],
+                timeRange:[0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0],
                 selectTime:null,
                 reportTimeType:{},
                 curDate:'',

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

@@ -432,6 +432,11 @@
                         formData.append("id", -1);
                     }
                     formData.append("projectId", parseFloat(this.form.domains[i].projectId));
+                    if (this.form.domains[i].subProjectId != null) {
+                        formData.append("subProjectId", this.form.domains[i].subProjectId);
+                    } else {
+                        formData.append("subProjectId", 0);
+                    }
                     formData.append("reportTimeType", this.reportTimeType.type);
                     if (this.reportTimeType.type == 0) {
                         formData.append("timeType", this.form.domains[i].timeType);
@@ -443,8 +448,12 @@
                         formData.append("endTime",this.form.domains[i].endTime);
                     }
                     
+                    if (this.form.domains[i].content == null || this.form.domains[i].content == '') {
+                        formData.append("content", '-');
+                    } else {
+                        formData.append("content", this.form.domains[i].content);
+                    }
                     
-                    formData.append("content", this.form.domains[i].content);
                     formData.append("createDate", this.form.createDate);
                 }
                 this.$axios.post("/report/editReport", formData)

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

@@ -7,7 +7,7 @@
         </van-swipe>
         <van-grid :column-num="3">
             <van-grid-item v-for="(item,index) in routers" :key="index" :icon="item.icon" :text="item.name" 
-            :info="unreadNum>0?item.info:''"
+            :info="item.name=='消息记录'&&unreadNum>0?unreadNum:''"
             :to="item.url">
             </van-grid-item>
         </van-grid>