Ver Fonte

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

# Conflicts:
#	fhKeeper/formulahousekeeper/inva_4_tivo/index.html
seyason há 5 anos atrás
pai
commit
2acf6bb825
15 ficheiros alterados com 561 adições e 432 exclusões
  1. 2 0
      fhKeeper/formulahousekeeper/inva_4_tivo/css/styles.css
  2. 1 1
      fhKeeper/formulahousekeeper/inva_4_tivo/download.html
  3. 3 3
      fhKeeper/formulahousekeeper/inva_4_tivo/index.html
  4. 8 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  5. 16 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java
  6. 3 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  7. 28 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  8. 43 31
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  9. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CodeGenerator.java
  10. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  11. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml
  12. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/desktop/detail.vue
  13. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  14. 7 21
      fhKeeper/formulahousekeeper/timesheet/src/views/project/detail.vue
  15. 439 346
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

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

@@ -2179,6 +2179,8 @@ a:hover.back-to-top {
 .cards-1 .scenes {
 	text-align: left;
 	padding: 1rem 1.2rem;
+	background: #f3f7fd;
+	border-radius: 10px;
 }
 
 .cards-1 .scenes .scenes-head {

+ 1 - 1
fhKeeper/formulahousekeeper/inva_4_tivo/download.html

@@ -160,7 +160,7 @@
         <div class="container">
             <div class="row">
                 <div class="col-lg-12">
-                    <p class="p-small">Copyright © 南京火石闪信网络有限公司</p>
+                    <p class="p-small">Copyright © 南京火石闪信网络有限公司&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;苏ICP备18064522号-1</p>
                 </div>
             </div>
         </div>

+ 3 - 3
fhKeeper/formulahousekeeper/inva_4_tivo/index.html

@@ -19,11 +19,11 @@
         (function() {
           var hm = document.createElement("script");
           hm.src = "https://hm.baidu.com/hm.js?db6f9072933f13477e2679fb672a8761";
-          var s = document.getElementsByTagName("script")[0]; 
+          var s = document.getElementsByTagName("script")[0];
           s.parentNode.insertBefore(hm, s);
         })();
         </script>
-            
+
 </head>
 <body data-spy="scroll" data-target=".fixed-top">
 	<div class="spinner-wrapper">
@@ -474,7 +474,7 @@
         <div class="container">
             <div class="row">
                 <div class="col-lg-12">
-                    <p class="p-small">Copyright ©2020 南京火石闪信网络有限公司 苏ICP备18064522号-1</p>
+                    <p class="p-small">Copyright © 南京火石闪信网络有限公司&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;苏ICP备18064522号-1</p>
                 </div>
             </div>
         </div>

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

@@ -59,10 +59,12 @@ public class UserController {
 
     /**
      * 获取员工的列表
+     * pageIndex 页面索引
+     * pageSize 页面大小
      */
     @RequestMapping("/getEmployeeList")
-    public HttpRespMsg getEmployeeList() {
-        return userService.getEmployeeList(request);
+    public HttpRespMsg getEmployeeList(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        return userService.getEmployeeList(pageIndex, pageSize, request);
     }
 
     /**
@@ -102,11 +104,12 @@ public class UserController {
      * name 用户名
      * phone 电话号码
      * role 角色 0-普通员工 2-管理员
+     * cost 成本
      */
     @RequestMapping("/insertUser")
-    public HttpRespMsg insertUser(String id,
-                                  @RequestParam String name, @RequestParam String phone, @RequestParam Integer role) {
-        return userService.insertUser(id, name, phone, role, request);
+    public HttpRespMsg insertUser(String id, @RequestParam String name, @RequestParam String phone,
+                                  @RequestParam Integer role, Double cost) {
+        return userService.insertUser(id, name, phone, role, cost, request);
     }
 
     /**

+ 16 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java

@@ -1,28 +1,31 @@
 package com.management.platform.entity;
 
-import com.baomidou.mybatisplus.extension.activerecord.Model;
-import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
 /**
  * <p>
- * 
+ *
  * </p>
  *
  * @author 吴涛涛
- * @since 2020-01-13
+ * @since 2020-02-09
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 public class User extends Model<User> {
 
-    private static final long serialVersionUID=1L;
+    private static final long serialVersionUID = 1L;
 
     /**
      * 主键 雪花算法生成
@@ -72,6 +75,12 @@ public class User extends Model<User> {
     @TableField("company_id")
     private Integer companyId;
 
+    /**
+     * 时薪
+     */
+    @TableField(value = "cost", updateStrategy = FieldStrategy.IGNORED)
+    private BigDecimal cost;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -1,7 +1,7 @@
 package com.management.platform.service;
 
-import com.management.platform.entity.User;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.User;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -22,7 +22,7 @@ public interface UserService extends IService<User> {
 
     HttpRespMsg getUserInfo(String id);
 
-    HttpRespMsg getEmployeeList(HttpServletRequest request);
+    HttpRespMsg getEmployeeList(Integer pageIndex, Integer pageSize, HttpServletRequest request);
 
     HttpRespMsg deleteUser(String userId, HttpServletRequest request);
 
@@ -30,7 +30,7 @@ public interface UserService extends IService<User> {
 
     HttpRespMsg insertCompany(String companyName, String name, String phone);
 
-    HttpRespMsg insertUser(String id, String name, String phone, Integer role, HttpServletRequest request);
+    HttpRespMsg insertUser(String id, String name, String phone, Integer role, Double cost, HttpServletRequest request);
 
     HttpRespMsg importUser(MultipartFile multipartFile, HttpServletRequest request);
 

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

@@ -2,19 +2,20 @@ package com.management.platform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.Project;
 import com.management.platform.entity.Report;
-import com.management.platform.entity.User;
 import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.ReportMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ProjectService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -112,13 +113,22 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
-            List<Map<String, Object>> resultList = projectMapper.getTimeCost(companyId);
-            for (Map<String, Object> map : resultList) {
+            Map<String, Object> resultMap = new HashMap<>();
+            List<Map<String, Object>> list = projectMapper.getTimeCost(companyId);
+            BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
+            for (Map<String, Object> map : list) {
                 if (!map.containsKey("cost")) {
                     map.put("cost", 0);
                 }
+                if (!map.containsKey("costMoney")) {
+                    map.put("costMoney", 0);
+                } else {
+                    totalMoneyCost = totalMoneyCost.add(BigDecimal.valueOf((Double) map.get("costMoney")));
+                }
             }
-            httpRespMsg.data = resultList;
+            resultMap.put("costList", list);
+            resultMap.put("totalMoneyCost", totalMoneyCost);
+            httpRespMsg.data = resultMap;
         } catch (NullPointerException e) {
             httpRespMsg.setError("验证失败");
             return httpRespMsg;
@@ -136,7 +146,19 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             if (!projectMapper.selectById(projectId).getCompanyId().equals(companyId)) {
                 httpRespMsg.setError("无权查看其他公司的项目详情");
             } else {
-                httpRespMsg.data = projectMapper.getProjectCost(projectId);
+                Map<String, Object> resultMap = new HashMap<>();
+                List<Map<String, Object>> list = projectMapper.getProjectCost(projectId);
+                BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
+                for (Map<String, Object> map : list) {
+                    if (!map.containsKey("costMoney")) {
+                        map.put("costMoney", 0);
+                    } else {
+                        totalMoneyCost = totalMoneyCost.add(BigDecimal.valueOf((Double) map.get("costMoney")));
+                    }
+                }
+                resultMap.put("costList", list);
+                resultMap.put("totalMoneyCost", totalMoneyCost);
+                httpRespMsg.data = resultMap;
             }
         } catch (NullPointerException e) {
             httpRespMsg.setError("验证失败");

+ 43 - 31
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -1,22 +1,18 @@
 package com.management.platform.service.impl;
 
-import java.time.LocalDateTime;
-import java.time.LocalDate;
-
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.Company;
 import com.management.platform.entity.User;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.CompanyMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.UserService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MD5Util;
 import com.management.platform.util.SnowFlake;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.xssf.usermodel.XSSFCell;
 import org.apache.poi.xssf.usermodel.XSSFRow;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
@@ -28,6 +24,8 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.io.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.util.ArrayList;
 import java.util.List;
@@ -154,12 +152,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
     //获取员工的列表
     @Override
-    public HttpRespMsg getEmployeeList(HttpServletRequest request) {
+    public HttpRespMsg getEmployeeList(Integer pageIndex, Integer pageSize, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             User requester = userMapper.selectById(request.getHeader("Token"));
-            //获取本公司除负责人以外全部的信息
-            httpRespMsg.data = userMapper.selectList(new QueryWrapper<User>()
+            httpRespMsg.data = userMapper.selectPage(new Page<>(pageIndex, pageSize), new QueryWrapper<User>()
                     .eq("company_id", requester.getCompanyId()));
         } catch (NullPointerException e) {
             httpRespMsg.setError("验证失败");
@@ -252,10 +249,13 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
     //新增或修改用户
     @Override
-    public HttpRespMsg insertUser(String targetId, String name, String phone, Integer role, HttpServletRequest request) {
+    public HttpRespMsg insertUser(String targetId, String name, String phone, Integer role, Double cost,
+                                  HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             User creator = userMapper.selectById(request.getHeader("Token"));
+            //处理时薪
+            BigDecimal costValue = cost == null ? BigDecimal.valueOf(0) : BigDecimal.valueOf(cost);
             if (targetId == null) {
                 //新增
                 if (creator.getRole() == 2 && role != 0) {
@@ -267,26 +267,33 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     if (userMapper.selectList(new QueryWrapper<User>().eq("phone", phone)).size() > 0) {
                         httpRespMsg.setError("电话号码重复");
                     } else {
-                        Long id = SnowFlake.nextId();
-                        User user = new User()
-                                .setId(id.toString())
-                                .setName(name)
-                                .setPassword(MD5Util.getPassword("000000"))
-                                .setPhone(phone)
-                                .setRole(role)
-                                .setCompanyId(creator.getCompanyId());
-                        if (userMapper.selectCount(new QueryWrapper<User>().eq("company_id", creator.getCompanyId())) >= (companyMapper.selectById(creator.getCompanyId()).getStaffCountMax())) {
+                        if (userMapper.selectCount(new QueryWrapper<User>()
+                                .eq("company_id", creator.getCompanyId())) >=
+                                (companyMapper.selectById(creator.getCompanyId()).getStaffCountMax())) {
                             httpRespMsg.setError("公司人员已达上限");
-                            return httpRespMsg;
-                        }
-                        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)
+                                    .setRole(role)
+                                    .setCompanyId(creator.getCompanyId())
+                                    .setCost(costValue);
+                            if (userMapper.insert(user) == 0) {
+                                httpRespMsg.setError("操作失败");
+                            }
                         }
                     }
                 }
             } else {
                 //修改
-                userMapper.updateById(userMapper.selectById(targetId).setName(name).setPhone(phone).setRole(role));
+                userMapper.updateById(userMapper.selectById(targetId)
+                        .setName(name)
+                        .setPhone(phone)
+                        .setRole(role)
+                        .setCost(costValue));
             }
         } catch (NullPointerException e) {
             httpRespMsg.setError("数据有误 验证失败");
@@ -330,17 +337,21 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 if (row == null) {
                     continue;
                 }
-                //此处新建账号 默认密码为000000 默认 姓名第一列 手机号第二列
+                //此处新建账号 默认密码为000000 默认 姓名第一列 手机号第二列 时薪第三列
                 Long id = SnowFlake.nextId();
                 XSSFCell nameCell = row.getCell(0);
                 XSSFCell phoneCell = row.getCell(1);
+                XSSFCell costCell = row.getCell(2);
                 nameCell.setCellType(CellType.STRING);
                 phoneCell.setCellType(CellType.STRING);
-                if ("姓名".equals(nameCell.getStringCellValue()) && "手机号".equals(phoneCell.getStringCellValue()) && rowIndex == 0) {
-                    continue;
-                }
+                costCell.setCellType(CellType.STRING);
                 String name = nameCell.getStringCellValue();
                 String phone = phoneCell.getStringCellValue();
+                if (name.equals("姓名") && phone.equals("手机号") && rowIndex == 0) {
+                    continue;
+                }
+                String costString = costCell.getStringCellValue();
+                BigDecimal cost = costString != null ? new BigDecimal(costString) : BigDecimal.valueOf(0);
                 phoneList.add(phone);
                 userList.add(new User()
                         .setId(id.toString())
@@ -348,7 +359,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         .setPassword(MD5Util.getPassword("000000"))
                         .setPhone(phone)
                         .setRole(0)
-                        .setCompanyId(companyId));
+                        .setCompanyId(companyId)
+                        .setCost(cost));
             }
             //最后删掉这个文件
 //            if (!file.delete()) {
@@ -369,7 +381,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             return httpRespMsg;
         } catch (NullPointerException e) {
             e.printStackTrace();
-            httpRespMsg.setError("数据格式有误或存在空数据 导失败");
+            httpRespMsg.setError("数据格式有误或存在空数据 导失败");
             return httpRespMsg;
         } catch (Exception e) {
             e.printStackTrace();

+ 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("time_calculation");
+        strategy.setInclude("user");
 //        strategy.setExclude();//数据库表全生成
 //        strategy.setInclude(scanner("user").split(","));//表名,多个英文逗号分割
         strategy.setControllerMappingHyphenStyle(true);

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

@@ -16,9 +16,10 @@
 
     <!--获取查询者所在公司每个项目的工时成本-->
     <select id="getTimeCost" resultType="java.util.Map">
-        SELECT a.id, a.project_name AS project, SUM(b.working_time) AS cost
+        SELECT a.id, a.project_name AS project, SUM(b.working_time) AS cost, SUM(b.working_time * c.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
         WHERE a.company_id = #{companyId}
         GROUP BY a.id
         ORDER BY a.id ASC
@@ -26,7 +27,7 @@
 
     <!--获取某个项目每个人分别需要的工时-->
     <select id="getProjectCost" resultType="java.util.Map">
-        SELECT b.name, SUM(a.working_time) AS cost
+        SELECT b.name, SUM(a.working_time) AS cost, SUM(a.working_time * b.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/UserMapper.xml

@@ -12,11 +12,12 @@
         <result column="create_time" property="createTime" />
         <result column="role" property="role" />
         <result column="company_id" property="companyId" />
+        <result column="cost" property="cost" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, phone, password, portrait_url, create_time, role, company_id
+        id, name, phone, password, portrait_url, create_time, role, company_id, cost
     </sql>
 
 </mapper>

+ 3 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/desktop/detail.vue

@@ -56,9 +56,9 @@ export default {
       detailId: this.$route.params.id,
       date: this.$route.params.date,
       user: JSON.parse(sessionStorage.getItem("user")),
-      uName: "周瑞霆",
-      uTime: "2020-01-03",
-      uHours: 20,
+      uName: "",
+      uTime: "",
+      uHours: 0,
       timeList: [],
       srcList: [],
       infoList: [],

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

@@ -18,7 +18,7 @@
                 this.http.post(this.port.project.listCost, {},
                 res => {
                     if (res.code == "ok") {
-                        var xList = [],yList = [] , list = res.data;
+                        var xList = [], yList = [], list = res.data.costList, totalMoneyCost = res.data.totalMoneyCost;
                         for(var i in list) {
                             xList.push(list[i].project);
                             yList.push({
@@ -31,7 +31,7 @@
                         _this.myChart = myChart;
                         var option = {
                             title: {
-                                text: '项目成本统计',
+                                text: '项目成本统计 总计' + totalMoneyCost + '元',
                                 left:'left',
                             },
                             // 工具箱

+ 7 - 21
fhKeeper/formulahousekeeper/timesheet/src/views/project/detail.vue

@@ -10,29 +10,12 @@
                 <el-form-item>
                     <span class="workName">{{detailName}}</span>
                 </el-form-item>
+                <el-form-item style="float:right;">
+                    <span style="font-size:18px;">项目成本:<span style="color:#20a0ff;">{{cost}}元</span></span>
+                </el-form-item>
             </el-form>
         </el-col>
 
-        <!--列表-->
-        <!-- <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-            <el-table-column type="index" width="60"></el-table-column>
-            <el-table-column prop="name" label="人员名称" sortable></el-table-column>
-            <el-table-column prop="cost" label="分配时长(h)" sortable></el-table-column>
-        </el-table> -->
-
-        <!--工具条-->
-        <!-- <el-col :span="24" class="toolbar">
-            <el-pagination
-                @size-change="handleSizeChange"
-                @current-change="handleCurrentChange"
-                :page-sizes="[20 , 50 , 80 , 100]"
-                :page-size="20"
-                layout="total, sizes, prev, pager, next"
-                :total="total"
-                style="float:right;"
-            ></el-pagination>
-        </el-col> -->
-
         <div id="container" :style="'height:' + tableHeight + 'px'"></div> 
     </section>
 </template>
@@ -48,6 +31,8 @@
 
                 user: JSON.parse(sessionStorage.getItem("user")),
 
+                cost: 0,
+
                 tableHeight: 0,
                 
                 echart: null,
@@ -69,7 +54,8 @@
                     this.listLoading = false;
                     var _this = this;
                     if (res.code == "ok") {
-                        var xList = [],yList = [] , list = res.data;
+                        var xList = [],yList = [] , list = res.data.costList;
+                        this.cost = res.data.totalMoneyCost;
                         for(var i in list) {
                             xList.push(list[i].name);
                             yList.push(list[i].cost);

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

@@ -1,376 +1,469 @@
 <template>
-  <section>
-    <!--工具条-->
-    <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
-      <el-form :inline="true">
-        <el-form-item>
-            <div class="nowTime">
-                <i class="el-icon-s-home"></i>
-                {{user.companyName}}
-            </div>
-        </el-form-item>
-        <el-form-item style="float:right;">
-          <el-link type="primary" :underline="false" @click="openInsertDialog(null)">添加人员</el-link>
-        </el-form-item>
-        <el-form-item style="float:right;">
-          <el-upload ref="upload" action="#" :limit="1" :http-request="importUser" :show-file-list="false">
-            <el-link type="primary" :underline="false">批量导入</el-link>
-          </el-upload>
-        </el-form-item>
-        <el-form-item style="float:right;">
-            <el-link type="primary" :underline="false" href="./upload/人员导入模板.xlsx" download="人员导入模板.xlsx">模板下载</el-link>
-        </el-form-item>
-      </el-form>
-    </el-col>
+    <section>
+        <!--工具条-->
+        <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
+            <el-form :inline="true">
+                <el-form-item>
+                    <div class="nowTime">
+                        <i class="el-icon-s-home"></i>
+                        {{user.companyName}}
+                    </div>
+                </el-form-item>
+                <el-form-item style="float:right;">
+                    <el-link type="primary" :underline="false" @click="openInsertDialog(null)">添加人员</el-link>
+                </el-form-item>
+                <el-form-item style="float:right;">
+                    <el-upload
+                        ref="upload"
+                        action="#"
+                        :limit="1"
+                        :http-request="importUser"
+                        :show-file-list="false"
+                    >
+                        <el-link type="primary" :underline="false">批量导入</el-link>
+                    </el-upload>
+                </el-form-item>
+                <el-form-item style="float:right;">
+                    <el-link
+                        type="primary"
+                        :underline="false"
+                        href="./upload/人员导入模板.xlsx"
+                        download="人员导入模板.xlsx"
+                    >模板下载</el-link>
+                </el-form-item>
+            </el-form>
+        </el-col>
 
-    <!--列表-->
-    <el-table
-      :data="list"
-      highlight-current-row
-      v-loading="listLoading"
-      :height="tableHeight"
-      style="width: 100%;"
-    >
-      <el-table-column type="index" width="60"></el-table-column>
-      <el-table-column prop="name" label="姓名" sortable></el-table-column>
-      <el-table-column prop="phone" label="手机"></el-table-column>
-      <el-table-column label="角色">
-        <template slot-scope="scope">
-          {{scope.row.role == 0 ? "普通员工" :
-          scope.row.role == 1 ? "负责人" : "管理员"}}
-        </template>
-      </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" type="primary" v-if="scope.row.role != 1" @click="openInsertDialog(scope.$index)">编辑</el-button>
-          <el-button size="small" type="danger" v-if="scope.row.role == 0" @click="deleteUser(scope.$index)">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
+        <!--列表-->
+        <el-table
+            :data="list"
+            highlight-current-row
+            v-loading="listLoading"
+            :height="tableHeight"
+            style="width: 100%;"
+        >
+            <el-table-column type="index" width="60"></el-table-column>
+            <el-table-column prop="name" label="姓名" sortable></el-table-column>
+            <el-table-column prop="phone" label="手机"></el-table-column>
+            <el-table-column label="角色">
+                <template slot-scope="scope">
+                {{scope.row.role == 0 ? "普通员工" :
+                scope.row.role == 1 ? "负责人" : "管理员"}}
+                </template>
+            </el-table-column>
+            <el-table-column prop="cost" label="成本"></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"
+                    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>
+                </template>
+            </el-table-column>
+        </el-table>
 
-    <!--工具条-->
-    <!-- <el-col :span="24" class="toolbar">
-      <el-pagination
-        @size-change="handleSizeChange"
-        @current-change="handleCurrentChange"
-        :page-sizes="[20 , 50 , 80 , 100]"
-        :page-size="20"
-        layout="total, sizes, prev, pager, next"
-        :total="total"
-        style="float:right;"
-      ></el-pagination>
-    </el-col>-->
+        <!--工具条-->
+        <el-col :span="24" class="toolbar">
+            <el-pagination
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+                :page-sizes="[20 , 50 , 80 , 100]"
+                :page-size="20"
+                layout="total, sizes, prev, pager, next"
+                :total="total"
+                style="float:right;"
+            ></el-pagination>
+        </el-col>
 
-    <!-- 新增单个人员的Dialog -->
-    <el-dialog title="新增人员" :visible.sync="dialogVisible" width="400px">
-      <el-form ref="form1" :model="insertForm" :rules="rules" label-width="60px">
-        <el-form-item label="名字" prop="name">
-          <el-input v-model="insertForm.name" placeholder="请输入姓名" clearable></el-input>
-        </el-form-item>
-        <el-form-item label="电话" prop="phone">
-          <el-input v-model="insertForm.phone" placeholder="请输入电话" clearable></el-input>
-        </el-form-item>
-        <el-form-item label="角色" prop="role">
-          <el-select v-model="insertForm.role" placeholder="请选择角色" style="width: 100%">
-            <el-option label="普通员工" :value="0"></el-option>
-            <el-option label="管理员" :value="2"></el-option>
-          </el-select>
-        </el-form-item>
-      </el-form>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="dialogVisible=false">取消</el-button>
-        <el-button type="primary" @click="submitInsert">提交</el-button>
-      </span>
-    </el-dialog>
-  </section>
+        <!-- 新增单个人员的Dialog -->
+        <el-dialog :title="title" :visible.sync="dialogVisible" width="400px">
+            <el-form ref="form1" :model="insertForm" :rules="rules" label-width="60px">
+                <el-form-item label="名字" prop="name">
+                    <el-input v-model="insertForm.name" placeholder="请输入姓名" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="电话" prop="phone">
+                    <el-input v-model="insertForm.phone" placeholder="请输入电话号码" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="成本" prop="costNum">
+                    <!-- 这里目前只能输入整数 但实际上数据库里是可以存的 需要调整校验方式 -->
+                    <el-input v-model.number="insertForm.cost" placeholder="请输入成本 单位:元/小时" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="角色" prop="role">
+                    <el-select v-model="insertForm.role" placeholder="请选择角色" style="width: 100%">
+                        <el-option label="普通员工" :value="0"></el-option>
+                        <el-option label="管理员" :value="2"></el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="dialogVisible=false">取消</el-button>
+                <el-button type="primary" @click="submitInsert">提交</el-button>
+            </span>
+        </el-dialog>
+
+        <el-dialog title="修改成本" :visible.sync="dialogVisible1" width="400px">
+            <el-form ref="form1" :model="insertForm" :rules="rules" label-width="60px">
+                <el-form-item label="成本" prop="cost">
+                    <el-input v-model.number="insertForm.cost" placeholder="请输入成本 单位:元/小时" clearable></el-input>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="dialogVisible1=false">取消</el-button>
+                <el-button type="primary" @click="submitInsert1">提交</el-button>
+            </span>
+        </el-dialog>
+    </section>
 </template>
 
 <script>
-export default {
-  data() {
-    return {
-      user: JSON.parse(sessionStorage.getItem("user")),
+    export default {
+        data() {
+            return {
+                user: JSON.parse(sessionStorage.getItem("user")),
 
-      tableHeight: 0,
-      listLoading: false,
-      total: 0,
-      page: 1,
-      size: 20,
-      list: [],
-      dialogVisible: false,
-      insertForm: {
-        id:null,
-        name: null,
-        phone: null,
-        role: null
-      },
-      rules: {
-        name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
-        phone: [{ required: true, message: "请输入电话", trigger: "blur" }],
-        role: [{ required: true, message: "请选择角色", trigger: "blur" }]
-      }
-    };
-  },
-  methods: {
-    //分页
-    handleCurrentChange(val) {
-      this.page = val;
-      this.getUser();
-    },
+                tableHeight: 0,
+                listLoading: false,
+                total: 0,
+                page: 1,
+                size: 20,
+                list: [],
+                
+                dialogVisible: false,
+                title: "",
+                insertForm: {
+                    id: null,
+                    name: null,
+                    phone: null,
+                    role: null,
+                    cost: null
+                },
+                rules: {
+                    name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
+                    phone: [{ required: true, message: "请输入电话", trigger: "blur" }],
+                    role: [{ required: true, message: "请选择角色", trigger: "blur" }],
+                    cost: [{ required: true, message: "请输入成本", trigger: "blur" }]
+                },
 
-    handleSizeChange(val) {
-      this.size = val;
-      this.getUser();
-    },
+                dialogVisible1: false,
 
-    //获取所有员工的列表
-    getUser() {
-      this.listLoading = true;
-      this.http.post(
-        this.port.manage.list,
-        {},
-        res => {
-          this.listLoading = false;
-          if (res.code == "ok") {
-            this.list = res.data;
-          } else {
-            this.$message({
-              message: res.msg,
-              type: "error"
-            });
-          }
+            };
         },
-        error => {
-          this.listLoading = false;
-          this.$message({
-            message: error,
-            type: "error"
-          });
-        }
-      );
-    },
+        methods: {
+            //分页
+            handleCurrentChange(val) {
+                this.page = val;
+                this.getUser();
+            },
 
-    //新增员工
-    submitInsert() {
-      this.$refs.form1.validate(valid => {
-        if (valid) {
-          this.listLoading = true;
-          var form = {
-              name: this.insertForm.name,
-              phone: this.insertForm.phone,
-              role: this.insertForm.role
-            };
-            if(this.insertForm.id != null) {
-                form.id = this.insertForm.id;
-            }
-          this.http.post(
-            this.port.manage.insert,
-            form,
-            res => {
-              this.listLoading = false;
-              if (res.code == "ok") {
-                this.$message({
-                  message: this.insertForm.id!=null?'修改':'创建'+"成功",
-                  type: "success"
-                });
-                this.dialogVisible = false;
-                //重新读取列表
+            handleSizeChange(val) {
+                this.size = val;
                 this.getUser();
-              } else {
-                this.$message({
-                  message: res.msg,
-                  type: "error"
+            },
+
+            //获取所有员工的列表
+            getUser() {
+                this.listLoading = true;
+                this.http.post( this.port.manage.list, {
+                    pageIndex: this.page,
+                    pageSize: this.size
+                },
+                res => {
+                    this.listLoading = false;
+                    if (res.code == "ok") {
+                        this.list = res.data.records;
+                        this.total = res.data.total;
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.listLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
                 });
-              }
             },
-            error => {
-              this.listLoading = false;
-              this.$message({
-                message: error,
-                type: "error"
-              });
-            }
-          );
-        }
-      });
-    },
 
-    //获取所有员工的列表
-    importUser(item) {
-      //首先判断文件类型
-      let str = item.file.name.split(".");
-      let format = str[str.length - 1];
-      if (format != "xls" && format != "xlsx") {
-        this.$message({
-          message: "请选择.xls或.xlsx文件",
-          type: "error"
-        });
-      } else {
-        this.listLoading = true;
-        let formData = new FormData();
-        formData.append("file", item.file);
-        this.http.uploadFile(
-          this.port.manage.import,
-          formData,
-          res => {
-            this.$refs.upload.clearFiles();
-            this.listLoading = false;
-            if (res.code == "ok") {
-                this.$message({
-                  message: "导入成功",
-                  type: "success"
+            //新增员工
+            submitInsert() {
+                this.$refs.form1.validate(valid => {
+                    if (valid) {
+                        this.listLoading = true;
+                        var form = {
+                            name: this.insertForm.name,
+                            phone: this.insertForm.phone,
+                            role: this.insertForm.role,
+                            cost: this.insertForm.cost
+                        };
+                        if (this.insertForm.id != null) {
+                            form.id = this.insertForm.id;
+                        }
+                        this.http.post( this.port.manage.insert, form,
+                        res => {
+                            this.listLoading = false;
+                            if (res.code == "ok") {
+                                this.$message({
+                                message:
+                                    this.insertForm.id != null ? "修改" : "创建" + "成功",
+                                type: "success"
+                                });
+                                this.dialogVisible = false;
+                                //重新读取列表
+                                this.getUser();
+                            } else {
+                                this.$message({
+                                message: res.msg,
+                                type: "error"
+                                });
+                            }
+                        },
+                        error => {
+                            this.listLoading = false;
+                            this.$message({
+                                message: error,
+                                type: "error"
+                            });
+                        });
+                    }
                 });
-              //重新读取列表
-              this.getUser();
-            } else {
-              this.$message({
-                message: res.msg,
-                type: "error"
-              });
-            }
-          },
-          error => {
-            this.$refs.upload.clearFiles();
-            this.listLoading = false;
-            this.$message({
-              message: error,
-              type: "error"
-            });
-          }
-        );
-      }
-    },
+            },
 
-    //切换角色 0/2
-    switchRole(index) {
-      this.listLoading = true;
-      this.http.post(
-        this.port.manage.permission,
-        { id: this.list[index].id },
-        res => {
-          this.listLoading = false;
-          if (res.code == "ok") {
-            this.$message({
-              message: "切换角色成功",
-              type: "success"
-            });
-            //重新读取列表
-            this.getUser();
-          } else {
-            this.$message({
-              message: res.msg,
-              type: "error"
-            });
-          }
-        },
-        error => {
-          this.listLoading = false;
-          this.$message({
-            message: error,
-            type: "error"
-          });
-        }
-      );
-    },
+            //获取所有员工的列表
+            importUser(item) {
+                //首先判断文件类型
+                let str = item.file.name.split(".");
+                let format = str[str.length - 1];
+                if (format != "xls" && format != "xlsx") {
+                    this.$message({
+                    message: "请选择.xls或.xlsx文件",
+                    type: "error"
+                    });
+                } else {
+                    this.listLoading = true;
+                    let formData = new FormData();
+                    formData.append("file", item.file);
+                    this.http.uploadFile( this.port.manage.import, formData,
+                    res => {
+                        this.$refs.upload.clearFiles();
+                        this.listLoading = false;
+                        if (res.code == "ok") {
+                            this.$message({
+                                message: "导入成功",
+                                type: "success"
+                            });
+                            //重新读取列表
+                            this.getUser();
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.$refs.upload.clearFiles();
+                        this.listLoading = false;
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                }
+            },
 
-    //三天之内删了你 数据库都给你清了
-    deleteUser(index) {
-      this.$confirm(
-        "确定要删除用户" + this.list[index].name + "吗?",
-        "删除用户",
-        {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }
-      )
-        .then(() => {
-          this.listLoading = true;
-          this.http.post(
-            this.port.manage.delete,
-            { userId: this.list[index].id },
-            res => {
-              this.listLoading = false;
-              if (res.code == "ok") {
-                this.$message({
-                  message: "删除成功",
-                  type: "success"
+            //切换角色 0/2
+            switchRole(index) {
+                this.listLoading = true;
+                this.http.post( this.port.manage.permission, { id: this.list[index].id },
+                res => {
+                    this.listLoading = false;
+                    if (res.code == "ok") {
+                        this.$message({
+                        message: "切换角色成功",
+                        type: "success"
+                        });
+                        //重新读取列表
+                        this.getUser();
+                    } else {
+                        this.$message({
+                        message: res.msg,
+                        type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.listLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
                 });
-                //重新读取列表
-                this.getUser();
-              } else {
-                this.$message({
-                  message: res.msg,
-                  type: "error"
+            },
+
+            //三天之内删了你 数据库都给你清了
+            deleteUser(index) {
+                this.$confirm( "确定要删除用户" + this.list[index].name + "吗?", "删除用户", {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+                    type: "warning"
+                })
+                .then(() => {
+                    this.listLoading = true;
+                    this.http.post( this.port.manage.delete, { userId: this.list[index].id },
+                    res => {
+                        this.listLoading = false;
+                        if (res.code == "ok") {
+                            this.$message({
+                                message: "删除成功",
+                                type: "success"
+                            });
+                            //重新读取列表
+                            this.getUser();
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.listLoading = false;
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                })
+                .catch(() => {});
+            },
+
+            //打开单独新增的Dialog
+            openInsertDialog(i) {
+                if (i != null) {
+                    this.insertForm = {
+                        id: this.list[i].id,
+                        name: this.list[i].name,
+                        phone: this.list[i].phone,
+                        role: this.list[i].role,
+                        cost: this.list[i].cost
+                    };
+                    this.title = "编辑人员"
+                } else {
+                    this.insertForm = {
+                        id: null,
+                        name: null,
+                        phone: null,
+                        role: null,
+                        cost: null
+                    };
+                    this.title = "新增人员"
+                }
+                this.dialogVisible = true;
+            },
+
+            openInsertDialog1(i) {
+                this.insertForm = {
+                    id: this.list[i].id,
+                    name: this.list[i].name,
+                    phone: this.list[i].phone,
+                    role: this.list[i].role,
+                    cost: this.list[i].cost
+                };
+                this.dialogVisible1 = true;
+            },
+
+            submitInsert1() {
+                this.$refs.form1.validate(valid => {
+                    if (valid) {
+                        this.listLoading = true;
+                        var form = {
+                            id: this.insertForm.id,
+                            name: this.insertForm.name,
+                            phone: this.insertForm.phone,
+                            role: this.insertForm.role,
+                            cost: this.insertForm.cost
+                        };
+                        this.http.post( this.port.manage.insert, form,
+                        res => {
+                            this.listLoading = false;
+                            if (res.code == "ok") {
+                                this.$message({
+                                    message: "修改成功",
+                                    type: "success"
+                                });
+                                this.dialogVisible1 = false;
+                                //重新读取列表
+                                this.getUser();
+                            } else {
+                                this.$message({
+                                    message: res.msg,
+                                    type: "error"
+                                });
+                            }
+                        },
+                        error => {
+                            this.listLoading = false;
+                            this.$message({
+                                message: error,
+                                type: "error"
+                            });
+                        });
+                    }
                 });
-              }
             },
-            error => {
-              this.listLoading = false;
-              this.$message({
-                message: error,
-                type: "error"
-              });
-            }
-          );
-        })
-        .catch(() => {});
-    },
+        },
 
-    //打开单独新增的Dialog
-    openInsertDialog(i) {
-        if(i != null) {
-            this.insertForm = {
-                id: this.list[i].id,
-                name: this.list[i].name,
-                phone: this.list[i].phone,
-                role: this.list[i].role
-            };
-        } else {
-            this.insertForm = {
-                id: null,
-                name: null,
-                phone: null,
-                role: null
+        created() {
+            let height = window.innerHeight;
+            this.tableHeight = height - 195;
+            const that = this;
+            window.onresize = function temp() {
+                that.tableHeight = window.innerHeight - 195;
             };
+        },
+        mounted() {
+            this.getUser();
         }
-        this.dialogVisible = true;
-    }
-  },
-
-  created() {
-    let height = window.innerHeight;
-    this.tableHeight = height - 195;
-    const that = this;
-    window.onresize = function temp() {
-      that.tableHeight = window.innerHeight - 195;
     };
-  },
-  mounted() {
-    this.getUser();
-  }
-};
 </script>
 
 <style lang="scss" scoped>
-.nowTime {
-  height: 40px;
-  line-height: 40px;
-  font-size: 16px;
-  color: #20a0ff;
-  margin-left: 10px;
-  i {
-    margin-right: 10px;
-  }
-}
+    .nowTime {
+        height: 40px;
+        line-height: 40px;
+        font-size: 16px;
+        color: #20a0ff;
+        margin-left: 10px;
+        i {
+            margin-right: 10px;
+        }
+    }
 </style>