浏览代码

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

cs 2 年之前
父节点
当前提交
280dbe04cb
共有 19 个文件被更改,包括 279 次插入104 次删除
  1. 9 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportAuditorSetting.java
  2. 7 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskGroup.java
  3. 12 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  4. 41 26
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  5. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  6. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportAuditorSettingMapper.xml
  7. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  8. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskGroupMapper.xml
  9. 6 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json
  10. 6 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  11. 4 0
      fhKeeper/formulahousekeeper/timesheet/src/permissions.js
  12. 87 9
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  13. 6 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  14. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  15. 6 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  16. 50 40
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/login/index.vue
  17. 21 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/msg/index.vue
  18. 4 4
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/project/index.vue
  19. 13 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/task/editask.vue

+ 9 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportAuditorSetting.java

@@ -1,12 +1,9 @@
 package com.management.platform.entity;
 
-import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
-
-import jdk.nashorn.internal.ir.annotations.Ignore;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -17,7 +14,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-09-29
+ * @since 2022-10-13
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -53,9 +50,16 @@ public class ReportAuditorSetting extends Model<ReportAuditorSetting> {
     /**
      * 抄送人
      */
-    @TableField(value = "cc_userid",updateStrategy = FieldStrategy.IGNORED)
+    @TableField("cc_userid")
     private String ccUserid;
 
+    /**
+     * 当前待审核的层级,对应第几审核人
+     */
+    @TableField("cur_audit_level")
+    private Integer curAuditLevel;
+
+
     @Override
     protected Serializable pkVal() {
         return this.reportId;

+ 7 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskGroup.java

@@ -1,9 +1,10 @@
 package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -16,7 +17,7 @@ import java.io.Serializable;
  * </p>
  *
  * @author Seyason
- * @since 2022-07-22
+ * @since 2022-10-13
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -50,6 +51,9 @@ public class TaskGroup extends Model<TaskGroup> {
 
     private String inchargerId;
 
+    @TableField("wbs_code")
+    private String wbsCode;
+
     @TableField(exist = false)
     private boolean isNew;
 

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

@@ -342,12 +342,18 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                         User localUser = new User();
                         localUser.setId(finance.getUserId());
                         localUser.setMonthCost(total);
-                        for (int i=0;i<userTimeList.size(); i++) {
-                            Map<String, Object> map = userTimeList.get(i);
-                            if (map.get("creatorId").equals(finance.getUserId())) {
-                                double time = (Double)map.get("workingTime");
-                                localUser.setCost(total.divide(new BigDecimal(time), 6, BigDecimal.ROUND_HALF_UP));
-                                break;
+                        if (companyId == 936) {
+                            //威派格导入薪资时,按照每月设置的工作天数来计算时薪
+                            BigDecimal db = timeType.getMonthDays().multiply(new BigDecimal(timeType.getAllday()));
+                            localUser.setCost(total.divide(db, 6, BigDecimal.ROUND_HALF_UP));
+                        } else {
+                            for (int i=0;i<userTimeList.size(); i++) {
+                                Map<String, Object> map = userTimeList.get(i);
+                                if (map.get("creatorId").equals(finance.getUserId())) {
+                                    double time = (Double)map.get("workingTime");
+                                    localUser.setCost(total.divide(new BigDecimal(time), 6, BigDecimal.ROUND_HALF_UP));
+                                    break;
+                                }
                             }
                         }
 

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

@@ -830,6 +830,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             reportList.forEach(r->r.getAuditorSetting().setReportId(r.getId()));
             List<ReportAuditorSetting> collect = reportList.stream().map(Report::getAuditorSetting).collect(Collectors.toList());
             if (collect.size() > 0) {
+                //提交时,审批流重置当前的待审核层级为1:第一层
+                collect.forEach(r->r.setCurAuditLevel(1));
                 reportAuditorSettingService.saveOrUpdateBatch(collect);
             }
         }
@@ -1374,40 +1376,53 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 String auditorId = user.getId();
                 List<ReportAuditorSetting> auditorSettingList = reportAuditorSettingMapper.selectList(new QueryWrapper<ReportAuditorSetting>().in("report_id", ids));
                 List<Report> updateReportList = new ArrayList<>();
+                List<ReportAuditorSetting> updateReportAuditorSettingList = new ArrayList<>();
                 for (Integer rid : ids) {
                     Report r = new Report();
                     r.setId(rid);
                     ReportAuditorSetting auditorItem = auditorSettingList.stream().filter(a -> a.getReportId().equals(rid)).findFirst().get();
-                    if (auditorId.equals(auditorItem.getAuditorFirst())) {
-                        if (auditorItem.getAuditorSec() != null) {
-                            //进入到第二审批人
-                            r.setProjectAuditorId(auditorItem.getAuditorSec());
-                        } else {
-                            r.setProjectAuditState(1);
-                            r.setProjectAuditTime(LocalDateTime.now());
-                            r.setState(1);
-                        }
-                        updateReportList.add(r);
-                    } else if (auditorId.equals(auditorItem.getAuditorSec())) {
-                        if (auditorItem.getAuditorThird() != null) {
-                            //进入到第三审批人
-                            r.setProjectAuditorId(auditorItem.getAuditorThird());
-                        } else {
+                    switch (auditorItem.getCurAuditLevel()) {
+                        case 1:
+                            if (auditorItem.getAuditorSec() != null) {
+                                //进入到第二审批人
+                                r.setProjectAuditorId(auditorItem.getAuditorSec());
+                                auditorItem.setCurAuditLevel(2);
+                                updateReportAuditorSettingList.add(auditorItem);
+                            } else {
+                                r.setProjectAuditState(1);
+                                r.setProjectAuditTime(LocalDateTime.now());
+                                r.setState(1);
+                            }
+                            updateReportList.add(r);
+                            break;
+                        case 2:
+                            if (auditorItem.getAuditorThird() != null) {
+                                //进入到第三审批人
+                                r.setProjectAuditorId(auditorItem.getAuditorThird());
+                                auditorItem.setCurAuditLevel(3);
+                                updateReportAuditorSettingList.add(auditorItem);
+                            } else {
+                                r.setProjectAuditState(1);
+                                r.setProjectAuditTime(LocalDateTime.now());
+                                r.setState(1);
+                            }
+                            updateReportList.add(r);
+                            break;
+                        case 3:
+                            //目前最多三层,第三个审批人审批后结束
                             r.setProjectAuditState(1);
                             r.setProjectAuditTime(LocalDateTime.now());
                             r.setState(1);
-                        }
-                        updateReportList.add(r);
-                    } else if (auditorId.equals(auditorItem.getAuditorThird())) {
-                        //目前最多三层,第三个审批人审批后结束
-                        r.setProjectAuditState(1);
-                        r.setProjectAuditTime(LocalDateTime.now());
-                        r.setState(1);
-                        updateReportList.add(r);
+                            updateReportList.add(r);
+                            break;
                     }
                 }
                 if (updateReportList.size() > 0) {
                     updateBatchById(updateReportList);
+                    //更新审核人的审批流程
+                    if (updateReportAuditorSettingList.size() > 0) {
+                        reportAuditorSettingService.updateBatchById(updateReportAuditorSettingList);
+                    }
                 }
             } else {
                 //之前的流程逻辑,综合了一层项目审核,或者一层任务分组审核。 可叠加部门审批流
@@ -3165,8 +3180,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             List<Map<String, Object>> worktimeList = userMonthWork.worktimeList;
             //dataItem.add(userMonthWork.name+(worktimeList.size()==0?"(未填)":""));
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                dataItem.add("$userName="+userMonthWork.corpwxUserId+"$"+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
-                dataItem.add("$departmentName="+userMonthWork.corpwxDeptId+"$");
+                dataItem.add("$userName="+(userMonthWork.corpwxUserId==null?"":userMonthWork.corpwxUserId)+"$"+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
+                dataItem.add("$departmentName="+(userMonthWork.corpwxDeptId==null?"":userMonthWork.corpwxDeptId)+"$");
             }else {
                 dataItem.add(userMonthWork.name+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
                 dataItem.add(userMonthWork.departmentName);
@@ -4692,7 +4707,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             object.put("PSPHI",rl.get("projectCode"));
             object.put("GJAHR",rl.get("ofyear"));
             object.put("MONAT",rl.get("ofmonth"));
-            object.put("PROJK",rl.get("taskGroupCode"));
+            object.put("PROJK",rl.get("wbsCode"));
             object.put("DMBTR",rl.get("cost"));
             object.put("ZID",rl.get("jobNumber"));
             object.put("ZUNAM",rl.get("userName"));

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -541,7 +541,7 @@ public class TimingTask {
     }
     //推送到开发环境,每10分钟一次
     @Scheduled(fixedRate = 600 * 1000)
-    private void genRandomCode() {
+    private void pushSysConfigToDev() {
         if (isDev) {
             return;
         }

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

@@ -9,11 +9,12 @@
         <result column="auditor_sec" property="auditorSec" />
         <result column="auditor_third" property="auditorThird" />
         <result column="cc_userid" property="ccUserid" />
+        <result column="cur_audit_level" property="curAuditLevel" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        report_id, auditor_first, auditor_sec, auditor_third, cc_userid
+        report_id, auditor_first, auditor_sec, auditor_third, cc_userid, cur_audit_level
     </sql>
 
 </mapper>

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

@@ -552,7 +552,7 @@
     </select>
 
     <select id="getUploadThirdReportData" resultType="java.util.Map">
-        select IFNULL(p.project_code,'其他') as projectCode,IFNULL(tg.task_group_code,'其他')as taskGroupCode,DATE_FORMAT(r.create_date, '%Y') as ofyear,
+        select IFNULL(p.project_code,'其他') as projectCode,IFNULL(tg.wbs_code,'其他')as wbsCode,DATE_FORMAT(r.create_date, '%Y') as ofyear,
         DATE_FORMAT(r.create_date, '%m') as ofmonth,u.name as userName,u.job_number as jobNumber,d.department_name as departmentName,SUM(r.cost) as cost
         from report r
         left join project p  on p.id=r.project_id

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

@@ -9,11 +9,12 @@
         <result column="task_group_code" property="taskGroupCode" />
         <result column="name" property="name" />
         <result column="incharger_id" property="inchargerId" />
+        <result column="wbs_code" property="wbsCode" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, project_id, task_group_code, name, incharger_id
+        id, project_id, task_group_code, name, incharger_id, wbs_code
     </sql>
 
 </mapper>

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

@@ -1397,5 +1397,10 @@
   "yu-suan-gong-shi": "budgeted hours",
   "fan-hui": "return",
   "jie-duan": "phase",
-  "xiang-mu-cheng-ben": "project cost"
+  "xiang-mu-cheng-ben": "project cost",
+  "ren-yuan-yue-du-gong-shi-biao": "Monthly time sheet of personnel",
+  "biao-zhun-gong-shi": "Standard working hours",
+  "qing-jia-gong-shi": "Off hours",
+  "shi-fou-man-zu-gong-shi": "Whether the working hours are met",
+  "fu-wu-xiang-mu": "service project"
 }

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

@@ -1397,5 +1397,10 @@
   "yu-suan-gong-shi": "预算工时",
   "fan-hui": "返回",
   "xiang-mu-cheng-ben": "项目成本",
-  "jie-duan": "阶段"
+  "jie-duan": "阶段",
+  "ren-yuan-yue-du-gong-shi-biao": "人员月度工时表",
+  "biao-zhun-gong-shi": "标准工时",
+  "qing-jia-gong-shi": "请假工时",
+  "shi-fou-man-zu-gong-shi": "是否满足工时",
+  "fu-wu-xiang-mu": "服务项目"
 }

+ 4 - 0
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -70,6 +70,8 @@ const StringUtil = {
         reportGroup: false, // 负责项目任务分组工时 //
         reportAllOutputValue: false, // 全部项目成本基线表 //
         reportOutputValue: false, // 负责项目成本基线表 //
+        reportMonthlyPersonnel: false, // 全部人员月度工时表 //
+        reportResponsiblePersonnel: false, // 负责部门月度工时表   //
 
         // 请假模块
         leaveFil : false, // 请假填报 // 
@@ -189,6 +191,8 @@ const StringUtil = {
         arr[i] == '日报导出' ? obj.reportExport = true : ''
         arr[i] == '查看全公司数值' ? obj.customDataAll = true : ''
         arr[i] == '删除出差' ? obj.awayOfficeDelete = true : ''
+        arr[i] == '全部人员月度工时表' ? obj.reportMonthlyPersonnel = true : ''
+        arr[i] == '负责部门月度工时表' ? obj.reportResponsiblePersonnel = true : ''
     }
 
     return obj

+ 87 - 9
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -34,6 +34,7 @@
                   <el-menu-item index="1-10" v-if="permissions.reportAllTimely || permissions.reportTimely"><p @click="ssl(9)">{{ $t('employeereporttimelinessrate') }}</p></el-menu-item>
                   <el-menu-item index="1-11" v-if="permissions.reportAuditRate"><p @click="ssl(10)">{{ $t('dailyreporttobereviewedstatistics') }}</p></el-menu-item>
                   <el-menu-item index="1-12" v-if="permissions.reportPersonnel || permissions.reportResponsible"><p @click="ssl(11)">{{ $t('statisticsofpersonnelhours') }}</p></el-menu-item>
+                  <el-menu-item index="1-15" v-if="permissions.reportMonthlyPersonnel || permissions.reportResponsiblePersonnel"><p @click="ssl(14)">{{ $t('ren-yuan-yue-du-gong-shi-biao') }}</p></el-menu-item>
                   <!-- <el-menu-item index="1-12"><p @click="ssl(11)">人员工时统计表</p></el-menu-item> -->
                 </el-submenu>
               </el-menu>
@@ -78,21 +79,23 @@
           <el-option label="查看部门审核人" :value="0"></el-option>
         </el-select> -->
         <!-- 项目筛选 -->
-        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 10 && ins != 11" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
+        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 10 && ins != 11 && ins != 14" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
           <el-option v-for="(item) in proListOvertime" :key="item.id" :label="item.projectName + (item.projectCode ? item.projectCode : '')" :value="item.id">
             <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
             <span style="float: right;font-size: 13px;margin-left: 20px">{{ item.projectName }}</span>
           </el-option>
         </el-select>
+        <!-- 月份选择 -->
+        <el-date-picker v-if="ins == 14" value-format="yyyy-MM" v-model="monthPersonnel" type="month" placeholder="选择月份" @change="selcts()" size="small"></el-date-picker>
           
           <!-- 部门筛选 -->
-          <el-cascader v-if="((ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel)) && user.userNameNeedTranslate != 1" v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
+          <el-cascader v-if="((ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14)) && user.userNameNeedTranslate != 1" v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
             :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false" clearable
             @change="selcts(9)" size="small" style="margin-left:10px"
           ></el-cascader>
 
           <!-- 部门筛选 -->
-          <vueCascader :size="'small'" :widthStr="'125'" :clearable="true" :subject="departmentList" :radios="true" :distinction="'1'" @vueCasader="vueCasader" v-if="(((ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel)) && user.userNameNeedTranslate == 1)" :selectNameChuan="$t('qing-xuan-ze-bu-men')"></vueCascader>
+          <vueCascader :size="'small'" :widthStr="'125'" :clearable="true" :subject="departmentList" :radios="true" :distinction="'1'" @vueCasader="vueCasader" v-if="(((ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel) || (ins == 14)) && user.userNameNeedTranslate == 1)" :selectNameChuan="$t('qing-xuan-ze-bu-men')"></vueCascader>
 
           <!-- 任务筛选 -->
           <el-select v-if="ins == 1" v-model="taskTypeId" :placeholder="$t('pleaseselecttype')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
@@ -101,11 +104,11 @@
           </el-select>
 
           <!-- 人员筛选 -->
-          <el-select v-if="(ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11)  && user.userNameNeedTranslate != '1'" v-model="userId" :placeholder="$t('pleaseselectpersonnel')" @change="selcts()" clearable filterable size="small" style="margin-left:10px;width:150px">
+          <el-select v-if="(ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 14)  && user.userNameNeedTranslate != '1'" v-model="userId" :placeholder="$t('pleaseselectpersonnel')" @change="selcts()" clearable filterable size="small" style="margin-left:10px;width:150px">
             <el-option v-for="(item, index) in selUserList" :key="index" :label="item.name" :value="item.id"></el-option>
           </el-select>
 
-          <selectCat :subject="selUserList" :subjectId="userId" :size="mini" @selectCal="selectCal" v-if="(ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11) && user.userNameNeedTranslate == '1'"></selectCat>
+          <selectCat :subject="selUserList" :subjectId="userId" :size="mini" @selectCal="selectCal" v-if="(ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 14) && user.userNameNeedTranslate == '1'"></selectCat>
           
 
           <!-- 待审核筛选切换 -->
@@ -663,7 +666,32 @@
                 </el-table-column>
             </el-table>
             
-
+            <!-- 人员月度工时表 -->
+            <el-table v-if="ins == 14" key="14" border :data="monthlyPersonnelList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+                <el-table-column prop="name" :label="$t('ren-yuan')" min-width="150">
+                  <template slot-scope="scope">
+                    <div>
+                      <span v-if="user.userNameNeedTranslate == '1'">
+                        <ww-open-data type='userName' :openid='scope.row.name'></ww-open-data>
+                      </span>
+                      <span v-if="user.userNameNeedTranslate != '1'">
+                        {{scope.row.name}}
+                      </span>
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="jobNumber" :label="$t('Worknumber')" min-width="250"></el-table-column>
+                <el-table-column prop="standardHours" :label="$t('biao-zhun-gong-shi')" min-width="250"></el-table-column>
+                <el-table-column prop="workingTime" :label="$t('shi-ji-gong-shi')" min-width="250"></el-table-column>
+                <el-table-column prop="leaveTime" :label="$t('qing-jia-gong-shi')" min-width="250"></el-table-column>
+                <el-table-column prop="whether" :label="$t('shi-fou-man-zu-gong-shi')" min-width="250">
+                  <template slot-scope="scope">
+                    <div>
+                      <span>{{scope.row.whether == 0 ? '否' : '是'}}</span>
+                    </div>
+                  </template>
+                </el-table-column>
+            </el-table>
         <!--工具条-->
         <el-col :span="24" class="toolbar" v-if="ins != 6">
           <el-pagination
@@ -904,7 +932,8 @@ export default {
       shuz: [this.$t('projectreport'),this.$t('projectTaskReport'),this.$t('projectcoststatement'),
       this.$t('pojectbalancesheetincomestatement'),this.$t('customerprojectprofitstatement'),this.$t('projectphasetimesheet'),
       this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
-      this.$t('statisticsofstafffillingintimerate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable')],
+      this.$t('statisticsofstafffillingintimerate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
+      this.$t('ren-yuan-yue-du-gong-shi-biao')],
       ins: 10000,
       user: JSON.parse(sessionStorage.user),
       overTimeList: [], // 项目加班情况统计列表
@@ -952,7 +981,10 @@ export default {
       outputValueTitle: [],
 
       timelyDetailList: [],
-      timelyDetailDialog: false
+      timelyDetailDialog: false,
+
+      monthlyPersonnelList: [],
+      monthPersonnel: ''
     };
   },
   computed: {},
@@ -974,6 +1006,12 @@ export default {
     this.getcustomerList()
     this.getcusProjectList()
     this.authorityToJudge()
+
+    var myDate = new Date();
+    let year = myDate.getFullYear();
+    let month = +myDate.getMonth() + 1
+    let yue = month >= 10 ? yue = month : yue = '0' + month
+    this.monthPersonnel = year + '-' + yue
   },
   filters: {
       
@@ -1006,7 +1044,9 @@ export default {
       if(this.permissions.reportTimely || this.permissions.reportAllTimely) {this.ssl(9);this.defaultActive = '1-10';return} else
       if(this.permissions.reportAllGroup || this.permissions.reportGroup) {this.ssl(12);this.defaultActive = '1-13';return} else
       if(this.permissions.reportAuditRate) {this.ssl(10);this.defaultActive = '1-11';return} else 
-      if(this.permissions.reportPersonnel || this.permissions.reportResponsible) {this.ssl(11);this.defaultActive = '1-12';return}{this.allWrong = false}
+      if(this.permissions.reportPersonnel || this.permissions.reportResponsible) {this.ssl(11);this.defaultActive = '1-12';return}
+      if(this.permissions.reportMonthlyPersonnel || this.permissions.reportResponsiblePersonnel) {this.ssl(14);this.defaultActive = '1-15';return}
+      {this.allWrong = false}
     },
     rowspan(spanArr,position,spanName){
       this.list1.forEach((item,index) => {
@@ -1235,6 +1275,8 @@ export default {
                     this.getGroupWorktimeAll()
                 }else if(this.ins == 13){
                   this.getOutputValueList()
+                } else if(this.ins == 14) {
+                  this.getMonthlyPersonnel()
                 }
             },
       exportExcel() {
@@ -1317,6 +1359,12 @@ export default {
         }else if(this.ins == 13){
           fName = this.$t('projectcostbaselinetable') + '.xls'
           url += "/exportProjectBaseCost"
+        } else if(this.ins == 14) {
+          fName = this.$t('ren-yuan-yue-du-gong-shi-biao') + '.xls'
+          url += "/exportEmpMonthHours"
+          sl.userId= this.userId,
+          sl.departmentId = this.departmentIdArray.length > 0 ? this.departmentIdArray[this.departmentIdArray.length - 1] : '',
+          sl.month = this.monthPersonnel + '-01'
         }
           this.http.post(url, sl,
             res => {
@@ -1487,6 +1535,36 @@ export default {
         })
       })
     },
+    // 人员月度工时表
+    getMonthlyPersonnel() {
+      let parameter = {
+        pageIndex: this.page,
+        pageSize: this.size,
+        userId: this.userId,
+        departmentId: this.departmentIdArray.length > 0 ? this.departmentIdArray[this.departmentIdArray.length - 1] : '',
+        // departmentId: '',
+        month: this.monthPersonnel + '-01'
+      }
+      this.listLoading = true
+      this.http.post('/project/getEmpMonthHours',parameter,
+      res => {
+      this.listLoading = false
+        if(res.code == 'ok'){
+          this.monthlyPersonnelList = res.data.result
+        }else {
+          this.$message({
+            message: res.msg,
+            type: 'error'
+          })
+        }
+      },err => {
+        this.listLoading = false
+        this.$message({
+          message: err,
+          type: 'error'
+        })
+      })
+    },
     overTime() {
       this.listLoading = true;
       var obj = {

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

@@ -289,7 +289,7 @@
         </el-dialog>
          
          <!--导入时的设置界面 -->
-         <el-dialog :title="$t('Financialdataimport')" v-if="importDialog" :visible.sync="importDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+         <el-dialog :title="$t('Financialdataimport')" v-if="importDialog" :visible.sync="importDialog" :close-on-click-modal="false" customClass="customWidth" width="550px">
             <el-form ref="form3" :model="importParam" >
                 <el-form-item :label="$t('Itheimport')" >
                     <!-- <div style="color:orange;">{{date}}</div> -->
@@ -297,6 +297,7 @@
                 </el-form-item>
                 <el-form-item prop="syncHistoryReport"  >
                     <el-checkbox :label="$t('Recalculatereportedcostsforthemonth')" v-model="importParam.syncHistoryReport"></el-checkbox>
+                    <span v-if="user.companyId == '936'">&nbsp;[ 按每月 {{$t(user.timeType.monthDays)}} 天 * 每天 {{$t(user.timeType.allday)}} 小时计算时薪 ]</span>
                 </el-form-item>
                 <el-form-item prop="syncUserCost"  >
                     <el-checkbox :label="$t('Synchronizeemployeemonthlycosttorganizationalstructure')" v-model="importParam.syncUserCost" ></el-checkbox>
@@ -652,7 +653,10 @@ import { error } from 'dingtalk-jsapi';
                     yearMonth: this.date
                 },res => {
                     if(res.code == 'ok'){
-
+                        thiss.$message({
+                            message: '上传成功',
+                            type: 'success'
+                        })
                     }else{
                         this.$message({
                             message: res.msg,

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

@@ -592,6 +592,7 @@
                         <el-option :value="$t('softwareproject')" :label="$t('softwareproject')"></el-option>
                         <el-option :value="$t('hardwareproject')" :label="$t('hardwareproject')"></el-option>
                         <el-option :value="$t('integrationproject')" :label="$t('integrationproject')"></el-option>
+                        <el-option :value="$t('fu-wu-xiang-mu')" :label="$t('fu-wu-xiang-mu')"></el-option>
                     </el-select>
                 </el-form-item>
                 <el-form-item :label="$t('region')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">

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

@@ -1709,16 +1709,21 @@ import timetoolVue from '../timetool/timetool.vue';
                         } else {
                             if (this.user.timeType.reportAuditType == 0) {
                                 this.$toast.fail("请指定["+this.form.domains[i].projectName+']项目的审核人');
+                                return;
                             } else if(this.user.timeType.reportAuditType == 1 || this.user.timeType.reportAuditType == 2){
                                 if (this.form.domains[i].taskGroups.length == 0) {
                                     this.$toast.fail("您在["+this.form.domains[i].projectName+"]项目上尚无参与的任务分组");
+                                    return;
                                 } else if (!this.form.domains[i].groupId) {
                                     this.$toast.fail("请选择["+this.form.domains[i].projectName+"]项目的任务分组");
+                                    return;
                                 } else {
                                     this.$toast.fail("请先设置["+this.form.domains[i].projectName+']-['+this.form.domains[i].groupName+']的分组负责人');
+                                    return;
                                 }
+                                
                             }
-                            return;
+                            
                         }
                     }
                     if(!this.flgLg) {

+ 50 - 40
fhKeeper/formulahousekeeper/timesheet_h5/src/views/login/index.vue

@@ -198,50 +198,60 @@
             } else if (ua.indexOf("micromessenger") > 0) {
                 this.isWX = true;
             }
-            if (localStorage.userInfo != null) {
-                this.$router.push("/index").catch(err => { console.log(err, '错误5')});
+            let href = window.location.href;
+            //优先处理企业微信工作台点击进入,后台已经处理过,有userId传过来了
+            if (this.isCorpWX && href.indexOf("userId") > 0) {
+                //判断企业微信,是否存在授权
+                var loginUserId = href.substring(href.indexOf("userId=")+"userId=".length);
+                if (loginUserId.includes('#/')) {
+                    loginUserId = loginUserId.substring(0, loginUserId.indexOf('#/'));
+                }
+                this.loginByUserId(loginUserId);
             } else {
-                if (this.isCorpWX || this.isWX) {
-                    let href = window.location.href;
-                    //判断企业微信,是否存在授权
-                    if (href.includes("com/?code")) {
-                        this.bindIfNessary();
-                    } else {
-                        if (href.indexOf('hasTriedAutoLogin') == -1) {
-                            this.tryAutoLogin();
-                        } else if (href.indexOf("userId") > 0) {
-                            //后台经过验证后,重定向过来带上了userId
-                            var loginUserId = href.substring(href.indexOf("userId=")+"userId=".length);
-                            if (loginUserId.includes('#/')) {
-                                loginUserId = loginUserId.substring(0, loginUserId.indexOf('#/'));
+                if (localStorage.userInfo != null && !this.isCorpWX) {
+                    this.$router.push("/index").catch(err => { console.log(err, '错误5')});
+                } else {
+                    if (this.isCorpWX || this.isWX) {
+                        //判断企业微信,是否存在授权
+                        if (href.includes("com/?code")) {
+                            this.bindIfNessary();
+                        } else {
+                            if (href.indexOf('hasTriedAutoLogin') == -1) {
+                                this.tryAutoLogin();
+                            } else if (href.indexOf("userId") > 0) {
+                                //后台经过验证后,重定向过来带上了userId
+                                var loginUserId = href.substring(href.indexOf("userId=")+"userId=".length);
+                                if (loginUserId.includes('#/')) {
+                                    loginUserId = loginUserId.substring(0, loginUserId.indexOf('#/'));
+                                }
+                                this.loginByUserId(loginUserId);
                             }
-                            this.loginByUserId(loginUserId);
                         }
+                        
+                    } else {
+                        //检查环境,如果是钉钉有$CORPID$
+                        var key = '?corpid=';
+                        var jumpkey = '&jumpto=';
+                        var url = location.href;
+                        var that = this;
+                        if (url.indexOf(key) > 0) {
+                            var corpId = ''
+                            if(url.indexOf(jumpkey) > 0){
+                                corpId = url.substring(url.indexOf(key)+key.length,url.indexOf(jumpkey));
+                            }else{
+                                corpId = url.substring(url.indexOf(key)+key.length,url.indexOf('#'));
+                            }
+                            this.isDingding = true
+                            dd.ready(function() {
+                                dd.runtime.permission.requestAuthCode({
+                                    corpId: corpId, // 企业id
+                                    onSuccess: function (info) {
+                                        var code = info.code // 通过该免登授权码可以获取用户身份
+                                        that.loginByCode(code, corpId);
+                                    }});
+                            });
+                        } 
                     }
-                    
-                } else {
-                    //检查环境,如果是钉钉有$CORPID$
-                    var key = '?corpid=';
-                    var jumpkey = '&jumpto=';
-                    var url = location.href;
-                    var that = this;
-                    if (url.indexOf(key) > 0) {
-                        var corpId = ''
-                        if(url.indexOf(jumpkey) > 0){
-                            corpId = url.substring(url.indexOf(key)+key.length,url.indexOf(jumpkey));
-                        }else{
-                            corpId = url.substring(url.indexOf(key)+key.length,url.indexOf('#'));
-                        }
-                        this.isDingding = true
-                        dd.ready(function() {
-                            dd.runtime.permission.requestAuthCode({
-                                corpId: corpId, // 企业id
-                                onSuccess: function (info) {
-                                    var code = info.code // 通过该免登授权码可以获取用户身份
-                                    that.loginByCode(code, corpId);
-                                }});
-                        });
-                    } 
                 }
             }
         }

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

@@ -5,7 +5,16 @@
         <div class="login_form">
             <van-list v-model="loading" :finished="finished" finished-text="没有更多了" :error.sync="error" error-text="请求失败,点击重新加载" @load="getMessage">
                 <van-cell @click="readMsg(index)" v-for="(item,index) in list" :key="index" 
-                :title="item.msg==null?msgType[item.type]:item.msg" :label="item.time.replace('T', ' ')" >
+                 :label="item.time.replace('T', ' ')" >
+                <template #title>
+                    <span v-if="user.userNameNeedTranslate == 1 && item.msg != null && item.msg.indexOf('$userName=') != -1">
+                        <span>{{item.msg1}}</span>
+                        <ww-open-data type='userName' :openid='item.msg2'></ww-open-data>
+                        <span>{{item.msg3}}</span>
+                    </span>
+                    <span v-else-if="item.msg != null">{{item.msg}}</span>
+                    <span v-else>{{msgType[item.type]}}</span>
+                </template>
                 <div >
                     <span v-if="item.checked == 1" style="color:green">已读</span>
                     <span v-if="item.checked == 0" style="color:red">未读</span>
@@ -46,6 +55,10 @@
                 history.back();
             },
 
+            getmsgtext(text){
+                return text.split('$')[1].split('=')[1]
+            },
+
             readMsg(index) {
                 var item = this.list[index];
                 if (item.type == 0) {
@@ -91,6 +104,13 @@
                         this.loading = false;
                         this.finished = true;
                         this.list = res.data;
+                        for(let i in this.list){
+                            if(this.list[i].msg != null && this.list[i].msg.indexOf('$userName=') != -1){
+                                this.list[i].msg1 = this.list[i].msg.split('$')[0]
+                                this.list[i].msg2 = this.list[i].msg.split('$')[1].split('=')[1]
+                                this.list[i].msg3 = this.list[i].msg.split('$')[2]
+                            }
+                        }
                     } else {
                         this.$toast.fail('获取失败');
                     }

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

@@ -45,11 +45,11 @@
             <van-pull-refresh v-model="isDownLoading" @refresh="onDownRefresh">
                 <van-list v-model="isUpLoading" :finished="upFinished" :immediate-check="false" :offset="100" finished-text="没有更多了" @load="onLoadList">
                     <van-swipe-cell v-for="(item,index) in list" :key="index">
-                        <van-cell :border="false" :title="item.projectName" :value="item.projectCode"/>
+                        <van-cell :border="false" :title="item.projectName" :value="item.projectCode" clickable @click="toProjectInside(item)"/>
                         <template slot="right" v-if="projectManagement || item.creatorId == user.id">
-                            <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)"/>
+                            <!-- <van-button square type="primary" text="查看" @click="toProjectInside(item)"/> -->
+                            <van-button square type="info" text="编辑" @click="openDialog(index)" style="height:100%"/>
+                            <van-button square type="danger" text="删除" @click="delPro(index)" style="height:100%"/>
                         </template>
                     </van-swipe-cell> 
                 </van-list>

+ 13 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/task/editask.vue

@@ -51,7 +51,14 @@
                 </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 v-model="item.executorName" :label="'执行人' + (index + 1)" placeholder="请选择执行人" @click="executorChange(item,index)" readonly clickable>
+                        <template #input>
+                            <span v-if="!item.executorName"></span>
+                            <span v-else-if="user.userNameNeedTranslate != 1">{{item.executorName}}</span>
+                            <span v-else><ww-open-data type='userName' :openid='item.executorName'></ww-open-data></span>
+                        </template>
+                    </van-field>
+                    
                     <van-field label="计划工时">
                         <template #input>
                             <van-stepper v-model="item.planHours" :disabled="!canEdit"/><span>{{'\u3000h'}}</span>
@@ -65,6 +72,8 @@
                         <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>
+                                <span v-if="user.userNameNeedTranslate != 1">{{uitem.name}}</span>
+                                <span v-else><ww-open-data type='userName' :openid='uitem.name'></ww-open-data></span>
                             </van-radio>
                         </van-radio-group>
                     <van-button style="width:100%;position: -webkit-sticky;position: sticky;bottom: 0;" @click="searchExecutor()">确定</van-button>
@@ -229,6 +238,9 @@ export default {
 
         submitTask(){
             console.log('submitTask');
+            if(!this.taskform.name.replace(/^\s*|\s*$/g,"")){
+                return
+            }
             
             // 执行人查重
             let arr = this.taskform.executorList