Browse Source

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

seyason 2 năm trước cách đây
mục cha
commit
91d5f5a4c4
26 tập tin đã thay đổi với 932 bổ sung207 xóa
  1. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  2. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  3. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Task.java
  4. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  5. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  6. 57 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  7. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  8. 11 11
      fhKeeper/formulahousekeeper/octopus/config/index.js
  9. 12 12
      fhKeeper/formulahousekeeper/timesheet/config/index.js
  10. 8 2
      fhKeeper/formulahousekeeper/timesheet/src/components/select.vue
  11. 5 2
      fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json
  12. 5 2
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  13. 12 4
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  14. 133 85
      fhKeeper/formulahousekeeper/timesheet/src/views/project/detail.vue
  15. 19 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/detailDep.vue
  16. 3 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  17. 13 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  18. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue
  19. 112 66
      fhKeeper/formulahousekeeper/timesheet/src/views/project/summary.vue
  20. 12 1
      fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue
  21. 39 8
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  22. 8 0
      fhKeeper/formulahousekeeper/timesheet_h5/src/router/index.js
  23. 5 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/project/index.vue
  24. 57 7
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/project/projectInside.vue
  25. 340 0
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/task/editask.vue
  26. 36 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/task/index.vue

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

@@ -29,6 +29,7 @@ import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -426,6 +427,17 @@ public class ProjectController {
         return projectService.exportAllProjectCost(request);
     }
 
+    //分页查询员工月度工时表
+    @RequestMapping("/getEmpMonthHours")
+    public HttpRespMsg getEmpMonthHours(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, LocalDate Month,Integer departmentId,String userId) {
+        return projectService.getEmpMonthHours(pageIndex, pageSize, Month,departmentId,userId, request);
+    }
+
+    //导出员工月度工时表
+    @RequestMapping("/exportEmpMonthHours")
+    public HttpRespMsg exportEmpMonthHours() {
+        return projectService.exportAllProjectCost(request);
+    }
 
     //分页查询项目收支平衡表
     @RequestMapping("/getProjectInAndOut")

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

@@ -79,6 +79,8 @@ public class TaskController {
     private GroupParticipatorMapper groupParticipatorMapper;
     @Resource
     private DepartmentService departmentService;
+    @Resource
+    private TaskGroupService taskGroupService;
 
     @RequestMapping("/save")
     @Transactional
@@ -612,6 +614,11 @@ public class TaskController {
         }
         //查询任务的执行人
         t.setExecutorList(taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().eq("task_id", t.getId())));
+        //查询项目负责人id以及所属任务分组负责人id
+        Project project = projectService.getOne(new QueryWrapper<Project>().eq("id", t.getProjectId()));
+        TaskGroup group = taskGroupService.getOne(new QueryWrapper<TaskGroup>().eq("id", t.getGroupId()));
+        t.setProjectInchargerId(project.getInchargerId()==null?"":project.getInchargerId());
+        t.setGroupInchargerId(group.getInchargerId()==null?"":group.getInchargerId());
         msg.data = t;
         return msg;
     }

+ 12 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Task.java

@@ -109,6 +109,18 @@ public class Task extends Model<Task> {
     @TableField("project_id")
     private Integer projectId;
 
+    /**
+     * 项目负责人id
+     */
+    @TableField(exist = false)
+    private String projectInchargerId;
+
+    /**
+     * 分组负责人id
+     */
+    @TableField(exist = false)
+    private String groupInchargerId;
+
     /**
      * 当前阶段id
      */

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

@@ -200,4 +200,6 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg testRead(String jobId);
 
     HttpRespMsg testAdd(String jobId);
+
+    HttpRespMsg getEmpMonthHours(Integer pageIndex, Integer pageSize, LocalDate Month,Integer departmentId,String userId, HttpServletRequest request);
 }

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

@@ -851,7 +851,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 if (realUser.size()!=0){
                     for (DepartmentVO departmentVO : list) {
                         for (User user : realUser) {
-                            if (departmentVO.getId() == user.getDepartmentId()){
+                            if (departmentVO.getId().equals(user.getDepartmentId())){
                                 temp.add(departmentVO);
                                 continue;
                             }

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

@@ -6990,4 +6990,61 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return result;
     }
 
+    //分页查询员工月度工时表
+    @Override
+    public HttpRespMsg getEmpMonthHours(Integer pageIndex, Integer pageSize, LocalDate Month,Integer department,String userId, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg =new HttpRespMsg();
+//        User targetUser = userMapper.selectById(request.getHeader("token"));
+//        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "全部人员月度工时表");
+//        List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "负责部门月度工时表");
+//        List<Integer> deptIds=null;
+//        List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",targetUser.getCompanyId()));
+//        List<Department> userDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", targetUser.getId()).eq("company_id",targetUser.getCompanyId()));
+//        List<DepartmentOtherManager> departmentOtherManagerList = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("other_manager_id", targetUser.getId()));
+//        //判断查看权限
+//        if(functionAllList.size()==0){
+//            deptIds=new ArrayList<>();
+//            deptIds.add(-1);
+//            if(functionDeptList.size()>0){
+//                List<Integer> collect = userDepartmentList.stream().distinct().map(dm -> dm.getDepartmentId()).collect(Collectors.toList());
+//                List<Integer> otherCollect = departmentOtherManagerList.stream().distinct().map(dom -> dom.getDepartmentId()).collect(Collectors.toList());
+//                collect.addAll(otherCollect);
+//                for (Integer integer : collect) {
+//                    List<Integer> branchDepartment = getBranchDepartment(integer, allDepartmentList);
+//                    deptIds.addAll(branchDepartment);
+//                }
+//            }
+//        }
+//        long total;
+//        List<Map<String,Object>> resultList;
+//        List<Integer> branchDepartment =null;
+//        if(departmentId!=null){
+//            branchDepartment = getBranchDepartment(departmentId, allDepartmentList);
+//        }
+//        if(pageIndex!=null&&pageSize!=null){
+//            Integer size=pageSize;
+//            Integer start=(pageIndex-1)*size;
+//            resultList=projectMapper.getUserWorkingTimeStatic(targetUser.getCompanyId(),startDate,endDate,start,size,userId,branchDepartment,deptIds);
+//            total=projectMapper.findCountWithUserWorkingTime(targetUser.getCompanyId(),startDate,endDate,start,size,userId,branchDepartment,deptIds);
+//        }else{
+//            resultList=projectMapper.getUserWorkingTimeStatic(targetUser.getCompanyId(),startDate,endDate,null,null,userId,branchDepartment,deptIds);
+//            total=projectMapper.findCountWithUserWorkingTime(targetUser.getCompanyId(),startDate,endDate,null,null,userId,branchDepartment,deptIds);
+//        }
+//        for (Map<String, Object> map : resultList) {
+//            BigDecimal phBigDecimal =new BigDecimal(String.valueOf(map.get("planHours")==null?0:map.get("planHours")));
+//            BigDecimal wtBigDecimal =new BigDecimal(String.valueOf(map.get("workingTime")==null?0:map.get("workingTime")));
+//            if(phBigDecimal.compareTo(BigDecimal.ZERO)==0||wtBigDecimal.compareTo(BigDecimal.ZERO)==0){
+//                map.put("proportion",dft.format(0));
+//            }else{
+//                BigDecimal divide = wtBigDecimal.divide(phBigDecimal, 2, BigDecimal.ROUND_HALF_UP);
+//                map.put("proportion",dft.format(divide));
+//            }
+//        }
+//        Map<String,Object> map=new HashMap<>();
+//        map.put("result",resultList);
+//        map.put("total",total);
+//        httpRespMsg.data=map;
+        return httpRespMsg;
+    }
+
 }

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

@@ -451,10 +451,13 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, Entity, String.class);
             if (responseEntity.getStatusCode() == HttpStatus.OK) {
                 String resp = responseEntity.getBody();
+                System.err.println(resp);
                 JSONObject obj = JSONObject.parseObject(resp);
                 if (obj.getIntValue("errcode") == 0) {
                     UserServiceImpl.provider_access_token = obj.getString("provider_access_token");
                     UserServiceImpl.providerTokenExpireTime = System.currentTimeMillis() + obj.getIntValue("expires_in")*1000;
+                }else{
+                    System.err.println("token获取失败");
                 }
             }
         }
