瀏覽代碼

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

# Conflicts:
#	fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
seyason 3 年之前
父節點
當前提交
644575f99a
共有 21 個文件被更改,包括 306 次插入107 次删除
  1. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CustomerInfoController.java
  2. 9 11
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportExtraDegreeController.java
  3. 6 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java
  4. 2 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TaskGroupService.java
  5. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  6. 6 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  7. 43 36
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskGroupServiceImpl.java
  8. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  9. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  10. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  11. 1 1
      fhKeeper/formulahousekeeper/timesheet/config/index.js
  12. 6 6
      fhKeeper/formulahousekeeper/timesheet/package-lock.json
  13. 6 5
      fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue
  14. 21 15
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  15. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  16. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/gantt.vue
  17. 165 3
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  18. 3 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  19. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  20. 2 0
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  21. 10 10
      fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CustomerInfoController.java

@@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -48,6 +49,15 @@ public class CustomerInfoController {
         HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
+        List<CustomerInfo> customerInfoMapperAll = customerInfoMapper.getAll(user.getCompanyId());
+        List<String> nameList=new ArrayList<>();
+        customerInfoMapperAll.forEach(cu->{
+            nameList.add(cu.getCustomerName());
+        });
+        if(nameList.contains(info.getCustomerName())){
+            msg.setError("客户名称重复");
+            return msg;
+        }
         if (info.getId() == null) {
             info.setCompanyId(user.getCompanyId());
             customerInfoMapper.insert(info);

+ 9 - 11
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportExtraDegreeController.java

@@ -2,33 +2,22 @@ package com.management.platform.controller;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.management.platform.entity.CustomerInfo;
 import com.management.platform.entity.Project;
 import com.management.platform.entity.ReportExtraDegree;
 import com.management.platform.entity.User;
-import com.management.platform.mapper.CustomerInfoMapper;
 import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.ReportExtraDegreeMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ProjectService;
-import com.management.platform.service.ReportExtraDegreeService;
-import com.management.platform.service.ReportService;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.poi.util.StringUtil;
-import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -64,6 +53,15 @@ public class ReportExtraDegreeController {
         HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
+        List<ReportExtraDegree> reportExtraDegreeMapperAll = reportExtraDegreeMapper.getAll(user.getCompanyId());
+        List<String> nameList=new ArrayList<>();
+        reportExtraDegreeMapperAll.forEach(re->{
+            nameList.add(re.getName());
+        });
+        if(nameList.contains(info.getName())){
+            msg.setError("客户名称重复");
+            return msg;
+        }
         if (info.getId() == null) {
             info.setCompanyId(user.getCompanyId());
             reportExtraDegreeMapper.insert(info);

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

@@ -6,11 +6,13 @@ import com.management.platform.entity.*;
 import com.management.platform.mapper.GroupParticipatorMapper;
 import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.UserMapper;
-import com.management.platform.service.*;
+import com.management.platform.service.GroupTmpstagesService;
+import com.management.platform.service.StagesService;
+import com.management.platform.service.TaskGroupService;
+import com.management.platform.service.TaskService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
@@ -185,8 +187,8 @@ public class TaskGroupController {
 
 
     @RequestMapping("/createFromTemplate")
-    public HttpRespMsg createFromTemplate(GroupTemplate template, Integer projectId) {
-        return taskGroupService.createFromTemplate(template, projectId);
+    public HttpRespMsg createFromTemplate(String templateJson, Integer projectId) {
+        return taskGroupService.createFromTemplate(templateJson, projectId);
     }
 
 

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

@@ -1,8 +1,7 @@
 package com.management.platform.service;
 
-import com.management.platform.entity.GroupTemplate;
-import com.management.platform.entity.TaskGroup;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.TaskGroup;
 import com.management.platform.util.HttpRespMsg;
 
 /**
@@ -17,5 +16,5 @@ public interface TaskGroupService extends IService<TaskGroup> {
 
     void saveGroupIncharger(TaskGroup taskGroup);
 
-    HttpRespMsg createFromTemplate(GroupTemplate template, Integer projectId);
+    HttpRespMsg createFromTemplate(String templateJson, Integer projectId);
 }

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

@@ -184,6 +184,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             if (category != null) {
                 queryWrapper.eq("category", category);
             }
+            queryWrapper.orderByDesc("is_public");
             IPage<Project> projectIPage = projectMapper.selectPage(new Page<>(pageIndex, pageSize),
                     queryWrapper);
             List<Project> projectList = projectIPage.getRecords();
@@ -724,6 +725,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<String> headList = new ArrayList<String>();
             headList.add("项目编号");
             headList.add("项目名称");
+            headList.add("项目分类");
             headList.add("人员");
             headList.add("部门");
             headList.add("工时(h)");
@@ -744,6 +746,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 List<String> rowData = new ArrayList<String>();
                 rowData.add((String)map.get("projectCode"));
                 rowData.add((String)map.get("project"));
+                rowData.add((String)map.get("categoryName"));
                 rowData.add("");
                 rowData.add("");
                 rowData.add(((Double)map.get("cost")).toString());
@@ -761,6 +764,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if (projectSum == null || projectSum == false) {
                         membRowData.add((String)map.get("projectCode"));
                         membRowData.add((String)map.get("project"));
+                        membRowData.add((String)map.get("categoryName"));
                     } else {
                         membRowData.add("");
                         membRowData.add("");
@@ -779,6 +783,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             sumRow.add("");
             sumRow.add("");
             sumRow.add("");
+            sumRow.add("");
             sumRow.add(""+new BigDecimal(totalCostTime).setScale(1, BigDecimal.ROUND_HALF_UP));
             sumRow.add(totalMoneyCost.toString());
             allList.add(sumRow);

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

@@ -41,7 +41,6 @@ import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
-import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.stream.Collectors;
 
 /**
@@ -2508,7 +2507,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             sheet.createFreezePane(0,1);
             List<String> titles = new ArrayList<String>();
             titles.addAll(Arrays.asList(new String[]{
-                    "序号","员工","所在部门","项目名称","子项目名称"
+                    "序号","员工","所在部门","项目名称","项目分类","子项目名称"
             }));
 
             //项目管理专业版以上,包括任务
@@ -2668,10 +2667,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 row.createCell(1).setCellValue((String) map.get("name"));
                 row.createCell(2).setCellValue((String) map.get("departmentName"));
                 row.createCell(3).setCellValue((String) map.get("project"));
-                row.createCell(4).setCellValue((String) map.get("subProjectName"));
-                int index = 5;
+                row.createCell(4).setCellValue((String) map.get("categoryName"));
+                row.createCell(5).setCellValue((String) map.get("subProjectName"));
+                int index = 6;
                 if (company.getPackageProject() == 1) {
-                    row.createCell(5).setCellValue((String) map.get("taskName"));
+                    row.createCell(6).setCellValue((String) map.get("taskName"));
                     index++;
                 }
                 HSSFCell cell = row.createCell(index);
@@ -2957,7 +2957,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     if (!list.stream().anyMatch(item->item.get("id").equals(curUser.getId())&&sdf.format((java.sql.Date)item.get("createDate")).equals(dateStr))) {
                         UserDailyWorkItem noRecord = new UserDailyWorkItem();
                         noRecord.userId = curUser.getId();
-                        List<Map> userCorpwxListOn = userCorpwxTimeMapList.stream().filter(mapList -> sdf.format((java.sql.Date)mapList.get("create_date")).equals(dateStr)
+                        List<Map> userCorpwxListOn = userCorpwxTimeMapList.stream().filter(mapList -> mapList.get("create_date").toString().equals(dateStr)
                                 && mapList.get("corpwx_userid").equals(curUser.getCorpwxUserid())).collect(Collectors.toList());
                         if(!userCorpwxListOn.isEmpty()){
                                 noRecord.createDate = dtf.format(date)+"/请假";

+ 43 - 36
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskGroupServiceImpl.java

@@ -1,5 +1,6 @@
 package com.management.platform.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
@@ -56,48 +57,54 @@ public class TaskGroupServiceImpl extends ServiceImpl<TaskGroupMapper, TaskGroup
 
     @Override
     @Transactional
-    public HttpRespMsg createFromTemplate(GroupTemplate template, Integer projectId) {
+    public HttpRespMsg createFromTemplate(String templateJson, Integer projectId) {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
-        TaskGroup taskGroup = new TaskGroup();
-        taskGroup.setName(template.getName());
-        taskGroup.setProjectId(projectId);
-        save(taskGroup);
+        List<GroupTemplate> groupTemplates = JSONArray.parseArray(templateJson, GroupTemplate.class);
+        List<TaskGroup> list=new ArrayList<>();
+        for(GroupTemplate template:groupTemplates){
+            TaskGroup taskGroup = new TaskGroup();
+            taskGroup.setName(template.getName());
+            taskGroup.setProjectId(projectId);
+            save(taskGroup);
+            list.add(taskGroup);
 
-        //从模板创建任务列表
-        List<GroupTmpstages> stages = groupTmpstagesMapper.selectList(new QueryWrapper<GroupTmpstages>().eq("template_id", template.getId()));
-        List<Stages> batchList = new ArrayList<>();
-        stages.forEach(s->{
-            Stages item = new Stages();
-            item.setGroupId(taskGroup.getId());
-            item.setStagesName(s.getStagesName());
-            item.setSequence(s.getSequence());
-            item.setProjectId(projectId);
-            batchList.add(item);
-        });
-        stagesService.saveBatch(batchList);
-        //阶段的任务,里程碑,风险
-        List<GtemplateTask> gtemplateTaskList = gtemplateTaskMapper.selectList(
-                new QueryWrapper<GtemplateTask>().eq("gtemplate_id", template.getId())
-                        .orderByAsc("seq"));
-        if (gtemplateTaskList.size() > 0) {
-            List<Task> taskList = new ArrayList<>();
-            gtemplateTaskList.forEach(gt->{
-                Task task = gt.toTask();
-                task.setProjectId(projectId);
-                task.setGroupId(taskGroup.getId());
-                String sName = stages.stream().filter(s->s.getId().equals(gt.getTstagesId())).findFirst().get().getStagesName();
-                Integer realStageId = batchList.stream().filter(bat->bat.getStagesName().equals(sName)).findFirst().get().getId();
-                task.setStagesId(realStageId);
-                task.setCreaterId(user.getId());
-                task.setCreaterName(user.getName());
-                task.setCreatorColor(user.getColor());
-                taskList.add(task);
+            //从模板创建任务列表
+            List<GroupTmpstages> stages = groupTmpstagesMapper.selectList(new QueryWrapper<GroupTmpstages>().eq("template_id", template.getId()));
+            List<Stages> batchList = new ArrayList<>();
+            stages.forEach(s->{
+                Stages item = new Stages();
+                item.setGroupId(taskGroup.getId());
+                item.setStagesName(s.getStagesName());
+                item.setSequence(s.getSequence());
+                item.setProjectId(projectId);
+                batchList.add(item);
             });
-            taskService.saveBatch(taskList);
+            stagesService.saveBatch(batchList);
+            //阶段的任务,里程碑,风险
+            List<GtemplateTask> gtemplateTaskList = gtemplateTaskMapper.selectList(
+                    new QueryWrapper<GtemplateTask>().eq("gtemplate_id", template.getId())
+                            .orderByAsc("seq"));
+            if (gtemplateTaskList.size() > 0) {
+                List<Task> taskList = new ArrayList<>();
+                gtemplateTaskList.forEach(gt->{
+                    Task task = gt.toTask();
+                    task.setProjectId(projectId);
+                    task.setGroupId(taskGroup.getId());
+                    String sName = stages.stream().filter(s->s.getId().equals(gt.getTstagesId())).findFirst().get().getStagesName();
+                    Integer realStageId = batchList.stream().filter(bat->bat.getStagesName().equals(sName)).findFirst().get().getId();
+                    task.setStagesId(realStageId);
+                    task.setCreaterId(user.getId());
+                    task.setCreaterName(user.getName());
+                    task.setCreatorColor(user.getColor());
+                    taskList.add(task);
+                });
+                taskService.saveBatch(taskList);
+            }
         }
+
         HttpRespMsg msg = new HttpRespMsg();
-        msg.data = taskGroup;
+        msg.data = list;
         return msg;
     }
 }

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

@@ -96,6 +96,10 @@ wx:
   template_project_deadline: kY2Qzec64uOANNXA0yn-PV09ZnNjCeGXwWjTaVmQiLU
   template_report_reject: TICiRkvCpF4NCbkPOjefXTpz7jXgpt0SZGkNjCMIt3M
   template_report_week: lhwkaW9BKwCvMtCuoAxLw4lZoGgMaucL0Ap0Vz-5KOY
+
+#钉钉参数配置
+dingding:
+  appId: 71020
 ##actuator健康检查配置
 management:
   security:

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

@@ -94,7 +94,7 @@
 
     <!--获取查询者所在公司每个项目的工时成本-->
     <select id="getTimeCost" resultType="java.util.Map">
-        SELECT a.id, a.project_code as projectCode, a.project_name AS project, SUM(b.working_time) AS cost, SUM(b.cost) AS costMoney
+        SELECT a.id, a.project_code as projectCode, a.project_name AS project, SUM(b.working_time) AS cost, SUM(b.cost) AS costMoney,a.category_name as categoryName
         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

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

@@ -53,7 +53,7 @@
 
     <!--根据日期获取全部报告信息-->
     <select id="getAllReportByDate" resultType="java.util.Map">
-        SELECT a.id, c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
+        SELECT a.id, c.name, b.project_name AS project,b.category_name as categoryName, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.pic_str as picStr, multi_worktime as multiWorktime
@@ -113,7 +113,7 @@
     </select>
 
     <select id="getProjectMembReportByDate" resultType="java.util.Map">
-        SELECT a.id, c.name, b.project_name AS project, a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
+        SELECT a.id, c.name, b.project_name AS project, b.category_name as categoryName,a.working_time AS duration, a.content, a.create_time AS time, a.create_date as createDate,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.pic_str as picStr, multi_worktime as multiWorktime

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

@@ -1,7 +1,7 @@
 var path = require('path')
 
 //  var ip = '127.0.0.1'
-// var ip = '192.168.2.29'
+// var ip = '192.168.2.36'
 // var ip = '192.168.2.12'// var ip = '47.100.37.243' 
 
 var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip

+ 6 - 6
fhKeeper/formulahousekeeper/timesheet/package-lock.json

@@ -2815,7 +2815,7 @@
     },
     "el-table-infinite-scroll": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/el-table-infinite-scroll/-/el-table-infinite-scroll-2.0.0.tgz",
+      "resolved": "https://registry.npmmirror.com/el-table-infinite-scroll/-/el-table-infinite-scroll-2.0.0.tgz",
       "integrity": "sha512-zDmsGvce4V0wx7j4CBdYi2wgMsv66SbQBp7984gk25Jc8b2nKdjBYrXpFLfMDZ0iYjTDpxkH9+5iEhCgM3+byw==",
       "requires": {
         "core-js": "^3.x",
@@ -2825,7 +2825,7 @@
       "dependencies": {
         "core-js": {
           "version": "3.22.5",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz",
+          "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.22.5.tgz",
           "integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA=="
         }
       }
@@ -5098,7 +5098,7 @@
       "dependencies": {
         "semver": {
           "version": "5.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.3.0.tgz",
           "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
           "dev": true
         }
@@ -5218,7 +5218,7 @@
     },
     "normalize-wheel": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+      "resolved": "https://registry.nlark.com/normalize-wheel/download/normalize-wheel-1.0.1.tgz",
       "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU="
     },
     "npmlog": {
@@ -5235,7 +5235,7 @@
     },
     "nprogress": {
       "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/nprogress/download/nprogress-0.2.0.tgz",
       "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E="
     },
     "nth-check": {
@@ -9343,7 +9343,7 @@
         },
         "path-exists": {
           "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz",
           "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
           "dev": true
         },

+ 6 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue

@@ -228,7 +228,7 @@
                             </el-popover>
                         </template>
                     </el-table-column>
-                    <el-table-column v-if="!isDingding" :label="isAuditList ? '审核' : '操作'" width="180" fixed="right" >
+                    <el-table-column v-if="isDingding" :label="isAuditList ? '审核' : '操作'" width="180" fixed="right" >
                         <template slot-scope="scope">
                             <div v-if="isAuditList">
                                 <el-button icon="el-icon-check" circle size="mini" @click="approve(scope.row)"></el-button>
@@ -240,7 +240,7 @@
                             </div>
                         </template>
                     </el-table-column>
-                    <el-table-column v-if="isDingding" label="操作" width="90" fixed="right">
+                    <el-table-column v-if="!isDingding" label="操作" width="90" fixed="right">
                         <template slot-scope="scope">
                             <el-button icon="iconfont firerock-iconguanlian" circle size="mini" @click="DingdingEditor(scope.row)"></el-button>
                         </template>
@@ -536,10 +536,9 @@
                 </el-select>
             </el-form-item>
             <el-form-item :label="wuduData.customDegreeName"
-            
-            style="width:300px;margin-right:30px;display:inline-block;"
+            style="width:360px;margin-right:30px;display:inline-block;"
             prop="degreeName">
-                <el-select style="width:100%" v-model="DingdingForm.degreeId" filterable clearable placeholder="请选择" >
+                <el-select style="width:220px" v-model="DingdingForm.degreeId" filterable clearable placeholder="请选择" >
                     <el-option
                     v-for="item in wuduList"
                     :key="item.id"
@@ -547,7 +546,9 @@
                     :value="item.id">
                     </el-option>
                 </el-select>
+                <el-link style="display: inline-block;margin-left: 20px;">添加</el-link>
             </el-form-item>
+            
         </el-form>
         <span slot="footer" class="dialog-footer">
             <el-button @click="DingdingEditDialog = false">取 消</el-button>

+ 21 - 15
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -16,7 +16,7 @@
               <i class="iconfont firerock-iconbaobiao"></i>
               <span>项目报表服务</span>
             </template>
-              <el-menu-item index="1-1"><p @click="ssl(0)">项目报表</p></el-menu-item>
+              <el-menu-item index="1-1" ><p @click="ssl(0)">项目报表</p></el-menu-item>
               <el-menu-item index="1-2" v-if="permissions.reportTask"><p @click="ssl(1)">项目任务报表</p></el-menu-item>
               <el-menu-item index="1-3" v-if="permissions.reportCostOf"><p @click="ssl(2)">项目成本报表</p></el-menu-item>
               <el-menu-item index="1-4" v-if="permissions.reportCostWarning"><p @click="ssl(7)">工时成本预警表</p></el-menu-item>
@@ -41,7 +41,7 @@
     <div ref="staff" style="margin: 5px 0px 0px 200px; width: 84%">
         <div class="staff">
             <!--项目报表 -->
-            <el-table v-if="ins == 0" :key="ins" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+            <el-table v-if="ins == 0" :key="ins" border :data="list0" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
                 <el-table-column  prop="projectCode" label="项目编号"  width="120"></el-table-column>
                 <el-table-column  prop="projectName" label="项目名称" >
                   <template slot-scope="scope" >
@@ -81,7 +81,7 @@
             </el-table>
 
             <!-- 项目任务报表 -->
-            <el-table v-if="ins == 1" :key="ins" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+            <el-table v-if="ins == 1" :key="ins" border :data="list1" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
                 <el-table-column  prop="project_code" label="项目编号"  width="120"></el-table-column>
                 <el-table-column  prop="project_name" label="项目名称" width="200">
                   <template slot-scope="scope" >
@@ -121,7 +121,7 @@
             </el-table>
 
             <!--项目成本报表 -->
-            <el-table v-if="ins == 2"  :key="ins" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+            <el-table v-if="ins == 2"  :key="ins" border :data="list2" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
                 <el-table-column  prop="projectCode" label="项目编号"  width="120"></el-table-column>
                 <el-table-column  prop="projectName" label="项目名称" >
                   <template slot-scope="scope" >
@@ -161,7 +161,7 @@
             </el-table>
 
             <!--项目收支平衡表 -->
-            <el-table v-if="ins == 3"  :key="ins" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+            <el-table v-if="ins == 3"  :key="ins" border :data="list3" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
                 <el-table-column prop="projectCode" label="项目编号"  width="120"></el-table-column>
                 <el-table-column prop="projectName" label="项目名称" >
                   <template slot-scope="scope" >
@@ -210,7 +210,7 @@
                 </el-table-column>
             </el-table>
             <!--客户项目报表 -->
-            <el-table v-if="ins == 4" border :data="list"  :key="ins"
+            <el-table v-if="ins == 4" border :data="list4"  :key="ins"
             highlight-current-row v-loading="listLoading" :height="tableHeight" 
              style="width: 100%;">
                 <el-table-column prop="customerName" label="客户名称" ></el-table-column>
@@ -261,7 +261,7 @@
                 </el-table-column>
             </el-table>
             <!--项目阶段汇总工时报表 -->
-            <el-table v-if="ins == 5" border :data="list" :key="ins"
+            <el-table v-if="ins == 5" border :data="list5" :key="ins"
             highlight-current-row v-loading="listLoading" :height="tableHeight" 
              style="width: 100%;">
                 <el-table-column prop="projectCode" label="项目编号"  width="120" fixed ></el-table-column>
@@ -503,7 +503,11 @@ export default {
       importanceList:[{id:1,label:'正常'},{id:2,label:'紧急'},{id:3,label:'重要'},{id:4,label:'重要且紧急'}],
       listLoading:false,
       tableHeight:0,
-      list:[],
+      list1:[],
+      list2: [],
+      list3: [],
+      list4: [],
+      list5: [],
       total:0,
       users: [], // 人员信息
       displayTable: false,
@@ -527,7 +531,7 @@ export default {
       dialogVisibleDetails: false,
       detailsList: [],
       baseCostList: [],
-      baseCostColumns: []
+      baseCostColumns: [],
     };
   },
   computed: {},
@@ -676,6 +680,7 @@ export default {
                     this.overTime()
                 } else if (this.ins == 7) {
                     this.getBaseCost()
+                    this.$refs.eltable7.doLayout()
                 }
             },
       exportExcel() {
@@ -750,7 +755,7 @@ export default {
                     },
         res => {
             if (res.code == "ok") {
-                this.list = res.data.records;
+                this.list4 = res.data.records;
                 this.total = res.data.total;
                 this.listLoading = false; 
             } else {
@@ -775,7 +780,7 @@ export default {
                     },
         res => {
             if (res.code == "ok") {
-                this.list = res.data.records;
+                this.list3 = res.data.records;
                 this.total = res.data.total;
                 this.listLoading = false; 
             } else {
@@ -832,8 +837,9 @@ export default {
                     },
         res => {
             if (res.code == "ok") {
-                this.list = res.data.records;
+                this.list2 = res.data.records;
                 this.total = res.data.total;
+                this.$forceUpdate()
                 this.listLoading = false; 
             } else {
                 this.$message({
@@ -857,7 +863,7 @@ export default {
                     },
         res => {
             if (res.code == "ok") {
-                this.list = res.data.records;
+                this.list1 = res.data.records;
                 this.total = res.data.total;
                 this.listLoading = false; 
             } else {
@@ -883,7 +889,7 @@ export default {
                     },
         res => {
             if (res.code == "ok") {
-                this.list = res.data.records;
+                this.list5 = res.data.records;
                 console.log(this.list);
                 this.total = res.data.total;
                 this.stages = res.data.stages;
@@ -965,7 +971,7 @@ export default {
                     },
         res => {
             if (res.code == "ok") {
-                this.list = res.data.records;
+                this.list0 = res.data.records;
                 this.total = res.data.total;
                 this.proList = res.data.records
                 this.listLoading = false; 

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue

@@ -452,7 +452,7 @@
             <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/员工项目分摊比例导入模板.xlsx" download="员工项目分摊比例导入模板.xlsx">员工项目分摊比例导入模板.xlsx</el-link>
             </p>
             <p>2. 填写excel模板,请确保模板中的项目和人员已添加到系统中。</p>
-            <p style="display: flex;justify-content: center;">
+            <p style="display: flex;justify-content: center;padding:1em 0">
                 <el-upload ref="upload"  action="#" :limit="1" :http-request="batchImportData" :show-file-list="false">
                 <el-button type="primary" :underline="false" :loading="importingData">开始导入</el-button>
             </el-upload>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/gantt.vue

@@ -90,7 +90,7 @@ export default {
       gantt.config.drag_move = false;
     gantt.config.xml_date = "%Y-%m-%d";
     gantt.config.columns=[
-        {name:"text",label:(this.stafforpro == "人员" ? "员工名称" : "项目名称"), align: "left" },
+        {name:"text",label:(this.stafforpro == "人员查看" ? "员工名称" : "项目名称"), align: "left" },
         {name:"time",label:"计划工时(h)", align: "center" }
         // {name:"start_date", label:"开始时间", width:'*' , align: "center" },
         // {name:"duration",   label:"工时(天)", width:'*' ,   align: "center" }

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

@@ -176,6 +176,7 @@
                 <el-button size="small" @click="batchSetWudulistBtn1">取消</el-button>
                 <el-button size="small" type="primary" @click="batchSetWudulistBtn2(true)">批量设置{{user.timeType.customDegreeName}}</el-button>
                 <el-button size="small" type="primary" @click="batchSetWudulistBtn2(false)">批量添加{{user.timeType.customDegreeName}}</el-button>
+                <el-button size="small" type="primary" @click="addGroupPerson()" :loading="addGroupPersonBtnLoading">批量添加分组参与人</el-button>
             </template>
             <el-pagination
                 @size-change="handleSizeChange"
@@ -505,7 +506,7 @@
                     </el-input>
                 <el-tree :data="deptMembData" show-checkbox :props="defaultProps" node-key="id"
                     ref="chooseMembTree" @check-change="onTreeItemChange" :default-checked-keys="addForm.userId"
-                    highlight-current  :filter-node-method="filterNode" default-expand-all></el-tree>
+                    highlight-current  :filter-node-method="filterNode"></el-tree>
                 </el-scrollbar>
             </div>
             <div>已选中&nbsp;{{chosenMembCount}}&nbsp;人</div>
@@ -563,6 +564,7 @@
             </div>
         </el-dialog>
 
+        <!-- 批量修改自定义维度 -->
         <el-dialog :title="checkoradd ? '批量修改' : '批量添加'" :visible.sync="checkedWuduDialog" v-if="checkedWuduDialog" width="40%">
             <el-form model="" label-width="20%">
                 <el-form-item :label="'设置' + user.timeType.customDegreeName">
@@ -577,6 +579,49 @@
                 <el-button type="primary" @click="batchSetWudulistBtn4" v-if="!checkoradd">确定</el-button>
             </div>
         </el-dialog>
+
+        <!-- 批量添加参与人 -->
+        <el-dialog title="批量添加参与人" v-if="addGroupPersonDialog" :visible.sync="addGroupPersonDialog" width="40%">
+            <el-form label-width="20%">
+                <el-form-item label="选择人员">
+                    <el-tooltip placement="top" effect="light">
+                        <div slot="content" style="width:450px">{{addGroupPersonData.personNames}}</div>
+                        <el-input  @focus="addGroupPersonP" v-model="addGroupPersonData.personNames"></el-input>
+                    </el-tooltip>
+                </el-form-item>
+                <el-form-item label="选择分组">
+                    <el-select v-model="addGroupPersonData.group" multiple placeholder="请选择分组" style="width:100%">
+                        <el-option v-for="item in addGroupList" 
+                        :key="item.groupIds"
+                        :label="item.name"
+                        :value="item.groupIds"></el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button  @click="addGroupPersonDialog = false" >取消</el-button>
+                <el-button type="primary" @click="addGroupPersonSure()" >确定</el-button>
+            </div>
+
+            <el-dialog append-to-body title="选择人员" v-if="addGroupPersonPdialog" :visible.sync="addGroupPersonPdialog" width="40%">
+                <div class="tree" style="height:300px">
+                    <el-scrollbar style="height:100%">
+                        <el-input
+                        placeholder="输入关键字进行过滤"
+                        v-model="filterText2">
+                        </el-input>
+                    <el-tree :data="deptMembData" show-checkbox :props="defaultProps" node-key="id"
+                        ref="chooseMembTree2" @check-change="addPersonCheck"
+                        highlight-current  :filter-node-method="filterNode" :default-checked-keys="addGroupPersonData.person"></el-tree>
+                    </el-scrollbar>
+                </div>
+                <div>已选中&nbsp;{{chosenMembCount}}&nbsp;人</div>
+                <div slot="footer" class="dialog-footer">
+                    <el-button  @click="addGroupPersonPdialog = false" >取消</el-button>
+                    <el-button type="primary" @click="addPersonSure()" >确定</el-button>
+                </div>
+            </el-dialog>
+        </el-dialog>
     </section>
 </template>
 <style scoped>
@@ -693,6 +738,7 @@ a {
                 auseList: [],
                 yonghuUser: [],
                 filterText: '',
+                filterText2: '',
                 showClfDialog: false,
                 addClfDialog:false,
                 addClf:{name:'',id:''},
@@ -702,7 +748,17 @@ a {
                 checkedProjectArr: [],
                 checkedWuduDialog: false,
                 checkedWuduArr: [],
-                checkoradd: true
+                checkoradd: true,
+
+                addGroupPersonBtnLoading: false,
+                addGroupPersonDialog: false,
+                addGroupList: [],
+                addGroupPersonData: {
+                    group: [],
+                    person: null,
+                    personNames: ''
+                },
+                addGroupPersonPdialog: false
             };
         },
         // 过滤器
@@ -729,6 +785,9 @@ a {
         watch: {
             filterText(val) {
                 this.$refs.chooseMembTree.filter(val);
+            },
+            filterText2(val) {
+                this.$refs.chooseMembTree2.filter(val);
             }
         },
         methods: {
@@ -739,7 +798,12 @@ a {
             },
             batchSetWudulistBtn1(){
                 this.$refs.projectlistOfWudulist.clearSelection()
-                this.checkedWuduArr = []
+                this.checkedWuduArr = [],
+                this.addGroupPersonData = {
+                            group: null,
+                            person: null,
+                            personNames: ''
+                        }
             },
             batchSetWudulistBtn2(e){
                 if(this.checkedProjectArr.length == 0){
@@ -833,6 +897,103 @@ a {
             },
 
 
+            test(){
+                console.log(this.addGroupPersonData.group);
+            },
+            // 批量添加参与人员
+            addGroupPerson(){
+                let proArr = []
+                if(this.checkedProjectArr.length == 0){
+                    this.$message('请选择项目')
+                    return
+                }
+                this.addGroupPersonBtnLoading = true
+                for(let i=0;i<this.checkedProjectArr.length;i++){
+                    proArr.push(this.checkedProjectArr[i].id)
+                }
+                this.http.post('/project/getProjectsGroups',{
+                    projectIdArray: JSON.stringify(proArr)
+                },res => {
+                    if(res.code == 'ok'){
+                        console.log('分组',res.data);
+                        this.addGroupList = res.data
+                        this.addGroupPersonBtnLoading = false
+                        this.addGroupPersonDialog = true
+                    }else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+                
+            },
+            addGroupPersonP(){
+                this.filterText2 = ''
+                this.addGroupPersonPdialog = true
+            },
+            addPersonCheck(){
+                var chosenList = this.$refs.chooseMembTree2.getCheckedNodes();
+                var list = chosenList.filter(item=>item.isUser == 1);
+                this.chosenMembCount = list.length;
+                console.log(list);
+            },
+            addPersonSure(){
+                this.addGroupPersonPdialog = false
+                let chosenList = this.$refs.chooseMembTree2.getCheckedNodes();
+                let list = chosenList.filter(item=>item.isUser == 1);
+                let listIDs = []
+                let listNames = ''
+                for(let i=0;i<list.length;i++){
+                    listIDs.push(list[i].id)
+                    listNames += list[i].label + ','
+                }
+                this.addGroupPersonData.person = listIDs
+                this.addGroupPersonData.personNames = listNames
+            },
+            addGroupPersonSure(){
+                if(this.addGroupPersonData.group.length == 0 || this.addGroupPersonData.person == null){
+                    this.$message({
+                        message: '请选择人员/分组',
+                        type: 'warning'
+                    })
+                    return
+                }
+                let groupList = []
+                for(let i=0;i<this.addGroupPersonData.group.length;i++){
+                    groupList = [...groupList,...this.addGroupPersonData.group[i]]
+                }
+                this.http.post('/project/batchAddMembToGroup',{
+                    membIdArray: JSON.stringify(this.addGroupPersonData.person),
+                    groupIds: JSON.stringify(groupList)
+                },res => {
+                    if(res.code == 'ok'){
+                        this.addGroupPersonDialog = false,
+                        
+                        this.batchSetWudulistBtn1()
+                        this.$message({
+                            message: '添加成功',
+                            type: 'success'
+                        })
+                    }else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
+
 
             filterNode(value, data) {
                 if (!value) return true;
@@ -1244,6 +1405,7 @@ a {
             showChooseMembTree() {
                 this.chosenMembCount = this.participator.length;
                 this.chooseParticipVisible = true;
+                this.filterText = ''
             },
             onTreeItemChange() {
                 var chosenList = this.$refs.chooseMembTree.getCheckedNodes();

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

@@ -269,7 +269,7 @@
                     </el-input>
                 <el-tree :data="deptMembData" show-checkbox :props="defaultProps" node-key="id"
                     ref="chooseMembTree2" @check-change="onTreeItemChange" :default-checked-keys="alreadyPartArray"
-                    highlight-current  :filter-node-method="filterNode" default-expand-all></el-tree>
+                    highlight-current  :filter-node-method="filterNode"></el-tree>
                 </el-scrollbar>
             </div>
             <div>已选中&nbsp;{{chosenMembCount}}&nbsp;人</div>
@@ -1095,6 +1095,7 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
                 this.ididid = item.id
                 console.log(item);
                 this.participantsDialog = true
+                this.participantsFilterText = ''
                 this.getAlreadyPartArray(item.id)
                 this.getDepartmentList()
                 
@@ -2569,6 +2570,7 @@ import delete$ from 'dingtalk-jsapi/api/biz/cspace/delete';
 
             //切换项目
             onProjectChange() {
+                this.groupSearch = null
                 let path = this.$route.path;
                 path = path.substring(0,path.lastIndexOf('/'))+'/'+this.curProjectId;
                 this.$router.push(path);

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -1064,7 +1064,7 @@
                 <el-button type="primary" :underline="false" :loading="importingData">开始导入</el-button>
             </el-upload>
             </p>
-            <div style="display: flex;justify-content: end;" >
+            <div style="display: flex;justify-content: end;padding-bottom: 1em;">
                 <el-link type="primary" @click="toView()">查看工时导入记录</el-link>
             </div>
         </el-dialog>
@@ -1156,6 +1156,7 @@
                 <span style="font-size:16px;">工时批量导入</span>
                 <el-link v-if="active==0"  style="float:right;margin-right:100px;" type="primary" @click="toView()">查看工时导入记录</el-link>
             </div>
+            
             <span slot="footer">
             <el-link v-show="active==1" style="margin-right:300px;margin-top:10px;" 
                 type="primary" @click="downloadCheckInExcel">下载员工工时统计模板.xlsx</el-link>

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

@@ -125,6 +125,7 @@
             </el-table-column>
             
             <el-table-column prop="name" label="姓名" sortable></el-table-column>
+            <el-table-column prop="departmentName" label="部门" sortable></el-table-column>
             <el-table-column prop="dateStr" label="日期" sortable>
             </el-table-column>
             <el-table-column prop="reportTime" label="工作时长(h)" >
@@ -317,6 +318,7 @@
                     this.listLoading = false;
                     if (res.code == "ok") {
                         this.list = res.data;
+                        console.log(this.port.report.portList);
                     } else {
                         this.$message({
                         message: res.msg,

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

@@ -4,17 +4,17 @@ const path = require('path');
 const themePath = path.resolve(__dirname,'src/assets/style/theme.less');
 
 // var ip = '127.0.0.1'
-var ip = '192.168.2.6'
+// var ip = '192.168.2.6'
 // var ip = '47.100.37.243'
-// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
-// for (var i in ifaces) {
-//     for (var j in ifaces[i]) {
-//         var val = ifaces[i][j]
-//         if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
-//             ip = val.address
-//         }
-//     }
-// }
+var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+for (var i in ifaces) {
+    for (var j in ifaces[i]) {
+        var val = ifaces[i][j]
+        if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
+            ip = val.address
+        }
+    }
+}
 
 module.exports = {
     // 关闭eslint检查