Browse Source

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

cs 2 years ago
parent
commit
836a58c05a
17 changed files with 291 additions and 242 deletions
  1. 14 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java
  2. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  3. 23 101
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  4. 5 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  5. 49 3
      fhKeeper/formulahousekeeper/timesheet/src/components/select.vue
  6. 6 1
      fhKeeper/formulahousekeeper/timesheet/src/day.js
  7. 3 0
      fhKeeper/formulahousekeeper/timesheet/src/http.js
  8. 18 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json
  9. 18 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  10. 20 0
      fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue
  11. 3 5
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  12. 0 4
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  13. 81 103
      fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue
  14. 12 12
      fhKeeper/formulahousekeeper/timesheet/src/views/project/summary.vue
  15. 7 2
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  16. 27 2
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  17. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

+ 14 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java

@@ -311,17 +311,26 @@ public class UserCorpwxTimeController {
     @RequestMapping("/getPunchRecordBySelf")
     public HttpRespMsg getUserPunchRecord(String date){
         HttpRespMsg msg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        Map<String,Object> resultMap =new HashMap<>();
+        List<UserCorpwxTime> oldCorpwxTimes = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>()
+                .eq("corpwx_userid", user.getCorpwxUserid()).eq("create_date", date));
         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         LocalDate localDate = LocalDate.parse(date, df);
+        if(!localDate.isEqual(LocalDate.now())&&oldCorpwxTimes.size()>0){
+            UserCorpwxTime time = oldCorpwxTimes.get(0);
+            resultMap.put("time", time);
+            msg.data=resultMap;
+            return msg;
+        }
         LocalDateTime start = LocalDateTime.of(localDate, LocalTime.MIN);
         LocalDateTime end = LocalDateTime.of(localDate, LocalTime.MAX).withSecond(0).withNano(0);
-        User user = userMapper.selectById(request.getHeader("token"));
         wxCorpInfoService.getUserPunchRecord(user.getCompanyId(),user.getId(),start,end,false);
-        Map<String,Object> resultMap =new HashMap<>();
-        List<UserCorpwxTime> corpwxTimes = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>()
+        List<UserCorpwxTime> chengedCorpwxTimes = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>()
                 .eq("corpwx_userid", user.getCorpwxUserid()).eq("create_date", date));
