QuYueTing 18 часов назад
Родитель
Сommit
0a3dff2644
17 измененных файлов с 972 добавлено и 529 удалено
  1. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  2. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  3. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractBonusDetailServiceImpl.java
  4. 0 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  5. 110 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  6. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ContractBonusDetailMapper.xml
  7. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  8. 101 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/TimeType.java
  9. 15 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/TimeTypeMapper.xml
  10. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/permissions.js
  11. 1 15
      fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue
  12. 178 6
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  13. 5 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/financeComponents/incomeDetail.vue
  14. 307 298
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  15. 109 109
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/dailyReportReview.vue
  16. 88 88
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/weeklyReportReview.vue
  17. 43 8
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/index.vue

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -2991,6 +2991,11 @@ public class ReportController {
         return reportService.approveReport(reportIds,isDepartment, request,evaluate);
     }
 
+    @RequestMapping("/hrAutoApprove")
+    public HttpRespMsg hrAutoApprove(String creatorId, String createDate) {
+        return reportService.hrAutoApprove(creatorId, createDate);
+    }
+
 
     /**
      * 按某人某日期审批未通过报告 撤销通过报告

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java

@@ -52,6 +52,10 @@ public interface ReportService extends IService<Report> {
                                HttpServletRequest request);
 
     HttpRespMsg approveReport(String reportIds, Integer isDepartment, HttpServletRequest request,String evaluate);
+
+    //羲合超导定制的HR自动审核通过
+    HttpRespMsg hrAutoApprove(String creatorId, String createDate);
+
     HttpRespMsg autoApproveReport(String reportIds);
 
     HttpRespMsg denyReport(String date, String reportIds, String reason, Integer isDepartment, HttpServletRequest request);

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

@@ -37,6 +37,7 @@ import java.io.InputStream;
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
@@ -518,6 +519,7 @@ public class ContractBonusDetailServiceImpl extends ServiceImpl<ContractBonusDet
             headList.add("员工姓名");
             headList.add("奖金类型");
             headList.add("项目名称");
+            headList.add("项目工时");
             headList.add("员工该项目奖金金额");
             headList.add("年月");
             allDatas.add(headList);
@@ -531,7 +533,7 @@ public class ContractBonusDetailServiceImpl extends ServiceImpl<ContractBonusDet
                 rowData.add(detailVO.getUserName());
                 rowData.add(detailVO.getBonusType());
                 rowData.add(detailVO.getProjectName());
-                System.out.println("金额==="+detailVO.getBonusValue());
+                rowData.add(detailVO.getProjectWorkingTime().setScale(2, RoundingMode.HALF_UP).toString());
                 rowData.add(detailVO.getBonusValue().setScale(4, BigDecimal.ROUND_HALF_UP).toString());
                 rowData.add(detailVO.getYm());
                 allDatas.add(rowData);

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

@@ -2356,7 +2356,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if (timeType.getReportCc() == 1) {
                         if (ccIds.size() > 0) {
                             List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", ccIds));
-                            System.out.println("有cc===");
                             List<User> newUserList = userList.stream()
                                     .filter(u->!oldCcUserList.stream().anyMatch(old->old.getUserId().equals(u.getId())))
                                     .collect(Collectors.toList());

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

@@ -2607,6 +2607,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     userDailyReportList = new ArrayList<>();
                     lastName.put("data", userDailyReportList);
                 }
+                lastName.put("createTime", (String)a.get("createTime"));//每次更新提交时间,用最后一次的为准
                 //每组日报数据都加上去
                 userDailyReportList.add(a);
             }
@@ -3758,6 +3759,115 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg hrAutoApprove(String creatorId, String createDate) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        Integer companyId = Constant.XI_HE_CHAO_DAO_COMPANY_ID;
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+        //查询HR审核部门和审核人
+        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId).in("department_id", Arrays.asList(10354, 10355)));
+        if (departmentList.size() > 0) {
+            for (Department dept : departmentList) {
+                String auditorId = dept.getManagerId();
+                if (!StringUtils.isEmpty(auditorId)) {
+                    User user = userMapper.selectById(auditorId);
+                    //获取所有待审核的日报
+                    QueryWrapper<Report> queryWrapper = new QueryWrapper<Report>()
+                            .eq("company_id", companyId)
+                            .eq("state", 0).eq("is_final_audit", 1)
+                            .eq("audit_dept_managerid", auditorId)
+                            .eq("audit_deptid", dept.getDepartmentId())
+                            .eq("is_dept_audit", 1);
+                    if (!StringUtils.isEmpty(createDate)) {
+                        queryWrapper.eq("create_date", createDate);
+                    }
+                    if (!StringUtils.isEmpty(creatorId)) {
+                        queryWrapper.eq("creator_id", creatorId);
+                    }
+                    List<Report> reportList = reportMapper.selectList(queryWrapper);
+                    //获取最大和最小日期
+                    LocalDate minDate = null;
+                    LocalDate maxDate = null;
+
+                    List<UserCorpwxTime> userCorpwxTimeList = new ArrayList<>();
+                    List<User> reportUserList = new ArrayList<>();
+                    if (!reportList.isEmpty()) {
+                        minDate = reportList.stream().map(Report::getCreateDate).min(LocalDate::compareTo).orElse(null);
+                        maxDate = reportList.stream().map(Report::getCreateDate).max(LocalDate::compareTo).orElse(null);
+                        //查找考勤记录
+                        List<String> creatorIds = reportList.stream().map(Report::getCreatorId).distinct().collect(Collectors.toList());
+                        reportUserList = userList.stream().filter(u->creatorIds.contains(u.getId())).collect(Collectors.toList());
+                        List<String> reportUserCorpwxIds = reportUserList.stream().map(User::getCorpwxUserid).collect(Collectors.toList());
+                        userCorpwxTimeList = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>()
+                                .eq("company_id", companyId).in("corpwx_userid", reportUserCorpwxIds).between("create_date", minDate, maxDate));
+                    }
+                    //按人员和日期分组
+                    Map<String, List<Report>> map = reportList.stream().collect(Collectors.groupingBy(Report::getCreatorId));
+                    List<Report> updateReportList = new ArrayList<>();
+                    for (Map.Entry<String, List<Report>> entry : map.entrySet()) {
+                        String userId = entry.getKey();
+                        User creator = reportUserList.stream().filter(u->u.getId().equals(userId)).findFirst().get();
+                        List<Report> reports = entry.getValue();
+                        //日期分组
+                        Map<LocalDate, List<Report>> dateMap = reports.stream().collect(Collectors.groupingBy(Report::getCreateDate));
+                        for (Map.Entry<LocalDate, List<Report>> entry1 : dateMap.entrySet()) {
+                            LocalDate date = entry1.getKey();
+                            List<Report> dateReport = entry1.getValue();
+
+                            //获取项目名称,填写工作内容是否有项目名称
+                            boolean findProjectName = false;
+                            for (Report report : dateReport) {
+                                String content = report.getContent();
+                                Project project = projectList.stream().filter(pro->pro.getId().equals(report.getProjectId())).findFirst().get();
+                                String projectName = project.getProjectName();
+                                if (projectName.length() > 3) {
+                                    //只要前三个字
+                                    projectName = projectName.substring(0, 3);
+                                }
+                                if (!StringUtils.isEmpty(content)) {
+                                    if (content.contains(projectName)) {
+                                        findProjectName = true;
+                                        break;
+                                    }
+                                }
+                            }
+                            if (!findProjectName) {
+                                boolean timeMisMatch = false;
+                                //获取合计上班工时数
+                                double sum = dateReport.stream().mapToDouble(Report::getWorkingTime).sum();
+                                //获取考勤打卡时长,并进行校验是否一致
+                                UserCorpwxTime corpwxTime = userCorpwxTimeList.stream().filter(u->u.getCorpwxUserid().equals(creator.getCorpwxUserid()) && u.getCreateDate().equals(date)).findFirst().orElse(null);
+                                if (corpwxTime != null) {
+                                    //校验是否一致
+                                    if (Math.abs(sum - corpwxTime.getWorkHours()) > 0.01) {
+                                        timeMisMatch = true;
+                                    }
+                                } else {
+                                    timeMisMatch = true;
+                                }
+                                if (timeMisMatch) {
+                                    continue;
+                                }
+                                //校验通过,自动审核通过该员工当天的所有日报
+                                updateReportList.addAll(dateReport);
+                            }
+                        }
+                    }
+
+                    if (!updateReportList.isEmpty()) {
+                        reportMapper.update(new Report().setState(1).setProjectAuditTime(LocalDateTime.now()),
+                                new QueryWrapper<Report>().in("id", updateReportList.stream().map(Report::getId).collect(Collectors.toList())));
+                        //日报的审核过程记录
+                        saveApproveReportLog(companyId, updateReportList, user.getId(), user.getName());
+                    }
+
+                }
+            }
+        }
+        return httpRespMsg;
+    }
+
     @Override
     public HttpRespMsg autoApproveReport(String reportIds) {
         //默认按照项目日报审核人的模式进行审核

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

@@ -59,7 +59,7 @@
              , cbd.bonus_value, cbd.total_bonus_value, cbd.ym, cbd.year, cbd.month, cbd.create_by, cbd.create_time
              ,u.name as userName,p.project_name, cbd.is_negative
         from contract_bonus_detail cbd
-                 left join user u on cbd.user_id = u.id
+                 left join user u on cbd.user_id = u.id and u.`company_id` = #{companyId}
                  left join project p on cbd.project_id = p.id
         where cbd.company_id = #{companyId} and cbd.year = #{year}
         <if test="isNegative != null">

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

@@ -846,7 +846,7 @@
 
     <!--新版获取待审核的列表,一次性获取全部 -->
     <select id="getAuditReportList" resultType="java.util.Map">
-        SELECT a.id, user.id as userId,user.corpwx_userid as corpwxUserid, user.name, DATE_FORMAT(a.create_date, '%Y-%m-%d') as date, a.project_id as projectId, b.project_code AS projectCode, b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType,
+        SELECT a.id, user.id as userId,user.corpwx_userid as corpwxUserid, user.name, DATE_FORMAT(a.create_time, '%Y-%m-%d %H:%i') as createTime, DATE_FORMAT(a.create_date, '%Y-%m-%d') as date, a.project_id as projectId, b.project_code AS projectCode, b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType,
         a.cost, a.report_time_type as reportTimeType, a.start_time as startTime, uf.name as fillUserName,
         a.end_time as endTime, b.incharger_id as inchargerId,dept.department_name as departmentName,
         a.creator_id as creatorId, d.name as subProjectName,d.code as subProjectCode,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,

+ 101 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -635,6 +635,107 @@ public class TimeType extends Model<TimeType> {
      */
     @TableField("project_progress_check")
     private Integer projectProgressCheck;