@@ -486,6 +489,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
             if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
                 String resp = ResponseEntity.getBody();
+                System.err.println(resp);
                 JSONObject respJson = JSONObject.parseObject(resp);
                 if (respJson.getInteger("errcode")==0){
                     JSONObject queryResult = respJson.getJSONObject("query_result");
@@ -494,7 +498,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         if (jsonArray!=null){
                             user = jsonArray.toArray();
                         }
+                    }else{
+                        System.err.println("通讯录查询请求无userid列表");
                     }
+                }else {
+                    System.err.println("通讯录查询请求失败");
                 }
             }
         }
@@ -514,10 +522,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         if (org.apache.commons.lang3.StringUtils.isNotBlank(keyword) && wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1 && departmentId == -1){
             Object[] users = getOpenId(wxCorpInfo.getCorpid(), keyword);
             if (users!=null){
+                System.err.println("查询到的users列表为:"+users.toString());
                 List<User> realUser = userMapper.selectList(new QueryWrapper<User>().in("corpwx_userid", users));
                 data.put("records",realUser);
                 return httpRespMsg;
             }else {
+                System.err.println("没有查询到数据");
                 ArrayList<Object> records = new ArrayList<>();
                 data.put("records",records);
                 return httpRespMsg;

+ 11 - 11
fhKeeper/formulahousekeeper/octopus/config/index.js

@@ -1,18 +1,18 @@
 var path = require('path')
 
 //  var ip = '127.0.0.1'
-// var ip = '192.168.2.13'
-// var ip = '47.100.37.243' 
+var ip = '192.168.2.4'
+// var ip = '47.101.180.183' 
 
-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 = {
   build: {

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

@@ -1,20 +1,20 @@
 var path = require('path')
 
 //  var ip = '127.0.0.1'
-// var ip = '47.101.180.183' 
+var ip = '47.101.180.183'
 // var ip = '192.168.10.6'
-// var ip = '192.168.2.39'
-
-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 ip = '192.168.2.6'
 
+// 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
+//         }
+//     }
+// }
+// 1196735749
 module.exports = {
   build: {
     env: require('./prod.env'),

+ 8 - 2
fhKeeper/formulahousekeeper/timesheet/src/components/select.vue

@@ -126,7 +126,12 @@ export default {
         other: {
             type: [String, Number, Boolean],
             default: false
-        }
+        },
+        // 是否执行到日报单独的函数
+        flgs: {
+            type: Boolean,
+            default: false
+        },
     },
     components: {
         selectWidth: '150',
@@ -281,7 +286,8 @@ export default {
         liClick(item, itemIndex) {
             let nameId = item.id || item.auditorId
             if(!this.multiSelect) {
-                if(this.flg) {
+                console.log('我进来了', this.flg)
+                if(this.flgs) {
                     let obj = {
                         id: nameId,
                         idx: this.dailyListIndex

+ 5 - 2
fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json

@@ -42,7 +42,7 @@
     "approvedProject": "Approved project daily review",
     "allState": "All state",
     "DidNotFillIn": "Did not fill in",
-    "missFillReport":"Missing",
+    "missFillReport": "Missing",
     "alreadyPassed": "already passed",
     "WaitingAudit": "Waiting audit",
     "notThrough": "Not through",
@@ -1394,5 +1394,8 @@
   "dao-chu-qing-jia-dan": "Export leave request",
   "suixiangmuzidongchuangjian": "Automatically created with project",
   "ren-wu-lie-biao-ming-cheng": "task list name",
-  "yu-suan-gong-shi": "budgeted hours"
+  "yu-suan-gong-shi": "budgeted hours",
+  "fan-hui": "return",
+  "jie-duan": "phase",
+  "xiang-mu-cheng-ben": "project cost"
 }

+ 5 - 2
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -42,7 +42,7 @@
     "approvedProject": "项目日报审核通过",
     "allState": "全部状态",
     "DidNotFillIn": "未填报",
-    "missFillReport":"漏填",
+    "missFillReport": "漏填",
     "alreadyPassed": "已通过",
     "WaitingAudit": "待审核",
     "notThrough": "不通过",
@@ -1394,5 +1394,8 @@
   "dao-chu-qing-jia-dan": "导出请假单",
   "suixiangmuzidongchuangjian": "随项目自动创建",
   "ren-wu-lie-biao-ming-cheng": "任务列表名称",
-  "yu-suan-gong-shi": "预算工时"
+  "yu-suan-gong-shi": "预算工时",
+  "fan-hui": "返回",
+  "xiang-mu-cheng-ben": "项目成本",
+  "jie-duan": "阶段"
 }

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

@@ -618,10 +618,18 @@
                                         totalCost += Number(params[i].data.money);
                                     }
                                 }
-                                res = res +'<br/>'+ params[0].name+ '<br/>' + _this.$t('zong-ji') + ':' + 
-                                ((_this.permissions.countHours) ? totalTime.toFixed(1) + _this.$t('time.hour') : '') + 
-                                ((_this.permissions.countCost) ? totalCost.toFixed(2) + _this.$t('yuan') : '') + 
-                                "<br/>";
+                                if(_this.user.userNameNeedTranslate != 1) {
+                                    res = res +'<br/>'+ params[0].name+ '<br/>' + _this.$t('zong-ji') + ':' + 
+                                    ((_this.permissions.countHours) ? totalTime.toFixed(1) + _this.$t('time.hour') : '') + 
+                                    ((_this.permissions.countCost) ? totalCost.toFixed(2) + _this.$t('yuan') : '') + 
+                                    "<br/>";
+                                } else {
+                                    res = res +'<br/>'+ '' + '<br/>' + _this.$t('zong-ji') + ':' + 
+                                    ((_this.permissions.countHours) ? totalTime.toFixed(1) + _this.$t('time.hour') : '') + 
+                                    ((_this.permissions.countCost) ? totalCost.toFixed(2) + _this.$t('yuan') : '') + 
+                                    "<br/>";
+                                }
+                                
                                 return res;
                             }
                         },

+ 133 - 85
fhKeeper/formulahousekeeper/timesheet/src/views/project/detail.vue

@@ -4,23 +4,23 @@
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
                 <el-form-item>
-                    <el-button type="text" @click="backToList" icon="el-icon-back" class="back">返回</el-button>
+                    <el-button type="text" @click="backToList" icon="el-icon-back" class="back">{{ $t('fan-hui') }}</el-button>
                 </el-form-item>
                 <el-form-item class="divLine"></el-form-item>
                 <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.toFixed(2)}}元</span></span>
+                    <span style="font-size:18px;">{{ $t('xiang-mu-cheng-ben') }}:<span style="color:#20a0ff;">{{cost.toFixed(2)}}{{ $t('yuan') }}</span></span>
                 </el-form-item>
             </el-form>
         </el-col>
         <el-col :span="24"  style="margin-top:10px;padding-bottom: 0px;text-align:center;">
             <el-radio-group v-model="radio" @change="getList">
-                <el-radio-button label="人员"></el-radio-button>
-                <el-radio-button label="任务分组" v-if="user.company.packageProject != 0"></el-radio-button>
-                <el-radio-button label="子项目" v-if="user.timeType.mainProjectState != '1'"></el-radio-button>
-                <el-radio-button label="阶段" v-if="user.company.packageProject != 0"></el-radio-button>
+                <el-radio-button :label="$t('ren-yuan')"></el-radio-button>
+                <el-radio-button :label="$t('other.taskGroup')" v-if="user.company.packageProject != 0"></el-radio-button>
+                <el-radio-button :label="$t('lable.subproject')" v-if="user.timeType.mainProjectState != '1'"></el-radio-button>
+                <el-radio-button :label="$t('jie-duan')" v-if="user.company.packageProject != 0"></el-radio-button>
             </el-radio-group>
         </el-col>
         <div id="clearfix" :style="'overflow-x: auto;width:100%;padding-bottom: 0px; position: relative; height:'+containerHeight+'px;'">
@@ -40,7 +40,7 @@
                 endDate: null,
                 detailId: this.$route.params.id,
                 detailName: this.$route.params.name,
-                radio:"人员",
+                radio:this.$t('ren-yuan'),
                 user: JSON.parse(sessionStorage.getItem("user")),
 
                 cost: 0,
@@ -64,11 +64,11 @@
             getList() {
                 this.listLoading = true;
                 var url = "";
-                if (this.radio=='人员') {
+                if (this.radio==this.$t('ren-yuan')) {
                     url = this.port.project.projectCost;
-                } else if (this.radio=='任务分组') {
+                } else if (this.radio==this.$t('other.taskGroup')) {
                     url = '/project/getCostByGroup';
-                } else if (this.radio=='子项目') {
+                } else if (this.radio==this.$t('lable.subproject')) {
                     url = '/sub-project/getTimeCost';
                 } else {
                     url = "/project/getCostInStage";
@@ -91,83 +91,19 @@
                     this.listLoading = false;
                     var _this = this;
                     if (res.code == "ok") {
-                        var xList = [],yList = [] , list = res.data.costList;
-                        this.cost = res.data.totalMoneyCost;
-                        for(var i in list) {
-                            if(this.radio == '任务分组'){
-                                xList.push(list[i].GroupName);
-                            }else{
-                                xList.push(list[i].name);
+                        if(this.user.userNameNeedTranslate == 1 && this.radio == this.$t('ren-yuan')) {
+                            let arr = []
+                            for(var i in res.data.costList) {
+                                let obj = {}
+                                obj.type = 'userName'
+                                obj.id = res.data.costList[i].name
+                                arr.push(obj)
                             }
-                            yList.push({
-                                "value": this.yAxisValue==0?list[i].costMoney:list[i].cost,
-                                "cost": list[i].cost,
-                                "money": list[i].costMoney,
-                            });
+                            this.dealWithTranslation(arr, res.data.costList, res.data.totalMoneyCost)
+                            // this.pullAway(res.data.costList, res.data.totalMoneyCost)
+                        } else {
+                            this.pullAway(res.data.costList, res.data.totalMoneyCost)
                         }
-
-                        var myChart = echarts.init(document.getElementById("container"));
-                        // 设置宽度
-                        myChart.resize({
-                            width: this.widthHtval
-                        })
-                        _this.myChart = myChart;
-                        var option = {
-                            // 工具箱
-                            toolbox: {
-                                show: true,
-                                feature:{
-                                    saveAsImage:{
-                                        show:true
-                                    },
-                                    restore:{
-                                        show:true
-                                    },
-                                    dataView:{
-                                        show:true
-                                    },
-                                    dataZoom:{
-                                        show:true
-                                    },
-                                    magicType:{
-                                        type:['line','bar']
-                                    }
-                                }
-                            },
-                            grid : {
-                                top : 80,    //距离容器上边界40像素
-                                bottom: 100,   //距离容器下边界30像素
-                                left: 150,
-                                right: 150
-                            },
-                            tooltip:{
-                                trigger:'axis',
-                                formatter: function (params,ticket,callback) {
-                                    var res = params[0].name + "<br/>工作成本"+" : " + params[0].data.money 
-                                    + "元 <br/>工作时长"+" : " + params[0].data.cost + "小时";
-                                    return res;
-                                }
-                            },
-                            xAxis: {
-                                data: xList,
-                                axisLabel: {
-                                    interval:0,rotate:20
-                                }
-                            },
-                            yAxis: [{
-                                type : 'value',
-                                axisLabel: {
-                                    formatter:this.yAxisValue==0?'{value} (元)':'{value}(小时)'
-                                }
-                            }],
-                            series: [{
-                                name: this.yAxisValue==0?'工作成本(元)':'工作时长(小时)',
-                                type: 'bar',
-                                barMaxWidth: 30,
-                                data: yList,
-                            }]
-                        };
-                        myChart.setOption(option,{notMerge: true});
                     } else {
                         this.$message({
                         message: res.msg,
@@ -182,6 +118,118 @@
                         type: "error"
                     });
                 });
+            },
+            dealWithTranslation(items, dataArr, cosess) {
+                if (WWOpenData.initCanvas) {
+                    WWOpenData.initCanvas()
+                }
+                const myFunOne = async () => {
+                    const result = await new Promise((resolve, reject) => {
+                        if(WWOpenData.prefetch) {
+                             WWOpenData.prefetch({ items }, (err, data) => {
+                                if (err) { return reject(err) }
+                                resolve(data)
+                            })
+                        }
+                       
+                    })
+                    for(var i in dataArr) {
+                        dataArr[i].name = result.items[i].data
+                    }
+                    this.pullAway(dataArr, cosess)
+                }
+                
+                myFunOne()
+            },
+            // 抽离出来的方法
+            pullAway(datalist, cosess) {
+                // var xList = [],yList = [] , list = res.data.costList;
+                var _this = this;
+                var xList = [],yList = [] , list = datalist;
+                // this.cost = res.data.totalMoneyCost;
+                this.cost = cosess;
+                for(var i in list) {
+                    if(this.radio == this.$t('other.taskGroup')){
+                        xList.push(list[i].GroupName);
+                    }else{
+                        xList.push(list[i].name);
+                    }
+                    yList.push({
+                        "value": this.yAxisValue==0?list[i].costMoney:list[i].cost,
+                        "cost": list[i].cost,
+                        "money": list[i].costMoney,
+                    });
+                }
+
+                var myChart = echarts.init(document.getElementById("container"));
+                // 设置宽度
+                myChart.resize({
+                    width: this.widthHtval
+                })
+                _this.myChart = myChart;
+                var option = {
+                    // 工具箱
+                    toolbox: {
+                        show: true,
+                        feature:{
+                            saveAsImage:{
+                                show:true
+                            },
+                            restore:{
+                                show:true
+                            },
+                            dataView:{
+                                show:true
+                            },
+                            dataZoom:{
+                                show:true
+                            },
+                            magicType:{
+                                type:['line','bar']
+                            }
+                        }
+                    },
+                    grid : {
+                        top : 80,    //距离容器上边界40像素
+                        bottom: 100,   //距离容器下边界30像素
+                        left: 150,
+                        right: 150
+                    },
+                    tooltip:{
+                        trigger:'axis',
+                        formatter: function (params,ticket,callback) {
+                            var res
+                            if(_this.user.userNameNeedTranslate == 1 && _this.radio == _this.$t('ren-yuan')) {
+                                res = '' + "<br/>"+_this.$t('workcost')+" : " + params[0].data.money 
+                                + _this.$t('yuan')+"<br/>"+_this.$t('screening.workTime')+" : " + params[0].data.cost + _this.$t('time.hour');
+                            } else {
+                                res = params[0].name + "<br/>"+_this.$t('workcost')+" : " + params[0].data.money 
+                                + _this.$t('yuan')+"<br/>"+_this.$t('screening.workTime')+" : " + params[0].data.cost + _this.$t('time.hour');
+                            }
+                            
+                            return res;
+                        }
+                    },
+                    xAxis: {
+                        data: xList,
+                        axisLabel: {
+                            interval:0,rotate:20
+                        }
+                    },
+                    yAxis: [{
+                        type : 'value',
+                        axisLabel: {
+                            formatter:this.yAxisValue==0?'{value} (元)':'{value}(小时)'
+                        }
+                    }],
+                    series: [{
+                        name: this.yAxisValue==0?_this.$t('workcost')+'('+_this.$t('yuan')+')':_this.$t('screening.workTime')+'('+_this.$t('time.hour')+')',
+                        type: 'bar',
+                        barMaxWidth: 30,
+                        data: yList,
+                    }]
+                };
+                myChart.setOption(option,{notMerge: true});
             },
              // 左右滚动
             scrollFunction () {

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

@@ -10,8 +10,11 @@
                 <el-form-item style="width: 500px">
                     <!-- <div class="dipali"> -->
                         <!-- <span class="workName">{{detailName}}</span> -->
-                        <el-cascader v-model="departmentId" placeholder="请选择部门" style="width: 180px;margin-left:10px;" @change="getList"
+
+                        <el-cascader v-if="user.userNameNeedTranslate != '1'" v-model="departmentId" placeholder="请选择部门" style="width: 180px;margin-left:10px;" @change="getList"
                         :options="option" :props="{ checkStrictly: true }" :show-all-levels="false"></el-cascader>
+
+                        <vueCascader v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :widthStr="'180'" :clearable="true" :subject="option" :radios="true" :distinction="'1'" @vueCasader="vueCasader" :selectNameChuan="$t('qing-xuan-ze-bu-men')"></vueCascader>
                     <!-- </div> -->
                 </el-form-item>
                 <el-form-item >
@@ -31,7 +34,13 @@
 <script>
     import util from "../../common/js/util";
 
+    // 引入自定义级联组件
+    import vueCascader from "@/components/cascader.vue"
+
     export default {
+        components: {
+            vueCascader
+        },
         data() {
             return {
                 yAxisValue: localStorage.yAxisValue,
@@ -297,6 +306,15 @@
                 event.preventDefault() // 阻止浏览器默认事件
                 this.domObj.scrollLeft = this.domObj.scrollLeft + step
             },
+            // 自定义事件
+            vueCasader(obj) {
+                if(obj.distinction == 1) {
+                    let arr = []
+                    arr.push(obj.id)
+                    this.departmentId = arr
+                    this.getList()
+                }
+            }
         },
         created() {
             let height = window.innerHeight;

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

@@ -762,6 +762,9 @@
         methods: {
             levelTextShow(lev){
                 if(this.user.timeType.projectLevelState == 1){
+                    if(this.levelList.filter(item => item.id == lev).length == 0){
+                        return this.levelTxt[lev]
+                    }
                     return this.levelList.filter(item => item.id == lev)[0].projectLevelName
                 }else{
                     return this.levelTxt[lev]

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

@@ -448,7 +448,18 @@
 
                         <div class="remind" ref="addRem" style="display: none">
                             <el-checkbox-group v-model="checkboxGrounp" v-for="item in users" :key="item.id">
-                                <p><el-checkbox :label="item.name" @change="kkk(item)"></el-checkbox></p>
+                                <p>
+                                    <el-checkbox :label="item.name" @change="kkk(item)">
+                                        <span>
+                                            <span v-if="user.userNameNeedTranslate != '1'">
+                                                {{item.name}}
+                                            </span>
+                                            <span v-if="user.userNameNeedTranslate == '1'">
+                                                <ww-open-data type='userName' :openid='item.name'></ww-open-data>
+                                            </span>
+                                        </span>
+                                    </el-checkbox>
+                                </p>
                             </el-checkbox-group>
                         </div>
                         <div class="ssp" @click="sss"></div>
@@ -634,7 +645,7 @@
                             <div>
                                 <span v-if="user.userNameNeedTranslate != 1">{{scope.row.creatorName}}</span>
                                 <span v-if="user.userNameNeedTranslate == 1">
-                                    <ww-open-data type='departmentName' :openid='scope.row.creatorName'></ww-open-data>
+                                    <ww-open-data type='userName' :openid='scope.row.creatorName'></ww-open-data>
                                 </span>
                             </div>
                         </template>

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

@@ -77,7 +77,7 @@
     </div>
 
     <gantt v-if="isDataLoaded" ref="ganttTable1" class="left-container" :tasks="tasks" 
-    :stafforpro="radio1" 
+    :stafforpro="radio1"
     :valueDate="valueDate"
     :key="updatakey1"></gantt>
 

+ 112 - 66
fhKeeper/formulahousekeeper/timesheet/src/views/project/summary.vue

@@ -417,73 +417,20 @@
                 }
                 this.http.post(url, {projectId: this.curProjectId},
                 res => {
-                    if (res.code == "ok") {
-                        var xList = [], yList = [], list = res.data;
-                        for(var i in list) {
-                            xList.push(list[i].executorName);
-                            yList.push({
-                                "value": _this.sumListRadio == this.$t('plantime') ? list[i].taskHours : list[i].taskCount,
-                                "id": list[i].executorId
-                            });
+                    if (res.code == "ok") { 
+                        if(this.user.userNameNeedTranslate != 1) {
+                            this.pulledOut(res.data)
+                        } else {
+                            let arrList = []
+                            let textList = [] // 是否有待认领的文字
+                            for(var i in res.data) {
+                                let obj = {}
+                                obj.type = res.data[i].type
+                                obj.id = res.data[i].executorName
+                                arrList.push(obj)
+                            }
+                            this.dealWithTranslation(arrList, res.data)
                         }
-                        var myChart = echarts.init(document.getElementById("executorPanel"));
-                        _this.executorChart = myChart;
-                        var option = {
-                            color: ["#409EFF","#71C671"],
-                            title: {
-                                show:list.length == 0,
-                                textStyle: {
-                                    color: "#666666",
-                                    fontSize: 18,
-                                    fontWeight: 'normal',
-                                 },
-                              text: list.length == 0?this.$t('nodata'):this.$t('zhi-hang-ren-fen-pei-tu'),
-                              left: "center",
-                              top: "center"
-                            },
-                            toolbox: {
-                                show: true,
-                                feature:{
-                                    saveAsImage:{
-                                        show:true
-                                    },
-                                    restore:{
-                                        show:true
-                                    },
-                                    magicType:{
-                                        type:['line','bar']
-                                    },
-                                }
-                            },
-                            tooltip:{
-                                trigger:'axis',
-                                formatter: function (params,ticket,callback) {
-                                    var res = params[0].name + ""+" : " + params[0].data.value 
-                                    + (_this.sumListRadio == this.$t('plantime') ? this.$t('time.hour') : this.$t('ge'));
-                                    _this.params = params;
-                                    return res;
-                                }
-                            },
-                            xAxis: {
-                                data: xList,
-                                axisLabel: {
-                                    interval:0,rotate:20
-                                }
-                            },
-                            yAxis: [{
-                                type : 'value',
-                                axisLabel: {
-                                    formatter:'{value} '
-                                }
-                            }],
-                            series: [{
-                                name: _this.sumListRadio == this.$t('plantime') ? this.$t('xiaoshijihua') : this.$t('rwushuliang'),
-                                type: 'bar',
-                                barMaxWidth: 30,
-                                data: yList,
-                            }]
-                        };
-                        myChart.setOption(option,{notMerge: true});
                     } else {
                         this.$message({
                             message: res.msg,
@@ -498,6 +445,105 @@
                     });
                 });
             },
+
+            dealWithTranslation(items, dataArr) {
+                console.log('过来的值')
+                console.log(items, dataArr)
+                if (WWOpenData.initCanvas) {
+                    WWOpenData.initCanvas()
+                }
+                const myFunOne = async () => {
+                    const result = await new Promise((resolve, reject) => {
+                        if(WWOpenData.prefetch) {
+                             WWOpenData.prefetch({ items }, (err, data) => {
+                                if (err) { return reject(err) }
+                                resolve(data)
+                            })
+                        }
+                       
+                    })
+                    console.log(result, '出来的值')
+                    for(let i in dataArr) {
+                        dataArr[i].executorName = result.items[i].data
+                    }
+                    console.log('将要传过去的值', dataArr)
+                    this.pulledOut(dataArr)
+                }
+                
+                myFunOne()
+            },
+            // 单独抽离出来
+            pulledOut(dataList) {
+                console.log(dataList, '过来的值')
+                // var xList = [], yList = [], list = res.data;
+                let _this = this;
+                var xList = [], yList = [], list = dataList;
+                for(var i in list) {
+                    xList.push(list[i].executorName);
+                    yList.push({
+                        "value": _this.sumListRadio == this.$t('plantime') ? list[i].taskHours : list[i].taskCount,
+                        "id": list[i].executorId
+                    });
+                }
+                var myChart = echarts.init(document.getElementById("executorPanel"));
+                _this.executorChart = myChart;
+                var option = {
+                    color: ["#409EFF","#71C671"],
+                    title: {
+                        show:list.length == 0,
+                        textStyle: {
+                            color: "#666666",
+                            fontSize: 18,
+                            fontWeight: 'normal',
+                         },
+                      text: list.length == 0?this.$t('nodata'):this.$t('zhi-hang-ren-fen-pei-tu'),
+                      left: "center",
+                      top: "center"
+                    },
+                    toolbox: {
+                        show: true,
+                        feature:{
+                            saveAsImage:{
+                                show:true
+                            },
+                            restore:{
+                                show:true
+                            },
+                            magicType:{
+                                type:['line','bar']
+                            },
+                        }
+                    },
+                    tooltip:{
+                        trigger:'axis',
+                        formatter: function (params,ticket,callback) {
+                            var res = params[0].name + ""+" : " + params[0].data.value 
+                            + (_this.sumListRadio == this.$t('plantime') ? this.$t('time.hour') : this.$t('ge'));
+                            _this.params = params;
+                            return res;
+                        }
+                    },
+                    xAxis: {
+                        data: xList,
+                        axisLabel: {
+                            interval:0,rotate:20
+                        }
+                    },
+                    yAxis: [{
+                        type : 'value',
+                        axisLabel: {
+                            formatter:'{value} '
+                        }
+                    }],
+                    series: [{
+                        name: _this.sumListRadio == this.$t('plantime') ? this.$t('xiaoshijihua') : this.$t('rwushuliang'),
+                        type: 'bar',
+                        barMaxWidth: 30,
+                        data: yList,
+                    }]
+                };
+                myChart.setOption(option,{notMerge: true});
+            },
             getProjectTaskSum() {
                 this.http.post('/project/taskSum', {
                     id: this.curProjectId

+ 12 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue

@@ -307,7 +307,18 @@
 
                         <div class="remind" ref="addRem" style="display: none">
                             <el-checkbox-group v-model="checkboxGrounp" v-for="item in users" :key="item.id">
-                                <p><el-checkbox :label="item.name" @change="kkk(item)"></el-checkbox></p>
+                                <p>
+                                    <el-checkbox :label="item.name" @change="kkk(item)">
+                                        <span>
+                                            <span v-if="user.userNameNeedTranslate != '1'">
+                                                {{item.name}}
+                                            </span>
+                                            <span v-if="user.userNameNeedTranslate == '1'">
+                                                <ww-open-data type='userName' :openid='item.name'></ww-open-data>
+                                            </span>
+                                        </span>
+                                    </el-checkbox>
+                                </p>
                             </el-checkbox-group>
                         </div>
                         <div class="ssp" @click="sss"></div>

+ 39 - 8
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -177,7 +177,9 @@
                                                                 <!-- 待项目审核人 --> {{$t('other.waitForTheProjectReviewer')}}
                                                                 <span v-if="item2.projectAuditorName != null">(
                                                                     <!-- {{item2.projectAuditorName}} -->
-                                                                    <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data></span>
+                                                                    <span v-if="user.userNameNeedTranslate == '1'">
+                                                                        <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                                    </span>
                                                                     <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
                                                                     )</span> 
                                                                 <!-- 审核 --> {{$t('other.audit')}}
@@ -186,7 +188,9 @@
                                                                 <!-- 项目审核人 --> {{$t('other.projectAuditor')}}
                                                                 <span v-if="item2.projectAuditorName != null">(
                                                                     <!-- {{item2.projectAuditorName}} -->
-                                                                    <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data></span>
+                                                                    <span v-if="user.userNameNeedTranslate == '1'">
+                                                                        <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                                    </span>
                                                                     <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
                                                                     )</span>
                                                                 <!-- 审核通过 --> {{$t('state.approved')}}
@@ -195,7 +199,10 @@
                                                         <span v-else-if="item2.isDeptAudit==1">
                                                             <!-- {{($t('other.await') +' '+ item2.auditDeptName +' '+ $t('other.audit'))}} -->
                                                             ({{$t('other.await')}}
-                                                            <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='item2.auditDeptName'></ww-open-data></span>
+                                                            <span v-if="user.userNameNeedTranslate == '1'">
+                                                                <ww-open-data type='departmentName' :openid='item2.auditDeptName'></ww-open-data>
+
+                                                            </span>
                                                             <span v-if="user.userNameNeedTranslate != '1'">{{item2.auditDeptName}}</span>
                                                             {{$t('other.audit')}})
                                                         </span>
@@ -213,7 +220,16 @@
                                                         <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == -1">[ {{$t('other.importWaitingForReview')}} ]</span>
                                                         <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == -1">[ {{$t('other.waitingForProfessionalReview')}} ]</span>
                                                         <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 0">[ {{$t('other.waitingForDepartmentReview')}} ]</span>
-                                                        <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 1">[ {{$t('other.waitForTheProjectReviewer')}}<span v-if="item2.projectAuditorName != null">({{item2.projectAuditorName}})</span>{{$t('other.audit')}} ]</span>
+                                                        <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 1">[ {{$t('other.waitForTheProjectReviewer')}}<span v-if="item2.projectAuditorName != null">
+                                                            (
+                                                                <span v-if="user.userNameNeedTranslate != 1">
+                                                                    {{item2.projectAuditorName}}
+                                                                </span>
+                                                                <span v-if="user.userNameNeedTranslate == 1">
+                                                                    <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                                </span>
+                                                            )
+                                                        </span>{{$t('other.audit')}} ]</span>
                                                         <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">[ {{$t('state.alreadyPassed')}} ]</span>
                                                         <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 2">[ {{$t('state.rejected')}} ] {{$t('other.reason')}}:{{item2.rejectReason}}</span>
                                                         <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">[ {{$t('state.waitingsubmit')}} ]</span>
@@ -447,7 +463,7 @@
                             </el-option>
                         </el-select>
 
-                        <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :subject="domain.auditUserList" :idx="index" :subjectId="domain.projectAuditorId" ref="selectCat" :flg="domain.projectAuditorId ? true : false" @selectCatCli="selectCatCli"></selectCat>
+                        <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :subject="domain.auditUserList" :idx="index" :subjectId="domain.projectAuditorId" ref="selectCat" :flg="domain.projectAuditorId ? true : false" :flgs="true" @selectCatCli="selectCatCli"></selectCat>
 
                     </el-form-item>
                     <!-- 111111 -->
@@ -592,7 +608,7 @@
                                 </el-option>
                             </el-select>
 
-                            <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'small'" :subject="domain.auditUserList" :idx="index" :subjectId="domain.projectAuditorId" ref="selectCat" :flg="true" @selectCatCli="selectCatCli"></selectCat>
+                            <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'small'" :subject="domain.auditUserList" :idx="index" :subjectId="domain.projectAuditorId" ref="selectCat" :flg="true" :flgs="true" @selectCatCli="selectCatCli"></selectCat>
                         </el-form-item>
                         
 
@@ -1030,12 +1046,26 @@
         
         <!-- 按部门选择人员 -->
         <el-dialog :title="$t('defaultText.selectthepersonwhneedstofillinthereport')"  v-if="chooseParticipVisible" :visible.sync="chooseParticipVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
-            <el-input style="width:100%" v-model="deptMembDataText" :placeholder="$t('defaultText.pleaseEnterNametoSearch')"></el-input>
+            <el-input v-if="user.userNameNeedTranslate != 1" style="width:100%" v-model="deptMembDataText" :placeholder="$t('defaultText.pleaseEnterNametoSearch')"></el-input>
             <div class="tree" style="height:400px">
                 <el-scrollbar style="height:100%">
                 <el-tree :data="deptMembData" show-checkbox :props="defaultProps" node-key="id"
                     ref="chooseMembTree" @check-change="onTreeItemChange" :default-checked-keys="workForm.userId"
-                    highlight-current :filter-node-method="filterNode"></el-tree>
+                    highlight-current :filter-node-method="filterNode">
+                    <span class="custom-tree-node" slot-scope="{ node, data }">
+                        <span v-if="user.userNameNeedTranslate == '1'">
+                            <span v-if="node.data.children">
+                                <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                            </span>
+                            <span v-else>
+                                <ww-open-data type='userName' :openid='node.label'></ww-open-data>
+                            </span>
+                        </span>
+                        <span v-if="user.userNameNeedTranslate != '1'">
+                            {{ node.label }}
+                        </span>
+                    </span>    
+                </el-tree>
                 </el-scrollbar>
             </div>
             <div>{{$t('btn.choose')}}&nbsp;{{chosenMembCount}}&nbsp;{{$t('other.people')}}</div>
@@ -5906,6 +5936,7 @@
             },
             // 触发 selectCat 组件更改他的值
             selectCatCli(obj) {
+                console.log(obj, '看看')
                 // obj.id 是 选中人员的id, obj.idx 是 当前的索引
                 this.workForm.domains[obj.idx].projectAuditorId = obj.id
             },

+ 8 - 0
fhKeeper/formulahousekeeper/timesheet_h5/src/router/index.js

@@ -82,6 +82,14 @@ const router = new Router({
         },
         component: () => import("@/views/project/projectInside")
     },
+    {
+        path: "/editask",
+        name: "editask",
+        meta: {
+            title: "编辑任务"
+        },
+        component: () => import("@/views/task/editask")
+    },
     {
         path: "/search", 
         meta: {

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

@@ -47,7 +47,7 @@
                     <van-swipe-cell v-for="(item,index) in list" :key="index">
                         <van-cell :border="false" :title="item.projectName" :value="item.projectCode"/>
                         <template slot="right" v-if="projectManagement || item.creatorId == user.id">
-                            <van-button square type="primary" text="查看" :to="{name:'projectInside',params:{project:JSON.stringify(item)}}"/>
+                            <van-button square type="primary" text="查看" @click="toProjectInside(item)"/>
                             <van-button square type="info" text="编辑" @click="openDialog(index)"/>
                             <van-button square type="danger" text="删除" @click="delPro(index)"/>
                         </template>
@@ -162,6 +162,10 @@
         created() {
         },
         methods: {
+            toProjectInside(item){
+                sessionStorage.setItem('projectId',JSON.stringify(item.id))
+                this.$router.push("/projectInside");
+            },
             popoverSelect(action){
                 if(this.popoverType == action.type){
                     return

+ 57 - 7
fhKeeper/formulahousekeeper/timesheet_h5/src/views/project/projectInside.vue

@@ -2,7 +2,7 @@
     <div>
         <van-nav-bar title="项目详情" left-text="返回" @click-left="back" fixed left-arrow />
         <div class="content">
-            <van-cell><div style="width:100%;text-align:center;font-size:120%">{{project.projectName}}</div></van-cell>
+            <van-cell><div style="width:100%;text-align:center;font-size:120%">{{projectDetail.projectName ? projectDetail.projectName : '-'}}</div></van-cell>
             <van-tabs v-model="active" @change="activeChange">
                 <!-- 任务看板 -->
                 <van-tab title="任务看板">
@@ -30,6 +30,9 @@
                             </template>
                         </van-picker>
                     </van-popup>
+                    <van-cell value-class="addtaskvalue">
+                        <van-button plain type="info" class="addtaskbutton" @click="toEditask(null)">新建任务</van-button>
+                    </van-cell>
                     <div class="taskList">
                         <van-cell v-for="item in inside.taskList" :key="item.id">
                             <div style="line-height:0.8rem">任务名称:{{item.name}}</div>
@@ -37,6 +40,9 @@
                                 <span v-if="item.startDate && item.endDate">{{(item.startDate ? item.startDate : ' - ') + '\u3000至\u3000' + (item.endDate ? item.endDate : ' - ')}}</span>
                                 <span v-else></span>
                             </div>
+                            <div class="task_button">
+                                <van-button size="small" type="info" @click="toEditask(item.id)">编辑</van-button>
+                            </div>
                         </van-cell>
                     </div>
                 </van-tab>
@@ -130,7 +136,7 @@
                     <van-cell>
                         <van-row>
                             <van-col span="7">合同编号:</van-col>
-                            <van-col span="17">{{projectDetail.projectSeparate.contractCode}}</van-col>
+                            <van-col span="17">{{projectDetail.projectSeparate.contractCode ? projectDetail.projectSeparate.contractCode : '-'}}</van-col>
                         </van-row>
                     </van-cell>
                     <van-cell>
@@ -221,8 +227,8 @@ export default {
     data() {
         return {
             user: JSON.parse(localStorage.userInfo),
-            project: JSON.parse(this.$route.params.project),
-            projectDetail: {},
+            projectId: JSON.parse(sessionStorage.projectId),
+            projectDetail: null,
             
             active: 0,
             inside:{    // 任务看板
@@ -247,6 +253,7 @@ export default {
     },
     mounted() {
         // console.log('project',this.project);
+        
         this.getProjectDetail()
         this.getLevelList()
         this.getTaskGroupList()
@@ -274,9 +281,34 @@ export default {
             this.inside.taskList = value.taskList
         },
 
+        // 新建/编辑任务
+        toEditask(taskid){
+            let item
+            if(taskid == null){
+                item = {
+                    addNew: true,
+                    id: null,
+                    groupId: this.inside.taskGroup.active.id,
+                    stagesId: this.inside.stages.active.id
+                }
+            }else{
+                item = {
+                    addNew: false,
+                    id: taskid,
+                    groupId: null,
+                    stagesId: null
+                }
+            }
+            sessionStorage.setItem('taskId',JSON.stringify(item))
+            this.$router.push("/editask");
+        },
+        
+        
+
+
         getTaskGroupList(){     // 任务分组列表
             this.$axios.post("/task-group/list", {
-                projectId:this.project.id
+                projectId:this.projectId
             }).then(res => {
                 if(res.code == "ok") {
                     this.inside.taskGroup.list = res.data
@@ -290,7 +322,7 @@ export default {
         getStagesList(){        // 任务列表
             this.$axios.post("/stages/list", {
                 groupId: this.inside.taskGroup.active.id,
-                projectId: this.project.id,
+                projectId: this.projectId,
                 order: 'seq',
                 isDesc: false
             }).then(res => {
@@ -306,7 +338,7 @@ export default {
 
         // 项目概览
         getProjectDetail(){
-            this.$axios.post("/project/detail", {id: this.project.id})
+            this.$axios.post("/project/detail", {id: this.projectId})
             .then(res => {
                 if(res.code == "ok") {
                     this.projectDetail = res.data
@@ -316,7 +348,11 @@ export default {
             }).catch(err=> {this.$toast.clear();console.log(err)});
         },
         levelToText(lev){
+            console.log('levelToText',lev,this.info.levelList,this.info.levelList.filter(item => item.id == lev));
             if(this.user.timeType.projectLevelState == 1){
+                if(this.info.levelList.filter(item => item.id == lev).length == 0){
+                    return this.info.levelText[lev]
+                }
                 return this.info.levelList.filter(item => item.id == lev)[0].projectLevelName
             }else{
                 return this.info.levelText[lev]
@@ -340,5 +376,19 @@ export default {
 .content{
     margin-top: 46px;
     overflow: auto;
+    .addtaskvalue{
+        text-align: center;
+        .addtaskbutton{
+            width: 70%;
+            height: 30px;
+        }
+    }
+    .task_button{
+        padding-top: .09rem;
+        text-align: right;
+        button{
+            margin-left: .2667rem;
+        }
+    }
 }
 </style>

+ 340 - 0
fhKeeper/formulahousekeeper/timesheet_h5/src/views/task/editask.vue

@@ -0,0 +1,340 @@
+<template>
+    <div>
+        <van-nav-bar :title="title" left-text="返回" @click-left="back" fixed left-arrow />
+        <div class="content">
+            <van-form>
+                <!-- 类型 -->
+                <van-field v-model="taskform.taskType" label="类型" @click="taskType.show = true" readonly clickable>
+                    <template #input><span>{{taskType.list[taskform.taskType]}}</span></template>
+                </van-field>
+                <van-popup v-model="taskType.show" position="bottom" v-if="canEdit">
+                    <van-picker
+                    show-toolbar
+                    :columns="taskType.list"
+                    @confirm="tasktypeChange"
+                    @cancel="taskType.show = false;$forceUpdate();"/>
+                </van-popup>
+                <!-- 任务内容 -->
+                <van-field v-model="taskform.name" label="任务内容" placeholder="请输入任务内容" :rules="[{ required: true, message: '请输入任务内容' }]" type="textarea" :disabled="!canEdit"></van-field>
+                <!-- 开始时间 -->
+                <van-field v-if="taskform.type != 1" v-model="taskform.startDate" label="开始时间" placeholder="请选择开始时间" @click="startDateShow = true" readonly clickable></van-field>
+                <van-popup v-model="startDateShow" position="bottom" v-if="canEdit">
+                    <van-datetime-picker
+                    type="date"
+                    title="选择开始时间"
+                    @confirm="startDateChange"
+                    @cancel="startDateShow = false;$forceUpdate();"
+                    :min-date="new Date(2010,0,1)"
+                    :max-date="taskform.endDate ? new Date(taskform.endDate) : new Date(2030,11,31)"/>
+                </van-popup>
+                <!-- 截止时间 -->
+                <van-field v-model="taskform.endDate" label="截止时间" placeholder="请选择截止时间" @click="endDateShow = true" readonly clickable></van-field>
+                <van-popup v-model="endDateShow" position="bottom" v-if="canEdit">
+                    <van-datetime-picker
+                    type="date"
+                    title="选择截止时间"
+                    @confirm="endDateChange"
+                    @cancel="endDateShow = false;$forceUpdate();"
+                    :min-date="taskform.startDate ? new Date(taskform.startDate) : new Date(2010,0,1)"
+                    :max-date="new Date(2030,11,31)"/>
+                </van-popup>
+                <!-- 完成时间 -->
+                <van-field v-if="taskform.type == 1" v-model="taskform.finishDate" label="完成时间" placeholder="请选择完成时间" @click="finishDateShow = true" readonly clickable></van-field>
+                <van-popup v-model="finishDateShow" position="bottom" v-if="canEdit">
+                    <van-datetime-picker
+                    type="date"
+                    title="选择完成时间"
+                    @confirm="finishDateChange"
+                    @cancel="finishDateShow = false;$forceUpdate();"
+                    :min-date="new Date(2010,0,1)"
+                    :max-date="new Date(2030,11,31)"/>
+                </van-popup>
+                <!-- 执行人 -->
+                <div style="border: 0.5px solid #87c3ff;margin:0.2rem;position:relative" v-for="item,index in taskform.executorList" :key="index">
+                    <van-field v-model="item.executorName" :label="'执行人' + (index + 1)" placeholder="请选择执行人" @click="executorChange(item,index)" readonly clickable></van-field>
+                    <van-field label="计划工时">
+                        <template #input>
+                            <van-stepper v-model="item.planHours" :disabled="!canEdit"/><span>{{'\u3000h'}}</span>
+                        </template>
+                    </van-field>
+                    <van-icon v-if="index != 0" class="delete_executor" name="delete-o" @click.stop="deleteExecutor(index)" />
+                </div>
+                <van-popup v-model="executor.show" position="bottom" v-if="canEdit">
+                    <van-search v-model="executor.searchText" placeholder="输入员工姓名搜索" @search="onSearch" v-if="user.userNameNeedTranslate != '1'"></van-search>
+                    <div style="minHeight:300px;">
+                        <van-radio-group v-model="executor.item">
+                            <van-radio v-for="uitem in executor.searchList" :key="uitem.id" :name="uitem" style="padding:10px">
+                                <span>{{uitem.name}}</span>
+                            </van-radio>
+                        </van-radio-group>
+                    <van-button style="width:100%;position: -webkit-sticky;position: sticky;bottom: 0;" @click="searchExecutor()">确定</van-button>
+                    </div>
+                </van-popup>
+                <!-- 添加执行人 -->
+                <div class="add_executor" @click="addExecutor" v-if="canEdit">添加执行人</div>
+                <!-- 优先级 -->
+                <van-field v-model="taskform.taskLevel" label="优先级" @click="taskLevel.show = true" readonly clickable>
+                    <template #input><span>{{taskLevel.list[taskform.taskLevel]}}</span></template>
+                </van-field>
+                <van-popup v-model="taskLevel.show" position="bottom" v-if="canEdit">
+                    <van-picker
+                    show-toolbar
+                    :columns="taskLevel.list"
+                    @confirm="taskLevelChange"
+                    @cancel="taskLevel.show = false;$forceUpdate();"/>
+                </van-popup>
+
+            </van-form>
+            <div class="form_btn" style="position:fixed; bottom:0px;width:100%;">
+                <div style="padding-bottom:10px;">
+                    <van-button square block type="info" @click="submitTask" native-type="submit" style="width:100%;float:left;" :disabled="!canEdit">
+                        <div v-if="canEdit">保存</div>
+                        <div v-else>暂无权限编辑</div>
+                    </van-button>
+                </div>
+            </div>
+                    
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            title: '编辑任务',
+            user: JSON.parse(localStorage.userInfo),
+            taskId: JSON.parse(sessionStorage.taskId),
+            canEdit: true,
+            taskform:{      // 表单
+                taskType: 0,
+                name: '',
+                startDate: null,
+                endDate: null,
+                finishDate: null,
+                taskLevel: 0,
+                executorList: [{executorName: '',executorId: '',planHours: 8}],
+
+            },
+            taskType:{
+                show: false,
+                list: ['任务','里程碑','风险']
+            },
+            startDateShow: false,
+            endDateShow: false,
+            finishDateShow: false,
+            taskLevel:{
+                show: false,
+                list: ['一般','重要','紧急']
+            },
+            executor:{
+                show: false,
+                item: {id:null,name:''},
+                index: 0,
+                list: [],
+                searchList: [],
+                searchText: ''
+            }
+
+        }
+    },
+    mounted() {
+        if(!this.taskId.addNew){
+            this.title = '编辑任务'
+            this.getTask()
+        }else{
+            this.title = '新建任务'
+            this.taskform = {
+                projectId: JSON.parse(sessionStorage.projectId),
+                groupId: this.taskId.groupId,
+                stagesId: this.taskId.stagesId,
+                taskType: 0,
+                name: '',
+                startDate: null,
+                endDate: null,
+                finishDate: null,
+                taskLevel: 0,
+                executorList: [{executorName: '',executorId: '',planHours: this.user.timeType.allday}]
+            }
+        }
+        this.getUsersList()
+        console.log('mounted',this.taskId,null);
+    },
+    methods: {
+        back() {
+            history.back();
+        },
+        formatDate(date) {
+            let mon = date.getMonth() + 1
+            return `${date.getFullYear()}-${mon<10?'0'+mon:mon}-${date.getDate()<10?'0'+date.getDate():date.getDate()}`;
+        },
+
+
+        tasktypeChange(value,key){      // 类型
+            this.taskform.taskType = key
+            this.taskType.show = false
+        },
+        startDateChange(date){          // 开始时间
+            this.taskform.startDate = this.formatDate(date)
+            this.startDateShow = false
+        },
+        endDateChange(date){            // 截止时间
+            this.taskform.endDate = this.formatDate(date)
+            this.endDateShow = false
+        },
+        finishDateChange(date){         // 完成时间
+            this.taskform.finishDate = this.formatDate(date)
+            this.finishDateShow = false
+        },
+        
+        executorChange(item,index){           // 选择执行人
+            this.executor.show = true
+            this.executor.index = index
+            this.executor.searchList.forEach(u=>{if (u.id == item.executorId) {
+                this.executor.item = u
+            }})
+        },
+        deleteExecutor(index){
+            console.log('deleteExecutor');
+            this.taskform.executorList.splice(index,1)
+            this.$forceUpdate();
+        },
+        addExecutor(){
+            console.log('addExecutor');
+            this.taskform.executorList.push({
+                executorName: '',
+                executorId: '',
+                planHours: this.user.timeType.allday
+            })
+            this.$forceUpdate();
+        },
+        onSearch(val) {
+            console.log(val);
+            this.executor.searchList = [];
+            this.executor.list.forEach(u=>{if (u.name.startsWith(val)) {
+                this.executor.searchList.push(u);
+            }})
+        },
+        searchExecutor(){
+            this.taskform.executorList[this.executor.index].executorId = this.executor.item.id
+            this.taskform.executorList[this.executor.index].executorName = this.executor.item.name
+            this.executor.show = false
+            console.log('searchExecutor',this.executor.item,this.executor.item.name);
+        },
+
+        taskLevelChange(value,key){     // 优先级
+            this.taskform.taskLevel = key
+            this.taskLevel.show = false
+        },
+
+        submitTask(){
+            console.log('submitTask');
+            
+            // 执行人查重
+            let arr = this.taskform.executorList
+            let json={};
+            for(let i in arr){
+                if(!json[arr[i].executorId]){
+                    json[arr[i].executorId]=1;
+                }else{
+                    this.$toast.fail("执行人存在重复");
+                    return
+                }
+            }
+
+            // 去除未选择执行人的执行人列表
+            this.taskform.executorList = this.taskform.executorList.filter(item => item.executorId)
+            this.taskform.executorListStr = JSON.stringify(this.taskform.executorList)
+            
+            delete this.taskform.executorList
+            delete this.taskform.subTaskList;
+            delete this.taskform.refTaskList;
+            delete this.taskform.progress;
+            this.$axios.post("/task/save", this.taskform)
+            .then(res => {
+                if(res.code == "ok") {
+                    this.$toast.success('保存成功');
+                    this.back()
+                } else {
+                    this.$toast.fail('保存失败');
+                }
+            }).catch(err=> {this.$toast.clear();console.log(err)});
+
+        },
+
+        getTask(){
+            this.$axios.post("/task/getTask", {
+                id: this.taskId.id
+            }).then(res => {
+                if(res.code == "ok") {
+                    this.taskform = res.data
+                    this.taskform.createDate = null;
+                    this.taskform.indate = null;
+                    let projectManagement = false
+
+                    // 判断编辑权限
+                    for(let i in this.user.functionList){
+                        if(this.user.functionList[i].name == '查看全部项目'){
+                            projectManagement = true
+                        }
+                    }
+                    if(this.user.id == res.data.createrId || this.user.id == res.data.projectInchargerId || this.user.id == res.data.groupInchargerId || projectManagement || this.title == '新建任务'){
+                        this.canEdit = true
+                    }else{
+                        this.canEdit = false
+                    }
+
+
+                    // (
+                    //     (
+                    //         (addForm.executorListFront == null || addForm.executorListFront.length<10) 
+                    //         && (
+                    //             addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id || permissions.projectManagement
+                    //         )
+                    //     ) 
+                    //     || groupResponsibleId == user.id
+                    // )
+
+
+
+                    // this.canEdit = false
+                } else {
+                    this.$toast.fail('获取失败');
+                }
+            }).catch(err=> {this.$toast.clear();console.log(err)});
+        },
+        getUsersList(){
+            this.$axios.post("/user/getSimpleActiveUserList", {})
+            .then(res => {
+                if(res.code == "ok") {
+                    this.executor.list = res.data
+                    this.executor.searchList = res.data
+                } else {
+                    this.$toast.fail('获取失败');
+                }
+            }).catch(err=> {this.$toast.clear();console.log(err)});
+        }
+    },
+}
+</script>
+
+<style lang="less" scoped>
+.content{
+    margin-top: 46px;
+    overflow: auto;
+    .add_executor{
+        font-size:13px;
+        color:#1989fa;
+        padding-left:0.42667rem;
+        padding-bottom:.2rem;
+        width:100px
+    }
+    .delete_executor{
+        position: absolute;
+        top: 3px;
+        right: 3px;
+        font-size: 22px;
+        color: #c03131;
+    }
+}
+</style>

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

@@ -49,7 +49,7 @@
                 <van-icon v-if="select_date.length != 0" name="close" style="line-height:0.64rem;position:relative;left:5px;" @click.stop="dateClear"/>
             </template>
         </van-cell>
-        <van-calendar v-model="select_date_show" type="range" @confirm="dateChange" />
+        <van-calendar v-model="select_date_show" type="range" @confirm="dateChange" :min-date="new Date(2010,0,1)" :max-date="new Date(2030,11,31)" />
     </van-sticky>
 
         <div class="taskList" v-if="taskList.length != 0">
@@ -60,6 +60,12 @@
                     <span v-if="item.startDate && item.endDate">{{(item.startDate ? item.startDate : ' - ') + '\u3000至\u3000' + (item.endDate ? item.endDate : ' - ')}}</span>
                     <span v-else></span>
                 </div>
+                <div class="task_button">
+                    <van-button size="small" type="info" @click="toEditask(item.id)">编辑</van-button>
+                    <van-button size="small" type="primary" @click="taskStatus(item.id,0)" v-if="select_state == '进行中'">完成</van-button>
+                    <van-button size="small" color="#e6a23c" @click="taskStatus(item.id,1)" v-else>重启</van-button>
+
+                </div>
             </van-cell>
         </div>
         <div v-else style="text-align:center;font-size:16px;font-weight:500;color:#999;width:100%;margin-top:16px">暂无数据</div>
@@ -99,6 +105,28 @@ export default {
         back() {
             history.back();
         },
+        toEditask(taskid){    // 跳转编辑任务
+            sessionStorage.setItem('taskId',JSON.stringify({
+                addNew: false,
+                id: taskid,
+                groupId: null,
+                stagesId: null
+            }))
+            this.$router.push("/editask");
+        },
+        taskStatus(taskid,status){          // 改变任务状态
+            this.$axios.post("/task/finish", {
+                id: taskid,
+                taskStatus: status
+            }).then(res => {
+                if(res.code == "ok") {
+                    this.$toast.success('操作成功');
+                    this.getList()
+                } else {
+                    this.$toast.fail('获取失败');
+                }
+            }).catch(err=> {this.$toast.clear();console.log(err)});
+        },
         formatDate(date) {
             let mon = date.getMonth() + 1
             return `${date.getFullYear()}-${mon<10?'0'+mon:mon}-${date.getDate()<10?'0'+date.getDate():date.getDate()}`;
@@ -173,6 +201,13 @@ export default {
 .content{
     margin-top: 46px;
     // overflow: auto;
+    .task_button{
+        padding-top: .09rem;
+        text-align: right;
+        button{
+            margin-left: .2667rem;
+        }
+    }
 }
 // .dateSelectCell{
 //     height: 1.2rem;