-        if (corpwxTimes.size() > 0) {
-            UserCorpwxTime time = corpwxTimes.get(0);
+
+        if (chengedCorpwxTimes.size() > 0) {
+            UserCorpwxTime time = chengedCorpwxTimes.get(0);
             resultMap.put("time", time);
         }
         msg.data=resultMap;

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

@@ -174,6 +174,10 @@ public class WeiXinCorpController {
         try {
             User user = userMapper.selectById(token);
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            if (wxCorpInfo == null) {
+                msg.setError("获取企业配置失败:非企业微信用户");
+                return msg;
+            }
             Item item = corpTicketMap.get(wxCorpInfo.getCorpid());
             if (item == null || item.expireTime.isBefore(LocalDateTime.now())) {
                 //重新获取

+ 23 - 101
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -5236,7 +5236,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     public HttpRespMsg getTimeCostByCategory(String startDate, String endDate, String userId, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
-            //根据系统配置的员工成本计算方式,按固定时薪还是固定月薪,分情况计算。
             User targetUser = userMapper.selectById(request.getHeader("Token"));
             Integer companyId =targetUser.getCompanyId();
             Map<String, Object> resultMap = new HashMap<>();
@@ -5266,110 +5265,33 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
             }
             TimeType timeType = timeTypeMapper.selectById(companyId);
-            if (timeType.getFixMonthcost() == 1) {
-                //每月固定月薪的方式计算,平摊到各个项目中
-                List<Map<String, Object>> list = projectMapper.getTimeCostReport(companyId, startDate+"-01", endDate+"-31", null,deptIds);
-                //检查财务表中是否已经导入成本
-                List<Finance> financeList = financeMapper.selectList(new QueryWrapper<Finance>().eq("ymonth", startDate).eq("company_id", companyId));
-                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
-                //计算人员总工时
-                for (Map<String, Object> map : list) {
-                    String creatorId = (String)map.get("creatorId");
-                    double cost = (double)map.get("cost");
-                    User user = userList.stream().filter(u -> u.getId().equals(creatorId)).findFirst().get();
-                    user.setTotalHours(user.getTotalHours() + cost);
-                }
-                //计算实际时薪
-                for (User user : userList) {
-                    if (user.getTotalHours() != 0) {
-                        Optional<Finance> first = financeList.stream().filter(f -> f.getUserId().equals(user.getId())).findFirst();
-                        BigDecimal monthCost = null;
-                        if (first.isPresent()) {
-                            monthCost = first.get().getTotalCost();
-                        } else {
-                            monthCost = user.getMonthCost();
-                        }
-                        user.setCost(monthCost.divide(new BigDecimal(user.getTotalHours()), 6, BigDecimal.ROUND_HALF_UP));
-                    } else {
-                        user.setCost(new BigDecimal(0));
-                    }
-                }
-
-                BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
-                List<Map<String, Object>> retList = new ArrayList<>();
-                List<ProjectCategory> projectCategoryList = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>().eq("company_id", companyId).orderByAsc("id"));
-                for (ProjectCategory pc : projectCategoryList) {
-                    Map<String, Object> projectCategoryMap = new HashMap<>();
-                    projectCategoryMap.put("id", pc.getId());
-                    projectCategoryMap.put("name", pc.getName());
-                    //按照项目分类汇总
-                    double pTotalTime = 0;
-                    BigDecimal pTotalMoney = new BigDecimal(0);
-                    for (Map<String, Object> map : list) {
-                        String creatorId = (String)map.get("creatorId");
-                        String projectCategoryName =StringUtils.isEmpty( (String) map.get("categoryName"))?MessageUtils.message("excel.unclassified"): (String) map.get("categoryName");
-                        if (projectCategoryName.equals(pc.getName())) {
-                            double costTime = (double)map.get("cost");
-                            pTotalTime += costTime;
-                            User curUser = userList.stream().filter(u->u.getId().equals(creatorId)).findFirst().get();
-                            //该人员的成本
-                            pTotalMoney = pTotalMoney.add(curUser.getCost().multiply(new BigDecimal(costTime)));
-                        }
-                    }
-                    if (pTotalTime > 0) {
-                        projectCategoryMap.put("cost", pTotalTime);
-                        projectCategoryMap.put("costMoney", pTotalMoney);
-                        retList.add(projectCategoryMap);
-                        totalMoneyCost = totalMoneyCost.add(pTotalMoney);
-                    }
-                }
-
-                resultMap.put("costList", retList);
-                resultMap.put("totalMoneyCost", totalMoneyCost);
-                if(functionCostList.size()==0){
-                    resultMap.put("totalCostMoney",new BigDecimal(0));
-                    retList.forEach(li->{
-                        li.put("costMoney",new BigDecimal(0));
-                    });
-                }
-                if(functionTimeList.size()==0){
-                    retList.forEach(li->{
-                        li.put("cost",0.0);
-                    });
-                }
-                httpRespMsg.data = resultMap;
-
-            } else {
-                List<Map<String, Object>> list = projectMapper.getTimeCostByCategory(companyId, startDate, endDate, null, userId,deptIds);
-                BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
-                for (Map<String, Object> map : list) {
-                    if (!map.containsKey("cost")) {
-                        map.put("cost", 0);
-                    }
-                    if (!map.containsKey("costMoney")) {
-                        map.put("costMoney", 0);
-                    } else {
-                        totalMoneyCost = totalMoneyCost.add((BigDecimal)map.get("costMoney"));
-                    }
-                }
-
-                resultMap.put("costList", list);
-                resultMap.put("totalMoneyCost", totalMoneyCost);
-                if(functionCostList.size()==0){
-                    resultMap.put("totalCostMoney",new BigDecimal(0));
-                    list.forEach(li->{
-                        li.put("costMoney",new BigDecimal(0));
-                    });
+            List<Map<String, Object>> list = projectMapper.getTimeCostByCategory(companyId, startDate, endDate, null, userId,deptIds);
+            BigDecimal totalMoneyCost = BigDecimal.valueOf(0);
+            for (Map<String, Object> map : list) {
+                if (!map.containsKey("cost")) {
+                    map.put("cost", 0);
                 }
-                if(functionTimeList.size()==0){
-                    list.forEach(li->{
-                        li.put("cost",0.0);
-                    });
+                if (!map.containsKey("costMoney")) {
+                    map.put("costMoney", 0);
+                } else {
+                    totalMoneyCost = totalMoneyCost.add((BigDecimal)map.get("costMoney"));
                 }
-                httpRespMsg.data = resultMap;
             }
 
-
+            resultMap.put("costList", list);
+            resultMap.put("totalMoneyCost", totalMoneyCost);
+            if(functionCostList.size()==0){
+                resultMap.put("totalCostMoney",new BigDecimal(0));
+                list.forEach(li->{
+                    li.put("costMoney",new BigDecimal(0));
+                });
+            }
+            if(functionTimeList.size()==0){
+                list.forEach(li->{
+                    li.put("cost",0.0);
+                });
+            }
+            httpRespMsg.data = resultMap;
         } catch (NullPointerException e) {
             //httpRespMsg.setError("验证失败");
             httpRespMsg.setError(MessageUtils.message("access.verificationError"));

+ 5 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -544,9 +544,9 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                         if (jsonObject.get("userid").equals(objects[i])) {
                             //todo: 获取最早上班打卡时间以及最晚下班打卡时间
                             Integer time = (Integer) jsonObject.get("checkin_time");
-                            if (jsonObject.get("checkin_type").equals("上班打卡")) {
+                            if (jsonObject.get("checkin_type").equals("上班打卡")&&!jsonObject.get("exception_type").equals("未打卡")) {
                                 upList.add(time);
-                            } else if(jsonObject.get("checkin_type").equals("下班打卡")) downList.add(time);
+                            } else if(jsonObject.get("checkin_type").equals("下班打卡")&&!jsonObject.get("exception_type").equals("未打卡")) downList.add(time);
                         }
                     }
                     double restTime = 0.0;//小时为单位
@@ -1000,8 +1000,11 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                     if (betweenNonWorkDays.size() > 0) {
                                         //跨天请假中含有非工作日的情况,要减去非工作日来重新计算实际工作日的每天请假时长。
                                         seconds = wxDuration * betweenTotalDays/(betweenTotalDays - betweenNonWorkDays.size());
+                                    } else {
+                                        seconds = wxDuration;
                                     }
                                     double curLeaveTime = convertDayTimeToHours(DateTimeUtil.getHoursFromSeconds(seconds));
+                                    System.out.println("j="+j+", curLeaveTime="+curLeaveTime);
                                     ct.setAskLeaveTime(leaveTime + curLeaveTime);
                                     break;
                                 case 2://补卡

+ 49 - 3
fhKeeper/formulahousekeeper/timesheet/src/components/select.vue

@@ -12,7 +12,7 @@
                     <span v-if="!tile">
                         <span class="all">
                             <ww-open-data type='userName' :openid='multiSelectList[0].name'></ww-open-data>
-                            <!-- {{multiSelectList[0].name}} -->
+                            {{multiSelectList[0].name}}
                             <i class="el-icon-error" v-if="!disabled" @click.stop="deleteMultiSelectList('-1')"></i>
                         </span>
                         <span class="all" v-if="multiSelectList.length > 1"> + {{multiSelectList.length - 1}}</span>
@@ -34,7 +34,13 @@
     </div>
     <transition name="el-zoom-in-top">
       <div v-show="show" style="position: relative;z-index: 99;"> 
-        <div class="transitionBox">
+        <!-- 搜索框 -->
+        <div class="searchBox">
+            <el-input :placeholder="$t('peaseenterthe')" size="mini" v-model="searchTex" style="width: 150px" @focus="searchBox()">
+                <el-button slot="append" icon="el-icon-search" size="mini" @click="searchLick()"></el-button>
+            </el-input>
+        </div>
+        <div class="transitionBox" :style="filterable ? 'margin: 30px 0;' : ''">
             <ul class="transitionBoxUl">
                 <li :class="transitionBoxLiIdx == index ? 'liHover' : ''" v-for="(item, index) in options" :key="index" @mouseover="liMouseOver(index)" @click="liClick(item, index)"> 
                     <span v-if="!multiSelect">
@@ -155,7 +161,9 @@ export default {
             dailyListIndex: null, // 日报点的索引
             move: false,
             moveIon: false,
-            multiSelectList: []
+            multiSelectList: [],
+            searchTex: '', // 搜索文字
+            cursor: '', // 搜索的标记(需传给后端)
         };
     },
     computed: {},
@@ -263,6 +271,7 @@ export default {
                 this.classDiv = !this.classDiv
                 this.show = !this.show
                 this.move = !this.move
+                this.searchTex = ''
             }
         },
         selectClihide() {
@@ -388,6 +397,39 @@ export default {
                 name: this.selectName
             }
             this.$emit("selectCal", obj)
+        },
+        searchBox() {
+            this.selectCli()
+        },
+        // 搜索
+        searchLick() {
+            console.log('文字')
+            this.getSimpleActiveUserList()
+        },
+        // 针对  getSimpleActiveUserList 获取所有人员接口
+        getSimpleActiveUserList() {
+            this.http.post('/user/getSimpleActiveUserList', {
+                keyword: this.searchTex,
+                cursor: this.cursor
+            },
+            res => {
+                if (res.code == "ok") {
+                    console.log('数据')
+                    this.options = res.data.retUser
+                    this.cursor = res.data.nextCursor
+                } else {
+                    this.$message({
+                        message: res.msg,
+                        type: "error"
+                    });
+                }
+            },
+            error => {
+                this.$message({
+                    message: error,
+                    type: "error"
+                });
+            });
         }
     },
     triggerOption(){
@@ -452,6 +494,10 @@ export default {
     .iostuHover {
         transform: rotate(-180deg);
     }
+    .searchBox {
+        position: absolute; 
+        width: 100%;
+    }
     .transitionBox {
         background: #FFF;
         position: absolute; 

+ 6 - 1
fhKeeper/formulahousekeeper/timesheet/src/day.js

@@ -9,7 +9,12 @@ import relativeTime from 'dayjs/plugin/relativeTime'
 dayjs.extend(relativeTime)
 
 // 配置使用中文语言包
-dayjs.locale('zh-cn')
+if(localStorage.getItem('lang') == 'zh') {
+  dayjs.locale('zh-cn')
+} else {
+  dayjs.locale('en')
+}
+
 
 console.log(dayjs().format('YYYY-MM-DD'));
 

+ 3 - 0
fhKeeper/formulahousekeeper/timesheet/src/http.js

@@ -57,6 +57,9 @@ export default {
             token = JSON.parse(user).id
             // data.token = token
         }
+        if(localStorage.getItem('lang') == 'en') {
+            data.lang = 'english'
+        }
         axios({
             method: 'post',
             url: handleUrl(url),

+ 18 - 1
fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json

@@ -1423,5 +1423,22 @@
   "shen-pi-ceng-ji-she-zhi": "Approval level Setting",
   "onelayer": "1 layer",
   "threelayer": "3 layer",
-  "twolayer": "2 layer"
+  "twolayer": "2 layer",
+  "an-ren-yuan-cha-kan": "According to personnel needs",
+  "an-xiang-mu-cha-kan": "View by project",
+  "zi-yuan-xu-qiu": "resource requirements",
+  "zi-yuan-xu-qiu-dao-ru-mo-ban": "Import a template for resource requirements",
+  "dao-ru-xu-qiu": "Import demand",
+  "dao-chu-xu-qiu": "Export demand",
+  "jin-qi-ri-huo-yue-ren-yuan": "Active staff for seven days",
+  "he-tong-yao-qiu": "contract requirements",
+  "li-cheng-bei-jin-du": "Milestone progress",
+  "ren-yuan-xu-qiu": "Personnel requirements",
+  "ren-wu-xu-qiu": "Mission requirements",
+  "can-yu-bu-men-jin-du": "Participate in department progress",
+  "bu-men-jin-du": "Department of progress",
+  "chu-cha": "evection",
+  "xuan-xiang-1": "Option 1",
+  "xuan-xiang-2": "Option 2",
+  "zi-yuan-xu-qiu-dao-chu": "Exporting Resource Requirements"
 }

+ 18 - 1
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -1423,5 +1423,22 @@
   "shen-pi-ceng-ji-she-zhi": "审批层级设置",
   "onelayer": "1层",
   "twolayer": "2层",
-  "threelayer": "3层"
+  "threelayer": "3层",
+  "an-ren-yuan-cha-kan": "按人员查看",
+  "an-xiang-mu-cha-kan": "按项目查看",
+  "zi-yuan-xu-qiu": "资源需求",
+  "zi-yuan-xu-qiu-dao-ru-mo-ban": "资源需求导入模板",
+  "dao-ru-xu-qiu": "导入需求",
+  "dao-chu-xu-qiu": "导出需求",
+  "jin-qi-ri-huo-yue-ren-yuan": "近七日活跃人员",
+  "he-tong-yao-qiu": "合同要求",
+  "li-cheng-bei-jin-du": "里程碑进度",
+  "ren-yuan-xu-qiu": "人员需求",
+  "ren-wu-xu-qiu": "任务需求",
+  "can-yu-bu-men-jin-du": "参与部门进度",
+  "bu-men-jin-du": "部门进度",
+  "xuan-xiang-1": "选项1",
+  "xuan-xiang-2": "选项2",
+  "zi-yuan-xu-qiu-dao-chu": "资源需求导出",
+  "chu-cha": "出差"
 }

+ 20 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue

@@ -49,6 +49,7 @@
     import * as dd from 'dingtalk-jsapi';
     import "../permissions.js"
     export default {
+        inject:['reloads'],
         data() {
             return {
                 isCorpWX: false,
@@ -66,6 +67,7 @@
             };
         },
         created() {
+            this.langChange()
             if (localStorage.userInfo != null) {
                 var user = JSON.parse(localStorage.userInfo);
                 if(user.moduleList.length > 0) {
@@ -141,6 +143,24 @@
             }
         },
         methods: {
+            langChange() {
+                let jsSrc =(navigator.language || navigator.browserLanguage).toLowerCase();
+                let str =  localStorage.getItem("lang")
+                if(jsSrc.indexOf('zh')!=-1){
+                    // 浏览器语言是中文
+                    localStorage.setItem("lang", 'zh')
+                    // localStorage.setItem("lang", 'en')
+                } else {
+                    // 浏览器语言是英文
+                    localStorage.setItem("lang", 'en')
+                    // localStorage.setItem("lang", 'zh')
+                }
+                if(str != localStorage.getItem("lang")) {
+                    // this.reloads()
+                    location. reload()
+                }
+                console.log(str, localStorage.getItem("lang"))
+            },
             isDingchg() {
                 this.$store.commit('isDingFun')
             },

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

@@ -972,13 +972,11 @@
                             }
                         } 
                         else {
-                            // list = res.data
-                            // this.allListData = res.data
-                            this.total = this.allListData.list.length
-                            list = this.allListData.list.slice(0+50*(this.page-1),49+50*(this.page-1))
+                            //自定义列表:data:{cost:3, costMoney:222}
+                            this.total = this.allListData.length
+                            list = this.allListData.slice(0+50*(this.page-1),49+50*(this.page-1))
                             
                             for(var i in list) {
-                                // console.log(list[i].name, list[i].costMoney, list[i].cost)
                                 xList.push(list[i].name);
                                 let item = {
                                     "value": this.yAxisValue==0?list[i].costMoney:list[i].cost,

+ 0 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -3253,10 +3253,6 @@ a {
                 })
             },
             getUsers() {
-
-
-
-
                 // this.http.post(this.port.manage.list, {
                 //     departmentId: -1,
                 //     pageIndex: 1,

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

@@ -1,43 +1,42 @@
-{{ src/App.vue }}
 <template>
   <div class="container">
     <div class="gantt_head">
       <div class="head_RorX">
         
       <el-radio-group v-model="radio1" @change="selChange()" size="small" style="margin-right:9px;width:280px">
-        <el-radio-button label="按人员查看" value="renyuan"></el-radio-button>
-        <el-radio-button label="按项目查看" value="xiangmu"></el-radio-button>
-        <el-radio-button label="资源需求" value="demand"></el-radio-button>
+        <el-radio-button :label="$t('an-ren-yuan-cha-kan')" value="renyuan"></el-radio-button>
+        <el-radio-button :label="$t('an-xiang-mu-cha-kan')" value="xiangmu"></el-radio-button>
+        <el-radio-button :label="$t('zi-yuan-xu-qiu')" value="demand"></el-radio-button>
       </el-radio-group>
       
       </div>
       <!-- 时间段筛选  -->
       <div class="head_date" v-if="isDataLoaded">
-      <span>时间段</span>
+      <span>{{ $t('message.period') }}</span>
       <el-date-picker
         style="margin-left:9px;width:17vw"
         size="small"
         v-model="valueDate"
         type="daterange"
-        range-separator="至"
-        start-placeholder="开始日期"
-        end-placeholder="结束日期"
+        :range-separator="$t('other.to')"
+        :start-placeholder="$t('time.startDate')"
+        :end-placeholder="$t('time.endDate')"
         value-format="yyyy-MM-dd"
         @change="dateupdata()">
       </el-date-picker>
       </div>
       <!-- 任务类型筛选 -->
-      <div v-if="radio1 == '按项目查看'" class="head_taskType">
-        <span>任务类型</span>
-        <el-select clearable filterable v-model="taskType" placeholder="请选择" size="small" style="margin-left:9px;width:10vw" @change="taskTypeSel()">
-        <el-option label="任务" :value="0"></el-option>
-        <el-option label="里程碑" :value="1"></el-option>
+      <div v-if="radio1 == $t('an-xiang-mu-cha-kan')" class="head_taskType">
+        <span>{{ $t('ren-wu-lei-xing') }}</span>
+        <el-select clearable filterable v-model="taskType" :placeholder="$t('defaultText.pleaseChoose')" size="small" style="margin-left:9px;width:10vw" @change="taskTypeSel()">
+        <el-option :label="$t('other.task')" :value="0"></el-option>
+        <el-option :label="$t('other.milestone')" :value="1"></el-option>
       </el-select>
       </div>
       <!-- 任务分组筛选 -->
       <div v-if="reqpar1" class="head_taskgroup">
-        <span>任务分组</span>
-        <el-select clearable filterable v-model="valuex2" placeholder="请选择" size="small" style="margin-left:9px;width:10vw" @change="taskgroupSel()">
+        <span>{{ $t('other.taskGroup') }}</span>
+        <el-select clearable filterable v-model="valuex2" :placeholder="$t('defaultText.pleaseChoose')" size="small" style="margin-left:9px;width:10vw" @change="taskgroupSel()">
         <el-option
           v-for="item in taskgroupList"
           :key="item.name"
@@ -49,8 +48,8 @@
       </div>
       <!-- 人员/项目筛选 -->
       <div class="head_select">
-        <span>{{(this.radio1 == "按人员查看" ? "人员" : "项目")}}</span>
-      <el-select clearable filterable v-model="valuex" placeholder="请选择" size="small" style="margin-left:9px;width:10vw" @change="optupdata()">
+        <span>{{(this.radio1 == $t('an-ren-yuan-cha-kan') ? $t('ren-yuan') : $t('other.project'))}}</span>
+      <el-select clearable filterable v-model="valuex" :placeholder="$t('defaultText.pleaseChoose')" size="small" style="margin-left:9px;width:10vw" @change="optupdata()">
         <el-option
           v-for="item in screenList"
           :key="item.id"
@@ -65,13 +64,13 @@
       <!-- 资源需求导入/导出 -->
       <div class="head_files" v-if="!isDataLoaded">
         <div style="margin-left:10px;float:left;">
-        <el-link type="primary" :underline="false" href="./upload/资源需求导入模板.xlsx" download="资源需求导入模板.xlsx">模板下载</el-link>
+          <el-link type="primary" :underline="false" :href="'./upload/'+$t('zi-yuan-xu-qiu-dao-ru-mo-ban')+'.xlsx'" download="资源需求导入模板.xlsx">{{ $t('Downloadthetemplate') }}</el-link>
         </div>
         <el-upload ref="upload" style="margin-left:10px;float:left;" action="#" :limit="1" :http-request="importProject" :show-file-list="false">
-          <el-link type="primary" :underline="false" >导入需求</el-link>
+          <el-link type="primary" :underline="false" >{{ $t('dao-ru-xu-qiu') }}</el-link>
         </el-upload>
         <div style="margin-left:10px;float:left;">
-        <el-link type="primary" :underline="false" @click="exportProjectData" download="资源需求导出.xlsx">导出需求</el-link>
+        <el-link type="primary" :underline="false" @click="exportProjectData" download="资源需求导出.xlsx">{{ $t('dao-chu-xu-qiu') }}</el-link>
         </div>
       </div>
     </div>
@@ -83,9 +82,9 @@
 
   <div class="demand-container" v-if="!isDataLoaded">
     <el-table height="90%" :loading="demandListLoading" :data="demandList">
-      <el-table-column label="项目编号" prop="projectCode" width="160"></el-table-column>
-      <el-table-column label="项目名称" prop="projectName" min-width="240"></el-table-column>
-      <el-table-column label="近七日活跃人员" prop="activeUsers" min-width="240">
+      <el-table-column :label="$t('Itemno')" prop="projectCode" width="160"></el-table-column>
+      <el-table-column :label="$t('headerTop.projectName')" prop="projectName" min-width="240"></el-table-column>
+      <el-table-column :label="$t('jin-qi-ri-huo-yue-ren-yuan')" prop="activeUsers" min-width="240">
         <template slot-scope="scope">
           <div>
             <span v-if="user.userNameNeedTranslate == 1">
@@ -100,23 +99,23 @@
           </div>
         </template>
       </el-table-column>
-      <el-table-column label="开始时间 - 结束时间" min-width="240">
+      <el-table-column :label="$t('starttimes') - $t('time.endTime')" min-width="240">
         <template slot-scope="scope">
           <span>{{scope.row.startDate ? scope.row.startDate + ' ~ ' + scope.row.endDate : ''}}</span>
         </template>
       </el-table-column>
-      <el-table-column label="合同要求" prop="contractReq" min-width="240" show-overflow-tooltip></el-table-column>
-      <el-table-column label="里程碑进度" prop="milepost" min-width="280">
+      <el-table-column :label="$t('he-tong-yao-qiu')" prop="contractReq" min-width="240" show-overflow-tooltip></el-table-column>
+      <el-table-column :label="$t('li-cheng-bei-jin-du')" prop="milepost" min-width="280">
         <template slot-scope="scope">
-          <span>{{scope.row.milepost ? scope.row.milepost.name + '\u3000完成时间:' + scope.row.milepost.finishDate : ''}}</span>
+           <span>{{scope.row.milepost ? scope.row.milepost.name + '\u3000'+$t('wan-cheng-shi-jian')+':' + scope.row.milepost.finishDate : ''}}</span>
         </template>
       </el-table-column>
-      <el-table-column label="人员需求" prop="membReq" min-width="280"></el-table-column>
-      <el-table-column label="任务需求" prop="taskReq" min-width="280"></el-table-column>
-      <el-table-column label="参与部门进度" prop="departmentSpeed" min-width="280"></el-table-column>
-      <el-table-column label="操作" width="120" align="center" fixed="right">
+      <el-table-column :label="$t('ren-yuan-xu-qiu')" prop="membReq" min-width="280"></el-table-column>
+      <el-table-column :label="$t('ren-wu-xu-qiu')" prop="taskReq" min-width="280"></el-table-column>
+      <el-table-column :label="$t('can-yu-bu-men-jin-du')" prop="departmentSpeed" min-width="280"></el-table-column>
+      <el-table-column :label="$t('operation')" width="120" align="center" fixed="right">
         <template slot-scope="scope">
-          <el-button @click="demandEdit(scope.row)" size="small">修改</el-button>
+          <el-button @click="demandEdit(scope.row)" size="small">{{ $t('xiu-gai') }}</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -133,55 +132,56 @@
     </div>
 
     <!-- 资源需求修改 -->
-  <el-dialog v-if="demandEditDialog" width="500px" append-to-body :visible.sync="demandEditDialog" :title="'修改 - ' + editParameter.projectName">
+  <el-dialog v-if="demandEditDialog" width="500px" append-to-body :visible.sync="demandEditDialog" :title="$t('xiu-gai') +' - ' + editParameter.projectName">
     <el-form label-width="150">
-      <el-form-item label="开始时间">
+      <el-form-item :label="$t('starttimes')">
         <el-date-picker
         style="width:350px"
         v-model="editDate1"
         type="date"
-        placeholder="请选择开始时间"
+        :placeholder="$t('defaultText.pleaseChoose')"
         value-format="yyyy-MM-dd"></el-date-picker>
       </el-form-item>
-      <el-form-item label="结束时间">
+      <el-form-item :label="$t('time.endTime')">
         <el-date-picker
         style="width:350px"
         v-model="editDate2"
         type="date"
-        placeholder="请选择结束时间"
+        :placeholder="$t('defaultText.pleaseChoose')"
         value-format="yyyy-MM-dd"></el-date-picker>
       </el-form-item>
-      <el-form-item label="人员需求">
+      <el-form-item :label="$t('ren-yuan-xu-qiu')">
         <el-input style="width:350px" v-model="editParameter.membReq" clearable></el-input>
       </el-form-item>
-      <el-form-item label="任务需求">
+      <el-form-item :label="$t('ren-wu-xu-qiu')">
         <el-input style="width:350px" v-model="editParameter.taskReq" clearable></el-input>
       </el-form-item>
-      <el-form-item label="合同要求">
+      <el-form-item :label="$t('he-tong-yao-qiu')">
         <el-input style="width:350px" v-model="editParameter.contractReq" clearable></el-input>
       </el-form-item>
-      <el-form-item label="部门进度">
+      <el-form-item :label="$t('bu-men-jin-du')">
         <el-input style="width:350px" v-model="editParameter.departmentSpeed" clearable></el-input>
       </el-form-item>
     </el-form>
     <div slot="footer" class="dialog-footer">
-              <el-button type="default" @click="demandEditDialog = false">取消</el-button>
-              <el-button type="primary" @click="demandEditSure" >确定</el-button>
+              <el-button type="default" @click="demandEditDialog = false">{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="demandEditSure" >{{ $t('btn.determine') }}</el-button>
             </div>
   </el-dialog>
   </div>
   
   </div>
 </template>
- 
+
 <script>
 import { error } from 'dingtalk-jsapi';
 import Gantt from './gantt.vue';
- 
+
 export default {
   name: 'project_gantt',
+  props: {},
   components: {Gantt},
-  data () {
+  data() {
     return {
       taskType: '',
       isDataLoaded:false,
@@ -192,9 +192,9 @@ export default {
       tasks1: {links:[]},
       updatakey1: 1,
       updatakey2: -1,
-      radio1:"按人员查看",
+      radio1:this.$t('an-ren-yuan-cha-kan'),
       valueDate:[],
-      options:[{value:"选项1",label:"全部"},{value:"选项2",label:"人员1"}],
+      options:[{value:this.$t('xuan-xiang-1'),label:this.$t('all')},{value:this.$t('xuan-xiang-2'),label:this.$t('ren-yuan')+"1"}],
       valuex:'',
       screenList:[],
 
@@ -214,13 +214,29 @@ export default {
       valuex2: '',
 
       user: JSON.parse(sessionStorage.getItem("user")),
-
-    }
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {
+    let nowdate = new Date()
+    let nowmonth = nowdate.getMonth() + 1
+    let startdate = nowdate.getFullYear() + "-" + (nowmonth < 10 ? "0" + nowmonth : nowmonth) + "-" + (nowdate.getDate() < 10 ? "0" + nowdate.getDate() : nowdate.getDate())
+    let udate = new Date(nowdate.getFullYear(),nowdate.getMonth(),nowdate.getDate() + 31)
+    let endmonth = udate.getMonth() + 1
+    let enddate = udate.getFullYear() + "-" + (endmonth < 10 ? "0" + endmonth : endmonth) + "-" + (udate.getDate() < 10 ? "0" + udate.getDate() : udate.getDate())
+    this.valueDate = [startdate,enddate]
+    this.valueDate2 = this.valueDate
+    this.reqpar2 = this.valueDate
+    // console.log("date",this.valueDate);
+    this.getList();
+    this.getScreen()
+    // this.tasks1 = this.tasks
+    this.isDataLoaded = true
   },
-
-  
   methods: {
-      setGroup() {
+    setGroup() {
           this.$refs.ganttTable1.setGroup();
           // this.$refs.ganttTable2.setGroup();
       },
@@ -243,7 +259,7 @@ export default {
                     if (res.code == "ok") {
                         let filePath = res.data;
                         const a = document.createElement('a'); // 创建a标签
-                        a.setAttribute('download', '资源需求导出.xls');// download属性
+                        a.setAttribute('download', this.$t('zi-yuan-xu-qiu-dao-chu')+'.xls');// download属性
                         a.setAttribute('href', filePath);// href链接
                         a.click(); //自执行点击事件
                         a.remove();
@@ -264,7 +280,7 @@ export default {
                 let format = str[str.length - 1];
                 if (format != "xls" && format != "xlsx") {
                     this.$message({
-                        message: "请选择.xls或.xlsx文件",
+                        message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
                         type: "error"
                     });
                 } else {
@@ -275,7 +291,7 @@ export default {
                         this.$refs.upload.clearFiles();
                         if (res.code == "ok") {
                             this.$message({
-                                message: "导入成功",
+                                message: this.$t('other.importSuccess'),
                                 type: "success"
                             });
                             this.getDemandList();
@@ -299,12 +315,12 @@ export default {
       selChange(){
         this.valuex = null
         // console.log("切换按钮",this.radio1);
-        if (this.radio1 == "按人员查看") {
+        if (this.radio1 == this.$t('an-ren-yuan-cha-kan')) {
           this.isDataLoaded = true
           this.reqpar1 = 0
           this.getList()
           this.getScreen()
-        }else if(this.radio1 == "按项目查看"){
+        }else if(this.radio1 == this.$t('an-xiang-mu-cha-kan')){
           this.isDataLoaded = true
           this.reqpar1 = 1
           this.getList()
@@ -380,7 +396,7 @@ export default {
         res => {
           if(res.code == 'ok'){
             this.$message({
-              message: '修改成功',
+              message: this.$t('message.modifyTheSuccess'),
               type: 'success'
             })
             this.demandEditDialog = false
@@ -482,10 +498,10 @@ export default {
                         res => {
                             if (res.code == "ok") {
                                 for(var i in res.data) {
-                                  if(res.data[i].id.indexOf('出差') != '-1') {
+                                  if(res.data[i].id.indexOf(this.$t('chu-cha')) != '-1') {
                                     res.data[i].color = '#E6A23C'
                                   }
-                                  if(res.data[i].id.indexOf('请假') != '-1') {
+                                  if(res.data[i].id.indexOf(this.$t('other.AskForLeave')) != '-1') {
                                     res.data[i].color = '#F56C6C'
                                   }
                                 }
@@ -583,50 +599,12 @@ export default {
             })
         })
       },
-
-
-
-      // tasksEdit(){
-      //   let etasks = JSON.parse(JSON.stringify(this.tasks.data))
-      //   for(let i=0;i<etasks.length;i++){
-      //     if(etasks[i].parent != null){
-      //       let edate = new Date(etasks[i].end_date)
-      //       edate = new Date(edate.setDate(edate.getDate() + 1))
-      //       let edatemonth = edate.getMonth() + 1
-      //       let edateday = edate.getDate()
-      //       edate = edate.getFullYear() + '-' + (edatemonth < 10 ? '0' + edatemonth : edatemonth) + '-' + (edateday < 10 ? '0' + edateday : edateday)
-      //       etasks[i].end_date = edate
-      //     }
-      //   }
-      //   this.tasks = {data:etasks}
-      // }
   },
-  mounted: function () {
-    let nowdate = new Date()
-    let nowmonth = nowdate.getMonth() + 1
-    let startdate = nowdate.getFullYear() + "-" + (nowmonth < 10 ? "0" + nowmonth : nowmonth) + "-" + (nowdate.getDate() < 10 ? "0" + nowdate.getDate() : nowdate.getDate())
-    let udate = new Date(nowdate.getFullYear(),nowdate.getMonth(),nowdate.getDate() + 31)
-    let endmonth = udate.getMonth() + 1
-    let enddate = udate.getFullYear() + "-" + (endmonth < 10 ? "0" + endmonth : endmonth) + "-" + (udate.getDate() < 10 ? "0" + udate.getDate() : udate.getDate())
-    this.valueDate = [startdate,enddate]
-    this.valueDate2 = this.valueDate
-    this.reqpar2 = this.valueDate
-    // console.log("date",this.valueDate);
-    this.getList();
-    this.getScreen()
-    // this.tasks1 = this.tasks
-    this.isDataLoaded = true
-  }
-}
+};
 </script>
 
-<style>
-  /* html, body {
-    height: 100%;
-    margin: 0;
-    padding: 0;
-  } */
-  .container {
+<style scoped lang="scss">
+.container {
     height: 100%;
     width: 100%;
   }
@@ -671,4 +649,4 @@ export default {
     float: right;
     padding-top: 5px;
 }
-</style>
+</style>

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

@@ -291,7 +291,7 @@
                                     fontSize: 18,
                                     fontWeight: 'normal',
                                  },
-                              text: list.length == 0?this.$t('nodata'):this.$t('themosttime'),
+                              text: list.length == 0?_this.$t('nodata'):_this.$t('themosttime'),
                               left: "center",
                               top: "center"
                             },
@@ -313,7 +313,7 @@
                                 trigger:'axis',
                                 formatter: function (params,ticket,callback) {
                                     var res = params[0].data.fullName + ""+" : " + params[0].data.value 
-                                    + this.$t('time.hour');
+                                    + _this.$t('time.hour');
                                     _this.params = params;
                                     return res;
                                 }
@@ -327,11 +327,11 @@
                             yAxis: [{
                                 type : 'value',
                                 axisLabel: {
-                                    formatter:'{value}'+this.$t('time.hour')
+                                    formatter:'{value}'+_this.$t('time.hour')
                                 }
                             }],
                             series: [{
-                                name: this.$t('hao-shi-xiao-shi'),
+                                name: _this.$t('hao-shi-xiao-shi'),
                                 type: 'bar',
                                 barMaxWidth: 30,
                                 data: yList,
@@ -368,7 +368,7 @@
                                     fontSize: 18,
                                     fontWeight: 'normal',
                                  },
-                              text: list.length == 0?this.$t('nodata'):this.$t('taskListStatistics'),
+                              text: list.length == 0?_this.$t('nodata'):_this.$t('taskListStatistics'),
                               left: "center",
                               top: "center"
                             },
@@ -382,11 +382,11 @@
                             },
                             tooltip:{
                                 trigger:'item',
-                                formatter: "{b}<br/>"+this.$t('ren-wu-shu')+":{c} ({d}%)",
+                                formatter: "{b}<br/>"+_this.$t('ren-wu-shu')+":{c} ({d}%)",
                             },
                             series : [
                                 {
-                                    name: this.$t('tasklist'),
+                                    name: _this.$t('tasklist'),
                                     type: 'pie',
                                     radius: '55%',
                                     data:list
@@ -476,12 +476,12 @@
             pulledOut(dataList) {
                 console.log(dataList, '过来的值')
                 // var xList = [], yList = [], list = res.data;
-                let _this = this;
+                var _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,
+                        "value": _this.sumListRadio == _this.$t('plantime') ? list[i].taskHours : list[i].taskCount,
                         "id": list[i].executorId
                     });
                 }
@@ -496,7 +496,7 @@
                             fontSize: 18,
                             fontWeight: 'normal',
                          },
-                      text: list.length == 0?this.$t('nodata'):this.$t('zhi-hang-ren-fen-pei-tu'),
+                      text: list.length == 0?_this.$t('nodata'):_this.$t('zhi-hang-ren-fen-pei-tu'),
                       left: "center",
                       top: "center"
                     },
@@ -518,7 +518,7 @@
                         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.sumListRadio == _this.$t('plantime') ? _this.$t('time.hour') : _this.$t('ge'));
                             _this.params = params;
                             return res;
                         }
@@ -536,7 +536,7 @@
                         }
                     }],
                     series: [{
-                        name: _this.sumListRadio == this.$t('plantime') ? this.$t('xiaoshijihua') : this.$t('rwushuliang'),
+                        name: _this.sumListRadio == _this.$t('plantime') ? _this.$t('xiaoshijihua') : _this.$t('rwushuliang'),
                         type: 'bar',
                         barMaxWidth: 30,
                         data: yList,

+ 7 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -2121,7 +2121,7 @@ export default {
           if (res.code == "ok") {
             this.list = res.data.records;
             this.total = res.data.total;
-            this.nextCursor = this.data.nextCursor
+            this.nextCursor = res.data.nextCursor
           } else {
             this.$message({
               message: res.msg,
@@ -2929,6 +2929,7 @@ export default {
     // 关键搜索
     searchList() {
       // console.log(this.keyword)
+      console.log(this.nextCursor, '游标')
       this.listLoading = true;
       this.http.post(
         this.port.manage.list,
@@ -2937,13 +2938,17 @@ export default {
           pageIndex: this.page,
           pageSize: this.size,
           keyword: this.keyword,
-          status: this.status
+          status: this.status,
+          roleId: this.roleId,
+          cursor: this.nextCursor,
+          onlyDirect: this.onlyDirect ? "1" : "0"
         },
         (res) => {
           this.listLoading = false;
           if (res.code == "ok") {
             this.list = res.data.records;
             this.total = res.data.total;
+            this.nextCursor = res.data.nextCursor
           } else {
             this.$message({
               message: res.msg,

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

@@ -352,8 +352,8 @@
                     <span v-if="reportTimeType.type == 3">{{$t('time.hour')}}</span>
 
                     <span v-if="workForm.time">{{$t('other.attendancePunch')}}: {{workForm.time.startTime}}-{{workForm.time.endTime}}, {{workForm.time.workHours}}{{$t('time.hour')}}</span>
-                    <span v-if="user.timeType.syncDingding==1&&!workForm.time">{{$t('other.noAttendanceRecord')}}</span>
-                    
+                    <span v-if="(user.timeType.syncDingding==1 || user.timeType.syncCorpwxTime==1)&&!workForm.time" >{{$t('other.noAttendanceRecord')}}</span>
+                    <el-button type="default" style="margin-left:5px;" size="mini" :loading="syncTimeLoading" v-if="user.timeType.syncCorpwxTime==1 && (workForm.createDate == today || (!workForm.time))" icon="el-icon-refresh" @click="refreshWXCardTime(workForm.createDate)"></el-button>
                 </el-form-item>
                 <!-- 000000 -->
                 <div v-for="(domain, index) in workForm.domains" :key="domain.id" :style="index>0?'margin-top:10px;':''">
@@ -1645,6 +1645,8 @@
         },
         data() {
             return {
+                today:null,
+                syncTimeLoading: false,
                 seluserText: '',
                 translation: '1', // 1、文字, 2、部门, 3、人员
                 exportLoad: false,
@@ -1924,6 +1926,7 @@
         mounted() {
             var now = new Date();
             var t = util.formatDate.format(now, 'yyyy-MM-dd');
+            this.today = t;
             var startStr = util.formatDate.format(new Date(), 'yyyy-MM') + "-01";
             this.exportParam.dateRange = [startStr,t];
             this.getAllDate(1);
@@ -1948,6 +1951,28 @@
             test(){
                 // console.log('test',this.depData,this.data[0].membCount,this.reportList.length);
             },
+            refreshWXCardTime(workdate) {
+                this.syncTimeLoading = true;
+                this.http.post('/user-corpwx-time/getPunchRecordBySelf',{
+                    date: workdate,
+                },res => {
+                    this.syncTimeLoading = false;
+                    if(res.code == 'ok'){
+                        this.workForm.time = res.data.time;
+                    }else {
+                        this.$message({
+                            message: res.msg,
+                            type: 'error'
+                        })
+                    }
+                },err => {
+                    this.syncTimeLoading = false;
+                    this.$message({
+                        message: err,
+                        type: 'error'
+                    })
+                })
+            },
             weeklyFilledTimeClick(parameterDate){ //按周填报-已填工时-点击
                 this.weeklyFilledTimeDialog = true
                 this.weeklyFilledTimeLoading = true

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

@@ -20,6 +20,7 @@
                     </el-select>
 
                     <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'size'" :subject="searchUsersList" :clearable="true" :multiSelect="true" @selectCal="selectCal"></selectCat>
+                    <!-- <selectCat :size="'size'" :subject="searchUsersList" :clearable="true" :filterable="true" @selectCal="selectCal"></selectCat> -->
                 </el-form-item>
 
                 <el-form-item :label="$t('other.project')" style="width: 215px">