+    /**
+     * 按周审核日报过滤功能,0-不开启,1-开启
+     */
+    @TableField("weekly_charge_filter")
+    private Integer weeklyChargeFilter;
+
+    /**
+     * 对已通过的日报进行撤销操作时是否发送企微消息功能,0-不发送,1-发送
+     */
+    @TableField("report_charge_msg")
+    private Integer reportChargeMsg;
+
+    /**
+     * 项目审核人是自己时自动审核通过
+     */
+    @TableField("auto_project_approve")
+    private Boolean autoProjectApprove;
+
+    /**
+     * 日报定制字段4名称
+     */
+    @TableField("report_extra_field4_name")
+    private String reportExtraField4Name;
+
+    /**
+     * 日报定制字段5名称
+     */
+    @TableField("report_extra_field5_name")
+    private String reportExtraField5Name;
+
+    /**
+     * 审核提醒方式:0-定时提醒,1-实时提醒
+     */
+    @TableField("alert_audit_mode")
+    private Integer alertAuditMode;
+
+    /**
+     * 部门负责人接收抄送提醒
+     */
+    @TableField("cc_dept_manager")
+    private Boolean ccDeptManager;
+
+    /**
+     * 代填不校验考勤
+     */
+    @TableField("not_check_cardtime")
+    private Boolean notCheckCardtime;
+
+    /**
+     * 工时填报隐藏分组
+     */
+    @TableField("hide_group")
+    private Boolean hideGroup;
+
+    /**
+     * 工时填报隐藏工作内容
+     */
+    @TableField("hide_content")
+    private Boolean hideContent;
+
+    /**
+     * 财务分摊二次分配功能
+     */
+    @TableField("finance_twice_assign")
+    private Boolean financeTwiceAssign;
+
+    /**
+     * 通知部门主管上周填报情况
+     */
+    @TableField("notify_last_week_fill")
+    private Boolean notifyLastWeekFill;
+
+    /**
+     * 周几通知上周填报情况
+     */
+    @TableField("notify_last_week_on_weekday")
+    private Integer notifyLastWeekOnWeekday;
+    /**
+     * 日报内是否可以完成任务
+     */
+    @TableField("finish_task_in_report")
+    private Boolean finishTaskInReport;
+
+    /**
+     * 日报内是否可以完成任务
+     */
+    @TableField("is_project_closure")
+    private Integer isProjectClosure;
+
+    /**
+     * 工时录入是否为正常工时
+     */
+    @TableField("time_input_normal")
+    private Boolean timeInputNormal;
+
+
+    /**
+     * 0-按工资时薪倍数,1-按分组设置固定时薪
+     */
+    @TableField("pay_overtime_mode")
+    private Integer payOvertimeMode;
 
     /**
      * 是否开启AI解析功能

Разница между файлами не показана из-за своего большого размера
+ 15 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/TimeTypeMapper.xml


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

@@ -353,6 +353,7 @@ const StringUtil = {
         arr[i] == '负责部门员工假勤数据' ? obj.fictitiousAttendance = true : ''
         arr[i] == '全部员工考勤数据' ? obj.allAttendanceRecord = true : ''
         arr[i] == '负责部门员工考勤数据' ? obj.attendanceRecord = true : ''
+        arr[i] == '额外工时表' ? obj.extraWorkHours = true : ''
         
     }
     return obj

+ 1 - 15
fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue

@@ -432,8 +432,6 @@
         },
         created() {
             this.firstTourFalse = localStorage.getItem('firstTourFalse') || true
-            console.log(this.firstTourFalse, '数据书数据')
-            console.log(localStorage.getItem('firstTourFalse'))
         },
         methods: {
             applicationMarket() {
@@ -453,17 +451,14 @@
                 });
             },
             onSkip(currentStep) {
-                console.log('看看')
                 this.vTourFlg = false
                 this.firstTourFalse = false
                 localStorage.setItem('firstTourFalse', false)
-                console.log(this.user, '用户信息')
                 if(this.user.corpwxUserid != null) {
                     this.getSkipGuidance()
                 }
             },
             onFinish(currentStep) {
-                console.log('数据')
                 this.vTourFlg = false
                 this.firstTourFalse = false
                 localStorage.setItem('firstTourFalse', false)
@@ -827,7 +822,6 @@
                             // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
                                 that.http.post("/wxcorp/getCorpWXAgentConfig", {url: curUrl, token: that.user.id}, (res) => {
                                     if (res.code == "ok") {
-                                    console.log()
                                         wx.agentConfig({
                                             corpid: res.data.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致
                                             agentid: res.data.agentid, // 必填,企业微信的应用id (e.g. 1000247)
@@ -836,19 +830,15 @@
                                             signature: res.data.signature, // 必填,签名,见附录-JS-SDK使用权限签名算法
                                             jsApiList: ['selectExternalContact', 'selectEnterpriseContact', 'openAppManage'], //必填,传入需要使用的接口名称
                                             success: function (result) {
-                                                console.log(result, '请求微信成功')
-                                                console.log(window, 'window')
                                                 //  wx.agentConfig成功回调后,WWOpenData 才会注入到 window 对象上面
                                                 if(window.WWOpenData) {
                                                     window.WWOpenData.bind(document.querySelector('TranslationOpenDataText'))
                                                     if (WWOpenData.initCanvas) {
                                                         WWOpenData.initCanvas()
-                                                        console.log('我企业微信 canvas 应该执行了吧')
                                                     }
                                                 }
                                             },
                                             fail: function (res) {
-                                                console.log('查看错误信息', res)
                                                 if (res.errMsg.indexOf('function not exist') > -1) {
                                                     alert(that.$t('banBenGuoDiQingShengJi'))
                                                 }
@@ -856,7 +846,6 @@
                                         })
                                     }
                                 }, (error) => {
-                                    console.log('查看错误信息' + res)
                                     if (error.errMsg.indexOf('function not exist') > -1) {
                                         alert(that.$t('banBenGuoDiQingShengJi'))
                                     }
@@ -864,7 +853,6 @@
                         });
                     }
                 }, (error) => {
-                    console.log(error, '哦耶')
                 })
             },
 
@@ -949,10 +937,8 @@
                 const ddUrl = new URL(window.location.href);
                 const ddCorpid = ddUrl.searchParams.get("corpid") || ''
                 let ddOpenDataInit = window.DTOpenData.init(ddCorpid)
-                console.log(ddOpenDataInit, '<=== 钉钉执行 window.DTOpenData.init(ddCorpid) 的判断')
                 if (ddOpenDataInit) {
                     setTimeout(() => {
-                        console.log('<==== 执行 window.DTOpenData.update(document.querySelectorAll(dt-open-data))')
                         window.DTOpenData.update(document.querySelectorAll('dt-open-data'));
                     }, 300)
                 }else {
@@ -995,7 +981,7 @@
                 this.$router.push("/login");
             }
 
-            // console.log('啊,我被触发了呀')
+            
             // 获取企业微信参数
             if(this.user.userNameNeedTranslate == '1') {
                 this.agentConfig()

+ 178 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -351,6 +351,12 @@
                   @click="ssl(44)"
                   ><p>员工考勤表</p></el-menu-item
                 >
+                <el-menu-item
+                  index="1-45"
+                  v-if="permissions.extraWorkHours"
+                  @click="ssl(45)"
+                  ><p>额外工时表</p></el-menu-item
+                >
                 <!-- <el-menu-item index="1-45" v-if="permissions.engineeringProgress" @click="ssl(42)"><p>施工进度表</p></el-menu-item> -->
               </el-submenu>
             </el-menu>
@@ -6649,6 +6655,127 @@
                 </el-table>
               </div>
             </template>
+            <!-- 额外工时表 -->
+            <template v-if="ins == 45">
+              <el-table
+                key="45"
+                border
+                :data="extraWorkHoursList"
+                highlight-current-row
+                v-loading="extraWorkHoursLoading"
+                :height="+tableHeight"
+                style="width: 100%"
+                :max-height="+tableHeight + 50"
+              >
+                <el-table-column
+                  prop="name"
+                  align="center"
+                  label="人员"
+                  width="120"
+                >
+                  <template slot-scope="scope">
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <TranslationOpenDataText
+                        type="userName"
+                        :openid="scope.row.name"
+                      ></TranslationOpenDataText>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{ scope.row.name }}
+                    </span>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  prop="departmentName"
+                  align="center"
+                  label="所属部门"
+                  width="150"
+                >
+                  <template slot-scope="scope">
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <TranslationOpenDataText
+                        type="departmentName"
+                        :openid="scope.row.departmentName"
+                      ></TranslationOpenDataText>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{ scope.row.departmentName }}
+                    </span>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  prop="currentMonthOvertime"
+                  align="center"
+                  label="本月加班工时(h)"
+                  min-width="130"
+                >
+                  <template slot-scope="scope">
+                    {{
+                      scope.row.currentMonthOvertime != null
+                        ? (+scope.row.currentMonthOvertime).toFixed(1)
+                        : "0.0"
+                    }}
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  prop="totalOvertime"
+                  align="center"
+                  label="累计加班工时(h)"
+                  min-width="130"
+                >
+                  <template slot-scope="scope">
+                    {{
+                      scope.row.totalOvertime != null
+                        ? (+scope.row.totalOvertime).toFixed(1)
+                        : "0.0"
+                    }}
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  prop="currentMonthLeavetime"
+                  align="center"
+                  label="本月调休工时(h)"
+                  min-width="130"
+                >
+                  <template slot-scope="scope">
+                    {{
+                      scope.row.currentMonthLeavetime != null
+                        ? (+scope.row.currentMonthLeavetime).toFixed(1)
+                        : "0.0"
+                    }}
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  prop="totalLeavetime"
+                  align="center"
+                  label="累计调休工时(h)"
+                  min-width="130"
+                >
+                  <template slot-scope="scope">
+                    {{
+                      scope.row.totalLeavetime != null
+                        ? (+scope.row.totalLeavetime).toFixed(1)
+                        : "0.0"
+                    }}
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  align="center"
+                  label="剩余调休工时(h)"
+                  min-width="130"
+                >
+                  <template slot-scope="scope">
+                    {{
+                      (
+                        (+scope.row.totalOvertime || 0) -
+                        (+scope.row.totalLeavetime || 0)
+                      ).toFixed(1)
+                    }}
+                  </template>
+                </el-table-column>
+              </el-table>
+            </template>
+
             <!--工具条-->
             <el-col
               :span="24"
@@ -6667,7 +6794,8 @@
                 ins != 33 &&
                 ins != 40 &&
                 ins != 41 &&
-                ins != 42
+                ins != 42 &&
+                ins != 45
               "
             >
               <el-pagination
@@ -7500,17 +7628,17 @@ export default {
         // 筛选条件的判断
         project: [
           4, 8, 9, 10, 11, 14, 15, 17, 19, 20, 21, 22, 28, 30, 31, 34, 35, 36,
-          37, 38, 40, 41, 42, 43, 44,
+          37, 38, 40, 41, 42, 43, 44, 45,
         ], // 项目筛选条件 (不等于)
         months: [14, 15, 43, 44], // 月份筛选条件 (等于)
         monthRange: [19, 30], // 月份区间筛选条件 (等于)
         staff: [
-          6, 8, 9, 19, 11, 14, 18, 23, 25, 26, 28, 30, 32, 35, 36, 37, 38, 39,
+          6, 8, 9, 19, 11, 14, 18, 23, 25, 26, 28, 30, 32, 35, 36, 37, 38, 39, 45,
         ], // 人员筛选条件 (等于)
-        departments: [14, 15, 23, 21, 26, 28, 19, 30, 36, 37, 38], // 部门筛选条件 (等于)
+        departments: [14, 15, 23, 21, 26, 28, 19, 30, 36, 37, 38, 45], // 部门筛选条件 (等于)
         timePeriod: [
           5, 6, 8, 9, 10, 11, 12, 16, 17, 18, 20, 21, 22, 24, 25, 26, 28, 34,
-          35, 36, 37, 38, 39, 40, 41,
+          35, 36, 37, 38, 39, 40, 41, 45,
         ], // 时间段筛选条件 (等于)
       },
       efficentList: [],
@@ -7597,7 +7725,7 @@ export default {
       z: null,
       value: null,
       dialog: false, // 单据查看展示
-      shuz: [
+        shuz: [
         this.$t("projectreport"),
         this.$t("projectTaskReport"),
         this.$t("projectcoststatement"),
@@ -7643,6 +7771,7 @@ export default {
         "施工进度表",
         "员工假勤表",
         "员工考勤表",
+        "额外工时表",
       ],
 
       shuzArr: [
@@ -7691,6 +7820,7 @@ export default {
         "施工进度表",
         "员工假勤表",
         "员工考勤表",
+        "额外工时表",
       ],
 
       ins: 10000,
@@ -7963,6 +8093,10 @@ export default {
       constructionStageLoading: false,
       constructionStageClassificationId: "", // 施工进度表一级工程分类筛选
       constructionStageClassificationList: [], // 施工进度表一级工程分类列表
+
+      // 额外工时表
+      extraWorkHoursList: [],
+      extraWorkHoursLoading: false,
     };
   },
   computed: {},
@@ -8927,6 +9061,9 @@ export default {
       if (this.ins == 42) {
         this.getConstructionStage();
       }
+      if (this.ins == 45) {
+        this.getExtraWorkHours();
+      }
     },
     exportExcel() {
       var url = "/project";
@@ -9349,6 +9486,18 @@ export default {
         if (this.constructionStageClassificationId) {
           sl.classificationId = this.constructionStageClassificationId;
         }
+      } else if (this.ins == 45) {
+        fName = `额外工时表.xlsx`;
+        url = `/report/exportExtraWorkHoursList`;
+        sl.startDate = this.rangeDatas[0];
+        sl.endDate = this.rangeDatas[1];
+        if (this.userId) {
+          sl.userId = this.userId;
+        }
+        if (this.departmentIdArray.length != 0) {
+          sl.departmentId =
+            this.departmentIdArray[this.departmentIdArray.length - 1];
+        }
       }
       this.exportReportLoading = true;
       this.http.post(
@@ -12367,6 +12516,29 @@ export default {
       };
     },
 
+    // 获取额外工时表
+    getExtraWorkHours() {
+      this.extraWorkHoursLoading = true;
+      let parameter = {
+        startDate: this.rangeDatas[0],
+        endDate: this.rangeDatas[1],
+      };
+      if (this.userId) {
+        parameter.userId = this.userId;
+      }
+      if (this.departmentIdArray.length != 0) {
+        parameter.departmentId =
+          this.departmentIdArray[this.departmentIdArray.length - 1];
+      }
+      this.postData(`/report/getExtraWorkHoursList`, parameter)
+        .then((res) => {
+          this.extraWorkHoursList = Array.isArray(res.data) ? res.data : (res.data.records || res.data.list || []);
+        })
+        .finally(() => {
+          this.extraWorkHoursLoading = false;
+        });
+    },
+
     // 获取施工进度表
     getConstructionStage() {
       this.constructionStageLoading = true;

+ 5 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/financeComponents/incomeDetail.vue

@@ -382,6 +382,8 @@ export default {
       if(this.exportIsNegative) {
         formVal.isNegative = this.exportIsNegative
       }
+      this.dataExportLoading = true;
+      var that = this;
       this.http.downloadFile('/contractBonusDetail/exportContractBonus', {
         year: this.selectYear,
         ...formVal
@@ -390,6 +392,9 @@ export default {
           message: err,
           type: 'error'
         })
+        this.dataExportLoading = false
+      }, () => {
+        this.dataExportLoading = false
       })
     },
     bonusDataExport() {

Разница между файлами не показана из-за своего большого размера
+ 307 - 298
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue


+ 109 - 109
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/dailyReportReview.vue

@@ -4,16 +4,16 @@
       <div class="reviewTop">
           <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
               <el-form :inline="true">
-                  <el-form-item :label="'部门'" style="width: 165px">
-                      <el-cascader v-if="user.userNameNeedTranslate != 1" v-model="search.departmentIdArray" :placeholder="'请选择'" style="width: 125px"
+                  <el-form-item :label="$t('lable.department')" style="width: 165px">
+                      <el-cascader v-if="user.userNameNeedTranslate != 1" v-model="search.departmentIdArray" :placeholder="$t('defaultText.pleaseChoose')" style="width: 125px"
                       :options="option" :props="{ checkStrictly: false,expandTrigger: 'hover' }" :show-all-levels="false" clearable
                       @change="getList(1)" size="mini"></el-cascader>
 
                       <vueCascader :size="'mini'" :widthStr="'125'" :clearable="true" :subject="option" :radios="false" :distinction="'1'" @vueCasader="vueCasader" v-if="user.userNameNeedTranslate == 1"></vueCascader>
                   </el-form-item>
 
-                  <el-form-item :label="'填报人'" style="width: 210px">
-                      <el-select v-if="user.userNameNeedTranslate != '1'" v-model="search.userIdArray" :placeholder="'请选择'" clearable @visible-change="usersSearch" @remove-tag="usersSearch(false)" @clear="usersSearch(false)" filterable="true" size="mini" style="width: 150px" multiple collapse-tags>
+                  <el-form-item :label="$t('tian-bao-ren')" style="width: 210px">
+                      <el-select v-if="user.userNameNeedTranslate != '1'" v-model="search.userIdArray" :placeholder="$t('defaultText.pleaseChoose')" clearable @visible-change="usersSearch" @remove-tag="usersSearch(false)" @clear="usersSearch(false)" filterable="true" size="mini" style="width: 150px" multiple collapse-tags>
                           <el-option v-for="item in searchUsersList" :key="item.id" :label="item.name" :value="item.id">
                               <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
                               <span style="float: left" v-if="user.userNameNeedTranslate != '1'">{{item.name}}</span>
@@ -24,8 +24,8 @@
                       <!-- <selectCat :size="'size'" :subject="searchUsersList" :clearable="true" :filterable="true" @selectCal="selectCal"></selectCat> -->
                   </el-form-item>
 
-                  <el-form-item :label="'审核人'" style="width: 210px">
-                      <el-select v-if="user.userNameNeedTranslate != '1'" v-model="search.auditUserId" :filterable="true" :placeholder="'请选择'" clearable @change="usersSearch(false)" size="mini" style="width: 150px" collapse-tags>
+                  <el-form-item :label="$t('other.reviewer')" style="width: 210px">
+                      <el-select v-if="user.userNameNeedTranslate != '1'" v-model="search.auditUserId" :filterable="true" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="usersSearch(false)" size="mini" style="width: 150px" collapse-tags>
                           <el-option v-for="item in searchUsersList" :key="item.id" :label="item.name" :value="item.id">
                               <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
                               <span style="float: left" v-if="user.userNameNeedTranslate != '1'">{{item.name}}</span>
@@ -35,8 +35,8 @@
                       <selectCat v-if="user.userNameNeedTranslate == '1'" :filterable="true" :size="'size'" :subject="searchUsersList" :clearable="true" :distinction="'2'" @selectCal="selectCal"></selectCat>
                   </el-form-item>
 
-                  <el-form-item :label="'项目'" style="width: 215px">
-                      <el-select v-model="search.projectId" :placeholder="'请选择'" clearable @change="getList()" filterable="true" size="mini" style="width: 175px" popper-class="projectSelectPopperClass">
+                  <el-form-item :label="$t('other.project')" style="width: 215px">
+                      <el-select v-model="search.projectId" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="getList()" filterable="true" size="mini" style="width: 175px" popper-class="projectSelectPopperClass">
                           <el-option v-for="item in projectList" :key="item.id" :label="item.projectName + item.projectCode" :value="item.id">
                               <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
                               <span style="float: right;font-size: 13px;">{{ item.projectName }}</span>
@@ -49,25 +49,25 @@
                   </el-form-item> -->
                   <!-- <div> -->
                       
-                      <el-form-item :label="'日期'">
+                      <el-form-item :label="$t('weekDay.date')">
                           <!-- <el-date-picker v-model="search.date" :editable="false" format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
                           @change="getList()" :clearable="true" type="date" placeholder="选择工作日期"></el-date-picker> -->
                           <el-date-picker
                               v-model="dataTime"
                               type="daterange"
-                              :range-separator="'至'"
-                              :start-placeholder="'开始日期'"
-                              :end-placeholder="'结束日期'"
+                              :range-separator="$t('other.to')"
+                              :start-placeholder="$t('time.startDate')"
+                              :end-placeholder="$t('time.endDate')"
                               format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="dataTimes()" size="mini">
                           </el-date-picker>
                       </el-form-item>
 
                       <el-form-item   style="margin-left:20px;">
-                          <el-button @click="batchApprove(true)" style="margin-left:10px;" :loading="batchApproveLoading" :disabled="multipleSelection.length==0" size="mini">{{ '批量通过' }}</el-button>
-                          <el-button @click="batchApprove(false)"   :disabled="multipleSelection.length==0" size="mini">{{ '批量驳回' }}</el-button>
+                          <el-button @click="batchApprove(true)" style="margin-left:10px;" :loading="batchApproveLoading" :disabled="multipleSelection.length==0" size="mini">{{ $t('Batchthrough') }}</el-button>
+                          <el-button @click="batchApprove(false)"   :disabled="multipleSelection.length==0" size="mini">{{ $t('Batchrejected') }}</el-button>
                       </el-form-item>
                       <el-form-item style="margin-left:20px;">
-                      <el-link type="primary" @click="recordList(),recordDialogVisible = true,pageIndexList = 1,pageSizeList = 20">{{ '审核记录' }}</el-link>
+                      <el-link type="primary" @click="recordList(),recordDialogVisible = true,pageIndexList = 1,pageSizeList = 20">{{ $t('Auditrecords') }}</el-link>
                       </el-form-item>
                       <el-form-item style="margin-left:20px;" v-if="user.companyId == 469">
                       <el-link type="primary" @click="exportListByState" :loading="exportLoading">导出待审核日报</el-link>
@@ -99,104 +99,104 @@
                           </div>
                           <el-timeline-item v-for="(item,index) in props.row.data" :key="index">
                               <el-card shadow="never">
-                                  <p>{{ '项目' + ':' }}<b>{{item.projectCode+'/'+item.project}}<span v-if="item.subProjectName != null"> / {{item.subProjectName}}</span>
+                                  <p>{{ $t('other.project') + ':' }}<b>{{item.projectCode+'/'+item.project}}<span v-if="item.subProjectName != null"> / {{item.subProjectName}}</span>
                                   <span style="margin-left:15px;color:#DAA520;" >[ 
                                       <span v-if="user.timeType.reportAuditType == 7">
-                                          {{'审核人'}}:<TranslationOpenData :configurationItems="{ openType: 'userName', openId: item.projectAuditorName, renderIndex: 0 }" /><span v-if="item.projectAuditState==1">√</span>
+                                          {{$t('other.reviewer')}}:<TranslationOpenData :configurationItems="{ openType: 'userName', openId: item.projectAuditorName, renderIndex: 0 }" /><span v-if="item.projectAuditState==1">√</span>
                                           <span v-if="item.deptAuditorName">、</span>
                                           <TranslationOpenData :configurationItems="{ openType: 'userName', openId: item.deptAuditorName, renderIndex: 0 }" /><span v-if="item.departmentAuditState==1">√</span>
                                       </span>
                                       <span v-else>
                                           <span v-if="item.isDeptAudit==0">
                                               <span v-if="item.projectAuditState==0">
-                                                  {{ user.companyId == 469?"待部门主管":'待项目审核人' }}<span v-if="item.projectAuditorName != null">(
+                                                  {{ user.companyId == 469?"待部门主管":$t('other.waitForTheProjectReviewer') }}<span v-if="item.projectAuditorName != null">(
                                                       <!-- {{item.projectAuditorName}} -->
                                                       <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.projectAuditorName'></TranslationOpenDataText></span>
                                                       <span v-if="user.userNameNeedTranslate != '1'">{{item.projectAuditorName}}</span>
-                                                      )</span>{{ '审核' }}
+                                                      )</span>{{ $t('other.audit') }}
                                               </span>
                                               <span style="color:#32CD32;" v-else-if="item.projectAuditState==1">
-                                                  {{ user.companyId == 469?"待部门主管":'项目审核人' }}<span v-if="item.projectAuditorName != null">(
+                                                  {{ user.companyId == 469?"待部门主管":$t('other.projectAuditor') }}<span v-if="item.projectAuditorName != null">(
                                                       <!-- {{item.projectAuditorName}} -->
                                                       <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.projectAuditorName'></TranslationOpenDataText></span>
                                                       <span v-if="user.userNameNeedTranslate != '1'">{{item.projectAuditorName}}</span>
-                                                  )</span>{{ '审核通过' }}
+                                                  )</span>{{ $t('state.approved') }}
                                               </span>
                                           </span>
                                           <span v-else-if="item.isDeptAudit==1">
-                                              <!-- {{('待' +item.auditDeptName+('('+item.deptAuditorName+')')+ '审核')}} -->
-                                              ({{'待'}}
+                                              <!-- {{($t('other.await') +item.auditDeptName+('('+item.deptAuditorName+')')+ $t('other.audit'))}} -->
+                                              ({{$t('other.await')}}
                                               <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='item.auditDeptName'></TranslationOpenDataText></span>
                                               <span v-if="user.userNameNeedTranslate != '1'">{{item.auditDeptName}}</span>
                                               (<span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.deptAuditorName'></TranslationOpenDataText></span>
                                               <span v-if="user.userNameNeedTranslate != '1'">{{item.deptAuditorName}}</span>)
-                                              {{'审核'}})
+                                              {{$t('other.audit')}})
                                           </span>
                                       </span>]
                                   </span>
                                   </b></p>
-                                  <p v-if="user.timeType.reportAuditType == 6" >{{ '审核流程:' }}<span v-if="item.auditorList && item.auditorList.length == 1">{{ '一层审核' }}(<span class="themeFontColor">{{ item.auditorList[0].name }}</span>)</span>
-                                  <span v-if="item.auditorList && item.auditorList.length == 2">{{ '两层审核' }}(<span class="themeFontColor">{{ item.auditorList[0].name }}->{{ item.auditorList[1].name }}</span>)</span>
-                                  <el-button size="small" @click="viewOneReport(item)" v-if="!item.auditorList">{{ '查看' }}</el-button>
+                                  <p v-if="user.timeType.reportAuditType == 6" >{{ $t('shenHeLiuCheng') }}<span v-if="item.auditorList && item.auditorList.length == 1">{{ $t('yiCengShenHe') }}(<span class="themeFontColor">{{ item.auditorList[0].name }}</span>)</span>
+                                  <span v-if="item.auditorList && item.auditorList.length == 2">{{ $t('liangCengShenHe') }}(<span class="themeFontColor">{{ item.auditorList[0].name }}->{{ item.auditorList[1].name }}</span>)</span>
+                                  <el-button size="small" @click="viewOneReport(item)" v-if="!item.auditorList">{{ $t('cha-kan') }}</el-button>
                                   </p>
                                   <p v-if="user.timeType.customDegreeActive==1 && (item.degree_id != null || item.multiDegrId != '[]')">{{user.timeType.customDegreeName}}:{{item.degreeName}}</p>
                                   <p v-if="user.timeType.customDataActive==1">{{user.timeType.customDataName}}:{{item.customData}}</p>
                                   <p v-if="user.timeType.customTextActive==1">{{user.timeType.customTextName}}:{{item.customText}}</p>
                                   <p v-if="user.company.packageEngineering == 1">
-                                      {{ '专业进度' +':'}} <span style="margin-right:10px;" v-for="progressItem in item.professionProgressList" :key="progressItem.id">
+                                      {{ $t('other.professionalProgress') +':'}} <span style="margin-right:10px;" v-for="progressItem in item.professionProgressList" :key="progressItem.id">
                                           {{progressItem.professionName}}({{progressItem.progress}}%)
-                                          <el-tooltip v-if="progressItem.auditState == 0"  :content="'待审核'" effect="light" placement="top">
+                                          <el-tooltip v-if="progressItem.auditState == 0"  :content="$t('state.WaitingAudit')" effect="light" placement="top">
                                           <i class="iconfont firerock-icondaibandengdaishenhe"></i>
                                           </el-tooltip>
-                                          <el-tooltip v-if="progressItem.auditState == 1" :content="'已通过'" effect="light" placement="top">
+                                          <el-tooltip v-if="progressItem.auditState == 1" :content="$t('state.alreadyPassed')" effect="light" placement="top">
                                           <i  class="iconfont firerock-iconshenhetongguo"></i>
                                           </el-tooltip>
-                                          <el-tooltip v-if="progressItem.auditState == 2" :content="'不通过'" effect="light" placement="top">
+                                          <el-tooltip v-if="progressItem.auditState == 2" :content="$t('state.notThrough')" effect="light" placement="top">
                                           <i  class="iconfont firerock-iconshenhebohui"></i>
                                           </el-tooltip>
                                           </span> 
                                   </p>
                                   <p v-if="user.companyId == yuzhongCompId">
-                                                          <span>{{ '角色' }}:{{item.extraField1? roleList.filter(r=>r.value == item.extraField1)[0].label:''}}</span>
-                                                      <span style="margin-left:10px;">{{ '工作职责' }}:{{ item.extraField2? item.extraField2Name:''}}</span>
-                                                      <span style="margin-left:10px;">{{ '工作内容' }}:{{ item.extraField3? item.extraField3Name:''}}</span></p>
+                                                          <span>{{ $t('jiao-se') }}:{{item.extraField1? roleList.filter(r=>r.value == item.extraField1)[0].label:''}}</span>
+                                                      <span style="margin-left:10px;">{{ $t('gongZuoZhiZe') }}:{{ item.extraField2? item.extraField2Name:''}}</span>
+                                                      <span style="margin-left:10px;">{{ $t('gongZuoNeiRong') }}:{{ item.extraField3? item.extraField3Name:''}}</span></p>
                                   <p v-if="(user.companyId == 4811) && item.constructionStageStr">
                                         <span>施工分项工程 :{{item.constructionStageStr}}</span>
                                   </p>
-                                  <p v-if="item.taskId != null">{{'任务'}}:{{item.taskName}}
-                                      <span style="margin-left:10px;" v-if="user.companyId==3092">-- {{ '服务' }}:{{ item.sapServiceName }}</span></p>
+                                  <p v-if="item.taskId != null">{{$t('other.task')}}:{{item.taskName}}
+                                      <span style="margin-left:10px;" v-if="user.companyId==3092">-- {{ $t('fuWu') }}:{{ item.sapServiceName }}</span></p>
                                   <p v-if="item.groupId">
-                                      <span>{{'任务分组'}}:{{item.groupName}}</span>
+                                      <span>{{$t('other.taskGroup')}}:{{item.groupName}}</span>
                                       <!-- 阶段 -->
-                                      <span v-if="item.stage != null && user.companyId != yuzhongCompId" style="margin-left:10px;"> {{'投入阶段'}}:{{item.stage}}</span>
+                                      <span v-if="item.stage != null && user.companyId != yuzhongCompId" style="margin-left:10px;"> {{$t('other.inputStage')}}:{{item.stage}}</span>
                                   </p>
                                   <!-- 工单号,行号 -->
                                   <p v-if="user.timeType.reportExtraField4Name">{{ user.timeType.reportExtraField4Name }}: {{ item.extraField4 }}</p>
                                   <p v-if="user.timeType.reportExtraField5Name">{{ user.timeType.reportExtraField5Name }}: {{ item.extraField5 }}</p>
                                   <p v-if="user.company.companyName == '成都明夷电子科技有限公司'">
-                                      <span>{{ '用时占比' }} :{{ item.progress }}%</span>
+                                      <span>{{ $t('lable.percentageOfTime') }} :{{ item.progress }}%</span>
                                   </p>
                                   <p v-else>
-                                      <span v-if="item.multiWorktime==1">{{ '项目' }}</span>
-                                      <span>{{'时长'}}:</span>
+                                      <span v-if="item.multiWorktime==1">{{ $t('other.project') }}</span>
+                                      <span>{{$t('time.duration')}}:</span>
                                       <span v-if="item.startTime">{{ item.startTime + '-' + item.endTime }}</span>
                                       <span>{{item.time.toFixed(2)}}h </span>
                                       <span class="propsbtn" v-if="item.isOvertime === 1">
-                                      <el-tag type="danger" size="mini" style="margin-left: 65px">{{ '加班' }}<span v-if="item.overtimeHours">{{item.overtimeHours.toFixed(1)}}{{'小时'}}</span></el-tag></span>
+                                      <el-tag type="danger" size="mini" style="margin-left: 65px">{{ $t('other.WorkOvertime') }}<span v-if="item.overtimeHours">{{item.overtimeHours.toFixed(1)}}{{$t('time.hour')}}</span></el-tag></span>
                                   </p>
 
                                   <div v-if="item.multiWorktime==0">
-                                  <p v-if="!user.timeType.hideContent">{{ '工作内容' }}:<span v-html="formatContent(item.content)"></span></p>
+                                  <p v-if="!user.timeType.hideContent">{{ $t('other.matters') }}:<span v-html="formatContent(item.content)"></span></p>
                                   </div>
                                   <div v-if="item.multiWorktime==1" >
                                       <div v-for="(timeItem, tIndex) in item.worktimeList" :key="tIndex"
                                           style="border: 0.5px #ddd solid;margin:5px 0px;padding:5px; ">
-                                          <p style="line-height:20px;margin:5px 0px;">{{'时长'}}:
+                                          <p style="line-height:20px;margin:5px 0px;">{{$t('time.duration')}}:
                                               <span v-if="item.reportTimeType == 2" style="margin-right:10px;">{{timeItem.startTime+'-'+timeItem.endTime}}</span>
                                           {{timeItem.time.toFixed(1)}}h  
                                           <span v-if="timeItem.detail" style="margin-left:10px;"> {{timeItem.detail}} </span>
                                           </p>
-                                          <p style="line-height:20px;margin:5px 0px;" v-if="!user.timeType.hideContent">{{ '工作内容' }}:<span v-html="formatContent(timeItem.content)"></span></p>
+                                          <p style="line-height:20px;margin:5px 0px;" v-if="!user.timeType.hideContent">{{ $t('other.matters') }}:<span v-html="formatContent(timeItem.content)"></span></p>
                                       </div>
                                   </div>
 
@@ -214,7 +214,7 @@
                   </template>
               </el-table-column>
               
-              <el-table-column prop="name" :label="'姓名'" sortable>
+              <el-table-column prop="name" :label="$t('lable.name')" sortable>
                   <template slot-scope="scope">
                       <div>
                           <span v-if="user.userNameNeedTranslate == '1'">
@@ -226,7 +226,7 @@
                       </div>
                   </template>
               </el-table-column>
-              <el-table-column prop="departmentName" :label="'部门'" sortable>
+              <el-table-column prop="departmentName" :label="$t('lable.department')" sortable>
                   <template slot-scope="scope">
                       <div>
                           <span v-if="user.userNameNeedTranslate == '1'">
@@ -238,12 +238,12 @@
                       </div>
                   </template>
               </el-table-column>
-              <el-table-column prop="dateStr" :label="'日期'" sortable>
+              <el-table-column prop="dateStr" :label="$t('weekDay.date')" sortable>
                 <template slot-scope="scope">
                     {{scope.row.dateStr}} &nbsp; &nbsp; <el-tag v-if="!scope.row.isWorkDay">休</el-tag>
                 </template>
               </el-table-column>
-              <el-table-column prop="reportTime" :label="'工作时长' + '(h)'" v-if="user.companyId != 469">
+              <el-table-column prop="reportTime" :label="$t('screening.workTime') + '(h)'" v-if="user.companyId != 469">
                   <template slot-scope="scope">
                       {{scope.row.reportTime | amounts}}
                   </template>
@@ -253,7 +253,7 @@
                       <span :style="scope.row.abnormalTime?'color:red':''">{{scope.row.abnormalName}}</span>
                   </template>
               </el-table-column>
-              <el-table-column width="320" prop="cardHours" :label="'考勤时长' + '(h)'" v-if="user.timeType.showCorpwxCardtime==1||user.timeType.showDdCardtime==1 || user.timeType.syncFanwei==1">
+              <el-table-column width="320" prop="cardHours" :label="$t('workAttendance') + '(h)'" v-if="user.timeType.showCorpwxCardtime==1||user.timeType.showDdCardtime==1 || user.timeType.syncFanwei==1">
                   <template slot-scope="scope">
                     <div style="display: flex;align-items: center;">
                         <span v-if="scope.row.cardHours" :style="scope.row.cardHours != scope.row.reportTime?'color:red':''">
@@ -297,61 +297,61 @@
                       </div>
                   </template>
               </el-table-column>
-              <el-table-column prop="state" :label="'状态'" sortable width="200">
+              <el-table-column prop="state" :label="$t('state.states')" sortable width="200">
                   <template slot-scope="scope">
                       <span v-if="scope.row.state == 0" style="color:#DAA520;">
-                          <span v-if="user.timeType.reportAuditType == 7">{{ '待审核' }}</span>
+                          <span v-if="user.timeType.reportAuditType == 7">{{ $t('state.WaitingAudit') }}</span>
                           <span v-else>
                               <span v-if="user.userNameNeedTranslate != '1'">
                                   <span v-if="user.company.companyName != '成都明夷电子科技有限公司'">
-                                      <!-- {{scope.row.isDeptAudit==0?'待项目审核人审核':('待'+scope.row.auditDeptName+('('+scope.row.deptAuditorName+')')+'审核')}} -->
+                                      <!-- {{scope.row.isDeptAudit==0?$t('other.Tobereviewedbytheprojectreviewer'):($t('other.await')+scope.row.auditDeptName+('('+scope.row.deptAuditorName+')')+$t('other.audit'))}} -->
                                       <span v-if="scope.row.isDeptAudit==0">
                                           <span>
-                                              {{ user.companyId == 469?"待部门主管":'待项目审核人' }}<span>(
+                                              {{ user.companyId == 469?"待部门主管":$t('other.waitForTheProjectReviewer') }}<span>(
                                                   <template v-for="(auditItem, auditindexs) in (scope.row.reviewerNames || [])">
                                                       <TranslationOpenDataText type='userName' :openid='auditItem'></TranslationOpenDataText>
                                                       <span v-if="auditindexs < scope.row.reviewerNames.length-1">,</span>
                                                   </template>
-                                                  )</span>{{ '审核' }}
+                                                  )</span>{{ $t('other.audit') }}
                                           </span>
                                       </span>
                                       <span v-else>
-                                          {{ ('待'+scope.row.auditDeptName+('('+scope.row.deptAuditorName+')')+'审核') }}
+                                          {{ ($t('other.await')+scope.row.auditDeptName+('('+scope.row.deptAuditorName+')')+$t('other.audit')) }}
                                       </span>
                                   </span>
                                   <span v-else>
-                                      {{ '待审核' }}
+                                      {{ $t('state.WaitingAudit') }}
                                   </span>
                               </span>
                               <span v-if="user.userNameNeedTranslate == '1'">
-                                  <!-- <span v-if="scope.row.isDeptAudit==0">{{'待项目审核人审核'}}</span> -->
+                                  <!-- <span v-if="scope.row.isDeptAudit==0">{{$t('other.Tobereviewedbytheprojectreviewer')}}</span> -->
                                    <span v-if="scope.row.isDeptAudit==0">
                                       <span>
-                                          {{ user.companyId == 469?"待部门主管":'待项目审核人' }}<span>(
+                                          {{ user.companyId == 469?"待部门主管":$t('other.waitForTheProjectReviewer') }}<span>(
                                               <template v-for="(auditItem, auditindexs) in (scope.row.reviewerNames || [])">
                                                   <TranslationOpenDataText type='userName' :openid='auditItem'></TranslationOpenDataText>
                                                   <span v-if="auditindexs < scope.row.reviewerNames.length-1">,</span>
                                               </template>
-                                              )</span>{{ '审核' }}
+                                              )</span>{{ $t('other.audit') }}
                                       </span>
                                    </span>
                                   <span v-else>
-                                      {{'待'}}
+                                      {{$t('other.await')}}
                                       <TranslationOpenDataText type='departmentName' :openid='scope.row.auditDeptName'></TranslationOpenDataText>
                                       (<TranslationOpenDataText type='userName' :openid='scope.row.deptAuditorName'></TranslationOpenDataText>)
-                                      {{'审核'}}
+                                      {{$t('other.audit')}}
                                   </span>
                               </span>
                           </span>
                       </span>
-                      <span v-else-if="scope.row.state == 1" style="color:#32CD32;">{{ '已通过' }}</span>
-                      <span v-else-if="scope.row.state == 2" style="color:#FF0000;">{{ '已驳回' }}</span>
+                      <span v-else-if="scope.row.state == 1" style="color:#32CD32;">{{ $t('state.alreadyPassed') }}</span>
+                      <span v-else-if="scope.row.state == 2" style="color:#FF0000;">{{ $t('state.rejected') }}</span>
                   </template>
               </el-table-column>
-              <el-table-column :label="'操作'" width="220">
+              <el-table-column :label="$t('operation')" width="220">
                   <template slot-scope="scope">
-                      <el-button type="primary" :loading="logining" size="small" @click="approve(scope.row.id,scope.row.date, scope.row)">{{ '通过' }}</el-button>
-                      <el-button type="danger" :loading="logining" size="small" @click="showDenyDialog(scope.row.id,0,scope.row.dateStr, scope.row)">{{ '驳回' }}</el-button>
+                      <el-button type="primary" :loading="logining" size="small" @click="approve(scope.row.id,scope.row.date, scope.row)">{{ $t('btn.through') }}</el-button>
+                      <el-button type="danger" :loading="logining" size="small" @click="showDenyDialog(scope.row.id,0,scope.row.dateStr, scope.row)">{{ $t('btn.rejected') }}</el-button>
                   </template>
               </el-table-column>
           </el-table>
@@ -370,23 +370,23 @@
           >
           </el-pagination>
       </div>        <!--驳回弹出框 -->
-      <el-dialog :title="'请输入原因'"  v-if="denyReasonDialog" :visible.sync="denyReasonDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+      <el-dialog :title="$t('defaultText.pleaseEnterTheReason')"  v-if="denyReasonDialog" :visible.sync="denyReasonDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
           <div>
-              <span style="color:red;">*</span><el-input type="textarea" v-model="denyForm.reason" rows="2" :placeholder="'请输入您决定'+(denyForm.i==0?'驳回':'撤销')+'原因'" />
+              <span style="color:red;">*</span><el-input type="textarea" v-model="denyForm.reason" rows="2" :placeholder="$t('defaultText.pleaseEnterYourDecision')+(denyForm.i==0?$t('btn.rejected'):$t('btn.undo'))+$t('other.reason')" />
           </div>
           <div slot="footer" class="dialog-footer">
-              <el-button  @click="denyReasonDialog = false" >{{ '取消' }}</el-button>
-              <el-button type="primary" @click="deny()" :disabled="user.timeType.forceRejectReason && !denyForm.reason">{{ '确定' }}</el-button>
+              <el-button  @click="denyReasonDialog = false" >{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="deny()" :disabled="user.timeType.forceRejectReason && !denyForm.reason">{{ $t('btn.determine') }}</el-button>
           </div>
       </el-dialog>
       <!--批量驳回弹出框 -->
-      <el-dialog :title="'请输入原因'"  v-if="batchDenyDialog" :visible.sync="batchDenyDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+      <el-dialog :title="$t('defaultText.pleaseEnterTheReason')"  v-if="batchDenyDialog" :visible.sync="batchDenyDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
           <div>
-              <span style="color:red;">*</span><el-input type="textarea" v-model="batchDenyData.reason" rows="2" :placeholder="'请输入您决定驳回的原因'" />
+              <span style="color:red;">*</span><el-input type="textarea" v-model="batchDenyData.reason" rows="2" :placeholder="$t('reasonforyourdecisiontoreject')" />
           </div>
           <div slot="footer" class="dialog-footer">
-              <el-button  @click="batchDenyDialog = false" >{{ '取消' }}</el-button>
-              <el-button type="primary" @click="batchDenyClick()" :loading="batchDenyLoading" :disabled="user.timeType.forceRejectReason && !batchDenyData.reason">{{ '确定' }}</el-button>
+              <el-button  @click="batchDenyDialog = false" >{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="batchDenyClick()" :loading="batchDenyLoading" :disabled="user.timeType.forceRejectReason && !batchDenyData.reason">{{ $t('btn.determine') }}</el-button>
           </div>
       </el-dialog>
       <!--工具条-->
@@ -404,10 +404,10 @@
 
       
       <!-- 审核记录弹窗 -->
-      <el-dialog :title="'审核记录'" :visible.sync="recordDialogVisible" width="1200px" :before-close="handleClose">
+      <el-dialog :title="$t('Auditrecords')" :visible.sync="recordDialogVisible" width="1200px" :before-close="handleClose">
           <div style="height: 430px">
               <el-table :data="recordLists" style="width: 100%" height="400">
-                  <el-table-column prop="userName" :label="'操作人'" width="120">
+                  <el-table-column prop="userName" :label="$t('other.operator')" width="120">
                       <template slot-scope="scope">
                           <div>
                               <span v-if="user.userNameNeedTranslate == '1'">
@@ -417,9 +417,9 @@
                           </div>
                       </template>
                   </el-table-column>
-                  <el-table-column prop="indate" :label="'审核时间'" width="240"></el-table-column>
-                  <el-table-column prop="result" :label="'审核结果'" width="120" show-overflow-tooltip></el-table-column>
-                  <el-table-column prop="date" :label="'员工/日期'">
+                  <el-table-column prop="indate" :label="$t('AuditTime')" width="240"></el-table-column>
+                  <el-table-column prop="result" :label="$t('Reviewtheresults')" width="120" show-overflow-tooltip></el-table-column>
+                  <el-table-column prop="date" :label="$t('EmployeeDate')">
                       <template slot-scope="scope">
                           <div>
                               <div v-if="scope.row.membdateList.length > 1">
@@ -465,15 +465,15 @@
                           </div>
                       </template>
                   </el-table-column>
-                  <el-table-column prop="projectName" :label="'项目'" width="200" show-overflow-tooltip></el-table-column>
-                  <el-table-column prop="date" :label="'操作'" width="180">
+                  <el-table-column prop="projectName" :label="$t('other.project')" width="200" show-overflow-tooltip></el-table-column>
+                  <el-table-column prop="date" :label="$t('operation')" width="180">
                       <template slot-scope="scope">
                           <div>
                               <template v-if="scope.row.membdateList.length < 2 && scope.row.flg">
-                                  <el-button type="warning" size="mini" v-if="scope.row.membdateList[0].state == 1" @click="undoCli(scope.row, 0)">{{ '撤销' }}</el-button>
-                                  <el-link type="info" v-else :underline="false">{{scope.row.membdateList[0].state == 2 ? '已驳回' : '已撤销'}}</el-link>
+                                  <el-button type="warning" size="mini" v-if="scope.row.membdateList[0].state == 1" @click="undoCli(scope.row, 0)">{{ $t('btn.undo') }}</el-button>
+                                  <el-link type="info" v-else :underline="false">{{scope.row.membdateList[0].state == 2 ? $t('state.rejected') : $t('state.undone')}}</el-link>
                               </template>
-                              <el-button size="mini" v-if="scope.row.membdateList.length >= 2 && scope.row.flg" @click="detailsClick(scope.row, scope.$index)">{{ '详情' }}</el-button>
+                              <el-button size="mini" v-if="scope.row.membdateList.length >= 2 && scope.row.flg" @click="detailsClick(scope.row, scope.$index)">{{ $t('details') }}</el-button>
                               <!-- <el-button size="mini" v-if="scope.row.membdateList.length >= 2 && scope.row.flg" @click="batchRevokeClick(scope.row, scope.$index)">批量撤销</el-button> -->
                           </div>
                       </template>
@@ -493,30 +493,30 @@
           </div>
       </el-dialog>
       <!-- 审核记录撤销 -->
-      <el-dialog :title="'请输入原因'"  v-if="undoFormDialog" :visible.sync="undoFormDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+      <el-dialog :title="$t('defaultText.pleaseEnterTheReason')"  v-if="undoFormDialog" :visible.sync="undoFormDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
           <div>
-              <el-input type="textarea" v-model="undoForm.reason" rows="2" :placeholder="'请输入您决定撤销的原因'" />
+              <el-input type="textarea" v-model="undoForm.reason" rows="2" :placeholder="$t('yourdecisiontorevoke')" />
           </div>
           <div slot="footer" class="dialog-footer">
-              <el-button  @click="undoFormDialog = false" >{{ '取消' }}</el-button>
-              <el-button type="primary" @click="clickCancel()" :loading="undoFormLoading">{{ '确定' }}</el-button>
+              <el-button  @click="undoFormDialog = false" >{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="clickCancel()" :loading="undoFormLoading">{{ $t('btn.determine') }}</el-button>
           </div>
       </el-dialog>
       <!-- 审核记录批量撤销 -->
-      <el-dialog :title="'请输入原因'"  v-if="undoBathFormDialog" :visible.sync="undoBathFormDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+      <el-dialog :title="$t('defaultText.pleaseEnterTheReason')"  v-if="undoBathFormDialog" :visible.sync="undoBathFormDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
           <div>
-              <el-input type="textarea" v-model="undoBathForm.reason" rows="2" :placeholder="'请输入您决定撤销的原因'" />
+              <el-input type="textarea" v-model="undoBathForm.reason" rows="2" :placeholder="$t('yourdecisiontorevoke')" />
           </div>
           <div slot="footer" class="dialog-footer">
-              <el-button  @click="undoBathFormDialog = false" >{{ '取消' }}</el-button>
-              <el-button type="primary" @click="clickBathCancel()" :loading="undoBathFormLoading">{{ '确定' }}</el-button>
+              <el-button  @click="undoBathFormDialog = false" >{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="clickBathCancel()" :loading="undoBathFormLoading">{{ $t('btn.determine') }}</el-button>
           </div>
       </el-dialog>
       <!-- 审核记录详情列表 -->
-      <el-dialog :title="'审核记录'"  v-if="detailsDialog" :visible.sync="detailsDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+      <el-dialog :title="$t('Auditrecords')"  v-if="detailsDialog" :visible.sync="detailsDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
           <div>
               <el-table :data="detailsList" style="width: 100%" height="55vh">
-                  <el-table-column prop="userName" :label="'员工/日期'">
+                  <el-table-column prop="userName" :label="$t('EmployeeDate')">
                       <template slot-scope="scope">
                           <div>
                               <span v-if="user.userNameNeedTranslate == '1'">
@@ -528,12 +528,12 @@
                           </div>
                       </template>
                   </el-table-column>
-                  <el-table-column prop="date" :label="'操作'" width="80">
+                  <el-table-column prop="date" :label="$t('operation')" width="80">
                       <template slot-scope="scope">
                           <div>
-                              <el-button type="warning" size="mini" @click="undoCli(scope.row, 1)" v-if="scope.row.state == 1">{{ '撤销' }}</el-button>
+                              <el-button type="warning" size="mini" @click="undoCli(scope.row, 1)" v-if="scope.row.state == 1">{{ $t('btn.undo') }}</el-button>
                               <!-- <div >{{scope.row.state == 2 ? '已驳回' : '已撤销'}}</div> -->
-                              <el-link type="info" v-else :underline="false">{{scope.row.state == 2 ? '已驳回' : '已撤销'}}</el-link>
+                              <el-link type="info" v-else :underline="false">{{scope.row.state == 2 ? $t('state.rejected') : $t('state.undone')}}</el-link>
                           </div>
                       </template>
                   </el-table-column>
@@ -541,7 +541,7 @@
           </div>
           <div slot="footer" class="dialog-footer">
               <el-button  @click="batchRevokeClick()" size="mini">批量撤销</el-button>
-              <el-button  @click="detailsDialog = false" size="mini">{{ '取消' }}</el-button>
+              <el-button  @click="detailsDialog = false" size="mini">{{ $t('btn.cancel') }}</el-button>
           </div>
       </el-dialog>
 
@@ -558,14 +558,14 @@
       </el-dialog>
 
       <!-- 审核通过评价 -->
-      <el-dialog :title="'请输入通过评价'" v-if="approveinDialog" :visible.sync="approveinDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+      <el-dialog :title="$t('enterapassrating')" v-if="approveinDialog" :visible.sync="approveinDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
           <div>
-              <el-input type="textarea" v-model="approveinData.evaluate" rows="2" :placeholder="'请输入您决定通过的评价'" />
+              <el-input type="textarea" v-model="approveinData.evaluate" rows="2" :placeholder="$t('defaultText.Pleaseenterthereviewyoudecidetopass')" />
           </div>
           <div slot="footer" class="dialog-footer">
-              <el-button  @click="approveinDialog = false" >{{ '取消' }}</el-button>
-              <el-button type="primary" @click="batchApproveinfun()" v-if="isbatch">{{ '确定' }}</el-button>
-              <el-button type="primary" @click="approveinfun()" v-else>{{ '确定' }}</el-button>
+              <el-button  @click="approveinDialog = false" >{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="batchApproveinfun()" v-if="isbatch">{{ $t('btn.determine') }}</el-button>
+              <el-button type="primary" @click="approveinfun()" v-else>{{ $t('btn.determine') }}</el-button>
           </div>
       </el-dialog>
   </div>
@@ -773,7 +773,7 @@
                   this.undoBathFormLoading = false
                   if (res.code == "ok") {
                       this.$message({
-                          message: '撤销成功',
+                          message: this.$t('Revocationofsuccess'),
                           type: "success"
                       });
                       this.undoBathFormDialog = false
@@ -843,7 +843,7 @@
                   this.undoFormLoading = false
                   if (res.code == "ok") {
                       this.$message({
-                          message: '撤销成功',
+                          message: this.$t('Revocationofsuccess'),
                           type: "success"
                       });
                       this.undoFormDialog = false
@@ -894,7 +894,7 @@
               res => {
                   if (res.code == "ok") {
                       for (var i in res.data.records) {
-                          res.data.records[i].result.indexOf('通过') == '-1' ? res.data.records[i].flg = false : res.data.records[i].flg = true
+                          res.data.records[i].result.indexOf(this.$t('btn.through')) == '-1' ? res.data.records[i].flg = false : res.data.records[i].flg = true
                       }
                       this.recordLists = res.data.records
                       this.totals = res.data.total
@@ -1203,7 +1203,7 @@
                   if (res.code == "ok") {
                       this.approveinDialog = false
                       this.$message({
-                          message: '审核成功',
+                          message: this.$t('message.Reviewsucceeded'),
                           type: "success"
                       });
                       this.getList();
@@ -1285,7 +1285,7 @@
                   this.logining = false;
                   if (res.code == "ok") {
                       this.$message({
-                          message: this.denyForm.i==0?'驳回成功':'撤销成功',
+                          message: this.denyForm.i==0?this.$t('message.rejectedsuccessfully'):this.$t('Revocationofsuccess'),
                           type: "success"
                       });
                       this.getList();

+ 88 - 88
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/weeklyReportReview.vue

@@ -4,16 +4,16 @@
       <div class="reviewTop">
           <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
               <el-form :inline="true">
-                  <el-form-item :label="'部门'" style="width: 165px">
-                      <el-cascader v-if="user.userNameNeedTranslate != 1" v-model="search.departmentIdArray" :placeholder="'请选择'" style="width: 125px"
+                  <el-form-item :label="$t('lable.department')" style="width: 165px">
+                      <el-cascader v-if="user.userNameNeedTranslate != 1" v-model="search.departmentIdArray" :placeholder="$t('defaultText.pleaseChoose')" style="width: 125px"
                       :options="option" :props="{ checkStrictly: false,expandTrigger: 'hover' }" :show-all-levels="false" clearable
                       @change="getList(1)" size="mini"></el-cascader>
 
                       <vueCascader :size="'mini'" :widthStr="'125'" :clearable="true" :subject="option" :radios="false" :distinction="'1'" @vueCasader="vueCasader" v-if="user.userNameNeedTranslate == 1"></vueCascader>
                   </el-form-item>
 
-                  <el-form-item :label="'填报人'" style="width: 210px">
-                      <el-select v-if="user.userNameNeedTranslate != '1'" v-model="search.userIdArray" :placeholder="'请选择'" clearable @visible-change="usersSearch" @remove-tag="usersSearch(false)" @clear="usersSearch(false)" filterable="true" size="mini" style="width: 150px" multiple collapse-tags>
+                  <el-form-item :label="$t('tian-bao-ren')" style="width: 210px">
+                      <el-select v-if="user.userNameNeedTranslate != '1'" v-model="search.userIdArray" :placeholder="$t('defaultText.pleaseChoose')" clearable @visible-change="usersSearch" @remove-tag="usersSearch(false)" @clear="usersSearch(false)" filterable="true" size="mini" style="width: 150px" multiple collapse-tags>
                           <el-option v-for="item in searchUsersList" :key="item.id" :label="item.name" :value="item.id">
                               <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
                               <span style="float: left" v-if="user.userNameNeedTranslate != '1'">{{item.name}}</span>
@@ -24,8 +24,8 @@
                       <!-- <selectCat :size="'size'" :subject="searchUsersList" :clearable="true" :filterable="true" @selectCal="selectCal"></selectCat> -->
                   </el-form-item>
 
-                  <el-form-item :label="'审核人'" style="width: 210px">
-                      <el-select v-if="user.userNameNeedTranslate != '1'" v-model="search.auditUserId" :placeholder="'请选择'" clearable @change="usersSearch(false)" size="mini" style="width: 150px" collapse-tags>
+                  <el-form-item :label="$t('other.reviewer')" style="width: 210px">
+                      <el-select v-if="user.userNameNeedTranslate != '1'" v-model="search.auditUserId" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="usersSearch(false)" size="mini" style="width: 150px" collapse-tags>
                           <el-option v-for="item in searchUsersList" :key="item.id" :label="item.name" :value="item.id">
                               <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
                               <span style="float: left" v-if="user.userNameNeedTranslate != '1'">{{item.name}}</span>
@@ -35,31 +35,31 @@
                       <selectCat v-if="user.userNameNeedTranslate == '1'" :filterable="true" :size="'size'" :subject="searchUsersList" :clearable="true" :distinction="'2'" @selectCal="selectCal"></selectCat>
                   </el-form-item>
 
-                  <el-form-item :label="'项目'" style="width: 215px">
-                      <el-select v-model="search.projectId" :placeholder="'请选择'" clearable @change="getList()" filterable="true" size="mini" style="width: 175px" popper-class="projectSelectPopperClass">
+                  <el-form-item :label="$t('other.project')" style="width: 215px">
+                      <el-select v-model="search.projectId" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="getList()" filterable="true" size="mini" style="width: 175px" popper-class="projectSelectPopperClass">
                           <el-option v-for="item in projectList" :key="item.id" :label="item.projectName + item.projectCode" :value="item.id">
                               <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
                               <span style="float: right;font-size: 13px;">{{ item.projectName }}</span>
                           </el-option>
                       </el-select>
                   </el-form-item>
-                      <el-form-item :label="'日期'" v-if="false">
+                      <el-form-item :label="$t('weekDay.date')" v-if="false">
                           <el-date-picker
                               v-model="dataTime"
                               type="daterange"
-                              :range-separator="'至'"
-                              :start-placeholder="'开始日期'"
-                              :end-placeholder="'结束日期'"
+                              :range-separator="$t('other.to')"
+                              :start-placeholder="$t('time.startDate')"
+                              :end-placeholder="$t('time.endDate')"
                               format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="dataTimes()" size="mini">
                           </el-date-picker>
                       </el-form-item>
 
                       <el-form-item   style="margin-left:20px;">
-                          <el-button @click="batchCallThrough()" style="margin-left:10px;" :loading="batchApproveLoading" :disabled="multipleSelection.length==0" size="mini">{{ '批量通过' }}</el-button>
-                          <el-button @click="batchRejection()"   :disabled="multipleSelection.length==0" size="mini">{{ '批量驳回' }}</el-button>
+                          <el-button @click="batchCallThrough()" style="margin-left:10px;" :loading="batchApproveLoading" :disabled="multipleSelection.length==0" size="mini">{{ $t('Batchthrough') }}</el-button>
+                          <el-button @click="batchRejection()"   :disabled="multipleSelection.length==0" size="mini">{{ $t('Batchrejected') }}</el-button>
                       </el-form-item>
                       <el-form-item style="margin-left:20px;">
-                      <el-link type="primary" @click="recordList(),recordDialogVisible = true,pageIndexList = 1,pageSizeList = 20">{{ '审核记录' }}</el-link>
+                      <el-link type="primary" @click="recordList(),recordDialogVisible = true,pageIndexList = 1,pageSizeList = 20">{{ $t('Auditrecords') }}</el-link>
                       </el-form-item>
                       <el-form-item style="margin-left:20px;" v-if="user.companyId == 469">
                       <el-link type="primary" @click="exportListByState" :loading="exportLoading">导出待审核日报</el-link>
@@ -131,31 +131,31 @@
           >
           </el-pagination>
       </div>        <!--驳回弹出框 -->
-      <el-dialog :title="'请输入原因'"  v-if="denyReasonDialog" :visible.sync="denyReasonDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+      <el-dialog :title="$t('defaultText.pleaseEnterTheReason')"  v-if="denyReasonDialog" :visible.sync="denyReasonDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
           <div>
-              <span style="color:red;">*</span><el-input type="textarea" v-model="denyForm.reason" rows="2" :placeholder="'请输入您决定'+(denyForm.i==0?'驳回':'撤销')+'原因'" />
+              <span style="color:red;">*</span><el-input type="textarea" v-model="denyForm.reason" rows="2" :placeholder="$t('defaultText.pleaseEnterYourDecision')+(denyForm.i==0?$t('btn.rejected'):$t('btn.undo'))+$t('other.reason')" />
           </div>
           <div slot="footer" class="dialog-footer">
-              <el-button  @click="denyReasonDialog = false" >{{ '取消' }}</el-button>
-              <el-button type="primary" @click="deny()" :disabled="user.timeType.forceRejectReason && !denyForm.reason">{{ '确定' }}</el-button>
+              <el-button  @click="denyReasonDialog = false" >{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="deny()" :disabled="user.timeType.forceRejectReason && !denyForm.reason">{{ $t('btn.determine') }}</el-button>
           </div>
       </el-dialog>
       <!--批量驳回弹出框 -->
-      <el-dialog :title="'请输入原因'"  v-if="batchDenyDialog" :visible.sync="batchDenyDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+      <el-dialog :title="$t('defaultText.pleaseEnterTheReason')"  v-if="batchDenyDialog" :visible.sync="batchDenyDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
           <div>
-              <span style="color:red;">*</span><el-input type="textarea" v-model="batchDenyData.reason" rows="2" :placeholder="'请输入您决定驳回的原因'" />
+              <span style="color:red;">*</span><el-input type="textarea" v-model="batchDenyData.reason" rows="2" :placeholder="$t('reasonforyourdecisiontoreject')" />
           </div>
           <div slot="footer" class="dialog-footer">
-              <el-button  @click="batchDenyDialog = false" >{{ '取消' }}</el-button>
-              <el-button type="primary" @click="batchDenyClick()" :loading="batchDenyLoading" :disabled="user.timeType.forceRejectReason && !batchDenyData.reason">{{ '确定' }}</el-button>
+              <el-button  @click="batchDenyDialog = false" >{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="batchDenyClick()" :loading="batchDenyLoading" :disabled="user.timeType.forceRejectReason && !batchDenyData.reason">{{ $t('btn.determine') }}</el-button>
           </div>
       </el-dialog>
       
       <!-- 审核记录弹窗 -->
-      <el-dialog :title="'审核记录'" :visible.sync="recordDialogVisible" width="1200px" :before-close="handleClose">
+      <el-dialog :title="$t('Auditrecords')" :visible.sync="recordDialogVisible" width="1200px" :before-close="handleClose">
           <div style="height: 430px">
               <el-table :data="recordLists" style="width: 100%" height="400">
-                  <el-table-column prop="userName" :label="'操作人'" width="120">
+                  <el-table-column prop="userName" :label="$t('other.operator')" width="120">
                       <template slot-scope="scope">
                           <div>
                               <span v-if="user.userNameNeedTranslate == '1'">
@@ -165,9 +165,9 @@
                           </div>
                       </template>
                   </el-table-column>
-                  <el-table-column prop="indate" :label="'审核时间'" width="240"></el-table-column>
-                  <el-table-column prop="result" :label="'审核结果'" width="120" show-overflow-tooltip></el-table-column>
-                  <el-table-column prop="date" :label="'员工/日期'">
+                  <el-table-column prop="indate" :label="$t('AuditTime')" width="240"></el-table-column>
+                  <el-table-column prop="result" :label="$t('Reviewtheresults')" width="120" show-overflow-tooltip></el-table-column>
+                  <el-table-column prop="date" :label="$t('EmployeeDate')">
                       <template slot-scope="scope">
                           <div>
                               <div v-if="scope.row.membdateList.length > 1">
@@ -213,15 +213,15 @@
                           </div>
                       </template>
                   </el-table-column>
-                  <el-table-column prop="projectName" :label="'项目'" width="200" show-overflow-tooltip></el-table-column>
-                  <el-table-column prop="date" :label="'操作'" width="180">
+                  <el-table-column prop="projectName" :label="$t('other.project')" width="200" show-overflow-tooltip></el-table-column>
+                  <el-table-column prop="date" :label="$t('operation')" width="180">
                       <template slot-scope="scope">
                           <div>
                               <template v-if="scope.row.membdateList.length < 2 && scope.row.flg">
-                                  <el-button type="warning" size="mini" v-if="scope.row.membdateList[0].state == 1" @click="undoCli(scope.row, 0)">{{ '撤销' }}</el-button>
-                                  <el-link type="info" v-else :underline="false">{{scope.row.membdateList[0].state == 2 ? '已驳回' : '已撤销'}}</el-link>
+                                  <el-button type="warning" size="mini" v-if="scope.row.membdateList[0].state == 1" @click="undoCli(scope.row, 0)">{{ $t('btn.undo') }}</el-button>
+                                  <el-link type="info" v-else :underline="false">{{scope.row.membdateList[0].state == 2 ? $t('state.rejected') : $t('state.undone')}}</el-link>
                               </template>
-                              <el-button size="mini" v-if="scope.row.membdateList.length >= 2 && scope.row.flg" @click="detailsClick(scope.row, scope.$index)">{{ '详情' }}</el-button>
+                              <el-button size="mini" v-if="scope.row.membdateList.length >= 2 && scope.row.flg" @click="detailsClick(scope.row, scope.$index)">{{ $t('details') }}</el-button>
                               <!-- <el-button size="mini" v-if="scope.row.membdateList.length >= 2 && scope.row.flg" @click="batchRevokeClick(scope.row, scope.$index)">批量撤销</el-button> -->
                           </div>
                       </template>
@@ -241,30 +241,30 @@
           </div>
       </el-dialog>
       <!-- 审核记录撤销 -->
-      <el-dialog :title="'请输入原因'"  v-if="undoFormDialog" :visible.sync="undoFormDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+      <el-dialog :title="$t('defaultText.pleaseEnterTheReason')"  v-if="undoFormDialog" :visible.sync="undoFormDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
           <div>
-              <el-input type="textarea" v-model="undoForm.reason" rows="2" :placeholder="'请输入您决定撤销的原因'" />
+              <el-input type="textarea" v-model="undoForm.reason" rows="2" :placeholder="$t('yourdecisiontorevoke')" />
           </div>
           <div slot="footer" class="dialog-footer">
-              <el-button  @click="undoFormDialog = false" >{{ '取消' }}</el-button>
-              <el-button type="primary" @click="clickCancel()" :loading="undoFormLoading">{{ '确定' }}</el-button>
+              <el-button  @click="undoFormDialog = false" >{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="clickCancel()" :loading="undoFormLoading">{{ $t('btn.determine') }}</el-button>
           </div>
       </el-dialog>
       <!-- 审核记录批量撤销 -->
-      <el-dialog :title="'请输入原因'"  v-if="undoBathFormDialog" :visible.sync="undoBathFormDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+      <el-dialog :title="$t('defaultText.pleaseEnterTheReason')"  v-if="undoBathFormDialog" :visible.sync="undoBathFormDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
           <div>
-              <el-input type="textarea" v-model="undoBathForm.reason" rows="2" :placeholder="'请输入您决定撤销的原因'" />
+              <el-input type="textarea" v-model="undoBathForm.reason" rows="2" :placeholder="$t('yourdecisiontorevoke')" />
           </div>
           <div slot="footer" class="dialog-footer">
-              <el-button  @click="undoBathFormDialog = false" >{{ '取消' }}</el-button>
-              <el-button type="primary" @click="clickBathCancel()" :loading="undoBathFormLoading">{{ '确定' }}</el-button>
+              <el-button  @click="undoBathFormDialog = false" >{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="clickBathCancel()" :loading="undoBathFormLoading">{{ $t('btn.determine') }}</el-button>
           </div>
       </el-dialog>
       <!-- 审核记录详情列表 -->
-      <el-dialog :title="'审核记录'"  v-if="detailsDialog" :visible.sync="detailsDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+      <el-dialog :title="$t('Auditrecords')"  v-if="detailsDialog" :visible.sync="detailsDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
           <div>
               <el-table :data="detailsList" style="width: 100%" height="55vh">
-                  <el-table-column prop="userName" :label="'员工/日期'">
+                  <el-table-column prop="userName" :label="$t('EmployeeDate')">
                       <template slot-scope="scope">
                           <div>
                               <span v-if="user.userNameNeedTranslate == '1'">
@@ -276,12 +276,12 @@
                           </div>
                       </template>
                   </el-table-column>
-                  <el-table-column prop="date" :label="'操作'" width="80">
+                  <el-table-column prop="date" :label="$t('operation')" width="80">
                       <template slot-scope="scope">
                           <div>
-                              <el-button type="warning" size="mini" @click="undoCli(scope.row, 1)" v-if="scope.row.state == 1">{{ '撤销' }}</el-button>
+                              <el-button type="warning" size="mini" @click="undoCli(scope.row, 1)" v-if="scope.row.state == 1">{{ $t('btn.undo') }}</el-button>
                               <!-- <div >{{scope.row.state == 2 ? '已驳回' : '已撤销'}}</div> -->
-                              <el-link type="info" v-else :underline="false">{{scope.row.state == 2 ? '已驳回' : '已撤销'}}</el-link>
+                              <el-link type="info" v-else :underline="false">{{scope.row.state == 2 ? $t('state.rejected') : $t('state.undone')}}</el-link>
                           </div>
                       </template>
                   </el-table-column>
@@ -289,124 +289,124 @@
           </div>
           <div slot="footer" class="dialog-footer">
               <el-button  @click="batchRevokeClick()" size="mini">批量撤销</el-button>
-              <el-button  @click="detailsDialog = false" size="mini">{{ '取消' }}</el-button>
+              <el-button  @click="detailsDialog = false" size="mini">{{ $t('btn.cancel') }}</el-button>
           </div>
       </el-dialog>
 
       <!-- 审核通过评价 -->
-      <el-dialog :title="'请输入通过评价'" v-if="approveinDialog" :visible.sync="approveinDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+      <el-dialog :title="$t('enterapassrating')" v-if="approveinDialog" :visible.sync="approveinDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
           <div>
-              <el-input type="textarea" v-model="approveinData.evaluate" rows="2" :placeholder="'请输入您决定通过的评价'" />
+              <el-input type="textarea" v-model="approveinData.evaluate" rows="2" :placeholder="$t('defaultText.Pleaseenterthereviewyoudecidetopass')" />
           </div>
           <div slot="footer" class="dialog-footer">
-              <el-button  @click="approveinDialog = false" >{{ '取消' }}</el-button>
-              <el-button type="primary" @click="batchApproveinfun()" v-if="isbatch">{{ '确定' }}</el-button>
-              <el-button type="primary" @click="approveinfun()" v-else>{{ '确定' }}</el-button>
+              <el-button  @click="approveinDialog = false" >{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="batchApproveinfun()" v-if="isbatch">{{ $t('btn.determine') }}</el-button>
+              <el-button type="primary" @click="approveinfun()" v-else>{{ $t('btn.determine') }}</el-button>
           </div>
       </el-dialog>
 
       <el-dialog title="查看详情" v-if="FilteredDataRowVisable" :visible.sync="FilteredDataRowVisable" :close-on-click-modal="false" customClass="customWidth" width="800px">
           <div>
             <el-card shadow="never">
-                <p>{{ '项目' + ':' }}<b>{{FilteredDataRow.projectCode+'/'+FilteredDataRow.project}}<span v-if="FilteredDataRow.subProjectName != null"> / {{FilteredDataRow.subProjectName}}</span>
+                <p>{{ $t('other.project') + ':' }}<b>{{FilteredDataRow.projectCode+'/'+FilteredDataRow.project}}<span v-if="FilteredDataRow.subProjectName != null"> / {{FilteredDataRow.subProjectName}}</span>
                     <span style="margin-left:15px;color:#DAA520;" >[ 
                         <span v-if="user.timeType.reportAuditType == 7">
-                            {{'审核人'}}:<TranslationOpenData :configurationItems="{ openType: 'userName', openId: FilteredDataRow.projectAuditorName, renderIndex: 0 }" /><span v-if="FilteredDataRow.projectAuditState==1">√</span>
+                            {{$t('other.reviewer')}}:<TranslationOpenData :configurationItems="{ openType: 'userName', openId: FilteredDataRow.projectAuditorName, renderIndex: 0 }" /><span v-if="FilteredDataRow.projectAuditState==1">√</span>
                             <span v-if="FilteredDataRow.deptAuditorName">、</span>
                             <TranslationOpenData :configurationItems="{ openType: 'userName', openId: FilteredDataRow.deptAuditorName, renderIndex: 0 }" /><span v-if="FilteredDataRow.departmentAuditState==1">√</span>
                         </span>
                         <span v-else>
                             <span v-if="FilteredDataRow.isDeptAudit==0">
                                 <span v-if="FilteredDataRow.projectAuditState==0">
-                                    {{ user.companyId == 469?"待部门主管":'待项目审核人' }}<span v-if="FilteredDataRow.projectAuditorName != null">(
+                                    {{ user.companyId == 469?"待部门主管":$t('other.waitForTheProjectReviewer') }}<span v-if="FilteredDataRow.projectAuditorName != null">(
                                         <!-- {{FilteredDataRow.projectAuditorName}} -->
                                         <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='FilteredDataRow.projectAuditorName'></TranslationOpenDataText></span>
                                         <span v-if="user.userNameNeedTranslate != '1'">{{FilteredDataRow.projectAuditorName}}</span>
-                                        )</span>{{ '审核' }}
+                                        )</span>{{ $t('other.audit') }}
                                 </span>
                                 <span style="color:#32CD32;" v-else-if="FilteredDataRow.projectAuditState==1">
-                                    {{ user.companyId == 469?"待部门主管":'项目审核人' }}<span v-if="FilteredDataRow.projectAuditorName != null">(
+                                    {{ user.companyId == 469?"待部门主管":$t('other.projectAuditor') }}<span v-if="FilteredDataRow.projectAuditorName != null">(
                                         <!-- {{FilteredDataRow.projectAuditorName}} -->
                                         <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='FilteredDataRow.projectAuditorName'></TranslationOpenDataText></span>
                                         <span v-if="user.userNameNeedTranslate != '1'">{{FilteredDataRow.projectAuditorName}}</span>
-                                    )</span>{{ '审核通过' }}
+                                    )</span>{{ $t('state.approved') }}
                                 </span>
                             </span>
                             <span v-else-if="FilteredDataRow.isDeptAudit==1">
-                                <!-- {{('待' +FilteredDataRow.auditDeptName+('('+FilteredDataRow.deptAuditorName+')')+ '审核')}} -->
-                                ({{'待'}}
+                                <!-- {{($t('other.await') +FilteredDataRow.auditDeptName+('('+FilteredDataRow.deptAuditorName+')')+ $t('other.audit'))}} -->
+                                ({{$t('other.await')}}
                                 <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='FilteredDataRow.auditDeptName'></TranslationOpenDataText></span>
                                 <span v-if="user.userNameNeedTranslate != '1'">{{FilteredDataRow.auditDeptName}}</span>
                                 (<span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='FilteredDataRow.deptAuditorName'></TranslationOpenDataText></span>
                                 <span v-if="user.userNameNeedTranslate != '1'">{{FilteredDataRow.deptAuditorName}}</span>)
-                                {{'审核'}})
+                                {{$t('other.audit')}})
                             </span>
                         </span>]
                     </span>
                     </b>
                 </p>
-                <p v-if="user.timeType.reportAuditType == 6" >{{ '审核流程:' }}<span v-if="FilteredDataRow.auditorList && FilteredDataRow.auditorList.length == 1">{{ '一层审核' }}(<span class="themeFontColor">{{ FilteredDataRow.auditorList[0].name }}</span>)</span>
-                <span v-if="FilteredDataRow.auditorList && FilteredDataRow.auditorList.length == 2">{{ '两层审核' }}(<span class="themeFontColor">{{ FilteredDataRow.auditorList[0].name }}->{{ FilteredDataRow.auditorList[1].name }}</span>)</span>
-                <el-button size="small" @click="viewOneReport(FilteredDataRow)" v-if="!FilteredDataRow.auditorList">{{ '查看' }}</el-button>
+                <p v-if="user.timeType.reportAuditType == 6" >{{ $t('shenHeLiuCheng') }}<span v-if="FilteredDataRow.auditorList && FilteredDataRow.auditorList.length == 1">{{ $t('yiCengShenHe') }}(<span class="themeFontColor">{{ FilteredDataRow.auditorList[0].name }}</span>)</span>
+                <span v-if="FilteredDataRow.auditorList && FilteredDataRow.auditorList.length == 2">{{ $t('liangCengShenHe') }}(<span class="themeFontColor">{{ FilteredDataRow.auditorList[0].name }}->{{ FilteredDataRow.auditorList[1].name }}</span>)</span>
+                <el-button size="small" @click="viewOneReport(FilteredDataRow)" v-if="!FilteredDataRow.auditorList">{{ $t('cha-kan') }}</el-button>
                 </p>
                 <p v-if="user.timeType.customDegreeActive==1 && (FilteredDataRow.degree_id != null || FilteredDataRow.multiDegrId != '[]')">{{user.timeType.customDegreeName}}:{{FilteredDataRow.degreeName}}</p>
                 <p v-if="user.timeType.customDataActive==1">{{user.timeType.customDataName}}:{{FilteredDataRow.customData}}</p>
                 <p v-if="user.timeType.customTextActive==1">{{user.timeType.customTextName}}:{{FilteredDataRow.customText}}</p>
                 <p v-if="user.company.packageEngineering == 1">
-                    {{ '专业进度' +':'}} <span style="margin-right:10px;" v-for="progressItem in FilteredDataRow.professionProgressList" :key="progressItem.id">
+                    {{ $t('other.professionalProgress') +':'}} <span style="margin-right:10px;" v-for="progressItem in FilteredDataRow.professionProgressList" :key="progressItem.id">
                         {{progressItem.professionName}}({{progressItem.progress}}%)
-                        <el-tooltip v-if="progressItem.auditState == 0"  :content="'待审核'" effect="light" placement="top">
+                        <el-tooltip v-if="progressItem.auditState == 0"  :content="$t('state.WaitingAudit')" effect="light" placement="top">
                         <i class="iconfont firerock-icondaibandengdaishenhe"></i>
                         </el-tooltip>
-                        <el-tooltip v-if="progressItem.auditState == 1" :content="'已通过'" effect="light" placement="top">
+                        <el-tooltip v-if="progressItem.auditState == 1" :content="$t('state.alreadyPassed')" effect="light" placement="top">
                         <i  class="iconfont firerock-iconshenhetongguo"></i>
                         </el-tooltip>
-                        <el-tooltip v-if="progressItem.auditState == 2" :content="'不通过'" effect="light" placement="top">
+                        <el-tooltip v-if="progressItem.auditState == 2" :content="$t('state.notThrough')" effect="light" placement="top">
                         <i  class="iconfont firerock-iconshenhebohui"></i>
                         </el-tooltip>
                         </span> 
                 </p>
                 <p v-if="user.companyId == yuzhongCompId">
-                                        <span>{{ '角色' }}:{{FilteredDataRow.extraField1? roleList.filter(r=>r.value == FilteredDataRow.extraField1)[0].label:''}}</span>
-                                    <span style="margin-left:10px;">{{ '工作职责' }}:{{ FilteredDataRow.extraField2? FilteredDataRow.extraField2Name:''}}</span>
-                                    <span style="margin-left:10px;">{{ '工作内容' }}:{{ FilteredDataRow.extraField3? FilteredDataRow.extraField3Name:''}}</span></p>
-                <p v-if="FilteredDataRow.taskId != null">{{'任务'}}:{{FilteredDataRow.taskName}}
-                    <span style="margin-left:10px;" v-if="user.companyId==3092">-- {{ '服务' }}:{{ FilteredDataRow.sapServiceName }}</span></p>
+                                        <span>{{ $t('jiao-se') }}:{{FilteredDataRow.extraField1? roleList.filter(r=>r.value == FilteredDataRow.extraField1)[0].label:''}}</span>
+                                    <span style="margin-left:10px;">{{ $t('gongZuoZhiZe') }}:{{ FilteredDataRow.extraField2? FilteredDataRow.extraField2Name:''}}</span>
+                                    <span style="margin-left:10px;">{{ $t('gongZuoNeiRong') }}:{{ FilteredDataRow.extraField3? FilteredDataRow.extraField3Name:''}}</span></p>
+                <p v-if="FilteredDataRow.taskId != null">{{$t('other.task')}}:{{FilteredDataRow.taskName}}
+                    <span style="margin-left:10px;" v-if="user.companyId==3092">-- {{ $t('fuWu') }}:{{ FilteredDataRow.sapServiceName }}</span></p>
                 <p v-if="FilteredDataRow.groupId">
-                    <span>{{'任务分组'}}:{{FilteredDataRow.groupName}}</span>
+                    <span>{{$t('other.taskGroup')}}:{{FilteredDataRow.groupName}}</span>
                     <!-- 阶段 -->
-                    <span v-if="FilteredDataRow.stage != null && user.companyId != yuzhongCompId" style="margin-left:10px;"> {{'投入阶段'}}:{{FilteredDataRow.stage}}</span>
+                    <span v-if="FilteredDataRow.stage != null && user.companyId != yuzhongCompId" style="margin-left:10px;"> {{$t('other.inputStage')}}:{{FilteredDataRow.stage}}</span>
                 </p>
                 <p v-if="user.company.companyName == '成都明夷电子科技有限公司'">
-                    <span>{{ '用时占比' }} :{{ FilteredDataRow.progress }}%</span>
+                    <span>{{ $t('lable.percentageOfTime') }} :{{ FilteredDataRow.progress }}%</span>
                 </p>
                 <p v-else>
-                    <span v-if="FilteredDataRow.multiWorktime==1">{{ '项目' }}</span>
-                    <span>{{'时长'}}:</span>
+                    <span v-if="FilteredDataRow.multiWorktime==1">{{ $t('other.project') }}</span>
+                    <span>{{$t('time.duration')}}:</span>
                     <span v-if="FilteredDataRow.startTime">{{ FilteredDataRow.startTime + '-' + FilteredDataRow.endTime }}</span>
                     <span>{{FilteredDataRow.time.toFixed(1)}}h </span>
                     <span class="propsbtn" v-if="FilteredDataRow.isOvertime === 1">
-                    <el-tag type="danger" size="mini" style="margin-left: 65px">{{ '加班' }}<span v-if="FilteredDataRow.overtimeHours">{{FilteredDataRow.overtimeHours.toFixed(1)}}{{'小时'}}</span></el-tag></span>
+                    <el-tag type="danger" size="mini" style="margin-left: 65px">{{ $t('other.WorkOvertime') }}<span v-if="FilteredDataRow.overtimeHours">{{FilteredDataRow.overtimeHours.toFixed(1)}}{{$t('time.hour')}}</span></el-tag></span>
                 </p>
 
                 <div v-if="FilteredDataRow.multiWorktime==0">
-                <p>{{ '工作内容' }}:<span v-html="formatContent(FilteredDataRow.content)"></span></p>
+                <p>{{ $t('other.matters') }}:<span v-html="formatContent(FilteredDataRow.content)"></span></p>
                 </div>
                 <div v-if="FilteredDataRow.multiWorktime==1" >
                     <div v-for="(timeItem, tIndex) in FilteredDataRow.worktimeList" :key="tIndex"
                         style="border: 0.5px #ddd solid;margin:5px 0px;padding:5px; ">
-                        <p style="line-height:20px;margin:5px 0px;">{{'时长'}}:
+                        <p style="line-height:20px;margin:5px 0px;">{{$t('time.duration')}}:
                             <span v-if="FilteredDataRow.reportTimeType == 2" style="margin-right:10px;">{{timeItem.startTime+'-'+timeItem.endTime}}</span>
                         {{timeItem.time.toFixed(1)}}h  
                         <span v-if="timeItem.detail" style="margin-left:10px;"> {{timeItem.detail}} </span>
                         </p>
-                        <p style="line-height:20px;margin:5px 0px;">{{ '工作内容' }}:<span v-html="formatContent(timeItem.content)"></span></p>
+                        <p style="line-height:20px;margin:5px 0px;">{{ $t('other.matters') }}:<span v-html="formatContent(timeItem.content)"></span></p>
                     </div>
                 </div>
             </el-card>
           </div>
           <div slot="footer" class="dialog-footer">
-              <el-button  @click="FilteredDataRowVisable = false" >{{ '取消' }}</el-button>
+              <el-button  @click="FilteredDataRowVisable = false" >{{ $t('btn.cancel') }}</el-button>
           </div>
       </el-dialog>
   </div>
@@ -570,7 +570,7 @@
                   this.undoBathFormLoading = false
                   if (res.code == "ok") {
                       this.$message({
-                          message: '撤销成功',
+                          message: this.$t('Revocationofsuccess'),
                           type: "success"
                       });
                       this.undoBathFormDialog = false
@@ -640,7 +640,7 @@
                   this.undoFormLoading = false
                   if (res.code == "ok") {
                       this.$message({
-                          message: '撤销成功',
+                          message: this.$t('Revocationofsuccess'),
                           type: "success"
                       });
                       this.undoFormDialog = false
@@ -691,7 +691,7 @@
               res => {
                   if (res.code == "ok") {
                       for (var i in res.data.records) {
-                          res.data.records[i].result.indexOf('通过') == '-1' ? res.data.records[i].flg = false : res.data.records[i].flg = true
+                          res.data.records[i].result.indexOf(this.$t('btn.through')) == '-1' ? res.data.records[i].flg = false : res.data.records[i].flg = true
                       }
                       this.recordLists = res.data.records
                       this.totals = res.data.total
@@ -1125,7 +1125,7 @@
                   if (res.code == "ok") {
                       this.approveinDialog = false
                       this.$message({
-                          message: '审核成功',
+                          message: this.$t('message.Reviewsucceeded'),
                           type: "success"
                       });
                       this.getList();
@@ -1207,7 +1207,7 @@
                   this.logining = false;
                   if (res.code == "ok") {
                       this.$message({
-                          message: this.denyForm.i==0?'驳回成功':'撤销成功',
+                          message: this.denyForm.i==0?this.$t('message.rejectedsuccessfully'):this.$t('Revocationofsuccess'),
                           type: "success"
                       });
                       this.getList();

+ 43 - 8
fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/index.vue

@@ -26,7 +26,7 @@
                 </van-cell>
                 <van-popup v-model="selectUserShow" position="bottom" style="height: 90%">
                     <div class="popupDiv">
-                        <div class="popupSearch" v-if="user.userNameNeedTranslate != '1'">
+                        <div class="popupSearch">
                             <van-search v-model="searchInputValue" placeholder="输入员工姓名搜索" @search="userListSearch" shape="round" background="#F4F4F4"></van-search>
                         </div>
 
@@ -58,6 +58,7 @@
 
             <div class="formBatch">
                 <van-checkbox v-model="isAllChecked" :disabled="report.length == 0" @click="allChecked" shape="square" style="padding-left:3vw"></van-checkbox>
+                <span style="color:#666;float:left;">共{{ report.length }}条</span>
                 <div style="padding:1vh 2vw">
                 <van-button @click="batchAgree(true)" :disabled="!isCanAgree || report.length == 0" type="info" size="small" style="margin-right:6vw">批量通过</van-button>
                 <van-button @click="showBatchDenyDialog()" :disabled="!isCanAgree || report.length == 0" type="danger" size="small" style="margin-left:2vw">批量驳回</van-button>
@@ -90,7 +91,10 @@
                             <span>{{ item.startTime }} ~ {{ item.endTime }}</span>
                             <span v-if="item.cardHours"> 共 {{ item.cardHours.toFixed(1) }} 小时</span>
                             <span v-if="item.overtime" style="color:#20a0ff;"> 加班申请 {{ item.overtime.toFixed(1) }} 小时</span>
-                            <span v-if="item.askLeaveTime" style="color:#20a0ff;"> 请假 {{ item.askLeaveTime.toFixed(1) }} 小时</span>
+                            <span v-if="item.askLeaveTime" style="color:#20a0ff;"> 
+                                <span v-if="item.askLeaveType" style="color:#FFA500;">{{ item.askLeaveType == 'T'?'调休':(item.askLeaveType == 'B'?'病假':item.askLeaveType)}}</span>
+                                    <span v-else>请假</span>
+                                {{ item.askLeaveTime.toFixed(1) }} 小时</span>
                         </span>
                         <span v-else>-</span>
                     </div>
@@ -182,6 +186,7 @@
                         </div>
                     </div>
                     <div class="form_btn" slot="footer">
+                        <span style="float:left;margin:8px 5px;color:#666;"> 提交时间: {{item.createTime}}  </span>
                         <van-button size="small" type="info" @click="approve(item.userId, item)" style="margin-right: 4vw;">通过</van-button>
                         <van-button size="small" type="danger" @click="showDenyDialog(item.userId,0,item.dateStr, item)">驳回</van-button>
                     </div>
@@ -289,17 +294,47 @@
                 return `${date.getFullYear()}-${(date.getMonth() + 1) < 10 ? '0' + (date.getMonth() + 1) : (date.getMonth() + 1)}-${date.getDate() < 10 ? '0' + date.getDate() : date.getDate()}`;
             },
             userListSearch(val) {
-                this.showUserList = [];
-                this.userList.forEach(u=>{if (u.name.startsWith(val)) {
-                    this.showUserList.push(u);
-                }})
+                if (this.user.userNameNeedTranslate == '1') {
+                    this.$axios.post("/user/getEmployeeList", {
+                        departmentId: -1,
+                        pageIndex: 1,
+                        pageSize: 200,
+                        keyword: val,
+                        status: 1,
+                        roleId: '',
+                        cursor: '',
+                        onlyDirect: 0
+                    }).then(res => {
+                        if (res.code == "ok") {
+                            // 保留已勾选状态
+                            const checkedIds = this.userList.filter(u => u.isChecked).map(u => u.id);
+                            const newList = res.data.records.map(u => {
+                                return { ...u, isChecked: checkedIds.includes(u.id) };
+                            });
+                            this.showUserList = newList;
+                        } else {
+                            this.$toast.fail('搜索失败');
+                        }
+                    }).catch(err => { this.$toast.clear(); });
+                } else {
+                    this.showUserList = [];
+                    this.userList.forEach(u => {
+                        if (u.name.startsWith(val)) {
+                            this.showUserList.push(u);
+                        }
+                    });
+                }
             },
             selectUserConfirm(){
                 this.userNameValue = '';
                 var that = this;
                 that.userIdList = '';
-                this.userList.filter(u=>u.isChecked).forEach(u=>{
-                    that.userNameValue += (u.name+',');
+                // 合并 userList 和 showUserList 中已勾选的项(去重)
+                const checkedMap = {};
+                this.userList.filter(u => u.isChecked).forEach(u => { checkedMap[u.id] = u; });
+                this.showUserList.filter(u => u.isChecked).forEach(u => { checkedMap[u.id] = u; });
+                Object.values(checkedMap).forEach(u => {
+                    that.userNameValue += (u.name + ',');
                     that.userIdList += u.id + ','
                 });
                 if (this.userNameValue.length > 0) {